#plugins-dev-chat
1 messages · Page 53 of 1
Ah ye
Tf is this window
Idk
Xd
I only edited with csproj directly
I think your csrpoj is old
See that's what I did right, and guess what, they are still assigned to the group when joining back
eh i'll whip up something clean without static methods in interfaces
just a little annoying
rip
unity moment
mildly annoyed at having to get a hacky workaround
Since it will took them years
if unity doesn't shoot itself in the foot about 30 times by then
maybe more
That's sucks too for be
be?
how so
depends on the optional stuff you add but yeah, it is a bit big
And also hate writing C++ so that is definitely NOT for me
What the fuuuu
yippeeee
so if you get rid of that it's more like ~25/26
50GB of debug symbols
what the actual
Duh liek
I can download it from their repo
the amount of times I dive into the engine's source per day, couldn't imagine not being able to
im good 
i generally compile the engine from source anyway
it's needed for advanced stuff
Ye i aksed ChatGPT for game engines and result was stride
lol
I mean i was specific what I want
Like must be 3rd and C# support
Throw godot too but hell nah
Me when SL itself is 4.5x larger in size than Unity engine itself
While it calls the engine itself for many shit I ain't wanna touch it
Like duh ofc
Many asset
Me who doesn't even use any texture other then low/very low
Btw while you there
Check how many space without more than medium texture
How tf do I do that
Idk
isn't texture downscaling handled by unity?
3rd?
3d*
Unreal supports C# if you use UnrealSharp 
Guessed by the 
I mean
I'm looking forward to it being stable
If anything it'll be nice to add a C# modding layer to games
UnrealSharp is a plugin to Unreal Engine 5, which enables developers to create games using C# (.NET 9) with Hot Reload - UnrealSharp/UnrealSharp
Crazy
@upper vapor ^
tbh I was thinking about Lua for my project's modding layer
but if UnrealSharp gets stable & adds Linux support I'll go with it
much better
Lua is good
I like lua
It has its advantages
but also disadvantages
but if you look at modding for unreal/other engines
its Lua most of the time
Its also safe for client mods
It's probably the easiest to implement
Because you can disable some packages
You can do the same with C# provided clients compile it themselves, just a lot more of a hassle
Can do it automatically for them
Eeeeeeehhhh
Just have to redistribute the compiler with the game
s&box does it
works fine for them 
Lua better
I <3 coroutines
Its just less work
I'll think about it
I'm fine with putting the work in if it provides a good modding API in the end
Ill show you what you need to do in c# to run Lua engine
Roblox:
Even Cheat Engine has lua
I mean listen
I'll defend python
It's great for some things
Just not
Game development
Computational computing with python can be so much better sometimes
Partially because there's already so many libraries
Yeah because you call C functions
I mean you can call external libs in C#
There aren't as many for C#
Also like automation and shit
I could do this in C# but it would be more complicated
The benefit of python is it's high-level nature
what most people think a normal script looks like
Lmao I actually made that entire thing myself and I'm proud 💪🏼
Even made a lil math document to go with it
Me when I actually have general idea of what does it all mean
Math? Im more of a math person
I love math
so true
I never took comp sci or really any of those kinds of STEM topics outside of like a 10th grade level but I've done enough studying myself to learn a lot of this shit
Fuck misstyped
add mscorlib.dll
oh
nvm you cant make it forced abstract
i dont think
why do u even need that
stuff

would be cleaner in the interface but it's fine
can you show your code?
🗣️🗣️🗣️🗣️🗣️
for:
how manny comments 😭
half of that is just comments
we're stuck 4 years behind 
Real shit
I love meth

