#archived-modding-development

1 messages ยท Page 135 of 1

compact sedge
#

wait nvm I found a bug

copper nacelle
#

discord please

#

Woah there! The owner of Hollow Knight has requested that Discord block any messages our mostly-accurate robo-hamsters deem to be explicit. Seems like you found one, so your message has not been sent. Please be nice.

#

cornywoker is nsfw

#

stay woke

rain cedar
#

Wow I can't post it either

flat forum
#

?

copper nacelle
#

paste the cornywoker image

rain cedar
compact sedge
#

:cornywoker:

rain cedar
#

The image you dungo

compact sedge
rain cedar
#

The image

copper nacelle
#

the actual image

compact sedge
#

lol

copper nacelle
flat forum
#

hhahaha

#

why tho?

copper nacelle
#

idk

rain cedar
#

It's explicit

copper nacelle
#

it's nsfw

compact sedge
#

invert the colors for real img

#

I wonder if you post dicks that aren't flesh colored if discord is like meh whatever

rain cedar
compact sedge
#

hey sean how banned would I be if I put shitmothst on the drive

rain cedar
#

7

flat forum
#

out of?

rain cedar
#

7

copper nacelle
#

i've only used cornywoke and happygrub

flat forum
#

...or did you?

#

VSauce theme plays

compact sedge
rain cedar
#

seanprTuce ๐Ÿ…ฑ seanprLet

copper nacelle
#

gotta get everything back on my frequently used

flat forum
#

why the hell is cryla in my frequently used?

copper nacelle
#

cause you're depressed

flat forum
#

sad part is that it's true

#

dab the sad away

copper nacelle
#

meirl

compact sedge
copper nacelle
#

my new launcher comes with a python interpreter

copper nacelle
#

unrelated

#

this is cool

compact sedge
#

holy crap it's 100+ languages

#

last I checked it was 50

copper nacelle
#

it's also alphabetic

#

so it has like

compact sedge
#

sudo apt-get install afnix algol68g aplus-fsf aspectc++ aspectj \ asymptote ats2-lang bash bc bf bison bsdgames bsh clisp clojure cmake \ cmake coffeescript dafny dc ecere-dev elixir emacs25 erlang f2c fish \ flex fp-compiler fsharp g++ gap gawk gcc gdb gdc \ generator-scripting-language genius gforth gfortran ghc ghostscript \ gnat gnu-smalltalk gnuplot gobjc golang gpt gri groff groovy guile-2.0 \ gzip haxe icont iconx intercal iverilog jasmin-sable jq ksh libgd-dev \ libpng-dev lisaac livescript llvm lua5.3 m4 make maxima minizinc mlton \ mono-devel mono-mcs mono-vbnc nasm neko nickle nim node-typescript \ nodejs ocaml octave open-cobol openjdk-8-jdk pakcs pari-gp parser3-cgi \ perl php-cli pike8.0 python r-base rakudo ratfor rc regina-rexx ruby \ ruby-mustache rustc scala scilab sed slsh spin squirrel3 swi-prolog \ tcl tcsh valac vim xsltproc yabasic yorick zoem zsh

#

from the usage guide

#

good lord

copper nacelle
#

brainfuck, blc8, and befunge all in a row

#

also yeah that's a great command

#

i like the arch one better

compact sedge
#

I couldn't get it working on arch tbh

#

because some of the aur installers for the obscure languages were broken

copper nacelle
#

oof

compact sedge
#

but that was like 2 years ago

copper nacelle
#

it has lolcode

#

wtf

#

and piet

#

ah shit

#

i erased my saves for most of my games

#

rain world somehow survived

#

hk did not

compact sedge
#

that sucks

#

did you turn off steam cloud sync

copper nacelle
#

probably

opal hearth
#

vinny's chat wants a meat mod...

compact sedge
#

is that a dumb inside joke probably?

copper nacelle
#

what's a meat mod

opal hearth
#

meat is a vinesauce meme

compact sedge
#

so yes

opal hearth
#

p much lol

copper nacelle
#

on the bright side it was only locallow that died

#

had local and roaming on my d drive

opal hearth
#

this is meat

copper nacelle
#

or not

#

had local on my d drive

#

what the fuck

opal hearth
#

hahah

#

it's some FX studio prop, somehow it became a mascot for vinny

copper nacelle
#

more like

#

no

#

delet this

opal hearth
#

but it's cute

copper nacelle
#

objectively false

copper nacelle
#

well i've got most stuff reinstalled that i actually care about

exotic venture
#

@opal hearth don't post that again in here please

dusky lion
#

ooo

opal hearth
#

alright, fair.

rain cedar
#

It wasn't even that bad though

opal hearth
#

ยฏ_(ใƒ„)_/ยฏ

stone girder
#

This game has mods?

rain cedar
#

No

exotic venture
#

no

opal hearth
#

this discord has mods

dusky lion
#

Yes it does

#

Our current mods are nth, Mystery, Conrad and Jonny

#

All of them are nice but I cannot confirm this for Conrad because I have only seen him speak once

exotic venture
#

he does bot stuff behind the scenes

stone girder
#

Hmm i didn't understand any of that

opal hearth
#

in that case, there definitely aren't mods for this game

flat forum
#

just

exotic venture
#

you asked if this game has mods despite you chatting in a channel entirely dedicated to it

flat forum
#

those are the mods, regulating the Discord

#

HK itself also has a few good mods

#

like Blackmoth

#

and Lightbringer

exotic venture
#

we memed it up since mods are also moderators

opal hearth
#

and

#

boop

exotic venture
#

it's
not that hard to grasp

flat forum
#

...or is it?
VSauce theme plays

floral furnace
#

Woah mods are moderators for short ๐Ÿค”

flat forum
#

So, yeah

#

game has a few good mods

opal hearth
#

hey, vsauce! corny, here.

rain cedar
#

๐“‚ธ

dusky lion
#

rectangle

#

confirmed

rain cedar
#

I love rectangles

dusky lion
#

Best shape

rain cedar
#

I'm gonna make a mod that turns everything into rectangles

steep sail
#

