#plugins-dev-chat
1 messages · Page 48 of 1
and with restrictions
more than that
Yea its very useful
well yea
think arraysegment but it works on a lot more things, not just arrays, and also you can't store it in anything
a span represents a contiguous block of memory
works on arrays, strings, lists with CollectionsMarshal
allows the compiler to optimize a lot
with SIMD
its more that it doesn't incur any gc pressure 🤓
that, too
why not
and you can stackalloc array :3
works for a lot more things too like stackalloc
me when static readonly []
span made on assembler level?
might save a few nanoseconds
what
is span made at the assembler level, or does it add c# by inheriting something?
what is assembler
its a ref struct
language
it's in the SDK
it is treated specially by the lang kinda tho
from .NET Standard
since iirc it has a ByReference<T> or some shit
me when you guys obsess over micro-optimisations 😭
realistically span is not that much of a micro optimization
No basically
better than thousands of string allocations every frame
its pretty useful
Yea
i wont lie and pretend like i dont obsess over micro optimizations but
but general use is as sub array
why not
where you dont need to do the index math
ints are padded
like they're stored as ints
...
lmaoi
the only time it matters is when you're doing interop
fuck microsoft
i mean its not really microsoft
im always lost the time for thinking which type use
or for value range restrictions
no matter what it'd still have to deal with the word size
which is usually the size of an int
still not the most optimized one but it works
-# it runs at startup lol
if only we had
yeah okay
i do wish we had those
i have debated making a new dictionary implementation to support them
how you made multiple hints?
you just put all hints in one line?
blood sweat and tears
yeah like
not one line, but one hint yes
that's possible
if only it was that easy
You need to suffer, because it's too difficult to support multiple hints in the game itself
i use line heights to position things correctly
and compute the line height necessary so that a hint is at the same position
i made a line-based hint system
two, actually
they're useful but not fully customizable
What emotions will you have if, when version 3 is released, nw adds support for multiple hints themselves?
relief
wdym
But it would be a waste of time
and send fake sync vars to rotate and text them
do u thinki enjoy doing this
i WANNA DO RUST
then do rust
says the person who wanted TAP modules in SL
i have already had to make two (2) new collections just for this
TAP ?
why fake sync?
if it have toy.Rotation
task-based asynchronous programming
what the fuck is SmallRadifxTrie
because you gotta customize it per player
its a radix trie for tags

In computer science, a radix tree (also radix trie or compact prefix tree or compressed trie) is a data structure that represents a space-optimized trie (prefix tree) in which each node that is the only child is merged with its parent. The result is that the number of children of every internal node is at most the radix r of the radix tree, wher...
what the fuck is radix trie
now that i think about it
oh
Tree xd
separate toy for each player
radix trie means that i can early return on tags
yea
they're different from prefix trees technically
prefix tries only store one char at a time
im proud of my valuesorteddictionary
I love state machines and such
im fuck microsoft lol
prefix trie... and prefix tree
how i can make invisible door?
scale 0
oh
nw moment
david
axwabo
david i dont like you
i tried them
make ur own state machine
I have never ever touched animations in unity
code state machines are kinda confusing and obtrusive sometimes
like
to handle transitions
and conditions
like ugh
GIVE ME A GRAPH
block programming
i've tried unity visual scripting
not worth it 😭
be happy
maybe you'd code this
i would
show me
and check condition for transitions
than looking at spaghetti code
okay well i dont wanna
im already making this dumb fucking parser
shoot i leveled up
get away from me
primitives will be hidden by big distance?