@grand flower ez_2 layout has only 5 end rooms, you could filter out seeds that choose this layout
for the red room ensuring thing
If i can get the data without generating the actual map
Otherwise I'll have to restart round with every possible seed hah
yeah
check the atlas generators
I'm literally just doing ServerStatic.PermissionsHandler.Members[playerUserId] = "usergroup"; if the userId equals something and that code is in the OnPreAuthenticated event
MapAtlasInterpretation.Interpret(Texture2D atlas, System.Random rng)
with the Rnd being new Random(Seed)
Oh, well in the same event, if the userid does not equal that something and they are in that usergroup then I do ServerStatic.PermissionsHandler.Members.Remove(playerUserId);
and atlas being TExture2D from AtlasZoneGenerator.Atlases
does labapi replace " with ' in yaml configs or YamlDotNet?
YamlDotNet does that
damn it
i have this config value @"[^a-zA-Z0-9\s,.!?']"
but yamldotnet keeps on fucking up people's configs when it generates
so much fun
wdym
uh
And do you really need to put it in config
block everything that isn’t a normal english sentence
yes it’s a text chat plugin
Yea
what is that?
Doesn't \W match ?!:; as well?
yes
i also wanna match like ‘ and stuff
to allow it
You need to serialize the string as ''
yamldotnet should escape it for you
Why do you put regex in there actually
Like... almost every country will have to put their alphabet in there
if the regex matches, it doesn’t pass
\w wouldnt work for Czech for example
it’s an example regex
as we have to add our
you can remove it
Ohhh so its blacklist regex
I though its allowed messages regex
ye
Okay fine then
if it doesn’t pass then msg goes through fine
Alright
good luck with homoglyphs 
well the regex doesn’t allow anything that isn’t a-Z 0-9 lol
So uh
check the members dictionary in the joined event
Nevermind, it does work, the problem was my permissions file was all screwed up for some reason

Why does doing this cause my grenades to do crazy damage?
It's enough for the grenades to one-shot someone at 1000 hp
And it's not that the fuse end code is running multiple times, I tried adding a clause to fix that and it didn't work
the referencehub isn't on the collider itself
you need to get the root transform and trygetcomponent that
collider.transform.root
how cool would it be if we could force player to move their cursor and not their camera? Like imagine getting them to click on hints and that could cause event if certain tag would be used for text.
in other words: imagine how cool it would be to get sabotaged because you joined a random server youve never played on.
I mean thats cool
not really
i dont think you understood what they were asking for
yeah, the upside would be pretty huge if done correctly
and they are asking for something like using TMPs Link(similar to how its done in the RA)
i dont think a plugin having mouse access is at all good for security
link will be messy tho
imagine someone puts a link over the whole screen or smth
oops
clicked
think of the interactable toy but for the UI, they wouldnt have access to where the click was made(unless they used 100s of them)
you need both the free cursor msg and TMP link to make it work
I can make that with mark tag already and images on whole screen isn't anything new
not what I meant I don't want to move the cursor around just force it to be moved around and unforce, person would still be in power of esc > leave
link is not what I mean, due to not being able to get what text the person clicked, but just pointing them out to website which would be baad, using the steams website viewing system that is pain
I am thinking of this for medical system I am currently making or generally NPC interaction some dialogue type thing or shop interaction
when I look at this I don't feel like this would be great making it where they would press key it would bring the cursor instead and if they would press esc similar to pressing p telling them press "key" to untoggle cursor
at some point just make a new game
atp KILL PAI
I like adding stuff to the existing game where I would not have to write, model everxthing from scratch
modification of the game would not be very great, because not everyone knows how to do stuff with computer and NW developers expressed already that automatically downloading stuff would not be good idea at all.
oh wait you meant mods as moderators 💀
yea
silly idea but does anyone know how to add music into an elevater in scp sl
yes, use speaker toys
mhm.....
you can get the gameobject of elevators and make coroutines of teleporting the speaker to elevator and play music inside
just parent the speaker to the elevator chamber
btw any ideas what RP mechanic could I make?
thats way simpler
what do you already hove
do you know how to do it though?
or what ideas you got
server system room being useful, chemical system, planning for medical system, pain killer, SCP-207 liquid, 049-2 being NPC, maybe diseases later
hmm......
everything can be then used by developer, fully modular plugin
ok what about if you had something along the lines of a minimap for ntf
heard the idea from a friend
oh yeah that is possible I saw it even, could be great idea
i added mc donalds into scp sl using mer
implementing it as custom item similar from contaiment breach
gg
yeah
struggled a bit but it was worth it
now SCP:SL players can get a job
mhm
forgot to say armor durability
i need to thank @rose bridge for the actual like design he made it i put it ingame and did more stuff to make it more fun
he is truly a legend
this is my chemical system alone
dayum
there could be way more implemented into it, but yeah I will have whole summer to work on this bad boy
you could try adding something along the lines of a sheild
thanks lol
no prob u deserve it
I don't want to go into the depths of using models, everything made here can be used without installing other plugins
what about just diffrent clasases
what pmo me is the corpses where they are not synchronized with the client side and I can't get the client to return gameObject they personally see
like a tank or a medic?
custom roles could be made, but that's already been done by frameworks and developers/players can make it with other plugins
mhm......
I love C#
i dont know tbh you could try adding something along the lines of like sneaking below something
to hide
i dont know
dead by daylight ah lockers
I can make players be able to sit into chairs 
yassssssssss
I would love to use navmesh and make more NPC's, but I've heard that HCZ is absulutely fucked and Navmesh path can't be calculated correctly
Hydrogen Chloride, Muriatic Acid, ,Caustic Soda.
Best recipe by PayDay
We cooking at this facility
🔥
Yep.
It is hell
it is possible to make that easily
I provided classes that can be just inherited and then use method RegisterAll to automatically register the thing you added
Do we have a table or what
table?
Or whatever the thing that mix
in implementation of the plugin it's used for that, I aim at certain level of balance between realism and fun gameplay
Can be simply named "Mixing Bowl" or smth
I am using base game models and that one is called centrifuge, it's not showing anywhere the name only if you raycast, so it may be called whatever you want
I didn't see any basegame model for centrifuge
I will show you the model in a second
it is in 939 and micro HID lab
Also for this:
- Requires StateMachines
- I don't understand StateMachines
- Can't really make one

