#archived-modding-development
1 messages · Page 504 of 1
I like to put the 'empty' folder in the solution so it's not obfuscated, in a sense.
yea in one way that makes a lot of sense, but also that whole annoying to copy the files every time when working with different mods
clear instructions are pretty much a must tho 🥴
Yeah, I know. It's the easiest answer I've got, haha.
@copper nacelle Hey, when you have chance, could you update IKG and WeaverCore on the mod installer with this one? https://github.com/nickc01/Inferno-King-Grimm/releases/tag/v2.0.2.1
sure
trying to build the mod installer but I get 3 errors like this
why don't you just remove the mark of the web
Idk what that is 
vague memory of some video on that
so google time
*firefox time
oh that is very simple
hk beta moment
lol
Finally, this should have been done ages ago
should I upload the edited installer
does this one have the tls 1.2 fix
also please change the title text to modinstaller the confusion between mod manager and modinstaller is too great
pulled from whatever is in the original repo
you set me on the right path with this and I was able to make a black bar that sizes itself to cover up a game object and will move with it, all without any updates. Thank you! Here's the code if you're curious: https://gist.github.com/itsjohncs/2186ccc583e35e5437f1885dfcce973d
i learned a ton about transforms in unity by doing this (which was my only real goal) 🙂
Ayy, nice! Glad it was able to help ya out
Hey, I'm only posting this here because I saw that it was recently-ish mentioned that WeaverCore was updated-
For some reason attempting to update it on ModInstaller 1 is causing an error
I hate life
The error doesn't happen if I don't agree to update WeaverCore
Edit: I also just manually deleted WeaverCore, and attempted to reinstall it through ModInstaller, which throws the same error.
Edit 2: I also just attempted IKG, since I saw the post above mentioned both mods. It also caused the error.
fixed, probably
might take a minute to update
you were answered in #archived-modding-help
Oh
please don't spam chats with the same question
The fix worked, btw 
how’s progress, eh?
Is there a way to tell what causes boss scenes (e.g. Fungus2_15_boss or Cliffs_02_boss) to trigger? I'm pretty sure for those two it's "have mantis claw" and "have dream nail" but that's basically just from guessing and I'd like a way to actually find out if possible.
either monobehaviours are used (inspect with tools like dnspy or similar) or playmaker fsms (inspect with tools like https://github.com/nesrak1/HollowKnightFSMView/releases)
I am bad so which fsm do I want to look for?
i actually have no idea
Oh :/
i'd say open the scene in the fsm viewer and possibly search through everything that has boss or ghost in the name
The boss scene or the regular scene?
regular
OK, thanks 🙂
could be certainly possible that the regular has the boss one as a dependency and that just gets loaded in, idk
guys i cant see the hollow point pinned message
you're in the wrong channel, #archived-modding-help
Question - there are some empty boxes here in the FSM viewer, I'm guessing I have to use DNSPY to find out what should go in them. Where do I have to look in the DNSPY viewer to find out?
(This particular item is Fungus2_14 - "Shiny Item Stand-Shiny Control" - PD Bool? but I think it's fairly common)
other than the variables, the other fields are actually blank
compareTo is blank but that's because it's basically PD Bool Name == ""
Oh so I don't actually have to worry about the blank boxes?
How do you get it so it shows the more detailed text like in your image?
I guess I forgot to implement variables in the old fsm viewer, but yes those are blank because they have no value (or are empty string)
the more detailed list is in the avalonia fsm viewer
which isn't really finished, I need to do that at some point
To clarify, if you change to the variables tab, you can see PD Bool Name is hasWallJump for this fsm. Not all blank boxes are the same.
Since this is a very commonly used fsm, the first action checks if the PD Bool Name is empty (for relics and other objects governed by sceneData)
Yeah, I saw that but it seems that the more detailed view is needed to know for sure that it's the hasWallJump variable that goes in those boxes - at least when it's not obvious from the context
So I suppose this is just a case that TC used the same FSM for all shiny items rather than having a different one for each pickup?
No, that would be absurd.
There are two or three shiny items that have unique fsms because TC must make spaghetti
The rest all use this
Oh I see 
the new wip fsm viewer is here https://github.com/nesrak1/FSMViewAvalonia but there's no scene list at the moment, so you'd have to look in the old fsm viewer for the number in square brackets next to the scene name for the level### file. it shouldn't be too hard for me to add it I just haven't yet
but it should implement pretty much all fields including variable fields
poggers
and 2020.2 support
Wait should the number be in this image?
oh no I guess I didn't release the version with numbers

mine looks like this
Oh they are ordered in order? I guess that's helpful enough
yeah just give me a minute to update the new one
no release yet because I have to fix another bug with variables but this should give you the scene list https://drive.google.com/file/d/1NvnadcRZYILmQGDQnciGTtgUzR6nPAnH/view?usp=sharing

indeed it is modders
what
indeed it is apparently
Is there a guide for packaging a mod for release? I've got a folder structure of ModName.zip / hollow_knight_Data (with readme.md, changelog.md) / Managed / Mods / ModName.dll which I copied from another mod. That should be fine, right?
And with the drive down, I can just provide a github release link via modlinks.xml pull req?
don't do the folder structure shit I beg you
unless you're actually putting stuff outside of mods
but yeah just pr it
Ah, so just putting the .dll at the .zip root will work fine then?
Glad I made sure then, hah
yeah I've been trying to move mods away from the full thing because there's an attribute in modlinks which dictates where to put files and it was getting completely ignored by the installer
so if everything moves to not using it I can put it back with actual working usage
and it's just nicer anyways
Yeah, I always prefer not doing the entire structure in the zip - just wasn't sure if it was explicitly programmed in the installer or not, so that's good to know.
Didn't you say they updated the unity version it was on or something
Wasn't unity 5 released like right around then
it is a rhetorical question
wait, Particles/Additive is legacy now?
it's not that hard even if you did go down that route
if you're unable to type the words Legacy Shaders/ then be my guest
leg a sea
is tron legacy called tron legacy because they were using legacy shaders
yeah, just look at the bikes, with the lighting shader lagging behind
bro playmaker is garbage
they update transitions to use ToFsmState instead of ToState
but the copy constructors don't account for it
??
default particle still exists though
yeah i commented it out because of the shader and then it was pink
it's still there
vibing
yeah that's the one I used initially, I'll try redownloading
@tawny onyx nvm wrong person
@fair rampart is lunatic on the normal gdrive
Genocide
took like an hour
awful
in the gdrive link the /u/0 is unneccessary btw
nah, sounds suboptimal
a discord alt to upload bait posts though, that is fine
what happened with the SHA1 on some mods btw? they got shorter?
lines 301 & 315
Do we know why the GDrive was trashed in the first place? Did the owner just decide to do it to try and screw people over or somethin'?
that's true
they're an old mod
idk why they decided to trash it
first they took perms off the other old mods
very questionable
weird tbh
Does hollow knight spin up multiple threads? I've been working on a mod mostly ignoring that question... and haven't run into problems, but I don't know if there's actually races all over my codebase that I don't really know about.
That's comforting. Sounds like Unity would yell at me quite loudly if I tried to interact with it outside of the main trhead and I think most of my code paths touch unity at some point, so it's very unlikely there's races.
Thank you 🙂
I"ll continue not worrying about it
Can you write in pinned comment what it is so it's possible to see it a week down the line and not have to reask 
This probably has a very obvious answer, but I'm looking into the Eternal Ordeal. What exactly do the boxed things do? The boxes should probably extend further down, but I'm assuming it sends the "SPAWN" and "GO" commands somewhere?
I believe it sends the events to the game object the FSM is attached to? I haven't worked with FSMs too much but that's what I've guessed anyway
Ah, that makes a lot more sense.
Wait why?
because the other one got yeeted
Oh?
Alright
Oh, just saw what happened now
It's a shame but oh wekk
well
Anyways I came to ask about the updating of mods
Does the installer recognize you have an outdated version and update it?
Would it still recognize it if the dll had a new name but the zip stays?
yooo the new mod drive means I haven't doxxed myself anymore

isn't it literally on your ghub
shoot
It will recognize it’s outdated, but needs to have its hash in the mod links updated or it will always think the mod is outdated
Idk id buzzbos Name is just buzzbo, maybe i already renamed the dll before first including it
ok any tips on debuging this and stuff?
using System;
using System.Reflection;
using GlobalEnums;
using Modding;
namespace title_screen_mod
{
//Start Loading Sprites From File "title_screen"
private void loadResources()
{
Assembly _asm = Assembly.GetExecutingAssembly();
using (Stream s = _asm.GetManifestResourceStream("title_screen_mod.Resources.title_screen.png"))
{
if (s != null)
{
byte[] buffer = new byte[s.Length];
s.Read(buffer, 0, buffer.Length);
s.Dispose();
//Create texture from bytes
var tex = new Texture2D(2, 2);
tex.LoadImage(buffer, true);
// Create sprite from texture
title_screen = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
}
}
}
private int LogoId = -1;
public title_screen_mod()
{
//loadResources();
//Load Image "title_screen"
TitleLogoHelper.Initialize();
LogoId = TitleLogoHelper.AddLogo(new title_screen());
}
}
No tips on debugging, but tip on discord formatting. If you use a multi-line code block you can designate syntax highlighting. Just put the name of the lang on the first line.
namespace stuff
{
abstract class stuffy
{
void demo(thing stuff);
}
}```
Would make it much easier to read your snippet
other than a missing mod class containing the methods that should be fine
tip for your tip; cs works for csharp too because those extra 4 letters literally kill me
k
You have your stream in a 'using' and also call.Dispose() on it which is unnecessary
easier to demonstrate language name with more letters, although i did learn something new here. thanks!
i take responsibility for that
good to know
so remove s.Dispose(); and add method, got it
I'd also recommend adhering to C# naming conventions with PascalCase and such but if it's a personal project it's really just preference - good to get in the habit though if you're going to be writing a lot of C#
nah it just a personal project and I'm not working with multiplayer or anything like that so its fine
Heh, your code does scream python dev (and probably other langs) with the naming conventions. As to your original question on debugging 'this stuff', I assume you mean loading things out of the manifest stream.
You can always use a different project and reference your mod assembly and attempt to load things to test. I generally use LINQPad to test things like this quickly.
Gotem I am a python dev xD
I love me some snake wrangling every now and then. 🙂 Your code is very PEP-8.
python is diverse but it really cant handle games so I used unity and instantly fell in love with cs. And yes my python skills seem to have carried over.
also I love how Microsoft make .NET programmers feel like children, they even call LINQPad "The .NET Programmer’s Playground" 🤣
linqpad isn't by ms tho
I'm fricking dumb
It's by .NET Jesus as far as I'm concerned. Joseph Albahari is great.
Ok yeah that whole "children" thing makes a lot more sense now
So I am curious about the Eternal Ordeal: are there unique timers for each type of Zoteling in terms of spawning between a dead Zoteling and a new one? Like, I'm analyzing my EO footage and finding that Hopping/Flying Zotelings will typically spawn 3 to 4 seconds after a kill. Lankies (so far) can be from about 1.25 to 3.25 seconds after a kill, Zotelings the Mighty are around 2.5 seconds, etc.
But is there like a codified spawn timer or something that's related to total kills and spawn timers? I ask that because as I get to higher kill counts, the timings seem to get way more chaotic.
I looked at it a while ago and from what I remember zotelings don't actually die, when they reach 0 hp they "despawn" and then after a set time they "respawn"
How do you look for the scripts relevant to FSMs in dnSpy?
I have FSMView. I'm just wondering how to see the scripts relevant to controlling the variables.
Not sure, but guessing in the hutong.playermaker dll (can't remember exact name)
That and assembly-csharp.dll has most stuff in general, ime
Oh. Okay. Interesting. Are there set timers for that despawn to respawn window for each Zoteling?
looks like its 2 seconds for every zoteling
Hmm. When does that timer start because...
Wait. That's a global loop timer so it's just 2 seconds pass, check for Zote death? So like, say I kill a Zote just before the check...Is it possible to have a 4 second spawn? Like somehow the check misses one loop and then the Zote spawns in the second loop?
Any information about things like Heads, Volatiles, or Turrets? Are they special? Do they have their own cycle?
Huh. More analysis must be done on my end.
And I ask about this timer because I have...Hmm. There must be some sort of hidden indicator of when a Hopping/Flying Zoteling is coming because they are consistently showing up 3+ seconds after the previous kill/despawn.
So the trigger for a new Zoteling is not the despawn? It's just the 2-second timer.
This is what I'm talking about...Like, how can this be accounted for?
That's 3+ seconds from Kill 5 to Hopping spawn. And there's no warning like with Heavy's, Lanky's, ZoM's. Just, boop a Hopping Zoteling.
I'm looking at the code for the enemy randomizer to see if I can add an option to make the replacement enemy's HP the same as the enemy it replaces, and I'm seeing the error "The type name GameObject could not be found in the namespace UnityEngine". I added the right folder to the reference paths list so I'm not sure what the problem is.
ref unityengine.dll, unityengine.coremodule.dll,
right click on references in solution explorer, add references... , select the dll
@half sequoia screenshot
it's up top
Using Modding, Using whatever
Did you also add UnityEngine.CoreModule.dll as a reference
this is someone else's code
Not mine
no, I'm not sure why it didn't get added
@half sequoia can you answer this
Ok
Well add it then
I added it and the error hasn't gone away
Wait about 5s
ok it's gone now

all right I should be good now, thanks for the help
Thanks
And what about making a mod that includes other mods in them?
Suppose I make some bosses and then I make a mod that, among other things, includes said bosses
Can we have them removed from the installer?
remove from modlinks tmk. if you mean dependencies, look at how other mods do that
Ah, alright, good enough
And can we do the thing serecore did where it recognized the older version and replaced it?
i mean, the source code is online
@wraith bear Do you have the code for the working version of the enemy randomizer? I'm trying to add options to make the HP and Geo drops for the randomized enemies the same as for the old enemies using Kerr's repo, but that version doesn't seem to be able to load the randomizer.
Alright so about the problem I mentioned a few days and proceeded to not give any code or anything as an example
Didn't have time and sorry about that
But now
This is in the Start() of the script that alters hive knight
// Adds spikes to Leap
StartCoroutine(ShootDownSpikes());
_control.InsertMethod("Jump Antic", 0, () => { shootingDown = true; });
_control.InsertMethod("Land", 0, () => { shootingDown = false; });
you may be looking for this fork: https://github.com/Fireball248/EnemyRandomizer
And this is the Coroutine in question
IEnumerator ShootDownSpikes() {
while (true)
{
yield return new WaitForSeconds(0.08f);
if (shootingDown) SpawnHoneySpike(this.transform.position, -90);
}
}```
Now I know it's bad
But I didn't think of that at the time
And now this leads to inconsistencies in the spike spawning rate
e.g. spawning four times faster for other people
Great, thanks.
whenever U build with dotnet build I get 1236 Errors... idk why maybe its a problem with the code or the ddls...
Here is the code fr reference
using System;
using System.Reflection;
using GlobalEnums;
using Modding;
namespace title_screen_mod
{
public class : TitleMod
{
//Start Loading Sprites From File "title_screen"
private void loadResources()
{
Assembly _asm = Assembly.GetExecutingAssembly();
using (Stream s = _asm.GetManifestResourceStream("title_screen_mod.Resources.title_screen.png"))
{
if (s != null)
{
byte[] buffer = new byte[s.Length];
s.Read(buffer, 0, buffer.Length);
//Create texture from bytes
var tex = new Texture2D(2, 2);
tex.LoadImage(buffer, true);
// Create sprite from texture
title_screen = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
}
}
}
private int LogoId = -1;
public title_screen_mod()
{
//loadResources();
//Load Image "title_screen"
TitleLogoHelper.Initialize();
LogoId = TitleLogoHelper.AddLogo(new title_screen());
Log("'title_screen.png' Loaded Sucsesfully")
}
//<note> Maybe Use this function later</note>
//public override void Initialize
//{
//Log("Initializing...")
//}
}
}
just a simple mod for custom title screens gona add custom backrounds evetualy too
have you referenced the dlls
I didn't reference the ddls cuz I couldn't figure out how to do it in visual studio code but yeah think that's the problem. If you could link a tutorial or smthing then thad be cool
if doing it in vscode, i believe you need to manually add references to the .csproj file
oh makes sense
Should I change this to ".ddl" or "ddl" or smthing (in the .csproj)
<OutputType>Library</OutputType>
k
i think i should update the api docs for sfcore
dynamically linked library, iirc
So this is my .csproj and its still giving me errors. My mod is called TitleMod and the file is TitleMod.cs and here is the code for my .csproj
Okay, well, what errors? Less than before?
You could also use visual studio community and it'll sort out your references and what-not. It's not so bad, I promise...
whats the new api modding build csproj template then?
So @stuck dirge , have you followed the modding tutorial video?
It's not the best, but it gets you like 60% of the way there
ok
Hey Im new to modding. I was wondering: is there a way to change the sprites of the game without using 3rd party programms? Couldnt find any good toutorials on it so I came here.
no not that I know of
I think you'd have to use third party programs for that, unless you manually hack it in
just write your own mod to replace those sprites
Thank you 🙂 I guess Ill use third party programs. Im just a little paranoid when it comes to downloading software I dont know hehe
closest thing you can get to first-party is write your own
what are you downloading? if it's from here then it's probably safe

dont know yet probably the ModInstaller everyone uses
Unless it's 56 he's hacked all our computers to farm bitcoin, I learnt that from someone failing to use the open source downpatcher for speedrunning 
I'd say check the pins first if you want to mod
The mod installer is more for the end user
You have any suggestions then? I have 0 idea on anything 😄 I just know a little C and C++
I've never done any skin modding but hmm
I dont wanna just change the skin I just thought it was an ez thing to start with+
Thank you ❤️
This is probably one of the most helpful things for starting up at first
@potent dirge Is there a csproj template for VS Code? Or a documentation to get me started?
I wish 🥴
How do you mean? Just started with any modding in general?
related question, those api docs say to "install the Modding API from the the google drive or build it yourself" but there's no link to the source. Is it available?
ok. cool. thanks. I had found that one
It should be this one, but you probably need to go back a few commits to find the one for official versions atm
I believe this is basically being refactored to work for the beta right now, so a completely new unity and .net version
Or am I wrong?
a few is an understatement
(ok, i feel less bad about not being able to get it working then 🙂
should be like somewhere between 20 & 85 commits ago
At least 45 ago
how do I reference the Assembly-CSharp.dll in my .csproj file?
Is there a code snippet I could use?
just that the path is a relative path to your assembly csharp
Where hollow point?
#archived-modding-help it is the gun mod
Oh ok
I am going to yeet you off the face of the earth
Please do for everyone who does this in here
that's true
where does this event get sent to?
GameObject
so like, the base object or the class itself?
amazing
EventTarget GameObject according to fsmview avalonia
that is useless af
so all its saying is that it goes to some gameobject?
it goes to itself, as other fsms on the knight react to it
ok
like I was saying a few days ago, there's a "bug" where certain fields are being read but not printed, this has been fixed but the release hasn't been published yet
sick
ok cool, i've only just started messing with the fsm's and figured i probably just didn't understand something lol
yeah blame my school for giving me mountains of homework
lame 👎 thanks for the info
here's the fixes for eventtarget right now
has a few other bugs which I'm going to fix ... at some point
doing the mountains
ok now you can actually zoom, I forgot that was an issue
does anyone have the drive for the Horribly translated mod? I really wanna try it out lol
oop nvm i found it lol dissregard
using (Stream s = asm.GetManifestResourceStream("FiveKnights.StreamingAssets.hubasset1"))
{
AssetBundle ab = AssetBundle.LoadFromStream(s);
FiveKnights.preloadedGO["hubfloor"] = ab.LoadAsset<GameObject>("white_palace_floor_set_02 (16)");
}
I have the thing above and it works the first time but when I leave the scene and come back, LoadFromStream returns null
it should be possible to have the assetbundle loaded at all times, just not load the content unless necessary
so you're saying do all my LoadFromStreams at the start of the game and save them
then when I need the content, do myab.LoadAsset(blahblah)?
yes
and does the loaded asset get destroyed when the scene is changed?
if you don't dondestroyonload it yes
ok good
though that also depends in which context the loadasset is called
if it's called from the scene which changes, then yes
if it's from scene 1, then no
why are your preloaded gameobjects stringly typed
wdym by scene 1?
but that would be 5000 enums
you are unwell
but the problem is, I actually use that dictionary for nonpreloads too
really makes you wonder what could be using memory
so it's even more than that
i'm still right

as in next time I make a new mod
56 you should make the api only load signed mods
and take away salehs signing priveleges
betrayal
true
sign the modinstaller first, so people don't get the popup
well SFG didn't mention me so no betrayal there
this is the perfect case study on why having friends is bad
how do you expand a dependency tree asynchronously
glad we now know Katie's alt
i mean you should know what it is anyway, the drive has my email address
had
has or had?
the drive got deleted 
some of the folders exist anyways
why did it get deleted?
56 now has gdrive monopoly
what does this mean
kein simulator
threw it in the trash
kein did it?
no
it is a joke
feelsbadman
dargons trashed it lol
which is less funny than a dmca
qed
ok
ruined
qed indeed
a dmca would have been funny 
especially if he made a fake account to dmca as a kein imposter
rofl
who is dargons
nick
former mod
some dargons
yeah
how come I didn't know them
idk you're bad
true true
because it's true
uh huh

your mother said yes so yea huh
you are mother said what
that's so true
it's ok so long as 56 didn't have time to screenshot it, the mistake is meaningless
if he still even does that
ok good
just wait until simo lets us back into the secret chat 2
true
and we can see edits / deletes again
lmoa justs dont make typis while writin
true
damn, autocorrect did a thing
I feel so special getting my mod 'published' to the installer haha. This was my first time programming outside of school, and I very much appreciate all you guys documenting things very well and being helpful!
does this look ok
So, all the mods I've seen tend to involve modifying charms. Is it possible to add new charms(a 41st, etc,) or can they only be changed?
Thank you! You're wonderful. ^^
Will SFCore work? I've been using Mod Maker v.1 and it doesn't have SFGCore. Sorry, still really new to modding.
Does someone know how to determine ground level from the Knight's Y coordinate in debug mod?
well yes, but since the Knight is a constant height, I should be able to calculate one from the other
I'm trying to work out what the Y coordinate of the ground in various places is, so that I can measure how high objects are above it, so that I can replace them with grub jars and have them be consistently on the floor
that should be fairly easily doable
does rando not already have all the checks on the floor apart from moving shinies?
grub jars aren't subject to gravity, though
a lot of the checks actually don't start out on the floor
they start at the position of the object they replace and fall down immediately
you can actually see this happening in aspid arena room if you randomize geo rocks
you might be able to quickly grab the position of all shinies on a scene though, and so find the resting position of every shiny after going through every room in the game 
That was essentially what I suggested in #randomizer , but it was pointed out that there is possibly a problem because it would mean swapping an item twice, which is bad/inconsistent for some reason
It would mean no measuring needed though 
even if I knew how to do that, I'd have to detect when a shiny has stopped falling
kinda jank
@glass thorn in debug or are you willingly to actually mod something
you can put in a ground field into debug if you just raycast down from the knight
just throw it like here
but Physics.Raycast(HeroController.instance.transform.position, Vector3.down)
I was gonna suggest that but I was busy with other things such as getting scammed in among us mod commissions
So uhhh, just so I'm sure I'm not missing any obvious help/tutorials, https://radiance.host/apidocs/SFCore.html is the entirety of the info on making custom charms, right?
Well, aside from the section that lists the charm numbers on the left.
Oh... oh gosh. I feel like such an idiot. SFCore is just for adding them to the list, correct? Of charms you can have access to? Not for building them?
is the charm like, a class or something?
A bit late but why not compare the y coord of the knight to the y coord of a grub jar in a scene you know about? e.g. in Deepnest_31, the grub bottle has y coord 36.5 and the knight has y coord 36.4, so the location you want to place the grub bottle is the knight's y-coord, plus 0.1?
(I tested this in Mines_31 and Fungus2_20 as well, the knight was 0.2 lower in Mines_31 but I thought the bottle looked a bit higher there. Maybe that was a placebo though. It was 0.1 in Fungus2_20)
Hi I've downloaded the Asset bundle thing in pins and I've dragged it into unity, I'm not too sure what's meant to happen. Can someone tell me what I need to do to start making mods
There's some Video Tutorials, as well as a getting-started section on the api homepage
https://radiance.host/apidocs/Videos.html
Thanks
{
Assembly _asm = Assembly.GetExecutingAssembly();
using (Stream s = _asm.GetManifestResourceStream("jobChangeCharms.Resources.mage.png"))
{
if (s != null)
{
byte[] buffer = new byte[s.Length];
s.Read(buffer, 0, buffer.Length);
s.Dispose();
//Create texture from bytes
var tex = new Texture2D(2, 2);
tex.LoadImage(buffer, true);
// Create sprite from texture
testSprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
}
}
}```
So, not sure what I'm doing wrong here, but for some reason I can't get the image to load into anything. No distorted image or anything. No errors, either. I have the image(mage.png) classed as an embedded resource in the program, just not sure what else could be going wrong, as the image is still just blank. Any help would be appreciated.
The project name is HKTest1, but the class name is jobClassCharms. I've tried both methods on the 'get manifest' thing, but neither have worked.
I'm currently following 56's modding tutorial but I can't find the hollow_knight_Data folder in the Hollow Knight folder. Am I doing something wrong?
C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight\hollow_knight_Data
on windows
I'm on mac
ah then i cant help you
Ok thanks anyway
app/content/resources/managed/mods or something
Looks nice
is it possible to only load objects in an assetbundle that contain a certain substring?
I know i can use LoadAllAssets<MyType>().Where(...)
but that still loads all the assets of type MyType right?
Yea
so is there a way
or am I forced to do LoadAsset<>("String1")
LoadAsset<>("String2")
LoadAsset<>("String3")
2nd
hmm?
The loadasset vomit
alright unfortunate
Or?
Or?
Afaik there could be a listallassetnames
ohhh thanks
so do ab.GetAllAssetNames().Where(...) and do LoadAsset on that with for loop
that's much better
incredibly questionable
getAllAssetNames makes the strings lowercase
why would they do this
does it not work with the lowercase ones?
you also could check if an object is contained with AssetBundle.Contains over every string imaginable
it does but I have to look through my code and make all the strings lowercase now
So it doesnt seem to automatically destroy the loaded assets
I loaded an asset in scene A then went to scene B, and the asset was still there
you can do UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(yourObject, theSceneYouWantTheObjectIn)
i think the object is loaded into the Menu_Title scene, which doesn't get unloaded
so when you load the assetbundle, all the assets are loaded too?
afaik no, just available if needed to get loaded
but why are they in the main menu scene then
also this is an audioclip not a gameobject
maybe loadasset just places loaded assets in the first active scene? idk
like for custom scenes, you only need to load assetbundles to make the game able to load the scenes
I load the scene assetbundles in the main menu so it doesnt take the player's time everytime they want to fight the boss
is that fine?
me too
ok good
which boss
hmm? all of them
All 100?
5
lol
saleh added 5 dark souls bosses to hk
Huh
We should bring 3D models to five knittings
It’s a terrible idea, but that doesn’t mean we shouldn’t do it
That's even better, I never thought of using the Knight itself as reference instead of the floor. They're a consistent distance apart so the math still works out
is there a way to just unload the objects of the assetbundle and not the assetbundle itself
from what I understand ab.Unload() unloads the assetbundle as well
thanks
I hate unity
F
Since Unity recommended we do unload(true) once we dont need the assets anymore to avoid duplication when the player enters the scene again, does that mean I'm pretty much forced to reload the assetbundle during the game?
or could I do something like make a list of all the assets I load from the assetbundle and destroy those manually once the boss fight is over?
https://streamable.com/2mumav I'll just leave this here
I mean 56 copied me
lol
I showed this to him yesterday
and he went and did the same for the installer2
@copper nacelle yee ass
you gotta
Okay, I've tried multiple things, I can't seem to get it to work at all. I've saved an image as an embedded resource and can't seem to call it for my charm at all. I've tried using both the project name and the class name for it, nothing. I've even made sure it wasn't the image itself, used an image from another mod. As far as I can tell it should work, but it doesn't even glitch, just nothing happens, it remains an empty image. If anyone has any idea what could be causing it, I would heavily appreciate it.
does it create the sprite?
{
Assembly _asm = Assembly.GetExecutingAssembly();
using (Stream s = _asm.GetManifestResourceStream("HKTest1.Resources.mage.png"))
{
if (s != null)
{
byte[] buffer = new byte[s.Length];
s.Read(buffer, 0, buffer.Length);
s.Dispose();
//Create texture from bytes
var tex = new Texture2D(2, 2);
tex.LoadImage(buffer, true);
// Create sprite from texture
testSprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
}
}
}```
Used the code from the charm helper, as still very new and learning. I think it creates the sprite, because it's in the resources when I load it into ILSpy.
Project name is HKTest1, class name is jobChangeCharms
log after tex.loadimage
Im 🐌
LogDebug("Something to be logged as long as debug logs are enabled");
LogError("Something to be logged as long as error logs are enabled");
LogFine("Something to be logged as long as dev logs are enabled");
LogWarn("Something to be logged as long as warning logs are enabled");```
Correct?
You can also verify if the resource path is correct by calling assembly. GetManifestResourceNames and dumping the string array to the logs or something
Huh. It didn't log anything. I'm assuming that means it never even got to that point, correct?
then try nick's suggestrion to see which embedded resources are available under what name
ye
{
return Assembly.GetExecutingAssembly().GetManifestResourceNames();
}```
And
```string resourceNames = GetEmbeddedResourceNames();
Log(resourceNames);``` In the initialize, correct?
Sorry, really new and haven't done coding in years, so a lot of this is relearning and really sorry if I'm missing very obvious things.
the log in a foreach
so
foreach (var s in resourceNames)
Log(s);
and change the string in front of resourcenames to string[]
So loadResources[]; foreach (var s in resourceNames) Log(s); ?
Log(string.Join('\n', Assembly.GetExecutingAssembly().GetManifestResourceNames())
56's is also a fancy way
.... Huh. Well, now I've run into a different issue. It's not accepting 'GetManifestResourceName', even when I added the three system.runtime references I had to it. :/
... Oh gosh i'm an idiot. XD Thank you.
Sorry, I had misunderstood a prior instruction and must of deleted the s when I did it. :x
Okay!
[INFO]:[jobChangeCharms] - Initializing
[INFO]:[jobChangeCharms] - HKTest1.mage.png
[INFO]:[jobChangeCharms] - Initialized
... Wait, does that mean all I need to do is remove the 'resources' from the code and it should work?
yes
Yes
Looks like it
THAT DID IT! Thank you! Thank you so much!
Woo! So with that, I can get descriptions, names and images. ^^ Now... to code the bloody things. XD Thank you very much for all your help.
If you're planning on publishing an update, would it be possible to do something like put all installed mods above uninstalled ones, similar to how mods that need to update are placed? (That or tweak the check boxes on uninstalled mods, so that they don't have the square in them).
A lot of people seem to get confused about it and come to #modding-help , when I feel like a slight tweak on readability might help them out a bit.
||Possibly one day give it a custom icon too, so that instead of Mod Installer 1 / 2, we can ask if it's Zote or X :shroompog: ||
I can remove the square tbh
i do want to see if I can add like groups that you can swap between
Doesn’t it already have different icons? Maggot prime and Zote?
omegamaggotprime
the icon should have been elderZ
no
So, I'm obviously coding these wrong. Anyone know how to find the setups for the base charms?
setups for the base charms
if i knew what this means i could answer
Okay, so if I wanted to see how, for example, unbreakable health was coded, is there a location to find that? I've tried analyzing equipped charms, but that didn't offer much help.
different charms are coded differently, quickslash is in the attack function of HeroController, fury of the fallen is in several FSMs and methods of HeroController
Ahhhh, okay. Thank you.
in case anyone was curious, the option to keep the old enemy's HP in the enemy randomizer works, but not the option to keep the old enemy's Geo
also now the options menu in the enemy randomizer in-game is too big
but some things are in HeroController.CharmUpdate()
Thank you.
Is this better?
As far as the check box on uninstalled thing goes
can we remove (windows) from modding api? there's been a fair bit of confusion over that
that's my plan with 1.5
otherwise i break every installer
I am long sick of (windows)
can you manually change the modfield to just remove (windows) from it
so the xml still has modding api (windows) but displays modding api
exactly
nothing could be more awful
for reference, here i have some changes that i was going to make in hkmanager before school + tourney started 
cool
Soooo the windy noise on the main menu comes from an AudioSource and NOT from an atmoscue
spent an hour debugging literally nothing 
What's wrong with it being hardcoded
U should see how I did the search function
You'll hate me more than ever
I'm thinking of adding search tags
That would make it less ugly
But would require new fields to be added to modlinks
the if == "installed" was kinda pepega
Yes
I'm specially proud of that part
Couldn't do a switch case cause of capitalization
switch(search.ToUpper
That's so ugly
Tags would be better anyway
That was just to get it working
But if you're already doing that and more to installer 2
Why should I bother
dw nobody will ever use installer2
Less work for me
They will when we use the auto update functionality of installer 1 to force upgrade to installer 2
rofl
I'm all about forcing people to do what they don't want to
using a dark mode modinstaller?
SFGrenade updated his SFCore page with a ton more stuff, check it out
https://radiance.host/apidocs/SFCore.html
Oooo
now that i think about it, i should have added a just don't let 56 see this in the generic mod section
allows me to have
public class AdditionalMaps : FullSettingsMod<AmSaveSettings, AmGlobalSettings>
instead of
public class AdditionalMaps : Mod
{
public override ModSettings SaveSettings
{
get => _saveSettings;
set => _saveSettings = (AmSaveSettings) value;
}
public override ModSettings GlobalSettings
{
get => _globalSettings;
set => _globalSettings = (AmGlobalSettings) value;
}
protected AmSaveSettings_saveSettings = new AmSaveSettings();
protected Type _saveSettingsType = typeof(AmSaveSettings);
protected AmGlobalSettings_globalSettings = new AmGlobalSettings();
protected Type _globalSettingsType = typeof(AmGlobalSettings);
...
in every mod
for what god forsaken reason do you have a type field
technically unneccessary for the globalsettings
but reflection based variable name mapping to fields
what
private void OnSetPlayerIntHook(string target, int val)
{
var tmpField = Settings.GetType().GetField(target);
if (tmpField != null)
{
tmpField.SetValue(Settings, val);
}
else
{
PlayerData.instance.SetIntInternal(target, val);
}
}
but with Settings.GetType() exchanged with _saveSettingsType
Are there any example mods aside from the charm one?
might wanna check out hell mod
Looking into it now, thank you. 🙂
Woo! It worked! 😄 It had exactly what I was looking for. ^^ My mod is coming together, piece by piece. ^^
Okay, this is going to sound really dumb. But is there like... a readme file thing in visual studios? I see a lot of the mods seem to have them, not sure if that's something that is uploaded separately though and the mod manager grabs it, or something else?
you can use a text editor, create a file then just save it under .md
thats how i did it at least
if you have a github you can also create and edit it from there, then just download the MD source from there
So basically, the modmanager takes the mods from a big drive folder where all the mods are in zip files containing the mod and a readme file
So just bundle the readme into the zip when you make it and it'll be there
Btw what are you making?
A class change-ish mod. Basically i'm making special charms that, when equipped, will amplify other mods. For example, the shaman snail charm will amplify soul charms, the mantis lord amplifies nail charms, the bee knight amplifies attacks in the air and certain charms that fit that thematic, the beetle soldier charm amplifies defensive charms. Not sure what I'll have the weaver charm amplify yet.
I was surprised how easy it was to make it so your damage increases while in the air. XD
I really like the charm system, but I really wanted to do more with it. And I imagine this mod will be somewhat broken(but what mod isn't?) But I also think it'll be a lot of fun.
You could try giving each charm an area to debuff as well.
Oh, I am.
But yeah, balance has gotta be ahrd.
Mantis: No soul regen from attacks, reduces spell damage by half.
Snail: Reduces nail damage by half.
mantis charm rewarding meticulous damage avoidance = v good
Ayes.
Mantis I'm making a kind of like... 'Flurry warrior'. Go go go go! Cut, slash, attack, GO!
So somewhat passive healing(depending on how many hits you make), but requires you to get in there and be aggressive. Bee bee aggressive... Had to. I am sorry.
I'm also thinking I may try to do something with like... journal entries for them? 'You have bested this many foes, your strength only grows' and critical damage things. Not sure yet, though.
Ah, very nice
I've only been doing it for two days, though, so like... it'll likely be a while.
I have big ideas for a new charm system plus two more item systems but they'll be in the far future if I even have enough ideas
If you'd like, I could show you what I have working at the moment, though it's not much.
Sure :D
Names.
Descs.
Player starts with them on new game.
Images(will need to make some later, but the placeholders load).
In progress:
When 2+ class charms are equipped, player is considered overloaded.
==========================
Tribes:
Snail shaman:
Gives 3 soul a second.
Reduces nail damage by half.
In progress:
==========================
Mantis lord:
Increases nail damage by 33%.
Reduces spell damage by half.
Reduces base soul gain from attacks to 0.
In progress:
==========================
Beetle warrior:
Grants 1 mask.
If equipped with fragile/unbreakable health, gives an additional 2 masks(total of 5).
In progress:
==========================
Bee knight:
Increases damage of all attacks while in the air by 33%.
Doubles soul gain from aerial attacks.
Gives 3 soul a second while wearing the hiveblood charm.
In progress:
==========================
Moth seer:
TBA
In progress:
==========================
Weaver spinner:
TBA
In progress:```
I decided this morning to make the documentation so I could remember WTF I was doing/trying to do. XD
.... And BF just suggested one i'll have to see if I can do. 'On parry, get a blue mask'.
Increases damage of all attacks while in the air by 33%.
Doubles soul gain from aerial attacks.
Gives 3 soul a second while wearing the hiveblood charm.
Holy *
That's overpowered
Oh definitely. XD I'm still testing/experimenting with everything and seeing what I can do before I dial it in.
Numbers are higher, at the moment, as the bigger numbers are easier to see the effect when I load up the test character to try them out.
Currently trying to figure out how to 'count' the charms equipped. Like, the obvious answer would be 'Make a thing that checks if X is equipped and increment variable by 1' then at the end add them all together to see how many of them are equipped. But that seems like an excessive solution when I'm suspecting there's a way to count how many statements return 'true'. XD
Check the equipped charms list in Playerdata
Just get the length of it
Oh, right. Should have been more clear. I need to count how many of these charms in particular are equipped.
Tried using int charmsEquipped = equippedCharms().Count(true);, but doesn't seem to draw from the list at the beginning of the mod, so working on that.
Are you trying to get stuff from the list in initialize?
From ModSettings.
{
// Better charms, insert default values here
public List<bool> gotCharms = new List<bool>() { true, true, true, true, true, true };
public List<bool> newCharms = new List<bool>() { false, false, false, false, false, false };
public List<bool> equippedCharms = new List<bool>() { false, false, false, false, false, false };
public List<int> charmCosts = new List<int>() { 1, 1, 1, 1, 1, 1 };
public List<int> charmIDs = new List<int>() { 41, 42, 43, 44, 45, 46 };
}``` This.
I meant charms from Playerdata
Oh, I know. I meant my original iteration. Is there a way to count the charm list and set it to only count the mods added?
Wdym
may i say that you don't need to set the charmIDs list?
Wondering about that too
I... don't even remember why I did that. I think i did it so I could ensure that they were always the right number if referenced?
The numbers change on game load depending on what mods using charm helper are on
A lot of this is duck taped and cobbled together from what I managed to sorta reverse engineer from looking over other mods, so it's definitely not in the slightest pretty.
Removed it, though.
Use (instance)CharmHelper.charmId or something
Is there a good way to get an enemy's display name if you have the enemy game object? Currently I'm going through EnemyDeathEffects.playerDataName and using that to get the name from the Journal language sheet but I'm wondering if there's an easier way.
Not that I know of really
Probably the journal entry stuff on the death effects
Search the journal entry list for something with the matching pd and get the language string from that and get the language from there
Yeah, that's what I'm currently doing, unfortunate that there isn't a better way
hardcode it lol
You can probably also make something to quickly change the pd into a language thing
Ex: KillsX
To
NameX
Where X is the name of the enemy or something
Let me check frogcore source for something like that
Actually KilledX
To
NAME_X
I'm currently doing this and it works fine - might end up putting it in a file and loading it at runtime
var journalListGO = GameCameras.instance.hudCamera.transform.Find("Inventory/Journal/Enemy List");
if (journalListGO)
{
var journalList = journalListGO.GetComponent<JournalList>();
if (journalList)
{
foreach (var entry in journalList.list)
{
var entryStats = entry.GetComponent<JournalEntryStats>();
_convoNameMap[entryStats.playerDataName] = Language.Language.Get(entryStats.GetNameConvo(), "Journal");
}
}
}
Shot in the dark: anyone know of a mod that makes the geo count smaller (up in the top left bar)?
Working on doing that and even just finding the game objects I need to mess with is taking awhile. Would be nice if someone already figured out which objects need to change.
there's a ref to it on hc or gm
HeroController.instance.geoCounter.gameObject.transform.localScale
Hmmm. Are there any mods that add an 'up dash'? Any idea how complex something like that would be?
blackmoth
thank you!
Thank you.
There's also a "celeste.dll" posted somewhere on this server, and the only thing it does is add all cardinal direction dashes afaik
oh that's super cool, i've gotta try out that mod
tying to write a program that pauses the game when you reach a certain health so that you don't just die to taking damage from multiple sources at once
but i'm kinda lost on how to exactly do that
Thank you. ❤️
Something like this in a take health hook?
var gm = GameManager.instance;
gm.StartCoroutine(gm.PauseGameToggle());
Alright, suppose I have an update for Buzzbo that fixes something that was very wrong
How do I get it back on the drive?
Shoot, can't find anything about a celeste.dll. :/ Found celeste the game, but not quite the same I expect. XD
@woeful igloo #modding-discussion message
Yooo how'd you find that so fast
skill
i remember reading the conversation and searched for "celeste momentum to hk"
afaik it adds superdashes
no hypers
but the supers are interesting since you can do midair supers with wings
Hyper dash?
yeah
And thanks Hoo. 🙂
technically you can do hypers but it's the same effect as a super
np
I love that name because I sometimes say my words outloud and so 'Thanks Hoo' sounds like 'Thanks you'.
it does haha
release it on gh and link me
sure 👌
Oh! Hey, @vocal spire ? I just wanna say, the exaltation mod has been incredibly helpful in figuring out how things work. I'm assuming you're redfrog6002.
The geo count and its children (from HeroController.geoCounter) seem to have their position fixed to the camera, but I don't think they're using a canvas because there's no CanvasRenderer (instead it has a TextMesh and MeshRenderer). I've been able to render a text mesh that follows the knight around no problem, but no matter what I do I can't seem to add something next to the geo count and get it to display. Nothing shows up at all in fact. I've been smashing at this for an hour at least, anyone have any tips that come to mind?
next to?
What I really expected to work is making an object with a textmesh and meshrenderer set up, and setting that object's transform parent to geoCounter (which is what the geo text does).
Yes, I want to place text next to the geo count
there's death counter which goes next to
that's a good tip, i suspect they just use a canvas (which I'll do if I really can't get this working, but I'm still hopeful), but i wanna check it out. do you know where the source is? Just googled hollow knight death counter mod github and similar but didn't find anything
you can dnspy it
sid said the code was ugly or something I think
could ask him anyways
Ah wait no
That was the other one
It also puts it inside the inv fwiw
😮
they did not use canvas, thank you very much for this
very intreseting, going to play with this for the next hour at least I'm sure
Is there any command/call someone can make that will automatically calculate the charms equipped/their costs and set the notches as such?
PlayerData.CalculateNotchesUsed
I am, didn't originally make the mod, just updated it to cp
Well, it has been a massive help in this process. 🙂
hey there -- i'm rather new to modding but am experienced with using C# and Unity. i was wondering if anyone was able to help out by showing me how to modify a boss?
i have some of it figured out - using Unity Ripper and creating a new scene
hmm you wouldn't want to use Utiny Ripper if you're modifying a boss.
https://radiance.host/apidocs/ explains how to get started modding hk
best way to learn to modify bosses is by looking at the source code for other mods that do
can you provide an example?
what if you wanted to add hazards to the boss arena?
https://radiance.host/apidocs/PlayMakerFSM.html
That might be helpful since it goes through an example on editing an enemy's AI
To add hazards, you preload the hazard then just instantiate it in the boss's scene
oh that doesn't sound too difficult
There's a mod that lets you add hazards and custom platforms if that's all you want to do
i was thinking of modifying attacks and adding hazards
Ah ok then.
and maybe changing boss sprites if possible
not to add new ones, just replace existing ones
yea that's definitely doable
pale champion does all those things (adds attacks, edits attacks, changes skin, and adds hazards) but it's not very well coded so idk if I should link it
are the sprites changed through code or by just replacing the spritesheet?
thanks for your help, i'll check everything out
so i don't need to use unity to change anything?
well if you want to add new stuff to the boss, creating your content in unity and exporting it with assetbundling would be helpful
but besides that, nope
@ornate rivet how do i run the fsm viewer?
run the exe?
all good
I mean you kind of can get readable with something like 3dmigoto, it just doesn't remove unity generated inline functions
same with utiny I guess although I think it's even more unreadable
and of course you can just load the compiled shader directly into the editor
3dmigoto will directly "decompile" from the dxbc and insert the correct names for the inputs
but yeah it mostly looks like that
I thought utiny already made it usable in unity
well if it doesn't, hkworldedit is proof you can load a compiled shader in the editor ok
So I was looking at the Cyclone Slash and Hit L / Hit R FSMs. And I have no idea what these are, so if anybody can shed some light on them, that would be much appreciated:
It looks to be setting the damage dealt, and seems to increase it if charm 19 is equipped
Yeah but the damage of...?
Screenshot from #archived-modding-help pins
Damage dealt by vengeful spirit I think
Evidence 1: left/right
evidence 2: it’s a spell since charm 19 boosts spells
Time to wonder about the damage values then...
Wdym
which of these are you looking at?
The one time tc has consistent naming
wait nvm, those are damages things, not setdamage things
set damage is only present on 4 pog
Nice
Oh so these are just spells and completely unrelated to Cyclone Slash... fun
1 of these should be cyclone
I think Cyclone is Hit L-nailart_damage
Okay so just some other random, similarly named things that get their damage increased by Shaman Stone... I wonder how to figure out what they are
Q Slam, Scr Heads, Q Slam 2, Scr Heads 2
so Desolate dive, howling wraiths, descending dark & abyss shriek
How did you find those?
Anyone know if there are any mods that add a 'counter' to the UI? For example, an extra resource thing/etc?
Thank you SF, you are wonderful. ❤️
just in case it's what you're looking for too, bingoui has an in-pause-menu ui too that may be worth looking at (or it may not idk
)
Oh, just trying to make something that will display a counter of where your combo is for one of the charms.
Also, does anyone know if there's a hook that activates whenever you cast a spell or when parrying? I tried going through all the hooks and I don't see any for those two.
you'd have to make your own
Thank you. 🙂
if you're already reffing modcommon I made a spell hook thing in that
I am!
OnSpellHook to be exact
Hmm. It's giving a no overload issue. What kind of response is it expecting?
I... may be misunderstanding what it's doing.
.... Wait, I think i just figured it out, doh. XD
hey so i was looking to modify the options of a RandomAudioClipTable but realized that the Option struct is defined privately. do i have to reimplement the class?
how? i know you can use getattr to set the field but don't you need to reference the type, in this case Option?
oh wait, nvm
i think i see what you're saying
just normal reflection don't use the helper because you can't specify in the generic constraint
yuuup, gotcha
Or... not. Huh.
So, if I'm reading it correctly... For the spell hook, I need to add the
ModCommon.ModCommon.OnSpellHook
And whichever function it calls needs to output a spell, correct?
Ahhhhh, got it working, there we go. 🙂
Anyone know any mods that apply things after/during a parry?
hook HeroController::NailParry
.... Wait... is... is THAT how it works?!
Oh gosh. XD I'd tried On.HeroController.NailParry and it wouldn't work at all, I thought I'd just misunderstood what it was for. :x
Huh, didn't work either. I'll figure it out. Thank you, though.
Oh, wait, I think I see my issue. Is there any documentation on calling hooks from hero controller?
no
On.HeroController.NailParry += (orig, self) => {
// whatever you want
orig(self);
};
Ohhhhh.
Okay, I think I made some good progress today on the mod. ❤️ Quite a bit since last time. I still have a while to go, but all in all pretty good I think. ^^ Thank you very much 56, Someone and SFGrenade. You've helped me a ton. ^^
np
I have a prototype mod from years ago that hooks nail parry is you still need it
I was gonna make another combat overhaul mod focused on parrying and perfect dodging, kinda like the focus mechanic in code vein
Nah, the thing I got worked. 🙂 Wonderfully. ^^
lol this happens to be exactly what i was looking for today, and i just randomly saw this message. thank you!
is there a special case in modinstaller2 that specifically looks for the modlink called "Modding API (Windows)"
because if not then there seems like there would be nothing stopping submitting a pr to remove "Windows" from modinstaller1's special case while updating modlinks
there isn't
so theoretically we can immediately be rid of the cursed "Modding API (Windows)" w/ a pr and new build of modinstaller1
if it doesn't do anything regarding the api before completing the update then yeah
cool, adding that to the list of things to do right between "schoolwork" and "all skills" 
the trick is waiting till 1.5 so I can once again violently break backwards compat
1.5 breaks backwards compat
:triumph:
if i was making any significant progress on hkmanager i'd suggest that, as it has implicit support for multiple versions and multiple lists of mods for each version, but unfortunately i've come under a lot atm and am being forced to semi-abandon it 
because it's not even for windows bro
whotf cares
me because people get confused in modding-help
modinstaller2 works on mac
modinstaller2 requires you install Modding API (Windows) to work
does it show up on the list
or linux
its on the list
I thought it was just the internal name, not the name that actually shows up on the list

I mean
every mod depends on it
amazing

or can it

