#plugins-dev-chat
1 messages · Page 34 of 1
have this too
i think i might know what it is, #plugins-dev-chat message
so lmk if it still happens from like 30 minutes after that message
same for me
@late shoal @pallid galleon see #plugins-dev-chat message and the message below that
Been reading through it, cheers! 
I'll send a message in here if we encounter it tomorrow

👍🏻
Faking someones role to spectator makes everyone in the server here them. Iv noticed this when i do it with my plugin and i just stop their voice packets.
that was another thought of mine
although it didnt happen when they were faked to FilmMaker
but i guess it may be because that is handled differenrly
Ya i just know i ran into that problem since i believe mimicry
ill just do a check just in case
And i just stop the voice packets cause i fake ppl as spectators for stuff
it also happens if you fake a human role as an scp role
ill just add a check to stop a vc packet if synced to spectator and the player isnt actually a spectator
question about serverside settings, are they per server or is it possible to make a group of servers use the same settings?
i.e. multiple servers running the exact same plugins that should share settings
its per server, there isnt away to properly share settings across servers but you can do hacks like creating new ids for settings each time with the default vaules of settings for the player if you store them on the server(doesnt work for plaintext input tho)
bleh
if I wanted to suggest such a thing, should I do it on the LabAPI repo?
Because without it, it kinda makes using the system a lot more annoying for players
yeah although keep in mind this https://github.com/northwood-studios/LabAPI/issues/108
btw these 20 servers are they on the same ip?
nop, that's the issue
CT has 12 iirc
for active servers it makes sense
Bright
Yea
i mean different port but same ip?
NA servers, two different modes, then EU servers with same thing
nah IP changes too
not for all servers but groups of them
how split up are they, as in if setting were shared per ip would that still be a problem
you'd have to port over your settings at least 5 times
hmmm
would help but it'd be nice if we could just set a string id on the server
and it'd just use it to group the settings as belonging to one host
Yea but then ppl could get your settings by having you join a server

Itd need some way to verify it
I don't see the issue with that
What are peeps gonna use it for outside of keybinds and gameplay toggles
its something nw cares about so its hard for me to ask for something like that
we need another way
you've got the verified server system
could make that string id be on top of that
client checks the verified server belongs to the group, and then sends it the settings based on the configured id

@unique crane just confirming this is documented https://github.com/northwood-studios/LabAPI/pull/69
Yes, I fixed it in internal PR too
will come in 14.2
👍
Assuming it gets merged by then
and server console [WARN] [LabApi] Missing DoorName enum value for door name tag HID_LAB
in 1 year*
Known too