New ModInstaller won`t break my computer? Or better to use Crossroads?

#

Cause I have my Unity bullethell project and a ton of other things

rain cedar
#

I don't see why it would break anything

solemn rivet
#

the worst it can do is simply crash the installer itself

#

no harm done to the pc

copper nacelle
#

copy 300 copies of shitmodst to all folders

solemn rivet
#

I need kreygasm

floral furnace
#

shitmodst physical release when

solemn rivet
#

shitmodthst

copper nacelle
#

it's a moth with shitmodst and shitmodst coded into the dna

solemn rivet
#

the true form of the blackmothst

#

turdmothst imo

floral furnace
#

dungosthmothst

solemn rivet
young walrus
#

cancelar

solemn rivet
#

shush u

hollow pier
#

sim

solemn rivet
#

not you too ptkyr

hollow pier
#

eu tambem

copper nacelle
#

can you just make the buttons say proceed/retry/quit

solemn rivet
#

I thought about that, 56

#

dunno if I can add custom buttons easily

#

googling it rn

compact sedge
#

it should say
press sim to proceded.
press Nฤo to retry.
press Cancelar to abort and quit.

solemn rivet
hollow pier
#

press proceed to proceed
press retry to retry
press abort to abort

solemn rivet
copper nacelle
#

great

compact sedge
#

you could probably even get rid of the second line of text

#

just say Unable to download mod list.

solemn rivet
#

done

solemn rivet
#

also, I'll go back to github for hosting the binary

compact sedge
#

what about the source code

solemn rivet
#

on both

#

stackoverflow game a real nifty class that lets me change the text of the message boxes to whatever I want

#

pretty cool

pliant gazelle
#

Ok which mods are up to date atm

#

I tried to download bonfire mod but it didn't do anything

young walrus
#

use the installer

pliant gazelle
#

oh right

copper nacelle
compact sedge
#

can anyone explain why this is happening in the Player.log:

NullReferenceException: Object reference not set to an instance of an object
  at redwing.greymoth..ctor () [0x00000] in <filename unknown>:0
UnityEngine.GameObject:Internal_AddComponentWithType(Type)
UnityEngine.GameObject:AddComponent(Type)
UnityEngine.GameObject:AddComponent()
redwing.Redwing:addComponent()

when I run

GameManager.instance.gameObject.AddComponent<greymoth>();

#

greymoth is still added

rain cedar
#

At greymoth constructor

#

So look there

#

Since you probably don't actually have one of those check the MonoBehaviour one to see what could be breaking

compact sedge
#

I don't have a constructor no

solemn rivet
#

I assume greymoth is a monobehaviour

compact sedge
#

yes

#

public extern MonoBehaviour();

#

nice ctor unity

#

anyway nothing breaks

#

but it's just a weird error in Player.log

rain cedar
#

Do you have any variables declared like this?

public x = y;
#

That compiles to a constructor

compact sedge
#

ohhh

#

I bet it breaks on

private readonly float dashCooldownTime = HeroController.instance.DASH_COOLDOWN_CH;

rain cedar
#

Yeah, probably

#

Depending on when you're adding the component

solemn rivet
#

well

#

since he's adding the component to HeroController.instance itself, it shouldn't break

#

because it's already instanced at that point

rain cedar
#

That says GameManager

#

Dungo

compact sedge
#

yeah that fixed it

solemn rivet
#

so it does

#

my bad

compact sedge
#

anyway I guess I'll update two of my mods on the drive since I fixed some stuff in them and then start working on my component

#

cool fixes are live

compact sedge
#

the infinite intelligence rider just generated this 4000 IQ code for me:

return errorCode != 0 ? errorCode : 0;

leaden hedge
#

hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

#

big brain

#

I think we can optimize that

short i = 0;
while(i != errorCode)
    i++;
return (int)(i == 0 ? 0 : i);
#

i hope your error codes can't be negative

#

or else we are going to be waiting for a long time hollowface

#

well not for a result but for the correct one intenseface

rain cedar
#

Make i a short to decrease potential waiting time

#

Optimized

leaden hedge
#

we'd have to make it a != instead of <

#

but yeah

#

a byte would be even more optimal

rain cedar
#

Byte has too little range

#

What if he wants 257 error codes?

leaden hedge
#

but we might run into issues if we need more than 255 errors

rain cedar
#

Right we're not counting 0

leaden hedge
#

I assume 0 would be no error

#

fixed the code

#

its perfect now

#

the only way to optimize it further would be to do

switch(errorCode){
    case 0:    return 0;
    case 1:    return 1;
    //etc
}
rain cedar
#

Do you need an explicit cast for short -> int? I would expect only the other way around

leaden hedge
#

apparently short does have an implicit to int

#

aswell as long, float, double and decimal

rain cedar
#

Makes sense

compact sedge
#

is caching fsms and fsm states in a dictionary faster than than using Fsm.GetState and FSMUtility.LocateFSM?

#

I wanna say yes but possibly no because IIRC dictionaries aren't that fast

leaden hedge
#

I guess if I wanted to meme I could do int.TryParse((i == 0 ? 0 : i).toString());

compact sedge
#

sorry for once I'm working on code that isn't mine and I'm worried about writing shit code

leaden hedge
#

dictionaries shouldn't be that slow

rain cedar
#

Dictionaries are slow if you use ContainsKey instead of TryGetValue

compact sedge
#

neither should LocateFSM tho

leaden hedge
#

locateFSM is just a list iirc

compact sedge
#

why is ContainsKey slower than TryGetValue

leaden hedge
#

oh it actually generates a list when you use it

rain cedar
#

Because ContainsKey runs pretty much the same thing as TryGetValue

#

But doesn't return the value

leaden hedge
#
    static FSMUtility()
    {
        FSMUtility.fsmListPool = new List<List<PlayMakerFSM>>();
    }
#

yes my favourite type of list

#

a list of lists

compact sedge
#

oh so something like

if (!cachedFSMStates.TryGetValue(stateName, out FsmState outVal))
            {
                cachedFSMStates[stateName] = myFSM.Fsm.GetState(stateName);
            }
            else
            {
                return outVal;
            }
            return cachedFSMStates[stateName];

is faster than

if (!cachedFSMStates.ContainsKey(stateName))
            {
                cachedFSMStates[stateName] = myFSM.Fsm.GetState(stateName);
            }
            return cachedFSMStates[stateName];

then?

#

wait I could optimize the first one more

rain cedar
#
public bool TryGetValue(TKey key, out TValue value)
{
    int num = this.FindEntry(key);
    if (num >= 0)
    {
        value = this.entries[num].value;
        return true;
    }
    value = default(TValue);
    return false;
}

public bool ContainsKey(TKey key)
{
    return this.FindEntry(key) >= 0;
}```
compact sedge
#
            FsmState outVal;
            if (cachedFSMStates.TryGetValue(stateName, out outVal)) return outVal;
            
            outVal = _getOrCacheFSM(fsmName).Fsm.GetState(stateName);
            cachedFSMStates[stateName] = outVal
            return outVal;
copper nacelle
#

imo x.TryGetValue(u, out z) ? z : x[u] = fsm.getstuff()

leaden hedge
#

I doubt a dictionary is worth it for states

#

or getting fsms off an object

compact sedge
#

what's the O of accessing an arbitrary part of a dictionary?

leaden hedge
#

unless you're getting the states from the same fsm hundreds of times

#

O(1)

compact sedge
#

oh hell yeah

#

no I'm totally using a dict then