public sealed class DisplayUpdater : DisplayUpdaterBase
{
private float _remainingTime;
private State _state;
private void Update()
{
switch (Driver.State)
{
case (_, ServiceArea):
UpdateServiceArea();
break;
case (DrivingPhase.Stopped, Terminus):
UpdateTerminus();
break;
case (_, Origin):
case (DrivingPhase.Stopped, _):
UpdateStopped();
break;
case (_, TrafficTarget):
UpdateMoving();
break;
}
}
private void UpdateServiceArea()
{
if (_state != State.ServiceArea)
SetText("Üzemi terület");
_state = State.ServiceArea;
}
private void UpdateStopped()
{
if (!TryGetJourney(out var journey) || (_remainingTime -= Clock.Delta) > 0)
return;
_remainingTime = 5;
_state = _state == State.Route ? State.Destination : State.Route;
UpdateDisplay(journey);
}
private void UpdateTerminus()
{
if ((_remainingTime -= Clock.Delta) > 0)
return;
_remainingTime = 5;
_state = State.Terminus;
SetText("végállomás");
}
private void UpdateMoving()
{
if (!TryGetJourney(out var journey) || (_remainingTime -= Clock.Delta) > 0 || Displays.Any(e => !e.ScrollingCompleted))
return;
_remainingTime = 8;
_state = Driver.State switch
{
(DrivingPhase.NearTarget or DrivingPhase.Stopping, Terminus) => _state == State.Terminus ? State.StopName : State.Terminus,
(DrivingPhase.NearTarget or DrivingPhase.Stopping, _) => State.StopName,
(_, Terminus) when _state == State.StopName => State.Terminus,
_ => _state switch
{
State.Route => State.StopName,
State.StopName or State.Terminus => State.Connections,
_ => State.Route
}
};
UpdateDisplay(journey);
}
private void UpdateDisplay(ITrafficJourney journey) => SetText(_state switch
{
State.Route => $"{journey.LineName} {Clock.Now:HH:mm}",
State.Destination => $"►{journey.Destination}",
State.StopName when TryGetStop(out var stop) => stop.Name(),
State.Terminus => "végállomás",
State.Connections when TryGetStop(out var stop) => stop.Connections(),
State.ServiceArea => "Üzemi terület",
_ => throw new InvalidOperationException()
}, _state == State.Connections || _state == State.StopName && !Driver.IsCloseToStation());
private enum State
{
Route,
Destination,
StopName,
Terminus,
Connections,
ServiceArea
}
}
@unique crane
a switch statement which goes to a switch expression that might have a switch expression
no
bruh
kinda
You have to do it yourself
nw moment
why its exists if its even not in the render distance
im dont love dependencies
but im lazy
so i will be
lol
exists easy way connect player with primitives?
if im moving primitive, player too
but player can override it
and moving too
no easy way
override position
but that's bad for player experience
cuz they won't really be able to move
but how do to they can?
you don't
no
its possible
or not
just add offset of the primitive to the player position
per frame
cuz you override the position on the server
the client is moving
but by the time the position is applied, the player's already moved
but it works normal in other unity games
other unity games 😭
"other unity games"
do all unity games use mirror
and are all unity games identical
😭
are all unity games SL
me when
no?
netcode for gameobjects
anyway
it's not mirror's fault
SL just doesn't have a system to parent players
i wanna just make bullying/jail system
falling will still be a thing
bruh
then put them in bars
i wanna movable cameras
only the car
yes
that's the point
you won't get smooth movement with the platform
let alone moving on the platform
petition for NW to add a relativeprimitive toy
or something like that
xd
skill issue
I hate you too
im davids bestie
well uh
i havent because candy utils and custom escapes dont require dependencies
and
secretapi IS the dependency
i actually did not know that
me neither
i freaking knew it lmao
i kinda wanna make a giant util thing but also
I hate u
i don't wanna make people install it
tug of war
"shit ton of actually useful stuff"
vs
"ugh people need to install"
rue package manager someday
toy.MovementSmoothing = 30
RueGet
can someone help me figure out why i cant escape
public static void ProccessRoleEscape(
PlayerEscapingEventArgs ev,
RoleTypeId TargetRole,
RoleTypeId EscapedRole,
bool Disarmed)
{
ev.EscapeScenario = Escape.EscapeScenarioType.Custom;
if (ev.Player.IsDisarmed == Disarmed)
{
ev.IsAllowed = false;
ev.NewRole = EscapedRole;
} else {
ev.IsAllowed = false;
ev.NewRole = EscapedRole;
}
}
public override void OnPlayerEscaping(PlayerEscapingEventArgs ev)
{
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.FacilityGuard, RoleTypeId.NtfSergeant, false);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.FacilityGuard, RoleTypeId.ChaosConscript, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.ChaosConscript, RoleTypeId.NtfPrivate, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.ChaosMarauder, RoleTypeId.NtfPrivate, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.ChaosRepressor, RoleTypeId.NtfCaptain, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.ChaosRifleman, RoleTypeId.NtfPrivate, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.NtfPrivate, RoleTypeId.ChaosConscript, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.NtfSpecialist, RoleTypeId.ChaosConscript, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.NtfSergeant, RoleTypeId.ChaosConscript, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.NtfCaptain, RoleTypeId.ChaosRepressor, true);
PluginFunctions.ProccessRoleEscape(ev, RoleTypeId.Tutorial, RoleTypeId.ClassD, true);
}
delete exiled
im not using exiled
then skill issue
i would love to replace this with a huge switch statement with pattern matching :3
you need subscribe events
you're canceling the event
wanna know a fun fact
pattern matching switch statements are not faster than a bunch of if statements
I'm patching it myself atm but any chance of making the bring/goto commands reset the player's fall damage immunity 
okay good
just for QoL
well
for type matching, they can be
wdym
if you bring a player to your position their fall damage isn't reset
so if they were falling, they'll die the second you teleport them

