#archived-modding-development
1 messages Β· Page 49 of 1
big mods aren't made because it's very difficult to create substantial content for the game
ok
it wasn't until "recently" we could even change FSMs at all
and even now we still have no idea how half the shit in game actually works
lol
maybe one day someone will put the effort into figuring out how other stuff works
the problem with adding substantial content is that in order to add new stuff, you have to make it
HK is 3D, it's played in 2D, but as far as I understand it, it's still a 3D game
so you'd have to do all the modeling
hmm
and the camera is orthographic
Yep
i was thinking the world was 3d
there was a map that had a view where you could see from the side
but maybe they were mistaken
or my memory is
its in "3d" but made of flat planes
depends what you mean
you can just draw a sprite in paint
and have it in game
unity handles creating meshes for 2d images
you don't have to create meshes for your canvas elements remember 
although theres nothing stopping you from creating 3d content and putting it in game either
it'd just look out of place
is there an easy way to replace sprites of the game?
I found the asset I want to change but when I try to find it in the UABE it's impossible to find
well you could find it in UABE
you can also just replace the texture on the sprite components that use that sprite
with the edited version in game
wait what
do you know how unity works
no
ok so everything in game is a gameobject
and gameobjects are given behaviour i.e. render a sprite or have collision
by Components
so load the game, wait for the object that uses the sprite you want to replace to be loaded
find its sprite component
and replace the sprites texture with an edited one
how do I load the game
From what I've experimented with you can only change text, audio, and texture2D files
through asset editing
but where do I change it?
Most often opening resources.assets in UABE
but I thought kdt was telling me to do something else
I was
if you can't find it in UABE
or dont want to ship an edited UABE
or a number of other reason why you wouldn't want to edit resources.assets
I was telling you to make a mod, that pretty much checked entities as they are loaded, and check if they have the target sprite
and if they are replace them with your edited sprite
you'd just load the edited sprite into memory whenever in your mod
oh ok
What up guys, I want to do trial of fools nail only, no damage, no charge attacks, no charms. I was wondering, by using the debug mode, can I somehow reset trial of fools instantly after i receive damage?
I just want to cut the process of restarting the game, activating the trial of fools, using super dash, etc
Im looking for something like i press one key and it restarts trial of fools
there is nothing like that
the closest you could get is to use glass soul
which is 1 hit KO
Hmh i got it. Its kind of annoying, but yeah, glass soul would help at least alittle bit. Thanks man
sean is adding instant teleports soon afaik
from my bossrush code
to practice bosses
I assume you could ask for trials when you see him
Anyone know the Radiance scene name off the top of their head?
nop
Ok kdt are you doing a boss rush?
Its been about two months since Ive played hollow knight and participate on the discord
So im not sure if there are new mods out there
But is it a new one? Or is the same made by the guy who disappeared and made copyright claims on the mod
How different it is compared to the old one?
it was re-written from scratch
i don't know what the old one was like, so i can't really say
it's pretty good though imo, a few quirks, and kinda easy if your a seasoned speedrunner, but fun
Shiga, it's pretty much like this:
you fight FK, it drops 3 shinies
you pick up one and a window with 8 bosses (kinda Megaman style) pops up for you to choose
rinse and repeat
Except sometimes it breaks
specially with HK and dream bosses
it breaks less often now, though, yes, there are still some oddities π
i think kdt might have fixed HK
with the last dll he posted
also, if you beat a boss without being hit, you get to pick up two shinies
and if you do not like any of the shinies, you can just skip ahead to the boss selection window
also, kinda related to his first question
can you noclip out of Trial of Fools?
maybe that could be his solution then?
just noclip outta there
guess I'll test it
is Gdrive API/debug current?
pssst somebody find me the scene name for Radiance, I'm a lazy shit
753: just a sec
I'll check the old boss rush
it's written there, somewhere
BossRush.bossData.Add("Dream_Final_Boss", new BossRushDB
{
BossName = "Radiance",
BossDefeated = false,
BossJournal = "killedFinalBoss",
NextScene = "",
DGScene = "Dream_Final_Boss",
GateX = 60.5f,
GateY = 21.4f,
Reward = "",
Points = 5000,
Time = 0f,
Random = false,
TimerMode = "gameobject:isenabled:Radiance",
TimerPos = new Vector4(0f, 0f, 0f, 0f),
InternalName = "Radiance",
Deaths = 0,
DamageTaken = 0,
Achievements = "",
Speedtime = 90f
});```
there it is
"Dream_Final_Boss", thanks
so
you can noclip out of the trial
but you cannot reenter
so you have to talk to that banner/idol/whatever at the entrance to confirm which trial you're doing, before reentering
Nice. I will try this mod when I get home.
I played the old one for about 14 hours, and although Im not a speed runner, I consider myself a god at killing bosses. Nah jk haha, but I had a lot of fun, so I'll try this one for sure.
And well, if you find a way to do the thing about the trial of fools, I would be so glad.
Hello new friends, I recently grabbed the Randomizer from this channel yesterday and I fucking love it but I was wondering if I should opt for the new version? Should I get it, and if so from where?
Nah there's no new version, I just didn't test the version checking and it doesn't work
I'll get around to fixing that soonβ’
hah it's all good, sweet mod tho π thanks
So I'm looking into why debug is breaking since the last update
This is somehow returning null:
internal static GameManager GM => _gm ?? (_gm = GameManager.instance);
despite GameManager.instance not being null
I guess I just have to assume there's something wrong with that syntax even though it looks fine and expand all the variables similar to this
wait
@rain cedar doesn't (_gm = GameManager.instance)
return nothing
doesn't it just set the variable
If that was the only problem here it would be null on a single call but once it's null it never gets fixed
Looks like assignment does return the assigned value, anyway
internal static GameManager GM
{
get
{
if (_gm == null) _gm = GameManager.instance;
return _gm;
}
}```
Works fine
Even though it's equivalent as far as I can tell
internal static GameManager GM
{
get
{
_gm = _gm ?? GameManager.instance;
return _gm;
}
}```
Not working either ^
I would never actually want to use that code because it's kinda awful, just trying to figure out what the hell is up with the ?? operator here
It's not working how it should
that's weird
I need to pull this up in dnspy and see if it compiles to something weird
?? should be doing exactly what you think it should as far as i know
?? should say if _gm is not null, use that, else, use whatever is on the right side of ??
It's showing as this in dnspy
internal static GameManager GM
{
get
{
GameManager result;
if ((result = DebugMod._gm) == null)
{
result = (DebugMod._gm = GameManager.instance);
}
return result;
}
}```
oh, weird
Which is kinda odd code but looks functional
I've got 7 of these things so I really don't want to expand them all if I don't have to
That's basically the same thing as the last one I posted that didn't work
That's how I expect it to work in the example there
sounds like a unity problem, maybe?
is it a null reference exception?
cause i'm wondering
if the first time it asks, it gets a copy that is valid at that time
because dnspy can decompile correctly (albeit weirdly)
sometime between when you ask again and when you asked the first time
the instance you had a pointer to was removed
and a new one was created
Yeah on quit out there's a new reference to GameManager I need to find, that's what this is meant to accomplish
Uh I thought it was pretty obvious that this game has a lot of bugs
but if that's the case, Sean, shouldn't you also compare the set instance with the current instance?
this isn't the game's fault, well, not exactly
not only with null
?? is a comparison
but you're comparing against null
Right but that's what it's meant to be used for
To check if something nullable has become null
I thought it was something like "if GM is null, set it to gm.instance. Otherwise, compare it against gm.instance. If they are different, set it to gm.instance"
my bad
hmm
Yeah Wyza I could just use another method for this, but I really want to know why this is wrong
yeah, just thinking half way out loud π
It's apparently not possible to override ??, so there's no way that's an issue here
It behaves inconsistently with the ?? operator, which also does a null check, but that one does a pure c# null check, and cannot be bypassed to call our custom null check.
Oh I see
So the problem here is that MonoBehaviour is fucked in some way and rather than fix that they slapped a bandaid on it by overloading ==
And ?? can't be overloaded so it doesn't work
I fucking hate Unity
hey, so i'm trying to use mods on mac, but they din't seem to be working.
@gusty sun only API works if you're trying lightbringer or glass soul or shitmodst or dream shield co-op
Which ones
I put the modding API folder in the hollow knight folder, but nothing happens
when I put mods in
Im trying the randomizer mod
All active mods are listed top left corner of the title menu
If nothing is showing up, then it's not installed correctly
also, i assume that you download the api version that says MAC on it
Also, make sure you have the right downloads
API should be called FinalOutputMac, correct?
internal static GameManager GM => _gm != null ? _gm : (_gm = GameManager.instance);
This is fucking hideous but I'm pretty sure it'll at least work
Mac File Paths
Save Files: ~/Library/Application Support/unity.Team Cherry.Hollow Knight/
Game Files: ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app/
right click the zip file and click view contents/open contents
merge that Contents with the contents of the Game Files
@gusty sun
i think i needed to fix the zip file
Ok
so that it was 1 directory down
right click the zip file and click view contents/open contents
merge that Contents with the contents of the Game Files: ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app/
and put randomizer in
~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app/Contents/Resources/Data/Managed/Mods
iirc
you can still use the zip
just have to right click it and click view contents
something like...
public static GameObject Default(this GameObject obj, GameObject defaultObject) {
return obj != null ? obj : (obj = defaultObject);
}
I mean it's basically "We think null objects should be non-null"
I am so mad at the Unity devs right now
sorry, distracted coding, trying to play a moba and code at the same time is bad for doing either ;P
which is probably how the unity devs did this
why is ?? not overrideable

