#plugins-dev-chat
1 messages · Page 173 of 1
i genuinely do not know
huh what
I've forwarded this internally for you
oh nice
i guess I don't have to write an email then
who should have I contacted tho?
dam i genuinely didn't even realize we could do that
AH i know why
two cookies
Imagine if my reaction got removed by a mod
bruh
What reaction 
same as i
The email you posted would probably be the best place 
but the amount of links I had to click to get there was... astonishing ig
The main website is a fossil that is being re-done, until then you can disregard most of it 
like Home > Help & Support > More Help & Emails (which has 1 link, 1 singular link, like damn) > My question isn't listed or I need more help! (also 1 link) > https://scpslgame.com/contact-us/ > Scroll all the way down
I figured as much with how it still has the trailer with OLD heavy
@tribal dagger did you give organisation access to this?
Here is what my org looks like (which is on the plugins website)
Here it is for proof https://plugins.scpslgame.com/plugin/LumiFae/DiscordLab
well i received an email for the integration being added and the checkmark was there when i was adding it
but maybe something went wrong
ill check
You must have administrator permissions in the organization
they say they created the org
so
well i have an owner
oh, you do

erm, no
labapi portal doesn't use cookies
biscuits
Early Santa, are ye?
.
why not
I attempt to summon the almighty Harmony patching gods and beg for help in figuring out why my fake positioning patch no longer works
This used to correctly move an NPC Player i have vertically according to its fake scale, so that it always touches the ground (Since Player models scale from the hip...)
Now it no longer does anything at all
(It worked in the version before christmas event iirc)
This is the decompiled method GetNewSyncData
Nw should pay me tbh
Wasn't it determined that it was likely that there was a different prefix patching the server position distributor
I fixed it the cool way instead 😎
No delay
U r so cool
Hm, right
I think i concluded somehow it wasnt cedmod and stopped looking
Ill get back to investigating.
But should the shown code work?
Cedmod moment
I will grab my pitchfork and storm the cedmod discord
Or just disable the patch they do
TLDR
It was cedmod
ced777ric told me to set something to false but i had to set it to true to fix it
works now
It was the ESP anticheat fake syncing
Ye could have guessed
You should pay me for the mental trauma you gave me tbh
silly eve
How do i set the Unit text of Guards/MTFs?
And does this text have any direct connection to the Unit names on the top right of the screen? Can those units be customized? Can the unit "selection" be customized for a player?
Also, can the "Follow Orders"/"Same rank"/"Give orders" stuff be customized?
Don't think so
They’ll pay you in bounties
ik you can change the announcent but i dont think you can change the actual unit name or the highlights on rank.
Yes, NW pays you after you capture or kill the target of the bounty
As in you can do priority work, different priority levels, and get paid accordingly
Assign it to yourself, push up your changes and deploy, test it and get QA verification.. $
Remove cedmod
UnitName(s)Manager I think
Though you can only use built-in combinations, no custom text
Ur acting like im becoming nw dev
i quit sl lmao
i mean i make secretapi and nw dont pay ppl to make plugins
Fucking told you
CedMod had a prefix that was returning false and preventing yours from running
This is why CedMod should be using transpilers
Maybe I'll make a PR for it sometime
Society if all cedmod patches were removed converted to transpilers
If I convert all the prefixes to transpilers will I get a high five from Cedric
Zero has done some of those
Okay question
I did a spawn wave thing where I replaced the base-game system
But for some reason wave animations aren't playing for clients
var field = typeof(WaveManager).Field(nameof(WaveManager.OnWaveTrigger));
var handler = (Action<SpawnableWaveBase>)field.GetValue(null);
handler?.Invoke(wave);
This correctly starts the animation for the server, which I know because the server recognizes that the animated wave animation is playing
It gets the duration right and everything
WaveManager.OnWaveTrigger += (Action<SpawnableWaveBase>) (wave =>
{
float duration = wave is IAnimatedWave animatedWave2 ? animatedWave2.AnimationDuration : 1f;
foreach (TimeBasedWave wave1 in WaveManager.Waves)
wave1.Timer.Pause(duration);
if (!NetworkServer.active)
return;
WaveUpdateMessage.ServerSendUpdate(wave, UpdateMessageFlags.Trigger);
});
This section from the Init for the WaveManager should mean that it gets sent to the client
Iirc I tried adding ServerSendUpdate to this code and it didn't change anything
The client logs don't show any rejection of the network message
I'm a little confused
Is there some other network message or something I need to send clients to play the wave animation
I'm just a little bewildered atm
Lmao
I haven't modified the collection
But I've modified the waves themselves
The odd thing was the system I had was working seemingly until the Christmas update but it might just be coincidence
I dont think xmas update changed any wave related stuff
This is what I did to waves
I didn't want them to happen anymore
I think you might need to send message to pause the wave on client too
I fake synced the reinforcements interface with my own waves
I tried sending a pause message but either I didn't do it right or it didn't work cause it didn't change anything
You'd think getting a single animation to play would be easier than this lmao
Well what everything did you change?
Hey guys, I just made a nuget package to generate an sl plugin template, would anyone be interested in testing it for me? In case this would count as advertisment, can anyone in the staff lmk?
Feel free to post in in plugins with source code
erm
what the flip
-# sounds like a skill issue....
Oh right, it was hidden for some reason
Just kidding ofc
hi david
hi eve
i was gonna add smth to secret api and then i looked in #1336031121699377213 and the first thing i see is literally a plugin doing that
💔
making exceptions actually yk...
log
and not just die without anything
i could add it anyway for the fun of it
but im not sure theres much point with an existing one doing just that lmao
I didn’t assume you were or planning on
Just a joke
!csg
Know Your Exceptions
who r u
SlejmUr
valid argument
the breaker of plugins
good point
He’s the guy
Exactly what you saw + a couple patches
Well basic debugging steps then
Does that code actually run?
Yeah lol I did all the basic debugging
Are the network messages created correctly, is the wave id in the message correct?
Everything works except the animation
The reinforcement interface fake-syncing works, the spawning works, everything works
The server even recognizes that the animation is playing
Correct
I checked the client log
It's just a matter of getting the client to actually play the animation
It's probably something really obvious that I'm completely overlooking
Show that the message gets in fact truly send XD
There is only 1 client-side check for these
and that one throws argument exception
Which you would see in the logs
Wait so the message going through is designed to cause an argument exception?
If the wave index is invalid, yes
Oh well the wave index isn't invalid lmao
Unless you want me to make it invalid on purpose to make sure the network message is sent
Because currently I get no errors from it in my client log and I know that the messages are being sent because the reinforcements interface works and that uses the same messages
Where does a players current item sync?
What do you mean by that
which way
when does client tell server its item swap or when does server tell client about the item force
I can change what RoleTypeId is synced using FpcServerPositionDistributor.RoleSyncEvent, is there anything similar for current item?
Damn
Inventory::ServerSelectItem
Hmm
Inventory::NetworkCurItem
[HideInInspector]
public ItemBase CurInstance
{
get => this._curInstance;
set
{
if ((UnityEngine.Object) value == (UnityEngine.Object) this._curInstance)
return;
ItemBase curInstance = this._curInstance;
this._curInstance = value;
bool flag = (UnityEngine.Object) this._curInstance == (UnityEngine.Object) null;
if ((UnityEngine.Object) curInstance != (UnityEngine.Object) null)
{
curInstance.OnHolstered();
curInstance.IsEquipped = false;
if (this.isLocalPlayer)
{
curInstance.ViewModel.gameObject.SetActive(false);
if (flag)
SharedHandsController.UpdateInstance((ItemViewmodelBase) null);
}
}
if (!((UnityEngine.Object) this._curInstance != (UnityEngine.Object) null))
return;
if (this.isLocalPlayer)
{
this._curInstance.ViewModel.gameObject.SetActive(true);
SharedHandsController.UpdateInstance(this._curInstance.ViewModel);
this._curInstance.ViewModel.OnEquipped();
}
this._curInstance.OnEquipped();
this._curInstance.IsEquipped = true;
}
}
@hearty shard not gonna necro on the issue but like
Currently, we require an API
in the labapi repo
pretty sure they want something related to LabAPI
then it wouldn't be a labapi issue
well thats not for me to decide 
i just clarified what i thought was the case of their request

