#plugins-dev-chat
1 messages ยท Page 153 of 1
Because NW sucks at their job or smthn
you throw the keycard and it doesn't wokr?
ngl I want to apply to NW and create an automated testing system 
Idk who designed it that way
In order to test levels for collisions they have to get a template
That's why it doesn't work
Easier, shorter to use
You don't need to put everything in the same class
But thats the point of OOP that you can have member functions?
Can we kill item templating
Yes please
SRP has left thr chat
I wrote a baller patch for it
SRP long left the channel with extension functions
Pretty much nothing in this game follows SRP
But you don't need to bloat classes with methods that don't belong there
It hooks after the component.Target is DoorVariant target and then overrides handling if it's a custom keycard using CustomPermDetails
dunno man, LookAtDirection in a MouseLook class does sound something that should belong here
Facts
I didn't write it ๐ญ
I'm not saying it is your fault
I would definitely use many many extension classes but
if I were I would be much harsher 
class MouseLook : ... { }
extension(MouseLook) {
public static UpdateRotation() { ... }
}
dis you?
Bruh my autobus stopped and the driver is having a fight with a dude
Okay yo what the hell
UpdateRotation would be in the class no?
Xddd
nah, class is empty
Then just
everything is extension now ๐ฃ๏ธ ๐ฃ๏ธ ๐ฃ๏ธ ๐ฃ๏ธ
Use pointers
My issue literally just disappeared
How does that happen
Hello extension
Cache
Hello extension #2
hi
Like
Did you forget to copy the dll ๐ญ
Bus driver fighting dude
VS
Train driver hopping off the Vectron to take a piss (there was plenty of time)
Lol
๐ญ
20 minutes of fight bro
I see that Spawner has been removed from SCP-3114's code and it now uses the same ISpawnableScp interface as other SCPs. Will SCP-3114 get a separate slider for setting spawn preferences?
What the fucky
Yea
If it does it'd only be for halloween
If not, you can create an SSS for it
We'll find out sometime
Trueing
Settings aren't going to stay in the game for a halloween-exclusive SCP
someone should create a plugin 
Remember SSSS gave us grate power
I hate the role assigning code
you just have to patch the preference function
Yes, I have already done this via ServerSpecific in the current version of the game.
then tbh don't change it
Especially if people already got used to it
Nuh uh
Have you seen the 3114 readdition plugins?
They take like 4 patches and are held together by scotch tape and prayers
I already had to patch GenerateList cause of hard player exclusion 
It would just be weird if there was a slider from the game itself and a slider in the ServerSpecific settings. That's why I wanted to clarify this point.
i mean its 1 patch now
__result = true;

i used to have 2 patches since i was using basegame spawn and i had to fix since 3114 wasnt spawnable interface so
just have to patch this
private static PlayerRoleBase[] SpawnableScps
{
get
{
if (ScpSpawner._cacheSet)
return ScpSpawner._cachedSpawnableScps;
List<PlayerRoleBase> playerRoleBaseList = new List<PlayerRoleBase>();
foreach (KeyValuePair<RoleTypeId, PlayerRoleBase> allRole in PlayerRoleLoader.AllRoles)
{
if (allRole.Value is ISpawnableScp)
playerRoleBaseList.Add(allRole.Value);
}
ScpSpawner._cacheSet = true;
ScpSpawner._chancesArray = new float[playerRoleBaseList.Count];
return ScpSpawner._cachedSpawnableScps = playerRoleBaseList.ToArray();
}
}
or or
what the fuck are they doing 
FUCKING LITERALLY
[HarmonyPatch(typeof(Scp3114Role), nameof(Scp3114Role.EnableSpawning), MethodType.Getter)]
internal static class PreventDefault3114SpawnPatch
{
private static bool Prefix(ref bool __result)
{
__result = true;
return false;
}
}
Shut up dude
We get it halloween is coming up and they changed the code
It's a segue into talking about the fact that the spawn code is atrocious and it remains to be seen if the code will stay this way post-Halloween
also
this requires an scp to inherit ISpawnableScp anyway
which 3114 did in fact not
Welcome to the train of thought
that is why you patch the getter
you will see more power when [REDACTED] gets released
ooh role spawn rework
nice
cannot wait to fuck around for 4 hours to prevent spawning again
NextScp requires SpawnableScps to return only scps that inheirt ISpawnableScp
Can we just fix the spawn code?
would be a shame if it returned something that is not ISpawnable 
You mean the knife?
null ref 
It's so ass
its why i did another patch to make it create ISpawnableScp for ones that dont have it
fake it 
- a patch to remove ragdoll spawning
at this point we should just create an open source server impl 
Is it possible to convert a ragdoll to bones without an SCP-3114?
Does this other shit matter?
Another interesting point is that since SCP-3114 doesn't have a Spawner class in 14.2, ragdolls no longer appear at the spawn point.
I changed 3114 to spawn in heavy with a guard ragdoll on my server 
I love you
i wish 314spawner still had it
cuz that one had the ragdoll spawn code
for round start
The ragdoll spawner is getting refactored and will be available when we publish the next build
Oh
Okay
Can you please PLEASE confirm the ragdoll serial bug is fixed
See I just do it the fun way and do the ragdolls manually
so it is just not done yet and not an intended change
Correct
good to hear it ๐
It's just the public branch being incomplete atm
Ooo I love more northwood bugs, what'd they do this time?
Every ragdoll is spawned with Serial 0
Currently
ragdoll.Serial has been bugged for a while
LMAO based
Haven't seen that one getting reported
but its low priority
I've made that a ticket a long time
It is on the public git even
lemme search it
Ah, I thought you were saying this is a new bug
I just assume this is a merge bug
๐ the paperwork ughh
This is why I hate bureaucracy
excuses...
Don't think it's been fixed yet, sadly
well then the patches stay
thank fuck harmony can just ignore everything and update readonly field
I assume then the RagdollData class that is in the preview branch is the same as it'll be used in 14.2
Didn't work :((