leaden hedge
#

both insertion and search should be O(1) for hashtables

#

which is what csharp dicts are

rain cedar
#

Very large dictionaries can be less efficient because of hash overlap

compact sedge
#

that beats the heck out of a list, right?

#

wait

rain cedar
#

That's not really relevant ever though

compact sedge
#

hold up how small are the hashes that they can overlap

rain cedar
#

Realistically they can't

#

32 bit pretty sure

compact sedge
#

if they do does it return the wrong value

leaden hedge
#

no

#

they usually point to a list

rain cedar
#

They've got an array for each hash

leaden hedge
#

and then it just actually iterates over the list to check for the one that actually matches

#

which if its just one item is obviously correct

rain cedar
#

It looks like they do a check on the item's key even if its the only one

#

So that's a bit of redundancy

compact sedge
#

man they could just use 64 bit hashes and not have to deal with the list

leaden hedge
#

that'd also increase the size of the table

#

and it'd still have hash collision

#

itd just be even more unlikely

compact sedge
#

you'd need on the order of millions of elements to get hash collision at the rate of hundreds of elements for a regular sized table and it wouldn't be any slower on 99% of machines.

rain cedar
#

It only takes two to collide if you're really unlucky

leaden hedge
#

and you only need like 2,000,000,000 elements for a normal 32bit hash to collide

#

regular amount of items I'm putting into my hashtables

compact sedge
#

ok so lets see.

the collision rate for X elements is approximately

1 - e ^ ( - x^2 / (size of hash * 2)) according to wikipedia

#

let me get out python real quick

leaden hedge
compact sedge
#

you'd expect a 70% chance of having 1 collision with 100k elements with effectively randomly picked and evenly distributed hashes with a 32 bit size.

#

with 64 bit

#

that drops to 2.7 * 10 ^-10

rain cedar
#

It looks like C# dictionaries actually do break if there's a collision

compact sedge
#

100 million elements in a 64 bit table still only gives you a 0.000271 chance of collision