Is it possible to scale pickups?
YEa
Same as player
gameObject.transform.localScale
shouldn't need to
I think
idk but it might be like how it is for players
you only need to do it for players if you're faking their scale iirc
don't remember
Idk if its natively supported now but
How can i create a damagehandler for the Disruptor so i can apply it to ragdolls?
ragdoll.DamageHandler = new DisruptorDamageHandler(new DisruptorShotEvent(Item.Get(ItemType.ParticleDisruptor, Server.Host).Base as InventorySystem.Items.Firearms.Firearm, DisruptorActionModule.FiringState.FiringSingle), Vector3.up, -1);
I had this on exiled but i don't think it works especially for the Item.Get
why you need create it
..........
I used old exiled code
at the time
im talking 5/6 months ago
you can set the event to null and initialize the firingstate property
ced777ric writing...
@worthy rune @restive turret @pallid galleon @late shoal ive had someone else woth the issue provide some more data, it should be entirely fixed now
I may revise it later as i need to reveal someones class to the entire servef when they use a radio, and i think checking if they are near any radio is expensive, so itl just reveal for now
Make sure you install the latest using the update commands if you disabled the updater, if its on itl do it by itself
(checkforcedmodupdate and installcedmodupdate
like:
use in
or just unsafe and *ev.isAllowed
then it
no
unsafe code is UGLY
because i dont wanna use unsafe
what
What emojis can the remoteadmin display?
Thanks
https://discord.com/channels/330432627649544202/1378339012611149894
Anyone have any ideas?
how can I set a dummys role?
setrole
How do I display text on a client's screen?
Player.Get(dummy).SetRole(...)
or
dummy.roleManager.ServerSetRole(...);
player.SendHint("test", 3);
Is there anyway I can position it
Unity uses rich text
Rich text documentation for TextMesh Pro.
or use some that does that for u idk
Oh i meant like x, y pos
Thats more of a client-side thing im assuming
Because im looking to place my XP and level text somewhere near the edge of the HUD
There is no direct way to do that
Source engine has spoiled me
You will have to combine the positioning tags
Ill try that, thanks
dummy it separately class
oh
how do I set a dummy hit point and speed if possible?
Huh?
Wdym
Hit point? As in damage?
For speed use MovementBoost effect
hit point means health, so yes health
thanks
player.Health
Is it possible to make "custom models" be visible in the hands of the player like in the hands of a player
Like how do i calculate it
anyone have any idea if you can get the player's steamid?
Use userid I think
Thanks
Remember that only user ids ending with @steam has the steam id in it
There is discord login, northwood, dummy, etc too
DAVID
EVE
Ask ced
@ced paycheck where
I need it for smth else but alr, thanks for the info
what
you need to have a collider on the server but not on the client
so yes these flags are good but do a delayed call after spawning, enable the collider and set isTrigger to true
primitive._collider
or GetComponent<Collider>()
public class ShootingWeaponSlowness : CustomRolePlayEffect
{
public override CustomRolePlayEffectType Type { get; set; } = CustomRolePlayEffectType.ShootingWeaponSlowness;
public ItemType[] AffectedWeapons { get; set; } = { ItemType.GunFRMG0, ItemType.GunLogicer };
public byte Intensity { get; set; } = 30;
protected override void RegisterEvents()
{
Exiled.Events.Handlers.Player.Shot += OnShot;
base.RegisterEvents();
}
protected override void UnregisterEvents()
{
Exiled.Events.Handlers.Player.Shot -= OnShot;
base.UnregisterEvents();
}
public override void GiveEffect(RolePlayPlayer rpPlayer)
{
base.GiveEffect(rpPlayer);
rpPlayer.ExiledPlayer.EnableEffect(Exiled.API.Enums.EffectType.Slowness, Intensity, 1);
}
void OnShot(ShotEventArgs ev)
{
if (RolePlayPlayer.TryGet(ev.Player, out var rolePlayPlayer) && rolePlayPlayer != null && rolePlayPlayer.IsHaveRolePlayEffect(this) == false) return;
if (AffectedWeapons.Contains(ev.Item.Type)) GiveEffect(rolePlayPlayer);
}
}```
what problem? Why events dont registering?
( I know thats exiled, but just tell me did i something wrong with registerall so events doesnt registered (RegisterEvents Doesnt executing) )

For what reason could such an error appear?
hub is null
player has been destroyed
oh it uses StaticUnityMethods.Update
😭
you're cooked
This is understandable.
I'm trying to figure out why it becomes null and causes this error.
is there anything wrong with that lol
no but you cant get a trace back to the error itself
i dont believe
exception -> blow up
and remaining events don't get called
yes
but also
horrific to debug

simply have no bugs
Can the server be unverified if I return the old horror sounds when meeting an SCP?
Well if they are free to use
"old horror sounds"
Yep
So I can use their sounds on my server?
:D
Quick question, if anyone knows
When you set Damage on a damage handler (eg. firearmDamageHandler.Damage = 10) is this affected by armor and penetration and status effects and all of that, or is that just going to be plain damage?
Check the license but I think yes?
Ok
might depend when you do it
cuz if you do it before the armor checks etc then yeah will check armor as normal
if you do it after that then it will do your damage
or just
do it the right time
depends?
when is Hurting called
cuz again
the question is what does it do when you set Damage value
it depends
Hurting event will be different from smth else
might be
i do think there should be 2 events for it tho
might confuse some though
wdym two events
Hurting/Hurt?
no like
where you can modify Damage
with what they asked
both things
or ig
could add a property to damage handler?

yes but
events
from
LabAPI
one for before it one for after
yeah but
it is
?
nvm
i said hurt was after
So yeah either make a custom damage handler or patch the armor calculations out
yeah my bad
What is it
its allg
okiiii
Talking about armor calculations being done after the Hurting event
There is like ing/ed events for.. almost everything?
well not for that
not what we mean
Then what do you mean
y'all want an event for everything 
i need to unapi the lab
theres event for before damage happens and one for after
basically a way to override armor damage reduction
but we want for before damage is like affected by armor etc
LabAPI-less server build for you
- after
right now Hurting runs before armor damage reduction
banned from downloading the normal one
yeah so if you set damage to 1
its not guaranteed to stay at 1
WHAT DO YOU MEAN STEAMHAPPY
etc
kek
yes
steamhappy
Yeah
and then I join server when someone makes their own api and patches out 9567896 things
and I get blamed that the game doesnt work properly
(its their fault all the time)
that's their fault
i need performance for testing my stuff on a server only i have access to

I do my best to keep patches low and use transpilers for compat
but there's still plenty of things you need them for
or even just NW fixes
like wearables disappearing on role change
real
got a whole folder of them 
!nwmoment
also need to fix 079 getting stuck with Decontaminating today
079 can get Decontaminating in light
and sometimes keeps it for the rest of the round
at least for the first 2
0 clue
gg
ive never seen this before
wasnt on my server either so i cant check for 079 related changes
I dont think that anything related to 079 was changed
except for value changes
like energy regen
No you didnt
Show me the patreon receipt
i bought it on my 27th alt on steam
with your name on it
lost the password
Sure..
Hm?
about how you should join a meowing contest
How about no
HAHAHAHA
not here i guess
obviously I wont do that here
david did it in the staff discord!
Lumi get out!!!
cant send it tho otherwise id get nuked :c
stop getting ur members to meow for you
hardcoded game ban
BRO THE COMMUNITY VOTED THEIR MEOW THE BEST AND I NEEDED THE BACKGROUND NOISE GONE
you...
YOU
TOLD
YOUR ENTIRE
COMMUNITY
TO MEOW
THEY ASKED FOR IT
YOU
yeah
i have my ways
i wont 😭
whens the next lumi cancellation
When we deporting eve?
you
got them to meow for you
it felt so weird fuckin doing all that trust me
im not the one voice recording myself meowing
😭
at least not yet
what do you mean yet
ok so that means she will send a voice message meowing at some point
@unique crane I don't see an issue for the wearables bug but if you escape/change role with wearables they get reset to none, and don't show up until the player drops/puts the armor back on
I'll test on a vanilla server but it'd be a weird issue for a plugin to cause
I think someone would notice that
I found that WearableSync.OnServerRoleSet overrides wearables to None
idk if something else is supposed to pick up the slack afterwards
yeah no I RA switched a Dummy from MTF Captain to Class D with no inventory reset
the armor isn't visible anymore
Please report it then
will do
northwood-qa/scpsl-bug-reporting#1495
Happens for any role change
northwood-qa/scpsl-bug-reporting#514 still happens in 14.1 too, any time you kill and respawn a player on the same frame
On that note, what triggers the black screen for clients and is it something I can patch out
I'm assuming it's part of the role change net message?
¯_(ツ)_/¯
trying to fix it since it happens to a lot of our players
Why do people try to join the server when they know they are banned
Gotta see that ban progress
SpectatorSpawnReasonReaderWriter.WriteSpawnReason gonna try patching this to never write KilledByPlayer
I swear if NW added a client-side ban progressbar they could stream that shit to retirement homes
nvm getting killed by a player doesn't do the black screen
only deaths caused by nobody? hm
nvm it does it if you don't switch to a player
maybe i can forcefully make them look at a player to prevent that
Someone asked in exiled if it is possible to sync Transform::LookAt(Transform) to the client, and idk how to do that lol
guh
is it a network object
079 Camera
grrr
hold on
lemme figure that part out
it inherits Scp079InteractableBase which is a MonoBehaviour
not network object
can you network parenting an object
can I send a network message to parent a gameobject to a networked game object
wait map loaded game objects aren't referenceable via network?
fun
can you force a player to spectate another player
or is that fully clientside
you cannot
great, can't really fix the black screen bug then
ugh
you cant sync that one
i mean i could just
patch the damage handlers to always send the spectator spawn reason as "killed by X player"
so that the player tracks them instead of fading to black

whats the bug
if you die to any other reason than being killed by another player, and then respawn on the same frame, you still get the spectator fade to black
while you're alive
I can "fix" it by forcing the spectator reason to be "Killed by X player" and making X a player that's alive, since that'll prevent fade to black, but it'd be confusing for players
Has this ever actually happened in a game?
multiple times
can happen in vanilla if you die on the same frame as a spawn wave
modded servers can make that easier depending on what they do
Is there any "easy" way to transform an Item from a players inventory into a Pickup in the world?
drop it
player.DropItem() ?
Can the returned Pickup be used to immediately set its position?
yes
Thank you
o7
When i use DropAmmo, the return type is
IEnumerable<AmmoPick>
Probably because it might drop multiple ammo boxes?
How can i handle this IEnumerable? Im not familiar with this return type ^^"
loop through it
And is there a way to make it so the method is guaranteed to only create a single ammo box?
Either with increase yield or by limiting the "amount" variable i give it?
Your only guarantee would be to patch the ServerDropAmmo method to only allow it to return one pickup
but otherwise you'd just do this
var pickups = player.DropAmmo(...);
foreach (var pickup in pickups)
{
// Do something with pickup.
}
Thank you ^^
Does Network_collisionsEnabled = false; in CapybaraToy work for you guys?
Cause I'm pretty sure it did and now it does not
Unless I'm a schizo
wasnt it bugged
so you have to enable and disable it
for it to sync
idk
Try it
If it doesnt work then im clueless
@hearty shard that works, thx
I think the reason it being broken is collider not existing at that point yet
oh i thought it just didnt sync it properly
screen goes black on the client when a ragdoll associated with the player spawns
Disabling ragdolls sounds like a heavy fix
you could try denying the spawn only for the player that died
otherwise waiting for a base game fix would be the only way imo
i'll probably wait unless i find a better solution somehow
otherwise i'll have to write detection for dying and spawning on the same frame 
not fun
I have an issue with the player.DropAmmo function
Trying to drop lower amounts of ammo creates inconsistent results and doesnt drop the actual specified amount.
If i have less than 7 ammo, specifying an amount between 1-6 drops exactly that amount.
If i have 7 or more ammo, specifying an amount between 1-6 always drops exactly 7.
send code
i mean
it can't be that hard
no but it's annoying
cause i gotta kill the player and re-run everything that already ran for the player on spawn
and it might not even guarantee anything
public static bool TryDropAmmo(Player player, ItemType ammoType, ushort amount, out string output)
{
output = "Requested item is not ammo.";
if (!IsAmmoType(ammoType))
return false;
output = "Why do you want to drop 0 ammo ._.";
if (amount == 0)
return false;
if (!TryGetPlacementPosition(player, out Vector3 point, out Vector3 rotation))
{
output = "Failed to get a placement position.";
return false;
}
IEnumerable<AmmoPickup> pickup = player.DropAmmo(ammoType, amount);
int iterations = 0;
foreach (AmmoPickup p in pickup)
{
p.Position = point + (Vector3.up * iterations * 0.1f);
iterations++;
p.Rotation = Quaternion.Euler(rotation);
}
if (iterations == 1)
output = "Placed 1 box of ammo.";
else if (iterations >= 2)
output = $"Placed {iterations} boxes of ammo.";
else
output = "Placed invalid amount boxes of ammo? ....What? How?";
return true;
}
I checked the sent "amount" variable and that indeed is 1-6 and not suddenly 7
how are you calling the method
if (arguments.At(0).ToLower() == "ammo")
{
response = "Wrong usage of command";
if (arguments.Count <= 2)
return false;
if (!ushort.TryParse(arguments.At(1), out ushort amount))
return false;
if (!EvaluateAmmoType(arguments.At(2), out ItemType ammoType))
return false;
// Main function
if (!TryDropAmmo(requester, ammoType, amount, out response))
return false;
if (arguments.Count >= 4)
response += "\n[Info] Additional arguments do not change the function of this command.";
return true;
}
In a client command Execute()
If i have 5 ammo and do the command to drop 3, it drops 3
If i have 20 ammo and do the command to drop 3, it drops 7
what kind of ammo are you trying to drop
ItemType.Ammo9x19
Other ammo types also do it but with different values
44cal's minimum is 3
556 is 20
Huh its the same value of the leftmost button for 556 and 44. (although 9x19's left button is 10, and not 7...)
Maybe it is this checkMinimals...
Yup setting it to false did what i wanted ._.
Thanks for being my rubber duck
[log] ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds
[log] Parameter name: destinationArray
[log] at System.Array.Copy (System.Array sourceArray, System.Int32 sourceIndex, System.Array destinationArray, System.Int32 destinationIndex, System.Int32 length) [0x000cb] in <069d7b80a3914a08b6825aa362b07f5e>:0
[log] at System.Array.Copy (System.Array sourceArray, System.Array destinationArray, System.Int32 length) [0x0002c] in <069d7b80a3914a08b6825aa362b07f5e>:0
[log] at InventorySystem.Items.Autosync.AutosyncMessage..ctor (Mirror.NetworkWriter writer, InventorySystem.Items.ItemIdentifier itemId) [0x0004e] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at InventorySystem.Items.Autosync.AutosyncWriterBase.Send () [0x00010] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at InventorySystem.Items.Autosync.AutosyncWriterBase.Dispose () [0x00000] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at InventorySystem.Items.Autosync.AutosyncItem.ServerSendTargetRpc (ReferenceHub receiver, System.Action`1[T] extraData) [0x00020] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at InventorySystem.Items.Keycards.ChaosKeycardItem.ServerOnNewPlayerConnected (ReferenceHub hub) [0x00007] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at InventorySystem.Items.Keycards.KeycardItem.<OnTemplateReloaded>b__46_0 (ReferenceHub hub) [0x00008] in <8db1ca0fe9a6484084cda320b139932c>:0
[log] at (wrapper delegate-invoke) System.Action`1[ReferenceHub].invoke_void_T(ReferenceHub)
[log] at ReferenceHub.Start () [0x00009] in <8db1ca0fe9a6484084cda320b139932c>:0
Can I just make a bug report and copy this stacktrace over?
Sweet, I'll wait for an answer from Northwood
I'm not a part of the QA team so take my answer with a grain of salt:
If you do open a bug report the worst they will do is ask for more information, if you have reliable reproduction steps that work on a vanilla dedicated server you should be fine
I'll try and find a way to reproduce it, but so far it's just spamming our server logs when a player connects
I'm assuming there's a chaos keycard somewhere on the map
Do ragdolls not have network identities?
Getting an exception when I call NetworkServer.Destroy() on one
NullReferenceException: Object reference not set to an instance of an object
at Mirror.NetworkIdentity.OnStopServer () [0x00023] in <d73d070e2abb49cd982556c9f692e950>:0
at Mirror.NetworkServer.DestroyObject (Mirror.NetworkIdentity identity, Mirror.NetworkServer+DestroyMode mode) [0x000be] in <d73d070e2abb49cd982556c9f692e950>:0
at Mirror.NetworkServer.DestroyObject (UnityEngine.GameObject obj, Mirror.NetworkServer+DestroyMode mode) [0x0001e] in <d73d070e2abb49cd982556c9f692e950>:0
at Mirror.NetworkServer.Destroy (UnityEngine.GameObject obj) [0x00000] in <d73d070e2abb49cd982556c9f692e950>:0
they should have one, how was it spawned in the first place
the amount of copies mirror makes should be illegal
i counted it and there are 5 times when data is copied (mostly from writer to writer)
just player death
i kill a bunch of dummies, cleanup code destroys the ragdolls after 5 seconds
apparently one of the network behaviours in the identity is null or invalid
weird
a little annoying
i'll just patch mirror ig
... the null check in the patch doesn't fix the error
@worthy rune
So for some reason... the ragdolls have a null network behaviour array?
considering I see them from my client, im guessing they should be
to network spawn them you would have to have the networkbehaviour list to make the spawn payload valid
I just kill the dummies via the kill command, I don't do anything special
is there some special behaviour im not aware of for ragdolls?
you are not using a special version of mirror or something

I'll test on a vanilla server with just some ragdoll cleanup code
public override void OnPlayerSpawnedRagdoll(PlayerSpawnedRagdollEventArgs args)
{
Timing.CallDelayed(5.0f, () =>
{
if (args.Ragdoll != null && args.Ragdoll.Base)
{
Logger.Warn("Valid ragdoll, destroying.");
NetworkServer.Destroy(args.Ragdoll.Base.gameObject);
}
});
}
yeah no it really seems to be SL
[2025-05-31 22:12:05.954 -07:00] [STDOUT] MEC.Timing:Update()
[2025-05-31 22:12:05.954 -07:00] [STDOUT] NullReferenceException: Object reference not set to an instance of an object
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at Mirror.NetworkIdentity.OnStopServer () [0x00023] in <d73d070e2abb49cd982556c9f692e950>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at Mirror.NetworkServer.DestroyObject (Mirror.NetworkIdentity identity, Mirror.NetworkServer+DestroyMode mode) [0x000be] in <d73d070e2abb49cd982556c9f692e950>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at Mirror.NetworkServer.DestroyObject (UnityEngine.GameObject obj, Mirror.NetworkServer+DestroyMode mode) [0x0001e] in <d73d070e2abb49cd982556c9f692e950>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at Mirror.NetworkServer.Destroy (UnityEngine.GameObject obj) [0x00000] in <d73d070e2abb49cd982556c9f692e950>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at SLTestPlugin.MyEventHandlers+<>c__DisplayClass0_0.<OnPlayerSpawnedRagdoll>b__0 () [0x0004b] in <def0e20a2c984b8b92d9ebdbdb7ad54e>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at MEC.Timing+<_DelayedCall>d__310.MoveNext () [0x00056] in <857a4408504f4deea6b81470f00f71dd>:0
[2025-05-31 22:12:05.955 -07:00] [STDOUT] at MEC.Timing.Update () [0x0043c] in <857a4408504f4deea6b81470f00f71dd>:0
that piece of code is the only thing on top of vanilla
ill take alook at something
ty
oh its because that event gives you the prefab, and your destroying it over and over
so its was a labapi issue
patch should work
ofc im going to try and get it fixed but idk when such change would come out
no worries
yep that solved it
[HarmonyPatch(typeof(RagdollManager), nameof(RagdollManager.ServerSpawnRagdoll))]
public static class NWServerSpawnRagdollFixes
{
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> ServerSpawnRagdoll_Transpiler(IEnumerable<CodeInstruction> instructions, MethodBase method,
ILGenerator generator)
{
var matcher = new CodeMatcher(instructions, generator)
// LabApi.Events.Handlers.PlayerEvents.OnSpawnedRagdoll(new PlayerSpawnedRagdollEventArgs(owner, currentRole.Ragdoll, handler));
.MatchStartForward(
new(OpCodes.Ldarg_0),
new(OpCodes.Ldloc_0),
new(OpCodes.Callvirt),
new(OpCodes.Ldarg_1),
new(OpCodes.Newobj),
new(OpCodes.Call, AccessTools.Method(typeof(PlayerEvents), nameof(PlayerEvents.OnSpawnedRagdoll)))
)
.Advance(1)
.RemoveInstructions(2)
// LabApi.Events.Handlers.PlayerEvents.OnSpawnedRagdoll(new PlayerSpawnedRagdollEventArgs(owner, basicRagdoll, handler));
.InsertAndAdvance(new CodeInstruction(OpCodes.Ldloc_1));
return matcher.InstructionEnumeration();
}
}
if anybody needs it fixed
Hiiiiii so we have a recurring bug where after a spawn wave players get soft disconnected
I got logs from one of them:
Disconnecting connection: connection(0). This can happen if the other side accidentally (or an attacker intentionally) sent invalid data. Reason: System.IndexOutOfRangeException: Index was outside the bounds of the array.
at RelativePositioning.WaypointBase.TryGetWaypoint (System.Byte id, RelativePositioning.WaypointBase& wp) [0x00000] in <00000000000000000000000000000000>:0
at RelativePositioning.RelativePosition.get_Position () [0x00000] in <00000000000000000000000000000000>:0
at PlayerRoles.FirstPersonControl.FpcStandardRoleBase.ReadSpawnData (Mirror.NetworkReader reader) [0x00000] in <00000000000000000000000000000000>:0
at PlayerRoles.PlayerRoleManager.InitializeNewRole (PlayerRoles.RoleTypeId targetId, PlayerRoles.RoleChangeReason reason, PlayerRoles.RoleSpawnFlags spawnFlags, Mirror.NetworkReader data) [0x00000] in <00000000000000000000000000000000>:0
at PlayerRoles.RoleSyncInfo..ctor (Mirror.NetworkReader reader) [0x00000] in <00000000000000000000000000000000>:0
at PlayerRoles.PlayerRolesNetUtils.ReadRoleSyncInfo (Mirror.NetworkReader reader) [0x00000] in <00000000000000000000000000000000>:0
at Mirror.NetworkReader.Read[T] () [0x00000] in <00000000000000000000000000000000>:0
at Mirror.NetworkMessages+<>c__DisplayClass8_0`2[T,C].<WrapHandler>b__0 (Mirror.NetworkConnection conn, Mirror.NetworkReader reader, System.Int32 channelId) [0x00000] in <00000000000000000000000000000000>:0
at Mirror.NetworkClient.UnpackAndInvoke (Mirror.NetworkReader reader, System.Int32 channelId) [0x00000] in <00000000000000000000000000000000>:0
at Mirror.NetworkClient.OnTransportData (System.ArraySegment`1[T] data, System.Int32 channelId) [0x00000] in <00000000000000000000000000000000>:0
at Mirror.LiteNetLib4Mirror.LiteNetLib4MirrorClient.OnNetworkReceive (LiteNetLib.NetPeer peer, LiteNetLib.NetPacketReader reader, System.Byte channel, LiteNetLib.DeliveryMethod deliverymethod) [0x00000] in <00000000000000000000000000000000>:0
at LiteNetLib.NetManager.ProcessEvent (LiteNetLib.NetEvent evt) [0x00000] in <00000000000000000000000000000000>:0
at LiteNetLib.NetManager.PollEvents () [0x00000] in <00000000000000000000000000000000>:0
UnityEngine.DebugLogHandler:Internal_Log(LogType, LogOption, String, Object)
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
UnityEngine.Debug:LogError(Object)
Mirror.<>c__DisplayClass8_0`2:<WrapHandler>b__0(NetworkConnection, NetworkReader, Int32)
Mirror.NetworkClient:UnpackAndInvoke(NetworkReader, Int32)
Mirror.NetworkClient:OnTransportData(ArraySegment`1, Int32)
Mirror.LiteNetLib4Mirror.LiteNetLib4MirrorClient:OnNetworkReceive(NetPeer, NetPacketReader, Byte, DeliveryMethod)
LiteNetLib.NetManager:ProcessEvent(NetEvent)
LiteNetLib.NetManager:PollEvents()
Which leads to this
Any chance of NW adding a length check to each of them 
trying to find out how we even send this
yeah how do you send a nonexistent waypoint 
do you have doors or lockers somewhere that you don't network spawn?
near the wave's spawnpoint area
nope
nothing special like that
but honestly the method should probably do some sanity checks
on another note, is it possible to give nightvision to players?
like SCPs
apparently not nvm
no
bummer
Did you add/destroy any door
And not tell client about it
Otherwise I dont know why it could happen
nothing like that in our codebase
Can you replicate it on non-modded dedi?
im pretty sure all those arrays are statically initalized with 255 elements
it's already pretty rare on a 48 player server but i'll try to reproduce it
but like
Also.. which one of these 3 it is
the whole respawn wave got disconnected
Doubt that happens base game
we don't spawn any waypoints
doors/lockers count as waypoints

no deletion, no creation
you dont do anything like serialize your own spawndata message
there technically should be a + 1 after byte.MaxValue as the since 255 elements has a max index of 254
hmmm
we do
However, it wasn't active at the time of the crash
afaik
lemme check
Perhaps
Seed of the map where it happend?
its the only way i could explain it, as if the waypoint id was 255 it would be out of range like in the exception
So I can see how many waypoints are there
lemme try and find the seed
iirc most maps have like 100 waypoints normally
Huh?
like to fake roles and stuff
i can send our code for that but i'm pretty sure i'm 1:1 with the game
had to update it for 14.1
ah
trying to find the seed in our logs nvm it's not logged
NetworkServer.SendSpawnMessage(player.ReferenceHub.characterClassManager.netIdentity, player.Connection);
as a sanity check, this couldn't cause it right?
dont think so
we do use fake role info for one thing but it wasn't active at the time of the bug
it was a few minutes earlier but the player using it died
I also made sure to update it for 14.1 since it was causing issues during the beta when we were porting everything
Would this be possible to add? Just to avoid disconnecting clients like this
yeah
I could patch writing the waypoint id to make sure it's not out of bounds, but if the issue is mismatch between what the server is writing in the net message and client is reading, it won't solve it anyway
i can't see any mismatch though
and considering it wasn't even active for a few minutes before the mass disconnect, idk
only the spawn wave got dc'd, rest of the players were fine
Well the question is why did it send so high waypoint index
wish I knew
Perhaps add debug log for when the index is over 200?
yeah I'll add that in
Everytime players send a screenshot like this, my blood pressure rises. I assume it's the dedicated server player being disconnected
although tbf, I'd rather it be the dedi player being disconnected and not clientside
at least the former I can probably fix
They're dummies
Was fun writing the code for those
I like how you skipped over the w i d e mtf
rather not question that
personally don't see the appeal but players like it
what wrong?
Basegame issue
patch it
Or just ignore
I hate log spam
default:
inherited_groups: []
permissions: []
owner:
inherited_groups: []
permissions:
- .*
over:
inherited_groups: []
permissions:
- .*
admin:
inherited_groups: []
permissions:
- xps.refresh
- mt.*
- mpr.*
- ev.*
hmoderator:
inherited_groups: []
permissions:
- xps.refresh
- mt.*
moderator:
inherited_groups: []
permissions:
- xps.refresh
- mt.*
What could be the problem?
what group are you in?
Admin
if you get extra info for you from the RA what does it say
Ah I got it, so I have a plugin which gets the player roles from discord and sets the group and if the player is not in config_ra.txt the it's not works 😦

how are you setting the group
ev.Player.ReferenceHub.serverRoles.SetGroup
and I get the group with ServerStatic.PermissionsHandler.GetGroup(group)
the permissions provider is directly reading them from PermissionsGroupName which will prevent it to work with dynamic group changes like you are doing, that should be changed
you can temporarily fix it by doing ServerStatic.PermissionsHandler.Members.Add(userId, groupKey)
How can I make or use navmesh?
is there any reason you decided to use ev.Player.ReferenceHub.serverRoles.SetGroup instead of ev.Player.UserGroup = group out of curiosity and feedback for the api
I didn't know that exists XD
lol, well that's good to know
but well it is the same
was just wondering if there was some issue with the api
I didn't know how to do it and search how other plugins do it
it doesn't show custominfo if you're playing 3114 and if i understood source code correctly thats client behaviour
any way to avoid this?
That is a bug, sorry
ok
errr
my server is hosting on a windows 11 and when i try to start it, it keeps saying
not something to worry about
also why do you have stdout printed to the LA console?
idk
also when my plugin tries to do stuff to scp330 but nothing happends and i check localadmin and i get this
this is normal error stuff
these always happen
huh
[2025-06-01 14:42:52.646 +02:00] [STDOUT] HandleData Unknown connectionId:0
[2025-06-01 14:42:52.646 +02:00] [STDOUT] HandleData Unknown connectionId:0
[2025-06-01 14:42:52.646 +02:00] [STDOUT] HandleData Unknown connectionId:0
[2025-06-01 14:42:52.647 +02:00] [STDOUT] Skipped Data message handling because connection is null.
[2025-06-01 14:42:52.647 +02:00] [STDOUT] Skipped Data message handling because connection is null.
that
but my plugin does this
private static readonly Translation _translation = new Translation();
private readonly Dictionary<string, int> _playerCandyCount = new(); // Track by UserId
private const int PinkChance = 3;
private const int MaxCandiesPerPlayer = 2;
public override void OnPlayerInteractingScp330(PlayerInteractingScp330EventArgs ev)
{
if (!ev.IsAllowed)
return;
string userId = ev.Player.UserId;
if (!_playerCandyCount.TryGetValue(userId, out int currentCount))
{
currentCount = 0;
}
if (currentCount >= MaxCandiesPerPlayer)
{
ev.IsAllowed = false;
ev.AllowPunishment = true;
return;
}
if (UnityEngine.Random.Range(1, 101) <= PinkChance)
{
ev.CandyType = CandyKindID.Pink;
}
_playerCandyCount[userId] = currentCount + 1;
}
public override void OnPlayerInteractedScp330(PlayerInteractedScp330EventArgs ev)
{
if (ev.AllowPunishment)
ev.Player.SendHint(_translation.SeveredText, 4);
else
{
string pickupText = _translation.CandyText.TryGetValue(ev.CandyType, out string candy)
? _translation.PickupText.Replace("%type%", candy)
: string.Empty;
if (!string.IsNullOrEmpty(pickupText))
ev.Player.SendHint(pickupText, 4);
}
}
Nothing to worry about
eventshandler.cs
why does this remind me of my own code
Just disable Stdout or however is that setting called
😨
did you take candy utils code xd
noooo....
def did not remake it a bit
but everything should work ):
PlayerEvents.InteractingScp330 += new EventsHandler().OnPlayerInteractingScp330;
PlayerEvents.InteractedScp330 += new EventsHandler().OnPlayerInteractedScp330;
what
PlayerEvents.InteractingDoor += new EventsHandler().OnPlayerInteractingDoor;
PlayerEvents.InteractingGenerator += new EventsHandler().OnPlayerInteractingGenerator;
PlayerEvents.InteractingLocker += new EventsHandler().OnPlayerInteractingLocker;
PlayerEvents.Joined += new EventsHandler().OnPlayerJoined;
PlayerEvents.Left += new EventsHandler().OnPlayerLeft;
PlayerEvents.InteractingScp330 += new EventsHandler().OnPlayerInteractingScp330;
PlayerEvents.InteractedScp330 += new EventsHandler().OnPlayerInteractedScp330;
thats what i larned
new EventsHandler()
no
EventHandler eventHandler = new EventsHandler();
now register to that one
but stuff still work without it?
do i put it outside or inside the enable
also
private static readonly Translation _translation = new Translation();
wont use the config
You slowing down GC and your own appp
Since most of those can be static
could just be static methods
Ye
I do when i sub to basegame
what should i use then
something that points to your actual translation
you said you used my code
so look at my code again
also when nw fix
Fix what
invigorated makes the bottom left of your screen crash out
Why is 207 yellow
green light
Nah that's you issue
is it
I never seen it
Might be bc shaders conflict
perhaps
Eve
do i need to use this public override void LoadConfigs()
{
Config = this.TryLoadConfig("config.yml", out Config? config)
? config
: new Config();
Translation = this.TryLoadConfig("translation.yml", out Translation? translation)
? translation
: new Translation();
}
thats me
Ye since it loads your translation and config from file
but i want my translation file to be translation.cs
ok well
wont use the config
= if you want to modify it you have to modify the dll
is what i was saying
i was just pointing it out
Yes, since you not loading or saving any file all your config, translation will not be settable outside (in the yml files)
what if i place the translation inside config instead
yay
did anyone made a dummy AI yet
Amazing
can we have a RoleChangeReason.Custom?
itsn thats a byte
enums are basically just constants so u can have values outside of the predefined enums
c enums are even worse cause iirc you can implicitly cast between the underlying type and an enum
or even two enums
rust enums #1
oh no
rust enums are really nice cause they can actually store data
you mean..?
as in like
not constant data
for example, in rust you can do
enum Option<T> {
None,
Some(T)
}
(predefined type)
paislee
so like a union
why r u like this
kinda
why is it called an enum then
right cuz
enumeration
and we're just brainwashed into thinking that enums can only be constant
well
its like
an enumerated list of options
also because union has a very different meaning in rust
does it have a european union
the formal name for rust enums is "discriminated unions," aka they store what type they are
yes
in a safe language
sorry im a nerd about this stuff
what do you expect from
in hungarian we would say "bagoly mondja verébnek" which directly translates to "owl says to sparrow"
jack sparrow
Btw is there any chance Hitboxes will be blessed with a NetworkIdentity so they can be parents of primitives?
Or is this already the case and I'm a bit dumb
Is it possible to check what is in a specific Inventory slot on a player?
player.Items[4]
well
you have to -1
since 0 is the first time
Slots are not stored
the order isn't synced to the server
that's an enumerable btw
kek
at david or at riptide 
@unique crane
you could uh
offset and rotate on based in the camera reference for now
and I can't attach to it directly
Yeah it isnt as far as I know
We finally got the parent feature just to compromise at the finish line 
Ah bummer, alright ^^
But back to the original question. Would it be a lot of work to make hitboxes parentable? I'm not asking whether it will be done since I know you can't be certain
Actually @worthy rune since he made the parenting thingy
right
already used to it
johnny storm be like
maybe parent the speaker to the player
What if i don't like parenting
I've already done this. There's one problem left, for some reason not all players have sound, but the checks work fine
then sync transforms manually
no családi pótlék though
how do i get ammo inside of primary mag?
firearm.TryGetModule(out IPrimaryAmmoContainer container)
that should have the stored ammo
thanks
player.CurrentItem.Base.TryGetComponent(out IPrimaryAmmoContainerModule container);
like this or aim i doing something wrong?