centrifuge
Ohhh
Yes that's a centrifuge
As i see used for blood
Cant wait to make a custom map for it that goes same as "No Mercy"
david waduup
I made drug system in SL
navmesh is not hard to make, though NW premade thingy that would actually work would be useful
Wish me luck, gonna learn how statemachine works
statemachine?
what are you talking about
omg yes

there is MIT premade pathfinding
What does that mean
MIT license, can use for any use
lemme give you the github link
Oh I wanna make my own ai
Which is need high amount of work
And understand many stuff
I got the basic like.
"Go there, get this".
But dont really have a goal system or anything
this chad swift craft
https://github.com/SwiftKraft-Plugin-Devs/SwiftNPCs
switfkraft 🙏
Damn
graph-based state machines 🗣️🗣️🗣️
but unity's animator doesn't have an "any state" per sub-state machine

I still have no clue how this works
By power of magic
I asked the creator and helped me a lot with this but at the end I couldnt spawn a dummy
No clue how it's taken care in LabAPI, but using Exiled makes your work way more easier
pathfinding in nutshell
you add to every room component "navmesh" and then you "bake/build" it and use for generating paths
public static ReferenceHub Spawn(string nickname, RoleTypeId role, Vector3? position = null)
{
GameObject gameObject = Object.Instantiate(NetworkManager.singleton.playerPrefab);
if (!gameObject.TryGetComponent(out ReferenceHub refHub))
throw new InvalidOperationException("[Npc.Spawn] Could not find ReferenceHub");
try
{
refHub.authManager.UserId = PlayerAuthenticationManager.DedicatedId;
refHub.authManager.SyncedUserId = PlayerAuthenticationManager.DedicatedId;
refHub.authManager.InstanceMode = ClientInstanceMode.DedicatedServer;
}
catch
{
// ignore
}
NetworkServer.AddPlayerForConnection(new NpcNetworkConnection(), gameObject);
refHub.nicknameSync.MyNick = nickname;
Timing.CallDelayed(0.1f, () =>
{
refHub.roleManager.ServerSetRole(role, RoleChangeReason.RemoteAdmin);
if (position.HasValue)
refHub.TryOverridePosition(position.Value);
});
return refHub;
}
public class NpcNetworkConnection : NetworkConnectionToClient
{
private const string DummyAddress = "127.0.0.1";
private static int _idGenerator = ushort.MaxValue;
/// <summary>
/// Initializes a new instance of the <see cref="NpcNetworkConnection"/> class.
/// </summary>
public NpcNetworkConnection()
: base(_idGenerator--)
{
}
/// <inheritdoc />
public override string address { get; } = DummyAddress;
/// <inheritdoc />
public override void Send(ArraySegment<byte> segment, int channelId = Channels.Reliable)
{
}
/// <inheritdoc />
public override void SendToTransport(ArraySegment<byte> segment, int channelId = Channels.Reliable)
{
}
}
I am happy for Exiled 🙏
anyone know anything about coroutines and idle mode ?
coroutines to my knowledge should work normally but dont appear to for me
could you provide more information? Do you have any logic in it or is it just logging into console?
Badly
I don't see any way a null value could come into contact causing it to stop, are you sure that you've implemented timing.startcoroutine?
Idle mode lowers down fps
so you cannot do much
to 10
you need to disable it
Timing.RunCoroutine(UpdateStatusTimed(), Segment.RealtimeUpdate, Server.Host?.GameObject);

