#plugins-dev-chat
1 messages Β· Page 16 of 1
@rugged laurel thats ur answer ^
also fuck PickupCreatedEventArgs
that shit does NOT work for what i need
and theres no alternative
π
Exiled patches ItemDistributor.CreatePickup for the event
and that worked for me
maybe i just gotta patch that too ig
well
actually no
cuz
hm
idk
even when i throw it, same issue so wtf
is the event not working
what are you trying todo?
Worked for me teheehe
Ah nice so scale things work
the event only calls for basegame ones
strange
Then subscribe to once in InventoryExtension?
yes but this should still work
PlayerDroppedItem
2 events π
Just call underlying method with your serial
Also droppeditem won't trigger when player died
theres ItemPickupBase.OnPickupAdded but that should be equivilant to the labapi PickupCreatedEvent
And drops is item
yeah
i see the issue, its becuase the wrapper is created and cached before the event is called
bwa
this should work, not sure when the next patch is happening tho could be awhile
/// <summary>
/// A private method to handle the creation of new pickups in the server.
/// </summary>
/// <param name="pickup">The created <see cref="ItemPickupBase"/> instance.</param>
private static void AddPickup(ItemPickupBase pickup)
{
try
{
if (!Dictionary.TryGetValue(pickup, out Pickup wrapper))
wrapper = CreateItemWrapper(pickup);
ServerEvents.OnPickupCreated(new PickupCreatedEventArgs(wrapper));
}
catch(Exception e)
{
Console.Logger.Error($"Failed to handle pickup creation with error: {e}");
}
}
π
will the public beta be extended to wait for labapi fixes?
subscribing to ItemPickupBase.OnPickupAdded will work how it supposed to tho
cool
i doubt they would wait for us

most things are fixed done already just not merged
"labapi 1.0.0 has been released with 14.1! it only contains 42 bugs!"
i mean that's nice
negative
im not using exiled
cool
Then wth us CustomItem cus its aint mine
its mine
Guh
Lmao
Skill issue
fak u!!
I just parent the light to pikcup
^
I prev just moved the light to coords
Also why when you use an item the light moves back & forth?
I parented to the player
huh
yeah i did
thats not the issue
its falling through the pedestal
because pedestals dont properly spawn until door opens
Try it, you parent a light to yourself, look down , use the item
i thought you parented the light?
yes
im talking about the pickup
the pickup goes through the pedestal
something isnt right here
thats the issue
cuz pedestal doesnt get spawned in fully
until room is opened
so im asking if isKinematic = false can do the job
you must be offsetting the light, since the position is client sided it should be where the item is visually
pls re-read
also pickups should be kinematic anyway
its the item itself
yeah i know about the room stuff, and im pretty sure the game does what you are saying
pickups arent kinematic unless you add them to a locker
a pedestal is a locker with one chamber
i just spawn em in the locker position
yes
oh your replacing the pickup with your own?
ic
oh btw
i might rework my thing to use a prefab kinda style like basegame
so each CustomItem only controls its own single item instance
would that be a good idea to use the unity prefab kinda style for it
not sure how easy it is in plugins
yes
lol
you mean components that control the specific instance? i support that
you gotta have some manager somewhere i just dont like it being the main way to implement custom items
on rigidbody
I didn't really liked that one
chaos insurgency
smh
U need new url for the zip file
If u replace that it will work
yeah
there is none public rn tho
and im too lazy to make one rn
im gonna kill u
i couldnt replicate this, i parented a light to a player then looked down and used a medkit. am i missing something

