#archived-modding-development

1 messages Β· Page 49 of 1

leaden hedge
#

theres little to no maintenance required on api mods

#

big mods aren't made because it's very difficult to create substantial content for the game

ornate rivet
#

ok

leaden hedge
#

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

ornate rivet
#

lol

leaden hedge
#

maybe one day someone will put the effort into figuring out how other stuff works

buoyant wasp
#

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

leaden hedge
#

nah

#

everything is on a flat plane

buoyant wasp
#

hmm

leaden hedge
#

and the camera is orthographic

pearl sentinel
#

Yep

buoyant wasp
#

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

leaden hedge
#

its in "3d" but made of flat planes

buoyant wasp
#

ah

#

still, you'd have to model the 2d stuff

leaden hedge
#

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 hollowface

#

although theres nothing stopping you from creating 3d content and putting it in game either

#

it'd just look out of place

ornate rivet
#

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

leaden hedge
#

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

ornate rivet
#

wait what

leaden hedge
#

do you know how unity works

ornate rivet
#

no

leaden hedge
#

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

ornate rivet
#

how do I load the game

leaden hedge
#

you run it

#

like normal

buoyant obsidian
#

From what I've experimented with you can only change text, audio, and texture2D files

#

through asset editing

ornate rivet
#

but where do I change it?

buoyant obsidian
#

Most often opening resources.assets in UABE

ornate rivet
#

but I thought kdt was telling me to do something else

leaden hedge
#

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

ornate rivet
#

oh ok

finite herald
#

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

buoyant wasp
#

there is nothing like that

#

the closest you could get is to use glass soul

#

which is 1 hit KO

finite herald
#

Hmh i got it. Its kind of annoying, but yeah, glass soul would help at least alittle bit. Thanks man

buoyant wasp
#

you could try putting down a dream gate inside

#

no idea if it works

#

never tried

leaden hedge
#

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

buoyant obsidian
#

Anyone know the Radiance scene name off the top of their head?

fair rampart
#

nop

finite herald
#

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

buoyant wasp
#

boss rush is in the drive

#

see the pins

finite herald
#

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?

buoyant wasp
#

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

solemn rivet
#

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

rain cedar
#

Except sometimes it breaks

solemn rivet
#

specially with HK and dream bosses

buoyant wasp
#

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

solemn rivet
#

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?

buoyant wasp
#

probably?

#

would have to test

solemn rivet
#

maybe that could be his solution then?

#

just noclip outta there

#

guess I'll test it

#

is Gdrive API/debug current?

buoyant wasp
#

current enough

#

doesn't have the onscreen console i put out this week, but

buoyant obsidian
#

pssst somebody find me the scene name for Radiance, I'm a lazy shit

solemn rivet
#

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

buoyant obsidian
#

"Dream_Final_Boss", thanks

solemn rivet
#

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

finite herald
#

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.

wraith ether
#

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?

rain cedar
#

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β„’

wraith ether
#

hah it's all good, sweet mod tho πŸ˜ƒ thanks

rain cedar
#

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

copper nacelle
#

wait

#

@rain cedar doesn't (_gm = GameManager.instance)

#

return nothing

#

doesn't it just set the variable

rain cedar
#

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

copper nacelle
#

cool

#

also that's a strange bug

#

cause that looks right

rain cedar
#
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

copper nacelle
#

that's weird

rain cedar
#

I need to pull this up in dnspy and see if it compiles to something weird

buoyant wasp
#

?? 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 ??

