#archived-modding-development

1 messages · Page 499 of 1

midnight narwhal
#

ok uh so how would i do this

jolly oriole
#

if you want that information inside of an FsmStateAction:

GameObject ownerDefaultTarget = base.Fsm.GetOwnerDefaultTarget(this.gameObject);
#

if you want that from outside (with pfsm being the fsm you want it from):

GameObject ownerDefaultTarget = pfsm.Fsm.GetOwnerDefaultTarget(ownerDefault);
midnight narwhal
#

k ty

worn eagle
#

I hope when tc said enemies in silksong were more complex they meant they're using smarter fsms rather than bigger fsms

midnight narwhal
#

For reference,

[ERROR]:[UNITY] - NullReferenceException: Object reference not set to an instance of an object
[ERROR]:[UNITY] - SoullessMode.SoullessMode.SceneManager_sceneLoaded (Scene arg0, LoadSceneMode arg1)
[ERROR]:[UNITY] - UnityEngine.SceneManagement.SceneManager.Internal_SceneLoaded (Scene scene, LoadSceneMode mode)
copper nacelle
#

i would guess on that being it

#

that's just gonna end up being fsm.gameObject

midnight narwhal
#

oh

#

how would i fix this?

copper nacelle
#

I mean if you're just trying to increase the scale, fsm.gameObject.transform.localScale *= 5; seems fine to me

midnight narwhal
#

its readonly

#

fsm.gameObject

#

wait

copper nacelle
#

hmmm

midnight narwhal
#

nvm

#

i guess its no longer readonly?

#

or i did something wrong the last time i tried that

#

ty

copper nacelle
#

this is just a guess on the nre still, if you had the wrong action name that would also do it

nocturne meteor
#

