#archived-modding-development
1 messages · Page 499 of 1
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);
k ty
I hope when tc said enemies in silksong were more complex they meant they're using smarter fsms rather than bigger fsms
https://paste.mod.gg/ebawodohaq.cpp anyone know why this is giving me a NullReferenceException?
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)
why
i would guess on that being it
that's just gonna end up being fsm.gameObject
I mean if you're just trying to increase the scale, fsm.gameObject.transform.localScale *= 5; seems fine to me
hmmm
nvm
i guess its no longer readonly?
or i did something wrong the last time i tried that
ty
this is just a guess on the nre still, if you had the wrong action name that would also do it
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?
destroy the old one instantiate a new one
Makes sense, thx.
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?
nah you were right it was that line
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.
what is the tiktik fsm called? I cant find it in FSM Viewer
Yeah, I couldn't find it either and that's what enemy I wanted to manipulate. :'[
done via the MonoBehaviour Climber
and they're called Climber
@midnight narwhal @nocturne meteor
That's kind of a cute name.
MonoBehaviour, not fsm
oh
Is there a nice way to "get" every object of type "Climber"?
Some sort of Object.FindObjectsOfType thing?
exactly that
GameObject.FindObjectsOfType<T>() iirc
Okay, nice. And is the type of these "Climber"? Or is that just the name of them?
whatever is to the left of : MonoBehaviour
the type is Climber, and the name
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"?
HealthManager
I'm more exploring what I can do with a mod, not really making anything for production, so I don't mind.
then manually filter climbers out
That makes sense --- all enemies should inherit from HealthManager. Okay, cool.
even things that cant die, like the "flies" you pogo off in white palace have them
well, technically they can die, you just need to deal over 999 damage in one hit
or 4 9s, idk
instead of doing findalloftype
if it has an awake function
you can do On.Type.Awake += ...
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?
So you are trying to get the GameObject of the health manager?
Yeah
and if its nested, you can do .transform.parent.gameobject
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?
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
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?
a parent
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.
scene
-gameobject
--transform
---childgameobject
----transform
----spriterenderer
--healthmanager
-gameobject2
--transform
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?
is roughly how scenes look
Alright. I'm not sure what the transform is, but I know the rest.
is GameObject things like the knight, or transtrans, or VK, or NKG?
are you trying to replace gameobject a with gameobject b?
Yeah. Let's say, to be concrete: a crawler with a climber.
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;
Is transform what holds things like the sprite, etc?
no
transform is position data
size,rotation,position
Instantiating something makes a 1:1 copy of it
but you want it where gameobjectA was
Ahhh, I see.
Alright, I'm tryin' this out now. :'] Thank you so far, it's been v helpful.
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
I'll check the value after destroy.
Is it myGameObject.DestroyAll()? The Destroy(myGameObject) doesn't exist in my context.
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
That looks like it'll be okay.
Alas, looks like gameObjectC.transform is read-only, on the last step. :'[
Okay, cool.
so you can do objectC.transform.position = temp.position
localscale, localrotation, localposition
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)
Alright, great, I think I've got a bit to dive into, I'll work more after work on it. :'] thank you all.
i don't think unity changed that much, so
SceneManager.activeSceneChanged += whatever;
...
private void whatever(Scene from, Scene to) {
// whatever
}
heck u code that is not working for a reason i do not understand
try UnityEngine.SceneManagement.SceneManager
if this works your a genius pog
good
can i do a mod on Mac?
yes
txz
doing mods sounds hot
🤔
why have you said this
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
do
UObject.DontDestroyOnLoad(climberGO);
climberGO.SetActive(false);
after the instantiate
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.
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;
}
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?
yes
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
then try
GameObject climberGO = Instantiate(GameObject.FindObjectsOfType<Climber>()[0].gameObject);
i forgot the .gameObject
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!
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
thx a lot
I finished up programming my first mod, is it alright if I post some findings I had about the code/the intro docs?
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.]
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.
this isn't going to work in any scene which doesn't have a climber
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.
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
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?
i think it's relative to the parent but idr
Alright, cool. I'm goin' through unity lesson stuff now so I'll [hopefully] have fewer basic questions in the future. 
Hell yeah, please do
All corrections help
I'm no expert, but I think preloading can do that
https://radiance.host/apidocs/ModdingAPI.html#preload-gameobjects
Hopefully that can help you
Oh, man, this is awesome.
Yayy :D
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.
I think they can be found in the scene dumps? I'm not sure
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
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.
they both set the same variable
.transform just does whatever you did - parent.transform
Oh, I meant .transform.localPosition vs .transform.position.
its apparently significantly faster
Also their names usually appear in other places, like the fsmviewer and the sprite extractor (I think that's what it was?)
use localPosition does the same as .position unless you have a parent
They usually go by the same names I think
except position has to recalculate more stuff
Ahhhh, okay, I understand now.
Okay, so in here it's like, _Enemies\Climber 1, which I'm guessing is the full name. :'']
is there not a thing for preloading
that you just give a scene and gameobject name too and it gives you a reference
Is it what Godfriend linked above in the radiance api? I'm trying that out now.
yeah
[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.
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
Haha, okay, it pulls it, but I still don't get anything to come up: https://github.com/jsal13/TikTikTikTik/blob/main/main.cs any ideas? Do I need to activate the new game objects? Do I need to have these not be local objects or something?
I am getting a legit climber object: Climber 1(Clone) so that works great!
Ooh, it works?
The preloader thing does! Haha, but not the whole thing.
Wait no you sent them at the same time so the second one isn't a progress update 
Oh I see
So what's the part that isn't working right now?
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.
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
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. :']
Hopefully
Okay, I'm unsure which worked, but Object.DontDestroyOnLoad(newGO); and newGO.SetActive(true) worked!
were the tiktiks not moving?
they weren't showing up at all.
"yes", sort of. they usually move in a little circle in the air.
which i kind of expected.
ah
haha yeah, who knows. hoo knows. But it's good enough for what I needed it for, which was: practice. :'']
yes thats the behaviour if they aren't on a collision box
yeah, it makes sense since they're little climber bois.
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.
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
Hey, I was thinking
About reskinning enemies/bosses
We can technically reskin anything else, too, no?
transtrans
yeah if stuff doesn't move its because its code isn't active
you need to activate the fsm/monobehaviour
#hk-meme message
this is what happens when you get into special specific scenarios
i did setActive(true) though
is the fsm separate from that?
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
it'll be copied in whatever state it was in
and that includes ai distance stuff iirc
oh ok
guess i’ll look into fsm stuff sometime
it probably includes a "start state" variable
you can check to send it to the start state
is avalonia fsm viewer out?
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
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
do you mean turning the fsm off and on again?
yes when it gets activated, it goes to its start state
alr, will try it out
Wait were you referring to the "reskin anything" I asked?
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
OnCharmIconListStartcharmIDswill 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 thecharmIDsinAfterSaveGameLoadHook. You'll probably want to do something similar in there or inOnCharmIconListStart.
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.
No problem
Zal- 
The feedback was actually so long I needed to split it into two messages and I almost made it into three
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
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
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.
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
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.
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 useMod<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
and yes transtrans is the reskin anything thing
and that i'll look into when i'm home from work
it reskins a tiktik to a transtrans
so it has the code for reskining other things too
Hm

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?
dont really need to find it
Also stop sabotaging my ability to type by making me melt from the cuteness of that creature
if you use godump
Are the files in the HK Sprites drive already dumped like this?
Hm, this seems kind-of-maybe-complicated
I'll need to see it when I actually do it
Thanks
Is this the way Customknight works or does that have a different way of doing it?
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?
one of them will replace the knights texture
won't
hi , do you guys think they'll use vulkan for the linux port of silksong instead of opengl ?
it will use the default settings for unity projects being exported
@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
but i tested it, and it for some reason does append

though the "only" things that are affected are enumerables
afaik
only tested now: lists are affected, arrays arent, dictionaries probably also arent
can't the default setting be changed to vulkan instead of opengl ?
object creation handling
i mean you can set it in your project settings
tc will just use whatever is default
will it matter if i send them this suggestion via email ?
i really want silksong to use vulkan instead of opengl
your best bet is to probably bother graig
yep, from those 3 only the lists are affected (it would have been very weird if dictionaries also appended something)
well, ig i'll just use arrays instead of lists
make me not use arrays
might be able to do an OnDeserializing attribute and overwrite the list with a new one there?
Had this problem a while ago
dw ill remove the server
pog
delete main
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
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
Seems to work fine for me
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 ofCharmHelper
I could do a PR for this if you want so you don't have to do it, unless you mean you don't want CharmHelper to do it
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.
Or whatever it's called for changing your code. I don't use Github enough to remember
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. :']
If you do decide to just do this instead of changing it then make sure to update the documentation so that new users are aware and don't fall into the two day bug fix pit I went into
Nice, that's pretty good. I haven't done open source or Github since I've left school. Nothing I have currently is worth getting PR'd
That's actually kind of a lie, I just remembered that every year when I do the GGJ I use Github for it
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.
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
};
as if i know what you write
this is so sad
but ig imma pr it later, so i can also include language stuff
What's all this PR mean?
pull request, essentially you fork a repo from somebody else, make changes, and ask them if they pull your changes into their repo
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)```
https://guides.github.com/activities/hello-world/ is a good guide to the world of github, if you're interested in that! As SF noted, it's a way to make (with their approval) changes to code in someone else's project.
(unless Benchwarp is just a namespace in TC code and im just pepega)
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
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)
that sounds like you have 2 game installs, and used one with the modding api installed
otherwise benchwarp should never be loaded
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
don't mind me
how do i mod
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)
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%
i have a dictionary for translating scene names actually
https://github.com/ManicJamie/HKTranslator based off an xml in saves folder, you can probably just modify to use the xml as embedded resource
rando also has geo rock names in rocks.xml i believe
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
you could automatically parse that information, if you have a map
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?
tbh looks cluttered at first glance, at second glance ig downloading mods is done in the download mods sub menu?
yeah, i felt it made more sense in terms of how i use it at least
otherwise it looks nice
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
is this wpf?
yeah, just using the same as modinstaller... unless all of these are specific to .net 4 and im acidentally using that 
windows only 😔
I like it. I could give smol feedback on word choices, but composition is clearly understandable imo
It looks at least as intuitive as the current mod installer
cerpin feedback 
don't forget to include something like https://github.com/Ayugradow/ModInstaller/blob/master/ModInstaller/ModManager.cs#L269 as mickely likes to have these kinds of people in #archived-modding-help
If it looked like this and functioned I would use it
it will take me at current rate of me doing things about.... an undefined period of time to get this working 
yeah SF i was planning on just copying over most of modinstaller code, i noticed that
poggers
What's "install nickname"?
Change -> Select below that?
Launch (game?) to bottom left or top left, left aligned?
Preset -> profile?
install nickname = nickname given to that specific install (i couldn't think of a better wording)
"Current Installation: {}" ?
also another thing: is it good or bad idea to have the right side collapse when vanilla is selected
Bad
just grey it out, if possible
Maybe have as an option
why would you make it say please buy the game
I know I'd check stuff like mods available when unmodded as well
you need to make that error message cryptic af
so people incriminate themselves more
good point
Also why tell me to buy the game just bc I downpatched 
but then we get more complaining in #archived-modding-help
but then again, funni
and by pc i mean windows
also much better solution
is to require a steam oauth
that just checks if they own it
gog exists
what
people use gog to buy hollow knight

i believe gog also has oauth
eventually i suppose i'll work on that, but unfortunately my brain very small currently
What if you're not using gog galaxy
then you use steam oauth
Drm free games needing drm
gog is drm free, which presents an issue for us, attempting to do drm 
yeah i agree with that
issue is if you launch HK without gog galaxy, does gog do an oauth check?
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
so oauth checking only works if you have a steam install
it can add achievements to an account tho
It doesn't do achievements if you only launch the exe from gog
LGOGDownloader is unofficial downloader to GOG.com for Linux users. It uses the same API as the official GOG Galaxy. - Sude-/lgogdownloader
no
you don't need it for oauth either
oh that makes more sense
you literally just load a webpage, they login, you can check what games they own
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)
I'd expect humblebundle to have oauth support too
but thanks to the steam key that can wait
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
still works, as the game doesn't have any account information attached to itself
one of the classes in assembly csharp has a version string, maybe that's also somewhere else, idk tho
im guessing modinstaller currently assumes that the game you're installing it onto is vanilla?
what
you ask them to sign into their account
and you then check their account details to see if they own it
it checks SHA1 checksums of the current assembly-csharp to newest one in modlinks, if they don't match, newest modding api gets downloaded
like once you have an oauth gog token, you can request /user/data/games/
and it returns a list of owned games
ok that makes sense
Tired: whatever that idea was
Wired: use reflection on the assembly to check if the version is 1424, and then delete system32
ok now that is truly beautiful
do i feel bad if i delete all their save games and the install as well?
i dont think loading unity dlls externally work well
Yeah, that might be an issue
simply load every dll for unity individually, then assembly csharp 
why
i'd assume logic flys half out of the window when looking at decompiled TC code
why is it in savegame?
probably a const that gets optimized
when it saves after an update it makes a backup iirc
Constants.GAME_VERSION contains the game version (who would've thought)
I can tell you for sure its not in the assembly version field bc that would've made sense 
the version of Hollow Knight.exe is the unity version that was used to compile the game, so technically that could also be used
if you want real 🧠
this string at the start will never realistically get used
write whatever you want in it
permanently mark their install as pirated? very blessed
i was thinking of that, but what if they actually.... go buy the game
once a freeloader always a freeloader 
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
these already exist 
just make it say something like "error unknown: please post error code 3T4R1P in modding help"
or just "Error Code {insert something hexadecimal}"
oh wow, didn't notice it said that
can even include a handy link 🙂
Even better: a random error from a list of them or something, preventing pirates from figuring it out for a bit longer
take random number, encode into base64, make that the error code
base64: cGlyYXRl
weeb ass mf
dcolonw
can someone on Linux test whether this works
oh I didn't think discord would handle 68 MB w/o nitro
because the server is boosted, everyone here has 100 MB upload limit
which is why Pale court still can't be leaked lmao
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
is randomizer/practice/custom levels the presets?
yeah those are just some example presets i made
winforms 
move download mods and check for updates out of its column
and make load/save take up half the column
makes sense - if i do the tabcontrol thing then i can remove Download Mods button entirely 
i actually did this specifically because doing it on open is one of my least favourite things about modinstaller
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
put some text at the bottom that says out of date
mod updates
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
that makes good sense
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

like this i guess
in seperate "window"
you select your install patch, then it changes view to mods/patches just for that install
it does it on open because users suck is the thing you're missing
otherwise they'll just not update
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
load and save should be on the same row
so this?
yeah
now there is copius space for every set of mods you could ever want
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.
- What do the "Vanilla" and "Modded" buttons do? I'm scared to click them, I don't wanna mess up my game.
- Switch installs? I am but a simple hollow knight user, what does this mean?
- Okay, select path... and select patch... must be similar, they're on the same line. What are they and why do I need them?
- Middle boxes seem fine, makes sense to me.
- 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.
left side is to be completely changed immediately 
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.
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 
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
i would allow the presets even without modding api, disable save
and pressing load should give a warning that it will install modding api
katie i'd like to keep the ability to launch into the game as vanilla
i mean if you load a modded preset
and not have to click through an additional message box to confirm that 
it should just install modding api
you could steal borrow from celeste's mod installer and have two buttons to launch vanilla or launch modded on an installation
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?)
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
the layout is pretty nice, but you can't manage mods from the main menu and instead has a news panel for modding related stuff which would probably be useless for hk
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.
i mean, you could just have two buttons to launch that install as modded or as vanilla right?
you can
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.
its like .002seconds to swap modded -> vanilla
you should just have a vanilla.dll and modded.dll in each folder
exactly, which is what i was planning on doing
and just have a button to launch one of the 2
instead of having a vanilla/modded version
i was planning on doing it on selecting the profile
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
^^ I like that.
It's building for the --- uh --- lowest common denominator user. :']
1.4.3.3 remains 
Honestly, these MS Paint skills are the most impressive part of this.
1.4.3.3 cracked 
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
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)
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
yeah but i'm the 0.0001% 
i feel like having to navigate to a separate window to launch the game after you're done configing mods is a bit clunky
couldn't you autodetect patch when you select an install
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
i mean if you don't want to change anything
you'd just run it from the exe probably
my intention is to use this as a kind of launcher, similar to minecraft ig
isnt minecraft the same way
minecraft doesn't let you manage mods, you have to drag them into the install folder iirc
There's a forge thing that's an alternate UI thing, I feel it's a bit clunky but it gets the job done.
I don't think there's official mod support but I could be wrong?
Is that one layer?
for run, run vanilla, open folder, config
there isn't official mod support for even datapacks, which is what they've been pushing instead of forge/fabric mods
config would open the mod and preset stuff
Oh, symbols, got it.
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
its been so long since i used mc launcher 
then clicking config i guess should do this
although i guess you could also have the name and game directory in there too
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.
nice radial group
Radical, brahs.

Thanks, but I know this doesn't have all the functionality that Jamie's does.
mine has functionality?
Okay, LOOK.
im just dragging and dropping stuff in windows forms
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.
I believe in Qt supremacy
any electron
of course this installer will also support changing your background to be a waifu, as any good application does 
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.)
ok so this was my "final" draft of the left/right version, im not massively sure what issues there are with this?
Yo, that looks great.
maybe make it symmetrical
Make it less symmetrical.
like, the right side looks squahsed compared to the left side
otherwise looks good
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.
actually yeah it's fine
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
I think that's okay, because the less side is "more important" than the right side.
looks good
Also, the thing Jamie said above, haha.
yeah the right side isn't as important ig
Really good work on this, tho, it looks great.
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
i mean, maybe you could just have different mods for different patches?
or diff installs
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.
cool that convinced me
whew.
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 
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.
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?
This, I have no idea. :''']
Is that vanilla html? That's super fast.
truly elegant
oh sorry
(im probably missing something)
Nice. Bootstrap looks g o o d.
thats why I used it 
no reason to have mockups look like shit if you can just use bootstrap
forms apps just have this charm 
the charm of looking like shit
I believe in semantic ui supremacy
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.
semantic ui looks good too
but it also looks like more effort than a single include to install
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
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!
just saying, since all i've seen so far is > winforms looks not nice and > winforms not available for everyone else
do you know how to do html and css
outside of what they teach you in year 9, no 
good time to learn then 
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.
I despised my webdev internship :)
pretty much the only way you're going to make it not look like shit and be multiplatform is to use electron 
I love me some electron but that thing loves to eat memory.
You could use Python's GUI stuff. Kidding, that stuff is terrible. :'']
i mean you could write your own gui stuff via opengl
- Make your own GUI thing.
- Write the installer in your GUI thing.
- Distribute.
- 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.
wtf
electron needs node, and node needs windows 8+
fuck electron all my homies hate electron
windows 7 theme for windows 10 when
Wait, that doesn't sound right --- I've built my electron things on Ubuntu. Hold up.
it has seperate installers for mac/linux/windows
Oh, yeah, that is true. It has a LOT of requirements on Linux.
And it's really beefy on Windows, from what I remember.

Well, get Windows Server 2012, what are you waiting for.
Imagine having a whole browser in your framework
ill just download the binaries
I think there's a docker image I used for it somewhere.
i mean yeah it makes sense to use a whole browser
browsers are constantly updated, and designed to look and feel good
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.
there's also react native and such
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
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.
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
Yeah, C# isn't my forte, so I'll concede any pedagogical points to anyone who knows it better than me, haha.
Pyqt, though that requires python
Idea for the new mod installer: save file management
then maybe with integration for rezno[R]'s analyzer
Here me out, HK except all the dialogue has no context
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 
Ooh, thanks
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
idea 2: figure out why moresaves keeps randomly not displaying all of my saves 
(but yes save management is a good idea, i'll add it to doc)
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
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
@mystic umbra thanks, I'll try that!
No problem
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
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
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
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
nice, I hope they go well!
To give you a hint about the next mod, I got the idea from Apex Legend's Sentinel sniper rifle
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
oh, that sounds like it could be pretty good!
I like the mods that experiment with different weapon types
i might be already working on that 
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
reference
oh, that looks cool! I never really thought of making apps like that in html
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
lol!
what frameworks are you planning on using for the redesign
.net 3.5 winforms, same as modinstaller
I should've replied, but I was talking to cosmic 

But on the topic of your rewrite, why don't you upgrade to like .net 5.0?
because then katie can't degrade provide constructive criticism on all my code because she can't open it 
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)
this was written at 5am last night, some things are probably stupid
thoughts on this mockup of downloads page?
(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 🙂
(fuck webapps, at least those that try to distinguish themselves as an offline gui program)
visual studio isn't a webapp, vs code is though
yes im talking about the visual studio on electron obviously
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
)
Rewrite custom knight to not be bad while you're at it 
🥴
put all that on the same screen too
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)
custom trial manager when
looking something like this
you would probably not want to hardcode that
this is just mockup central right now, i'll make it not terrible later 
but a plugin system is probably too complicated for you to program
You just gonna take that
actually yes, im not into pretending im more experienced than i am 
What gripes do you yall have about custom knight besides ig modcommon dependency and broken geo?
Might take a look at it
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
It seems that there's a setting for preloads but that just makes it so those textures don't change
if there's some way to stop customknight causing invis thk then that would be amazing 
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
that's maybe a vram issue
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 🥴
i mean, its nvidia
I think the idea is it's an issue with the software not allocating enough vram, rather than hardware
does unity have 64 bit for mac/linux and only windows gets 32bit?
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
yes
Thanks 
.done
pog
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.
Nice, thanks so how do you use it? just Install via HK mod manager?
oh this is what i use
like the code
have anything specific in mind?
or can it just be any other folder
this puts it under Team Cherry/1432
😮 that's awesome, going to test it right away.
How do I add my mod to the mod installer?
What's your mod?
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.
upload to google drive (ideally ask for it to be uploaded to the shared drive) and submit a pr to https://github.com/Ayugradow/ModInstaller to update modlinks.xml
I uploaded it to Google Drive.
Now what?
And who should I ask for it to be uploaded to the shared drive?
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)
If I do a pull request, will that add it automatically to the shared Google Drive folder as well?
no: i'd recommend uploading a zip file here containing the dll and a readme describing the mod
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.
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 
Description is shown on hovering over a mod, FullDescription shown on downloads menu.
twitch prime
current modlinks has a link to the zip, should that be in the new one as well?
yeah its at the top
yea, the api has that, but the examplemod doesnt
ah i did miss that
ah ok
apart from forgetting to add a way to download the mod, any other glaring issues/improvements? 
optional is for optional dependencies i guess?
optional already exists in modlinks, i just grandfathered it over
oh
it's for "author recommends you install these mods too"
ooh
so like I could make it so if you try to install randomizer, it suggests you also install randomapmod
damn, watch me add all of my mods to my other mods as optional :^)
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 
Grenade mod pack
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.
It’s not mine, I’m just editing jngo’s original work
Did you look into editing the ModdingApi like I said?
Yeah I'm looking at the github page you linked right now thanks, just posting here too to see if someone has more ideas.
K
Hmmm can't seem to find an easy way to change where the modding api saves the mods config and json files.
I submitted a pull request at https://github.com/Ayugradow/ModInstaller/pulls.
Anything else I should do?
Did you look in the mod class?
Do you see where the global settings path is set?
Just set it to something different based on something like what instance it is
https://github.com/fifty-six/HollowKnight.Modding/blob/master/Assembly-CSharp/Mod.cs
This one right?
Yes
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
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
middle of transition is more than 10 units above ground
hmm where is that checked for
I’d assume when the knight is spawned
is it supposed to be 10 units above ground or not?
gn
HeroController.EnterScene does nothing
F
the hook runs but the gate is blank and stopping it from doing anything doesnt change anything gameplaywise
Huh

F
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
just needs to be a collider on the correct layer
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
prepare for pale court spoiler

Damn, nice
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
and a mods tab for installed, repo, and details
i have no idea what cdda is, but it appears to have a big modding community
CDDA gang
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
neat
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
👀
I would start a fire in a sewer if it means no more flukemons
but flukes are so cute uwu
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
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
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
Woah woah woah what is this discussion
Fire?
Who's making fire and what are the mechanics of it
meme
Royal Zombie Coward
Unity explorer cool
woah what is this
did you use the standalone version?
nice thank you
leaked
Fun to mess around with
Also fun for positioning new rooms in the correct position in among us
Yee
Because steam
I'm always too lazy to install the console mod
Same
plus this shows the stuff in the scene too
Yeah
🤔
yeah
how
it makes the using red
at least mine does
Cool
Haven’t tried the console
fine fine I'll install your console too
easy
not like it can get worse than a 15 second loading screen
prel
ads