Its really small movement si
i have a few question.
song?
nice panel is that public?
thats funny
Thomas Bergersen - Memoria
SSS panel is not public yet
david
ye panel looks great
can we cook you
Testing stuff is much easier
lmao
I'm on sun whole ass day
I think I'll be cooked enough by that
not enough
is this schizophrenia
for some reason RigidBody doesn't work, making primitive to stay in a air, RigidBody applied on parent game object, not on primitive itself.
don't know what is blocking code snippet there, but here is code part
disable IsKenetic or smth
or enable
i cant remember
I try, thank you
admintoy transforms are now local, so you should pass the position parameter to the toy
also, rigidbodies need a collider, try adding a boxcollider to the root objecct
well, i've tested in unity itself without collider, it should work
will add after figure out why there no movement
you've set the toy to static
that's fine
but you need to sync the transform properly
hold up, this is the wrapper
yes, sorry didn't mentioned, I am using wrapper for creating primitive
it should've occurred to me from the code lol
anyways, you need to use the local transform when setting admin toy transform properties
so localPosition goes to Position, localRotation goes to Rotation and localScale to Scale
you already have those as parameters so you can use them
yes, I am using transform of parent which is spawned on global coords and set on localPosition and localRotation to zero, so it spawns correctly, the only thing there are no movement
didnt helped
you're creating an empty game object
it's not possible to parent toys to an empty object outsideor within another empty object
each parent needs to have a network identity
i'm not sure why you need that offsetPoint object, but don't parent the toy to it
parent it to the transform of the gameobject itself
@worthy rune could you add some sort of error log if the parent changes to an object that doesn't have a network identity?
cuz it might be confusing for new devs
actually that wouldn't work either
your best bet is to create an invisible colliderless (PrimitiveFlags.None) game object as a parent
that means you can move the parent, too
why so
it's easier to use an instance-based approach to separate state
I usually just use a dictionary of serials and a model i make representing the item stuff I want
I guess I just got used to this way of thinking, the singleton item managers dont bother me in the slightest
neither do the customroles
well, singletons are more so meant for single objects, not for multiple ones
i mean yeah you can store the state in a dictionary
but if you have a component attached to a gameobject, it'll clean its state up
it means more allocations though
Bumping this. People complain about binds not working between servers on the same network 
i think a safe approach would be to prompt players to reuse settings if they've modified the settings on the same ip but different port
this would all be client-side
i recomend making an issue on the labapi github for future reference
skill issue
pretty much what the others said
that info is client sided, so good luck tryna do that
oh
are managers bad form?
or are they just some people dont like them
@upper vapor ok, I figured out that for some reason Rigidbody works only for these primitives and not for gameobject which groups them. Strange, because vanilla unity allowes me that
!status
Adding a Rigidbody component to an object will put its motion under the control of Unity's physics engine. Even without adding any code, a Rigidbody object will be pulled downward by gravity and will react to collisions with incoming objects if the right Collider component is also present.
the docs say you must have a collider along with a rigidbody, are you sure the vanilla unity thing didn't have one?
primitive can live without collider but rigidbody enabled, tested in unity, works fine after removing it after spawn, no collision , but object keeps falling.
@restive turret remember how I brought up that one can add \n to descriptions? Yeah no that doesn't work like I want it to don't forget to add # in front or it won't be commented out.
greetings nerds
lel
Hey so uuuh
you should be able to disable DMS right?
like in server config?
Why does it not work?
also how is the game suddenly deciding to spawn a Chaos Miniwave when the only team that had a Token and spawned (Ntf) didn't..?
like I find this particularly weird, only ntf had spawned, nothing else had any tickets, milestones or tokens, and it spawns a chaos miniwave
additionally, I used the admin panel to disable DMS and it did not actually do that. It still went off.
well something got happen with this update, on previous version primitive receives parent gameobject coords. In this update primitive don't move with parent. In logs I see parent coords changed, but primitive still on its pos.
Alright I found my issue with this and it's very fixable
however.. why the flip does it still run DMS when it's disabled?
like I disabled DMS in the admin panel and server config?
I'd like to make something to set minimum spawn wave size for main waves and mini waves, but idk what determines when a team spawns because that'd need to be modified. I can't find the function. I wouldn't be surprised if I'd need to Patch it either.
Hello, are there api functions to get the local and global config directories? I will just build the paths myself for now but I would like to use ones that automatically update when the api changes things up.
I saw in ProjectMER some implementation
what is that?
there is only ported configs for labapi, not global
ah ok I'll have to find somewhere else to store my global configs then
there is probably a PathsManager property that gives you the main config folder, from there just make your own folder or do smth like pluginname.yml
I just meant a pathsmanager like property that included the full path to the config directory really, like $"{PathManager.Configs}/{Server.Port}" basically
anyway, I'm thinking I'll create the global directory so it works like before, or is that confusing for users?
Can I also use that for minimum size? So wait with spawning until a certain amount of spectators are met? In our lobby so small we keep having 1-2 people waves wasting tokens when waiting a little bit would be fine, so I wanted to make something for our server to set a minimum, but idk how to set that as it'd mean I have to interrupt the spawning of the team until enough people are spectator before I allow it to select (which I reckon requires a patch)
Just Check via the OnPlayerDied Event If there are enough spectators in the "Lobby?" And then automaticly execute an miniwave
Would be my implementation
Made a PR for the CustomDataStore
It currently doesn't support checking if a data store exists on a player
GetOrAdd() would simply add it
WaveSpawningEvent can be cancelled
Until you have enough players
Oh interesting, how'd you cancel it? Just return out of it?
Sprry I habe no idea how this typa stuff works
Property IsAllowed
Oh awesome I'll take a gander at this
yeah that might be confusing
i guess you could create a property to specify what path to use for configs, giving users full control
This is what you might be looking for?
sort of, I need to be able to get both the port and global ones seperately
Yeah thats why the isGlobal parameter exists
ConfigurationLoader
remote keycard be like
hard very much
Stealing this
why has the checkpoint beep to closing cooldown been decreased
Feels the same for me
I should also add method to check whether the keycard can open the door/locker/etc yea..
I mean yeah we can add some stuff to wrappers
I used just base game methods
just make like KeycardItem can check if has permissions to some door idk
Yea
donβt forget about lockers, nuke, generators and all that
Same code, you just replace the door with locker
xdd
is it possible to get breakpoints working when debugging plugins?
this doesnt stop on breakpoints when I try to run it
also tried running then SCPSL.x86_64 binary directly but I cant get it to work
yes that is my question
I would assume running the scpsl binary directly would fix it but I cant get it to work properly
it just dies immediately
Probably doesn't like you attaching a debugger to it
no I have only tried running it without a debugger so far
Although if there's a way I'd love to know
Not sure.. but you might need the debug symbols for the Assembly-Csharp too?
Never tried this tbh
Probs won't be possible, might also be Unity not letting you debug it since it's a released build
Most engines kick your debugger out for non-dev builds
i've tried to attach a debugger to the SL process
it died
very strange
SL client will probably nuke you from orbit if you try to debug it :^)
I would have assumed the debugger just wouldnt show any information about the rest of the binary
well thats incredibly annoying
I have the strangest issue
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://steamcommunity.com/profiles/76561198022373616?xml=1");
This doesnt work because apperently the uri prefix is unsupported
Makes me wonder if Northwood could provide a server build with debug stuff enabled for plugin devs
last time I checked https is pretty supported
Why aren't you using HttpClient
this is dotnet
in any case, this has worked for years but stopped recently for some reason
cuz no async (until now?)
I have a feeling that @worthy rune had same issue?
Unity's async is so weird I don't wanna touch it anyway
I used the exact same line in the bot and it works but of course thats dotnet 9.0
Are you sure it's whining about the URI prefix
Because https is apparently supported
I would like to quote a previous swedish education minister https://www.youtube.com/watch?v=01IFjucit2g
GΓΆran HΓ€gglund, partiledare fΓΆr kristdemokraterna.
nice
Does this also work for gens, scp lockers and experimental fridges?
shouldn't be hard to add if it's not the right event but still worth confirming
I think gen events etc ahould have same rhing
π I don't know what I'm talking about so you're probably right
works fine on .NET 4.7 so idk what's up with yours
You will need to change some stuff
yeah and it has worked for years for me too, but now its broken for everyone apperently
Honestly just switch to HttpClient
Microsoft considers HttpWebRequest obsolete anyway
I'll try that, thanks
also arent we supposed to use 4.8?
Yeah it's just what I could try with an online compiler
Also tried 4.8 and it worked fine
ah ok
As well as latest .NET so idk what's wrong
copied from Exiled's discord, but you aren't in it anymore:
Step by Step debugging
You want to do step by step debugging!
Setup
Note:
Maybe, do a copy of your server. To recover if you make a mistake or want to go back.
You can download your self or just take attached files.
Only server modification, DO NOT TOUCH THE CLIENT! Server, is where the Steam is install not EXILED.
Check if you Visual Studio / IDE as the extension for Unity Dev.
If not install it.
Download the Unity 64-bit, version: 2021.3.17f1. Different version now, but the rest applies the same
Unpack the executable using Winrar or 7zip.
[ExtractedFolder]\Editor\Data\PlaybackEngines\windowsstandalonesupport\Variations\win64_development_mono\
Take UnityPlayer.dll and replace the one found at the root of the server.
Take WindowsPlayer.exe place it at the root of server, delete SCPSL.exe, rename WindowsPlayer.exe to SCPSL.exe.
You can delete UnitySetup64-2021.3.17f1.exe and the extracted folder.
Go to [Server root]\SCPSL_Data\boot.config, edit it and add:
wait-for-managed-debugger=1
player-connection-debug=1
Debug
Place break point in your code. Build and place the dll in server ...
Start the server... A windows will open which will suggest you attach your EDI. Go to or EDI and attached it.
For Visual Studio (min 2019):
Go to Debugging > Attach to Unity > Select Project call "Debug" > click Ok.
Go to the windows open by the server and click Ok.
Disable the auto crash restart: HBCTRL disable
When a break point is trigger, you can inspect the value of instant. Durring run time you can add other break point. The modifications that you will make in your code are not taken ! You need to restart...
Disable the Debugging
Go to [Server root]\SCPSL_Data\boot.config, edit it to:
wait-for-managed-debugger=0
player-connection-debug=0
@stuck peak made a new PR targetting your branch instead of master π
makes more sense yeah hah
sounds good I was just about to ping you lol
hmm that looks a bit much, but thanks anyway
I wrote a quick extension method that uses reflection to do the same so I figured I might as well try to get it in LabAPI :^)
fyi in the future you can use for example this nuget package to publicize a reference
i.e
<Reference Include="LabAPI" Publicize="true">
<HintPath>$(SL_REFERENCES)\LabAPI\LabAPI.dll</HintPath>
</Reference>
and enable 'unsafe' code
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
to access private/non-public fields/properties/methods
instead of reflection
why not just forward rather than copying and pasting?
I have no idea how to use new discord features
it doesn't list half the channels and I don't think I can put ids in
hover over message, click forward, click the channel in the popup, if there, if not, type the channel name in search and click it and click send
easy
nws
north wood studios
So I've been trying to alter spawning conditions a little bit for both the vanilla teams, however I can't quite figure out how to check before the animation starts playing, as when I for example cancel a wave spawn I'd like to not notify all the chaos with the spawning music
it seems you have to patch WaveManager.RefreshNextWave
a simple prefix should work, return false if you want to prevent the method from executing
oh wait nvm
WaveTeamSelectingEventArgs
it doesn't pause the timer though
ur NOT funny
I DIDNT laugh
I can pause the timer manually, no?
ye
I'll give that a shot later, thanks for the input.
I'm trying to only spawn waves once a certain % of the lobby is spectator to 1. not waste tokens and 2. not make the waves so small they're basically not worth the 5min wait
so being able to toss a wave without the animation playing means I can do a bunch of logic behind that
uh what is the publicbeta called? my server can't get the image lol
use the labapi-beta branch
oh okay
anyone know of a way to get RA role name?
RA roel name?
oh
you mean
permission group
btw can be null
question: "foreach (ItemBase item in invInfo.Items.Values)" gives me all items the player has. but if the player has an item in the hand it won't return this one?
items also includes the currently equipped item
hm. maybe just an bug in my code lol welp deuggigigiging
ofc i did
well it gives me the item yes but i can't get the permission from the keycard lol
(just added like 3 more Loggers for debugging)
check how Killers did it #plugins-dev-chat message