rain cedar
#
for (int i = this.buckets[num2]; i >= 0; i = this.entries[i].next)
{
    if (this.entries[i].hashCode == num && this.comparer.Equals(this.entries[i].key, key))
    {
        if (add)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
        }
        this.entries[i].value = value;
        this.version++;
        return;
    }
    num3++;
}```
compact sedge
#

that's about 0.027% I think

leaden hedge
#

you have a 0% chance, if you have a fixed list when you make your dict

compact sedge
#

good to know

leaden hedge
#

I dunno if csharp actually uses a perfect hash in this case

compact sedge
#

but yeah now I know to use gperf

leaden hedge
#

you'd probably have to tell it to do so

compact sedge
#

thanks for telling me about it

#

idc I am probably having 30 elements max

#

maybe a little bit more

rain cedar
#

It's randomizing its hash maker if there's over 100 elements

leaden hedge
#

but if for whatever reason you did want to hash max_int elements

compact sedge
#

I definitely don't have the ram for that

rain cedar
#

Maybe instead of RAM disk you can go the other way and turn a hard drive into the world's slowest RAM

compact sedge
#

...swap space?

rain cedar
#

I'm talking about actually tricking your OS into thinking a hard drive is RAM so you can run a program that uses a dictionary with billions of elements

compact sedge
#

no need

#

linux swap space does that

leaden hedge
#

you could just write a program that reads and writes to files ๐Ÿค”

compact sedge
#

as far as userland programs are concerned

#

swap is ram

#

like you can explicitly check to tell them apart but by default stuff will just run without caring if it's on either

leaden hedge
#

can I make swap space executable

#

and can I put linux in swap space

compact sedge
#

executing commands from swap

#

would require some serious hardware hackery

#

like telling your cpu to read instructions from swap space

#

and write data to swap space

#

but sure nothing's stopping you

leaden hedge
#

sounds good

#

I mean you could do that in windows

#

it'd just be slow

compact sedge
#

no I meant directly

#

like cpu ignores ram completely

#

might require some silly rewiring to get that working

#

Anyway uh... does ModCommon have some version of PlayMakerFSMExtensions?

#

I need to get an action of a certain type from an FsmState

copper nacelle
#

I added fsmutil to the newest version

#

idk if I put it on the drive

compact sedge
#

does fsmutil have a getstate

copper nacelle
#

yes

compact sedge
#

ok

#

you know what's gross

leaden hedge
#

can I runtime detour my entire harddrive in linux intenseface

compact sedge
#

we have FsmUtility
FSMUtility
and
FsmUtil

#

wtf

copper nacelle
#

big meme

leaden hedge
#

yeah well

#

FSMUtility is playmaker

copper nacelle
#

next one will be FSmUtil

leaden hedge
#

FsmUtility is tc

#

so we can't use those

#

FsmUtil it is

compact sedge
#

ok so why the fuck is FsmUtil named FsmUtil when FsmUtility and FSMUtility already existed

#

why

copper nacelle
#

what else would you call it

leaden hedge
#

FSMUtility2

copper nacelle
leaden hedge
#

I guess you could have made it just extension methods

#

as its just a bunch of static functions

copper nacelle
#

I made it extension methods

compact sedge
#

oh it is cool

copper nacelle
#

added another class in the file which is just a bunch of extensions that do the FsmUtil functions

compact sedge
#

ok 56 what's the clean way to have one function call another one with a default arg

copper nacelle
#

dunq

compact sedge
#

like
void f1(int meme)

void f1() {
f1(0);
}

#

but cleaner

#

and less shit

copper nacelle
#

void F1(int meme=0) { stuff }

leaden hedge
#

cant you just do optionals

copper nacelle
#

yeah

compact sedge
#

oh cool

#

that works

leaden hedge
#
public f1(int x = 0){
}

public f0{
    f1();
}
copper nacelle
#

imo public f0() => f1();

leaden hedge
#

imo Func<void, int> fX = f0() => f1();

compact sedge
#

ugh dumb optionals are way cleaner

#

me gettin memed on again

#

sorry kinda struggling on getting some meme math working

leaden hedge
#

I don't really like optionals though

#

you can do

public f1() : this(0){
}
public f1(int x){
}
public f0{
    f1();
}
#

although I dunno if that works with functions

compact sedge
#

perfect

leaden hedge
#

although you can probably do : f1(0)

copper nacelle
#

what's the : thing

leaden hedge
#

calls another function

copper nacelle
#

o

leaden hedge
#

its used in ctors to call a basic one

rain cedar
#

Doesn't like that with non-constructors

leaden hedge
#

weird I've never tried it on non-constructors, assumed it'd work lol

#

apparently not

compact sedge
#

should I be throwing exceptions when stuff goes wrong?

#

like for example:

            Wait waitState = _getOrCacheFSMWait(inputData.FSMStateName, inputData.FSMName);
            if (waitState == null)
            {
                throw new System.ArgumentNullException("No Wait Action found in the FSM " + inputData.FSMName + " with state " + inputData.FSMStateName);
            }
#

or should I just silently fail
or should I do errors another way

rain cedar
#

Probably if the error is because the coder has done something wrong it's good to throw

#

Otherwise nah

#

I'm not your teacher you don't have to write me an essay

compact sedge
#

ok

#

so here's the errors that can happen right now as far as I'm aware:

  1. the modder is trying to access a nonexistent FSM, nonexistent FSM state, or an FSM state without a wait. Or they're trying to access a nonexistent animation clip

  2. the gameobject that the class is on lacks a tk2dSpriteAnimator / HealthManager, and the user hasn't manually set these fields to... say a separate gameobject which does have such components

  3. the modder's numbers will set the animation speed to <= 0, or wait time to infinity or <= 0.

I'm thinking exception on all 3, what do you think?

rain cedar
#

Makes sense to me

floral furnace
#
public void Start()
        {
            Stamina.curStamina = 100;
            StartCoroutine(InitializeFSM());
        }

        private IEnumerator InitializeFSM()
        {
            while (GameManager.instance == null || HeroController.instance == null)
            {
                yield return null;
            }

            StartFSMBullShit();
        }

        public void StartFSMBullShit()
        {
            HeroController.instance.spellControl.AddAction("Fireball 1", new CallMethod
            {
                behaviour = GameManager.instance.GetComponent<StaminaUI>(),
                methodName = "OnFireball",
                parameters = new FsmVar[0],
                everyFrame = false
            });
        }

        public void OnFireball()
        {
            Stamina.curStamina -= 30;
        }

ey Angle this doesnt seem to work for some reason, could it be cuz of the wrong State name?

compact sedge
#

can you put a log in OnFireball

rain cedar
#

Also put a try catch around StartFSMBullShit

#

It's being run from a coroutine so it'll silently die if something is wrong

compact sedge
#

not quite Player.log

#

should have

#

the exception

#

right?

#

well whatever Player.log is called on windows

rain cedar
#

Probably

compact sedge
#

you could check that file. although I gotta say having both Player.log and ModLog.txt in the same folder is super nice

rain cedar
#

Log doesn't show up unless it crashes as far as I'm aware

floral furnace
#

aight ill try those

compact sedge
#

Player.log for me is like dnspy for y'all

#

just saying

#

actually it's not actually that useful but it is one of my more used tools

#

in my toolkit of like 5 tools that I actively use for debugging

floral furnace
#
public void StartFSMBullShit()
        {
            try
            {
                HeroController.instance.spellControl.AddAction("Fireball 1", new CallMethod
                {
                    behaviour = GameManager.instance.GetComponent<StaminaUI>(),
                    methodName = "OnCast",
                    parameters = new FsmVar[0],
                    everyFrame = false
                });
                Modding.Logger.Log("Initialization is successful");
            }
            catch
            {
                Modding.Logger.Log("Error initializing");
            }
        }

public void OnCast()
        {
            Stamina.curStamina -= 30;
            Modding.Logger.Log("CASTING");
        }

I seem to be getting "Initialization is succesful" on start of the save, but using vengeful doesnt trigger the "CASTING"

compact sedge
#

are you sure that Fireball 1 is actually called

#

and not say Fireball 2

floral furnace
#

yeah tahts what im thinking

compact sedge
#

or another thing

floral furnace
#

but no im not using shade soul

compact sedge
#

maybe there's a Fireball Antic that works with both

#

idk

floral furnace
#

yeah ill check maybe the state name is wrong

compact sedge
#

I haven't looked into the spell FSM too much unfortunately

floral furnace
#

fireball antic works

#

checked the fsm states

compact sedge
#

ok

floral furnace
#

theres a statename called "Fireball Antic" used it and casting now reduces my stamina

compact sedge
#

well now you can put like whatever code you want in OnCast

#

have fun

#

and try not to break stuff too much

floral furnace
#

me? not breaking stuff? you know thats impossible right

ornate rivet
#

has KDT updated his hk mod tutorial?

copper nacelle
#

last time it was committed to was June 25th

ornate rivet
#

yea I saw

flat forum
#

Yeah

#

They broke

ornate rivet
#

is there a recommended mod I should look at if I am trying to learn?

flat forum
#

Uhh

#

Ok

#

Sure

#

I used it

slate igloo
#

Is there a multiplayer mod?

copper nacelle
#

dreamshield co op

#

1.2.2.1 only

#

downpatch

slate igloo
#

that dosnt count

#

and thats the first thing that comes up when u google hk multiplayer

copper nacelle
#

so no

flat forum
#

didn't AA say they wanted to make a local multiplayer-esque thing at some point in the future

young walrus
#

yeah but that was also not a true multiplayer

#

it would be similar to what dream shield co-op does

copper nacelle
#

but with gchild

flat forum
#

Was it not for Redwing?

#

huh

#

misunderstood

copper nacelle
#

might've been redwing

#

probably was

flat forum
#

ok then, no Multiplayer for HK

young walrus
#

multiplayer for HK would basically be making a whole new game

#

aka.... won't happen

flat forum
#

mmyeah

#

shouldn't a local multiplayer be possible to make as a mod?

young walrus
#

not with separate characters

#

that's a huge overhaul to..... everything

flat forum
#

Ok

young walrus
#

it's possible

#

but you'd have to rewrite the collision detection systems, trigger systems, player control systems.... etc etc etc

#

so it's basically a game re-write

flat forum
#

just make the 2 be able to touch each other

#

?

#

so, no changes to collision detection systems regarding them

copper nacelle
#

big think

flat forum
#

trigger systems work whenever one gets to the trigger and the other gets teleported to it

young walrus
#

yeah. simple in theory. but making that happen.... not easy

#

adding a completely new player character is a huge undertaking in itself

flat forum
#

Mmmyeah

#

wait, didn't KDT half-make a mod with a new character in it?

young walrus
#

with a new enemy

flat forum
#

that pixelated girl with a sword that dealt 2 damage

solemn rivet
#

enemy โ‰  pc

young walrus
#

^

flat forum
#

^

solemn rivet
#

you don't have to deal with input handling for a new enemy

#

or camera

#

or inventory

#

or anything

#

just ai and movement, basically

buoyant obsidian
#

Lightbringer is currently 100% functional through the mod installer right?

solemn rivet
#

Yup

copper nacelle
#

yes

ornate rivet
#

How do you stop the player from attacking, I thought it was this:
HeroController.instance.cState.attacking = false

flat forum
#

uhh

ornate rivet
#

ik what I did was probably super stupid, just tell me pls

#

Was what I said that stupid?

flat forum
#

I am honestly not sure, ask someone who actually knows how to code

solemn rivet
#

Not much

flat forum
#

but it looks logical

solemn rivet
#

Just force CanAttack to return false

copper nacelle
#

^

ornate rivet
#

ok thanks

copper nacelle
#

or just set one of the vars it checks

#

cause iirc it's some really long thing like return x && y && z && !adfa && huafhdsksadf && adksjfhakdjsf && !hkadsjfhaksdf

ornate rivet
#

shouldn't it just be HeroController.instance.canAttack?

#

because that doesnt exist

#

but canFocus and etc. exist

#

there's even a canBackDash ffs

copper nacelle
#

CanAttack

#

method

#

imo

ornate rivet
copper nacelle
#

yeah

#

just set attack cooldown to -1

ornate rivet
#

ok thank you

solemn rivet
#

Or set cState.attacking to true

#

Since you can't attack if you're already attacking

ornate rivet
#

OH

#

that's why that wasnt working

#

I was setting it to false

copper nacelle
ornate rivet
#

that's kind of confusing

compact sedge
#

@flat forum If I do multiplayer it will be local only because I have no idea how to do networking and it's far beyond my skill level. If I do multiplayer the idea was gonna be like how the multiplayer is in super mario galaxy where one player is from the perspective of the camera (and uses the mouse to aim and shoot attacks) and the other controls the player. It's still a huge if though and if I do do it it will probably not be for a long while.

#

and definitely if you want multiplayer I highly recommend not waiting for me. do it yourself... it will give me more code to steal

ornate rivet
#

if you want to change a method, would you use override?

copper nacelle
#

what method

ornate rivet
#

any method

#

like canfocus

copper nacelle
#

monomod hooks

compact sedge
#

monomod hooks is a way to do it... assuming canfocus is done in a method and not a fsm state

copper nacelle
#

did you know you don't need the 8mb dll

#

did you know you don't need the 8mb dll

#

you just need the 50kb runtimedetour dll

#

and you can make detours yourself

#

it's like new Detour(oldMethodInfo, newMethodInfo)

#

iirc

ornate rivet
#

wat

#

I assume that was to Angle

compact sedge
#

modcommon should just use a runtimedetour dll imo

copper nacelle
#

more of a pain tho

#

new Detour < method.hook

ornate rivet
#

thanks btw

compact sedge
#

Anyway if it's done in an fsm state IDK the best way to do it but you could

  1. remove the check
  2. add a custom method to that fsm state
  3. have that method set the fsm state based on the result of that check
#

so like in that method you could have something like:

if (meme > 50) {
    fsm.SetState("focus");
    meme -= 50;
}
else {
    fsm.SetState("init");
}```
ornate rivet
#