Should have not fall /shrug
r u sure
im pretty sure its still just compiled to a bunch of if statements
most of the time you don't use them for performance anyway
they're just hella clean
Depends on the decompiler
ive seen Visual studio decompile switch as one giant if else
and dotpeek normally
rm rf /f
nvm i take it back
rm: cannot remove 'rf': No such file or directory
for type matching there's just ifs
kekw
switch statements are only compiled to switch if all the values are consecutive and start at 0
so for dev QOL just use pattern matching
and also this just makes escapee Tutorial or ClassD
wait
i know its supposed to be funny for like moderators if they get cuffed and they get forced to escape
no...
like that
there are clever optimizations
That event just straight up prevents escaping
you are IsAllowed = false on both cases
no it dosent?
public static void ProccessRoleEscape(
PlayerEscapingEventArgs ev,
RoleTypeId TargetRole,
RoleTypeId EscapedRole,
bool Disarmed)
{
if (ev.Player.Role != TargetRole) { return; }
if (ev.Player.IsDisarmed == Disarmed)
{
ev.IsAllowed = false;
ev.NewRole = EscapedRole;
} else {
ev.IsAllowed = false;
ev.NewRole = EscapedRole;
}
}
yes exactly. Your both branch is ev.IsAllowed = false
ev.IsAllowed = false prevents the escape entirely
no role change will be performed
that prevent escpaing from running
i mean it might make the ifs more efficient but the switch opcode is just a computed goto
ohh
i feel dumb
The code in the Event function is executing one by one, meaning the last execution is used
i started like 3 weeks ago and like its for me like isallowed false and then there is an isallowed true 😭
yeah
i've seen some bit shift and uint conversion to optimize
it's weird but smart
and also after some branches, switch is compiled to a jump table anyway
just use switch how you like and the compiler will handle it tbh
if switch becomes if-else, why bother with if else, when switch looks better (personally) and easier to remove / add branches
no way the compiler is smart enough to do that for u
oh... but i really want to choose like what becomes what
i refuse to believe
yes
Well in that case do switch
and per role
i already made up my mind with the function
fascinating
look at this insanity
ah ic
intercity
what is this
In fact, the switch statement does not exist in C#. There is a step in the compilation of C#, which rewrites switch statements to if-statements. This step is called lowering. It translates high-level language features to low-level language features.
that first line is just not true grrr
btw you're not doing anything with targetrole yet
fuck my life
who tf is spreading such lies 😭
i think they meant that the switch statement was syntatic sugar
which is true sometimes but sometimes its not
me when there is 2 switch statements
ye
uh no
there's a switch statement and a switch expression
that's the latter one
same thing different font
not the same thing
to me they are ax!!
which one looks better
1
i agree but that 1 disarmed false condition bugs me
Escapes are a one off, you shouldn't care about microoptimizing that
it's more about which code looks better
first one
think about this if you save 5ns 50,000 times every frame thats 0.25 milliseconds
clearly worth it
Cyn...
you're the optimize guy
how dare you say this
(/s)
I optimize stuff that gets us measurable increases in TPS 
Me when I save 1ns of escape code
(its run like 7 times per game)
7ns saved
yipeeee
extending the CPU's lifespan
by making code more efficient
ur helping to reduce energy usage
and thus saving the environment