okay but like
the "api" is already there
in the base game
and if they wanted a command, they would've said "command" probably
well
im going off just the
"in the game"
braincell fight
yes
also
ax
did u see the new minecraft animals
the babies specifically
like
most adorable shit ever
i want to eat them
i will tell you otherwise
i am NOT getting ppl in exiled to get hired
i do NOT trust it
xd
hell nahhh
okay you were right
id rather try my luck finding actual devs to work with 😭
check the github issue
im always right
i'm quitting (not gonna be specifying what i'm quitting)
oh i misunderstood the text
bruh
nerd
average sl dev 
does Itemspawned integrate even dropped items, or just at the round start?
So for example, if a pickup lets say a coin spawns on the Map Creation only those?
Ye but not all those, some isnt which wierd
hmm i will keep it in mind then
there's one more universal
I need to do spawn chances for a custom item
so thats why
What i did is replace after generated
with what method?
Im rn doing it to the ServerEvents.ItemSpawned
But then in that case that would go to actually the OnRoundStart or OnWaitingForPlayers
the one you mentioned
Lockers aren't run that
bruh
so yea i need to do it OnWaitingForPlayers
which i think is the same one you are doing?
with the list of Pickups?
Ye
You might also wanna do smth like locker. All. Wher xyz and remove the item and add yours
(or just register it's serial
will i get sued? https://streamable.com/1qjyrn
i cloned Outlast lmao
What is the command to create a server in the game?
cst
Right, thanks
How to make SERVER SPECIFIC binds? I can't find anything api docs for this quest.
When enabling the plugin do this
internal List<ServerSpecificSettingBase> _settings;
_settings =
[
new SSGroupHeader(Config.KeybingSettingHeaderName),
new SSKeybindSetting(Config.KeybindSettingId, Config.KeybindSettingName, KeyCode.K, hint: Config.KeybindSettingHint, allowSpectatorTrigger: false)
];
ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray();
ServerSpecificSettingsSync.SendToAll();
Event:
private static void OnValueReceived(ReferenceHub referenceHub, ServerSpecificSettingBase settingBase)
{
if (!Player.TryGet(referenceHub.gameObject, out Player player))
return;
if (settingBase is SSKeybindSetting keybindSetting && keybindSetting.SettingId == Plugin.Instance.Config.KeybindSettingId && keybindSetting.SyncIsPressed)
{
if (Utilities.TryGetSummonedCustomItem(player.CurrentItem.Serial, out SummonedCustomItem item))
item.HandleEvent(player, ItemEvents.SSSS, player.CurrentItem.Serial);
}
}
Is it two example binds?
_settings = [ new SSGroupHeader(Config.KeybingSettingHeaderName), new SSKeybindSetting(Config.KeybindSettingId, Config.KeybindSettingName, KeyCode.K, hint: Config.KeybindSettingHint, allowSpectatorTrigger: false) ];
Just what i had open
ok, thx you!
Theres also frameworks like https://discord.com/channels/330432627649544202/1392914215571816528
Use SecretAPI
Also, the code above would nuke other plugins' settings
Who needs those
Why would you need your own settings
back in my day we didn't have
back in my day we didnt have SCPSL
back in my day we didn't
🧙♂️
Cuz server mod is win!!!
Btw i like playing with wave system in sl
Its so fucking weird
Im changed time of mtf and ci respawn and made new custom squads
Mini waves at 2 min just respawns 
Why?
Idk
But i will just change mini wave time
Guh...

And i hate how now wave size work
Server online and spectators / number = wave size precent
Plz kill programmer of this


@restive turret
Lel
That one is called Java
C flat
C♭
Indeed
Random question: Why do some errors only show up in the LocalAdminLogs and not in stdout? Is there something that prevents them from writing to stdout? if so, why can they still write to the log file?
Do you mean the LA console by stdout? Because that isn't stdout
Unity writes its exceptions to the standard output, therefore LA logs (those thrown by components)
You need to catch the exceptions and log them to the console yourself if you want them to be visible
You can enable writing standard output to the LA console with a config setting, though it's gonna spam a lot of unnecessary things
Oh your pronouns omg...
catching them myself kinda defeats it since most of the time it's an error in a place I had no clue could have an error
thanks anyway, I was just wondering it is the way it is
Well you can't catch unity event exceptions such as Update
And yeah it's annoying when stuff silently fail and make the log file hundreds of MB
i mean
try Application.logMessageReceived
that should run for exceptions even from unity
dunno tho
i just treated pronouns field as an additional place where i can put some cool text
That just gives you stdout
damn
i tried fmod yesterday its so cool and awesome of how fucking insane it is i tried building the banks but none of them build for some reason
i love fmod
Try NAudio and/or SoundFlow (the GitHub one, not the corporation one)
thanks i'll look into them :'D
If you're confined to a game engine then you can't use SoundFlow
so true
FartMod
why nw make it private and make me use reflection???if(npc.CurrentItem != null) { if(npc.CurrentItem is Firearm firearm) { if(firearm.Base is AutosyncItem autosync) { var p = typeof(AutosyncItem).GetProperty("DummyEmulator", BindingFlags.NonPublic); var DKE = (DummyKeyEmulator)p.GetValue(autosync, null); if(DKE != null) { var AE = typeof(AutosyncItem).GetMethod("AddEntry", BindingFlags.NonPublic); AE.Invoke(DKE, new object[] { ActionName.Shoot, false }); yield return MEC.Timing.WaitForSeconds(1); var DE = typeof(AutosyncItem).GetMethod("RemoveEntry", new Type[1] {typeof(ActionName) }); DE.Invoke(DKE, new object[] { ActionName.Shoot }); } } } }
you dotn need reflection
just publicize the assembly
and if you are going reflection you should cache it
also afaik you dont even need to manually remove entry
it does that when its been used
or so i think
😭
with this you can run smth like
DummyExtension.TryRunItemAction(dummy.CurrentItem, ActionName.Shoot, true);
nvm it doesnt have "this T item"
If you have a FirearmItem why not just firearm.Base.DummyEmulator.AddEntry(ActionName.Shoot, true)
Oh I see
That's what you do
I didn't look at the function lmao
My bad
Me when
if (condition1)
{
if (condition2)
code;
}
Also won't that code error if the player isn't holding an item
You don't null check player.CurrentItem
You can make some optimizations and readability changes here
Havnt touched it in like 6 months ¯_(ツ)_/¯
When you check player.CurrentItem you do player.CurrentItem is null when you could do player.CurrentItem is not { Serial: var serial }
That way in the else if you can just use the serial variable instead of reusing player.CurrentItem for the serial both times
Since you do the break condition, there's no reason to have an else as it's already implicit
Also you could linq the items loop like
foreach (var customItem in player.Items.Where(item => item.Type.IsArmor())
.Select(item => Utilities.TryGetSummonedCustomItem(item.Serial, out SummonedCustomItem customItem) ? customItem : null)
.OfType<SummonedCustomItem>())
It looks messy on discord cause of line wrapping
The select could be made much simpler if you introduce a function with a nullable return type like SummonedCustomItem? GetSummonedCustomItem(ushort serial) because then it just becomes .Where(item => item.Type.IsArmor()).Select(GetSummonedCustomItem).OfType<SummonedCustomItem>()
Sorry I don't mean to be hyper critical I'm just procrasinating my own work
The stuff I'm doing right now is mostly trial/error and I hate it
As pointed out before, you can just publicize the assembly
If you don't wish to do that (99% of devs do because there's really no reason not to), you can still simplify this code a lot
First thing is that I don't know why you imported FirearmItem as Firearm, but that's a minor point
The biggest thing immediately is the 3 nested if statements
You can simplify it be doing if (npc.CurrentItem?.Base is Firearm firearm) where Firearm is not the LabAPI FirearmItem wrapper, it's the InventorySystem.Items.Firearms.Firearm
Firearms are always an AutosyncItem which is why I didn't include that in the checks
It means your third if statement always returns true
Also, it appears you're doing this reflection in a coroutine
It would be better to store the FieldInfo somewhere static so you don't do reflection every time the coroutine runs that part of the loop, or anytime the coroutine runs generally
The real thing to complain about is the fact that I have to publicize the LabAPI assembly
It makes sense that you have to publicize the base-game assembly, because no one should be making an entire game with only public fields
What doesn't make sense is that there are private fields in the public-facing extension meant for modders
I mean in some cases it may make sense but there are fields that shouldn't be private that are