ok thank you

tranquil glen
#

someone should port debug and all of its features to 1.0.2.8 just for me so i can route low nail swings % easier hollowdab

#

/s if that wasn't obvious

#

but if sean or someone could add noclip to the mini-debug he made that would be greatly appreciated

#

I don't know if that's available anywhere or if only he has it

rain cedar
#

But it has that

#

q

tranquil glen
#

it does?

#

oh sorry

compact sedge
#

it's in the cheats section

rain cedar
#

Wow nice reading comprehension

tranquil glen
#

reading what?

compact sedge
#

hey could you add the ability to spawn any arbitrary enemy into debug mod?

rain cedar
#

Not you, Krythom

compact sedge
#

I saw this awesome video from the worlds greatest youtuber

rain cedar
#

Sure sounds great to have another mod that runs out of memory all the time

compact sedge
#

add arbitrary enemy button but every time you press it it loads every single level

rain cedar
#

Could actually do it in a not terrible way

compact sedge
#

shh

rain cedar
#

Load only the single level that enemy is in

compact sedge
#

there's one problem with loading arbitrary levels like that

#

it can mess with the current level

#

although maybe there's an easy solution to that problem idk

rain cedar
#

Easy I'll just cache the entire game state and refresh itnoot

compact sedge
#

but like for example loading dirtmouth while in dirtmouth for some reason would super mess up the camera while in dirtmouth which was a bug in infinite grimm for a while

#

and that's just loading the current level I couldn't imagine loading a different level

rain cedar
#

I just logged all the components on the knight

#

What a mistake

#

128 FSM

#

Ok I logged twice on accident but 64 is still bad

compact sedge
#

25516 lines

#

for my knight dump

wraith basin
#

Is there any save file right before NKG Grimm
I want to fight him again
preferably with max masks + nail and charms
or is there a mod that lets you fight NKG again

void tree
wraith basin
#

got it but how do I use it on a mac?

#

I know where to add save files and stuff but are Mac and windows save files the same

#

I don't want to screw anything with the game

exotic venture
#

yes

#

~/Library/Application Support/unity.Team Cherry.Hollow Knight/

river eagle
#

You can't screw up your other saves by loading saves

exotic venture
#

you change the name to the slot you want it to take up

#

so user1 to user4 with their respective slots

wraith basin
#

kk

#

thank you everyone!

scenic slate
#

I am having conflict, I wanna play the boss rush mod but Id have to down grade my game and Im too lazy for that shit

rain cedar
#

Option 3) Make it work on lifeblood

#

It probably isn't even all that broken

scenic slate
#

my attention span is too short to learn how to fix a mod\

rain cedar
#

I'll do it for $10

#

Bet it just needs the HealthManager stuff to be added

scenic slate
exotic venture
#

to downpatch your game it's one drag and drop and one console command

#

it's

#

not that hard to do

scenic slate
#

nah dude way too much inteligence required, I am very low IQ bean

young walrus
#

Guess you're waiting for GnG

copper nacelle
#

๐Ÿ…ฑoi

rain cedar
#

b๐Ÿ…ฑi

exotic venture
#

๐Ÿ…ฑ๐Ÿ…ฑi

solemn rivet
#

b๐Ÿ…ฑ๐Ÿ…ฑ

hollow pier
scenic slate
#

๐Ÿ…ฑ ๐Ÿ…ฑ ๐Ÿ…ฑ

compact sedge
#

tfw u write 300 lines of fairly weird untested code and for a few brief moments there's the slight chance it actually works

half carbon
#

It never works. If it works something is wrong

compact sedge
#

actually... the problem is actually testing it

#

time to put it on grimm or something

#

it's beautiful code... if it's functional

#

but testing if it's functional is gonna take me like 30 minutes to set something up

copper nacelle
compact sedge
#

"NullReferenceException: Object reference not set to an instance of an object at ModCommon.CustomEnemy._getOrCacheFSMWait (System.String stateName, System.String fsmName, Int32 waitIndex) [0x00000] in <filename unknown>:0 at ModCommon.CustomEnemy.AddWaitData (WaitData inputData) [0x00000] in <filename unknown>:0 at infinitegrimm.infinite_grimm_modern.Reset (Scene from, Scene to) [0x00000] in <filename unknown>:0 "