I think I just need to change the damage handler
Should be, yeah
okay thank you!
For wha
^^
I don't want to spawn ragdolls, I want to convert them to skeletons
I'm unsure if that part is actually getting refactored
Oh
then yeah prob uhh
what i said
but
yk
not working for some reason?
bug?
Probably because it's not intended to convert ragdolls
Despite the weird naming
oh wait
But idk
maybe thats the client side code for making the bones?
rather than ragdoll to 3114 ragdoll
I'm gonna cry if the code is client-side
That's just fucked up
well
spawning the bones prob would be
but normal ragdoll to 3114 is doable
i mean basegame does it
This is all I want
Nice bones
oh
it does
Scp3114RagdollToBonesConverter.ServerConvertNew(this.CastRole, curRagdoll);
to disguise
lel
public static void ServerConvertNew(Scp3114Role scp, DynamicRagdoll ragdoll)
{
Scp3114RagdollToBonesConverter subroutine;
if (!scp.SubroutineModule.TryGetSubroutine<Scp3114RagdollToBonesConverter>(out subroutine))
return;
RagdollData info = ragdoll.Info;
ragdoll.NetworkInfo = new RagdollData(info.OwnerHub, (DamageHandlerBase) new Scp3114DamageHandler((BasicRagdoll) ragdoll, false), info.RoleType, info.StartRelativePosition, info.StartRelativeRotation, info.Nickname, info.CreationTime);
subroutine._syncRagdoll = ragdoll;
subroutine.ServerSendRpc(true);
}
Yeah where'd you think I got this lmao
yes
also
yea its client side the first i gave you
although this is used too in damagehandler
Yeah I saw this one
Setting damagehandler is how I got this
tbf
it might become easier with the new update?
@marble cobalt
will converting normal ragdoll to 3114 or is there like a solution u have
When does NW ever make shit easier for modders
admin toys
if (ev.Ragdoll.Base is not DynamicRagdoll ragdoll)
throw new InvalidOperationException("SCP-049-2 consumed a ragdoll that is not a DynamicRagdoll");
ReferenceHub dummy = DummyUtils.SpawnDummy("3114");
PlayerRoleManager roleManager = dummy.roleManager;
roleManager.ServerSetRole(RoleTypeId.Scp3114, RoleChangeReason.None, RoleSpawnFlags.None);
var role = (Scp3114Role)roleManager.CurrentRole;
Scp3114RagdollToBonesConverter.ServerConvertNew(role, ragdoll);
Dummy player
I wonder
If I can get away without the dummy
This is pretty much it
we're not refactoring 3114, we just changed the spawner script
Called that shit
oki doki
Wait why the fake model got update gingerbread maybe work with new models???
nobody said it was relevant to the conversation 
-# i really don't know what Killers is talking about tbh
thats some schizo text outgoing
if only we didn't have to do this bs just to change the appearance of a ragdoll...
Hi! Is it possible to destroy or open fully the new SCP-096 door?
try breaking it, if not then unlikely
havent had a chance to look at it yet
but why?
Even if you can thereโs a massive box preventing from getting inside

sometimes I question about why many things wrote that way.
I might even think this can be made into simple command (?)
The only thing that is required from it is the _boneParts which it just bone objects
๐ฃ๏ธ๐ฃ๏ธ๐ฃ๏ธ
it is likely because the game usually only needs that
and it needs the 3114 to put sync ragdoll
but idk
well the bones for the ragdoll (?) can has a dummy component i guess and you call once to get all children
bro
what is with players and going "ez" after losing horrifically and only getting out on chance
๐
what is it with eve and being stupid
ur just rude
nuh uh
ur a STINKER
ah found it!
ServerCreateRagdoll is setting serial 0 even if can be null
but that thing isnt used
It is used when creating a ragdoll
ah ye figured
If you check, every function defalt params to 0
ya
In RolePlay server we used that room
howtf did you post here without the role
you dont need a role to view here
Wait you dont?
nah
wtf I thought this was behind the plugin dev role
after release it got opened to everyone
aww dang it
close the gates
@slate flume
https://github.com/northwood-studios/LabAPI/issues/288
In here if you make it minus in any way in the code of
ExtractWaypointData (check screenshot) the check will be going downward so any new point has to be a smaller than before will be picked, so any negative priority would be the most of it?
Is that what you intend?
i think your pinging the wrong person?
Wrong its this @soft depot
negative priority should "deprioritizes" the waypoint if that makes sense
pff
negative should prioritize the waypoint more as I read tru it
thats what it does currently
Guh????
Bruh positive priority prioritizes waypoints
It lowers the given squared distance making the waypoint more appealing
But if negative priority worked, I could fake the priority, then have clients never use a waypoint cuz they think itโs 1000000 meters away
Thatโs stupid
defeates the purpose as everything inside also gets moved
Cuz thatโll make ppl go to brazil
the waypoinst already make me go there
you can fake the bounds to be zero, that will likely do what you want. although not sure if theres a case where negative priority works better
It does, but having negative priority work would be nice
i still dont know what waypoints are im ngl
wha
whaz
I have plans to work on documentation soon
But we are focusing on a big labapi update for 15.0 currently
2.0 incoming
๐ฃ๏ธ ๐ฃ๏ธ ๐ฃ๏ธ ๐ฃ๏ธ
skipping 2.0 tbh
already such a bad update

