#plugins-dev-chat
1 messages ยท Page 7 of 1
it has become a server meme
btw how can i access SSPlaintextSetting text?
do i need to first apply it or something because DebugValue just kick player from the server
string input = ServerSpecificSettingsSync.GetSettingOfUser<SSPlaintextSetting>(referenceHub, settingId).SyncInputText;
alright thanks for help
yup
Why there no translation on this
They were lazy
Also the missing whitespace in the chaos announcement that makes CASSIE say "detecteds" infuriates me
There are spaces everywhere else but there
Btw the hint text of the use suggested SS keybind button is "Badge Preferences"
Not sure if that would qualify in big reporting as it's triggered by a modification
they hardcoded it into the game so there is not much translation can do about it
But at least you can give everyone a moment thinking it's dead man switch 
Yeah that my question why they hardcoded it
Instead of making exactly like all other announcements
Either because of time constraints, i imagine passing along stuff to the translation team is hard
Or because they plan to replace it at some point, they dont want some temporary text line being permanently part of the files
I dunno
why <font="Consolas"> doesn't work it's just hard to make a table
you can use the mspace tag instead for tables
i tried but it's look very weird
wait i show you
<mspace=10>
use font units e.g. <mspace=0.8em>
try using mspace with <font=RobotoMono> it might look less weird, if you can send a ss if it works i would like to see
hmmmm with <mpsace=0.5em> it's look like this (but the caracter length is still the same)
ok !
with <font=RobotoMono>
looks like it only works with broadcasts
wait we can do custom fonts with broadcasts ?
on my end it works
looks better imo
i think you can ommit the <mspace> since the font itself is monospaced
i changed the wrong variable
all good
yup i try
it's work, thanks ! (i don't know why the first one is different than the others
We should make the LabAPI logo a Capybara in a lab coat
yes sir
@unique crane i found probem on generator event
Hm?
this never say to player
than he can't interact
like there
also why named UnlockCooldownTime ? when it's also used for other thing
just call it CooldownInteractTime
or idk
Hello! If I put 0Harmony.dll to the dependency folder than the server starts but it will be really really slow, I can't even join
Is there a fix for it?
Can you put it in issues
[STDOUT] Did you #ifdef UNITY_EDITOR a section of your serialized properties in any of your scripts?
[STDOUT] The referenced script (Discord.Elements.DiscordGameStateElement) on this Behaviour is missing!
[STDOUT] [T8] The referenced script on this Behaviour (Game Object '<null>') is missing!
this but the script is so many
Not meaning to rush anyone or anything, but any updates on when the next version with datastores is coming? That's basically the only thing at this point stopping me from porting my plugins
That is nothing to worry about
Check for any exceptions
shader stuff?
ERROR: Shader Hidden/HDRP/MaterialError shader is not supported on this GPU (none of subshaders/fallbacks are suitable)
you should be able to build the labapi dll yourself for that one
the next build is waiting on some other things
I tried that the other day, and it just refuse to recognise the references when trying to build

where ?
well github
did you target dev

was before public release
with the public beta yeah the repo is public
@unique crane yap yap commit
?
+1200 what ?
80% of those are comments xd
im gonna go back to rebuilding same branch for 5th time like a retard cause unity isnt able to save the prefab on github properly
just make PR then 
Yeah make labapi PR 
no access to AssemblyCSharp
i need AssemblyCSharp
to contribute
Yeah I cant exactly give you that
ive seen worse
get it from ds
I know
yeah from yourself
yap yap
whoops!!!
i blame u
shouldve seen it

ALWAYS blame someone else
ate it
can we ban this person please mods
I agree
banning you both
ur next
Has anyone seen 106 not regenerate HS?
no
turn u into a car
Does anyone know the system for checking whether a mini wave should spawn after a wave?
code doesnโt explain much, which part is doing the calculation and whatโs it doing?
Wdym
Mini waves spawns if your team gets X influence after a wave spawns
so if a main wave spawns, the mini wave is unlucked
then they spawn after 3 minutes apparently
there was more detail in the post/changelog
its not determinated when wave itself spawns
10
nvm there isn't much detail in the beta changelog
ok i'm dumb
Mini-Waves
A set of smaller reinforcement waves that come after primary waves, designed to compensate players who die early, or didn't have a chance to spawn.
Mini-waves can be earned by a faction obtaining 10 Influence after its primary wave spawns.
This is only available for 2 minutes after the primary wave spawns.
For example, after the Chaos Insurgency wave spawns, they must obtain 10 influence in 2 minutes to unlock their mini-wave.
For every player that didn't spawn in the primary wave, the "10 influence points" requirement will be lowered by 2.
Due to the increased wave sizes, this scenario will very rarely occur in practicality. Some examples of this:
Chaos Insurgency Wave spawned and 3 players didn't get to spawn. Chaos now only need 4 influence points to unlock the mini-wave.
Nine Tailed Fox Wave spawned and 5 players didn't get to spawn. MTF have automatically unlocked the mini-wave.
If a mini-wave spawns, its team's primary wave will be delayed by 1 minute.
Additionally, every player who dies, who is a part of the mini-wave's faction, will lower the mini-wave's timers by 5 seconds.
The mini-wave timer cannot be reduced below 1 minute and 30 seconds using this method.
also does anyone know if 14.1 will have config options for waves working or no?
I just checked with no plugins and 106 can't regenerate HS