yea.... it took me like 30 minutes...
(and i was wondering why ev.CanOpen was only an get; bool ....)
π
well works now.
labapi didnt provide any support to change player Scale ?
nope, that's still in the works, or at least not public atm
Okay that why i got so much issues when i change the scale via the old method
we got it for ragdolls but not players π’

why is it that we get all this cool shit after i stop doing sl dev
womp womp
shouldve stayed
wait wheres the 14.1 doc
General Gameplay Changes Added a system allowing players to attempt to opt-out of playing as an SCP. This can be toggled both in the pre-game lobby and in the settings menu. Worn armor is now displayed on all human models, with minor changes appearing when equipping different levels of armor. S...
very cool
question, what dll references do you need in your vs project for a plugin?
Reference the dll files found in C:\Users\Superuser\AppData\Roaming\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed
How can i remove a coin after being used, cuz like when I used the northwood api, it would glitch
FlippedCoinEventArgs If I remember correctly
Then do ev.CoinItem.Remove() I think
Idk haven't really messed with this event much
Remove or destroy.
But wait atleast .1f to do
Timing.CallDelayed(0.1f, () => ev.Player.RemoveItem(ev.CoinItem));
where is the MEC reference though?
also is there a way to turn lockdown and overcharge?
Acs-Firstpass
wait, is that a dllr eference or a nuget package?
nvm
found it
π
:sob
help pls
cuz server runcommand doesnt work
you can decompile those commands and see how they work
but LabApi wrappers should let you do that
Facility.SomethingSomething this was from NWAPI
i dont think we have anything for overcharge iirc
Map.TurnOffLights
yeah but thats just for lights
i think you can just "simulate" an overcharge essentially
and just play the cassie alert
and make it look like it is an overcharge
go through the list of doors and check if they're in hcz
only unique thing in Map is the seed property everything else is just loops and random stuff which is kinda useless imo
at least people don't have to reinvent the wheel every time
But that's funny
ngl i want to delete it
if you want to start the 079 recontainment itself, try Object.FindAnyObjectOfType<Scp079Recontainer>().BeginOvercharge()
note that it'll also try to kill 079
Skill issue 
well yeah, NW doesn't have to approve PRs for those
Or just check how the RA console command works
Funny is always you dont know whats fixed internally
indeed 
when zone but no zones
i'M not even sure which door overlaps two zones even
Can't play custom text on CI key card?
you can play custom pixels
just render the text 
then you need to transform the video to be able to display it
downscale, color threshold
What functions can I use?
you need to find a library that decodes video or images
and then it's math
ChaosKeycardItem.ServerSendMessage(SnakeNetworkMessage)
it's funny how your name is anaconda 
love you
i said this
ages ago
π
ur just copying me ngl
Delete Map.cs
move Seed to Round.cs
problem solved ngl
round.seed