#

worth a shot tho

#

oh it gets better... apparently in 1.3.3.7 Grimm's fsm was changed in the tent so my custom conversation text no longer works

#

he just says "oh it was you who called us"

and then disappears as normal

so I guess the fsm is the same but either the text name or the sheet name is different

copper nacelle
#

that's why you don't use beta

compact sedge
#

I know what you're thinking

#

and this is actually a really shitty spot to use reflection

#

since I can just add my strings to the dictionary multiple times

#

oh I know why

#

private void Start()

#

isn't run when the object is constructed.

#

right?

#

when is that function run

copper nacelle
compact sedge
#

well it actually worked this time but...

NullReferenceException: No Wait Action found on the FSM Control in state Slash Antic

#

but

#

wai

#

/waj/

#

no offense but.. does GetAction actually work?

#

I've never tried it before

#

uh yeah

copper nacelle
#

yes

#

it's like

#

half of my code

compact sedge
#

so uh what do I pass as the index

#

because I passed 0

leaden hedge
#

well that doesn't mean anything

compact sedge
#

and it didn't work

copper nacelle
#

the index

compact sedge
#

the index of the object

#

so I have to know which order the things are in

#

beforehand?

copper nacelle
#

yes

compact sedge
#

oh

#

that's lame

copper nacelle
#

I mean if you want you could get firstordefault of actions filtered by is

compact sedge
#

any way to get the FIRST action of a certain type in a state of a certain name not knowing its position?

copper nacelle
#

boi that's what I just said

compact sedge
#

ok help me out here what do I put for the code