Question
Gravity is persistent across respawns
So if I set a player's gravity, and then they die and respawn, their gravity is still set to the modified value
The issue is then that if they die, I have no way to actually reset their gravity
The LabAPI Gravity field doesn't actually account for this, and seemingly runs under the assumption that gravity resets when a player dies
check on respawn?
thats what we do bc we do grav shiz
I could do that but that's lame and situations may occur in which I want gravity to be not default upon a respawn
The thing is right
If the game knows the gravity is changed on respawn, then it has to be storing it somewhere
Somewhere it knows there's modified gravity
I just don't know where it does
And it has to be stored somewhere on the server, not the client
So I know I have access to it
ye. that do be the question
GravityController gets this value from a static dictionary so it should give you the correct gravity even after a role change
GravityController.DefaultGravity is probably a thing you're looking for
No I knew it existed, I wanted to change a player's gravity while they were dead
Ah
My whole point is that LabAPI doesn't account for this
They depend on the player being alive
Yeah that makes server
Which is why I said this
Sense
Feel free to make an issue
I hate this system of having instance properties that reference static fields
SL moment
Sure it's cool for persistence but it's a headache to work with
The expected approach is to get an instance to modify something static 
Like
new Calculator().Add(a, b)
Where the add method calls a private static method

Based
for future reference (if someone will use ctrl+f) and you are stuck at ServerOnSettingValueReceived, remember setting won't be called if it's not present in defined settings 
Just use an SSSS wrapper smh
they're making their own
If you're interested, I made a transpiler for Player::Gravity that allows it to be updated even when a player is dead
My transpiler stack is growing haha
I used to only have like 2
Now I have like 8 or something
Well at least in terms of bug fixes
I have some others too
I'm aiming for a dozen
the one big update later:
Man some of my bugs have been opened for months my expectations aren't high
I have no clue where to start making plugin compability for SSS
it's not created for that
you're cooked
Yet another "universal solution"?
Literally
smth like that
"let's make a standard fr this time"
Wait where's that one image
This
Why are you wasting your time when there is 14 plugins that already do this
eg
secretapi
SecretAPI is already goated
*3
literally javascript frameworking
I didn't really see much of SSS that would allow dynamicly create another settings (or have not looked enough)
"i don't like this one thiing"
*creates a whole new framework*
huh
Shitscript is another case
shitscript
Yeah whats up with that
afaik secret api has per-player settings no?
yea
I remember I had this conversation a while back about ASS cause not many people use ASS and I was saying "Man, I use SecretAPI because it was first, and it works cleanly with no issues"
It's really as simple as that
ASS is just a clone of SSSS
with a few additions
wasted 4 hours gg
sooooo not too late to give up 
Could be worse
Is ts just gonna be a clone of SecretAPI with a few additions
SecretAPI overrides settings that are not from SecretAPI
it doesn't override them
so I thouht I would look into that
https://github.com/Axwabo/ScpProximityChat/commit/f976222855ad8b0409a53775529e393aae84305f
asked eve and she told me it doesn't mess with other SSSS
can confirm
Postfixes don't override anything
so this means it doesn't override, but it doesn't mess with others
the comment 😭
They're an addon to the code