because it's not actually a thing
because ?? evaluates to a much bigger chunk of code
I think something like _gm == null and null == _gm would have potentially different values
Because the second would use the default c# ==, right?
in theory, yes
Beautiful
anyway, with that extension, i think you could do
internal static GameManager GM => _gm.Default(GameManager.instance);
Yeah, I think I will do that
if that works i might just add that to the api
Looks a lot cleaner
You know, I'm just realizing I don't think there's any point to using this extension instead of just =
Since I'm finding the current reference manually on every call
Regardless of if it's null
This is inefficient
i guess if the calls are happening far enough apart that _gm is becoming invalid, yeah, it would be
i guess for references, it doesn't really matter
it isn't like we're allocating/un-allocating objects
I have another where the default would be
RefKnight.transform.Find("Attacks/Slash").GetComponent<PlayMakerFSM>()
I'm on mac, is there an api version lightbringer? also modding the game requires some windows software to view and edit dlls right?
some sort of mono developer
But yeah that's what made me realize the extension potentially cause a performance hit
Since I'm also going to be calling that one very often for the info panel on the left
Really don't want to be doing that unless it's null already
yeah
Guess I'll just go back to manually writing out the ternary
it's the whole "hey there is 4.5 helpers that reduce like 80% of this code, but too bad it's all a hacked version of 3.5 you're stuck with" thing again
I've got a pretty interesting new problem
I set up 2FA for my github account and I can't figure out how to push from the command line now
Either that or I've failed to type in my password like 5 times
I'm sure it's the right one because I logged into the site fine
hmm, nope 2FA works with SSH push/pull, cause i have it on
i don't think it works if you try to push over https
The bottom two sections might be helpful regarding 2FA stuff: https://help.github.com/articles/providing-your-2fa-authentication-code/
For example, when you access a repository using Git on the command line using commands like git clone, git fetch, git pull or git push with SSH URLs, you must provide your SSH key passphrase when prompted for a password. The command line prompt won't specify that you should enter your SSH key passphrase when it asks for your password.
weird
idk, I stopped using https as my method years ago and ssh has always "just worked"
for mac
and development
Visual Studio is on Mac now
and there's some .NET Core thingy
also you can probably use Mono in the VS Mac
.net core won't compile to 3.5
but i think you can do mono in vs mac
while not 100% equivalent, think of .net core as mono 5.0
(.net core replaces mono, and will eventually replace .net 4.x and 5.x, probably)
it was/is
but .net core runs on Linux, Unix, Mac, Windows, etc
they built it specifically so that there would be a business grade solution for .net in something other than windows
ohh
so basically, they all got together and went, "hey there's this thing called mono that lets dvelopers use .net on other platforms. there's alot of non-windows platforms, lets copy mono's ideas", and thus core was born
π
(vastly oversimplified)
it's coming along well i think, it's pretty fun
Maybe there should be some balancing to not get vengefly king so early
you mean it needs to be at least slightly fair? ;P
i've got a "hard enemy" list, but i'm not using it yet
Is that list just bosses and primal aspids?
hah, i just had to navigate that room to the left of crossroads with 5 of them that spawned in it
it was nasty
oh no, i mean, just left of the crossroads entrance room
the one outside grubfather
ew
i just dove to the bottom along the wall and ran
Wait so are primal aspids in the "easy" list?
but i'm not planning on randomizing bosses or sub bosses that lock you in with them
i don't think he's implemented the list
though honestly I think there should be more deliniation than easy/hard, probably easy/moderate/hard
Honestly most enemies are either easy or hard
current "hard" list
I think there should be a mode where you get bosses in random roooms
"Gorgeous Husk", //82 (for fun)
"Electric Mage",//35
"Mage Knight",//35
"Giant Buzzer Col",//33
"Giant Fly Col",//34
"Lancer",//35
"Lobster",//35
"Mawlek Body", //46 (mini boss)
"Moss Knight", //137
"Mushroom Brawler", //
"Royal Gaurd", //358
I guess there's easy but tanky ones
that's the idea
those are the scenes that contain them
Spell twister not on hard enemy list
mostly a note for myself
The electric ones are way easier
you might need to screw with the shop costs
electric guy can spawn far away in a big room
and just start spamming electricity from screens away
cause alot of high geo enemies would make stuff trivial
Oh I didn't think it would activate at distance
apparently distance doesn't matter
Guess it makes sense
that guy trashed me in city of tears from somewhere
yeah, most colloseum enemies just all come for you in a big room
Same with the zotelings
should i randomly replace the blue health bugs?
downside: they become random sacks of enemies
upside: blue health bugs get added to rando enemy pool so you can find them elsewhere
eh
considering exactly 0 normal players would have a reason to go hit the blue sacks
it would essentially be a net gain
It might be full of gorgeous husks, though
true
though again, unless you make stuff more expensive, i think geo is going to be even easier than it already is
it's a lot easier to die though, too
and thus, lose your geo
dunno, gonna have to play test it a lot π
die twice *
Was the keybinding issue fixed?
testing that now
cause i thought about that after i posted the video
on the upshot, unloading and loading a mod works start to end. mods will have to be updated to support the functionality. (for example I actually have 5 mods installed, only 1 shows on the list because it checks to make sure that the mod supports the ability for it to be disabled)
interestingly enough. apparently keybinds aren't broken....weird
still need to save the list of the mods current states so that when you load the game, it only loads mods that either A: were enabled before, or B: are "new" since the last time it loaded
that way if you go in and disabled, say, debug mod, then exit, when you reload, it'll still be disabled
if I replace a mod file
then turn it off and on
will it break
or will it work
i doubt you can replace it
i think the game locks the dlls when running
if it doesn't, then turning it off/on would do nothing new
it won't reload the mod
from the dll
basically when it disables it, it calls IToggleableMod.Unload(), and when it enables it, it calls IMod.Initialize()
the dll loading only happens once when the game loads
that's largely why I decided to make the IToggleableMod interface. It's there to force existing mods to understand that Initialize can't be counted on to be only ever called once anymore if they want it to be able to be toggled in the mods menu.
and of course to "unload" a mod, the biggest thing is that any hooks you subscribed to be unsubscribed from
so to show up in the menu you have to add IToggleableMod.Unload() to your mod?
with stuff like
Modding.ModHooks.stuff -= OnInt;
you'd make 2 changes:
public class PlayerDataDump : Mod, ITogglableMod
then yes, like you say:
public void Unload() {
Modding.ModHooks.Attack -= OnAttack;
}
and that's about it
and making sure that calling initialize twice won't break stuff
which, in general, i'm guessing it probably won't
@leaden hedge did the hard part of making the UI work
but yeah, it's pretty slick
my wife looked at me like i had a third eye when i showed her that we made a button you could click π
basically a "all this excitement for a button?" look. followed by a "let me get this straight, you work all day coding at your job, then come home and code?"
lmao
lol
the flow of the mod menu reminds me of how we have to organize things with our slot machine games at work
i do kind of wonder if it wouldn't be better set one tier up on the first menu
all slot games need to be able to be suspended and reset back to the initial state at any time (because regulators will replay saved games to review outcomes and then want to pause/cancel/restore things)
as well as they need to be able to recover to a previous state if the game goes down mid-way
so we implement an IReset interface
and another that's for restoring back to where you were
can be really time consuming if you don't keep them in mind when setting up features
time consuming to add later*
yeah
if Initialize is setting up a singleton, Unload should unregister that, ya?
in most cases, i would say yes. the biggest thing is that any events that you subscribe to need to be removed
yeah, got that covered π
along with removing all the "dont destroy on load" game objects i made
soon as i finish up the persistence of the enable/disable, i'll post a beta version of the API for folks to play with
yeah
for most mods, the undo i think is relatively trivial. for mods like yours where you're being all creative in finding new ways to break the game, probably a little more effort 
hehe
i'm just making a mess 
so when re-enabling the mod, will you be reallocating another instance via a new() operation?
no
at least, at the moment, that is not the plan
it'll just call Initialize again
grr, i hate you unity. hate
what'd it do this time?
break everything
unity comes with this JSON serializer (because we're still living in the dark ages of .net 3.5). and they are all like "it's so fast, it's amazing", except it is the most garbage serializer ever made
it can't serialize properties, it can't serialize complex object graphs, we have to jump through so many hoops to make it work right
oh, yeah
just spent 45 minutes trying to figure out why it wouldn't serialize this serializabledictionary, only to remember that oh, it can't serialize properties, only fields
which i knew
but forgot
we have so many editor scripts at work
someone got properties serializing
but it's really janky
is there an easy way to kill an enemy through script?
I think health_manager has a die thingy
right now the rooms that lock you in until you kill the enemies that get spawned seem to not like having their enemies replaced. if you kill the replacements you're softlocked inside
in the health_manager FSM, Decrement Health checks for zero health
could probably decrement by health remaining
something like this? FSMUtility.LocateFSM( enemy, "health_manager_enemy" ).SetState( "Decrement Health")
(i'm totally noob to modifying the FSMs)
looks right
I'm not very good at FSMs
I've dealt with FSMs a total of thrice
once for murdering healing
and twice for murdering spells
huzzah
it worked?
nah, haven't tried yet
it was more of a "huzzah, the blind leading the blind" kinda thing
lol
when you set state
set Attack Strength to like 500 or something
beforehand
foreach (NamedVariable var in FSMUtility.LocateFSM(go, "health_manager_enemy").FsmVariables.GetNamedVariables(VariableType.Int))
{
if (var.Name == "Attack Strength")
{
val.Value = 500;
}
}
like that I think
(assuming go is the game object)
also note it can be "health_manager" OR "health_manager_enemy"
yeah
ended up just copy-pasting my code with health_manager instead of health_manager_enemy
bool IsEnemyByFSM(GameObject enemy)
{
return (FSMUtility.ContainsFSM(enemy, "health_manager_enemy"));
}
fsm is black magic as far as i'm concerned
looks like i'll need to check both
in principle, it makes sense, in this implimentation....
yeah, after browsing through their scenes and what i could of their exposed code
bool IsEnemyByFSM(GameObject enemy)
{
return (FSMUtility.ContainsFSM(enemy, "health_manager_enemy") || FSMUtility.ContainsFSM(enemy, "health_manager"));
}
let's just say i feel a lot better about my work
π
gonna try this now actually and see what it does
quick question since some of you seem to be a bit more familiar with c# than me, is there a better more "C#" way of doing this:
int flags = GetTypeFlags(newEnemy);
if((flags & FLAGS.GROUND) > 0)
{
}
isn't it &&
flags is a bitmask
rather, FLAGS.GROUND is the mask i should say
0010110 & 001000 > 0
for example
no clue how you could do that differently
well, c++ is nice and i could remove the > 0
c# doesn't like the implicit conversion π
so GetTypeFlags returns an int?
yep
hmm
i have code at work where i've dealt with flags in c#, but i haven't touched them in like 8 months, so i'm rusty
normally
you can just do if (flag1 & flag2) i think....
sec
yeah so, for example
[Flags]
public enum SomeFlags {
A = 1,
B = 2,
C = 4,
D = 8,
E = 16
}
if (SomeFieldThatIsSomeFlags.A & SomeFieldThatIsSomeFlags.B) { //something
}
think so
i'll try changing a couple things around and see if that works
make sure you're getting the flags as flags
there is also something like
myObjectThatIsSomeFlags.HasFlag(SomeField.A & SomeField.B)
yep, that attribute did it
that's neat
thanks π
er
wait, i think i spoke too soon
yeah, it still wants the > 0 syntax
here's an example of one bit that i was trying
bool HasSameType(int flagsA, int flagsB)
{
if((flagsA & FLAGS.GROUND) > 0 && (flagsB & FLAGS.GROUND) > 0)
{
return true;
}
flagsA is the state
are flagsA and FLAGS.GROUND the same enum?
flagsA is like 1011101 the total state
yes, but do they both come from the same base enum?
oh!
you're not trying to mix flags from different ones right?
i think i see what you're saying
cause i'm thinking that's why it wants you to cast
like, this is me setting up the flags currently
int flags = 0;
flags |= (isGround ? 1 : 0) << 0;
flags |= (isFlying ? 1 : 0) << 1;
flags |= (isSmall ? 1 : 0) << 2;
flags |= (isMed ? 1 : 0) << 3;
flags |= (isLarge ? 1 : 0) << 4;
flags |= (isWall ? 1 : 0) << 5;
flags |= (isHard ? 1 : 0) << 6;
then the result for each enemy goes to the function previously pasted
yeah, gonna replace the hard coded bit shift values with enum values
[Flags]
public enum StateFlags {
Ground = 1,
Flying = 2,
Small = 4,
Medium = 8,
Large = 16,
Wall = 32,
Hard = 64
}
then
yep
public class FLAGS
{
static public int GROUND = 1;
static public int FLYING = 2;
static public int SMALL = 4;
static public int MED = 8;
static public int BIG = 16;
static public int WALL = 32;
static public int HARD = 64;
}
me_irl
why a class?
just to use ints and have everything work, since the enums were yelling at me about the casting like you mentioned
is why i'm asking for help π
i think i see what you're saying though and what i'm doing wrong
public class mything {
public StateFlags flags = 0;
public void SetFlags() {
flags |= (isGround ? StateFlags.Ground : 0);
}
public void CheckFlags() {
if (flags.HasFlag(StateFlags.Ground & StateFlags.Small))
//burp
}
}
i think that will work, or something close
ahh, yeah, i gotcha
keeping wife up so i need to head out for now. thanks for the help guys π
well generally "buttons" don't take 180 lines of code to implement 
so its definitely worth excitement when it actually works
i was sufficiently excited π
also you can probably just send enemies into SemiPersistent? state to kill them
1.2.2.1-29 Alpha -
This version adds the functionality to control whether your mod is loaded or not via a menu toggle. To make your mod managable the following changes need to occur.
1: add the IToggleableMod interface after MyMod : Mod
2: Implement the public void Unload() method in your mod. This should unsubscribe from all unhooks and undo any other changes made to the game's state.
3: Ensure that Initialize() can now be called more than once in a single run of the game. When a mod is unloaded and then loaded again, Initialize will be called again to get the mod running again.
The mod should then show up under the Main Menu->Options->Mods.
PS - Big/Huge thanks to KDT for getting the custom menus working
Yo sick
Hi, I'm on a mac and tried installing the boss rush mod but it isnt working (the boss rush mode does not show). I copied both the api files and the mod's .dll file over to the respective folders. Does the boss rush mod not work on a mac or am I doing something wrongly?
mac api is probably not up to date
I see... Aight thanks!
Btw, some extra info:
I can see that the modding API(1.2.2.1-27) and the BossRush(0.9.6565.25678) mod are installed from the top left corner of the main menu.
My existing save can no longer be seen , it shows 4 empty save slots (it comes back when I remove bossrush.dll so its fine).
The BossRush mode doesn't show (only classic and steel soul available).
Oh I see LOL. Oops! Thanks for pointing that out. It's working. Do I have to add and remove the mod everytime I wanna switch between the normal game and bossrush?
for now yes
theres an alpha above that will ad ingame mod toggles
but thats windows only and I havent added it to bossrush yet
aight thanks guys!
Yo, so can Debug Mod remove enemies or it can only kill them? π€
When some die they leave bodies. It's bad for filming ambience clips π€£ In the mod's instructions it says Kill all enemies and Clone or delete any enemy. IDK how to do the delete thing.
Β―_(γ)_/Β― - couldn't tell you, @rain cedar would know, but he's probably at work or in class atm
Ahh, alright. I went through all the menus but still can't find the delete option π Thanks, and I will search more for it.
lol
this really is a fun mod
i can't say i've ever heard the term "fun" being ascribed to debug
hmm, so i was trying out the new mod api
when i click "Mods" in the options menu
this screen appears
gotta run to work, so can't test more now, but before i copied over my new mod dll i did get the mods menu, but it was empty
oh
i think i know why
so my enemy randomizer is still existing in the RandomizerMod.dll (ie. i essentially have two mods in one dll)
then it's throwing this nullref
Non platform assembly: K:\Games\steamapps\common\Hollow Knight\hollow_knight_Data\Managed\Mods\RandomizerMod.dll (this message is harmless)
KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2[System.String,System.Boolean].get_Item (System.String key) [0x00000] in <filename unknown>:0
at Modding.ModLoader.UpdateModText () [0x00000] in <filename unknown>:0
at Modding.ModLoader.LoadMods () [0x00000] in <filename unknown>:0
at OnScreenDebugInfo.Awake () [0x00000] in <filename unknown>:0
so, my guess is that it doesn't like the mod class name being different from the dll name
i'll fix that up later tonight
good call
yeah, there's some inconsistency between that
also this error was present in the log
KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary2[System.String,System.Boolean].get_Item (System.String key) [0x00000] in <filename unknown>:0 at Modding.Menu.ModManager.SceneLoaded (Scene scene, LoadSceneMode lsm) [0x00000] in <filename unknown>:0 at (wrapper delegate-invoke) UnityEngine.Events.UnityAction2<UnityEngine.SceneManagement.Scene, UnityEngine.SceneManagement.LoadSceneMode>:invoke_void__this___Scene_LoadSceneMode (UnityEngine.SceneManagement.Scene,UnityEngine.SceneManagement.LoadSceneMode)
i should really fix it so that it uses the same name
anyway, gotta run
yup, i'll work on fixing the name stuff tonight
so that differences don't screw stuff up
π cool man, thanks for your hard work
np. I did a bunch to make the code more resilient, but clearly there are still some places that I need to clean up.
also @leaden hedge I generalized the Faux menu horizontal a little by removing the stuff that specifically said "Mod" in it and changed the Update thing to be an event handler that you can attach to. That way when I create the option, i have a handler that will go and do the unload/load without having to jump through action<> hoops or anything
makes sense
I couldn't really code anything other than a log on option change
as nothing was really implemented on the api end
navs[i] = new Navigation
{
mode = Navigation.Mode.Explicit,
selectOnUp = i == 0 ? Back : ModArray[i - 1],
selectOnDown = i == ModArray.Length - 1 ? Back : ModArray[i + 1]
};
did resharper do this
thats way more concise than what I programmed
yeah
object initializer
i made a few other changes too
like modArray[i] being replaced with "mod", to aid in readability
and i made several adjustments in the stupid Instance checking
cause Unity loves to set stuff to null at random
also do you see these 2 lines
menuItem.cancelAction = CancelAction.DoNothing;
and
((MenuButton)Back).cancelAction = CancelAction.DoNothing;
well if you check Assembly-CSharp, in UnityEngine.UI namespace the class MenuSelectable has a function OnCancel(BaseEventData)
you need add a new CancelAction for quitModMenu
then check for it in that function and call FauxUIManager.UIquitModMenu
not sure how easy that'll be
"oh, you wanted the GameManager instance? here it is, oh wait, nevermind, it's not there anymore, oh hey, it's back!"
not being null is more of a suggestion
clearly
hmm, weird, cause right now the back button works fine, or is CancelAction for using the escape key?
the back button works in the mod menu?
even if you're hovering over a mod and not back
because it shouldn't
clicking on back works
thats this
events.triggers = new List<EventTrigger.Entry>();
EventTrigger.Entry submit = new EventTrigger.Entry {eventID = EventTriggerType.Submit};
submit.callback.AddListener(data => { _fauxUim.UIloadModMenu(); });
events.triggers.Add(submit);
EventTrigger.Entry click = new EventTrigger.Entry {eventID = EventTriggerType.PointerClick};
click.callback.AddListener(data => { _fauxUim.UIloadModMenu(); });
events.triggers.Add(click);
well no
((MenuButton)Back).cancelAction = CancelAction.DoNothing;
EventTrigger backEvents = Back.gameObject.GetComponent<EventTrigger>();
backEvents.triggers = new List<EventTrigger.Entry>();
EventTrigger.Entry backSubmit = new EventTrigger.Entry {eventID = EventTriggerType.Submit};
backSubmit.callback.AddListener(data => { _fauxUim.UIquitModMenu(); });
backEvents.triggers.Add(backSubmit);
EventTrigger.Entry backClick = new EventTrigger.Entry {eventID = EventTriggerType.PointerClick};
backClick.callback.AddListener(data => { _fauxUim.UIquitModMenu(); });
backEvents.triggers.Add(backClick);
this
ah
but the first line of that determines whats done when you press the back / escape button
which is currently nothing
and UIManager.HideCurrentMenu is coded very good
if (this.menuState == MainMenuState.OPTIONS_MENU)
{
menu = this.optionsMenuScreen;
}
else if (this.menuState == MainMenuState.AUDIO_MENU)
{
menu = this.audioMenuScreen;
}
else if (this.menuState == MainMenuState.VIDEO_MENU)
{
menu = this.videoMenuScreen;
}
ah, ok. I see. Yeah I should be able to do that no problem. I'll look at adding that as a patch to the unity class

@buoyant wasp - tagging myself so i have a bookmark to this for when i get home
Does the API work on DRM free?
Dunno, is there a difference between the GoG and Humble Bundle DRM Free ? if there isn't, i can test it and let you know tonight or tomorrow night
at worst, I can easily take the DRM Free version and run the build process against it
it's a single button press to build the API now for windows, another button for mac
Man, nothing better than taking a bug report back to the guy who keeps insisting the bug is 100% reproducible and having him fail to demonstrate the bug for 30 minutes and finally claim it must be fixed now (nothing changed and the claimed bug should have been impossible anyway). My theory is he was using the wrong dll from some other project.
/endventing
how do i edit my save to respawn a boss
Use debug mod
It has a feature to respawn bosses i think
how do i get debug mod
In the pinned messages
there's the drive
kk, thanks
make sure to install the API
@young walrus should work. Current versions of HK are the same between drm-free and steam
how do I activate the Debug UI? I installed everything correctly, just not sure on how to use it
f1
It says its installed in the top left corner, right?
nope
Then you did something wrong
maybe I fucked up
yeah
Rip
there is a video
You installed the API first, right?
did you follow those directions?
ill watch it
Then you copied the mod dll file over inside the mods folder?
i just read the readme
(it applies to all API based mods)
does it say Modding-API 1.2.2.1-26 (or something like that) in the upper left hand corner?
no sir
Then you should try reinstalling the API
Ok, I think I had the wrong version like Wyza said. Reinstalled and it works now!
Great!
is there way to spawn at specific benches, changing what the last bench rested at is?
I dont think so, BUT, you can setup multiple dream gates
and give yourself essence
lol
we just need the x,y,scene coordinates of all benches then we could teleport anywhere, but i'm too lazy to go find them
still too lazy π
how do you bind keys to their function
Click the circles in the controls menu
kk, is there also a way to unbind it without just replacing
Nah there's not
I'm trying to get the Randomizer started, and I followed the instructions in the readme's, but I go to start a new game and the text on the menu is saying Randomizer: Off, and there's no way to toggle it.
What's up with that?
Click it
Click it
With ur mouse
Oh duh
Click it 
Yeah it's not part of the game UI
It's just on top
So you can't really interact with it with buttons
we have a way to make it part of the UI now though π
in theory
actually, no, in practice
it wouldn't even be that hard now
The problem here is I don't care
lmao
what are the bonfire and blackmoth mods
bonfire adds RPG-like stats you can level up with geo
blackmoth changes main attack to the dash
bonfire is presently broken though
start w/ shade cloak and dash through enemies to damage them
what are you talking about
infinite swing speed isn't broken
lol
how broken was it again?
I feel like working on it again
after I'm done lazying around
1 level in DEX gives you infinite swing speed
iirc cause it multiplies speed based off the previous swing
not base
that video is from november lol
I haven't touched it since
had to deal with real life issues
and just got lazy after
isn't laziness also a real life issue π€
I mean, like, health issues and stuff
idk,
i mean
i got the spell damage change working
but i think right now the change is "set all spells to 0 damage"
lol
pfft
I'll take credit for my part, but like most things, it was a team effort. I can't fix bonfire if there was no bonfire. can't have improved the API without having first had an API to build on. and I lean alot on @leaden hedge and @rain cedar when it comes to why the game does the things it does
I honestly think Bonfire should be credited to the modding community as a whole, but people don't wanna be bothered with debugging it, so...
wow wyza even killing his own joy
is blackmoth broken too
it's just filled with bugs?
it's "you'll have to reload from time to time" broken
and if you -do- want to break it, just ask @hazy sentinel
i kind of want to play it
or anything, for that matter
it sounds interesting
cus u break stuffs
but just playing blackmoth breaks it
I tried it and dash damage got set to 1 like every 30 minutes
that... About sums it up
and no one has come up with a solution to it, yet
basically because we haven't found what's causing it
okay, sorry to bother you
not really doing anything right now
i think the dash damage reduce happens when you switch charms
@solemn rivet is blackmoth on github
This is probably not up to date https://github.com/seanpr96/Blackmoth
no, it's not
I made some changes in order to try and fix the 1-damage bug
and it did reduce it
it's not on github
okay, what it USED to do is:
change nail damage to 1 (to break stuffs/interact with levers/pogo)
does nail damage 0 not interact with stuff?
change dash damage to whatever nail would be (5+4*upgrades)
remove the checks for hasDash, canDash and canShadowDash
in a nutshell
no, it doesn't
now it's easy to fix, tho
with the new damage types
you can just set dash to be the same type as nail would be
but that was only introduced in the CP2 patch
cool
vs broken blackmoth
Modding API 1.2.2.1-30 Alpha
- Tries to Insulate the Mod Menu against errors a bit more
- Adds the Cancel (Escape) functionality to the Mods Menu instead of doing nothing
- Each hook call from each mod is now wrapped in a try/catch. This has 2 benefits. First hook failures are insulated from causing other mods who use the same hook from failing. Second since we now have an on screen tail of the ModLog, having the exceptions printed to ModLog instead of OutputLog (in all cases surrounding a hook), means you can see it in your dev console window.
- Should fix the issue where if your Mod's Name property differs from the Mod's class name or dll name, it won't break the mod menu anymore. (hopefully)
woah
nice
@solemn rivet does blackmoth add SOUL on damage from dash? also are spells affected
No, 56,there's probably an easy way to do that, but I'm not, but any means, proficient with coding
Also, no change to spells
What I did do is make it so that you recover soul on dash after you get the shade cloak
Before writing blackmoth, my greatest accomplishment in coding was taking a basic c undergrad programming course 7 years ago
So, yeah, 1337 hax0r skills
lol
1337 h4x0r 5k1115
cool. I probably won't be releasing it for a bit. With so many additions, wanna let it settle for a bit. Lots of new tech here that probably has bugs
π
i can only imagine the bug puns team cherry must endure while working on this
yo, i love the exceptions being in the on screen log now
so we just need to get someone who doesn't care a little less than sean to add the menu button for randomizer to be "native" so that you don't have to click the randomizer settings, like KDT. he seems to like to do proof of concept stuff and then let someone else put it all together
But this isn't his problem
\
dunno how you'd even make a controller usable randomizer menu
you need a keyboard to input numbers
https://qzprod.files.wordpress.com/2016/05/jeffbonhag2.gif?w=640
you dont NEED a keyboard :^}
well, i just meant the toggle between off/easy/hard
and maybe the randomize button
not thinking the number input area would be controller capable
was there a way to make the mouse always visible?
yes
and
so you'd just hook into the CursorHook and change the Cursor.visible = true and Cursor.lockState = CursorLockMode.None;
ye got it working
cool
Are any mods compatible with eachother?
Mainly interested in lightbringer, boss rush / bonfires
Ok cool
lightbringer is not API, so it's not compatible with anything
Ok, and how would I tell if a mod is an api mod or not?
in the drive it has [API] next to its name
Thanks!
that said, YMMV on what works together and what doesn't. all the API mods will load together, but they may not necessarily play well together depending on what the mod does
IE Randomizer and Boss Rush can both be loaded, but boss rush takes priority and randomizer would just behave as if it didn't exist
bonfire and bossrush probably can both be loaded, but right now the scaling doesn't work right with bonfire to really work with BR well
debug mod basically works with everything (as a general rule)
note the folders don't have [API]
it's just the zips
also for some reason hell mod doesn't have [API]
Β―_(γ)_/Β―
hellmod does now
@dapper folio - Thoughts on the google drive folders having API in their names? might make sense at that level.
nice
what is the hell mod
lmao
and nerfed healing
and spells
and 2x incoming damage
@fair rampart
## Effects
- 1/2 Nail Damage
- 2x incoming damage
- 1/3 max SOUL
- 1/2 SOUL collection
- no SOUL collection while your shade is alive
- Heal focus is nerfed to Deep Focus speed
- Deep focus multiplier increased by 1.3725
- Dream shield only costs 1 notch (bugged, shows up as 1 but still uses 3)
- 80% spell damage (20% reduction)
that does sound like hell
what does the charm notch mod do
Used with randomizer
Gives you the salubra notches automatically when you reach the charm requirements for them
does anyone happen to know how TC went about creating the geometry for the levels?
you mean technically or logically or what?
technically
Probably with some editor that did all the work for them
So like a dumbass I just sent a big long message to General about needing help with editing a save, so I'm gonna just say long story short, I can't find a save editor that I can get/that'll work and I need help with this. Any help is appreciated, thanks!
Thank you so much man, I really appreciate it.
They block it all out first with just black blocks then add the art to that later. Not sure how, I think they just do it in unity
Graig has spoken, all praise Lord Graig
Top right there's a dreamgate submenu
Yeah. Read, Save, Delete and Add item
You just click the names in the list to set them active
Oh yeah, to change which DG you spawn at
But I want to add a DG to Uumuu room, or inside Black Egg for an example
Oh wow, gotcha. I was looking for a Function key thing, similar to force pause
cheers man
makes 100% sense, shouldve worked that out on my own
There's probably a key for adding a gate
Idk there's like 80 things you can bind
I don't remember them all
Oh, @rain cedar , I'm a big fan of your debug mode, really helps with practicing bosses for speedruns.
@warped sinew Wait so they just took a bunch of black 1x1 boxcolliders?
no they are XxY box colliders
wait actually wouldn't they be edgecolliders? Still, slapping a bunch of black edge/boxcolliders manually sounds like a pain. I thought they would have used some type of tool to make it easier.
no its boxcolliders
or polygon colliders
afaik most of the maps are made of prefabs and each prefab has a collider
and again, they just used an editor to do it
it's not like someone manually coded all this stuff
it's pretty clear alot of the game was generated via an editor based on how it works
they posted a blog post a while back on it i think
I'd like to read that. Is it just on the Team Cherry website or somewhere else? If you remember.
sorry, was trying to find it
turns out it was an interview
but if you look down about halfway
they show the geometry without the art
yup
that
honestly looking over that article, it's probably almost exactly what you're wanting
little bit of technical, little bit of logical, little bit of example
hopefully
thanks π
does anyone have the sprite sheet for the knight again?
I would if imgur would let me upload it
top half
bottom half
nice 8mb limit btw
thank
that's a lot of knights
60mb limit here ;P
people can you help me? i posted on help but got cleared before i could try to solve my problems (i was afk)
i've no idea how to use debug mod
i've never use any mod before in any game
i was thinking the other day. it'd be slick to figure out how to make a "dark knight" (like "dark link") fight
there is a video
pinned about installing boss rush
the directions are the same
except where you see "boss rush" use "debug"
it's basically, install the api from the drive (also pinned), install debug mod from the drive
behold disgustify https://github.com/TheBlocks/DisgustIndent ( very much not by me )
so....it's design is to make your code look bad?
I've seen plenty of code (some of which i wrote) that doesn't need a tool to get there
so it kind of obfuscates code?
not really
obfuscation would mean that throwing the code into literally any decent IDE and hitting "format code" would not be enough
all i'd have to do is ctrl+k ctrl+d in VS and it'd be fixed
Hey, guys where can I find the descending dark animation or any other animation without a background in the game files?
Good luck with that
Each frame of the animation will be several sprites from the seemingly randomly named sheets
And you'll have to piece it all together yourself
That's fine with me
If that's what you wanna do
I think it would be way easier to just mod the game to have everything but the knight invisible
Is there mods for that?
Nah but it shouldn't be crazy hard to do
its a nightmare god grimm mod
Take grimm, make every attack twice as fast, and have every attack be spikes + normal attack
oh
not sure about the twice as fast part tbh
nope
nope
nope
nope
also
Also at the end have 2 grimms