just an snake game
simple question, how can I know if a jailbird attack type is a sprint?
use OnPlayerHurt
check the jailbirddamagehandler
haven't tested it myself but i think you have to use the Reset message type with the enabled pixel coordinates included in the list
nope...
It doesn't work even with HarmonyPatch
Is the Snake game handled on the client side, meaning the server can't directly control or render what appears on the Snake display?
i've heard that someone's already made bad apple in snake
Π ΠΠΠΠΠ ΠΠ ΠΠΠΠ‘ΠΠΠΠ
β°β°β°β°β°β°
| Π‘ΡΡΠ»ΠΊΠΈ:
| DIscord [SCP:SL Classic] - https://discord.gg/jyPAcwePez
β°β°β°β°β°β°
ΠΠΎΠΉ Π΄ΡΡΠ³ Griefer Π²Π½ΠΎΠ²Ρ ΠΎΠ±Π΅Π·ΡΠΌΠ΅Π» ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΈΠ³ΡΡ Bad Apple!!. ΠΠ° ΡΡΠΎΡ ΡΠ°Π· Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π²Π·Π»ΠΎΠΌΠ° ΠΠ₯.
"Bad Apple!! - ΡΡΠΎ ΡΠΎΡ ΡΠ°...
Is this it?
This is client modding
Or somebody green screened to it
well that woul'dve required quite some ffort to reposition the video every frame when it's moving
plus there's tearing, so it's likely real-time
No way
exactly
this doesnt appear to work (the isKinematic)
unless Locker::Chamber position changed to be the bottom of the pedestals
there are no attack types there
get stuff from _moveDirection?
well you can get the dmg
if I changed it on other OnPlayerHurting π
@unique crane do you know
Aaaand
and it spawns in the bottom of the pedestal
like in the actual footing of it not the chamber
Well do you set the coords of the spawn to the chamber
And not structure coords
since structures has coords starting at floor
return UseChamber ? locker.Chambers.GetRandomValue().Base.transform.position : locker.Position;
...
so should it be
return UseChamber ? locker.Chambers.GetRandomValue().Base.Spawnpoint.position : locker.Position;
Print both and compare with the pickup coords
erm
i cba to test rn
ill consider this the fix
Hmm ok
didnt know that was a thing
i swear exiled didnt do that
or maybe i did make it like that
idk
Β―_(γ)_/Β―
@unique cranemight you know if onplayerbanning is bugged or something?
its not firing for me
though onplayerleft is
Nothing I would know of
π
same with onplayerbanned
can somebody help me understand why transform changes do not applied to primitives inside other GameObject ?
so this one
GameObject Parent;
void Init(Player player) {
Parent = new GameObject("Parent");
Parent.transform.position = new Vector(player.Position);
var toy = PrimitiveObjectToy.Create(Vector3.zero,
Quaternion.identity, Scale, Parent, true);
Timing.RunCoroutine(Move());
}
private IEnumerator<float> Move()
{
while (true)
{
yield return Timing.WaitForSeconds(1f);
Parent.transform.position += new Vector3(0, -5f, 0);
}
}
doesn't work
cus that gmaeobject doesnt have network identity
so this network identity thing is added with this 14.1 update ?
network identities have always been a thing
it essentially defines an object that the client will listen to the server about
14.1 added client side parenting
I am trying to understand why it stopped working , because on previous version it works fine, primitive changed its pos
But the parent needs a network identity
because youre moving an object that the client doesnt think exists
so the primitive is probably at 0, 0, 0
you mean client started to validate if all parents have network identity ?
yeah, so that the parent relationship can actually work client side
if there isnt a network identity, how is the client supposed to know what object to parent it to
so adding extra primitive to group and build everything on primitives...
But if I set flags for this "parent" primitive to be invisible and no collision, it also applies to child ones... How to handle it then.
I've checked, they applied
that's unfortunate
Appreciate if there can be example to group primitives, so I can put a logic to group, instead of applying changes for each of them
Thats why it worked well before client started to check, maybe I miss something
Tell me what you did to produce these steps
also if you set Scale to Vector3.zero, it applies to childrens too
No shit.
show exact code?
imagine if the primitive invisible flag actually disabled it instead of deleting the renderer 
you need a NetworkIdentity on an object to parent it client side
This is not primitive flags applying to children π
As far as Iβve seen on the RPC, it just parents the transform. Whether or not it inherits the flag depends on what the flag actually does
so uhhhhh
like a player
another admintoy
uhhh
what else has this
i forget
π
He claims the primitive flags inherit to childrenπ
damn
oh, sorry guys, my bad, flags do not inherit
feels like creating primitive works ok and I can depend on it
room and tesla?
you
hey uuuh why if my timer is paused on a wave, does the timer keep running? I have both wave's timer's paused right now and both are still going (granted, both being paused is not intended, but still)
nevermind I'm a dummy
they keep going until a reasonable time, but they are paused
waves that have no spawn waves will be paused also
so the timer is not paused when I set the wave to be paused?
hold on I just fumbled something terribly I'm confsing myself a moment
it is paused, it just wonβt pause the amount of time left until a reasonable point
I'm trying to get the OnServerWaveTeamSelecting wave, and under a certain condition, pause all other timers, set the timer of ev.Wave to 30 and make it retry again in 30s
granted the code I'm trying to test right now isn't the greatest for that
I wrote this super tired earlier so I gotta rewrite it
but it's just not pausing at all
that feels weird, I'd assume it to just.. stop the timer
like it's a paused timer, so I thought
why was it designed differently?
whilst making timers, i learnt this fact lol
π buh
timer may be paused, but the time will still count down
I truly do not understand why that was done that way
for me, it stopped at like 30 seconds or smth
damn I guess I've got to find a way to preserve their current timer values then somehow huh
It makes no sense to me that that is how that works though.. I cannot understand how pausing a timer doesn't actually pause the timer
Is that an issue I can post somewhere? Because it to me seems very illogical that this works the way it does
on labapi github
I mean isn't it a base-game issue?
the API is just a way to interact with these features as far as I know, and thus if the API says 'pause the timer' the game is supposed to act accordingly, however the behaviour there is weird.
yes but
its official api
they can do changes to basegame
I guess that
's a really good point
Should I mark it as an Idea or Task then? I don't really know what to do with the templates provided
please let us make custom waves and be in sync π
Bug
idk
I mean didn't you already get a good bit of it to work?
I was going to probably use it soon
I kind of want to see if I can get Serpents to work
it'd be a fun challenge
I might split off one of the things I'm making right now into a separate plugin, or just rename what I have right now
What even should sync about them?
The RA waves menu iirc gets built based on what is on the server
May be wrong though
No yeah it does
if you send packets for Custom Wave that isnt in basegame it crashes
since it getting non existing index
That could be a bugfix you could request imo
also hii beryl
Hello
but prev the bug talked about (if I followerd right?) the client still counting the timer despite being paused
As designed, waves still countdown even when paused/frozen unless they have like ~30s or less
don't remember the exact values atm
seems around there yeah
but yeah a paused timer shouldn't keep running imo
This was done because the timer gets paused while waves have 0 tokens
But balance-wise the waves would stay frozen with a full timer
so it can still run down then?
Which sucked terribly gameplay-wise
I don't see why a team timer should keep running if it's out of tokens
iirc because it guaranteed it wouldn't spawn even if it achieved enough points
and as someone who's trying to alter the respawning system, having something unintuitive like this is kind of annoying
because the otehr team would always be ahead
I mean u not supposed to change thing there 
π I still need a pause or I gotta figure out how to make something like that myself
I'm sobbing
no I'm changing the respawning system you cannot stop me 
I'm so fucking close to having it all set up man π SO CLOSE
all of it works except for this
I'm sobbing
I understand, but the system was designed for our usages as our primary concern
I guess that's fair
You can kinda see I tried making custom waves possible (Michal and I refactored the respawn scripts)
oh you and michalll
can you at least consider what i said ? rename Paused > Delayed
or smth
I didnt even saw that before it got reworked
i just only seen when i worked on it like this week
But at a certain point we have to sacrifice stretch goals in order to meet deadlines
Its a difficult thing to balance, sadly
π
@marble cobalt do you mind if I at least bring it up on the Github Issues page? Even if it gets shot down, you guys at least have an issue to refer to. I wouldn't say it's super high priority, I think I can just work around it by altering TimeLeft in some super shoddy and finnicky way, but it'd still be quite the improvement if implemented imo
canβt wait until we eventually get more models in the game for actual custom waves
there are no issues with the word Pause in the title yet on the LabAPI Issues page
recolor classD or Tutorial
The main reason I kept the wording that way was because that's the wording used by design to refer to that specific mechanic
ah
So any new programmer unfamiliar with the respawn system who gets asked by game design to change the pause mechanics, or pause here or there
They can easily search the word "Pause" in the respawn scripts and find what they need
also fun seeing SCP have objective but not used
You as plugin devs also benefit from this because if we say "pause" in the changelogs, you know which parts of the script we're referring to
Or which game mechanics may be affected
aye aye aye
I don't mind at all, though it can be difficult to properly fix
Honestly it's more to document that it exists, I don't mind it taking a while. If need be I'll even help out; I've got a good bit of time on my hands, but I'm not the most experienced
Like, its not necessarily difficult its just, as you said, its not the highest priority
highest priority is [REDACTED]
so real
https://github.com/northwood-studios/LabAPI/issues/101 I just typed some random ass shit out real quick, ignore the shitty formatting
please
I've marked it as an Idea (even though I didn't use the template because I replaced Bug with Idea last minute due to the functionality being intentional), which I hope isn't incorrect
I'm not that githubpilled unfortunately
mfw first year of cs and kinda just doing some stuff I find interesting and fun
I have a couple so far but most of them private for like random things I'm tinkering with
I just like learning
but like if I'm making a configurable respawn system overhaul plugin I might as well make it public
its good to see how much did you developed your coding skills
my coding skills aren't really that developped
I just start typing and eventually the bugs are fixed and it works
me who started as batch script
for someone who likes mathematical proofs, I'd assume I'd be more rigorous with my software but alas
same when I was like 12 but I never truly picked it up
was bored in high school so instead of paying attention to class I started learning python
it all went downhill from there
good shit
i learned c# by looking code in github
until the timer is changed, which for now I'm assuming is never
I will need to find a workaround for this
it's quite frustrating ngl
was funny af how I literally learned C# by just looking and understanding code in gh
honestly
i think that's how like
I learnt basic python syntax
most people learn
started typing
at one point looked up C# syntax
started typing
it clashed a lot with my brain at first, having a static typing language when only having experience with dynamic
but nowadays I work with python as if it's dynamic
I always trought with some kind of tutorials or like code course or smth
and then I'm teaching friends introductory programming I'm basically just making them do static typed python, because python is easy to read and quite flexible, has a lot of docs and whatnot
code tutorials are useless
but the dynamic typing is so confusing
well, I can tell you: a lot of first years Computer Science students have never touched a line of code before
yes I know
there were a whole bunch of people who had to learn Java from scratch by the supplied course
im in like my 3rd year
what class
like if its an introductory programming course
you shouldn't be surprised when people don't know programming
I know
I mean it was mandatory for everyone, even the people with previous experience
but for some reason I've seen people accept the stereotype of 'all cs students have programming experience before they start'
me who joined at CS with like 2yr of experience of programming (or more if we count scratch, MC command blocks)
I just type man
I just type
I don't count it as experience clueless
because if you ever see some of the shit I've made
the structure is.. not great
even more modern stuff I'm not particularly proud of
i mean my code was shit too so
a little more sl related; once a wave spawns, all other timers are changed right?
the spawned wave's timer goes to default, the others do what exactly?
yes
also mini waves; are they required to have tokens or not? because they have a running down timer too, however I've noticed one spawning without having a token before
could be because of broken things in the background though
do they just go to default
because then I've found an easy temporary workaround for what I'm doing here
to 0? and starting counting down again?
it goes back to some value
idk what exactly
I mean I am trying to implement a minimum % of the lobby needs to respawn for a wave to go off
if it cannot delay the wave by 15-30s then try again
but if a wave spawns and it resets all other wave's timers
then that would mean that I can just do this for all other waves wave.TimeLeft += wave.TimePassed; // reset timer to default.
but that might not work
I'd have to double check if TimePassed is truly what I think it is
after the entire timer pause debacle I am doubting and double checking for a short while I reckon
Logger.Debug("Resetting all other team timers.", RTOPlugin.Instance.Config.EnableDebugLogging);
foreach (SpawnableWaveBase spawnableWaveBase in WaveManager.Waves)
{
RespawnWave wave = RespawnWaves.Get(spawnableWaveBase);
if (wave is null)
{
Logger.Debug($"\tRespawnWave {spawnableWaveBase.TargetFaction} | {spawnableWaveBase.GetType()} is not a RespawnWave.");
continue;
}
wave.TimeLeft += wave.TimePassed; // reset timer to default.
}
evWave.TimeLeft = 15; // Will try again in 30 seconds.
evWave.PausedTime = 0;
``` something like this to delay the respawn and reset the other timers.
alright imma try this
and hope it works
that or I'm throwing a fit
going to straight up babyrage
and do something else for the day 
I've had a long one
yeah no it does some weird ass infinite loop.
I'll just fix it another way
holy shit I think I've got it to work without pausing but it's such a wacky fix
is saving hypothermia effect after death is a known bug ?
yeah I cooked
what plugins
might be plugin bug
look I did a thing #1367953962741006417 message feel free to roast you two put up with some of my bullshit.
@restive turret @hearty shard
It did not paste my pings
anyways I'm going to take a fucking break now
will look at it while i eat
have a nice meal :D
I thought I'd give it a shot
I mean I primarily made it for my own server, but might as well release it
Instead of using Player List use Player ReadyList
Is there a way to hide global tags of a player in favour of local ones
You have badge preferences in menu
I meant more as an override on the server side of things
That or maybe separating the global from the local tags
Since global tags can hide custom server tags that are used for gameplay
To like force show the local one?
yea but that absolutely violates vsr
make it custom info
I figured it might, kinda why I hope in the future they'll be split
Although I wish the rules would be hiding the global one for "no good reason"
If it's like a custom role or something I feel like that should be fair game
You dont need a local tag for a custom role?
There is CustomInfo for that
specifically
I'll take a look at that then ty
yeah
well
with InfoArea you can disable a players tag
idk what its called in labapi tho
role text too
at least like
the hover text
like hovering over another player
u dont even need to do that
probably not but it is a feature
Looks better if you have custom roles yea
Why is that?
I think there's like 2 usages for it; one to see who are all spectators and one just to see how many players are on the server
List contains Dedicated Server
aaaaah
ReadyList only contains npcs and real players
then that's something that @untold raft might want to know too for #1338896688743579801 message UsefulHints, as that's something I ran into earlier for the teammates
oh that's good to know I'll take that into account. I'll replace it after my helldivers mission
What methods of putting text on screen are currently available/supported? I'm trying to look into hints but don't really understand how to change the placement of the text on the screen.
https://docs.unity3d.com/Packages/com.unity.textmeshpro@4.0/manual/RichText.html not sure which version it used but most of the ones you see there should work
There is bug with SCPs using keycards, because there is no animation of using and non-compliant Keycard Permissions
btw if i drop card to button that work fine
is SCP SL physics deterministic?
no
Fuck
what are you trying todo
Replay system
that might work, as long as you dont leave anything out it should be deterministic
physx is abit finicky, stuff from one part of the scene can effect the physics in another part even if they are no where near eachother so you have to make sure you include everything
Oh, alright. I don't know that it's possible to exactly recreate a scene 1:1 so I might have to handle physics by recording it or something.
I should probably start at basic stuff anyways
You don't need to replay every input, just capture snapshots of the world at X times a second and interpolate between them
It'll probably give you a result close enough to the original
I thought of that, but I wondered how it would look for players.
It's probably the easiest and most reliable solution.
My personal use case would probably be recording rounds and using it for B-Roll or to review gameplay with my friends (My favorite part of certain Source games was the demo review after the game)
I guess for that it doesn't actually matter how good it looks.
It'll be fine then, that's basically what the demo system does
Same when you spectate players in a Source game, you're only interpolating between snapshots the server sends you
I still need to fake inputs for some things like picking up stuff or shooting guns
Can be part of the snapshots
Yea, but the issue is Source games have client code dedicated to interpreting demos
Wait, are you trying to do first person or third person view for this?
SL doesn't, if you've ever seen an SCP SL primitive animation you'll sorta know what I'm talking about
If you're making a replay system you'd probably just have it run as a plugin on a server. Afaik you can spawn bots/fake players so you'd just spawn them as needed and puppeteer them around
Most likely third person view, idgaf how first person looks tbh
Oki
That is what I'm planning on doing
my idea for something like that was to record mirror network messages and then play them back to the clients, you might need to alter some messages to get them to work, and some have to be removed like VC ones but i think it could work
I feel like that's a lot more complicated than just capturing and replaying snapshots
Yeah
it might be, i never looked into it much so im not sure
I could type up a demo for this and see how it actually looks
Also, does anyone know if theres any libraries / programming concepts I should investigate before looking at this?
Not really no. Probably just .NET's default stuff for writing to a stream. You'll probably want to make some data types for snapshots and write them to a file as you go.
You're better off writing a prototype and iterating on it as you go for a project like this
You'll quickly find out what works or doesn't
That is what my plan was, so I'm glad I might be on the right track. You're referring to StreamWriter which serializes the snapshots and then appends it to the end of a file right?
Something around that ballpark yeah
idk if you'll want to write to the file every time you capture a snapshot
Potentially better to use something like a MemoryStream and then write to the file every X snapshots
Oh yeah thats up to 60 times a second
Yeah IO might become a bit of a bottleneck
Might as well just hold X snapshots in memory and when you reach capacity you flush it all to the file
I'll probably use Json instead of yaml because Json's mathematical structure is a lot more reassuring than yaml's fuckshit.
SL actually stores players location for like 3N physics ticks
Wouldn't use a readable format
There's no reason to, it'll add overhead to the conversion and make the recordings bigger than they need to
So have a limit of X snapshots held in memory, then once thats reached, write to file then clear
yep
What should I use then?
Binary
Yeah convert to binary and flush
Ofc it does
FileStream iirc
does this also preserve type
If you use any serializer, yes
Would make it easy that way to write the snapshots as binary to a MemoryStream and then append the memorystream to the file
You don't need to preserve type with binary since you're basically just writing the memory
BinarySerializer...
File.WriteAllBytes
Done
Oh, interesting.
Yes to the former, no to the latter, you're not keeping the entire recording in memory and then writing it to a file
I can append it instead right?
yeah, that's why I suggested a file stream
makes the whole MemoryStream -> FileStream code a lot easier
Play around with the amount of snapshots you keep before writing to the file, find out what works best performance wise
You'll probably want snapshots to have some sort of pre -> update -> post setup





)