thats why this 3ns improvement is worth an extra 30 lines of code
I paid for 16 cores i'm using 16 cores
but think of the environment!
What is the intended way of deleting an AdminToy?
i have terrible news for u
how i can safety destroy gameobject of the door?
so that this is handled correctly and removed from the Door.List
just Destroy()?
np
maybe?
be sure to check though
iirc the waypoint is removed with it but i'm not entirely sure
What
burst compiler

It's fine I'll just make my own SL with blackjack and no relative positioning
and 100 player support
U can make it in sl
yeah if you enjoy playing at 5 FPS
server can handle it, I've gotten them to run with 100 players @ 30 TPS
but it's not the ideal experience for the players
maps aren't built for it
and the clientside performance is abysmal
yeah so what's the point hah
If I were to embark on my own SCP project I'd target 64 players per server w/ "support" for 100
When multiplayer code rework
i just wish audio bug >45 players would be fixed
fix: never
I think game will without updates about 2 years on this way
At that point might as well start from scratch
just start dropping messages
But it will ever happen
One player before 13.5 can crash voice chat
i made brights fix for that B)
I think still exist some exploits for this
it just plays a really really really really loud sound
good now fixed this :)
i have bad news
unless
that wasn't in 14.0
not sure
had to like, scrap a handful of patches because 14.0/14.1 broke em
its fixed base game anyways
wha? :o
Our server still has audio issues with >45 players
i think we removed it anyways
GameOptimizer? yeah it was gone but I rewrote some of the stuff in it and got it back in 14.1
added the fpc relative positioning caching and round robin to it too

i just wish relative positioning wasn't a thing
NW will legalize mods when they will to lazy to update sl ac
didnt round robin break
And servers will write own anticheats!!!
nop
everything's fine with it
bit of jitter on very high speed players/scp-173 but nothing game breaking
very high speed as in > 150% movement speed
Guys i have an idea how to rework all game code
can u just grant an exception for 173 for it
I have this SendFakeSyncVar method, sent/written(?) by @restive turret but i only learnt how to use it for PrimitiveObjects
And now i want to ask anyone here, or the legend himself if he sees this, how i could use this for other Toys like the TextToy, to change what it says for individual players
(Or solve it a different way: How could i make a TextToy only visible for certain players?)
It doesn't affect SCP-173, only how other players see it
ik but like
can u make 173 always send its position
so the jitter is really only visible for SCP teammates and spectators, and it's nothing too bad
see pai gets it

I also made it not send positions to custom dummies
could make it not send positions to actual dummies but we never use those outside of testing so w/e
I updated the thing basicly replace this to the one below
uh for only visible into individual player
that is something like DestroyMessage into player
u wanna hear a pro tip to make this a lot faster
use a WriterExtension<T> static class
just make sure you dont send any info about that net entity to the player
not exiled
Thank you, but i don't think im following...
-# i am not very smart .w.
public static Action<NetworkWriter, T> Action { get; internal set; }
}
Sadly never heard of WriterExtensions before, so not sure what i could do with them :x
this code is awful
im sorry that was mean and uncalled for
but u can make it a lot more efficient
@plain gazelle u can make I think is FakeSync the Scale to be Vector.zero
This will make receiving player not see the object