IdleMode::SetIdleMode
about to find out if that works
you can run them in fixedupdate
yes but
RealTime shouldnt
be affected by that
try it ig
thats the plan
i wanna know if realtime update is realtime or not
I think it is
the name implies that
YIPPIE
0 / 25????
and now i dont update if status is the same
what
namless
can you make math 2.0
yea i guess it is realtime
with unity you may never know
Is there a way to remove the * symbol from nicknames?
how i can get slot where item and replace him?
no
item order is entirely clientside
youc an try to clear the inventory and give it in the order you want but isometimes it gets reversed
bruh
So LockerChamber.GetAllItems() doesnt seem to.. "work"? quite right for any locker except the 3x3 weapon lockers?
If i print out all items inside a locker like this:
for (int i = 0; i < locker.Chambers.Count; i++)
{
response += $"- Chamber {i}";
HashSet<Pickup> set = new(locker.Chambers[i].GetAllItems());
response += $" (contains {set.Count} items)\n";
foreach (var item in set)
{
response += $" - {item.Type}: {item.Serial}\n";
}
}
return true;
For lockers like the first aid boxes, weapon lockers or vertical lockers, it ""misses"" a few items...?
Here is a recording of me executing that code (it grabs the nearest locker and loops through it)
Does anyone have any information on this? Why does this happen :(
nw moment
!vsr
I wonder if 4 thousand primitve cubes can be optimized somehow
with RigidBodies as well
texttoy will be spawn for new clients?
it will sing
spawn them only for clients not for server
You sing
It is spawned for everyone
Though that could work
but then I cannot clean it up for clients
noup
design builds on server side and then when everything is by your liking have it only for client side
what
I'M not talking about MER or other pre defined builds
This are pure dynamic simple cubes 
Thank you, I'll look into it
These CANNOT be pre-defined
could you elaborate what do you mean then?
you could technically store info about it instead of the actual primitives
Idk
It might be wonky
The problem I think is all the syncing is taking up all the resources
since all of them are synced individually
I was thinking maybe introducing a clustering mechanism where a few of them are groupped and them synced as one instead of individually
They have a RigidBody with collision on
hm
I think is beyond the possible of implementation
sorry if this is a dumb question, i have never coded a .net mod like this but how can i fix this?
"fully dynamic, on demand generated, physics enable multiple objects"
says the same for the others underlined in red as well
Are you overriding the correct Plugin class?
^
idk what that is 😭
where is Plugin from
It has to be the labapi one
yeah
i got it from the wiki under labapi on github
where is it from 
wtf
am i supposed to install labapi onto my project
inb4 Exlied
yes
Yes
What do you have right now?
how do i do this
you cannot develop a LabAPI plugin without LabAPi
.net 4.8
yes but whats Plugin in
i was assuming this
i swear thats not a system thing
{
public class Plugin
{
}
public class hello : Plugin
{
public override string Name { get; } = "My First Plugin";
public override string Description { get; } = "This plugin does magic!";
public override string Author { get; } = "Me!"
public override Version Version { get; } = new Version(1, 0, 0, 0);
public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion);
}
}```
this is my entire file
You cant create your own Plugin
Yeah that explains lol
i see
lmao im out
you can google "how to use nuget package in Visual Studio"
you need Northwood.LabAPI
from nuget?
(don't follow this)
Youll also need access to basegame dependencies
(this requires the server files from the dedicated)
how do i do that too
sorry for the questions the wiki doesn't really explain this 😢
Well, the wiki mostly assume you have C# knowledge, that is why it is not detailed to that level
i see
(nothing wrong with it, just explaining why)
Nah, everyone starts somewhere
enjoy the journey, aim for greatness and just press on
great words
it is very fun if you get the hang of it
i am trying
it is...
Says you
stfu
theres a BIg difference
but ur pfp still insane
where is this located
you need to download the SCP Server
i have one of these
no
oh
You need the DLL files from the Managed folder
OHHHHH
2021
bro thank you that makes so much more sense now

damn
darn it
@royal mica @hearty shard i have now gotten it to work, i sincerely thank you both
old man
I'm somewhat curious about the average ages in this channel
wait
53
or so i heard
itchy mod

1⃣ <18
2⃣ 18-24
3⃣ 25-34
4⃣ 35-44
5⃣ 44+

nice poll
at random points in time, you will get a slight blinding effect and your movement will be slowed unless u itch urself by pressing a key
😄
😭
discord literally has a poll thing, and this thing still uses that shit
lmao
im deffinitly 5
Bump
Ignore the other shit that doesn't matter
For some reason fuse-ending a grenade on collision causes it to do a ton of damage
I don't know why
Using
IFpcRole.FpcModule.CharacterModelInstance.transform
Would it be possible to parent a gameobject to a bone of the player?
Im trying to do that currently but the object just kinda.. disappears, even though the coordinates and all stay the same
Make sure you reset the location after parenting
or call Transform.SetParent(parent, false)
by default it seems like it modifies the relative position/rotation to keep the same world position/rotation
Will try, thanks
Cant get it to work
Printing the world and local position of my object before and after parenting and its all exactly as it is supposed to be, but my object just poofs
will give up on it for today 
Parent it, set local position/rotation to vector3.zero, quaternion.identity
didnt work
oh wait
can you print out the position of CharacterModelInstance.transform
and compare to the position of the player
i'm guessing there's some tomfoolery
Printed the entire hierarchy out once and it was like two hundred things
just print out the transform position of CharacterModelInstance to check if it matches the player's
i will note this task down and come back to it, 3am here x.x
parenting to non networked objects doesnt work the same anymore
it wont show up
youll have to run a coroutine constantly setting pos and rot
optimize the dumbass server update method cuz it calls transform THREE TIMES IN THE SAME METHOD
what icedchai said
you could make a coroutine/component that updates the networkposition of the primitive to the toy's world position
disable the toy component on the server and boom
and please cache the transform of the primitive
this way you can set the parent to a non-networked object
there will be some delay though
just found out that typescript has static abstract methods... beat that c#
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/static-virtual-interface-members
why do you even need static abstract
generics
it is kinda counter productive putting a static in abstract class no?
because typescript also has it's flaws :c
all numbers have static abstract methods starting from .net 7(?)
span parsables
here is my typescript code, in C# I think you can just new straight off of a type generic. for typescript that doesn't work as typescript isn't technically a language, all types and generics are stripped once you build...
generic new only works with a parameterless constructor
Whats the difference between the C# version and the DotNet version
C# itself mostly adds compiler features, the .NET SDK has new types (likely using new C# features, like allows ref struct)
public interface ISport
{
static abstract bool IsTeamSport { get; }
}
public class Bowling : ISport
{
public static bool IsTeamSport => false;
}
public class Swimming : ISport
{
public static bool IsTeamSport => false;
}
public class Football : ISport
{
public static bool IsTeamSport => true;
}
public class Cricket : ISport
{
public static bool IsTeamSport => true;
}
and then you could do
public static void DoSomething<T>(T sport)
{
Console.WriteLine($"{sport.GetType().Name} is {(T.IsTeamSport ? "" : "not ") a team sport.");
}
not the best example but it works
mfw could just be ITeamSport : ISport
yeah
/s
the first example i could find was this 😭
in my scenario I needed to have a static interface method that returns a newly constructed object of the class that implements it
you can overload operators with static abstract
UnitsNet for example, does this
that, too
but it's fine, went around it
cuz no new(param) exists with generics
factories are nice
No
me when you can't use T : new() with required members
Java behavior
tbf it wouldn't have worked anyway in the end
for my stuff
realised it a few minutes ago heh
you can
IDyingFactory
can't cleanly read generics
just went with an enum id and a dictionary id => handler
easy peasy
Check out my courses: https://dometrain.com
Become a Patreon and get source code access: https://www.patreon.com/nickchapsas
Hello everybody I'm Nick and in this video I will introduce you to what is in my opinion the weirdest but also the best C# 11 feature and that is static abstract members in interfaces. The concept of having implementation...
also got versioning and all
so can't use types directly
that'd be hell to version
You know why I do not really get static abstract? How do you define the body?
like with other methods
static functions are inherited?!
as in like they can be redefined in child class
whut
new keyword
so you technically just shadow the original static function
ye
You can see how its done in newest .net
Basically whats the IMinMax or something was ir
Y'know
int.MinValue
ulong.MinValue
That is from static abstract & interface
oh the new keyword literally does nothing
You cant use static abstract before net7
In the case of static abstract you don't even need new
yeah
Ye
But for example You can do is
interface IDefault<T>
{
static abstract T Default { get; }
}
class IdStuff : IDefault<IdStuff>
{
int id = 0;
public IdStuff(int id) { this.id = id;}
static IdStuff Default => new(0);
}
Or smth
yea
it's not in .NET Standard
is there a method to create custom keycards?
Generic methods are awesome
I made one recently
It could be better optimized
But I was lazy
What's the difference?
Tuple<T...> is a class, so it allocates memory on the heap
ValueTuple<T...> is a struct (and has parenthesis syntax)
bascially, yeah
don't write ValueTuple out
the parenthesis syntax kinda actually makes sense
you can name them
thx :))
or .Item1
.Item2
liike you can do
static (string Name, T Metric) BestPlayer<T>(...)
btw you can deconstruct them
Makes my implementation cleaner
var (name, metric) = BestPlayer<T>(...)
if you prefer explicit types (string name, T metric) = BestPlayer<T>(...)
Usually I use explicit but here I think I'll do implicit because I use a nullascent operator or whatever it's called
The ?
Just so I know when something is intended to be null vs not
after the null check you can
i mean what if you return a non-nullable tuple
Wdym
I only return null when like
The dictionary is empty
Just cases where I can't ascertain the best one
Otherwise I return the tuple
That's the only reason I do it like that
you can replace that with default and then the tuple's contents will be null, not the tuple itself
so you can directly deconstruct it
ye
not really the way i thought
like
return default
and var (bestSomethingNick, somethingCount) = BestPlayer<>()
then if (bestSomethingNick != null)
Very cool
var (onlyNickProcess, _) =...
agian, now you can deconstruct it
Ye
not sure which would be less characters lmao
Lmao yeah
I'm fine with this
It's pretty readable I'd say
Moreso than before definitely
I used to do shit like this:
Now I can do it better 
I don't need the comment to explain it anymore!
KeyValuePair<string, KeyValuePair<float, float>> 
Lmao
Peak
Grossssss I can fix it now!
Discard deez
Why not just make a class
Or struct
That contains these
that's very excessive
you can also do using Whatever = (RoleTypeId, float, float, float);
tuple aliases since C# 10
if you need a separate type, create a (readonly) record struct
Beautiful
Like u
I just changed every tuple in my plugin to ValueTuple
Aww thank you :)
just add sealed class IsExternalInit; in the namespace System.Runtime.CompilerServices
R u sur
Real
I should add comments
I mean
I understand it
But it
Kind of sucks
I wrote most of my bodyguard code high lmao
Hmm what are you doing
It's a little messed up
But it works
And that's what counts?
I think?
Should do break if not alive
that's filtered out by Where
or which one
You can do is break
Oh u
So I want the routine to continue
Ah k
also your loop condition will never be false
.
I sometimes
Destroy the dummy and forget to delete the coroutine
And then it's null
if you destroy the dummy while the coroutine is running, the player will not be null
But when I added logging before and after doing the referenceequals my code fixed it
you should check if the player's referencehub is not null
you're storing a reference to the dummy wrapper
that reference cannot change, only the objects in it
if you destroy the dummy, that destroys the gameobject, but the player wrapper doesn't suddenly disappear from memory, because you still reference it
See the weird thing is that my code worked
The only reason I ever do ReferenceEquals bullshit is because it fixed something
I avoid it otherwise
So at some point the player does evaluate to null according to that
Idk how or why
I just know it does
And I fixed my headache by doing that
you can't tell me that the loop quits if the dummy gets destroyed
Iirc it does haha
Lmao so my code is working because of an error
That's funny
I feel like we've talked about this before
I literally cannot tell you why checking the player for null works
yeah that's for events when the player can be null at a specific point in time
But it does
but not across longer periods
you still have a reference to the wrapper so ReferenceEquals will never be false if the loop started
the only reason why the coroutine stops is
an exception
I will
Have to check that with LocalAdminLogs
Let me test
Interesting
So
It appears
The coroutine keeps going
So I was wrong 
It happens a lot
Lmao
No exception though
Which is weird
Their referencehub
Is not set to null?
it should become null
For some reason
It doesn't
So I commented out the bit that kills the coroutine
I forgot I added that
So this is purely an experiment
The dummies are gone but my console is still getting spammed
This is peculiar
This warning is shown if a type deriving from UnityEngine.Object uses either the null coalescing (??) or null propagation or conditional (?.) operators. These operators do not use the custom equality operators declared on UnityEngine.Object, and so bypass a check to see if the underlying native Unity engine object has been destroyed. An explicit null or boolean comparison, or a call to System.Object.ReferenceEquals() is preferred in order to clarify intent.
Rider moment
why are you using lastordefault 
Because the Room.List sometimes contains stale references
And sometimes it doesn't have the room when the server is starting
wtf
I using nullables and doesn't scream for that
FirstOrDefault(r => !r.IsDestroyed && r.Something)
yes
or smth
I could just
LastOrDefault
or how about you wait until waitingforplayers
Then wait after a few sec
Well
i don't even know how does that happen
do they not remove the room when it's destroyed??????
Apparently not lol
Me neither
😭😭
Skull
I thought the room would always be loaded by the time the roundstarted event is called
But apparently not lmao
So I wait
One frame at a time
Most of my code is jank because something on Northwood's end is weird
I wish I could say that Room.List doesn't include stale references but in my experience it sometimes does
When the round starts, sometimes trying to find the room doesn't work, or it grabs a bad reference
So the .Base is null
So I wait until I find one that isn't bad
🤷🏼
I aquire you to make a payday gamemode in sl

I trying that too
I already did dummy bodyguards in the most jank fashion
W/o navmesh
Yeah w/o navmesh is tough