rain cedar
#

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;
    }
}```
buoyant wasp
#

oh, weird

rain cedar
#

Which is kinda odd code but looks functional

buoyant wasp
#

hmm

#

hmm

rain cedar
#

I've got 7 of these things so I really don't want to expand them all if I don't have to

copper nacelle
#

does

#

return _gm ?? GameManager.instance;

#

work?

rain cedar
#

That's basically the same thing as the last one I posted that didn't work

rain cedar
#

That's how I expect it to work in the example there

solemn rivet
#

sounds like a unity problem, maybe?

buoyant wasp
#

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

solemn rivet
#

because dnspy can decompile correctly (albeit weirdly)

buoyant wasp
#

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

solemn rivet
#

that does happen btw

#

that was an issue with Bonfire

rain cedar
#

Yeah on quit out there's a new reference to GameManager I need to find, that's what this is meant to accomplish

plush ravine
#

Uh I thought it was pretty obvious that this game has a lot of bugs

solemn rivet
#

but if that's the case, Sean, shouldn't you also compare the set instance with the current instance?

buoyant wasp
#

this isn't the game's fault, well, not exactly

solemn rivet
#

not only with null

rain cedar
#

?? is a comparison

solemn rivet
#

but you're comparing against null

rain cedar
#

Right but that's what it's meant to be used for

#

To check if something nullable has become null

solemn rivet
#

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

buoyant wasp
#

hmm

rain cedar
#

Yeah Wyza I could just use another method for this, but I really want to know why this is wrong

buoyant wasp
#

yeah, just thinking half way out loud πŸ˜‰

rain cedar
#

It's apparently not possible to override ??, so there's no way that's an issue here

buoyant wasp
#

apparently

#

Unity's monobehavior screws with ??

rain cedar
#

You can't overload ??, though

#

That's not possible

copper nacelle
#

unity screws with == to make it work

#

which doesn't screw with ?? to make it work

buoyant wasp
#

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.

rain cedar
#

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

gusty sun
#

hey, so i'm trying to use mods on mac, but they din't seem to be working.

copper nacelle
#

@gusty sun only API works if you're trying lightbringer or glass soul or shitmodst or dream shield co-op

young walrus
#

Which ones

gusty sun
#

I put the modding API folder in the hollow knight folder, but nothing happens

#

when I put mods in

#

Im trying the randomizer mod

young walrus
#

Nothing is showing up top left?

#

Of the title screen?

gusty sun
#

In game?

#

Ill check to make sure

young walrus
#

All active mods are listed top left corner of the title menu

#

If nothing is showing up, then it's not installed correctly

buoyant wasp
#

also, i assume that you download the api version that says MAC on it

gusty sun
#

Ok, yeah nothing shows up

#

Yeah, I did

young walrus
#

Also, make sure you have the right downloads

buoyant wasp
#

oh, i think 56 said something

#

about the path

copper nacelle
#

yeah

#

the path is weird af

gusty sun
#

API should be called FinalOutputMac, correct?

rain cedar
#
internal static GameManager GM => _gm != null ? _gm : (_gm = GameManager.instance);

This is fucking hideous but I'm pretty sure it'll at least work

copper nacelle
#
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

buoyant wasp
#

i think i needed to fix the zip file

gusty sun
#

Ok

buoyant wasp
#

so that it was 1 directory down

copper nacelle
#

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

buoyant wasp
#

@rain cedar you could probably add a extension to gameobject

#

that has that

rain cedar
#

Sounds fun

#

I don't even get what problem they think they're solving with this

buoyant wasp
#

something like...

public static GameObject Default(this GameObject obj, GameObject defaultObject) {
    return obj != null ? obj : (obj = defaultObject);
}
rain cedar
#

I mean it's basically "We think null objects should be non-null"

#

I am so mad at the Unity devs right now

copper nacelle
#

lmao

#

why would they do that

#

that sounds really dumb

buoyant wasp
#

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

copper nacelle
#

why is ?? not overrideable

rain cedar
#

Because it's not

#

Ask whoever maintains c#

copper nacelle
buoyant wasp
#

because it's not actually a thing

#

because ?? evaluates to a much bigger chunk of code

rain cedar
#

I think something like _gm == null and null == _gm would have potentially different values

#

Because the second would use the default c# ==, right?

buoyant wasp
#

in theory, yes

rain cedar
#

Beautiful

buoyant wasp
#

anyway, with that extension, i think you could do

rain cedar
#

internal static GameManager GM => _gm.Default(GameManager.instance);

buoyant wasp
#

yup

#

in theory

rain cedar
#

Yeah, I think I will do that

buoyant wasp
#

if that works i might just add that to the api

rain cedar
#

Looks a lot cleaner

rain cedar
#

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

buoyant wasp
#

i guess if the calls are happening far enough apart that _gm is becoming invalid, yeah, it would be

rain cedar
#

Nah I use GM on every frame

#

For checking if you're on the title in the update code

buoyant wasp
#

i guess for references, it doesn't really matter

#

it isn't like we're allocating/un-allocating objects

rain cedar
#

I have another where the default would be

RefKnight.transform.Find("Attacks/Slash").GetComponent<PlayMakerFSM>()
soft rain
#

I'm on mac, is there an api version lightbringer? also modding the game requires some windows software to view and edit dlls right?

rain cedar
#

No and no

#

There's bound to be something for .net development on mac

buoyant wasp
#

some sort of mono developer

rain cedar
#

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

buoyant wasp
#

yeah

rain cedar
#

Guess I'll just go back to manually writing out the ternary

buoyant wasp
#

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

rain cedar
#

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

buoyant wasp
#

lol

#

does SSH not work with 2FA?

rain cedar
#

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

buoyant wasp
#

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

deep pilot
#

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.

buoyant wasp
#

weird

#

idk, I stopped using https as my method years ago and ssh has always "just worked"

copper nacelle
#

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

buoyant wasp
#

.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)

copper nacelle
#

replaces

#

I thought mono was community made

buoyant wasp
#

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

copper nacelle
#

ohh

buoyant wasp
#

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)

pearl sentinel
#

this part is much harder with randomized enemies

buoyant wasp
#

LOL

#

i love it

pearl sentinel
#

it's coming along well i think, it's pretty fun

rain cedar
#

Maybe there should be some balancing to not get vengefly king so early

buoyant wasp
#

you mean it needs to be at least slightly fair? ;P

pearl sentinel
#

i've got a "hard enemy" list, but i'm not using it yet

rain cedar
#

Is that list just bosses and primal aspids?

buoyant wasp
#

screw primal aspids

#

forever

#

literally the hardest boss in the game

pearl sentinel
#

hah, i just had to navigate that room to the left of crossroads with 5 of them that spawned in it

#

it was nasty

rain cedar
#

So on the way to Uumuu?

#

Or in greenpath?

pearl sentinel
#

oh no, i mean, just left of the crossroads entrance room

#

the one outside grubfather

buoyant wasp
#

ew

pearl sentinel
#

i just dove to the bottom along the wall and ran

rain cedar
#

Wait so are primal aspids in the "easy" list?

pearl sentinel
#

but i'm not planning on randomizing bosses or sub bosses that lock you in with them

buoyant wasp
#

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

rain cedar
#

Honestly most enemies are either easy or hard

pearl sentinel
#

current "hard" list

copper nacelle
#

I think there should be a mode where you get bosses in random roooms

pearl sentinel
#

"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

rain cedar
#

I guess there's easy but tanky ones

pearl sentinel
#

gorgeous husk is on there for sun

#

fun*

buoyant wasp
#

oh man, spawn like 4 husks in 1 room

#

geo for days

pearl sentinel
#

that's the idea

buoyant wasp
#

though, hmm

#

if you did that

copper nacelle
#

are those health values?

#

// 35 and such

pearl sentinel
#

those are the scenes that contain them

rain cedar
#

Spell twister not on hard enemy list

pearl sentinel
#

mostly a note for myself

rain cedar
#

The electric ones are way easier

pearl sentinel
#

well

#

except

buoyant wasp
#

you might need to screw with the shop costs

pearl sentinel
#

electric guy can spawn far away in a big room

#

and just start spamming electricity from screens away

buoyant wasp
#

cause alot of high geo enemies would make stuff trivial

rain cedar
#

Oh I didn't think it would activate at distance

pearl sentinel
#

apparently distance doesn't matter

rain cedar
#

Guess it makes sense

pearl sentinel
#

that guy trashed me in city of tears from somewhere

rain cedar
#

It's a colosseum exclusive enemy

#

No reason for an idle state

pearl sentinel
#

yeah, most colloseum enemies just all come for you in a big room

rain cedar
#

Same with the zotelings

pearl sentinel
#

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

buoyant wasp
#

eh

#

considering exactly 0 normal players would have a reason to go hit the blue sacks

#

it would essentially be a net gain

rain cedar
#

It might be full of gorgeous husks, though

buoyant wasp
#

true

pearl sentinel
#

this is true

#

i could do something like

#

make it one of 5 things

buoyant wasp
#

though again, unless you make stuff more expensive, i think geo is going to be even easier than it already is

pearl sentinel
#

it's a lot easier to die though, too

#

and thus, lose your geo

#

dunno, gonna have to play test it a lot πŸ˜ƒ

buoyant wasp
#

die twice *

deep pilot
#

Was the keybinding issue fixed?

buoyant wasp
#

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

copper nacelle
#

if I replace a mod file

#

then turn it off and on

#

will it break

#

or will it work

buoyant wasp
#

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

copper nacelle
#

ohh

#

alright

buoyant wasp
#

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

copper nacelle
#

so to show up in the menu you have to add IToggleableMod.Unload() to your mod?

#

with stuff like

#

Modding.ModHooks.stuff -= OnInt;

buoyant wasp
#

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

copper nacelle
#

πŸ†’

#

that seems amazing

buoyant wasp
#

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?"

copper nacelle
#

lmao

pearl sentinel
#

lol

#

the flow of the mod menu reminds me of how we have to organize things with our slot machine games at work

buoyant wasp
#

i do kind of wonder if it wouldn't be better set one tier up on the first menu

pearl sentinel
#

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*

buoyant wasp
#

yeah

pearl sentinel
#

if Initialize is setting up a singleton, Unload should unregister that, ya?

buoyant wasp
#

in most cases, i would say yes. the biggest thing is that any events that you subscribe to need to be removed

pearl sentinel
#

yeah, got that covered πŸ‘

#

along with removing all the "dont destroy on load" game objects i made

buoyant wasp
#

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 hollowface

pearl sentinel
#

hehe

#

i'm just making a mess omggrub

#

so when re-enabling the mod, will you be reallocating another instance via a new() operation?

buoyant wasp
#

no

#

at least, at the moment, that is not the plan

#

it'll just call Initialize again

pearl sentinel
#

alrighty, i gotta reset my members then too

#

nbd

buoyant wasp
#

grr, i hate you unity. hate

pearl sentinel
#

what'd it do this time?

copper nacelle
#

break everything

buoyant wasp
#

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

pearl sentinel
#

oh, yeah

buoyant wasp
#

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

pearl sentinel
#

we have so many editor scripts at work

#

someone got properties serializing

#

but it's really janky

buoyant wasp
#

we cheat, alot, to simplify having custom save data

#

janky is a good term

pearl sentinel
#

is there an easy way to kill an enemy through script?

copper nacelle
#

I think health_manager has a die thingy

pearl sentinel
#

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

copper nacelle
#

in the health_manager FSM, Decrement Health checks for zero health

#

could probably decrement by health remaining

pearl sentinel
#

something like this? FSMUtility.LocateFSM( enemy, "health_manager_enemy" ).SetState( "Decrement Health")

#

(i'm totally noob to modifying the FSMs)

copper nacelle
#

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

pearl sentinel
#

huzzah

copper nacelle
#

it worked?

pearl sentinel
#

nah, haven't tried yet

#

it was more of a "huzzah, the blind leading the blind" kinda thing

copper nacelle
#

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"

pearl sentinel
#

well

#

that explains why my checks for health_manager_enemy don't work on some

copper nacelle
#

yeah

#

ended up just copy-pasting my code with health_manager instead of health_manager_enemy

pearl sentinel
#

bool IsEnemyByFSM(GameObject enemy)
{
return (FSMUtility.ContainsFSM(enemy, "health_manager_enemy"));
}

buoyant wasp
#

fsm is black magic as far as i'm concerned

pearl sentinel
#

looks like i'll need to check both

buoyant wasp
#

in principle, it makes sense, in this implimentation....

pearl sentinel
#

yeah, after browsing through their scenes and what i could of their exposed code

copper nacelle
#
bool IsEnemyByFSM(GameObject enemy)
{
            return (FSMUtility.ContainsFSM(enemy, "health_manager_enemy") || FSMUtility.ContainsFSM(enemy, "health_manager"));
}
pearl sentinel
#

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)
{

        }
copper nacelle
#

isn't it &&

pearl sentinel
#

flags is a bitmask

#

rather, FLAGS.GROUND is the mask i should say

#

0010110 & 001000 > 0

#

for example

copper nacelle
#

no clue how you could do that differently

pearl sentinel
#

well, c++ is nice and i could remove the > 0

#

c# doesn't like the implicit conversion πŸ˜›

buoyant wasp
#

so GetTypeFlags returns an int?

pearl sentinel
#

yep

buoyant wasp
#

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 
}
pearl sentinel
#

hmm

#

is that what the attribute enables?

buoyant wasp
#

think so

pearl sentinel
#

i'll try changing a couple things around and see if that works

copper nacelle
#

make sure you're getting the flags as flags

buoyant wasp
#

there is also something like

myObjectThatIsSomeFlags.HasFlag(SomeField.A & SomeField.B)
pearl sentinel
#

yep, that attribute did it

#

that's neat

#

thanks πŸ˜ƒ

#

er

#

wait, i think i spoke too soon

#

yeah, it still wants the > 0 syntax

copper nacelle
#

try

#

SomeField.A as Flag

#

or Flags

pearl sentinel
#

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;
}

copper nacelle
#

shouldn't

#

flagsA

#

be a flag

pearl sentinel
#

flagsA is the state

buoyant wasp
#

are flagsA and FLAGS.GROUND the same enum?

pearl sentinel
#

flagsA is like 1011101 the total state

buoyant wasp
#

yes, but do they both come from the same base enum?

pearl sentinel
#

oh!

buoyant wasp
#

you're not trying to mix flags from different ones right?

pearl sentinel
#

i think i see what you're saying

buoyant wasp
#

cause i'm thinking that's why it wants you to cast

pearl sentinel
#

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

buoyant wasp
#

hmm

#

see i would use an enum for that

#

so

pearl sentinel
#

yeah, gonna replace the hard coded bit shift values with enum values

buoyant wasp
#
[Flags]
public enum StateFlags {
    Ground = 1,
    Flying = 2,
    Small = 4,
    Medium = 8,
    Large = 16, 
    Wall = 32, 
    Hard = 64
}
#

then

pearl sentinel
#

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;
}

copper nacelle
buoyant wasp
#

why a class?

pearl sentinel
#

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

buoyant wasp
#
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

pearl sentinel
#

ahh, yeah, i gotcha

#

keeping wife up so i need to head out for now. thanks for the help guys πŸ˜ƒ

buoyant wasp
#

np

#

later

leaden hedge
#

well generally "buttons" don't take 180 lines of code to implement hollowface

#

so its definitely worth excitement when it actually works

buoyant wasp
#

i was sufficiently excited πŸ˜ƒ

leaden hedge
#

also you can probably just send enemies into SemiPersistent? state to kill them

buoyant wasp
#

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

young walrus
#

Yo sick

untold ridge
#

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?

leaden hedge
#

mac api is probably not up to date

untold ridge
#

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).

copper nacelle
#

@untold ridge there is no mode

#

when you start a new save it becomes bossrush

untold ridge
#

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?

leaden hedge
#

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

untold ridge
#

aight thanks guys!

winter snow
#

Yo, so can Debug Mod remove enemies or it can only kill them? πŸ€”

buoyant wasp
#

what's the difference?

#

the end result is the enemy is gone

winter snow
#

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.

buoyant wasp
#

Β―_(ツ)_/Β― - couldn't tell you, @rain cedar would know, but he's probably at work or in class atm

winter snow
#

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

buoyant wasp
#

i can't say i've ever heard the term "fun" being ascribed to debug

winter snow
#

it's fun for me cuz i can see the full scenery

#

no UI to get in the way

pearl sentinel
#

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

leaden hedge
#

code crashed before it had time to override default click behaviour

#

dunno why

pearl sentinel
#

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

buoyant wasp
#

yeah, there's some inconsistency between that

pearl sentinel
#

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)

buoyant wasp
#

i should really fix it so that it uses the same name

pearl sentinel
#

anyway, gotta run

buoyant wasp
#

yup, i'll work on fixing the name stuff tonight

#

so that differences don't screw stuff up

pearl sentinel
#

πŸ‘ cool man, thanks for your hard work

buoyant wasp
#

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

leaden hedge
#

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

buoyant wasp
#

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

leaden hedge
#

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

buoyant wasp
#

"oh, you wanted the GameManager instance? here it is, oh wait, nevermind, it's not there anymore, oh hey, it's back!"

leaden hedge
#

not being null is more of a suggestion

buoyant wasp
#

clearly

#

hmm, weird, cause right now the back button works fine, or is CancelAction for using the escape key?

leaden hedge
#

the back button works in the mod menu?

buoyant wasp
#

yup

#

the api i posted works completely as far as i can tell

leaden hedge
#

even if you're hovering over a mod and not back

buoyant wasp
#

hmmm

#

didn't try that

leaden hedge
#

because it shouldn't

buoyant wasp
#

i just clicked on back and it works

#

i'll have to try the hover and hitting back

leaden hedge
#

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

buoyant wasp
#

ah

leaden hedge
#

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;
        }
buoyant wasp
#

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

young walrus
#

Does the API work on DRM free?

buoyant wasp
#

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

pearl sentinel
#

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

fair rampart
#

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

copper nacelle
#

make sure to install the API

solemn rivet
#

@young walrus should work. Current versions of HK are the same between drm-free and steam

fair rampart
#

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

buoyant wasp
#

there is a video

fair rampart
#

You installed the API first, right?

buoyant wasp
#

on installing bossrush

#

that is pinned

fair rampart
#

yeah

#

kk, thanks wyza

buoyant wasp
#

did you follow those directions?

fair rampart
#

ill watch it

#

Then you copied the mod dll file over inside the mods folder?

#

i just read the readme

buoyant wasp
#

(it applies to all API based mods)

fair rampart
#

yeah

#

hmm

#

You installed the same API as your version?

buoyant wasp
#

does it say Modding-API 1.2.2.1-26 (or something like that) in the upper left hand corner?

fair rampart
#

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

leaden hedge
#

is there a way yes

#

is there an easy way

#

nah

fair rampart
#

lol

buoyant wasp
#

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

leaden hedge
#

you don't need that to spawn at a bench

#

you just need the scene name

buoyant wasp
#

still too lazy πŸ˜›

fair rampart
#

how do you bind keys to their function

rain cedar
#

Click the circles in the controls menu

fair rampart
#

kk, is there also a way to unbind it without just replacing

rain cedar
#

Nah there's not

kindred nest
#

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?

young walrus
#

Click it

rain cedar
#

Click it

young walrus
#

With ur mouse

kindred nest
#

Oh duh

hazy sentinel
#

Click it hollowface

kindred nest
#

I was playing with the controller

#

wasn't expecting to click things

rain cedar
#

Yeah it's not part of the game UI

#

It's just on top

#

So you can't really interact with it with buttons

young walrus
#

Except the left mouse button

buoyant wasp
#

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

rain cedar
#

The problem here is I don't care

copper nacelle
#

lmao

fair rampart
#

what are the bonfire and blackmoth mods

hazy sentinel
#

bonfire adds RPG-like stats you can level up with geo

#

blackmoth changes main attack to the dash

buoyant wasp
#

bonfire is presently broken though

hazy sentinel
#

start w/ shade cloak and dash through enemies to damage them

#

what are you talking about

#

infinite swing speed isn't broken

buoyant wasp
#

lol

solemn rivet
#

how broken was it again?

#

I feel like working on it again

#

after I'm done lazying around

hazy sentinel
#

1 level in DEX gives you infinite swing speed

#

iirc cause it multiplies speed based off the previous swing

#

not base

rain cedar
#

Oh so it just stacks

#

Lmao

solemn rivet
#

oh

#

nice

hazy sentinel
#

that video is from november lol

solemn rivet
#

I haven't touched it since

#

had to deal with real life issues

#

and just got lazy after

hazy sentinel
#

isn't laziness also a real life issue πŸ€”

solemn rivet
#

I mean, like, health issues and stuff

buoyant wasp
#

idk,

#

i mean

#

i got the spell damage change working

#

but i think right now the change is "set all spells to 0 damage"

copper nacelle
#

lol

buoyant wasp
#

hey, all i said i'd fix was making spell damage changeable

#

not my mod πŸ˜›

solemn rivet
#

yeah

#

that really saves it tho

#

and we all owe it to you

buoyant wasp
#

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

solemn rivet
#

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...

hazy sentinel
#

wow wyza even killing his own joy

vagrant leaf
#

is blackmoth broken too

solemn rivet
#

always has been

#

but it works

#

it's not "won't even run properly" broken

vagrant leaf
#

it's just filled with bugs?

solemn rivet
#

it's "you'll have to reload from time to time" broken

vagrant leaf
#

huh

#

so not too broken

#

but broken enough

solemn rivet
#

and if you -do- want to break it, just ask @hazy sentinel

vagrant leaf
#

i kind of want to play it

solemn rivet
#

or anything, for that matter

vagrant leaf
#

it sounds interesting

hazy sentinel
#

i haven't really played blackmoth though

#

why did you tag me

solemn rivet
#

cus u break stuffs

hazy sentinel
#

but just playing blackmoth breaks it

#

I tried it and dash damage got set to 1 like every 30 minutes

solemn rivet
#

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

hazy sentinel
#

not really doing anything right now

vagrant leaf
#

i think the dash damage reduce happens when you switch charms

copper nacelle
#

@solemn rivet is blackmoth on github

solemn rivet
#

don't remember, 56

#

just a sec

#

I have the .cs anyway

rain cedar
solemn rivet
#

no, it's not

#

I made some changes in order to try and fix the 1-damage bug

#

and it did reduce it

copper nacelle
#

I thought blackmoth just kills nail

#

and has infinite shadowdash from the start

solemn rivet
#

it's not on github

#

okay, what it USED to do is:

#

change nail damage to 1 (to break stuffs/interact with levers/pogo)

copper nacelle
#

does nail damage 0 not interact with stuff?

solemn rivet
#

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

hazy sentinel
#

kill nailsmith with dash

#

we're ascending bois

solemn rivet
#

but that was only introduced in the CP2 patch

copper nacelle
#

cool

vagrant leaf
#

wait

#

does that mean

#

functional blackmoth?

buoyant wasp
#

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)
copper nacelle
#

woah

#

nice

#

@solemn rivet does blackmoth add SOUL on damage from dash? also are spells affected

solemn rivet
#

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

copper nacelle
#

lol

vagrant leaf
#

1337 h4x0r 5k1115

pearl sentinel
#

sweety

#

*sweet

#

new modding api works, enemyrandomizer is in the menu now

buoyant wasp
#

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

pearl sentinel
#

πŸ‘

#

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

rain cedar
buoyant wasp
#

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

rain cedar
#

But this isn't his problem

buoyant wasp
#

neither was the mod loader menu, but somehow that happened as if by magic

#

\

rain cedar
#

\

leaden hedge
#

dunno how you'd even make a controller usable randomizer menu

#

you need a keyboard to input numbers

trim grove
buoyant wasp
#

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

leaden hedge
#

was there a way to make the mouse always visible?

buoyant wasp
#

yes

#

and

#

so you'd just hook into the CursorHook and change the Cursor.visible = true and Cursor.lockState = CursorLockMode.None;

leaden hedge
#

ye got it working

buoyant wasp
#

cool

eager flare
#

Are any mods compatible with eachother?

#

Mainly interested in lightbringer, boss rush / bonfires

leaden hedge
#

all api mods are "compatible"

#

everything else no

eager flare
#

Ok cool

buoyant wasp
#

lightbringer is not API, so it's not compatible with anything

eager flare
#

Ok, and how would I tell if a mod is an api mod or not?

buoyant wasp
#

in the drive it has [API] next to its name

eager flare
#

Thanks!

buoyant wasp
#

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)

copper nacelle
#

note the folders don't have [API]

#

it's just the zips

#

also for some reason hell mod doesn't have [API]

#

Β―_(ツ)_/Β―

buoyant wasp
#

hellmod does now

#

@dapper folio - Thoughts on the google drive folders having API in their names? might make sense at that level.

copper nacelle
#

nice

fair rampart
#

what is the hell mod

leaden hedge
#

half nail damage pretty much

#

oh and you get less soul

fair rampart
#

lmao

copper nacelle
#

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)
fair rampart
#

that does sound like hell

copper nacelle
#

Β―_(ツ)_/Β―

#

I tried to make the game harder

leaden hedge
#

its not too bad

#

makes bosses like 40-50% slower or something

fair rampart
#

what does the charm notch mod do

young walrus
#

Used with randomizer

#

Gives you the salubra notches automatically when you reach the charm requirements for them

charred parrot
#

does anyone happen to know how TC went about creating the geometry for the levels?

buoyant wasp
#

you mean technically or logically or what?

charred parrot
#

technically

rain cedar
#

Probably with some editor that did all the work for them

sharp grove
#

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!

rain cedar
sharp grove
#

Thank you so much man, I really appreciate it.

warped sinew
#

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

solemn rivet
#

Graig has spoken, all praise Lord Graig

thorn comet
#

How do you force a dreamgate in debug mod again?

#

I cant find it for the life of me

rain cedar
#

Top right there's a dreamgate submenu

thorn comet
#

Yeah. Read, Save, Delete and Add item

rain cedar
#

You just click the names in the list to set them active

thorn comet
#

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

rain cedar
#

You have to be there

#

You just click add and it puts one in the list where you are

thorn comet
#

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

rain cedar
#

There's probably a key for adding a gate

#

Idk there's like 80 things you can bind

#

I don't remember them all

spiral turtle
#

Oh, @rain cedar , I'm a big fan of your debug mode, really helps with practicing bosses for speedruns.

charred parrot
#

@warped sinew Wait so they just took a bunch of black 1x1 boxcolliders?

leaden hedge
#

no they are XxY box colliders

charred parrot
#

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.

leaden hedge
#

no its boxcolliders

#

or polygon colliders

#

afaik most of the maps are made of prefabs and each prefab has a collider

buoyant wasp
#

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

charred parrot
#

I'd like to read that. Is it just on the Team Cherry website or somewhere else? If you remember.

buoyant wasp
#

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

rain cedar
buoyant wasp
#

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

charred parrot
#

thanks πŸ˜ƒ

serene tundra
#

does anyone have the sprite sheet for the knight again?

leaden hedge
#

I would if imgur would let me upload it

#

nice 8mb limit btw

serene tundra
#

thank

keen surge
#

that's a lot of knights

buoyant wasp
#

60mb limit here ;P

supple veldt
#

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

buoyant wasp
#

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

supple veldt
#

can you link me

#

ook

#

checking it

buoyant wasp
#

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

supple veldt
#

thank you so much

#

i managed to installl it

copper nacelle
buoyant wasp
#

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

copper nacelle
#

lol

#

yes

#

It throws ask the semicolons and brackets to the side

ornate rivet
#

so it kind of obfuscates code?

buoyant wasp
#

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

cobalt spade
#

Hey, guys where can I find the descending dark animation or any other animation without a background in the game files?

rain cedar
#

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

cobalt spade
#

That's fine with me

rain cedar
#

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

cobalt spade
#

Is there mods for that?

rain cedar
#

Nah but it shouldn't be crazy hard to do

fair rampart
#

what is KDT's Nightmare God Grimm mod

#

Basically

hollow pier
#

its a nightmare god grimm mod

fair rampart
#

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

copper nacelle
#

also

fair rampart
#

Also at the end have 2 grimms