And do what with it?
@restive turret taught me how to use the FakeSync on PrimitiveObjects and there i had to go and find the uLong, which were in the PrimitiveObject class for the variables that i wanted to change.
But for Scale, i can't find any uLong value, so i am not sure what to do...
Oh sorry I have an input of Object not as a T or any type
add a type param :3
So Typeof T will not like work
Still doesn't know wtf do i do with the ext
And dont wanna grab all existing ones
i mean
4uL
Scale is 4uL
But u have to fix the SendSyncVar.
By just replacing the WriteULong(0) => WriteULong(dirtyBit)
Inside the IsSubClassOf
Like that?
Ye
Will it still work for the PrimitiveObject stuff? Since it worked before 
Ye
It will work because I mistakenly set to 0 so even if you send a Base AdminToy SyncVar it will doesn't do anything with it
Btw the 4uL was inside the AdminToyBase class
Also you have to just used
textToy (or textToy.Base if that exists) instead of with .Scale
Neato
@true cedar ah btw ye you right with that class only , i can simply just use writer.Write<T>(syncVar) but in other place I dont have type T or any type like that
when bug fix when you respawn when you die, you just become blind (:
thats already potentionally being fixed
yippe 😄
does anyonoe knows what causes it evne
even
like what makes the screen black
someone will make a plugin to fix it before NW fixes it
This is client side issue
bruhhh
me when the visual bug is client side
eve moment
nuh uh
legendary item be like
i just found it on the floor 💀
That's generally where those items spawn yeah 
just saw a yellow light with heavy armor in heavy
can you upgrade anti cola
is it very fine?
in IL, can I use ldloc.1 here to get the output of the code below or do i have to get it from the code below?
ldlock.1 it arguments
which will be used in method
after callvirt just add stloc.0
to save value
powered chatgpt

how i can get desync animation for each object?
one animator
but separately objects with desync animation
why did the Northwoods steal the stars from 90 angle?
dummies can't have custom info?
seems like the issue was a color tag in the custom info
would be nice to get a warning in the console if the game decides to block it for whatever reason
give back vector3s with player parenting 🗣️🗣️
what
you gotta load the local onto the stack again if you wanna do something with it while keeping the original call
or use dup
ldloc.1 // original
dup
call MyPatch.Print(whatever type)
callvirt // original
how expensive would it be to initialize a BinaryReader & MemoryStream?
if you don't do it every frame then you'll most likely be fine lol
is to write/read a shit ton of custom binary formats
what if i do like, just for instance, like six thousand?

for reading
but you don't create a new memorystream every frame, right?
that's fine
hmmmm sorry my brain is working at half capacity right now
i think i have an efficient solution but i cannot articulate it to you
I think if i just directly take a BinaryReader then this will be fine?
if I have a FileStream and make a BinaryReader for it, and put in the BinaryReader as an argument, then it skips initialization entirely...
oh if you already have the byte array (not recreated every frame) then it's okay to read from that
creating new memory streams or arrays every frame is not fun
but wait this should be fine right
also, couldn't you just
store the position snapshots
and write them every n seconds
seems okay
Yeah that was my plan
if youre talking about writing them
can you show more context?
yes
I would store a backlog of snapshots into memory and then write it to a file and clear the memory stream every few seconds
If you're going to have a buffer that you'll re-use, use a circular buffer
I want to have a system that records data like Position, PlayerId, etc every frame, and eventually writes it to a file, and another system that reads that file and gets useful information from it like the Pos, PlayerId
Wdym
misread
a buffer that wraps around when reaching the end
ignore me
Oh alright
although in this case it's not applicable
cuz you don't know the buffer size and you don't want to overwrite existing data
Yeah
so after you write the memorystream to a file, do you clear the memory stream?
Yeah, I forgot which method does that but I'm pretty sure there is one
I just need to have an efficient serializer so that it can run many times every frame
okay just make sure you only copy the amount of bytes actually in the stream
memorystream.Length
Dispose
Flush
Close
I though we had global configs
those are only accessible through code
ln -s /home/james james
Huh?
.50 maybe
Sure
I am more bribeable by food
do you want sajtos-tejfölös lángos?
Well SCPDiscord has a folder inside configs/global
What's that
Google it
Ohhh langos
@upper vapor
Fry me
Nice

Now what
Well thats in the labapi now...
I dont get it
bruh
that's
i know that
they want the configs to be global for all plugins
LoadConfig of other config that is checks if its a global plugin
Funny
Well not all plugins made like that in mind
Also there is no such a thing in the plugin's config as "useGlobal" in this plugin
just use symlinks bruh 😭
ln -s /path/to/file /path/to/symlink
Thats one way yea
until we get official supoprt
Shes symming on my link
ew
2042.39.73
is that unity version or what
Hmmmmmm if I add a list to LabApi-yourserverport.yaml
Is beryl okay?
?
Mayhaps
Where
you wouldn't load two of the config, would you?
In my
but you'd need to set that for each plugin
uh
Like
you just load the plugin, set that property to true
and you can use the global config
Instead of the local one
No.. its just that Jesus is new labapi team lead
oh that's confirmed?
then... is jesus okay
He has the role yea..

me when the job listing is still open
Well
what
what
Yes
Ofc you can do that
Labapi is open source and you can just switch the dll in the server files with your own
Works fine
Yea
modded flag is added whenever any plugin is loaded
Ah well 

😐
Going back to synapse
me when CustomEventHandlers in the wiki
does anyone know how to get a property from a method im patching?
Like a parameter?
@upper vapor
cant do that in a transpiler can i? or can i 😭
yeah i just cant see anything in IL for it idk
im just replacing 1 line of code with smth different lol
and it's getting more complicated now
Wha
@icy knoll
The method can be accessed with AccessTools.PropertyGetter
wdym "call" now?
The property getter
yeah but what property am i getting
i dont want a property rn lol
Internally you do is virtcall get_food()
i just want the argument
ok
ill explain it
eve made a silly mistake and she told me what to do
I need to replace this:
ServerSpecificSettingsSync.SendToPlayer(player.ReferenceHub, specificSettingBaseList.ToArray(), version);
with this
player.Connection.Send(new SSSEntriesPack(specificSettingBaseList.ToArray(), version))
which is why I am using a transpiler
Then just load the argument
.. yeah
Create a method in your patch class that does the heavy lifting and call that with the arg
true
But ye axwabo was right
Its ldarg (index)
ldarg 2 is the 3rd arg
Or 2nd
Whateve
0 being this usually
Cus u have the source
the exact thing i just pushed (to a branch that you wont see for 20 years)

EVEEEEEEEEEEEEEEEEEEEEE
Wnever iwillbe preleased
Lel
GroupBy(static setting => setting.Header)
Less alloc :3
Saved you few bytes no need to thank
oh yeah
for the ordered
What if want more bytes
Create a gigabyte int array
the other was dev
this is the new one
ill make the first list listpool too dw
i could also replace hasAccess with an if statement inside the first foreach
@unique crane do you agree
!!!!
is this how string builder pools work?
StringBuilder builder = StringBuilderPool.Shared.Rent()
...
return StringBuilderPool.Shared.ToStringReturn(builder);```
Yep
and i get more performance from this? crazy
No you get less allocation when working with strings
no like
i was using StringBuilder before
just moved to pools
so idk what it does but people say it's better so
a pool just stores existing of an object
to be reused
so you dont new() it
every tick or wtv
@icy knoll show what you did
for the uh
teleport thing
safe position
whatever
i never got round to testing it
i was gonna
use basegame
public static Vector3 GetSafePosition(
Vector3 position,
Vector3 direction,
float range,
CharacterController charController)
{
direction = Quaternion.Euler(0.0f, UnityEngine.Random.Range(-30f, 30f), 0.0f) * direction;
float radius = charController.radius;
float num = Mathf.Lerp(radius, range, UnityEngine.Random.value);
Vector3 vector3 = Vector3.up * charController.height / 2f;
Vector3 origin = position + charController.center + SafeLocationFinder.GroundOffset + Vector3.up * radius;
RaycastHit hitInfo;
return !Physics.SphereCast(origin, radius, direction, out hitInfo, num + radius, (int) FpcStateProcessor.Mask) ? origin + direction * num + vector3 : hitInfo.point + hitInfo.normal * radius + vector3;
}
but i need charController
i guess this?
you want this for a player, right?
well i guess so yeah
But please don't fucking put them in the elevator
Larry sent me into pocket in elevator and when I'm escaped it put me into the same elevator with 106 inside too
public static bool GetSafeTeleportPoint(this Player player, FacilityZone zone, float range, out Vector3 teleportPoint)
{
if (player.RoleBase is not IFpcRole fpcRole)
{
teleportPoint = Vector3.zero;
return false;
}
Pose[] poses = Scp106PocketExitFinder.GetPosesForZone(zone);
if (poses.IsEmpty())
{
teleportPoint = Vector3.zero;
return false;
}
Pose pose = Scp106PocketExitFinder.GetRandomPose(poses);
Vector3 position = SafeLocationFinder.GetSafePosition(pose.position, pose.rotation.eulerAngles, range, fpcRole.FpcModule.CharController);
teleportPoint = position;
return true;
}
i wish i understood the math
why 106
shouldnt i check for any
player?
well
Ye
"enemy" player
Do it
You did this to yourself
nuh uh
what if i just
dont

sounds like a YOU problem
i also realize
this should fail if nuke has gone off
and its not surface
or decontam for lcz
or should they?
Idk
Skill issue on your part
@hearty shard you should make it 2/8 change that you go back to pocket