Somewhat related, if I wanted to, say, replace every enemy X with an enemy Y, do I need to overwrite each attribute manually, or is there something like,
if (fsm.FsmName == "X") { // make this a Y }
which does it at like, an object level?

copper nacelle
#

destroy the old one instantiate a new one

nocturne meteor
#

Makes sense, thx.

nocturne meteor
#

Hm, okay, I'm doin' something wrong here. I'm going from the radiance api page, but I'm confused on:

GameObject aspid = Instantiate(Aspid.preloadedGO["Aspid"]);
...
...        
PlayMakerFSM fsm  = aspid.LocateMyFSM("spitter");

Is the object for the entire thing the first thing? And then, from that object, the actions and such are the PlayMakerFSM thing after?

midnight narwhal
nocturne meteor
#

Oh, wait, I think I get it --- I don't even need to mess with FSM here, I can just kill off the game object and instantiate a new one that I want --- that didn't click until now.

#

Or --- wait, do I need to use FSM, because I'm not sure how to get the enemy object. Instantiate and Aspid in that above code don't seem to be found, and I'm using ModCommon, PlayMaker, and PlayMaker.Actions. Hm.

midnight narwhal
#

what is the tiktik fsm called? I cant find it in FSM Viewer

nocturne meteor
#

Yeah, I couldn't find it either and that's what enemy I wanted to manipulate. :'[

jolly oriole
#

done via the MonoBehaviour Climber

#

and they're called Climber

#

@midnight narwhal @nocturne meteor

midnight narwhal
#

oh ty

#

wait the fsm is called "Climber"?

nocturne meteor
#

That's kind of a cute name.

midnight narwhal
#

i still dont see it

#

unless im looking in the wrong place

jolly oriole
#

MonoBehaviour, not fsm

midnight narwhal
#

oh

nocturne meteor
#

Is there a nice way to "get" every object of type "Climber"?

#

Some sort of Object.FindObjectsOfType thing?

jolly oriole
#

exactly that

leaden hedge
#

GameObject.FindObjectsOfType<T>() iirc

nocturne meteor
#

Okay, nice. And is the type of these "Climber"? Or is that just the name of them?

leaden hedge
#

whatever is to the left of : MonoBehaviour

jolly oriole
#

the type is Climber, and the name

leaden hedge
#

findobjectsoftype is slow af

#

so dont do it often

nocturne meteor
#

Got it. And, maybe dumb question, but what if I wanted all of the enemies except climber. Is there a way to just say "general enemies"?

leaden hedge
#

HealthManager

nocturne meteor
#

I'm more exploring what I can do with a mod, not really making anything for production, so I don't mind.

leaden hedge
#

then manually filter climbers out

nocturne meteor
#

That makes sense --- all enemies should inherit from HealthManager. Okay, cool.

leaden hedge
#

even things that cant die, like the "flies" you pogo off in white palace have them

jolly oriole
#

well, technically they can die, you just need to deal over 999 damage in one hit

#

or 4 9s, idk

leaden hedge
#

instead of doing findalloftype

#

if it has an awake function

#

you can do On.Type.Awake += ...

nocturne meteor
#

Oh, interesting --- I just read something about looping over objects and seeing if they had certain methods, weird timing.

#

Once I have the HealthManager for an enemy, should I use myHM.getComponent() to return the enemy object (for me to destroy and put a new one in)? I'm not sure how to get to something like Crawler 1 from Crawler 1 (HealthManager).

#

Oh, or can I go right to .gameObject?

vocal spire
#

So you are trying to get the GameObject of the health manager?

vocal spire
leaden hedge
#

and if its nested, you can do .transform.parent.gameobject

nocturne meteor
#

Okay, I promise that I'll quit bugging y'all: if I want to overwrite this game object, is it enough to create my own game object (or copy it from another GO) and do something like myHM.gameObject = myOtherGameObject? Is that gonna mess anything up?

vocal spire
#

You don’t overwrite it

#

You add the HealthManager component to a the GameObject and set all of the fields and stuff to the original health manager’s stuff

nocturne meteor
#

Yeah, okay, it's readonly. Wait, I'm a bit confused by this --- so I've got a bunch of healthmanager objects (one for each enemy) and each of them has a gameobject --- is that game object a parent or a child of the health manager?

leaden hedge
#

a parent

nocturne meteor
#

Ahhh, okay. My mistake then. So, we're really looking for game objects which have a healthmanager child because those are enemies. Once I have a healthmanager, I look at the game object. I now want to make a change to what enemy this is: which requires modifying some attributes / child classes of GameObject.

leaden hedge
#
scene
-gameobject
--transform
---childgameobject
----transform
----spriterenderer
--healthmanager
-gameobject2
--transform
nocturne meteor
#

So I gott'a find the subclasses / attributes in "enemy" game objects, copy the ones from, say, Climber, and then replace all of them in the GameObject I'm trying to change --- is that mostly okay?

leaden hedge
#

is roughly how scenes look

nocturne meteor
#

Alright. I'm not sure what the transform is, but I know the rest.

leaden hedge
#

transform is like a required component

#

it says where it is, and how big it is

potent dirge
#

is GameObject things like the knight, or transtrans, or VK, or NKG?

leaden hedge
#

are you trying to replace gameobject a with gameobject b?

nocturne meteor
#

Yeah. Let's say, to be concrete: a crawler with a climber.

leaden hedge
#

get a reference to gameobject b GameObject b = gameobjectB;
copy gameobject a transform Transform trans = gameobjectA.transform;
destroy gameobject a Destroy(gameobjectA);
instantiate a copy of gameobject b gameobjectC = Instantiate(gamobjectB);
paste the transform onto the new gameobject gameobjectC.transform = trans;

nocturne meteor
#

Is transform what holds things like the sprite, etc?

leaden hedge
#

no

#

transform is position data

#

size,rotation,position

#

Instantiating something makes a 1:1 copy of it

#

but you want it where gameobjectA was

nocturne meteor
#

Ahhh, I see.

#

Alright, I'm tryin' this out now. :'] Thank you so far, it's been v helpful.

leaden hedge
#

im not 100% sure if gameobjectA.transform will return a reference or a value

#

you may have to do something more complicated to store it temporarily after the reference is destroyed

nocturne meteor
#

I'll check the value after destroy.

#

Is it myGameObject.DestroyAll()? The Destroy(myGameObject) doesn't exist in my context.

leaden hedge
#

its on monobehaviours

#

you'll need to do GameObject.Destroy(object) iirc

#

if you're not on a component/gameobject

#

either immediate or not will work fine

nocturne meteor
#

That looks like it'll be okay.

#

Alas, looks like gameObjectC.transform is read-only, on the last step. :'[

leaden hedge
#

you can just iterate over it

#

the values arent

nocturne meteor
#

Okay, cool.

leaden hedge
#

so you can do objectC.transform.position = temp.position

#

localscale, localrotation, localposition

potent dirge
#

is SceneManager child of something, or rather how do I use SceneManager.activeSceneChanged (with 1.2.2.1 as usual, so might be different from 1.4.3.2)

nocturne meteor
#

Alright, great, I think I've got a bit to dive into, I'll work more after work on it. :'] thank you all.

jolly oriole
potent dirge
#

maggotprime heck u code that is not working for a reason i do not understand

jolly oriole
#

try UnityEngine.SceneManagement.SceneManager

potent dirge
worn eagle
fair rampart
#

can i do a mod on Mac?

leaden hedge
#

yes

fair rampart
#

txz

ornate rivet
#

doing mods sounds hot

vocal spire
#

🤔

safe hamlet
#

why have you said this

nocturne meteor
#

Okay, I'm tryin' to make a bunch of enemies into TikTiks for coding practice. The plan, (from getting help above), was to foreach through the healthmanagers in a scene, put their transform stuff into local vars, then instantiate a TikTik ("Climber") gameobject and assign those transforms.

I've been trying to do the instantiate part, but I can't figure out how to just get a single Climber enemy to act as the "template" that I can copy from. If I do it by scene, the object will become null when the scene ends --- and it's really weird to deep-copy a class in C# it seems. So, I'd like to get a Climber object at the init of the code somehow. Like,

GameObject climberGO = Instantiate(GameObject.FindObjectsOfTypeAll(Climber)[0])

Or something like that. That does't work, though. Any thoughts or ideas? Code is here for reference: https://github.com/jsal13/TikTikTikTik/blob/main/main.cs#L17-L33

jolly oriole
#

do

UObject.DontDestroyOnLoad(climberGO);
climberGO.SetActive(false);

after the instantiate

nocturne meteor
#

That line (the one above I typed that defines climberGO) doesn't work for me at all --- I just was using it as an example.

#

But that's a good step to do after I figure out how to get a Climber game object.

jolly oriole
#

try

GameObject climberGO = Instantiate(GameObject.FindObjectsOfType<Climber>()[0])

or

// assuming climber has an awake method, idk if it has
On.Climber.Awake += OnClimberAwake;
...
private void OnClimberAwake(On.Climber.orig_Awake orig, Climber self)
{
    orig(self);

    this.climberGO = Instantiate(self.gameObject);
    UObject.DontDestroyOnLoad(this.climberGO);
    this.climberGO.SetActive(false);
    On.Climber.Awake -= OnClimberAwake;
}
nocturne meteor
#

For the first, I feel like this should work, but I don't have the unqualified Instantiate in this namespace. Is this the same as using GameObject.Instantiate?

jolly oriole
#

yes

nocturne meteor
#

okay, cool, then I get back to the similar problem as above: Cannot implicitly convert type 'Climber' to 'UnityEngine.GameObject'.

#

Trying to explicitly convert this, I get: 'Climber' is a type, which is not valid in the given context

jolly oriole
#

then try

GameObject climberGO = Instantiate(GameObject.FindObjectsOfType<Climber>()[0].gameObject);

i forgot the .gameObject

nocturne meteor
#

Insane. Haha, that seems to work. I cannot believe I forgot to do that.

#

Alright, cool, gettin' closer, just gonna debug later and see what's the goin's on. Thank you!

sacred echo
#

Hi everyone, i wanna make custom hk modes but i don' t know where to start. Any advice?

#

btw, i know how to code, but have never tried modding

jolly oriole
sacred echo
#

thx a lot

mystic umbra
#

I finished up programming my first mod, is it alright if I post some findings I had about the code/the intro docs?

nocturne meteor
#

Go for it.

Also, I question re: mods here and the etiquette of asking people about their mods. The work + field I'm in, there's a strong emphasis on open source contributions and making source open unless there's a strong reason to not. Is it bad form to ask people if their code is on github/whatever? I don't want to offend anyone or whatever, I just am not sure how people feel about it here. [Nothing happened, btw, I wanted to make sure for the future.]

copper nacelle
#

no

#

people regularly do that

nocturne meteor
#

Okay, sweet. The context here is that I was in another community a while back for modding which that wasn't looked on fondly [for whatever reason] and I just thought about that noise when I was about to ask someone if their work was on github. Thanks.

#

Okay, to make my stuff dev related now. I've got this short snippet: https://github.com/jsal13/TikTikTikTik/blob/main/main.cs and the gist is I'm just trying to do a dumb toy mod to make all enemies into Climbers. When I run this, it seems to successfully destroy the enemies, but it does not seem to Instantiate the Climber Game Object --- there are just no enemies.

#

Anyone see anything obvious or dumb that I'm doing here?

#
[INFO]:Okay, this is a Fly 2, destroying...
[INFO]:(11.0, 38.8, -4.0), (0.0, 0.0, 0.0, 1.0), (1.0, 1.0, 1.0)

Here's some sample output, so it looks like the transstuff is being saved after being destroyed.

copper nacelle
#

this isn't going to work in any scene which doesn't have a climber

nocturne meteor
#

Yeah, I need to figure out how to get a general climber game object, but for now I just try it in the first two rooms of crossroads.

copper nacelle
#

use normal position not localPosition

#

and set your newGO active

#

it'll keep the active state of your climber, which is false

#

so you need to set it true explicitly

nocturne meteor
#

Ahh! Okay, let me try that.

#

Is there a reason to not use localposition? Is that relative to the scene and position is relative to the world or something?

copper nacelle
#

i think it's relative to the parent but idr

nocturne meteor
#

Alright, cool. I'm goin' through unity lesson stuff now so I'll [hopefully] have fewer basic questions in the future. grubsad

jolly jungle
jolly jungle
#

Hopefully that can help you

nocturne meteor
#

Oh, man, this is awesome.

jolly jungle
#

Yayy :D

nocturne meteor
#

How do I find the "full name" of a GameObject? I get the scenes, but they're usually called like, "Crawler 1" or "Crawler 6" or whateva.

leaden hedge
#

it is relative to the parent

#

but if you have no parent its relative to the scene

jolly jungle
#

I think they can be found in the scene dumps? I'm not sure

languid goblet
#

i think there's a list of scenes in pins

#

yeah

#

like you'd probably look in one of the crossroads scenes and then ctrl f for crawler

nocturne meteor
#

Ahh, okay, thanks Katie. Okay, so I should use the non-local versions of the transform stuff? And okay, lemme look at the scene dumpz.

leaden hedge
#

they both set the same variable

#

.transform just does whatever you did - parent.transform

nocturne meteor
#

Oh, I meant .transform.localPosition vs .transform.position.

leaden hedge
#

its apparently significantly faster

jolly jungle
#

Also their names usually appear in other places, like the fsmviewer and the sprite extractor (I think that's what it was?)

leaden hedge
#

use localPosition does the same as .position unless you have a parent

jolly jungle
#

They usually go by the same names I think

leaden hedge
#

except position has to recalculate more stuff

nocturne meteor
#

Ahhhh, okay, I understand now.

#

Okay, so in here it's like, _Enemies\Climber 1, which I'm guessing is the full name. :'']

leaden hedge
#

is there not a thing for preloading

#

that you just give a scene and gameobject name too and it gives you a reference

nocturne meteor
#

Is it what Godfriend linked above in the radiance api? I'm trying that out now.

leaden hedge
#

yeah

nocturne meteor
#

[WARN]:[API] - Could not find object "_Enemies\Climber 1" in scene "Crossroads_03"" oh no! Maybe it's just called Climber 1.

#

Okay, nm, copying the command from the rando mod. It's like, (SceneNames.Tutorial_01, "_Enemies/Crawler 1"), for anyone's future reference.

jolly jungle
#

Ah, thanks

#

I hadn't yet actually used this, I looked into it before I realised all the things I need are in the same scene I'm using

nocturne meteor
#

I am getting a legit climber object: Climber 1(Clone) so that works great!

jolly jungle
#

Ooh, it works?

nocturne meteor
#

The preloader thing does! Haha, but not the whole thing.

jolly jungle
#

Wait no you sent them at the same time so the second one isn't a progress update palehmm

#

Oh I see

#

So what's the part that isn't working right now?

nocturne meteor
#

I'm tryin' to see if it's maybe like a weird reference problem or something, idk.

[ERROR]:[UNITY] - UnityEngine.Object.Instantiate[GameObject] (UnityEngine.GameObject original)
[ERROR]:[UNITY] - TikTikTikTik.TikTikTikTik.SceneLoadedHandler (Scene scene, LoadSceneMode _mode)
[ERROR]:[UNITY] - UnityEngine.SceneManagement.SceneManager.Internal_SceneLoaded (Scene scene, LoadSceneMode mode)```

I'm getting this error, so it's making me think that it's "using up" the preloaded object or something when I instantiate it once?  I'm not really sure, but I'm trying to maybe pull it explicitly from the dict each time instead of making a single ref to it.
jolly jungle
#

Hm, this looks similar to something I had when I tried to spawn in hive knight spears

#

But I think I was just approaching the instantiation the wrong way

#

I took a step or two back and tried again, I think

nocturne meteor
#

Yeah, I prob just have to think of how I'm doing it. I'm tryin' out a few things, maybe something will work nicely. :']

jolly jungle
#

Hopefully

nocturne meteor
#

Okay, I'm unsure which worked, but Object.DontDestroyOnLoad(newGO); and newGO.SetActive(true) worked!

languid goblet
#

were the tiktiks not moving?

nocturne meteor
#

they weren't showing up at all.

languid goblet
#

oh huh

#

do they move for you?

nocturne meteor
#

"yes", sort of. they usually move in a little circle in the air.

#

which i kind of expected.

languid goblet
#

ah

nocturne meteor
#

haha yeah, who knows. hoo knows. But it's good enough for what I needed it for, which was: practice. :'']

leaden hedge
#

yes thats the behaviour if they aren't on a collision box

nocturne meteor
#

yeah, it makes sense since they're little climber bois.

leaden hedge
#

if the green arrow doesn't hit ground it rotates 90 degrees

#

iirc

nocturne meteor
#

haha, this is the best picture of a climber. :''']

#

yeah i can mess around with it a bit, but im glad i could replace things at least.

languid goblet
#

i asked bc the last time i tried preloading (by spawning primal aspids everytime you swing your nail), they would appear but not move at all

jolly jungle
#

Hey, I was thinking
About reskinning enemies/bosses
We can technically reskin anything else, too, no?

leaden hedge
#

transtrans

#

yeah if stuff doesn't move its because its code isn't active

#

you need to activate the fsm/monobehaviour

jolly jungle
languid goblet
#

i did setActive(true) though
is the fsm separate from that?

jolly oriole
#

the fsm does have its own active flag, tho in the case of enemies it's more likely that the fsm "softlocked" and you need to set the state to some kind of init state

leaden hedge
#

it'll be copied in whatever state it was in

#

and that includes ai distance stuff iirc

languid goblet
#

oh ok
guess i’ll look into fsm stuff sometime

leaden hedge
#

it probably includes a "start state" variable

#

you can check to send it to the start state

languid goblet
#

is avalonia fsm viewer out?

leaden hedge
#

infact i think you don't even need to look it up

#

just turn it off and on, with the actual fsm enabled variable

#

and it'll go back to init

jolly oriole
#

well, i can say that some stuff i worked with (although almost all of it was monobehaviours, but i think an fsm was also among those), things on the behaviours would already start executing in the middle of my function where i copy that

languid goblet
leaden hedge
#

yes when it gets activated, it goes to its start state

languid goblet
#

alr, will try it out

leaden hedge
#

i guess when its instantiated it isn't enabled

#

so it just keeps where it was

jolly jungle
mystic umbra
#

Super long feedback message coming in hot

#

Alright, here is all the stuff I noticed when making my mod. First the bugs:
-In the documentation and charm helper it says when making settings that just instantiating the lists in the class outside of the constructor is fine, this actually causes a bug with the json deserializer that the game uses. Whatever deserializer the game uses will deserialize the json and put it into the settings class, however, when the deserializer creates a new instance of the settings class the lists get filled with the defaults and then the deserializer will just append all the data from the save file to the end of the lists. This makes the lists gain one new default var in each list whenever the save is loaded. I was able to get around this by declaring the lists as normal, initializing them with empty lists in the constructor, and then in the NewGameHook I fill out the lists with my default data. This makes it so the deserializer only creates empty lists and the default data still makes it in at the start of the game.

  • @jolly oriole I found a bug in the charm helper where if the player loads the save multiple times within one instance of Hollow Knight then the charms break and get unequipped. I looked into it on your Github and it looks like in OnCharmIconListStart charmIDs will get the custom charms added every time the save is loaded and the list is never emptied so the custom charms keep getting added to the list. I was able to fix this in my code by just clearing out the charmIDs in AfterSaveGameLoadHook. You'll probably want to do something similar in there or in OnCharmIconListStart.
#

Now onto the general feedback:
-The documentation mentions SFcore several times, but it never tells the user where to get it. Putting in a short blurb about where the github is or to grab it from the ModInstaller would be nice.
-The charm helper example and documentation are out of date a bit. The Mod<TSaveSettings, TGlobalSettings is deprecated, but both still use it in a few places which makes it slightly confusing for new users. There is also a section in the charm helper example that sets Settings to Settings when the save file is loaded which was super confusing and probably did something when Mod<TSaveSettings, TGlobalSettings> was a thing, but doesn't do anything right now.
-I was thinking about it and I think that all the get and set code for the charm data could probably just be moved into the charm helper. It's just a lot of extra boiler plate code that doesn't seem necessary for the user to write every time they want to make a new charm. I just don't see a world where a mod would do something funky and modify the charm notch cost of a charm dynamically and if a user wanted to then they could just make a child class of the charm helper and override it or just do it in their code without overriding. This feedback might need some more discussion from other people here, but I think it could work.

That's everything I can think of right now, let me know if you guys need any clarification on any of this.

jolly jungle
#

Woo, this is gonna be great to read

#

Thanks :D

mystic umbra
#

No problem

jolly jungle
#

Zal- zotewheeze

mystic umbra
#

The feedback was actually so long I needed to split it into two messages and I almost made it into three

jolly jungle
#

Hm, better three and overword than two and not enough

#

Anyhow, this is way too technical for me although I do understand around half to two third of it nice work, summarising your findings

mystic umbra
#

I was actually sitting on this for like two days because I was worried about insulting people with the info. I'm a programmer in my normal day to day which is why it's more on the technical side

nocturne meteor
#

Yeah, I feel ya. I haven't done much of the charm stuff, and I'm just learning about C# stuff (from Python baybeeessss) but I think this was mostly the work of one or two people and so it's impressive but it's also nice to peer-review the docs, etc.

mystic umbra
#

Yeah, this modding api and documentation is very impressive. I know I couldn't have done this without the api

#

I tried once on a different game and programming in assembly makes me sad

nocturne meteor
#

100%, this is leagues better than most of the docs I've seen for other games I've tried to mod. :'] But it still can be improved and PR'd into etc.

jolly oriole
# mystic umbra Now onto the general feedback: -The documentation mentions SFcore several times,...

The documentation mentions SFcore several times, but it never tells the user where to get it. Putting in a short blurb about where the github is or to grab it from the ModInstaller would be nice.
https://radiance.host/apidocs/SFCore.html#add-a-reference

Add a reference
    After downloading SFCore from the ModInstaller, open your project and right-click References and click on Add Reference

though next time i update that i'll probably make that more obvious

The charm helper example and documentation are out of date a bit. The Mod<TSaveSettings, TGlobalSettings is deprecated, but both still use it in a few places which makes it slightly confusing for new users. There is also a section in the charm helper example that sets Settings to Settings when the save file is loaded which was super confusing and probably did something when Mod<TSaveSettings, TGlobalSettings> was a thing, but doesn't do anything right now.
personally i continue to use Mod<TSaveSettings, TGlobalSettings> as it makes accessing save and global settings easier

I was thinking about it and I think that all the get and set code for the charm data could probably just be moved into the charm helper. It's just a lot of extra boiler plate code that doesn't seem necessary for the user to write every time they want to make a new charm. I just don't see a world where a mod would do something funky and modify the charm notch cost of a charm dynamically and if a user wanted to then they could just make a child class of the charm helper and override it or just do it in their code without overriding. This feedback might need some more discussion from other people here, but I think it could work.
somehow didn't think about that 🤔 , although "modify the charm notch cost of a charm" is the main part of charm balancing mods, like charm overhaul

leaden hedge
#

and yes transtrans is the reskin anything thing

jolly oriole
leaden hedge
#

it reskins a tiktik to a transtrans

#

so it has the code for reskining other things too

jolly jungle
#

Hm

leaden hedge
jolly jungle
#

So suppose I want to reskin some random object - a cart in the Crossroads, for example - how do I find what's the name of the sheet that needs to be replaced?

leaden hedge
#

dont really need to find it

jolly jungle
#

Also stop sabotaging my ability to type by making me melt from the cuteness of that creature

leaden hedge
#

find the object, find its tk2dsprite/sprite renderer

#

find its texture and dump it

jolly jungle
#

Oh, I see

#

So I find it through the object itself

leaden hedge
#

if you use godump

jolly jungle
#

Are the files in the HK Sprites drive already dumped like this?

leaden hedge
#

it'll be named

#

and you can just ctrl+f for object name

jolly jungle
#

Hm, this seems kind-of-maybe-complicated

#

I'll need to see it when I actually do it

#

Thanks

leaden hedge
#

its like a few minutes with godump

#

and most of it is afk

jolly jungle
#

Is this the way Customknight works or does that have a different way of doing it?

leaden hedge
#

customknight works the same way yes

#

it just replaces the texture on the knight

jolly jungle
#

So I can use this to have a mod, in addition to whatever else, reskin the knight, without using customknight

#

Lovely

#

Will they clash if they're enabled together?

leaden hedge
#

one of them will replace the knights texture

jolly jungle
#

And the other?

jolly oriole
#

won't

carmine mauve
#

hi , do you guys think they'll use vulkan for the linux port of silksong instead of opengl ?

leaden hedge
#

it will use the default settings for unity projects being exported

jolly oriole
#

@copper nacelle quote from <#archived-modding-development message>:

Whatever deserializer the game uses will deserialize the json and put it into the settings class, however, when the deserializer creates a new instance of the settings class the lists get filled with the defaults and then the deserializer will just append all the data from the save file to the end of the lists.
you probably know more about json.net than i do, but from what i looked at the code for loading save settings shouldn't append contents to existing savesettings

#
this.Settings = JsonConvert.Deseri...

at least i hope so

copper nacelle
#

yeah it really shouldn't append

#

That's a new instance

jolly oriole
#

but i tested it, and it for some reason does append

copper nacelle
jolly oriole
#

though the "only" things that are affected are enumerables

#

afaik

#

only tested now: lists are affected, arrays arent, dictionaries probably also arent

prime urchin
#

might have something to do with the default value handling setting?

#

er

carmine mauve
prime urchin
#

object creation handling

leaden hedge
#

i mean you can set it in your project settings

#

tc will just use whatever is default

carmine mauve
#

will it matter if i send them this suggestion via email ?

#

i really want silksong to use vulkan instead of opengl

leaden hedge
#

your best bet is to probably bother graig

carmine mauve
#

i doubt he's the one testing for linux

#

but i'll try

jolly oriole
copper nacelle
#

object creation handling - replace

#

apparently

jolly oriole
#

well, ig i'll just use arrays instead of lists

copper nacelle
#

why

#

terrible words

jolly oriole
#

make me not use arrays

prime urchin
#

might be able to do an OnDeserializing attribute and overwrite the list with a new one there?

ornate rivet
#

mods pls remove

#

thanks

plush frigate
#

dw ill remove the server

jolly oriole
#

pog

ornate rivet
#

shroompog delete main

jolly oriole
#

I was thinking about it and I think that all the get and set code for the charm data could probably just be moved into the charm helper. It's just a lot of extra boiler plate code that doesn't seem necessary for the user to write every time they want to make a new charm.
@mystic umbra looked at this, but i would have to let the helper put its values into a save hook, which i don't feel like doing

worn eagle
#

I probably shouldn't be offering this at its current state but I want to know how this works on other people's computers who don't have Qt installed

#

Windows only

prime urchin
#

Seems to work fine for me

worn eagle
#

oh god this thing is 161 MB

#

nvm a bunch of it is cmake stuff

mystic umbra
# jolly oriole > The documentation mentions SFcore several times, but it never tells the user w...

The documentation mentions SFcore several times, but it never tells the user where to get it. Putting in a short blurb about where the github is or to grab it from the ModInstaller would be nice.
Turns out you're right and I can't read. Linking to the github to install would be nice as opposed to having to look it up in the discord

personally i continue to use Mod<TSaveSettings, TGlobalSettings> as it makes accessing save and global settings easier
While it's fine for you to still use this way if this is meant to teach new users on how to mod we should be using the up to date, current, and non-redacted methods for teaching people.

somehow didn't think about that 🤔 , although "modify the charm notch cost of a charm" is the main part of charm balancing mods, like charm overhaul
For this I'm talking about changing the charm notch costs dynamically based on the game state instead of keeping the cost of the charm the same throughout the entire run of the game. You would still be able to change charm costs at game start up to what you want, but changing it in the middle of the game would be harder without making a child class of CharmHelper

mystic umbra
nocturne meteor
#

For this stuff, just so that SF doesn't have to do a whole lot of extra work themselves, do you accept PRs into it, SF? I don't have anything off the top of my head, but it might make updating / etc. less stressful if you have a community behind ya.

mystic umbra
#

Or whatever it's called for changing your code. I don't use Github enough to remember

nocturne meteor
#

Haha, I was just about to ask that, W^2.

#

I had docs for one thing and every time people asked me to change it I'd just slog around and never do it, and then I started having people PR into it and I don't even have to do anything on it anymore. :']

mystic umbra
mystic umbra
#

That's actually kind of a lie, I just remembered that every year when I do the GGJ I use Github for it

nocturne meteor
#

Documentation is a great thing to PR into open source stuff because it's pretty easy, it helps everyone out, and it forces you to have good habits re: docs on other things. :'] But it's up to the maintainer usually. Sometimes they'd rather not deal with having to parse through a lot of PRs. And that's okay too.

jolly oriole
#

yeah PRs are fine

#

@copper nacelle i could PR it in like 8 hours if you don't want to do it
https://stackoverflow.com/a/29113182

var settings = new JsonSerializerSettings
{
    ObjectCreationHandling = ObjectCreationHandling.Replace
};
copper nacelle
jolly oriole
#

as if i know what you write

copper nacelle
#

this is so sad

jolly oriole
#

but ig imma pr it later, so i can also include language stuff

jolly jungle
#

What's all this PR mean?

jolly oriole
#

pull request, essentially you fork a repo from somebody else, make changes, and ask them if they pull your changes into their repo

deep wave
#

looking through a vanilla output log: is there any way this should be an error that exists?

NullReferenceException: Object reference not set to an instance of an object
  at iTween.RetrieveArgs () [0x00000] in <filename unknown>:0 
  at iTween.Awake () [0x00000] in <filename unknown>:0 
UnityEngine.GameObject:SetActive(Boolean)
Benchwarp.BenchMaker:MakeBench()
Benchwarp.BenchMaker:TryToDeploy(Scene, Scene)
UnityEngine.SceneManagement.SceneManager:Internal_ActiveSceneChanged(Scene, Scene)
UnityEngine.SceneManagement.SceneManager:UnloadSceneNameIndexInternal(String, Int32, Boolean, Boolean&)
UnityEngine.SceneManagement.SceneManager:UnloadScene(String)
<BeginSceneTransitionRoutine>c__AnonStorey13:<>m__2()
<BeginRoutine>c__Iterator0:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)```
nocturne meteor
deep wave
#

(unless Benchwarp is just a namespace in TC code and im just pepega)

jolly oriole
#

itween apparently doesn't like it when stuff is instantiated, but i'd have to look at the code for itween to know what's causing a nullreference

deep wave
#

im more concerned about the fact that Benchwarp is appearing when this output log was from me playing on vanilla (replacing assembly-csharp to uninstall API)

jolly oriole
#

that sounds like you have 2 game installs, and used one with the modding api installed

#

otherwise benchwarp should never be loaded

deep wave
#

the last time i ran HK, i ran it on vanilla. I have one install which i switch assembly-csharp between modded and vanilla

#

or... not? apparently i launched it on modded last night

#

vesselsip don't mind me

oak idol
#

how do i mod

jolly oriole
hazy aspen
#

A lot of things can be analyzed from a Hollow Knight save file just for statistics fun. 🙂 Here I'm playing with a function of counting Unbroken/Broken/Total discovered Geo Rocks in the game, as well as providing a list of the locations of all Unbroken ones (not yet available in release version of the tool)

jolly oriole
#

for the location: maybe instead of the scene name, map each scene name to a descriptive location, like Crossroads entrance, under the well, ...
but that would take a big chunk of time

#

maybe change the text next to Bosses to either 14/14 or 100%

deep wave
#

i have a dictionary for translating scene names actually

#

rando also has geo rock names in rocks.xml i believe

hazy aspen
#

Wow, this is really helpful! Thanks very much for the advices, info and dictionary 🙂 In an ideal world, where financial support for such tool development actually exists, I have a wish to maybe show all these locations directly on a map (like using pixel or % XY coordinates), that would be awesome, and I would learn new things, but unfortunately extremely time-consuming, and at this point this idea remains rather in the dream world and is a total curiosity

leaden hedge
#

you could automatically parse that information, if you have a map

deep wave
#

I've been thinking about adapting modinstaller for some time now, especially for use with other patches/speedrunning, as well as handling multiple versions of the same mod. i guess my main question is: does this seem better than current modinstaller?

jolly oriole
#

tbh looks cluttered at first glance, at second glance ig downloading mods is done in the download mods sub menu?

deep wave
#

yeah, i felt it made more sense in terms of how i use it at least

jolly oriole
#

otherwise it looks nice

deep wave
#

this is just a mockup, my main gripe was with being able to enable mods without enabling their dependencies and the lack of ability to have presets, as i frequently switch between speedrun practice/randomizer/custom levels

worn eagle
#

is this wpf?

deep wave
#

yeah, just using the same as modinstaller... unless all of these are specific to .net 4 and im acidentally using that feelspkman

worn eagle
#

windows only 😔

potent dirge
#

I like it. I could give smol feedback on word choices, but composition is clearly understandable imo

proven cipher
#

It looks at least as intuitive as the current mod installer

deep wave
#

cerpin feedback nicePleading

proven cipher
#

Which is a start

#

I would use this

jolly oriole
proven cipher
#

If it looked like this and functioned I would use it

deep wave
#

it will take me at current rate of me doing things about.... an undefined period of time to get this working feelspkman

#

yeah SF i was planning on just copying over most of modinstaller code, i noticed that

jolly oriole
#

poggers

potent dirge
#

What's "install nickname"?
Change -> Select below that?
Launch (game?) to bottom left or top left, left aligned?
Preset -> profile?

deep wave
#

install nickname = nickname given to that specific install (i couldn't think of a better wording)

jolly oriole
#

"Current Installation: {}" ?

deep wave
#

also another thing: is it good or bad idea to have the right side collapse when vanilla is selected

potent dirge
#

Bad

jolly oriole
#

just grey it out, if possible

potent dirge
#

Maybe have as an option

leaden hedge
#

why would you make it say please buy the game

potent dirge
#

I know I'd check stuff like mods available when unmodded as well

leaden hedge
#

you need to make that error message cryptic af

#

so people incriminate themselves more

jolly oriole
#

good point

potent dirge
#

Also why tell me to buy the game just bc I downpatched xephHands

deep wave
leaden hedge
#

it wont on pc

#

it'll try to run it through steam, which should work

deep wave
#

but then again, funni

leaden hedge
#

and by pc i mean windows

#

also much better solution

#

is to require a steam oauth

#

that just checks if they own it

deep wave
#

gog exists

leaden hedge
#

what

deep wave
#

people use gog to buy hollow knight

leaden hedge
#

i dont speak polish

#

sorry

deep wave
leaden hedge
#

i believe gog also has oauth

deep wave
#

eventually i suppose i'll work on that, but unfortunately my brain very small currently

jolly oriole
potent dirge
#

What if you're not using gog galaxy

leaden hedge
#

then you use steam oauth

potent dirge
#

Drm free games needing drm

deep wave
#

gog is drm free, which presents an issue for us, attempting to do drm tamershrug

leaden hedge
#

the game is drm free

#

doesn't mean you get access to forums or support for free too

deep wave
#

yeah i agree with that

#

issue is if you launch HK without gog galaxy, does gog do an oauth check?

leaden hedge
#

nope

#

you can just take the folder put it on a usb stick

#

and run it on a computer thats never connected to the internet

deep wave
#

so oauth checking only works if you have a steam install

jolly oriole
#

it can add achievements to an account tho

leaden hedge
#

no it works for gog, or should

#

gog has oauth

potent dirge
#

It doesn't do achievements if you only launch the exe from gog

deep wave
#

does gog galaxy need to be installed for hk to run?

#

im guessing no

leaden hedge
#

no

#

you don't need it for oauth either

deep wave
#

oh that makes more sense

leaden hedge
#

you literally just load a webpage, they login, you can check what games they own

jolly oriole
#

the only option halfway left is the downloadable version directly from humblebundle (only half because you also get a steam key in the same purchase)

potent dirge
#

I'd expect humblebundle to have oauth support too

jolly oriole
#

but thanks to the steam key that can wait

deep wave
#

basically if the popular torrents are of the humblebundle drm version then this doesnt work?

#

also is there an easy way to check which version of hk is installed

jolly oriole
#

still works, as the game doesn't have any account information attached to itself

jolly oriole
deep wave
#

im guessing modinstaller currently assumes that the game you're installing it onto is vanilla?

leaden hedge
#

what

#

you ask them to sign into their account

#

and you then check their account details to see if they own it

jolly oriole
leaden hedge
#

like once you have an oauth gog token, you can request /user/data/games/

#

and it returns a list of owned games

deep wave
#

ok that makes sense

unborn flicker
#

Tired: whatever that idea was
Wired: use reflection on the assembly to check if the version is 1424, and then delete system32

deep wave
#

ok now that is truly beautiful

#

do i feel bad if i delete all their save games and the install as well?

leaden hedge
#

i dont think loading unity dlls externally work well

unborn flicker
#

Yeah, that might be an issue

deep wave
#

simply load every dll for unity individually, then assembly csharp feelspkman

jolly oriole
deep wave
#

i'd assume logic flys half out of the window when looking at decompiled TC code

leaden hedge
#

why is it in savegame?

jolly oriole
#

probably a const that gets optimized

leaden hedge
#

when it saves after an update it makes a backup iirc

jolly oriole
#

Constants.GAME_VERSION contains the game version (who would've thought)

potent dirge
#

I can tell you for sure its not in the assembly version field bc that would've made sense ax2uHappy

jolly oriole
#

the version of Hollow Knight.exe is the unity version that was used to compile the game, so technically that could also be used

leaden hedge
#

if you want real 🧠

#

write whatever you want in it

deep wave
#

permanently mark their install as pirated? very blessed

leaden hedge
#

if you want to permanent mark on their file

#

add a registry

deep wave
#

i was thinking of that, but what if they actually.... go buy the game

leaden hedge
#

once a freeloader always a freeloader FeelsOkayMan

deep wave
#

so my idea ig is:
On first run, check for a registry key: if nonexistent, make key and ask to log in. If works, set key to true
(also make this key super obscure named and inside the TC root because why not)
if false, set key to false, and pretend to throw weird unsolvable error

leaden hedge
#

just make it say something like "error unknown: please post error code 3T4R1P in modding help"

jolly oriole
#

or just "Error Code {insert something hexadecimal}"

#

oh wow, didn't notice it said that

deep wave
#

can even include a handy link 🙂

vocal spire
deep wave
#

take random number, encode into base64, make that the error code

leaden hedge
#

if you want to make a bunch of pirate themed easter eggs sure

#

3T4R1P | P1R4T3

jolly oriole
#

base64: cGlyYXRl

leaden hedge
#

kopiihou

#

ihoukopi is jp for illegal copy

safe hamlet
#

weeb ass mf

leaden hedge
#

smd

#

you're uninvited from modding dev sid

#

go back to the trashcan

safe hamlet
#

dcolonw

worn eagle
#

oh I didn't think discord would handle 68 MB w/o nitro

jolly oriole
#

because the server is boosted, everyone here has 100 MB upload limit

#

which is why Pale court still can't be leaked lmao

deep wave
#

incorporating a few changes: i was also wondering if a TabControl would be more intuitive to switch between managing installed mods & installing new mods, and would also offer a neat and tidy place for a settings menu

leaden hedge
#

is randomizer/practice/custom levels the presets?

deep wave
#

yeah those are just some example presets i made

copper nacelle
#

winforms x5fiftAleph

leaden hedge
#

move download mods and check for updates out of its column

#

and make load/save take up half the column

deep wave
#

makes sense - if i do the tabcontrol thing then i can remove Download Mods button entirely widepeepoHappy4

leaden hedge
#

infact get rid of check for updates

#

and just do it on open

deep wave
#

i actually did this specifically because doing it on open is one of my least favourite things about modinstaller

leaden hedge
#

i mean just do it automatically

#

if there is an update

deep wave
#

because i have lots of mods that i keep specific versions of (like rando), it takes an age to actually open installer because i need to click through 20 boxes first

leaden hedge
#

put some text at the bottom that says out of date

deep wave
#

i'll just do it async feelspkman

#

(not seriously)

leaden hedge
#

i mean what does it even do

#

check of mod updates or installer updates

deep wave
#

mod updates

leaden hedge
#

you don't need a button for that

#

just put a thing next to each mod

#

that says it out of date, that you can click to update if you want

deep wave
#

that makes good sense

leaden hedge
#

or recolour it

#

and let you right click to update

#

and what do half the buttons on the left do, i assume vanilla/modded swaps the assembly-csharp.dll
does switch installs just do select path, but automatically
and what does select patch do

#

i'd probably have a list like you have for presets

#

but one for each install/patch you have

deep wave
leaden hedge
#

in seperate "window"

#

you select your install patch, then it changes view to mods/patches just for that install

copper nacelle
#

it does it on open because users suck is the thing you're missing

#

otherwise they'll just not update

leaden hedge
#

thats fixable too

#

just have a rightclick -> dont automatically update this mod

deep wave
#

had to redo all scaling because i forgot to open VS in 100% scaling 🥴

#

(left side still needs changing i realise)

#

the load and save preset buttons do feel very large atm

leaden hedge
#

load and save should be on the same row

deep wave
leaden hedge
#

yeah

deep wave
#

now there is copius space for every set of mods you could ever want

nocturne meteor
#

Just saw this, so I'll give some initial impressions (you don't have to answer my questions, they're just what a new user might see and ask.

  1. What do the "Vanilla" and "Modded" buttons do? I'm scared to click them, I don't wanna mess up my game.
  2. Switch installs? I am but a simple hollow knight user, what does this mean?
  3. Okay, select path... and select patch... must be similar, they're on the same line. What are they and why do I need them?
  4. Middle boxes seem fine, makes sense to me.
  5. What is this upper box? Is this possible mods I can have? Or is this the kinds of games I can do?
#

(There might be context before this, or instructions --- this is just blindly looking at it.)

#

Having said that, I like the way it looks in general. Looks really professional 'n legit looking.

deep wave
#

left side is to be completely changed immediately feelspkman

nocturne meteor
#

Haha, I'm just thinking about, you know, hanging out in Modding-Help and seeing the kinds of questions we get in there --- and trying to prevent everyone from asking the same questions over and over.

deep wave
#

other questions i may have: Should i use the space on right side when moddingapi is not enabled for an install just to say "hey you don't have moddingapi on so you won't be able to do anything", then move the "Vanilla" button to the right side as well?
Do I treat 1 install of the game in vanilla and modded as separate installs, and display them separately to the user?

#

im just assuming im completely stupid here and not going to make any final decisions until somebody's said they look good/feel intuitive feelspkman

languid goblet
#

suggestion about the layout: maybe you could move the installs over to the right side, bc they're also kind of like presets in their own way
the only issue is that it might make it a bit cramped

leaden hedge
#

i would allow the presets even without modding api, disable save

#

and pressing load should give a warning that it will install modding api

deep wave
#

katie i'd like to keep the ability to launch into the game as vanilla

leaden hedge
#

i mean if you load a modded preset

deep wave
#

and not have to click through an additional message box to confirm that feelspkman

leaden hedge
#

it should just install modding api

languid goblet
#

you could steal borrow from celeste's mod installer and have two buttons to launch vanilla or launch modded on an installation

deep wave
#

I'd like to keep mod management and api management totally separate ideally; merging api ver into the presets box feels like its separating too far from what's actually going on

#

(i've never seen celeste mod installer, should i?)

leaden hedge
#

theres no reason to disable the presets on a vanilla install, using them should just set install to whatever the preset is

#

im not saying have the presets be the api version

#

just if you make a preset with api ver x installed and randomizer

#

you should be able to click it to install the api and randomizer

languid goblet
deep wave
#

So what if I treat the left side like a set of "Profiles", each relating to an install of HK that is either modded or unmodded. Switching between a modded and unmodded profile on the same path just replaces the assembly of that install to be modded/unmodded respectively. So for example, if I add a game install at C:/HollowKnight, I get 2 profiles: C:/HollowKnight Modded and C:/HollowKnight Unmodded. these profiles can then be renamed, deleted, whatever.

languid goblet
#

i mean, you could just have two buttons to launch that install as modded or as vanilla right?

leaden hedge
#

you can

deep wave
#

ignore 10/10 ms paint skills

nocturne meteor
#

what is the patch part? i legit dont know that one.

#

okay, so this kind'a looks like the minecraft thing, which i think is good ui/ux.

leaden hedge
#

its like .002seconds to swap modded -> vanilla

#

you should just have a vanilla.dll and modded.dll in each folder

deep wave
#

exactly, which is what i was planning on doing

leaden hedge
#

and just have a button to launch one of the 2

#

instead of having a vanilla/modded version

deep wave
#

i was planning on doing it on selecting the profile

leaden hedge
#

just have 1.4.3.2 / 1.2.2.1

#

and get rid of modded and just have a button to launch it modded or vanilla

nocturne meteor
#

^^ I like that.

deep wave
#

ok now i get it feelspkman

#

yeah that makes more sense

nocturne meteor
#

It's building for the --- uh --- lowest common denominator user. :']

leaden hedge
#

although same row again

deep wave
#

1.4.3.3 remains shroompog

nocturne meteor
#

Honestly, these MS Paint skills are the most impressive part of this.

languid goblet
#

1.4.3.3 cracked zotewheeze

leaden hedge
#

although i'd have that left side on the window before

#

and just have a button to go back if you want to select a different install

deep wave
#

generally i feel like keeping it all in one window makes it feel a bit less fragmented: at least with livesplit and the like I hate having to traverse 20 different windows to change stuff (though at least livesplit has good separation of concepts)

leaden hedge
#

i mean its probably just less cluttered and same for average use case

#

99.9999% of users wont be managing multiple installs at once before loading

#

they will load installer, select their patch, do their mods click launch

deep wave
#

yeah but i'm the 0.0001% feelspkman

#

i feel like having to navigate to a separate window to launch the game after you're done configing mods is a bit clunky

languid goblet
#

couldn't you autodetect patch when you select an install

leaden hedge
#

no

#

launch would be on config mods screen

deep wave
#

but then what if i don't want to change anything about my mods, and just want to launch the game?

#

i then still have to go into a separate window with nothing i really want on it apart from the launch button

leaden hedge
#

i mean if you don't want to change anything

#

you'd just run it from the exe probably

deep wave
#

my intention is to use this as a kind of launcher, similar to minecraft ig

leaden hedge
#

isnt minecraft the same way

deep wave
#

minecraft doesn't let you manage mods, you have to drag them into the install folder iirc

nocturne meteor
#

There's a forge thing that's an alternate UI thing, I feel it's a bit clunky but it gets the job done.

leaden hedge
nocturne meteor
#

I don't think there's official mod support but I could be wrong?

#

Is that one layer?

leaden hedge
#

for run, run vanilla, open folder, config

deep wave
#

there isn't official mod support for even datapacks, which is what they've been pushing instead of forge/fabric mods

leaden hedge
#

config would open the mod and preset stuff

nocturne meteor
#

Oh, symbols, got it.

leaden hedge
#

hell if you want to be fancy

#

once you have that screen, you could have a dropdown of your presets

#

i would probably have your patch selector like minecraft yeah

deep wave
leaden hedge
deep wave
#

its been so long since i used mc launcher PepeHands

leaden hedge
#

although i guess you could also have the name and game directory in there too

nocturne meteor
#

I like a really simple style, so this is what I mocked up, but it excludes presets (i'm not sure how popular these are or what they are in general) and managing multiple installs of the same kind.

#

Oh, prob should just do a screenshot.

leaden hedge
#

nice radial group

nocturne meteor
#

Radical, brahs.

leaden hedge
nocturne meteor
#

Thanks, but I know this doesn't have all the functionality that Jamie's does.

deep wave
#

mine has functionality?

nocturne meteor
#

Okay, LOOK.

deep wave
#

im just dragging and dropping stuff in windows forms

nocturne meteor
#

Actually, that's weird, it doesn't select both on my firefox. Huh. Haha.

#

No, I mean, like --- it doesn't have all the features, I guess I meant.

worn eagle
#

I believe in Qt supremacy

leaden hedge
#

any electron

deep wave
#

of course this installer will also support changing your background to be a waifu, as any good application does feelspkman

nocturne meteor
#

Like, I'm excluding presets on purpose. I think they take up a lot of space for, what I imagine, is a slim number of people, and which takes a v short amount of time to do oneself. But obv if I included presets, things look more complicated.

#

I couldn't think of a way to do it nice.

#

(I might be wrong here re: presets. I'm one person, idk what people want.)

deep wave
#

ok so this was my "final" draft of the left/right version, im not massively sure what issues there are with this?

nocturne meteor
#

Yo, that looks great.

languid goblet
#

maybe make it symmetrical

nocturne meteor
#

Make it less symmetrical.

languid goblet
#

like, the right side looks squahsed compared to the left side
otherwise looks good

nocturne meteor
#

I actually kind'a like it like this, but it's not obvious to me what the right-hand side would be, so maybe a "Presets" title. That's all I can think of.

languid goblet
#

actually yeah it's fine

deep wave
#

issue with symmetry is that there's a large amount of whitespace left in the profiles box, since i can't shrink right side any more

nocturne meteor
#

I think that's okay, because the less side is "more important" than the right side.

leaden hedge
#

looks good

nocturne meteor
#

Also, the thing Jamie said above, haha.

languid goblet
#

yeah the right side isn't as important ig

nocturne meteor
#

Really good work on this, tho, it looks great.

deep wave
#

now to selectively steal open-source most of modinstaller code ig

#

another point: modinstaller now (i believe) stores mods inside the game install folder. If we're installing mods for use over multiple game versions, shouldn't they be stored centrally?

#

though that only becomes relevant if you have multiple installs on the same patch

languid goblet
#

i mean, maybe you could just have different mods for different patches?

#

or diff installs

nocturne meteor
#

I think it's probably easiest to have a "deactivated" or whatever folder in each install, which the installer moves things in and out of.

#

The mods are (usually?) small enough where this isn't an issue, so it basically behaves like node_modules.

#

Otherwise, you're going to have to deal with a central source-of-truth which is --- stick if 1) we ever change it, 2) they ever change it, 3) if there's permission issues for that, etc.

nocturne meteor
#

whew.

deep wave
#

the use case of "i have multiple 1432 installs and i am annoyed i have to download mods twice" is very, very slim anyway

#

most people will only have one profile vesselsip

nocturne meteor
#

Yeah, I'm sure the number of people who know what's happening will be very small, and the ones that do are the ones who know how to fix it.

deep wave
#

dumb question: how do i get a NET app to open an application and not kill it when the form is closed? or do i need to keep a background worker open for the duration of the application running?

nocturne meteor
#

This, I have no idea. :''']

leaden hedge
#

god html is effort

nocturne meteor
#

Is that vanilla html? That's super fast.

leaden hedge
#

bootstrap

deep wave
leaden hedge
#

oh sorry

deep wave
#

(im probably missing something)

leaden hedge
#

im using a custom theme

#

so its not loading from a cdn

nocturne meteor
#

Nice. Bootstrap looks g o o d.

leaden hedge
#

thats why I used it FeelsOkayMan

#

no reason to have mockups look like shit if you can just use bootstrap

deep wave
#

forms apps just have this charm feelspkman

leaden hedge
#

the charm of looking like shit

worn eagle
#

I believe in semantic ui supremacy

nocturne meteor
#

I always forget I can just do mockups, and I'm like, "Okay, lemme start up nodejs, okay..." and then no one can see the work until I'm basically done coding. It's such a bad habit.

#

I think the .NET apps look like a nightmare that you wake up from and you realize you're in another nightmare, but, you know.

leaden hedge
#

semantic ui looks good too

#

but it also looks like more effort than a single include to install

deep wave
#

full disclosure: i am only using .net winforms because a) current modinstaller uses it, so i can just lift a fair amount from there, and b) it's the only thing i've used considering my considerable lack of time doing anything not for schoolwork

nocturne meteor
#

Wait, I thought semantic UI was like, a guideline for UI Frameworks. It's an actual thing you download? Wild.

#

Haha, it's all good, .NET is fine!

deep wave
#

just saying, since all i've seen so far is > winforms looks not nice and > winforms not available for everyone else

leaden hedge
#

do you know how to do html and css

deep wave
#

outside of what they teach you in year 9, no vesselsip

leaden hedge
#

good time to learn then FeelsOkayMan

nocturne meteor
#

I'm not even a webdev and learning HTML + CSS was prob one of the best time investments I ever made for my career.

#

The amount of times someone's told me to mock up a dashboard or make a quick webapp or something is significantly more than I thought it would be.

worn eagle
#

I despised my webdev internship :)

leaden hedge
#

pretty much the only way you're going to make it not look like shit and be multiplatform is to use electron FeelsBadMan

nocturne meteor
#

I love me some electron but that thing loves to eat memory.

#

You could use Python's GUI stuff. Kidding, that stuff is terrible. :'']

leaden hedge
#

i mean you could write your own gui stuff via opengl

nocturne meteor
#
  1. Make your own GUI thing.
  2. Write the installer in your GUI thing.
  3. Distribute.
  4. Wait for people to mess up and yell at you for how bad they think it is.
#

I haven't really ever found a "window-based" UI thing that I've loved, which is sad. Electron gets close but, ugh. It's a beast. That's why I always opt to do webthings, I just don't like any of the non-webbased offerings I've seen.

leaden hedge
#

wtf

#

electron needs node, and node needs windows 8+

#

fuck electron all my homies hate electron

deep wave
#

windows 7 theme for windows 10 when

nocturne meteor
#

Wait, that doesn't sound right --- I've built my electron things on Ubuntu. Hold up.

leaden hedge
#

it has seperate installers for mac/linux/windows

nocturne meteor
#

Oh, yeah, that is true. It has a LOT of requirements on Linux.

#

And it's really beefy on Windows, from what I remember.

leaden hedge
nocturne meteor
#

Well, get Windows Server 2012, what are you waiting for.

worn eagle
#

Imagine having a whole browser in your framework

leaden hedge
#

ill just download the binaries

nocturne meteor
#

I think there's a docker image I used for it somewhere.

leaden hedge
#

i mean yeah it makes sense to use a whole browser

#

browsers are constantly updated, and designed to look and feel good

nocturne meteor
#

Okay, they seem to have updated electron to fix some of the memory things I ran into a few years ago, maybe I'll give it another spin.

#

I just remember it: being SUPER memory aggressive and taking up a ton of space (node_modules), but I think the production build isn't too large, space-wise.

copper nacelle
#

there's also react native and such

mystic umbra
#

I don't know if it's something I did, but I have another bit of feedback about the documentation. First, in the custom assets section you recommend adding an embedded resource by modifying the .csproj which in general I find to be rather dangerous to do for new users. I would recommend having them do it the simpler way by adding the file using the Add Existing File in the context menu on the project. After adding it you can right-click on the file and click properties and change the build action to Embedded Resource. That should get everything loaded in fine. Second, in the Utility Mod SFcore it mentions you should know how to embed resources into the mod, putting a link to how to do that in the custom assets section would be nice. Finally, I would add to the note in the Load embedded images section to mention that the user needs to have the UnityEngine.ImageConversionModule.dll reference in their project since for some reason UnityEngine.dll doesn't include it and I didn't see anywhere else where it's mentioned that users should have that dll referenced

nocturne meteor
#

UnityEngine dll stuff seems to have split out from just using the UnityEngine.dll and sometimes it uses the other ones --- I found this out after a bunch of googlin', and I don't know why they did it. It's weird. And yeah, I agree with the former thing: I tried to modify the proj file when I was just starting, screwed it up, then spent some time googling around to figure out the resource thing. These were def holes in my C# and Visual Studio knowledge, and idk to what extent the API should be documenting C# / Visual Studio stuff --- it might be better to just link to some pages and be like, "Read this." Idk tho.

mystic umbra
# nocturne meteor UnityEngine dll stuff seems to have split out from just using the UnityEngine.dl...

That is true, teaching C# things might want a link. However, most programmers don't do embedded resources in VS so I feel like the mod could teach that since it's pretty niche. It's also like two lines of explanation. Also, in my first job I had to go through a bunch of the company's .sln files and manually modify them to fix a minor annoying bug that programmers would encounter when loading up the file. I had to be so careful when handling that thing because I really didn't want to break the .sln file

nocturne meteor
#

Yeah, C# isn't my forte, so I'll concede any pedagogical points to anyone who knows it better than me, haha.

jolly oriole
vocal spire
#

Idea for the new mod installer: save file management

jolly oriole
#

then maybe with integration for rezno[R]'s analyzer

fluid steppe
#

Here me out, HK except all the dialogue has no context

potent dirge
#

Save file manager yes pls

#

I was thinking about that anyway lol, but if someone does all the hard work I'd be happy bc I have so much else I'm also thinking about doing ax2uHappy

jolly jungle
#

Coincidentally, I was planning this week to give these kinds of things a try again so I can finally pick up some good working habits

deep wave
#

idea 2: figure out why moresaves keeps randomly not displaying all of my saves feelspkman
(but yes save management is a good idea, i'll add it to doc)

merry marsh
#

Does anyone have a suggestion on a simple-ish mod to develop as practice? (It can be something that exists, it's just learning how I want to know.)
I already have a lot of programming experience, it's just modding Hollow Knight that I need to know not coding itself

mystic umbra
#

Something simple @merry marsh might be to make a mod that makes a new charm that makes the player deal double damage

#

But that damage is only doubled if it's a spell

#

So Shaman Stone, but with some numbers changes

merry marsh
#

@mystic umbra thanks, I'll try that!

mystic umbra
#

No problem

merry marsh
#

My problem with this stuff is that I get too ambitious and jump to another project on impulse before finishing some big project I imagined.
If I just finish something, I'll at least remember how to mod somewhat if I do start another project before making anything useful

mystic umbra
#

I'm in a similar vein. Starting is easy, finishing is hard

#

I'm hoping to unveil to everyone my first ever finished and polished mod tomorrow

merry marsh
#

ooh, nice!

#

I do have an idea for an actually practical mod I may try later on tho. I came across a video on youtube about the parry mechanic, and I thought it'd be cool to make a mod that offers more reward to parrying. Like just double damage after parrying would be the easiest thing, but stunning them for a second would be nice too. I've played a lot of dark souls recently, so that stuff is on my mind

#

...let me guess, that's the mod you're releasing tomorrow, isn't it? XD

mystic umbra
#

That does sound interesting. I don't even know where the parry code is so that would require some investigation. No, I'm releasing a much simpler mod. Once that's released though I'm going to work on a slightly more ambitious mod and if that works then I've got one more idea up my sleeve

merry marsh
#

nice, I hope they go well!

mystic umbra
#

To give you a hint about the next mod, I got the idea from Apex Legend's Sentinel sniper rifle

merry marsh
#

The other idea I have, which isn't really a mod, is just to make a mod loader with a better UI.
Like, no offense to the person who made the current one, I don't think it's hideous or anything. I just really like designing GUIs and other graphic design stuff. So I just think it could be a fun project for more experience that may actually get used by other people

merry marsh
deep wave
deep wave
#

though if you can make something with similar design semantics in something that isn't windows-only that might be useful

#

or along the lines of what katie was saying last night, give people a choice

deep wave
merry marsh
deep wave
#

i think katie did it mainly as a mockup, but i'd ask <the people who know what they're talking about with this stuff> rather than me about it

merry marsh
#

lol!

worn eagle
#

what frameworks are you planning on using for the redesign

deep wave
#

.net 3.5 winforms, same as modinstaller

worn eagle
#

I should've replied, but I was talking to cosmic pepogrub

deep wave
worn eagle
#

But on the topic of your rewrite, why don't you upgrade to like .net 5.0?

deep wave
#

because then katie can't degrade provide constructive criticism on all my code because she can't open it feelspkman

#

also because HK is on .net 3.5 already, so it's guaranteed the user at least has 3.5 installed

#

(i also don't think there's anything I really need on higher versions of .NET to finish this app)

deep wave
#

(if nothing else needs to be added here I'll just extend the mod google drive button)

#

realised that only allowing double-click or right click to start a download is probably a little unintuitive, added download button too 🙂

potent dirge
#

(screw bootstrap and modern UI btw 😤 )

#

i like

jolly oriole
#

(fuck webapps, at least those that try to distinguish themselves as an offline gui program)

leaden hedge
#

like visual studio

#

fuck vs

jolly oriole
#

visual studio isn't a webapp, vs code is though

leaden hedge
#

yes im talking about the visual studio on electron obviously

deep wave
#

also extensions of functionality i realised while eating food should probably be a thing:
Custom level manager & downloader for DecorationMaster
Custom skin manager for CustomKnight
Save file manager

#

(just writing these down so i dont forget trans2uHappy3 )

worn eagle
#

Rewrite custom knight to not be bad while you're at it shermaU

deep wave
#

🥴

leaden hedge
#

put all that on the same screen too

deep wave
#

idea is to have level manager, skin manager, save file manager all be in separate tabs, and ofc only show tabs you can actually use (eg if customknight isn't downloaded don't let me try to look at customknight skins)

worn eagle
#

custom trial manager when

deep wave
leaden hedge
#

you would probably not want to hardcode that

deep wave
#

this is just mockup central right now, i'll make it not terrible later trans2uHappy4

leaden hedge
#

but a plugin system is probably too complicated for you to program

worn eagle
#

You just gonna take that

deep wave
#

actually yes, im not into pretending im more experienced than i am tamershrug

worn eagle
#

What gripes do you yall have about custom knight besides ig modcommon dependency and broken geo?

#

Might take a look at it

jolly oriole
#

the preloading

#

after looking at it for a tiny amount, maybe instead of preloading stuff to edit the textures, possibly that could be changed to be during on hooks or something

worn eagle
#

It seems that there's a setting for preloads but that just makes it so those textures don't change

deep wave
#

if there's some way to stop customknight causing invis thk then that would be amazing feelspkman

#

though as invis thk also seems to happen in vanilla anyway, and I get it even without customknight it seems like it's unlikely to be fixable

jolly oriole
#

that's maybe a vram issue

deep wave
#

it most likely is, but then i think somebody reported it happening on a 3080, which shouldn't be running out of vram in hk 🥴

jolly oriole
#

i mean, its nvidia

unborn flicker
#

I think the idea is it's an issue with the software not allocating enough vram, rather than hardware

jolly oriole
#

does unity have 64 bit for mac/linux and only windows gets 32bit?

steady comet
#

So uhh..... stupid question because I'm stupid
https://radiance.host/apidocs/Hooks.html should it say GetBoolInternal rather than InternalBoolGet? I only ask because visual studio complained when I did the second and not when I did the first

copper nacelle
#

yes

steady comet
#

Thanks grublove

jolly oriole
copper nacelle
#

.done

jolly oriole
#

pog

untold nebula
#

Anyone know if there is any way to change the path the game saves to? AppData\LocalLow\Team Cherry\Hollow Knight\ it seems the game uses the same folder for all the saves even if you are using different steam accounts. Using the launch argument "-savedatafolder=save directory" works in some Unity games but it does not seem to work for this one.

copper nacelle
#

yeah

untold nebula
copper nacelle
#

oh this is what i use

#

like the code

#

have anything specific in mind?

#

or can it just be any other folder

untold nebula
#

😮 that's awesome, going to test it right away.

fair rampart
#

How do I add my mod to the mod installer?

jolly jungle
#

What's your mod?

fair rampart
#

I already uploaded it to Gamebanana but I'd like to add it here as well.

#

Since I'm not sure how many people actually use GameBanana.

deep wave
fair rampart
#

I uploaded it to Google Drive.

#

Now what?

#

And who should I ask for it to be uploaded to the shared drive?

deep wave
#

have you read the opening comment in modlinks.xml

#

(on a side note, are there mods on the drive that still require switching out Assembly-Csharp @ green names? if so i may be able to add them to hkmanager as a scuffed api)

fair rampart
#

If I do a pull request, will that add it automatically to the shared Google Drive folder as well?

deep wave
#

no: i'd recommend uploading a zip file here containing the dll and a readme describing the mod

fair rampart
#

Is this good?

untold nebula
# copper nacelle this puts it under Team Cherry/1432

Hi man, I finally managed to test it but it seems it is not saving, I installed it with mod installer, when starting a save all saves are clean but when you reach a bench to save if you close the game and open it again no save is present. Any ideas why?

#

Seems it is not creating any new save path, it is supposed to save to AppData\LocalLow\Team Cherry\1432\ right?

#

Tested on latest steam version of the game.

deep wave
#

proposing some adapting to the structure of modlinks.xml for new version, the separation of ModList into ModList and APIList is breaking but should probably be made vesselsip

#

Description is shown on hovering over a mod, FullDescription shown on downloads menu.

jolly oriole
#

twitch prime

#

current modlinks has a link to the zip, should that be in the new one as well?

deep wave
#

yeah its at the top

jolly oriole
#

yea, the api has that, but the examplemod doesnt

deep wave
#

ah i did miss that

jolly oriole
#

ah ok

deep wave
#

apart from forgetting to add a way to download the mod, any other glaring issues/improvements? feelspkman

jolly oriole
#

optional is for optional dependencies i guess?

deep wave
#

optional already exists in modlinks, i just grandfathered it over

jolly oriole
#

oh

deep wave
#

it's for "author recommends you install these mods too"

jolly oriole
#

ooh

deep wave
#

so like I could make it so if you try to install randomizer, it suggests you also install randomapmod

jolly oriole
#

damn, watch me add all of my mods to my other mods as optional :^)

deep wave
#

while it silently installs all the other dependencies as well

#

i wouldn't recommend it, current modinstaller does seem to have it implemented so you might start annoying people feelspkman

untold nebula
#

Anyone know if there is any way to make the mods config files of mod installer/modding api save somewhere else other than AppData\LocalLow\Team Cherry\Hollow Knight? I tried using @copper nacelle change save directory mod but the mod files still save to the default Locallow path.

#

I'm working on a splitscreen mod and I need each instance of the game to have different mod files cause it seems the second instance does not load any mods cause the first is already using them from Locallow.

#

One workaround I found is to open each instance of the game under different windows users, that way each instance has its own Locallow path and each have their own mod config files there but this solution is not ideal and too bothersome to use.

#

Uses @vocal spire Multiplayer mod to connect the instances.

vocal spire
#

It’s not mine, I’m just editing jngo’s original work

vocal spire
untold nebula
#

Yeah I'm looking at the github page you linked right now thanks, just posting here too to see if someone has more ideas.

vocal spire
#

K

untold nebula
#

Hmmm can't seem to find an easy way to change where the modding api saves the mods config and json files.

fair rampart
vocal spire
#

Do you see where the global settings path is set?

#

Just set it to something different based on something like what instance it is

untold nebula
vocal spire
#

Yes

jolly oriole
#

i haven't checked it, but (watch fire rn) does decorationmaster have a memory leak? i heard from some people that the game starts to lag after a while with decorationmaster edited levels

ornate rivet
#

any reason why when I switch scenes, I get placed at (0,0) even though I have the proper gate and name

#

the scene switch works in the reverse direction and puts me in the right spot

jolly oriole
#

middle of transition is more than 10 units above ground

ornate rivet
#

hmm where is that checked for

vocal spire
#

I’d assume when the knight is spawned

ornate rivet
#

is it supposed to be 10 units above ground or not?

vocal spire
#

Not tmk

#

Like 10 is the limit or something

jolly oriole
#

idk, let me check quickly

#

HeroController.EnterScene

#

but imma sleep now

ornate rivet
#

gn

ornate rivet
#

hmmmmmmmmmmmmmm

#

this game hates me

vocal spire
#

F

#

Feel the same way

deep wave
#

same 🙂

#

hk is bulli

ornate rivet
#

HeroController.EnterScene does nothing

vocal spire
#

F

ornate rivet
#

the hook runs but the gate is blank and stopping it from doing anything doesnt change anything gameplaywise

vocal spire
#

Huh

ornate rivet
#

manually setting the gate myself also does nothing

#

ok not entirely true

vocal spire
ornate rivet
#

ok figured it out

#

my custom floor spawns too late

vocal spire
#

F

ornate rivet
#

or it could be that it's not counting my custom floor as floor

#

hopefully not that because I have no idea why that would be

leaden hedge
#

just needs to be a collider on the correct layer

ornate rivet
#

It's both of those as I just instantiate a preexisting floor

#

the floor is also made at the same time as the gate is placed

#

so not sure what the problem is

#

wait no I have a yield return null

#

ok cool that was it

#

my past self trusted yield return nulls way too much, this is the third time removing one has fixed glitches

ornate rivet
#

prepare for pale court spoiler

vocal spire
ornate rivet
#

darn it shows the color

#

sigh

vocal spire
#

I see where it fits in

#

You — so you can go to — and —

jolly jungle
leaden hedge
#

oh speaking of ui for mod installer stuff, cdda has a good one
main page for game version/folder selection and updating/launching the game

jolly oriole
#

i have no idea what cdda is, but it appears to have a big modding community

floral furnace
#

CDDA gang

leaden hedge
#

cataclysm dark days ahead, its a zombie survival sim roguelike
steep learning curve but pretty easy after you learn how to not be stupid af

#

xhuis author of the exaltation mod contributed to it occasionally

jolly oriole
#

neat

floral furnace
#

aka "apparently starting a fire inside the sewer is a death sentence because the smoke has no way of going out essentially suffocating you" the game

deep wave
#

👀

steady comet
#

I would start a fire in a sewer if it means no more flukemons

deep wave
#

but flukes are so cute uwu

leaden hedge
#

hmm fire should be fine underground and in enclosed spaces

#

you can do it in lmoe shelters, evac shelter basements and in labs

#

dunno why sewers would be different

floral furnace
#

i dont remember much of my old run (that was like years ago) but i basically tried to cook food in the sewers and ended up coughing then dying/suffocating to the smoke

leaden hedge
#

it might have been the type of fire, some spread more smoke and you can choke just by being next to a contained fire on the surface

jolly jungle
#

Woah woah woah what is this discussion

#

Fire?

#

Who's making fire and what are the mechanics of it

copper nacelle
jolly jungle
#

Royal Zombie Coward

vocal spire
ornate rivet
#

woah what is this

copper nacelle
ornate rivet
#

did you use the standalone version?

copper nacelle
#

yeah

#

i wrote the wrapper if you want it

ornate rivet
#

nice thank you

copper nacelle
ornate rivet
#

what's the third dll for

#

yay

copper nacelle
#

leaked

vocal spire
#

Fun to mess around with

#

Also fun for positioning new rooms in the correct position in among us

ornate rivet
#

this is so cool

#

I dont have to open and close hk 5000 times anymore

#

going to cry

vocal spire
#

Yee

copper nacelle
#

what

#

why the fuck were you closing and opening hk 5000 times

vocal spire
#

Because steam

copper nacelle
#

there is literally a console

#

I am taking fucking psychic damage

vocal spire
#

F

#

Is that a new type of damage in a mod?

ornate rivet
#

I'm always too lazy to install the console mod

vocal spire
#

Same

ornate rivet
#

plus this shows the stuff in the scene too

vocal spire
#

Yeah

copper nacelle
#

I can't believe saleh is pepega

#

I changed my mind

#

I can believe it

vocal spire
#

🤔

ornate rivet
#

sorry 56

#

does the console let me import stuff

copper nacelle
#

yeah

ornate rivet
#

how

copper nacelle
#

using

#

it auto references everything

ornate rivet
#

it makes the using red

copper nacelle
#

at least mine does

vocal spire
#

Cool

ornate rivet
vocal spire
#

Haven’t tried the console

copper nacelle
#

use a better console

#

qed

ornate rivet
#

fine fine I'll install your console too

copper nacelle
#

easy

ornate rivet
#

not like it can get worse than a 15 second loading screen

copper nacelle
#

what

#

i gotta say I don't preload anything

worn eagle
#

prelzotedisgustads

copper nacelle
#

TRUE

#

so fucking true

#

I'm crying rn

lofty zenith
#

Hey I need help replacing the game's sound files. I saw the pin but I'm not entirely certain how to go about it, also one of the links is dead

#

I'd like to replace some of the NPC's dialogue/fight sounds if it matters