mb
The only time a patch overrides something is
- It's a transpiler
- It's a prefix with a bool return value that returns false
c*dm*d mentioned
postfix can override the result no?
yes
That's true
but it runs after returns
Right
But the original code is still intact
All the original code still runs and any additional handling is skipped by the postfix if it's not a SecretAPI setting
Bro does SL use Mathf.Ceil when displaying health
I multiplied a player's max health by .6 and it displayed 61
So I decided to log 60 - maxHealth and got -3.814697E-06
welcome to float precision
The max health is less than 4 millionths greater than 60, and yet that causes it to display as 61
i would assume we do because if you had 0.4 HP then it would display 1 HP
Right I get that but you'd think there would be some kind of tolerance check
I mean Mathf.Approximately would consider them the same
I'm just gonna patch the max value setter and have it set the float to the "pure" version if it's considered in range by Mathf.Approximately
that would be the percentage version, no?
@unique crane (I hope https://github.com/davidsebesta1 is you), I need to create an exact copy of an item and the easiest way is to create it with the same serial. Otherwise I would have to copy everything over, including the syncinfo and all other properties. The bugs do not affect me since the previous item does not exist when a copy is created. Yes there are ways I could rewrite the whole thing, but this would lead to my plugin being less compatible with other plugins.
That being said, I understand that you don't want to add this as it is in fact unsafe if you don't know what you're doing (and is still unsafe even if you do know).
This was a response to: https://github.com/northwood-studios/LabAPI/issues/335
If you store these data somewhere, then create unique identifier within the data you store
cos it doesn't exacly exist
And then link them together after they are all created
I am mostly doing all this cos other plugins use the serial for tracking and since it is the same item I am just giving them the same serial
Yeah you exactly cant do that
wdym?
yeah, I'm not doing that?
I don't even understand the whole thing
me neither, honestly
I am also now realizing how much worse of an idea this is
Can you explain what are you trying to do?
We can help you with finding a better solution
I have like a 500 - 1500 line codebase so not really
example not said paste here all
but, I have a plugin which records all action in-game for filmmaking (the thing I'm working on)
and I want to support custom items among other things
those are tracked via the serial most of the time,
Secondly, I use the same ushort since I can't really store the whole item each frame / on change (still a lot)
How do you store them
public struct VanillaItemRefence(ItemType itemType, ushort serial = 0, bool tryFindPickup = true) : IGivableItemReference
{
public ItemType ItemType = itemType;
public readonly ushort Serial => serial;
private readonly bool TryFindPickup = tryFindPickup;
private readonly bool MatchesSerial(Pickup pickup)
{
return pickup.Serial == Serial;
}
private readonly bool MatchesSerial(Item item)
{
return item.Serial == Serial;
}
public readonly void GiveItem(Player target)
{
if (target.Items.Any(MatchesSerial))
return;
ItemPickupBase pickup = null;
if (TryFindPickup)
{
pickup = Pickup.List.FirstOrDefault(MatchesSerial)?.Base;
}
target.Inventory.ServerAddItem(ItemType, InventorySystem.Items.ItemAddReason.Undefined, Serial, pickup);
}
}
public struct CustomItemReference(ushort serial, CustomItemReference.GiveItemWithSerial giveItemMethod) : IGivableItemReference
{
public delegate void GiveItemWithSerial(Player player, ushort itemSerial);
public delegate bool CheckCustomItem(ushort itemSerial);
public readonly ushort Serial => serial;
public GiveItemWithSerial GiveItemAction = giveItemMethod;
public readonly void GiveItem(Player target)
{
GiveItemAction(target, Serial);
}
}
ushort reference
When storing the data, map the items to your own unique identifiers
your id <-> current serial
If you store the data somewhere, for example json
Load all items
take their serials
make the map again
And use that
So you bind your actions to your item ids, which can be fixed
Removed
why no nuget? 😭
it's like 3 lines in csproj
and then i have to upload it
as in items?
yep
and some states that are stored in static dictionaries also aren't stored by this
Skrill sissue
i fucking hate the instance-tied static variables approach
Huh what does that mean
Uhh
@upper vapor what's the license?
technically it's ARR
cuz there is no license
@slate flume did you end up sending a GravityMessage while the player is dead?
Ohh ye , I saw some place there it do that and i change it to be static instead
Anyway time to eat and write my own Demo playback 🔥
anotha one
There is zero public one
Or I didn't see anyone posted it
I aint seen he posted any of it
Yes
The client needs to be aware of the gravity change, otherwise there would've been desync
The game only sends a gravity message when the gravity is changed, which doesn't happen on role changes
The client would just continue to believe there was a modified gravity
It uses Exiled so take that as you will
I'm a LabAPI man myself
Well when I change custom role I reset everything back
I think it is the same stuff with the scale
Huh?
Both are not reset on class change
Scale and Gravity not change back to default after role change
Yeah
That's the entire point of the static dictionary
The uh FpcGravityThing.SyncedValues shit
Ye then Im out of loop then
I just made a transpiler to fix LabAPI's Gravity setter
I reset the value on role changing by hand but only if the player had custom role
Sometimes its great
Sometimes its not
Yeah I mean I did this and everything was fixed for me
Because I reset gravity after the player dies
For example we use this as our advantage when someone for example get an effect from coin and become small, so it will be small for the entire round
if only we didn't bind the setter to an instance (which ends up in a static context anyway)
I like the persistency
Fucking literally
I made a transpiler that does pretty much the exact same shit
We are 1 PR away
always 1 pr away :(((
The order is just get player -> change dictionary -> send new message
Which is literally the exact same thing it does
you know what i will
How far do Do Not Track guidelines extend? I'm making some features that prioritize a player for certain things if they perform well that round
Everything is stored on a per-round basis
if its gameplay related then ur allowed
Sick
I already read the CSG
I just needed elaboration
Cause I'm doing some spawn wave stuff and I wanted to put players on different teams based on stats
Gaymeplay
8.3. Server Sta, the Game Server and its Modifications must respect the Do Not Track (DNT), an
opt-out from any data processing that is not needed for gameplay or server security purposes.
It is forbidden to kick, ban, or otherwise punish players for using any of the described opt-outs.
I know I already read it
yeah that seems valid
The big question is
just posting it for the specific part ive look at when deciding it
Does it extend to an end of round leaderboard
that imo isnt gameplay related
Yeah that's what I feared
and thus would prob not be allowed
you could have it so that the leaderboard only shows the ppl without DNT
shut up eve
That's already how it works 🔥
I've never encountered this issue before cause I didn't care to store player information
Now I have a thing that needs it and I'm overhauling the system I used
End of round leaderboard just didn't even touch DNT players
I don't know if I'm making much sense it's like 8am and I haven't slept
hm
i meannn
the issue with not being able to track it is that by not tracking u dont know whether someone is actually first or if its a DNT person
does kinda suck to not be able to show the correct spots
oh well
it be like that
I mean it's more-so figuring out if someone is in last rather than first
Zero-based and all that
lol
yeah someone nuked them already
Does anyone have map editor plugin labApi or know where i can find it ?
your options are ProjectMER, sloc and MapForge
Alright thanks
Np
Try it and see 
Rip
I know a lot of you guys here use the bepinex assembly publicizer nuget package to automatically publicize imports
And I also know a lot of you guys also use rider
Is there a way to prevent these annoying ass duplicated results when searching usages and things
It checks both the publicized and non-publicized assemblies and it's going to make me crash out
Idunno i don't use rider so @upper vapor maybe
Erm
I don't have this issue with SL plugins
I have it sometimes when I launch the debugger in a Unity project
Check all the imported references
(Right click csproj, properties something?)
Or just restart rider 
So when you check usages with rider when using the bepinex assembly publicizer, it doesn't show two entries?
Based on my last report, this shouldn't have been closed because it's an oversight in the base game code
https://git.scpslgame.com/northwood-qa/scpsl-bug-reporting/-/issues/2684
I've only ever had the one reference
The only difference now is I use the Publicize="true" instead of referencing a manually publicized assembly
And now doing it this way I get duplicated usages
Nope
Bruh
Can you send your entire csproj
Also, check Rider's references view
Btw, which version of the publicizer are you using?
Latest official release
My references are also clean
Only Assembly-CSharp
Your csproj is not clean 😭
Relative hintpaths
You're not a knower
It's not like I hand-crafted it lmao
What does it show
Why diss on relative paths
It prevents my name and shit from getting doxxed when people ask to see my csproj
Like right now
Why should I go through more work
For something that already works
Try deleting the .idea folder
So you can flex with your MSBuild skills
Though if nobody is gonna see it then yeah it doesn't make a lot of server
Serve
Sense
Also relative paths are dope because when I go on vacation I can port my project a lot easier
What
Onto my laptop
That's
I don't take my PC with me on vacation
An interesting approach to put your project in the correct folder so the relative path works
I mean I use the default folders
Which means the path doesn't change because I don't customize the install
No need to overcomplicate everything
Ah
The only thing that needs to be accounted for is installing the server in a folder on my desktop but I'd be doing that anyways
TeamSpeak?
TeamShutup
My brain deleting the .ideas folder when it’s time to create something new
Or really anything
Real
i just realized what you meant by this
my cellbrains are slow
Deleted the .thoughts folder I see
@celest thorn I remember u did twitch integration, is it public?
No
:(
The only other one who has it is ghost
Well after 2 hours I say fuck async and fuck microslop dependency injection
async is easy in c#
In unity?
is your real name on your computer?
maybe im weird cus it seems like most people i know use their irl name or nickname for computer user folder
Awaitable?
ya
You think these beautiful 3rd party stuff thinks about unity ? Hell no
???
You sound like Yamato 
Anyways, you can always use MainThreadDispatcher to get back onto the main thread. It’s worked well for me the few times I’ve had to use async
is it because the english isnt native
genuine
taskHere.Wait()
Or something
awaitable is unity
Its not me who create async shit!! Its the other party
ur being silly now
Asillysync
Real and true
30 dollars well spent
2 hours went by just to see how would that thing work
I know some yt vids that cover async stuff if you’re interested
Maybe
I did some basic async stuff but that wasnt really much
But since this is unity stuff it is hell to understand
I question visual studio sometimes
Slopilot
Where do I install labapi?
Comes with the Dedicated Server on steam
There's no need to install labapi, right? It says it's the default folder.
Its automaticly installed
thank you
Looking at the Unity docs, it reminds me of making a Task<> in winforms / gui apps
That Awaitable<>
Yeah. More efficient to use that over Task
depending on your use case
Skill issue
I'm glad I don't use this shit
Java mentioned?
vsc is better
way more straight forward
the only difference in unity is that continuations run in update
So I can just use async and dont care about the consequences as in other place?
await Awaitable.BackgroundThreadAsync()
After that you should be fine
If you wanna mess with unity stuff then go back with MainThreadAsync
But that's not gonna let you interact with unity
So you need a queer
Queue
Eh, either works
you are the queer
why have a queer when you are a queer
"Why are you straight?"
"Who says I'm straight?"
"You are straight"
"I am cisgennda"
I didn't know they updated the spelling of query 
New .NET looking 🔥
just dont ever wait on tasks
is it posible to modify a player camera axis?
Player.LookRotation
You can't change the roll though (Z axis)
when i was new to C# I did this 
ive come a long way
Well then suggest me how to interact the best way with websockets and my life is yours
just use SSE
server sent events
What does that even mean
basically, just connect your server to that, and have api endpoints instead
but the sl server uses sse
google SSE
there will likely be some c# implementation examples somewhere
no i dont want to run server I want to connect to a websocket
which you need to run a server for...
or can be my own websocket server
and lumi disapeeared
for me?
nah
or you waiting for that async task to be done 
made a feature request
for a repo
takes them like a couple hours to read it and do it
so gotta wait for it to be done before i can progress
lol
iirc
Websockets are broken in Unity
So many stinky NW staff in this channel ew
^Plugin devs being kidnapped to work for NW for eternity
Ever wonder how much they are paid
This is so true
I remember when one of my devs got kidnapped to work for NW
crazy, right?
you should do this every time you wanna fetch data from a website 
do not
NW that scary huh
I did work there before so.. maybe
tell that to people who do it anyway
$0.00
My server is currently under a botnet attack. What solutions are available to protect or mitigate this issue?
you need a hosting provider with ddos protection
Not DDoS. SYN floods don’t affect me — it’s bots spamming normal protocol connections.
um
They probably still use the bounty system
its rabbit season, no its duck season
Go assign yourself confirmed issues on the internal SL git page
damn i didn't know you were our manager
and btw, he's taken all the tasks already 
those that I think I capable of fixing and doing it ye
The API team lead I am, yes
No sharing?
Tough times
Well
for former colleague then
invisible emoji on my screen
It’s a salute emoji
yeah i clicked it
Beryl told me he wanted me to work on the API stuff but sadly that never happened
@berly is this true?
Was like a year back
When LabAPI was still in planning or so
All roads lead to Rome
or ignore it
whatever you want
Cedric the goat
Yes
Because I have windows and when it sets up user accounts with your Microsoft account that's the default
idiotic MS ye
THANK YOU MICROSFT!
Oh i dont use ms account
bc my microsoft account locks me out of my computer after 1 hour of being on per day
Why does Server.PlayerCount return Player.Count and not LiteNetLib4MirrorCore.Host.ConnectedPeersCount
My MS account got hacked
So I can't use it anymore
@restive turret I love you
I'll say, if I wanted Player.Count I would've done Player.Count
I thought the point of Server.PlayerCount was to return the number of actual players on the server, not including dummies
You know what was really epic to learn today
AdminFlags are stored as a float
I get why it exists that way but it's stupid
Why 😭
Blame the stats system
So what should I do to make sure primitives are optimized
Now that I'm like actually using them
Make them client side
At zer0two

On a serious note, make non-moving primitives static
I saw stuff this and assumed I'm not gonna get any info from her
Already done
Every primitive I use is static
I have no moving primitives as of yet
Skill issue
Then that's pretty much all you can do if you don't wanna mess with faking primitives

It's not my fault NW's only way to add map objects is unoptimized garbage
I'm doing the best I can with the tools provided to me
I don't gatekeep the things I do or find out, it's why I'm active on this Discord
"90% is unknown shit I do"
That's not optimizations, that's probably editor shit (idk why they made it like that)
I've seen the basics of the editor's workings, it's weird
I wouldn't know
It was just heavily implied to me that some of the optimizations were "under wraps"
I'm fine with doing more complicated shit if it means better optimization
I just haven't found anyone around here actually talk about what you should do to optimize primitives
Are primitive colliders synced with the client? Would it be better for more complex models to disable their colliders?
Yes and yes
U can desync primitive flags
If you can use a box collider for a complicated mesh, use an invisible primitive for collision
That works too, but then the colliders might not match what you want
Yeah
I made once flags desync to make "collision" for players
It was fun but not very stable
Can I disable the collider just by doing primitive.Base._collider.enabled = false; or is there something else I need to do

