#Starlancer AIFix v3.13.2 | EnemyEscape v3.0.0
1 messages ยท Page 3 of 1
Barch's mod lol I wear a few cosmetics tbh
god I still really wonder what's destroying those renderers without destroying the masked itself
mirage only sets the mimicking player, cosmetics are still set by other mods (like AC, MC, etc)
that is really weird, especially if it's doing it to the base meshes
if it sets it to mimicking a random player, that might do it
yeah mirage does that
what's your hunch on why mimicking a random player might cause it though
yeah, maybe a mod with cosmetics is seeing that and adding cosmetics to the masked so the renderer count is really high
Just to confirm, Zaggy
logger.LogWarning($"Found null reference inside {___thisNetworkObject.gameObject.name} ({ ___thisEnemyIndex}, {___thisNetworkObject.NetworkObjectId})'s skinnedMeshRenderers. Removing to prevent potential null reference exceptions.");
๐
ah yeah true, makes sense that the renderer count could be really high
Everytime a damn masked is spawning I keep getting annoying thumpers
so in this case it's more likely a non issue
well
I can't get shit if I'm dying lmfao
I wouldn't call it a non issue until I know what causes it, but sure
@rocky fable want another beta version?
this never stops?
@rocky fable there's a more informative version
make sure to grab the code
@gleaming robin i think you should print the # of mesh renderers there are before removing them from the list
yep yep
just makes it easier to know if that's the cause of the huge amount of logs
oh good idea
also maybe add a counter for # of nulls found and print it after the loop
Well hopefully I get more info from this dll to find out why it's going so nuts
Likely cosmetics I think
If you wanna wait a sec I'll have this new version ready
Okay
For now I'll head back and see what shows up in the debug in the current live build lol
holy loading time
thats what i say every time i load lunxara's modpack to debug
Tbf it was really slow before
I nuked LogNeuter and disabled TooManyEmotes to help speed it up
XD
How's this look?
where's the prints for the counters ๐
loool
Just put this after the for loops, yea?
logger.LogWarning($"Found {skinNull} null SkinnedMeshRenderers and {meshNull} null MeshRenderers.");
ya
Also ty @faint copper for teaching me $ interpolation, that's so much more readable lol
new exploit just dropped perhaps??
yeah it's way nicer, happy to help
Alright nerds, try this one @_@
This should give a crystal-damn-clear log of what's happening
wow what mod makes me move like a thumper
Oh it's a mix of BetterStamina and LethalUtilities XD
I did that to restore the speed perks I had with AC
โ ๏ธ
also you have so many mods, why not add on a god-mode one? ๐คญ
Lol
It was smaller
But then I nuked AC and found alternatives to replace it and well
XD
You gotta love that instant ship land
Lmfao
Nyooooooom
that is pretty nice lol
no luck getting masked on the first two tries, time to spawn them myself lol
impossible for me to get null meshes again :(
spawning them myself never does anything, they're always non-null
at least so far
oh, it did clear them out, nice
Lunxara is the queen of finding null refs here
damn now i wish the log also printed the object's name for the ones at the end
Maybe test it with 0 cosmetic mods now?
wdym?
I'm almost positive this why there are so many
Still wonder what causes the CalculatePolygonPath spam now
Yeah it's definitely gotta be cosmetics
CalculatePolygonPath comes from this from what i remember
Doubtful that it's AI Fix at least, there'd have to be some really bizarre mod conflict for it to be at fault
patching them out got rid of it, but i removed the patches cuz i didn't know if it was unintentionally causing other bugs
Ah I wonder if it could be set to just not spam it so much though
like for the counter logs, would be nice if it printed which enemy ai it is, but not a big deal
Yeah had that happen earlier too
ohhhhhh
I can add that rq :P
Chaos said he's looking into it
even if it didn't log it, stack traces are kinda expensive
If you notice LethalThings throws an error there too, almost like a conflict is happening
oh i wonder if that's why my ship kept getting frozen today
Go forth, test subjects
tbh it's probably enough of a test if lunxara takes off cosmetics and sees if it's mostly gone
if it is then it's confirmed a non-issue
true might as well
it's not an issue though in that case
the tests here is just to confirm if it is or not
the cosmetics would just increase the # of renderers, not effect the actual NREs themselves
if removing the cosmetics makes the logs not spam then all starlance has to do is to only print once instead of on each iteration
@copper yew do you have cosmetics equipped? if not, I would wonder what those two null renderers were in your logs
I would assume it's all renderers, not just the cosmetics ones
but maybe I'm wrong
Comedy and Tragedy mask, probably
if cosmetics carry on from save to save then yeah i should have cosmetics
MoreCompany just stores them in a .txt file, so it should, yeah
ah then yeah i do have cosmetics on
how many?
sec i need to see how to even check
I will say the way AC handled cosmetic presets was awful, anyone who imported a profile code would have to set it all up again
i haven't touched it in a long time
it'll be in the bottom right of the main menu
I hope when ProfX does their version of presets and stuff it's not like that
I'm curious whether ProfX's thing will end up being a competitor for LMM
Lol maybe
if they're both planning on doing cosmetics support anyway
i have 2 cosmetics on
yeah
so this might just be MoreCompany being a silly goose somehow... but I still want to know why they're destroying their models >:(
Meanwhile me XD
well then
I love things are making sense
oh god
Have not had this happen in ages
it's this again
Spamming
it's the literal bug that people kept thinking came from mirage
and i know for a fact that it's not
MEO possibly?
nah MEO doesn't touch these functions
@rocky fable do you have Lethal Escape?
@rocky fable since you seem to be able to reproduce the issue much more easily, if you want to test with this version of OpenBodyCams, I co-opted the debugging option to print when a model referenced by an AI is deleted
gonna go grab some food and whatnot and then check back here later
(so make sure ModelDestructionDebuggingPatchEnabled = true)
The only Update() I touch directly is JesterAI, unless LEsc is present in which case I do a simple conditional on EnemyAI.Update()
@faint copper I'm preemptively condensing the warnings so that only a single one gets printed per enemy after all the iteration is done behind-the-scenes. Is this informative enough, too informative, not informative enough?
logger.LogWarning($"Found and removed {skinNull} null SkinnedMeshRenderers and {meshNull} null MeshRenderers in {___thisNetworkObject.gameObject.name} ({___thisEnemyIndex}, {___thisNetworkObject.NetworkObjectId} to prevent potential null reference exceptions.");
this looks like it's a null EnemyAI.agent
who is deleting a NavMeshAgent without deleting the EnemyAI it's attached to??
I wonder if it's another vanilla bug
I wouldn't really think so
Hmmmm
I know I got it a lot before at one point but it stopped and this is the first time it's happened in a bit
Is there any mod in my list that stands out as the potential cause?
it's very hard to say
Oh hey
anything that messes with AI in general or masked in particular I guess
thing is, something literally has to be setting EnemyAI.agent = null for that error to happen, otherwise we'd be seeing another frame on the stack there in one of Unity's functions
which is.......... not good
Got it
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
StarlancerAIFix.Patches.AIFix.EnemyMeshPatch (UnityEngine.SkinnedMeshRenderer[]& ___skinnedMeshRenderers, UnityEngine.MeshRenderer[]& ___meshRenderers, Unity.Netcode.NetworkObject& ___thisNetworkObject, System.Int32& ___thisEnemyIndex) (at <96990cc55c4f4b44aa802759fbb89746>:IL_012C)
(wrapper dynamic-method) EnemyAI.DMDEnemyAI::EnableEnemyMesh(EnemyAI,bool,bool)
StartOfRound.SetPlayerSafeInShip () (at <af9b1eec498a45aebd42601d6ab85015>:IL_008B)
AudioReverbTrigger.ChangeAudioReverbForPlayer (GameNetcodeStuff.PlayerControllerB pScript) (at <af9b1eec498a45aebd42601d6ab85015>:IL_0177)
AudioReverbTrigger.OnTriggerStay (UnityEngine.Collider other) (at <af9b1eec498a45aebd42601d6ab85015>:IL_018B)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.CalculateAnimationDirection (System.Single maxSpeed) (at <af9b1eec498a45aebd42601d6ab85015>:IL_0021)
(wrapper dynamic-method) MaskedPlayerEnemy.DMDMaskedPlayerEnemy::Update(MaskedPlayerEnemy)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.LookAtFocusedPosition () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0185)
MaskedPlayerEnemy.LateUpdate () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0017)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.CalculateAnimationDirection (System.Single maxSpeed) (at <af9b1eec498a45aebd42601d6ab85015>:IL_0021)
(wrapper dynamic-method) MaskedPlayerEnemy.DMDMaskedPlayerEnemy::Update(MaskedPlayerEnemy)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.LookAtFocusedPosition () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0185)
MaskedPlayerEnemy.LateUpdate () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0017)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.CalculateAnimationDirection (System.Single maxSpeed) (at <af9b1eec498a45aebd42601d6ab85015>:IL_0021)
(wrapper dynamic-method) MaskedPlayerEnemy.DMDMaskedPlayerEnemy::Update(MaskedPlayerEnemy)
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
MaskedPlayerEnemy.LookAtFocusedPosition () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0185)
MaskedPlayerEnemy.LateUpdate () (at <af9b1eec498a45aebd42601d6ab85015>:IL_0017)
unless I'm wrong and it's possible for it to inline a native function at least
@faint copper hear me out
Something happened in AiFix
navmeshagent is a component right
sure
@gleaming robin
in theory could you implement OnDestroy and intentionally throw an error to get the stack trace of the mod causing it?
isn't OnDestroy deferred?
Can you make sense of what happened there?
but I do have a hook on Object.Destroy() and Object.DestroyImmediate() for this kind of purpose in OpenBodyCams
[Error : Unity Log] NullReferenceException: Object reference not set to an instance of an object
Stack trace:
StarlancerAIFix.Patches.AIFix.EnemyMeshPatch (UnityEngine.SkinnedMeshRenderer[]& skinnedMeshRenderers, UnityEngine.MeshRenderer[]& meshRenderers, Unity.Netcode.NetworkObject& thisNetworkObject, System.Int32& thisEnemyIndex) (at <96990cc55c4f4b44aa802759fbb89746>:IL_012C)
(wrapper dynamic-method) EnemyAI.DMDEnemyAI::EnableEnemyMesh(EnemyAI,bool,bool)
StartOfRound.SetPlayerSafeInShip () (at <af9b1eec498a45aebd42601d6ab85015>:IL_008B)
AudioReverbTrigger.ChangeAudioReverbForPlayer (GameNetcodeStuff.PlayerControllerB pScript) (at <af9b1eec498a45aebd42601d6ab85015>:IL_0177)
AudioReverbTrigger.OnTriggerStay (UnityEngine.Collider other) (at <af9b1eec498a45aebd42601d6ab85015>:IL_018B)
this is before it spammed
hard to say without knowing what exactly is the code in that function
that's Starlancer's code
Yep
hmm
technically you could grab ILSpy to find the exact line that that IL_XXXX instruction points to
that'll tell you exactly what is null in most cases
I have ILSpy, how do I find that point?
open the specific assembly that was running when the stack trace was generated and go to the method that was running, then at the top switch the language dropdown to IL
then it'll show bytecode indices in hex that those ones in the stack trace refers to, the stack trace points to the first instruction of that line so there will be a few after and one will be dereferencing null
@copper yew btw in thise case a stack trace happened in Starlancer's code
well 012C is my logger apparently ๐ค
In other cases it was probably some other mod lol
if it's a logging line, it probably could be derefing something else too, those lines would probably be quite long in the IL
since I assume it's one of your string-interpolated prints
yea
is there a way to provide text in Discord in a dropdown, rather than creating a txt file?
I don't know of one, but I haven't looked into it
eh, no worries
well heck, it didn't reach
regardless, there's the full IL of my EnemyMeshPatch
Is it because I forgot a ) ?
is it possible that the network object can for whatever reason be null
i remember there was an issue like this that happened when i was debugging a mod conflict with mirage
If the NO is null, I think the whole enemy GO just doesn't exist
it wasn't null before though, I don't see why it would be now
maybe it's possible for a mesh renderer to be null while the network object still exists, and vice versa though, idk
I don't suppose you still have the full log of this?
oh hella
for future tests, just upload the log and maybe a small screenshot of the error
i wonder what the hud manager error is cuz i always see it
same tbh
MoreCompany sends a message in the chat to synchronize cosmetics but it sends the player ID as -1
for some reason their patches aren't currently preventing that from causing an error
i remember this being reported on the AC thread that this happened with a user that installed AC as well though
might be because prefix return false doesn't stop other prefixes on the same function from running
nah maybe u are right, im gonna see if i can find the msg just to make sure
the other hook should be in the stack then
alright i cant find the message, i think i just remembered wrong
ur probably right on this
I haven't looked too deeply into it yet honestly
it used to be fine, they didn't change how it worked
at least not fundamentally
finally
so it is just MoreCompany being silly
someone probably ought to make a PR to it to make it update the mesh arrays when this happens
not sure if this actually breaks anything seriously though, since I don't know the exact purpose in vanilla for those arrays and hiding the renderers
but now that I solved the mystery I really gotta go sleep 
curiosity will be the death of me
I feel that lol
This is actually showing my code repeating for entities I think? It's a little hard to tell the specifics as to when things are happening without the Unity LogInfo breaking things up
Hmmm maybe
Yea it looks like something is calling EnableEnemyMesh more than normal
I think that the SetPlayerSafeInShip function just gets called constantly until the ship is in orbit
or at least for a certain period upon leaving
imo you should still log and see if the network object is null
Like this? Or is there a better way?
if (___thisNetworkObject == null) { logger.LogWarning("___thisNetworkObject is null."); }
yeah, and do one for ___thisNetworkObject.gameObject as well just in case
might as well have that extra info
ah debug code
This is the last one for tonight. It's 2:30 AM ๐คญ
Hope y'all find something useful :3
also I guess I should add the Code role to myself
I will riot
Wait, are you saying it did break it, or just that it'd be silly?
ah shit im not on my pc rn
Look at how fast that log is zoomin lmfaoooooooooooo
NYOOOOOOOOOM
I put bees on the ship
and left
and they didn't despawn
LMFAO
Hold on lemme show the light show in game
Lmao the size of this log
Btw looks like the masked enemy had some fun too
@gleaming robin hope you have fun with this one
XD
Love how that latest upate of the ai fix to debug with Starlancer set managed to break that hard
XD
and with that I readded EnemyFix lol I doubt the next live build will break that hard but
XD
Does this mod help with the LethalEscape mod?
Hello, @pastel spoke, we have a dedicated support channel and forum here: #help-and-troubleshooting #1185732310700654732
Anyone responding is a volunteer so be patient.
what relation does this mod have with lethalescape
It should give more compatibility to lethal escape
very good.. ive had it together for a long while just wasnt even sure what this did lol
but it came w a few fixes, so i kept it..
@pastel spoke @undone copper
Prior to this update, SLAI didn't really interact with LEsc. SLAI in general is more for allowing moon creators to be silly with their indoor/outdoor spawnlists. With this update however, I fix an incompatibility where outside jesters would break and go immediately and permanently aggressive when both SLAI and LEsc were enabled :3
@faint copper ??????????
I would guess it's argument 1
not sure why sometimes the IL index is misaligned, but it might just be because the lines starts are indicated by a truncated number
generally one line will contain more than one instruction, so I think it's likely they store them in a bit shifted number
Ah. When you say argument one, are you referring to the gameObject?
it would also explain the occasional nop
I mean the ldarg.1
which would correspond to the zero-indexed parameter #1 for the method that the IL is in
oh so that'd be thisEnemyIndex?
oh sorry xP
I guess it would make sense to clear out the NetworkObjects upon leaving actually. Would that be why those errors started getting thrown?
but also, I wonder, are you using .NET Standard 2.1?
if you do, then putting the .pdb next to the dll should give you line numbers instead
or there's also a pinned message in #dev-general I think that explains a way to embed debug symbols
not sure what you mean, this seems to indicate that the NetworkObject is null going into the method
but I guess that qwbarch had mentioned that you should print whether it was null, was it null when those errors occurred?
Actually yes
because it's worth noting that you can use is null to check whether the field has been set to null
the == operator is overloaded to also check whether an object has been Destroy()ed in Unity, but is null bypasses that so you can tell if someone did thisNetworkObject = null
if it wasn't set to null then that means that someone Destroy()ed it without also Destroy()ing the object it's attached to, which would seem very strange to me
unless that's some quirk of Unity's netcode
Hm. I'll add in another debug line above for "is null" and then we can see both ways. Guess I gotta download Lunxara's code ๐คญ
lemme modify OpenBodyCams to print when that gets destroyed too so you can test for two things at once
kk, should I check for NetworkObjectId to be nulled as well?
oh nvm, it can't be lol
isn't that an int? it shouldn't be possible for that to be null
yea
well, a ulong I guess
you were right btw, good to know for the future
untested but should print a stack trace when any NetworkObject held by an EnemyAI.thisNetworkObject is destroyed
(OpenBodyCams is present in Lunxara's profile, so you probably want to disable that first)
oh, you'll also need to enable the ModelDestructionDebuggingPatchEnabled option in OpenBodyCams to get that to print, can be done at runtime
kk
I know these errors are interesting, but they're really just a result of my logging, right? Not my mod failing?
a few things broke in her pack, i sent her a list but i never saw her report the bugs >:C
openbodycams, diversity's bracken and one more other mod, cant remember which
hmm, I know the black screen thing was still unresolved last I heard, but I haven't been able to reproduce it even using her profile
Okay so that was weird
Even after I left the planet, the masked was still registered in the system and throwing update/late update errors
yeah, I wondered if it was not getting despawned correctly
Yeah, anytime I step into the ship EnableEnemyMesh fires, so I might need to find a better method to hook into
@copper yew how are you going about removing the mask from the MaskedEnemy?
nvm, thought I was on to something with that
You told me to break it but I didn't expect that build to break the game that hard XD
Freaking out cus the bees didn't despawn
Lol
yea that was amazing lol
It really was XD
Also with your code masked were completely borked
Yeah which is funny cus the only 3 mods that touch them are
So I've had to switch to a more condensed testing environment ๐คญ
Mirage, MEOFork, and LC Masked Fix
lol
No other mod there should touch them
If Mirage and MEOFork don't touch those functions that were breaking like qwbarch said
Hmmmm
LC Masked Fix?
XD
Oh Huh
@copper yew
Bruh if it's OpenBodyCams somehow
โ ๏ธ
There's no way right?
gonna test with no mirage, then with no bodycam + with mirage
Yeah
I really should be working on my moons
Haha I feel you XD
Bro i still havnt tried any of your moons
hold off then
new update is big
Even though i read every changelog and shit
After all this hard work I've been seeing this man do to fix the masked
Gonna use them for sure lol
Every Starlancer mod is a must now
I have it in my pack its just i had a lotta of issues to fix cuz i had reconfig a lot of stuff cuz i removed AC
That's very sweet of you to say :3
I want more people to use my music tbh
I haven't heard anyone talk about it
@faint copper just gonna go ahead and upload this for reference. This is just with AIFix, BodyCam, and DanceTools
It brokey again?
Nope, Masked worked fine
Okay okay good
Now testing with just Mirage
I wonder what in Mirage's code is doing it then now or if the 2 mods have a weird conflict lol
we finna find out
am I wrong or does this have no null renderers in the logs?
I believe you are correct, which means the null renderers are probably the fault of cosmetics?
also, this is just with Mirage and DanceTools ๐ฌ
yea this is definitely Masked = Broken
I'm gonna test your code again, but without Mirage
Yeah go for it
Now it's just isolating the issue in Mirage's code somehow if it's fine with MEOFork lol
No breaking or nulls upon spawn
Weird
Did you also test with the option for compat with Mirage unticked?
Wonder if that MimickingPlayer flag is causing something
see i knew that thing is null ๐ญ
welp, the game crashed xD
untick that option to allow MEOFork to control them similarly XD
kk
TIL never knew this
Was standing in the lobby vibing to boombox when I screenshotted that
Is mine the only music mod you have? Just checking to make sure you were hearing my songs ๐คญ
ill send the patch in a sec
Yeah it was definitely your songs haha
The only other mod I have that might is Lethal Resonance but it doesn't touch the radio right now as far as I'm aware
mirage doesnt affect these methods though, weird...
kk, I'm gonna test it with MEO fork compat disabled + no cosmetics, then with a ton of cosmetics. I'll have to test your patch later unfortunately, I gotta go to the store ๐คญ
That's why I theorized something with the MimickingPlayer flag may be doing it
We know something is going brrrrr
XD
cursed
Haha
@gleaming robin this is how i disable mask textures: https://github.com/qwbarch/lc-mirage/blob/83691cb735359303431b87eddf5346c180f5b407/package/mirage/src/Mirage/Patch/SpawnMaskedEnemy.fs#L98-L104
idk if you can read that since it's F# but GetComponentsInChildren<Transform>() i think returns a List<Transform>
so i just filter for only the ones with HeadMask in its name
and set it as non active
Well to further add to the confusion, still no nulls
So MEO has whatever is causing this dealt with
Or doesn't touch what might be doing it
I had disabled Diversity and Symbiosis earlier bc they were annoying me (the sassy ship voice, but I don't even remember why Symbiosis was), so I'll test that later
I gotta head to the store tho, so I'll be back later y'all ๐
Symbiosis includes a fix for the Yippee
Lol
Also you can disable the ship voice in Diversity
๐คฃ๐คฃ๐ญ๐ญ
I love the new voice
:3
It just got grating after hearing it so much so fast in my loading and exiting ๐คญ
lol that's fair
MEO wrote its own patch to apply MC cosmetics it seems:
internal class MoreCompanyPatch
{
public static void ApplyCosmetics(MaskedPlayerEnemy masked)
{
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
if (!MainClass.showCosmetics || MainClass.playerIdsAndCosmetics.Count == 0)
{
return;
}
Transform val = ((Component)masked).transform.Find("ScavengerModel").Find("metarig");
CosmeticApplication component = ((Component)val).GetComponent<CosmeticApplication>();
if (Object.op_Implicit((Object)(object)component))
{
component.ClearCosmetics();
Object.Destroy((Object)(object)component);
}
List<string> list = MainClass.playerIdsAndCosmetics[(int)masked.mimickingPlayer.playerClientId];
component = ((Component)val).gameObject.AddComponent<CosmeticApplication>();
foreach (string item in list)
{
component.ApplyCosmetic(item, true);
}
foreach (CosmeticInstance spawnedCosmetic in component.spawnedCosmetics)
{
Transform transform = ((Component)spawnedCosmetic).transform;
transform.localScale *= 0.38f;
}
}
}
but for mirage i let morecompany handle that themselves
which means it's probably an MC bug
nope that means MC has to fix it ๐
(if it really is MC at least)
which i'll report after i test it a bit to make sure
๐
It could also be weirdness somehow regarding having MC handle the cosmetics itself vs a patch
cosmetic mods are supposed to handle it themselves
idk why MEO even has a custom patch for it
If that's really the case though then uh
Why did that bug also happen with [REDACTED] before?
dunno
Hmmmmm
tbf idk waht the issue is yet since it's never happened to me
other than just looking at the error messages
Yeah it's odd
I almost went at lethalresonance for it lol
I never expected Diversity of all mods to f with the ship voice ๐คฃ
"Yoohoooo dogs they're in here fresh and full of fear!!!!"
it says that???
all I know is that it bugs me when the quota is reached because I was doing testing prior to the nuclear fallout
haven't been able to play any session after diversity's update
I love the new voice tbh
not due to diversity- due to the fallout 'n poor timing
Yeah I already got my replacements going
doesn't help that during the testing of ensuring the next session is ready - the save I had was on deadline day
so EVERY DAMN TIME I launched the cheat-save to test things, I always hear him yapping
and you can't even disable the bastard by pressing E on the speaker
so I'm well aware of his quota talk and can't-disable-me jargon-
but the darn mods I was testing could be tested on company building >n>
selling things, testing prices, items, etc
it just so happened* to be convenient to have a cheat save on deadline day so stuff sells at 100%
lotta good all that balancing did ๐
wasted damn hours is what it concluded to be.
wait so how do i reproduce this error again? lmk when ur free
for me I had it happen when I went to Vow with the most recent 2 dev builds of AIFix when a Masked would spawn in if that helps, I'd use the latest one though since it'll report more specific errors
Just prepare to have the game freak out if you leave the planet XD
yeah
ah ic
Sorry, are you saying you think this is causing the null renderers?
referring to this
Okay I'm increasingly confused. I can't get any null renders to happen
Just trying to be clear, you think it's causing or fixing them?
causing, although i'm not entirely sure on it so i need to confirm it myself before i report it to MC
@gleaming robin I am out of the loop. What is Seamless Dungeon? This sounds like something I will want to have.
It's currently WIP, not released
ty!
Btw @gleaming robin I would love a way to disable the vanilla boombox tracks now lol
That makes it worse that I'm not getting any nulls @_@
Unless... Lunxara were you on a previous version when you successfully encountered the NREs?
The vanilla ones suck XD
The bug where the masked would stand in place?
Aww no they don't (well a couple do xD)
It doesn't happen with the current live version of the AIFix for whatever reason
It started with the 2 most recent debug builds
idk if i was misunderstanding actually, but just to be clear, i was referring to the error message in this screenshot
lemme try without the debug builds
i highly doubt it though
ill send you what i interact with from MaskedPlayerEnemy
ohhh I absolutely could be wrong, but I don't think that error matters for what we're doing
that just happened to be there ๐คญ
mirage really doesn't do much with masked enemies
only sets the mimicking player, suit, etc, if the masked enemy isn't null
Then that would mean it might be breaking something with the cosmetics right? Didn't you theorize it was something to do with how Mirage handles MC's cosmetics compared to MEO
okay so if I remove AI fix Mirage doesn't break :B
Yeah same if when you use the current live 3.1.0 version
lemme just retest the debug version to be sure
You got this
lmao yep, something in the debug version breaks masked xD
I will say the debug version before the 2 most recent ones gave me no issues
wtf
it's not that i handled cosmetics to begin with
Oh?
it's that i set the mimicking player after cosmetic mods tries to read it
my fix was that i just made sure mine runs first
what's your current changes? i'm surprised anything that you have breaks mirage tbh
it's just the extra logging
you might be god himself
Maybe I should do like my friend suggested and split the NRE patch into a separate mod
since it's not really AI
You could, would you call it StarlancerMaskedFix?
Possibly. Or more descriptively StarlancerNullMeshFix
Ye
yeah true actually
or NREMeshFix, they're all confusing lol
StarlancerMeshFix for the brand
I'd be down to have it be seperated if you'd prefer that
@rocky fable what was the bug that spawn a random player model when you tp someone from ?
yea sorry, the Starlancer was implied for NREMeshFix lol
Wdym?
I have this bug and i think i remember you was talking about it, i wanna find the culprit
I haven't had any bugs relating to tping in a bit
Yeah it was a while ago i think
Only time I did was with a bug that got patched in the recent Mirage versions
So
I can't tell you
wasn't it latecompany or something ?
LateCompany causes radar desyncs but so does every late join mod
oh
Like I said I can't help you lol
Ok, Thanks anyway !
Gawd daymn, yall bloodthirsty
pixel was about to get hit by strays
Dude fr
Also unrelated but audio knight is a sick name
speaking of which
i've been curious
@gleaming robin are you a sound engineer and a game dev
idk what would make you think that
https://thunderstore.io/c/lethal-company/p/AudioKnight/StarlancerMusic/
oh just cuz the name AudioKnight ๐
OH SHIT
u have a spotify
time to check it out
(also not a professional game dev or anything, I put out one short horror game a few years back that was okay for my very first release, but I would have done things way differently now)
big preesh โจ
@copper yew found it
if I directly reference the gameObject it breaks everything
yep, and gonna do one more hyper-specific test
it's crazy how one small thing can break everything else
kinda like when i had a mod conflict with mirage regarding dead bodies
Yee
So it completely breaks upon any reference to a component of ___thisNetworkObject
so gameObject or NetworkObjectId
keyword: almost -3-
I did dig through all recently updated mods (I log when things get updated, to ensure I know what fucked something up)
tested diversity, it stopped. :p
but YOU DID UPDATE ON THE SAME HECKIN' DAY~ -3-
didn't you do null checks anyways though?
that's why i mentioned to do the null checks, since it seemed like the network object was null
and if you get a null refernece exception, everything else that was supposed to run after your patch won't run anymore
yea I guess I misunderstood the assignment
tho I did run the code by you and Zaggy :P
Finally getting somewhere
A more useful chunk
The first cycle is null, the second cycle has 0 null renderers, then the 3rd finds 159 null renderers
Gonna test with removing Mirage again, just to see
niceee
lmk, thanks for the tests โค๏ธ
Without mirage, it went back to 8 mesh renderers and 0 of them were null. I had forgotten to re-enable MEOF's compat setting, so I did that and it went back up to 326 with 159 null
@copper yew I disabled MEOF and all of the null renderers disappeared
Took off all my cosmetics, number of renderers went back down to 8 from 167.
0 nulls
so for some reason MEOF's compatibility setting with your mod seems to be the issue?
Why is MEOF causing a bunch of null renderers?
Huhhhhhh
@devout sedge
Need you to shine some light on this XD
It's interesting how stuff like this happens
idk exactly, but MEO yoinks a reference of the masked prefab around the start of the game. for some reason, it uses the ship terminal's 'Start' method for this
if AI fix makes copies and modifies them, there will be a mismatch as MEO would replace them with the old prefabs
The NRE issue was present beforehand, which is what sent me down this rabbit-hole lol
All I'm doing is checking for null renderers and then removing them
wait so with just mirage and meof the problem isnt there?
so something is adding a heck ton of a lot of mesh renderer?
ill take a look at MEOF later to see if i have any ideas, but i remember coppertiel's changes looking fine to me
Could be something in just the base MEO code tbh
it's mostly the same with only a few changes
I'd need to check that in isolation, but this test shows that MEOF + Mirage + MEOF Compatibility Patch = null renderers
it might be something with more company cosmetics?
if MC is open source i might take a look there later
It is swipez has a github
Looking into this
cuz coppertiel's compat change makes MEOF not apply cosmetics
and mirage just gets MC to do it directly instead
Batby over here finding the issue in a hitch
so fast ๐
Gotta love Batby ๐ Batby is a pro
Hey now, I did a lot ๐ค
one sec
You did ๐ you both are pros lol
ill post more
ily
@tulip vault Assuming I keep this fix, I might push it into a separate mod. Is there a better place to call it than prefixing EnableEnemyMesh? It fires frequently inside the ship
I think you should definitely keep it
It does seem handy as a safety-net
until you learn transpilers you could probably get away with just remaking that function w/ the null check built in and prefix returning false tbh
Pushing it as a seperate mod makes sense, and you might even be able to merge in a fix for what MC is doing as well
Ah and then it would only be firing as often as vanilla
are cosmetics accidentally being added to the masked enemy prefab? does the number of mesh renderers build up over time?
and you wouldnt need to validate the list, just null check before the comparison (allow nulls to exist in the list)
since in this context it's not really your responsability to validate the lists, as it's a mod/s issue
There's 8 mesh renderers by default. My situation where I had a bunch of cosmetics bumped it up to 167 (an increase of 159), the compatibility patch then made it 326 (which was another increase of 159), so it's doubling them, but only once
The primary issue here I believe is something the MoreCompany dev missed, and the masked enemy overhaul dev might have missed it too
- it's doubling them because both mods do the same thing
i dont know how that happened but
both add the cosmetics to the mimic
So essentially to fix the issue of it doubling would be for MEOF to get an update that removes that patch basically
Since they're both doing the same thing
thats not the main issue
Ah okay okay
if this somehow doesn't happen on the original MEO then that would be strange
It likely does
I'm still trying to figure it out but I can't actually find where any of this gets called before Start in order for these components to even be in the list
but regardless
both mods versions of this code don't consider adding or removing from the enemyAI.meshRenderers and enemyAI.skinnedMeshRenderers list when they destroy stuff
im assuming because obv. the system was built for players and the mimic stuff was kinda chucked on ontop which might of had a little less research
(and of course, in normal circumstances it doesn't\ throw an error)
ohhhh im dumb
yeah were good
is the more company dev and/or the masked enemy overhaul dev contactable on here?
The MEO dev is yeah, granted he's not very active rn
mhm
That's why Coppertiel is actively maintaining the fork currently with HomelessGinger's blessing
if someone wants to make a little mod that fixes this or if @gleaming robin wants to put it in their mod for now just let me know and i can explain the exact thing you'd want to do to fix this
ahhh
So I'm sure MEOF could implement the fix
I can probably just move the ApplyCosmetics line up into if (!Plugin.DontTouchMimickingPlayer)'s block
there's no point in calling ApplyCosmetics if it doesn't even touch mimickingPlayer
assuming of course that its purpose is to change the mimicking player and cosmetic after MoreCompany had set it
though I have a feeling this is something that had just never worked
since MoreCompany's code runs after MEO
I've got the null-check code ready to go, and it would be a nice safety net in case other mods end up doing a similar thing.
In this case would a transpiler still be better if it can just be avoided by ignoring the nulls?
@devout sedge Basically because MC and/or MEO uses SetEnemyOutside() as a target to do this code it does add any potential cosmetics to the mimic before it collects them via GetComponentsInChildren because Start happens on the next frame
But, .ClearCosmetics doesn't strip destroyed .GameObjects from those lists.
In theory the easiest way to resolve this might be postfixing MC's .ClearCosmetics, Checking if the gameobject the component is attatched to has a EnemyAI (or derivative) component and then if it does validating those lists and removing any nulls
MEO postfixes MaskedPlayerEnemy::Start. as of now I don't have much knowledge of what order these are called
and what's wrong with this function?
i wonder why MEO has a custom patch for it then if MC applies after anyways
^ i'm now unsure about this, after "Start happens on the next frame"
all this random 'anything can change anywhere' nonsense makes me feel like eventually porting a certain framework of mine to C#
I just ran a test and for some reason the null check didn't work. I might've copied it back down wrong, but I'm gonna eat some dinner and be back later
this will be two messages holdup
are u talking about a dynamically typed language
a jester followed us with lethalescape t o the ship as intended, but it appeared closed even when eating us... should i be asking here?
if you have starlancer ai fix then probably yeah, audioknight just went to get dinner so give him a bit
In basegame, EnemyAI does this in Start()
public virtual void Start()
this.agent = base.gameObject.GetComponentInChildren<NavMeshAgent>();
this.skinnedMeshRenderers = base.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
this.meshRenderers = base.gameObject.GetComponentsInChildren<MeshRenderer>();
This populates the list with all the found Renderers attatched to the parent and/or it's children.
More Company applies cosmetics to the mimic in the function that spawns the mimic, utilizing the basegame call ofMaskedPlayerEnemey.SetEnemyOutside() that is called on the same frame. This means it's running before Start() so the basegame code above is correctly adding these new cosmetics to those lists.
There's two big issues though, first one being on More Company's side. This is a problem caused by More Company but on it's own never actually happens on it's own.
The ClearCosmetics() function in More Company here
public void ClearCosmetics()
{
foreach (var spawnedCosmetic in spawnedCosmetics)
{
GameObject.Destroy(spawnedCosmetic.gameObject);
}
spawnedCosmetics.Clear();
}
Was built for players, not mimics. When the Cosmetic GameObject is destroyed, the components on it are destroyed too. This includes the MeshRenderer's which are not being removed from the EnemyAI lists that obtained them on Start().
the second issue, being on MEO's Side, is the problem that causes the problem in More Company to actually occur.
The ApplyCosmetics() function here (stripped of irrelevant code to fit in the message) is run on a Postfix to EnemyAI.Start().
public static void ApplyCosmetics(MaskedPlayerEnemy masked)
{
Transform cosmeticRoot = masked.transform.Find("ScavengerModel").Find("metarig");
CosmeticApplication cosmeticApplication = cosmeticRoot.GetComponent<CosmeticApplication>();
if (cosmeticApplication)
{
cosmeticApplication.ClearCosmetics();
GameObject.Destroy(cosmeticApplication);
}
List<string> playerCosmetics = MoreCompany.MainClass.playerIdsAndCosmetics[(int)masked.mimickingPlayer.playerClientId];
cosmeticApplication = cosmeticRoot.gameObject.AddComponent<CosmeticApplication>();
foreach (var cosmetic in playerCosmetics)
{
cosmeticApplication.ApplyCosmetic(cosmetic, true);
}
}
This code finds the CosmeticApplication that was already added via More Company before the EnemyAI.Start() ran and runs ClearCosmetics() on it. Destroying every Cosmetic MeshRenderer that was already added to the mimic and included in the lists that were populated in Start(). So now the list has null references. Also. Because this code is running as a Postfix, the Cosmetics MEO is re-adding have missed the window to be automatically added to those lists via the basegame code, and code has not been added to manually add these new Renderers to the lists after the fact. So in theory the Mimic's .meshRenderers and .skinnedMeshRenderers lists have both null references and are missing the actual cosmetic meshrenders that didn't get destroyed.
long ahhh post
you seem to like F#? not really language-related though. another project of mine has a task system that can very effectively order tasks based on a description of how they access certain variable. 'Task A writes to a queue, Task B reads from it, so Task A runs before Task B' but with a bunch of other weird things that allow it to be perfectly rolled into a game loop
Still not quite back, but can you send the log?
oh unfortunately i dont have it........
but if ithappens again ill be sure to grab it
ive started another game since
several
nice. so one way to go about this is make a custom ClearCosmetics function for mimics in MEO, or manually clear meshRenderers?
im actually not a big fan of f#, i just wanted to try it out so i used it for mirage.
it's still more ergonomic than c# (imo) so ill probably still use it for lc mods
never really heard of this task system type of thing for game loops. is there a name for this pattern?
on a "just fixing the issue" side of things answer. i would just postfix whatever version of ApplyCosmetics and ClearCosmetics is being used to check if the gameobject that has the CosmeticApplication component has a enemyAI, and if it does ensure those two lists either have nulls removed or new meshrenderers added
on a specific to your side of things answer, i would look into if still need to be doing all the MoreCompanyCosmetic related stuff in MEO. as from a glance it kinda seems like at some point MC adapted the patch MEO implemented directly
afaik, it's original. I personally call it the "Sovapine-2 Non-Kikiki Pipeline Subsystem." "Kikiki" refers to uncertainty/randomness on when memory locations are modified. at least for what I'm using it for, it works far too well for making a game composable and perfectly fits my game's systems. i think it sometimes makes me sound like a conspiracy theorist when I talk about it.
is any other mod besides MEO using ClearCosmetics on masked?
Wouldn't know
Not that I can tell
None of the ones I've used have anyways
ClearCosmetics touching EnemyAI introduces additional coupling that seems like a bad idea. since meshRenderers is set by EnemyAI, i'd say it makes sense for something postfixed in MaskedEnemy to modify it
interesting, is your source available? just wanna take a look at how this works
quite moderate in size and it's C++, good luck https://github.com/TheOpenSpaceProgram/osp-magnum/blob/master/test/tasks/main.cpp
Update on the NRE situation @copper yew @rocky fable @devout sedge :
Until/Unless a solution presents itself to sweep through the enemy mesh renderers once and clear out the nulls, I have managed to successfully replace the EnableEnemyMesh code via prefix to simply ignore any null instances, thus preventing any NREs.
oh and @faint copper
So what does this do?
Ayyyyyyy
The mod, or what I just posted about?
The mod
A helper mod that automatically assigns the correct interior or exterior AI to an enemy when they spawn depending on if they are inside or outside of the dungeon.
Most moon creators will be adding this as a dependency so they can put enemies on either spawn list, but it can also be used by normal modders that want to force spawn enemies outside for fun
oh this makes so much sense
lovely
the only better time to check the arrays would be when MoreCompany or MaskedEnemyOverhaul delete and respawn the cosmetics, but those mods should do it themselves
seems good to me
but really imo it feels out of scope for your mod since I don't believe anything you do triggers this
is qwbarch looking at making a PR for MoreCompany? I saw they were looking at the source earlier
Yea I'll be pushing out an update shortly and no one will have to deal with that ๐คญ
lol
dunno if its the AI fix but theres insane client desync ongoing when we play
i cant imagine it being the AI fix
i'm currently fixing the null mesh renderers
I'm torn tbh, because technically this is in the EnemyAI class, and I feel like eventually most people that have the masked mods will probably have AIFix.
I also feel like having a separate mod for just prefixing EnableEnemyMesh is overkill.
But I also recognize what my programmer friend called "the separation of concerns"
oh well there we go then
what I mean is that modifying EnableEnemyMesh() is a bandaid fix, it really ought to be fixed by the people causing the issue
I guess they just haven't hadn't realized that they're causing it yet
it's a really specific issue, it shouldn't happen with other enemies normally
I'll push an update removing the patch, saying that MEOFork is implementing its own fix which would make mine redundant. Ty @devout sedge
Yea Coppertiel is the dev for MaskedEnemyOverhaulFork
was typing and not reading lol
๐คญ
All my coding the past 24 hours wasn't for naught at least, since it helped isolate the problem.
yeah, it's been around for a while, it'll be nice to have one weird spam bug removed
it may have also been the cause of some enemies not despawning, but not sure
I think there was a mod that was aiming to fix that by just despawning the enemies sooner, wouldn't be surprised if the underlying issue was the null pointers when hiding the enemies before the ship leaves
yeah the enemies not despawning had to do with null exceptions
so it could be related
i remember network objects being null was the issue
where the vanilla code tries to call networkObject.Despawn(), but the network object is null
if i remember right at least....
โค๏ธ
oh, that does seem odd and perhaps unrelated then
I'd have to spend a bunch of time reading the surrounding code but I got better things to do lol
I guess we'll find out if that still happens eventually
EnemyFix seemed to be enough for people i just never bothered looking at it any deeper
Well now that that's handled, time to fix the Jester. Again. @_@
if you scroll up i explained the problem
oh I know the problem
I found it yesterday, at least partially
I didn't know that MaskedEnemyOverhaul was creating the cosmetics before MoreCompany tried to, but yeah
this should fix the null renderers
after but same difference
hmmm
.
#1206494982521753620 message
the initially-created cosmetics would not show up as being destroyed, so this indicates to me that MoreCompany was calling it later
I may be wrong though, but that's why I believe it to be the case
oh ok nevermind this then (actually idk)
also, the stack trace I got indicates that MoreCompany is doing it in the AI interval function? so it would be well after Start()
bottom line is MoreCompany needs to fix the issue too
but yeah, I wouldn't expect patching it on MEO's side would fix it
uh, should I keep my null-check in then?
well.. I wouldn't take my word for it rather than testing to see if the errors are still present, but if your goal is to prevent those errors, I would imagine so
to heck with it, I might as well keep it in until I hear it's been solved elsewhere, won't hurt anything and it'll prevent bs @_@
i'm probably gonna try and reproduce the error and just open a PR for MC later
@gleaming robin how do i reproduce that exact error
probably going to try it tonight
I recommend installing DanceTools by dancemoon for ease of testing.
- Disable the ai fix
- Land on a moon. (Cosmetics may or may not be required, and Vow was my testing ground bc of last night lol)
- Spawn a Masked. (Hit tilde, type "enemy masked")
- Step out of the ship.
- Your log should now be flooded with NREs
is just having mc + meo/meof enough for the test? or should i use your profile code as well
iirc it was the meof compatibility patch that triggered the NREs, so it might need mirage as well, but you can try it without, it's a pretty quick test
ah bet, thanks for the detailed steps
the exception occurs in a patched EnableEnemyMesh though?
Calling EEM is what throws the NREs even without modification
i'm testing right now. With AI fix I can see
[Warning:Starlancer AI Fix] Found null reference inside MaskedPlayerEnemy(Clone)'s meshRenderers. Removing to prevent potential null reference exceptions.
The null still exists, but the NRE doesn't occur with the patch
The live release of SLAI removes the nulls, but bc of how EEM is called, its kinda spammy. So I'm gonna push new code that instead just replaces EEM so that it has a null-check built into it
whats EEM
EnableEnemyMesh
ah
ill slide in dms a sec
does that mean a fix for MC won't really be needed
I'm cookin with my sous chef
nah, it's still a bandaid to just ignore the nulls
if the enemy doesn't know about all attached models then it can't hide properly
honestly if audio knight's changes is good enough as a bandaid fix, im prob gonna skip working on a pr for mc
since i'd rather just work on other things if the bandaid fix works
yeah, fair enough
I'll handle it for now ๐ซก
Just gotta figure out how to make the LEsc jester stop acting like a CLOWN
still very much a bug on MC's end though
i think this might be related to the 'invisible masked with floating cosmetics' issue that I've seen a few times
though that was a while ago
From who, specifically? ๐คญ
Idk lmfao sounded like you were gonna push a mod and Coppertiel is implementing a fix into MEOF
and now barch may be implementing a fix into Mirage
XD
i'm not implementing it into mirage
it's an MC bug
if i add a fix it'd be to MC directly
that would line up if MEO's cosmetics were being instansiated but not added to that list
ah, my understanding is that barch is gonna put in a PR later for MC, idk about Coppertiel, and I've decided I'm gonna try to make my null-remover better rather than swapping it to a null-check
Noice ^^
I look forward to your fix
๐
trying to address this first lol
Haha
so far I'm unable to replicate that specific issue, but I have found that an LEsc jester breaks if its aggressive inside and then warps outside. It'll shut the box, move to one spot, and then not navigate on its own, only when it sees a player again
allowing it to attack outside in the first place was tricky, and idk if I can get it to keep its aggro behavior upon warp, but I do want to at least address the nav breaking
For the renderer stuff, I guess there's kind of a rule that mod devs have to follow: "adding or removing MeshRenderers from enemies must update EnemyAI meshRenderers & skinnedMeshRenderers."
MC should either...
- Follow the rule above and fix MimicPatches.cs and update renderers. (MEO has to fix this too) or...
- Add EnemyAI support for CosmeticApplication. This probably practical, but I'm not a fan of it as it adds side-effects to existing functions and bloats CosmeticApplication.
im more of a fan of the first option
I think given that CosmeticApplication is attached to an EnemyAI, it would be nice if it did it automatically, but obviously the downside is that it will be allocating and throwing away as many arrays as there are cosmetics because it doesn't apply all of the cosmetics in one function call
so yeah, first option probably better as the API stands
I wanna put the jester under a hydraulic press
mood
make a mod
Alright so I fixed the nav issue, I think. Testing my latest code I haven't had the issue pop up again.
As far the whole "jester attacking while still in box" thing, that should already be fixed and I couldn't replicate it
@copper yew @rocky fable @faint copper let's fucking GOOOOOOOOOOOO. Only fires if the null-check finds a null so it only logs one time
Ayyyyyyyy
No more log spam
๐
just tidying up the log message, then I'll test again and if all goes well push the update
Look at this chad out here doing work
dubbbbb
Lunxara's bepinex is config'd differently then mine so it's missing the info-padding in-between these but I spawned 3 masked with small delays between each - after each spawn, I crossed the "set safe in ship" threshold to trigger EnableEnemyMesh.
Each one only logged one instance of null renderers! And referencing the gameObject didn't break everything!
Let's gooo ๐
Is there something I should toggle to add that?
lol
For saving it to the actual log file afterwards
๐
idk about anyone else, but I like seeing how much stuff occurs in-between things happening
Here's a slightly better log that I edited a bit
I'm so pleased lol
๐
You did a great job!!!!
- StarlancerAIFix v3.2.0
- Optimized the NRE patch. It now only runs the null removal if a null reference is found, which also means it doesn't spam the log.
- Fixed an issue where jesters would get stuck in place if they entered the attack behavior outside and then lost their targets.
Starlancer AI Fix v3.2.0
@rocky fable Be sure to share the logs of the fix working out in the wild!
what's the error log supposed to look like again? i'll share it in #1200695291972685926
You should post an update for Mirage btw, so you can make it a recommended mod
yeah i will on my next update
Starlancer's AI Fix is now needed by everyone
just don't wanna push an update just to change the readme xd
either one of these, though the actual bepinex window screenshot still has the "(Unity.Netcode.NetworkObject)" piece
your suffering helped me firgure out how to solve my suffering lmao, thank you
LET'S GOOOOOO
I love seeing the variation in the number as well, I'm assuming the two masked had different numbers of cosmetics on?
They would have both been mimics of me since I was solo, but I never came across the other one I boxxed one cus it popped out of a vent in front of me XD
Ohhh you left before the other one fully spawned?
Possible lol idk
Only explanation I can think of for one having 2x as many nulls
Yeah it would make sense
The game certainly performs better without masked spamming NRE's though lol
Masked no longer go brrrrr on game performance
I'm glad there's a tangible benefit!
Was slightly worried that the performance hit wouldn't be mitigated all that much and the main benefit would be a cleaner log
So I'm quite pleased with it being actually effective in that regard
It was thinking "well ONE of us has to change"
So, how does this mod work with stuff like the SnatchinBracken which modifies the AI for that enemy?
Will it lose its custom behaviour once its outside and be replaced with this one's?
This is generally designed with compatibility in mind, and only specifically touches Jester, Sandworm, and SpringMan AIs.
- The general portion of the patch just gives enemies the appropriate navigation capabilities when they spawn, depending on whether they spawn inside or outside the facility. It doesn't touch any actual behaviors.
- The Jester patch is necessary because it has some hardcoded stuff to look inside the facility for players, I give it logic to be aware of players while outside.
- The Sandworm patch is a simple reset of its position to a random inside node after it attacks indoors, otherwise it warps to the surface and becomes broken.
- The SpringMan patch is a simple patch to let it resume its walking animation once it becomes completely cut-off from players. Purely an aesthetic fix.
All of those are postfixes. I have one prefix for EnableEnemyMesh that detects and removes any null renderers it finds to prevent any Null Reference Exceptions from occurring, which right now is mainly caused by MoreCompany + MaskedEnemyOverhaul, but even after they fix it on their end will serve as a handy safety net to catch any edge-case occurrences.
There's also one patch that's dependent on Lethal Escape or the WIP Seamless Dungeon mod, that does a postfix check on Update() to ensure that the enemy has the correct navigational ability.
Ah thats great
Today i am gonna test with all 3 to see what happens and if it works well with lethalescape + snatchinbracken
i imagine it will break, but thats due to snatchinbracken not knowing where to take the body outside
so typically we turn that mod off if we want the bracken to escape, or vice versa
Please let me know how it goes! I just took a look at SnatchinBracken's page and yea it's possible that it might break since it'll be setting its position to an inaccessible node.
However, I'm wondering if they have a fallback for the mansion tileset where the bracken room doesn't exist where "if bracken room doesn't exist or can't be reached, use normal favorite spot logic"
I suggested in their thread they could detect when they're outside and set a new favourite spot at the main entrance
then, could then make it so it goes back inside with the body and then resume normal behaviour
Possibly, though I wouldn't blame them if they decide that entering/leaving would be out-of-scope for SB. For compatibility and to keep the AI as vanilla as possible I would suggest just doing an outside check before they run their code
if (!isOutside) {set favorite spot to BrackRoom}
Makes sense, i passed it on to him
Sweet, ty :)
It would be awesome if all 3 mods could play nice
For sure!
Only other thing i would want is for lethalescape to let custom enemies escape
I wonder if starlancer would let them function outside too?
like the demogorgon
the shy guy already has its own unique ai for leaving without lethal escape
Lethal Escape actually does give escaping enemies the correct AI. SLAI disables LEsc's Jester Update() postfix in favor of its own, otherwise the Jester is permanently aggressive but stuck in the box. I added my extra Update() patch to it as a failsafe in case the AI just happens to not update (and like I said for when Seamless Dungeon comes out if it allows enemies to cross nav-thresholds).
Weird, for me the jester freezes outside upon killing a player, or perhaps when they go indoors
Like just stands still whilst the skull is out and doesnt chase anymore
We only had lethal escape, no other mod that would touch the jester AI in any way
Thats why i was gonna try this mod later to see if it fixes it
Unless I'm mistaken, LEsc doesn't have logic for returning indoors, does it?
And yea that's definitely odd, and SLAI should fix that for ya :3
The main purpose of the mod was to allow moon creators to put enemies on either spawnlist btw, in case you were curious
makes sense
I tried it, its goated, we are keeping it
They work
no way
Everything works with SLAIFix :3c
im enabling their inside spawns in a few intersting places :)))
my friends are gonna enjoy it
I hope they don't ๐คญ
4 lootbugs spawned in celeste outside and stole my loot put it out of the ship and protected it as if it was theirs
i love it
They do in specific conditions, like in maps that the ship is close to the floor like celest they can go in without flying
guess so!! plus lethalescape has a config for making them build nests outside
soo that likely came into play too
Hey @gleaming robin is there a bug right now with the current version of ai fix causing outside enemies to not spawn? I notice I keep having dogs and giants not spawning in and I'm gonna check the log after we end stream cus idk what's going on XD
I don't touch anything regarding the actual spawning of enemies, so I don't think it'd be the AI Fix
But lemme know if you find something
Taking it out solved it? Or you took it out earlier and the lack of it caused the issue?
I just took it out incase it was that, cus it despawns enemies after the first game, and for whatever reason every game after our first round after booting the game would never spawn the outside enemies
Only inside ones
Ah, weird
Yeah I thought maybe it was AIFix cus I didn't have this last night, but your mod didn't report errors so I doubt it lol
I would love for a fix for Stormy planets spamming this message btw [Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
[Warning: Unity Log] Particle System is trying to spawn on a mesh with zero surface area
Idk why they do that
I'm pretty sure that's a vanilla issue
It's when the static electricity is building on some scraps that aren't properly set-up
At least I'm pretty sure that's happened with some vanilla scraps
I dont need to, you dont know how his moons look
lol
I've also seen that specific Unity warning when using YippeeKeyMod and attempting to Yippee as a dead player
The jester seems to work outside now! Nice!
At first I really couldn't tell if this was a positive or negative statement lmao
Just released StarlancerMoons v1.0 peeps โจ
I still keep noticing dogs and giants aren't spawning the way they should lol, and I know this wasn't happening before the latest update for AIFix I need to check my logs again to see wtf is going on XD
That's very strange. I was testing my moon update and I definitely had outside spawns ๐ค
You've got quite the modlist tho :P
jesters seem a bit buggy, they seem to sometimes start cranking while walking with no music, then start properly cranking later
gah, I feel like there's gotta be something else causing that, I swear I haven't run into that bug in forever
Do you have anything else affecting enemies?
Weirdly enough the only mod I have installed that posted weird messages in the logs was Better Lobbies lol