leaden hedge
#
foreach(FsmStateAction action in FsmState.Actions){
    if( action.Name == name )
        return action

๐Ÿค”

#

although I think you need to do TypeOf(action)

copper nacelle
#

x.GetState("ur mum").Actions.FirstOrDefault(x => x.name == name)

#

or like

compact sedge
#

is there any existing code to get it?

copper nacelle
#

for the first wait

#

x.GetState("ur mum").Actions.FirstOrDefault(x => x is Wait)

compact sedge
#

like this?

outVal = (Wait) myState.Actions.FirstOrDefault(wait => wait is Wait);

copper nacelle
#

yes

compact sedge
#

if there's no wait will it set it to null

#

because that's what I want, or at least expect

copper nacelle
#

yes

#

you can have it throw an exception instead with just First I think

compact sedge
#

nah I'm throwing the exception in a different class that's public

#

ok so it failed to throw an exception. what do I do about this?

#

"TypeLoadException: Could not load type 'System.IO.InvalidDataException' from assembly 'ModCommon'."

#

I'll just rename it to "Exception"

copper nacelle
#

wot

#

it's just linq

compact sedge
#

CustomEnemy is almost done (yes renaming it to "Exception" actually fixed it, guess Unity doesn't have all the exceptions in it)!

#

then I just have to make InfiniteEnemy which literally just extends CustomEnemy and adds infiniteness. Also gotta add stun control support.

#

besides your FsmUtil not working the way I thought it did, it works pretty well for being 300 lines of weird code.

#

anyway... let's just say making custom enemies is gonna get really easy

#

well customizing existing enemies

#

making custom enemies is still gonna be hard

copper nacelle
#

I just added a bunch of stuff to kdt's fsm util

#

and made some stuff linq cause linq is god

compact sedge
#

so you literally just used rider auto refactor then

copper nacelle
#

yes

#

mostly

#

removed a few logs so it'd actually do it

#

And then made everything extensions

#

and added some functions like copy state

#

and get action<t>

#

and removeanim

#

and insert action

compact sedge
#

why does it want to replace a tail recursive call with a while loop

#

a while loop that will be run, at maximum, twice because of the way I designed the "recursive" call

#

ok I decided not to do stuns because the way I had stuns done in IG relied on a player hook and I don't wanna do that for a component on a game object

copper nacelle
compact sedge
#

there's no nonsense way to do stuns as a component of a gameobject and StunController already exists

#

oh

#

wait

#

lol

#

nvm stuncontroller is actually a meme

copper nacelle
#

edit the stun fsm

compact sedge
#
        //TODO: add a hook for when a health manager takes a hit, for now just poll the difference in hp
        //the side effect of this is that things that damage enemies but aren't player hits may cause stuns depending on the value of ignoreDamageDeltaUnder
        private void Update()
        {
            if( healthManager.hp != previousHP && healthManager.hp < previousHP )
            {
                int damage = previousHP - healthManager.hp;
                if( damage >= ignoreDamageDeltaUnder )
                    OnHit( damage );
            }

            previousHP = healthManager.hp;
        }
copper nacelle
#

nice stun controller

compact sedge
#

here's the thing

#

the only good workaround I found for this

#

was hooking HitInstance

#

and that's lame

copper nacelle
#

edit the fsm

#

u dungo

compact sedge
#

listen here u little shit

#

fsms suck

copper nacelle
#

no u

compact sedge
#

no but like

copper nacelle
#

Add a call method to the fsm

compact sedge
#

wait

#

not the worst idea in the world

#

but

#

probably better served by a different component

#

having 1 do everything component is kinda silly imo

#

so if class A extends class B and both implement function X, A will override B's function, right?

#

like if I have this:

public class InfiniteEnemy : CustomEnemySpeed
{
private void Update()
{
    //code a
}
}
public class CustomEnemySpeed : MonoBehavior
{
private void Update()
{
    //code b
}
}```


only code a runs in a InfiniteEnemy, right?
rain cedar
#

I think it depends

compact sedge
#

time to add logs and find out

#

yes

#

it does override

#

that's what the logs say

rain cedar
#
static void Main(string[] args)
{
    B test = new B();

    test.func();
    (test as A).func();
    ((A)test).func();

    Console.ReadLine();
}

class A
{
    public void func()
    {
        Console.WriteLine("Running in A");
    }
}

class B : A
{
    public void func()
    {
        Console.WriteLine("Running in B");
    }
}```
compact sedge
#

unity tho runs it without casting it

#
[INFO]:meme A running
[INFO]:meme A running
[INFO]:meme A running
[INFO]:meme A running
[INFO]:meme A running
#

I had A : B

rain cedar
#

Unity probably runs it as the super base class MonoBehaviour

#

I should've tested that too but you already did

compact sedge
#

ok protected is cool

rain cedar
#

Yeah good keyword

#

It's weird that all the component functions just work through magic

#

Like it's not an override, you just put the functions in

#

Doesn't seem like good design

compact sedge
#

yeah

#

I don't like that they can call the orig function through casting

#

but

#

if they do that then they're a dungo who deserves every weird undefined behavior they get

#

what if

#
public new void SetEnemyMaxHealth(int health)
        {
            throw new Exception("Unable to set maximum health on an infinite enemy... silly");
        }```
#

does that override the original

#

that new keyword

rain cedar
#

Yeah that does, I think

#

I can test it

#

Nope same behaviour in my test code, just got rid of a warning

compact sedge
#

uhhh

rain cedar
#

Ok "new" on a function is just syntactical sugar to show you meant to hide the inherited member

#

It doesn't do shit

compact sedge
#

tbh everything in c# is syntactical sugar

#

on the plus side it's easy to use but some days it feels like I'm on training wheels.

rain cedar
#

Well yeah it's pretty clearly meant to be a beginner language

#

What with all the behind the scenes stuff it just does for you

compact sedge
#

well considering it's inspired by Java it's trying to be a beginner language that you can get stuck writing for 30 years if you're not careful.

rain cedar
#

Idk about Java but C# you at least have options to go past the usual allowed stuff

compact sedge
#

it is mildly useful tho to be able to call the orig

#
            if (active)
            {
                throw new Exception("Unable to set maximum health on an infinite enemy... silly");
            }
            else
            {
                CustomEnemySpeed a = (CustomEnemySpeed) this;
                a.SetEnemyMaxHealth(health);
            }
#

cuz I can do this I guess

#

probably

rain cedar
#

If you declare it as virtual in the base class you can instead do base.Whatever(stuff)

#

That's the "clean" way to do it

#

Assuming Unity will still recognize virtual functions

#

Actually you can probably use base regardless

#

I've just never thought about using it outside of overrides

compact sedge
#

I can't assign it in the constructor tho

#

so

#

also it's a "prohibited modifier"

#

virtual

rain cedar
#

Weird

compact sedge
#

I think the cops are coming for me

copper nacelle
rain cedar
#

It's not getting mad at me for using inheritance on Update

copper nacelle
#

isn't that like

#

the opposite of how polymorphism is supposed to work

#

or would A notA = new B();
notA.func() say B

rain cedar
#

I'm pretty sure it works this way in C++ too

#

And nah that says A as well

copper nacelle
#

wtf

#

is it only with overriden methods then

rain cedar
#

Looks like with overrides it always calls the highest up one yeah

#

It even says cast is redundant

#

Wow it's straight up impossible to call the base function I think

#
static void Main(string[] args)
{
    B test = new B();
    MethodInfo aFunc = typeof(A).GetMethod("func", BindingFlags.Public | BindingFlags.Instance);
    aFunc.Invoke(test, new object[0]);

    Console.ReadLine();
}

class A
{
    public virtual void func()
    {
        Console.WriteLine("A");
    }
}

class B : A
{
    public override void func()
    {
        Console.WriteLine("B");
    }
}```
compact sedge
#

this is why I use new and not override and virtual

copper nacelle
#

huh

#

neat

copper nacelle
#

found something on calling the base function

#
// Get MethodInfo of the base method
var methodInfo = typeof(A).GetMethod("Print", BindingFlags.Instance | BindingFlags.Public);

// Create DynamicMethod based on the methodInfo
var dynamicMethod = new DynamicMethod("BasePrint", methodInfo.ReturnType, new[] { methodInfo.DeclaringType }, methodInfo.DeclaringType);
// Create ILGenerator for the dynamic method
var il = dynamicMethod.GetILGenerator();

// Emit argument with index 0 - DeclaringType
il.Emit(OpCodes.Ldarg_0);
// Emit method call
il.EmitCall(OpCodes.Call, methodInfo, null);
// Emit method return value
il.Emit(OpCodes.Ret);

// Invoke method with target...
var b = new B();
dynamicMethod.Invoke(null, new object[] {b});

// ... or create a delegate and invoke method without target
var action = dynamicMethod.CreateDelegate(typeof(Action)) as Action;
action.Invoke();

Note that it'll work only for parameterless method. If you want to call method with parameters you'll have to put their types into the array with the DeclaringType and later emit all of them. Also you'll have to create delegate of type Action<parameterTypes or Func<returnType, parameterTypes> if the method returns something.
#

ok i found a less stupid way to do it

rain cedar
#

The real question is why you're wasting time on this

copper nacelle
#

idk

#
using System;

class MainClass 
{
  public static void Main (string[] args) 
  {
    A a = new B();
    var ptr = typeof(A).GetMethod("Print").MethodHandle.GetFunctionPointer();
    Action baseMethod = (Action)Activator.CreateInstance(typeof(Action), a, ptr);
    baseMethod();
  }
}

class A 
{
  public virtual void Print()
  {
    Console.WriteLine("hello");
  }
}

class B : A
{
  public override void Print()
  {
    Console.WriteLine("goodbye");
  }
}
high yew
#

My main question is why your method names are capitalized

copper nacelle
#

cause c#

high yew
#

huh

#

I don't like it

rain cedar
#

That's the standard

copper nacelle
#

you can replace Action w/ Action<types,to,pass,in> for void functions and Func<return, types, to pass, in> and it works fine

#

which is neat

#

idk why i spent that much time on that

#

also T x = is useless and i should just return immediately

compact sedge
#

cool

#

I hope this PR gets accepted... and starts a new glorious wave of custom difficulty boss mods by making building them so easy that anyone can do it.

#

I'm rewriting infinite grimm for it. but the hard part is the old way I did danceSpeed and animation speed means redoing a lot of math to ensure new infinite grimm is equally balanced to old infinite grimm.

#

documentation for it will be coming after it gets accepted. or not at all if it's rejected

#

(if it's rejected I'm still gonna use it internally for all my mods though)

compact sedge
#

Thanks kerr :)

dusky lion
#

Infinite Grimm but infinite cornywokest

solemn rivet
#

AA I'll take a look a the pr later today

#

But it's probably for the best is 56 or Sean do it, cause it seems like they were helping you along, so they know what to look for

leaden hedge
#

you know if you really want to call the base function

#

you could probably runtime detour it intenseface

solemn rivet
#

KDT's meme power is high these days

ornate rivet
#

is there a way to update the soul meter's ui?

solemn rivet
#

what do you mean?

ornate rivet
#

if I change it's value, it doesn't change how much soul is in the soul meter

solemn rivet
#

well

ornate rivet
#

how filled up it is

solemn rivet
#

it's probably an event that you need to send

ornate rivet
#

ok

solemn rivet
#

care to try using mpChargeSpa and setting a negative value?

ornate rivet
#

ok

#

how do I get mpChargeSpa?

solemn rivet
#

HeroController.instance.AddMPChargeSpa(int);

#
public void AddMPChargeSpa(int amount)
{
    int mpreserve = this.playerData.MPReserve;
    this.playerData.AddMPCharge(amount);
    this.gm.soulOrb_fsm.SendEvent("MP GAIN SPA");
    if (this.playerData.MPReserve != mpreserve)
    {
        this.gm.soulVessel_fsm.SendEvent("MP RESERVE UP");
    }
}```
ornate rivet
#

ok thankee

compact sedge
#

thanks gradow but kerr was so kind as to accept it last night for me :)

solemn rivet
#

Oh cool!

compact sedge
#

now I just gotta write some documentation for it

solemn rivet
flat forum
#

by the way

#

AA

#

look, the dashing thing on the Grimmkin has them set on fire

compact sedge
#

Ok that's pretty neat

river eagle
#

couldn't you technically "steal" some of these fire sprites for your mod?

compact sedge
#

tbh I'm down for adding real sprites to redwing cp1 if you wish to make any

flat forum
#

just wanted to let you know

compact sedge
#

but I have no real art skills so I can't make any of my own

flat forum
#

cough replace Vengeful Spirit with Grimmkin cough

#

Oohh

#

I'm up to trying

tranquil glen
#

yo wait is there a sprite sheet for the knight somewhere?

flat forum
#

Yeah

compact sedge
#

yes

flat forum
#

there's actually a few

#

want any of them?

tranquil glen
#

yeah that'd be nice

flat forum
#

so I won't flood this place

tranquil glen
#

sure

river eagle
#

here's all the sprites in the game

#

compiled by Veru

tranquil glen
#

oh sick

#

thanks a ton

copper nacelle
#

probably dive

humble sinew
#

I think it is

#

look at the hand

#

"hand"

#

anyways either that or the down dash

compact sedge
#

this is dash if hollow knight was a top down flash game

copper nacelle
#

did you bump the version

compact sedge
#

of hollow knight?

#

yeah it's 1.3.3.8 now

copper nacelle
#

ModCommon

compact sedge
#

yes

#

0.0.5

#

also

#

added a version int

#

so you can just read that instead of comparing strings

copper nacelle
#

darn

compact sedge
#

which also means that you can change the version without the public version changing

copper nacelle
#

I missed a this in the extensions class

#

for the invokemethod

#

I'll just bump it again

compact sedge
#

what

#

why

#

let's just make 0.0.5 add both invokemethod and customenemyspeed

#

since I'm pretty sure my thing has your changes

copper nacelle
#

alright

#

you think it'd be good to add stuff like firstactionoftype to FsmUtil

compact sedge
#

too late now, jerk /s

#

but

#

that seems objectively more useful than needing to know the index beforehand, like why would you even use an external getting function if you already know where it is.

copper nacelle
#

cool

#

also when there are 8 setvelocity2ds in a row

compact sedge
#

why

#

also

#

what would actually be great

hazy sentinel
compact sedge
#

is a thing where you get the nth occurance of a particular action in a state. so like the first or second setvelocity2d from the state "meme"

#

where n is 0 indexed ofc

copper nacelle
#

I'll do that too

#

also because lost kin spawns 8 balloons and then sets the velocity of all of them

hazy sentinel
#

lost kin spawns 1 balloon after dying

copper nacelle
compact sedge
#

wow ok, well I much prefer the code I wrote for velocity setting 8 flying objects.

#

(just a really long meme switch)

copper nacelle
tranquil glen
#

I'm trying to set up an autohotkey to bind my xbox1 x button to x on keyboard but I can't figure out what autohotkey wants me to call the x button

copper nacelle
#

On the controller?

tranquil glen
#

yeah

hazy sentinel
#

switch to keyboard

tranquil glen
#

no thanks

copper nacelle
#

maybe JOYX

tranquil glen
#

Tried that

#

think thats the sticks xx pos or something

flat forum
#

Keyboard > Joystick

#

trust me

copper nacelle
#

Joy1 - Joy32 are buttons

#

apparently

flat forum
#

I beat PoP sub5 with keyboard

copper nacelle
#

but did you beat it sub 4

flat forum
#

didn't have the patience

copper nacelle
#

proof KB+M is best

tranquil glen
#

you didn't use a controller*

flat forum
#

Proof 56 is stupidly good at many things

copper nacelle
#

Krythom have you tried the key history

#

it's in special keys

#

shows you what buttons you've pressed

#

should show your controller buttons

#

it's probably like joy(1-32)

flat forum
#

mod where equipping Deep Focus is actually useful because it has the Laser effect from Redwing, but pink

compact sedge
#

I wanna take away the pillar effect when you're not at full health... unless you have deep focus on

#

cuz right now deep focus is especially shitty in redwing

#

like even shittier than in vanilla

flat forum
#

make it make the Pillar

t h i c c

hazy sentinel
#

pillar across the entire screen

#

double the damage ticks

flat forum
#

I wanted to ask Veru something

#

but forgot what it was

tranquil glen
#

ok so apparently its joy3 but it only works while autohotkey is in focus

#

anyone know why?

copper nacelle
#

send whole script imo

#

also do you have native controller input on or the key bound in anything else (like HK)

tranquil glen
#

#InstallKeybdHook
JOY3::x

#

thats whole script

#

I don't think anything else would be messing with it but idk

copper nacelle
#

try it without the keybdhook

tranquil glen
#

nah

copper nacelle
tranquil glen
#

still isn't working

copper nacelle
#

oof

hazy sentinel
weary rune
#

Hi, I'm new here, and I wnat some help to copy one save, for precaution

young walrus
#

Go to the save location listed here. Copy the user.dat that you want

weary rune
#

is in on top of this chat?

young walrus
#

Pinned messages

#

Plus I just sent a screenshot

weary rune
#

I'm really sorry, but I couldn't understand

copper nacelle
#

@weary rune open explorer

#

click the little bar at the top and it'll let you type in it

#

erase what's in there and paste

#

%APPDATA%\..\LocalLow\Team Cherry\Hollow Knight\

#

and that has all your saves in it

#

user{1-4}.dat

#

just copy paste them somewhere

weary rune
#

ohh

#

Thank you I founded

copper nacelle
#

wow what'd you found

weary rune
#

the files

#

xD

#

the saved

copper nacelle
#

now to swap to zsh

iron bobcat
#

Arch

#

More like

#

gay

#

Manjaro is better

copper nacelle
#

die

iron bobcat
#

no u

#

seriously though I've never liked Arch very much

copper nacelle
#

wtf

iron bobcat
#

I've enjoyed it better than short time I had Arch

copper nacelle
#

cause ur bad

iron bobcat
#

rip

copper nacelle
#

manjaro is just arch but with worse repos

#

and an additional repo

iron bobcat
#

shhhhhhhh bb

copper nacelle
#

and without the fun install process

#

it's like

#

arch

iron bobcat
#

let me believe that Manjaro is better

#

shhhh

copper nacelle
#

next you'll say bash is better than zsh

#

and then i'll die on the inside

iron bobcat
#

bash is always better

#

tf you on about