on labapi branch ?
Actually it seems like no SCPs are regenerating it
yeah
That's what I suspected as well
i dont even see a humeshield thing
well
i see it
but no like code for actually increasing
oh
im stupid
its in player stats ๐ญ
public override void Update()
{
base.Update();
HumeShieldModuleBase controller;
if (!NetworkServer.active || !this.TryGetHsModule(out controller) || (double) controller.HsRegeneration == 0.0)
return;
float hsCurrent = controller.HsCurrent;
float maxDelta = controller.HsRegeneration * Time.deltaTime;
float target = (double) this._maxValueOverride != -1.0 ? this._maxValueOverride : controller.HsMax;
if ((double) maxDelta > 0.0)
{
if ((double) hsCurrent >= (double) target)
return;
this.CurValue = Mathf.MoveTowards(hsCurrent, target, maxDelta);
}
else
{
if ((double) hsCurrent <= 0.0)
return;
this.CurValue = hsCurrent + maxDelta;
}
}
im goated
@unique crane humeshield is broken like crazy
elaborate
erm
it says 0 humeshield in game
but i have 350 according to logging
also
wait
maybe thats why i wasnt regening humeshield either
at the minimum its visually bugged
Oh
im stupid
i didnt sync it
cuz im patching but still
regen wasnt working without patch either
so
Okay
@unique crane
this part of the code is broken
i destroyed my entire shield, waited a bit and then it spammed htat
[2025-02-22 15:39:55.472 +01:00] [INFO] [SecretAPI] [0] Delta is above 0 stinker: 0.54901
[2025-02-22 15:39:55.489 +01:00] [INFO] [SecretAPI] [1] Stupid stupid 350 above target: -3.402823E+38
float hsCurrent = controller.HsCurrent;
float maxDelta = controller.HsRegeneration * Time.deltaTime;
float target = __instance._maxValueOverride != -1.0 ? __instance._maxValueOverride : controller.HsMax;
if (maxDelta > 0)
{
Logger.Info("[0] Delta is above 0 stinker: " + maxDelta);
if (hsCurrent >= target)
{
Logger.Info($"[1] Stupid stupid {hsCurrent} above target: " + target);
return false;
}
it changed to that now
which is weird
cuz it implies im at max shield, but i never receive it
Hubert did touch hume shield lately so its been fixed
wait PitDeath effect prevents all other damage than fall damage? nvm literally does the opposite
If I set ev.IsAllowed to false at pickingupitem then I can't pick up that item again
the item might be still locked, you might have to do something like this for now. ill try and get it fixed in the api
Timing.CallDelayed(0.0f, () => ev.Pickup.IsLocked = false);
player.Position = player.Position + Vector3.forward


but if player step on the ground, this doesn't work
just teleport them to the moon
can't wait to get into the air at Site02
oh the horrors 
player scaling is a little buggy, not sure if there's an "official" way that isn't through sending a spawn message
not rn
is planned tho
iirc
lessgooo
ah yes culling
Please cull the whole map for me
MapGeneratingEvent.IsAllowed:
How do I know if a Pickup has been pick up?
Pickup::IsDestroyed doesn't seem to work
and give me a empty exception
i see, it probably should be checking if the component is null first
ok, I'm trying keep track of the items drop by the player
so I have a loop, a list store Pickup
and boom
if (pickup== null || pickup.GameObject == null)
yep
if (Pickup.Base == null)
๐
So I'm tryna make a remote keycard feature and this is what I have for lockers right```csharp
private static void OnPlayerInteractingLocker(PlayerInteractingLockerEventArgs ev)
{
if (Plugin.Config.RemoteKeycardFeature)
{
if (Utils.DoorUtils.HasKeycardPermission(ev.Chamber, ev.Player))
{
ev.IsAllowed = true;
ev.CanOpen = false;
ev.Chamber.Base.SetDoor(!ev.Chamber.IsOpen, ev.Locker.Base._grantedBeep);
ev.Locker.Base.RefreshOpenedSyncvar();
}
}
}```So basically everything works but when opening it plays both the granted and denied beep sound effect and also displays it on the button thing, also, for some reason ev.CanOpen specifically needs to be false for it to work with both your hand and the card
Why are you setting the door status?
Base game code does that for you based on the CanOpen property
Your basically calling it twice
That's why you have the two sound
Uh huhhh
private static void OnPlayerInteractingLocker(PlayerInteractingLockerEventArgs ev)
{
if (Plugin.Config.RemoteKeycardFeature && Utils.DoorUtils.HasKeycardPermission(ev.Chamber, ev.Player))
{
ev.CanOpen = true;
}
}
This should do the job
Hm, I didn't know changing canopen acuatlly opens it lol, I though it just decided whether the player could open then locker or not
If it has setter then it propagates back to the base game code
And this is run after the base game check whether you can open it or not
allowing you to modify the result
Hey, I'm trying to make a plugin where if I take out a candy it shows a hint that you took out a [candyname] candy but I can't get what candy did the player take.
try
if(ev.Item is Scp330Item scp330 && scp330.Base.IsCandySelected)
scp330.Base.Candies[scp330.Base.SelectedCandyId]...
currently theres no implementation for derived items(thats coming very soon)
Thanks
LabAPI would have a more complete FirearmItem, right?
annoying firearm module is still chasing me
At OnInteractedScp330 there's no item ๐ฆ
yeah its going to be a thing
i guess the candy is missing from the event, i dont see why it shouldnt be added. ill look into adding it
Thanks, it will be an update before the release or it will be updated at the release?
i cant tell you since idk when that is, but most likely before
Okay, thanks
You can make a pr
Oh the hurt events are confusing af (they hurt xd)
I was thinking of making an issue but I was lazy
It would be nice to clarify those
I'll do that once I get home and Iif I don't forget 
guys is it wanted that peanut can tp on top of the railings in the new room
Is there a way to make player who has role of SCP-049 Be seen by others players as SCP-106 and how to turn off SCP-049 abilities? Like for example "Good Sense of The Doctor", "Resurrection", etc.
Exiled show the appearance code use that (or use exiled for it)
Turning off ability is I think there is a Spc049_doThething_ingEvent and using that just set IsAllowed = false
Okay thanks for help
Yes. That spot is only meant for 173
Anyone else getting up there is getting up there using illegitimate unintentional ways
what about dog
Nope
In github? I'll go now
To get there as human or dog, you have to do really weird parkour and quirks with collision to get up there, which is obviously not intentional
173 can straight up teleport there
dog is like 3 leaps
Hey ๐
What is the font of the badge, please ?
(When you look at the player and when you look at the player list)
ye dog was in there in one of my games, if i wasnt a spectator i would shit myself
yo guys im new in the plugins stuff and really want to know if someone can send me a plugin where you dont need to have the card in hand to open doors
is there a way to make a SCP-106 wasnt able to come through doors,gates etc.?
IsScp106Passable iirc
= false
i cant remember what its actually called
u mean in doors right? but still i need to set that to Player not a doors
Then no
damn
If you set 106 again to 106 he will not able to move
@worthy rune@unique crane is it know bug the crash when ending round and being Scp079 ?
Scp079 do not get disconect (reconnect) when end round
U mean setrole 2 times like
player.setrole X2?
And not able to move through Doors or just he cannot move at all?
ye, just wait a bit
player.SetRole(RoleTypeId.Scp106);
Timing. stuff_that_wait(1f, () => { player.SetRole(RoleTypeId.Scp106); } );
And then he cant move at all? Or just through doors?
Well in my case its feature 
feature until NW fixes it
Well lets pretend that this bug doesnt exist at all
Well then simply dont change the role too quickly 
no it legit happens whenever you do it
no time limit
lol
oh
yeah
pooling system 
Pooling system my beloved
when "lockdown cooldown: 13550s"
wha
yes
erm
that was caused by a missing 079 subroutine reset
you can make 079 have infinite cooldown

i made a plugin ages ago that made it so you could spam teslas
and every 079 after that round would just have infinite cooldowns

#unknown 
@carmine prawn
ah sorry didn't realize you posted it already (discord didn't load it)
What are advantages of using source generators?
Generating code
Devs need to write less code
They also help make sure things aren't missing
CustomEventsHandler is source-generated meaning if a new event is implemented, it will automatically be added to that class
Same for InitializeWrappers, they just add an attribute to a method and it'll be called when LabAPI inits
Fair enough
What is source generator ?
.
Weโre pleased to introduce the first preview of Source Generators, a new C# compiler feature that lets C# developers inspect user code and generate new C# source files that can be added to a compilation. This is done via a new kind of component that weโre calling a Source Generator. To get started with Source [โฆ]
Ye
Except mirror using Cecil
And other stuff to inject its code
But its kind of that
Mirror weaves the assembly after compilation if I remember it correctly
Source gen generates the source and then it gets all compiled at once
Really cool and nice stuff
Especially for partial classes
Avalonia + CommunityToolkit.Mvvm ๐
Some examples of source generators are generated regexes [GeneratedRegex] or source-generated JSON (de)serializers for AOT, or FastEnum (source-generated ToString and Parse methods)
Yes that's right, it applies stuff after full compile
hello slej
Hi
lets make it worse
So how is maintaining
Did you successfully upgrade all projs to labapi
erm
idk
i do a little
and then i get bored
and go do smth else
still waiting for david to rework candy
way too much effort
Ye me2, plus need to think about ff damage 
Hopefully labapi-beta will be updated for latest stuff if they done w/it
yes
Try uninstalling completely
and then installing this specificaly
set beta to none to remove
Always install Game version: 14.0.3-labapi-publicbeta-5bf276ee after completly delete appdata and install directory
'-beta none' doesn't work
there was a conversation in teaser discussion talking about how new map generation can control the chances of certain rooms spawning next to another room type, and people were asking if it was possible for plugins to be able to control this. Is it possible?
*public
steam using public branch not none
And color?
I think of just making it hex
So like it matches with rich text stuff
on my way to realize i cant make a color go above 1 for my super-duper epic code

Skill issue
Damn
This might be big...
Gotta contain the shit at Gate A
Only gate A tho
Yeah only Gate A
That reminds me of the portal big ass door but inside it shows a smaller one
you gave me an idea
The Aperture Science Super Hatchโข, protecting Your door from Mormon missionary attacks
If you would have drastic decrease the time of the anim would be 10/10 but its 7/10
Oh my god if that was possible, it would be so funny
Big ass containment bulkhead door protecting the nuke start room
Well you can definitely alter the speed but idk if its shared across all clients
This is a bulk door
yes
rename it to big strong door
?
Not sure what you are asking about
You can scale bulk door like any other door
I know that
i just ask how you made the sound appears
can I make hint appear on the far right of the screen?
far left is <align=left><pos=-360>abcabc
but <align=right><pos=360>abcabc unable to reach the far right
it can't reach the edge of the screen sadly
sad
just imagine that it works like magic
just how you played this sound
without door or door Scale to 0
If you <pos> each character then it works
is there a way to make SCP-106 Hume shield Regen. like for others SCPs?
there is door
Xhy making two event for idle and triggering tesla
Just make one
And have property for it
Is it possible to see if a player has someone muted or no?
yes u can
and also u dont need to do this
one sec
line height isn't necessary iirc
i think if u want to push it to the right u do basically the same thing but put the ts before and have space be positive
Is there a way to disable server-side movement correction?
Sometimes my server lags so much that players get teleported back to their previous positions
i dont think theres a trivial way todo that without patching, you can use noclip since that has a graceperiod after turning it off where it disables the AC checks
[HarmonyPatch(typeof(FpcNoclip), nameof(FpcNoclip.RecentlyActive), MethodType.Getter)]
public class FpcNoclipRecentlyActivePatch
{
public static bool Prefix(FpcNoclip __instance, ref bool __result)
{
// dont remember why i did it like this, probably stops you from falling through the floor
__result = __instance._fpmm.Motor._lastOverrideTime.Elapsed.TotalSeconds > 1.0f;
return false;
}
}
is this relased??
Will be
as another build to ProjectMER once out of beta base MapEditorReborn
guess ima have to work it out then
Alpha warhead bunker be like

How do I get the players integer ID via reference hub?
i dont want to use Player.Get if possible, lol
nvm, im using NetworkBehaviour not ReferenceHub
ignore me, apparently ReferenceHub.GetHub() is the only solution
Has anyone seen this happen? I only have one event attached to PlayerInteractingElevatorEventArgs and I'm 100% sure that it doesn't disallow (since disallowing it sends a broadcast and that works correctly)
(@unique crane you seem to like these sort of bugs so here's a ping for you
)
Nice mkv discord
ahhh
give me a second
Also this doesn't happen with no plugins
I think that issue is gonna be somewhere else... Probably in initial elevator floor
Does this happen all the time or
And is it random or happens only with first interaction
It's random
or at least it appers to be
Sometimes it will stay, other times it will go
Truly weird
Guess we've got a new scp in game 
(will look at it if I finish the stuff I wanted to do today)
@unique crane
I found reproduction steps. The button that is inside the elevator will trigger the event at any point of the journey. Spamming the button from the inside will effectively lock the elevator in place until you stop pressing the button.
The reason it doesn't happen without plugins may be because I'm overriding IsAllowed with true due to my restriction system reporting that D-Class can use elevators.
Is this intended?
The button outside will not trigger if the elevator is not ready
Here's a video of how it looks (Chamber Ready? message is in the elevator event)
I think the Doors have the same problem i was using some time ago like some event to check if player open the Door well its work 50/50 if the Door is already closed/open its works fine but if u press while its opening well its dont call event
But interaction is made
Like maybe in the 3-4 hours from now(im in school rn) i can show u video what i mean
Bcs idk how to explain it properly
The door.
Scp-94940
Okay
Why is this so cool
Would be more cool if it had more than 2 floors
Indeed
So you could like keep going
I kinda doubt that we could change floors with plugins but I'll do some experiments anyway
Group is enum based yea
Patch the enums to add more
Idk what are the enums even for
I think they are only used for initial spawning and decontamination?
Well you have the full source code for the game not me 
Ah well yeah
mod client 
๐
Use the lowercase tag
but that would make all letters lowercase
Then close it?
you can close tags yk

Is that a joke? ๐
whats a joke
mod client
nvm
aBcAbC = <lowercase>a</lowercase>B<lowercase>c</lowercase>A<lowercase>b</lowercase>C
yeah
i gave another way
Yes
You can create an extension method or something if you want it to be easier
just create a method that checks if its lowercase and adds the tag if it is etc
yea
string::ToLower()
no?
"hello" does not work in hint
because its all uppercase
public static string DoLowercaseTags(this string str)
{
StringBuilder result = new();
foreach (char c in str)
{
if (char.IsLower(c))
{
result.Append("<lowercase>");
result.Append(c);
result.Append("</lowercase>");
}
else
{
result.Append(c);
}
}
return result.ToString();
}
@carmine prawn
you might need to handle the </lowercase> differently tho
/// <summary>
/// Adds the lowercase tag before all lowercase characters.
/// </summary>
/// <param name="str">The string to use.</param>
/// <returns>The newly created string with the tags.</returns>
public static string DoLowercaseTags(this string str)
{
StringBuilder result = StringBuilderPool.Shared.Rent();
bool wasLower = false;
foreach (char c in str)
{
if (char.IsLower(c))
{
wasLower = true;
result.Append("<lowercase>");
}
else
{
if (wasLower)
result.Append("</lowercase>");
wasLower = false;
}
result.Append(c);
}
return StringBuilderPool.Shared.ToStringReturn(result);
}
Like that ?
idk
ublic 
it should work, ye
there is no network prefab for elevator doors, and their groups are serialized :(
๐
oh
if want to add <lowercase> before the last step of sending the hint, we need to filter out the characters in the previous <tags>
like:
what
it loops through the characters
adds to a new string
LowercaseTags shouldnt be saved unless its a constant
okay so
if ur sending a hint to a player

Server.Host.SendHint("hello".AddLowercaseTags());
it wont modify the original string
This code looks like it can corrupt tags?
such as <color>
magic
iirc there's a set of prefabs that have to be specified to be spawnable (NetworkManager.spawnPrefabs?)
and then at some point they get added to NetworkClient.prefabs (probably when they're first used)
all prefabs are loaded by the time WaitingForPlayers

yea it looks like its in NetworkManager, just a list of em
^
somehow that's not all prefabs though
NetworkManager iterates over prefabs you assigned it to it
And calls NetworkClient.RegisterPrefab
which is then stored as (uint, GameObject)
with actually means prefabs wont ever be empty (at least not NetworkManager ones)
where uint is asset ID
once the object exists
how does it handle asset id ?
NetworkIdentity.assetId
that's set by mirror in the editor
interesting
interesting
yeah
And then immidiately call NetworkServer.Spawn
i saw SL does it

And this happens for every spawnable prefab
why actually ?
Well thats how you spawn it over network XD
Ofc you can also make NetworkMessages and spawn it on both server and client as MonoBehaviour
yea but do you have to create it ?
WHat no

Thats just the code
the prefab has to exist to be spawnable i assume
yes yes
imagine if we could spawn any component
but i was referring to having to create an object after registering prefab
Yea I dont think Beryl would allow that
Cheaters on their way to write a plugin that installs cheats remotely ๐
erm
the spanish chat got active midnight or smth
there was a bit of xenophonia, hitler, gay 18+, pinging staff, 9/11
then a few bans happened and they raided
๐ญ
most prefabs are not in NetworkManager, they are registered manually to NetworkClient usually by subscribing to CustomNetworkManager.OnClientStarted and doing it there
oh
lmao
_i said that ๐ญ _
oh you did?
kinda
but i wasnt expeciting most
XD

so sad ๐
i actually wish there was ability to know when all prefabs had fully loaded
but when its done like that it doesnt seem doable
well
does client ever restart ?
also, note that not all prefab instances are in NetworkClient.prefabs either, a good example are RoomObjects and ragdolls. Instead they are registered with handlers instead. The server still has to use a prefab to network spawn them but the client does not require a prefab in the dict(as its apart of the handler)
OnWaitingForPlayers seems to do the trick
^
yeah just for doing it earliest possible
but yea
waiting is probably the best bet
run a script every frame and check the number of prefabs against a constant 
I mean thats when you want to do most of spawning stuff anyways so
Or yea you can count how many are there 
๐
And then check it
HORRID idea
holidays ๐
could work but still
๐ญ
//TODO: Update on christmas
i was gonna look into a prefab manager thing, but i realized i literally cant do it any different from what i did on exiled really

(actually a lot wasnt me but still)
actually
add to SL rn

well nv (it was my bug)
Anyone here changed the Player's scale?
Whenever I send a spawn message to change the scale, the entire weapon Reload-Unload system breaks for everyone
huh
Ill also probably absolutely add a way to scale without using the spawn message

I can record a sample of what happens if yall want
Haven't tried scaled players with weapons yet
Sure
PlayerTransformMessage so we could set rotation 
Me on my way to make player models walk on walls
(The scale changes when I use the command to become a custom role)
so you can just spam it
And it won't reload
hmmm
As in, will not modify ammo
And I know the scaling does it since removing it fixes it
The firearm animators probably don't like custom scale
The problem doesn't happen when I set the scale without the message (client gets desynced since it still sees itself as (1,1,1))
ofc
I guess you could work around this by setting the items in the inventory to have a lossyScale of 1
Though I don't think it would solve the client-side animation issue
I meant the client gets desynced on walls and such
should have specified
The problem also occurs if I send a spawn message with default scale (1, 1, 1)
So I'm not sure if the animators are complaining about the new scale
Oof
Yeah Mirror moment
Might be something with sync then
idk
Or well considering that you can infinitely reload
and ammo doesnt change
It gets allowed only on the client
but server denies the request
Actually, I log the request
it gets approved
Yes
gg
Remove 3rd to last line
It's just mistakenly catching a blacklisted tld
[2025-02-27 16:15:11.648 +01:00] [DEBUG] [RoleplayPack] Player GBN sent a request!
[2025-02-27 16:15:11.664 +01:00] [DEBUG] [RoleplayPack] The request is of type Reload
[2025-02-27 16:15:11.679 +01:00] [DEBUG] [RoleplayPack] Validating reload!
[2025-02-27 16:15:11.695 +01:00] [DEBUG] [RoleplayPack] Are any modules busy? False
[2025-02-27 16:15:11.710 +01:00] [DEBUG] [RoleplayPack] Module count: 17
[2025-02-27 16:15:11.725 +01:00] [DEBUG] [RoleplayPack] IsReloading: False
IsUnloading: False
IsBusy: False
[2025-02-27 16:15:11.741 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.AutomaticActionModule
[2025-02-27 16:15:11.756 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.AnimationTriggerReloaderModule
[2025-02-27 16:15:11.772 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.AnimatorSpectatorSyncModule
[2025-02-27 16:15:11.787 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.AnimatorStateSetterModule
[2025-02-27 16:15:11.802 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.AudioModule
[2025-02-27 16:15:11.817 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.EventBasedEquipperModule
[2025-02-27 16:15:11.833 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.EventManagerModule
[2025-02-27 16:15:11.848 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.GripControllerModule
[2025-02-27 16:15:11.864 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.ImpactEffectsModule
[2025-02-27 16:15:11.879 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.LinearAdsModule
[2025-02-27 16:15:11.894 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.MagazineModule
[2025-02-27 16:15:11.910 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.MovementInaccuracyModule
[2025-02-27 16:15:11.926 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.RecoilPatternModule
[2025-02-27 16:15:11.941 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.SimpleInspectorModule
[2025-02-27 16:15:11.956 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.SimpleTriggerModule
[2025-02-27 16:15:11.972 +01:00] [DEBUG] [RoleplayPack] Module of type: InventorySystem.Items.Firearms.Modules.SingleBulletHitscan
[2025-02-27 16:15:11.986 +01:00] [DEBUG] [RoleplayPack] Module of type: AUTOMOD TOLD ME TO GET RID OF THIS ONE
[2025-02-27 16:15:12.002 +01:00] [DEBUG] [RoleplayPack] Is flag true? True
[2025-02-27 16:15:12.017 +01:00] [DEBUG] [RoleplayPack] flag is true! Approving...
Huh
Thank you ๐
nice module
?
creating a new list for it
Have you heard of this thing called "ConcurrentModificationException"
Java ๐ญ
Cant wait to get all existing exception
How is it named in c# again
idk
It's named the same iirc
Isn't it just InvalidOperationException?
InvalidOperationException: Collection was modified; enumeration operation may not execute.
Make a copy of that collection and do whatever you were trying to do on that
read up

real
got a question. it's not labAPi specific but it is modding. will we ever have the ability to make custom menus or pop up boxes
Well you can make custom menu using SSS
yeah. i want to but my boss just wanted something different
i meant like RA or pop up menus. there is OpenReportMenu, may be exiled specific, have no idea, but the button does nothing so it's impossible to close
his response was the admins might forget it's there.
also, is labapi going to replace exiled or...
i meant like will one day exiled just be no more or will exiled still be used
interesting. so is labapi being made to be better than exiled or just a better NwAPI
i mean its the official api
so its just bound to be better
(it also is way more understandable to me)
ive always used Exiled so that's a hard thing for me to say but I do like how events dont need namespaces anymore and are strict declares
not really lol
exiled is much more understandable and the namespace layout is that much better
i think both will coexist together
We have clarified this a few times by now, there is features that we would rather leave up to the community to implement for now
Things like Exiled's Custom Items & Roles framework is not something we have any current plans to offer within the LabAPI
Obviously we would like to provide more customization features base-game, if it were a simple change we'd allow you to modify firerate, name and stuff like that
But the reality is that such things take time, and are difficult to implement without compromising maintainability of the project on the long-term
understandable
So the goal is to provide a good base framework, and Exiled can continue doing what they do best
Which is providing very advanced frameworks for advanced systems
But if you have a very important security plugin, or your server has a patreon to continue existing, and you can't provide your patreons with cool exclusive features
no one prevents you to make custom items/roles as a plugin using labapi code, I mean I want to do this but again its my thing nothing official
You shouldn't need to rely on a 3rd party framework
So we hope to provide good base functionality, and let the community create libraries, frameworks and APIs for the more specific features they need
I'd like to think we're in good terms with most folks at Exiled, after all most of us have been a part of its community for a long while
And we have actively communicated and helped them when we could
Well I did and even released here 
Items would ve soon but idk if I want to do that
my main problem is I want to create everything adv but because of this it takes too much time to make it and finish lol
most times people don't know how to use it lol
me looking at audio api for days just to even slightly get it

ngl from my side audio api is not that adv heh
its not much atm in case of encoding or doing stuff manually
i do especially like bypassing the speaker limit using message magic
although not that you want 256 audios playing at once LUL
(networking go brrr)
my audio api thing takes free controller id when you make each audioplayer thing
soo its reusing if id its free
How can i make one Plugin dont overwrite another Plugin Server-Specific Settings?
using UserSettings.ServerSpecific;
namespace SCP372LabApi
{
public abstract class AbilitysLoader
{
private static AbilitysLoader _activeExample;
public static readonly AbilitysLoader[] AllAbilitys =
{
new Ability()
};
public abstract string Name { get; }
public abstract void Activate();
public abstract void Deactivate();
public static bool TryActivateAbilitys(int index, out string message)
{
if(!AllAbilitys.TryGet(index,out AbilitysLoader loader))
{
message = $"Index {index} out of range.";
return false;
}
if (_activeExample == loader)
{
message = $"Ability is already active";
return false;
}
TryDeactivateAbility(out _);
_activeExample = loader;
_activeExample.Activate();
message = loader.Name + " Activated.";
return true;
}
public static bool TryDeactivateAbility(out string disabledName)
{
if (_activeExample == null)
{
disabledName = null;
return false;
}
disabledName = _activeExample.Name;
_activeExample.Deactivate();
_activeExample = null;
ServerSpecificSettingsSync.DefinedSettings = null;
ServerSpecificSettingsSync.SendToAll();
return true;
}
}
}
i missing something?
How I would do it is to make some sort of system that would append the settings after another split by headers (probably)
wdym?
Well if you dont want to override existing settings
then you just.. create a new list.. copy the existing ones and append the new ones
Like creating other ServerSpecificSettingBase[] variable(Where i add settings) and then add to ServerSpecificSettingsSync.DefinedSettings?
Yeah if you are reaaaaly lazy you could theoretically do ServerSpecificSettingsSync.DefinedSettings = ServerSpecificSettingsSync.DefinedSettings.ToList().Add(yourSettings).ToArray() 
well maybe not lazy but too stupid to do something else 
but still thanks for help
yooo david
can you make DefinedSettings a list already
Im thinking of making it like observable list or something
So you dont even need to make a new one when you edit it
wtf is ObservableCollection
me when you used add instead of addrange
Collection that has event when it is modified
what the sigma
Okay your getting banned
observable list is a W
Now you do
๐
I dont think the base one has AddRange tho

Might need to make custom one
Weeeel right now im doign the damm Vector3 serialization
Thats what im doing ๐ญ
figure it out better
Me when the "SimpleCustomRoles" is not even slightly "Simple" 
U need to create a wrapper for it so yeah.

Unity issue as most of the time no idea why they made it not serializable and mark the fields as not
Competitor audio API coming soon
Simple for the end user, a nightmare for the dev
Comsider using #1341884121667993630
im going to try and include some audio stuff on the speaker toy wrapper, so it doesnt require an external api just to be able to use it btw

Good luck
I mean yeah a built-in PlaybackBuffer and encoding would be nice
potential example usage
string path = Path.Combine(PathManager.Configs.FullName, "Test Plugin", arguments.At(1)) + ".wav";
path = "file://" + path.Split("://").Last();
var webrequest = UnityWebRequestMultimedia.GetAudioClip(path, AudioType.WAV);
var request = webrequest.SendWebRequest();
request.completed += (asyncOperation) =>
{
if (webrequest.result == UnityWebRequest.Result.ConnectionError)
Log.Error(webrequest.error);
else
{
AudioClip clip = DownloadHandlerAudioClip.GetContent(webrequest);
speaker.Play(clip);
}
webrequest.Dispose();
};
not sure how you feel about something like this, ngl i dont like using UWR for this but it seems like the easiest way
note, its not final, or may never get added
Could you make it a separate object so we can use the playback encoder elsewhere? (Tying it to the wrapper is not be ideal imo)
So it's using AudioClips for playback

yeah the encoder is separate, you are able to access which ever one it tied to the current ControllerId of the speaker for convenience
Epic
audio clip, or just raw samples if you load it another way yeah
Poggies
I think nightmare for both, who even wants to write yml??
are spawn points vectors or game objects?
like i get it's a vector but are they just a list of vectors or objects placed around the map
Do you mean structure spawnpoints? Those are game objects with a StructureSpawnpoint (or similar name) component
i mean like if i wanted to get a list of all spawn points or a list of spawn points for each team or something, is it just vectors or actual game objects
Those are stored on the role
IFpcRole.SpawnpointHandler
Some aren't as simple as a vector
Instead, some spawnpoints rely on the room and preset bounds
You can call TryGetSpawnpoint on the handler to get a position
alright. thanks!
do what
3rd person
That's interesting
Not sure how you could alter the camera position
I call hax!!1!1!!!!
probably modded client, i dont know a way todo it through mirror
get camera, move around -3 in z and vola
you need to know that what he is doing is not possible normally
your character model is not even visible
just arms
and you cant bypass this thru serverside
oof thats funny
what if they changed the player scale and mirrored the movement and actions with a dummy

Hey, quick question, how do I make a command usable from the ingame console?
[CommadHandler(typeof(ClientCommandHandler))]
iirc
Interesting, because I have it as that
The console you access with the tilde key
That explains it, thank you
Oh wait, nevermind, I was thinking the wrong thing, it works now :]
Imagine we could get that level of responsiveness on 200ms ping ๐ญ
does anyone have idea how can i properly spawn Empyt object with Box collider and Rigidbody? i was trying this but result were "funny"
GameObject Magma = new GameObject("Magma");
Magma.GetComponent<BoxCollider>().isTrigger = false;
Magma.GetComponent<BoxCollider>().enabled = true;
Magma.GetComponent<BoxCollider>().size = new Vector3(2,2,2);
Magma.GetComponent<Rigidbody>().useGravity = false;
Magma.GetComponent<Rigidbody>().isKinematic = true;
NetworkServer.Spawn(Magma.gameObject);
you could spawn a Primitive
from Unity (not NW)
or
wait 2sec
actually
i was thinking about that but i need box collider trigger
which you can do on any gameobject...
what r u using it for tho
this is my code
only works on server side tho
doesnt spawn it client side
for that youd need to use nws primitives
check if player is standing in some places(they are dynamic)
then this should be fine
if u dont need the player to see it then yea use the above
thanks for help
EscapeComponent is not necessary right? ( i want to be sure)
it is not no
its my own custom handler that handles a player walking into the object
alright
you are getting component before adding it?
also why are you getting component like 3 times just store it in a variable once
Nope i just probably forgot to copy line where it was added but i'm 100% sure that i added after creation of empty object where i added also rigidbody to it
My code was mess back there (so instead of copying full code i just were copying lines)
This good?
wouldn't it be better if there were commas
Im thinking if I should seperate each vector component by line
is that color32 or just color
Color
hmmm
i feel like hex should be reserved for color32
sometimes you want to set colors with values outside the normal 0-1 range e.g. for glowing primitives
If it's not too much can support both. (Deser) But ser should be whatever feels good
I like the separation since many stuff did that way