/j
Sex update for labapi
no
Can we ban this guy
Devs dont know what is sex
I don't need to

And it might be for the better if we stop that conversation
is there any labpapi event for Exileds ChoosingStartTeamQueueEventArgs
And that one does what
Choosing which players to spawn in wave?
no no like
when the round first starts
its fired when the server starts deciding the dclass, scp, facility guards etc
nahh not what i need..
it has to be a event thats called when the round starts but BEFORE any player role is set
ah so you want to edit who spawns as what
looking through the github i dotn know if i see anything
RoundStartingEventArgs maybe?
ok sweet
ye theres RoundStarting and RoundStarted which call before and after that stuff happens
Why all my plugins config was broken with the 14.2 server build 
Will be fixed trust
I just deleted the properties.yml and it work 
yea properties has changed afaik causing an error
itll be fixed for full 14.2 releaes prob
oml
the new nuke voicelines and music
so peak
this has to be one of my fav additions to SL in a long time
they fixed in new experiemental update
make sure you are on latest experimental
blah blah blah
14.2.0-deploy-d8abecba
๐ฅ
lmao
Why do I need to call a delayed call to give the player an effect, for example, in the OnPlayerSpawned event?
northwood moment
mostly stuff isn't fully setup when that event is called
one or two frames should be fine
i miss the old nuke voicelines ๐ข
use OnPlayerChangedRole
PlayerSpawned is called after the position is changed, effects are reset after that, but before the PlayerChangedRole
even then you'll want to delay
idk but it doesn't work without a delay
copium
@fathom charm could you test this without a delay?
I just checked it, the effect is not setting when spawning.
with call delay will work
Trust me
Every single unnecessary delay in Bright's codebase was removed
Refactored a ton of it
So we only have the strict necessary ones and it's generally for role changed/spawned
well in SL we have a few waits cuz of how Unity works lol
we love script execution order
a lot of stuff that needs to touch UI has to have waits
cuz for whatever reason unity made tons of UI apis only apply starting with the next frame
isn't it because they execute early
like tmpro at least
has a priority of -100 iirc
-# by default
unity moment
But
In this scenario you could just delay the LabAPI event itself
Only call it when the player is fully ready
Might skip intermediate states but whatever
should add a utility method which calls a coroutine
Player::WaitUntilReady(() => smth to do when player is ready);
awaitables when
Plugin devs shouldn't have to do that
why
Why do plugin devs have to wait until the player is ready in an event fired by the game
The game/LabAPI should wait to fire the event
When making plugins, you kinda learn how to fix SL's and API's mistakes
it's the fun part
or sometimes it's not so fun, but most of the time it's fun
when a local index changes
it does i think?
afaik it does
ive never had issues
someone tried and said no so idk
/// <inheritdoc />
public override void OnPlayerHurting(PlayerHurtingEventArgs ev)
{
if (ev.Attacker == null)
return;
if (ev.Attacker.IsSCP)
return;
if (ev.DamageHandler is not StandardDamageHandler handler)
return;
if (ev.Attacker.DoNotTrack)
return;
StatsDatastore store = StatsDatastore.Get(ev.Attacker);
store.Damage += handler.TotalDamageDealt;
base.OnPlayerHurting(ev);
}
Why is this doesn't work? like the damage is always 0
Totaldamagedealth runs after hurting
Ok thank you
wanted to show this off. I program custom roles for my server.
This is my new "Spartan" role, made the audio from four different sound effects that i found online and edited together in premiere pro.
The whole idea of it is when you die, you enter "The Last Stand" where you get another chance at 300hp rapidly decreasing.
have a bunch of other roles I've made that I can show hehe
nice
thank u 
I also made this
Ekko, the ability to rewind time (restores health to what it was before too). 90 second cooldown
There are 32 teleports everytime the ability is used lol
i know ;-;
DO YOU GUYS LIKE DO YOU GUYS LIKE
TOOK VERY LONG TIME
and there are a lot more of these unique roles ๐
HEY
ITS YOU
YOU MADE SCR
THIS IS BASED ON YOUR PLUGIN LOL
this is all made on top of your plugin
This 2 role is so good man, good job!
thank uuu
In Calamiy we have some but most of them made by Kadava himself. I just occasionally help the plugin that builds top on scr
do not let scr get archived. or out of date. ๐ฟ
because my special ability roles depend on you
I plan to update cus new labapi events
Whoops
Lol
Is there a damagehandler for scp207 or is there only UniversalDamageHandler?
Whatever the one effects use
??
Its uses UniversalDamageHandler
public override void OnTick()
{
if (NetworkServer.active && !Vitality.CheckPlayer(base.Hub))
{
float damage = base.CurrentStack.DamageAmount * GetMovementStateMultiplier();
base.Hub.playerStats.DealDamage(new UniversalDamageHandler(damage, DeathTranslations.Scp207));
}
}
ok
so there is no way to check if a player takes damage from scp207?
check if the Scp207 effect is active?
Yes
And this too probably
Scp207 scp207 = ev.Player.GetEffect<Scp207>();
if (damage == scp207.CurrentStack.DamageAmount * scp207.GetMovementStateMultiplier())
Okay
Or you could harmony patch it if you have harmony in your project
[HarmonyPatch(typeof(Scp207), nameof(Scp207.OnTick))]
public static class Scp207OnTickPrefix
{
[HarmonyPrefix]
public static void Prefix(Scp207 __instance)
{
if (NetworkServer.active && !Vitality.CheckPlayer(__instance.Hub))
{
float damage = __instance.CurrentStack.DamageAmount * __instance.GetMovementStateMultiplier();
Player player = Player.Get(__instance.Hub);
Logger.Info($"207 is dealing {damage:F2} damage to {player.DisplayName}");
}
}
}
okay
it's for rework damage for scp207?
Your trying to modify the damage done?
yes
Harmony patch should be
[HarmonyPatch(typeof(Scp207), nameof(Scp207.OnTick))]
public static class Scp207OnTickPrefix
{
[HarmonyPrefix]
public static bool Prefix(Scp207 __instance)
{
if (NetworkServer.active && !Vitality.CheckPlayer(__instance.Hub))
{
// Modify the damage to how you want it to be calculated here
float damage = __instance.CurrentStack.DamageAmount * __instance.GetMovementStateMultiplier();
Player player = Player.Get(__instance.Hub);
player.ReferenceHub.playerStats.DealDamage(new UniversalDamageHandler(damage, DeathTranslations.Scp207));
Logger.Info($"207 is dealing {damage:F2} damage to {player.DisplayName}");
return false;
}
return true;
}
}
okay
Huh
bruh [2025-10-23 00:17:07.820 +00:00] [STDOUT] at CustomPlayerEffects.TickingEffectBase.OnEffectUpdate () [0x00039] in <895ff7c21fbe46748fde1d20cfb514c1>:0
[2025-10-23 00:17:07.820 +00:00] [STDOUT] at CustomPlayerEffects.CokeBase1[TStack].OnEffectUpdate () [0x00000] in <895ff7c21fbe46748fde1d20cfb514c1>:0 [2025-10-23 00:17:07.820 +00:00] [STDOUT] at CustomPlayerEffects.StatusEffectBase.Update () [0x0000f] in <895ff7c21fbe46748fde1d20cfb514c1>:0 [2025-10-23 00:17:08.819 +00:00] [STDOUT] MethodAccessException: Method CustomPlayerEffects.CokeBase1[CustomPlayerEffects.Scp207Stack].get_CurrentStack()' is inaccessible from method Soyako_NoRP.Features.Patch.Scp207OnTickPrefix.Prefix(CustomPlayerEffects.Scp207)'
[2025-10-23 00:17:08.819 +00:00] [STDOUT] at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_throw_method_access(intptr,intptr)
[2025-10-23 00:17:08.819 +00:00] [STDOUT] at Soyako_NoRP.Features.Patch.Scp207OnTickPrefix.Prefix (CustomPlayerEffects.Scp207 __instance) [0x00014] in C:\Users\maell\RiderProjects\Soyako-NoRP\Soyako-NoRP\Features\Patch\Scp207Patch.cs:21
i love harmonypatch
enable unsafe code in your project
No no no don't do ts
@worn burrow
Don't
Harmony patch is unnecessary here
It's excessive and I don't recommend it
Yes there is! Check if DamageHandlerBase is UniversalDamageHandler and then check if the translation ID is Scp207
Recommending a harmony patch for this is crazy work
Istg sometimes I have to peruse these forums so people don't recommend wild shit to new devs
Don't have an over-reliance on Harmony patches, generally you should use the pre-existing implements as much as possible
In this case, it's also much cleaner to use LabAPI events instead of Harmony
Just do:
public override void OnPlayerHurting(PlayerHurtingEventArgs ev)
{
if (ev.DamageHandler is UniversalDamageHandler handler && handler.TranslationId == DeathTranslations.Scp207.Id)
handler.Damage *= 0.5f;
}
You can replace the damage change with whatever you want the damage to be changed to for each tick
It also has the benefit of, you know, not having to do this bullshit
It's less overhead, more scalable, and is less likely to break in between changes
You don't have to run Player.Get, create a new damage handler, manually handle the damage, access the Scp207 instance to get the proper damage amount, ...
if I player.Ban someone for 292 billion years do you guys think anything will break
player.Ban(long.MaxValue) 
what im doing ๐
player.Ban takes a long?!
Why the fuck does it allow you to ban people for negative amounts of time
๐ 
makes them owner 
@worthy rune Remember the character controller bug?
ReferenceHub dummy = DummyUtils.SpawnDummy("Bones");
PlayerRoleManager roleManager = dummy.roleManager;
roleManager.ServerSetRole(RoleTypeId.Scp3114, RoleChangeReason.None, RoleSpawnFlags.None);
var role = (Scp3114Role)roleManager.CurrentRole;
DamageHandlerBase handler = ragdoll.NetworkInfo.Handler;
Scp3114RagdollToBonesConverter.ServerConvertNew(role, ragdoll);
ragdoll.NetworkInfo = SetHandler(ragdoll.NetworkInfo, handler);
NetworkServer.Destroy(dummy.gameObject);
This causes almost the exact same issue
I think it's something with creating/destroying a player on the same frame
can this make peoples models glitch out ๐ฅบ
been trying to learn how 2 do that forever
Yo has anyone ever created the library of babel in SL?
No it makes it so player movement stops registering due to a null character controller
awww I wanted headless player ๐
Roblox reference???
No, just funny bug Iโve seen before but idk how to recreate
For bodies?
Debug.Log = nil
LogLuauVM: Error: [ServerVM] [string "RunString"]:1: attempt to modify a readonly table
[string "RunString"]:1
pog
got error handling done for my Luau plugin (unrelated to SL but I talked a lot about it here kek)
Yeah so you can break a server by running
ReferenceHub dummy = DummyUtils.SpawnDummy();
dummy.roleManager.ServerSetRole(RoleTypeId.ClassD, RoleChangeReason.None);
NetworkServer.Destroy(dummy.gameObject);
I made a series of patches that'll prevent the game from shitting itself if this happens
Now considering this has happened to people in the past I'm going to show the changes I made to fix it
[HarmonyPatch]
public class NullPlayerFixes
{
[HarmonyPrefix]
[HarmonyPatch(typeof(CharacterModel), nameof(CharacterModel.OnPlayerMove))]
public static bool OnPlayerMove(CharacterModel __instance) => __instance._ownerTr != null;
[HarmonyPrefix]
[HarmonyPatch(typeof(FpcMouseLook), nameof(FpcMouseLook.UpdateRotation))]
public static bool UpdateRotation(FpcMouseLook __instance) => __instance._hub != null;
[HarmonyTranspiler]
[HarmonyPatch(typeof(FpcMotor), nameof(FpcMotor.UpdatePosition))]
public static IEnumerable<CodeInstruction> UpdatePosition(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
{
var codeMatcher = new CodeMatcher(instructions, generator);
codeMatcher.MatchStartForward(CodeMatch.Calls(AccessTools.PropertyGetter(typeof(FirstPersonMovementModule),
nameof(FirstPersonMovementModule.CharController))))
.Advance();
int characterControllerIndex = codeMatcher.Instruction.LocalIndex();
codeMatcher.Advance();
codeMatcher.CreateLabel(out Label normalPathLabel);
codeMatcher.Insert(
new CodeInstruction(OpCodes.Ldnull),
CodeInstruction.LoadLocal(characterControllerIndex),
CodeInstruction.Call(typeof(UnityEngine.Object), "CompareBaseObjects"),
new CodeInstruction(OpCodes.Brfalse_S, normalPathLabel),
new CodeInstruction(OpCodes.Ret)
);
return codeMatcher.Instructions();
}
}
Now, this doesn't prevent errors from showing up
In my case I still got a few when the event happened
But it does prevent the server from shitting the bed when it does happen
Players appear to still be able to move around, interact with things, the whole nine yards
And I figure people might wanna know when something's gone wrong, these patches silently fix the problem and don't broadcast it, because the problem occurs every frame
Now it might be better to run some destroy code to destroy the faulty modules, so I think I might work on doing that next
dang so that's why
nice find
had the same issue with our pets, couldn't figure out why
added a one-frame delay to destroying our dummies

It was a bitch
We were having seemingly random freezing on the server and after like 5 hours it was narrowed down to "It's happening when a zombie consumes a corpse" and that meant the issue was with spawning the dummy
Added one frame delays and the problem was solved
Now I'm trying to root it out
I'm currently just fucking obliterating every faulty module when it tries to pull some game-breaking BS
gl
I don't remember but does anyone know if SSSS as like a setting dropdown that you can select multiple elements?
I dont believe so
Yes
Fr???
...
I meant a dropdown that allows for multiple not only one
i know dropdowns exist
Wait you mean like
A dropdown with a bunch of like checkmarks and stuff
?
This feels like a really obscure UI element
What is this for?
I wanted to do like you can select multiple cosmetics without making it like thousands of dropdowns
Wouldn't that then allow for people to select multiple conflicting cosmetics?
i have already something for that
and its not a problem
Why would you make something separate for that
waht
Why not just have like
Head Cosmetic: (dropdown)
Trail: (dropdown)
...
That prevents conflicts and is user-friendly
I already have
i just want players to be able to select more cosmetics from the same dropdown
Why, what?
If you select two cosmetics in the same category then they conflict
Why would you want that
Bruh wdym!
Does that mean you automatically force some cosmetics to disable if they conflict?
Does that mean you stack them in a non-conflicting way?
What are we talking about dude
yes
im stacking them in a non conflicting way
i just need to know a simple thing can i do with one dropdown mutliple selection.
Best fix I can think of is dropdown + button combo
Select item, press button to toggle it
hmm yea thats the best
why not something like this?
Because its not like 1 head, 1 torso but like 2 head, 3 torso
But yeah this cause that's the whole point in her initial question
Update @worthy rune sorry for pinging you so much just you were the person I was talking to about this before so I figured you'd wanna know
I boiled the fix down to less than a dozen lines of code by rooting out the inciting problem
[HarmonyPatch(typeof(FirstPersonMovementModule), nameof(FirstPersonMovementModule.UpdateMovement))]
public class NullFpmmFix
{
public static bool Prefix(FirstPersonMovementModule __instance)
{
if (__instance.Hub != null) return true;
__instance.ResetObject();
Logger.Info("Disabled FirstPersonMovementModule with a null ReferenceHub");
return false;
}
}
Real
Of note:
There's some larger unexplained problem
You're probably gonna have to use two button settings as it seems
If you spawn a dummy, set their role, and disconnect them on the same frame, you don't get a disconnect message because the OnDestroy never properly completes
i left the idea

I fear the idea isn't scalable
If you have 100 head cosmetics that's gonna get fucked up
But it's your perogative
Remember i work beyond your limits of primitives
So?
It'll still look weird
What's the reason for that?
Start shit?
btw axwabo if i release a plugin based on the theorem of the Library of babel, will it be liked 
A project towards a universal library. By this art you may contemplate the variation of the 23 letters.
.
Then keep the dropdown and tell the player that the settings are shit if they choose a bad combination
Your can do two dropdowns for the two torso settings, don't even need a warning tbh
Something there is producing an NRE before the log is added
Library of babel is not a theory
its a book
Is this in server roles?
That's the QueryProcessor::OnDestroy

Yeah that yeah
Hub isn't set until start is called which would happen next drake
Frame
Iirc multiple components do that

The problem isn't spawning and removing a dummy in the same frame, it's spawning a dummy, setting its role, and then removing it in the same frame
Right?!
Might be something with pooling or the role manager
I'm pretty sure rogue FPMM modules are what causes the occasional server movement freezing issue
It's possible if a player joins and gets assigned a role, and then disconnects in the same frame somehow, it causes issues
Because without this patch, the server shits itself
Which does mean this bug may be potentially exploitable
I can already imagine what the masses would do if they got their hands on the ability to take down servers just by connecting and disconnecting in the same frame
Someone would make a script and absolutely terrorize
i mean they could do that

you gave them an idea
Hello creators of the middle of the night not cheat client
Maybe we should add component.destroyCancellationToken.IsCancellationRequested in some places
The lucky thing is it's an easy fix
Just call ResetObject on the FPMM if the Hub is null
Uh good question
Does it happen base game
Theoretically yes
Then labapi because you need to apply it to a real scenario that can be replicated
Thats why
Well fire
If it doesnโt then they will discard it instantly
Create the cheat that crashes a server yourself and send it directly to LabApi
Ig in that case you will be gbanned
If the AC didnโt already gban you
Certainly coding cheats isnt gbannable
as long as you dont use them
It's just a proof that there is an issue to be solved
Yes it is
Based
That would be stupid lol, I can code as many cheats as I want, and Northwood will not ban me until I try to run it in online mode
Trust me if you do that they are gonna still ban you
A. Why?
B. How?
AC has logs and sends info from the previous session so if you injected the ac will send it
This is what i got told i donโt know the specific
There is a program literally designed to disable Online mode, AC, all forms of auth
so you can mod or cheat without any problem
But i got told this and honestly risking my entire career for developing an AC against the Clan is not a good idea
As much as i like trolling them
Northwood will not ban me for developing cheats if they can't even know and I am not bothering anyone else
Maybe but its nw
So i wouldnโt risk it
Unless they have a literal magic AC, which we all know Northwood does not
Sl ac detects yuzu hack as cheats
So
wtf is yuzu hack
And arc raiders ac has a cheat
also did i not just say there is a program that disables the AC and auth
Yuzu is an emulator for Nintendo Switch and hacks are just lines of code that you modify for example if i did that for Xc2 1080p hack it crashed the game for debugging
14.2 tomorrow 
You mean Csgo tomorrow
Knife scp
Hence offline mode
If you run the game in offline mode, you're allowed to do whatever modifications
I'm pretty sure that's in the eula
I donโt think tho they would allow to create cheats for the game
Wtf
Okay maybe you're right
I know because iโve asked ced and maro asked someone working on the AC because we hate the clan so badly we wanted to make an AC specifically tuned for them
This is where we need to send the clan
obelisk
Guh
Couldnt find a way to reset the selected item but seems to work
Oh hey look at that its me
My discord keeps crashing ever since the Halloween stuff got activated
GOLD GOLD GOLD
So thats why i couldnt use a couple of ports
So this is like a monthly tradition lmao
Crazy
Lets just not make it
If someone found out and reported you, then you could still be banned for cheat development per EULA 10
but if it will in offline mod
again, eula 10
or version have cutted AntiCheat

im so lazy to check it
but one question
is reports work during offline mod?
idk ask the anticheat ppl
or server owner/server mod can report dude when server only in offline mode...
You an anticheat human now!!!
human ๐ญ
ax is NOT human
๐ก
!rep
You can give a rep!
!rep @upper vapor
You have just given @upper vapor a reputation point!
then my question would be how does axwabo taste like?
I'm stealing this
what the fuuuuuuu
not a human means edible

only if not proven that is not poisonous but considering the furry aesthetic then most likely no
hes all wires and metal
and nanites
and ram
:3
This is why your fursona should be like a blowfish or something
MINE????
bRO
You're a closeted furry and we all know it
scalie
I swear im gonna make it once again the banana
The only thing im closeted irl is being trans
and nothing else
femboy
you're a closeted ||person||
i swear the last thing in my list is furry and egirl
You're literally an egirl though
no... i don't go ask money to people for pictures of me
neither i would give them to strangers lol
I think your definition of an egirl is very different from mine
i mean the egirls that behave like a certain category
but i don't fall in the category of egirl
if you define egirl as online girl then it applies
but usually egirls do some weird shit
yes
And @celest thorn doesn't?
๐
xd
You're talking to an SL dev
if you mean that then YES
๐ญ
but if you mean
anything else no
i know im crazy and any attribute you wanna put me on
but im not that degenerate or that low
what's your height above sea level

195cm
what the fuk
oh you mean NOT me corrisponding to that
elevation
are you shorter below the sea or something?
my city is 500
and i just found out that there are a total of 200 people living here
geoguesser time
That IS not my city
i don't live near enough Trapani
and its a ghost city
i went visit it
don't let the urbex youtubers discover that information
Its really hard you will find it because even if you search the exact name it shows up another city
so you need to search from nearby cities 
@hearty shard you need to up the intensity of night vision for it to work
-# not sure if you've figured it out yet
I was told like 5 minutes after
oh
๐ฅ
๐ญ
Holy slowpoke
Which damage handler is the bulkhead door?
thanks
np
So with this the player should not get damaged from the bulkhead
if (ev.DamageHandler is UniversalDamageHandler dh && dh.TranslationId == DeathTranslations.Crushed.Id)
ev.IsAllowed = false;```
DummyUtils
well
what r u trying to control
movement, look direction
ah you want to fake that
You need to get the FPC and get the SentPosition
Or something like that
you're gonna need to dumb down these abbreviations for me
okie
if (player.RoleBase is not IFpcRole fpcRole)
return;
fpcRole.FpcModule.Motor.ReceivedPosition =
ReceivedPosition = new RelativePosition(this.Position + this.Hub.PlayerCameraReference.TransformDirection(dir).NormalizeIgnoreY() * distance);
this is what basegame does for dummies
๐ญ
use a coroutine to have it move
if (ev.Player.RoleBase is not IFpcRole fpc)
return;
fpc.FpcModule.Motor.ReceivedPosition = Position;
or a component
or just stole the code from dummyfollower
how can I get the player from their referencehub?
Player.Get(hub)
thank uu
crazy
๐
silly me
bro like can i not control a dummy the way i do in RA panel
like with the "move forward 1m" or "look right 90 degrees" buttons
what's the labapi way ๐ญ
ReceivedPosition = new RelativePosition(this.Position + this.Hub.PlayerCameraReference.TransformDirection(dir).NormalizeIgnoreY() * distance);
that is what the RA panel does
with direction and distance being based on your input
Hi, questin, is there a way to hide the red and SCP079 indicator?
I want 079 to be able to talk over MTF radio but this makes it a little too obvious
VoiceChannel.Radio
rather than scp
could maybe?
but well
its an scp so i think it gets forced to be there
public override void OnPlayerSendingVoiceMessage(PlayerSendingVoiceMessageEventArgs ev)
{
if (ev.Player.Role == RoleTypeId.Scp079 && ev.Message.Channel == VoiceChatChannel.Proximity)
{
if (!Active.Contains(ev.Player.ReferenceHub))
return;
var radioMessage = new VoiceMessage(ev.Message.Speaker, VoiceChatChannel.Radio, ev.Message.Data, ev.Message.DataLength, true);
foreach (var player in Player.ReadyList)
{
if (player.IsDummy || player == ev.Player)
continue;
// Don't send it to 079, it's not much fun hearing your own voice.
if (CanReceiveRadio(player, ev.Player.ReferenceHub))
{
player.Connection.Send(radioMessage, 0);
}
}
}
}
Already using it
I was hoping it wasn't a client side issue but seems more likely sadly
oh well, lore wise it isn't too unrealistic to immediatly know that 079 is speaking
ohh, like an invisible guard or NTF that takes the name of the speaker and sends it through them
or tutorial...
or that yea
any alive noon scp role should work
How would I do this? sorry kinda new to this
For all devs
What did i just watch
oops
what the hell did you do ๐ญ
I uhh, no proper guard for dummy spawning
the only reason it didn't go higher is because the server crashed ๐ญ
oh!
OK, dummy spawned correctly but doesn't seem to want to send the radio message
excuse the overly bright screenshot, my HDR is acting up
ok it does but very limited range. Yippie, another problem lmao
you can
change that
How would I do that?
if(item is RadioItem radio)
radio.Base.Ranges[RadioRangeLevel.UltraRange].MaximumRange = int.MaxValue
so the proxy would need a radio right?
the bot needs the Radio
or else
idk
you can't do much
other than that
I'll try it, thanks!
no problem but remember to make the id of ultraRange
on the item
via radio.Base._rangeId = (byte)RadioRangeLevel.UltraRange;
otherwise I may have to put the receivers referencehub as the sender, then hide their tag
or you use the SpeakerToys with infinite range

I am trying to do this without any dependencies but I'll keep it in mind
cuz battery is also a problem with the radios
hmmm i mean what you wanna do?
you can make it infinite
Give SCP079 the ability to hijack NTF radio without his portrait showing up as the speaker
if(item is RadioItem radio) {
radio.Base._rangeId = (byte)RadioRangeLevel.UltraRange
RadioRangeMode mode = radio.Base.Ranges[RadioRangeLevel.UltraRange];
mode.MaximumRange = int.MaxValue
mode.MinuteCostWhenTalking = 0;
mode.MinuteCostWhenIdle= 0;
}
here
hmmm
then redirect voice messages
from the player
using
PlayerSendingVoiceMessageEventArgs
Change the ev.VoiceMessage.Channel = VoiceChatChannel.Radio
canโt you set the voice channel to radio without using radio?
or does that not work
it seemed to work for SCP079 but maybe that works differently for SCP's
And the range.. still exists?
for SCP the range is infinite but when using a Tutorial dummy (or any human class for that matter) the range is reduced to a few rooms at most (I tested roughly 2 to 3 rooms before audio cut off)
ok excluding 3114 and 079 on speakers
yeah that makes sense
all good, no need to apologies about pinging. im pretty interested about how this happens and all the info provided is great. the destroy on the same frame thing looks like it could be caused by unity not calling OnStart/OnEnabled (which is expected). but the OnDestroy/Unpooling code wasnt expecting the "unsetup" objects. i guess this could happen on a vanilla server if a player is created on the same frame the server restarts? although seems like that would be rare. ill look into it myself at a later time so it can be fixed base-game, thanks for the info.
oh i see it requires a role to be set in the same frame, probably wouldnt happen base-game then
still would be good to fix it for plugin devs tho
is there a way to put the dummy on global?
the global means their thing will be shown
idk
radios are silly
ah
so the range of the dummy is roughly halfway through entrance zone and it has it wether it has a radio or not
strange
Whatโs the issue then
With setting the voice channel to radio for 079
their portrait will show up
Ohh
which I do not want
If the portrait is client sided youโre fucked
Probably going to have to use a dummy
yeah, that's why I am trying to use a dummy to do it
but the dummy has weird range limits and that is whether it has a radio or not
_rangeId doesn't exist
you have it publicized
huh, I can't seem to find it
cus its private
How do I publicize it?
<PackageReference Include="BepInEx.AssemblyPublicizer.MSBuild" Version="0.4.2" PrivateAssets="all" ExcludeAssets="runtime" ReferenceOutputAssembly="false" Private="true" />
<Reference Include="Assembly-CSharp" Publicize="true" Private="false" />
you have to have a new sdk style csproj
otherwise it doesnt work
you can do the same publicize stuff in others
Just add this to my packeges.config?
no
sorry, I have never done this before so I am struggling allot
if your .csproj file is not made or updated to newest sdk you have to upgrade into newest sdk style
it's probably using the old one but no idea how I would upgrade and google isn't helping either
to make your life easier, create a new .net6 or net8 project and edit the .csproj to be <TargetFramework>net48</TargetFramework> isntead
you have to readd your references and stuff so
yeah, tho that's not the hardest part. I just followed the documentation (the little there is) when I created this project
what IDE you using? rider or vs?
VS
send your csproj here i send back one and replace with yours
(you will have to unload or close your VS until you paste it back)
Hey, now it recognizes _rangeId!
only got a warning from Assembly-CSharp
something about Processor missmatch
Add <PlatformTarget>x64</PlatformTarget> to a property group and it should be good
that seemed to work, thanks!
Np
Also thanks for being patient with me, I am used to regular Unity stuff so modding for the first time is a whole task to learn ๐ญ
you still have some kind of basics already, harder with people who have none (eg. me when I was starting with SL modding)



