#plugins-dev-chat

1 messages ยท Page 21 of 1

hazy kelp
#

did you made this!??!

#

OMG

soft depot
#

so uhh idk what I did but I broke the formatting in the text toy lol

#

can't even get any black squares :(

#

only {0} seems to register

glass karma
#

what event is equivalent to playercheckreservedslot? I cannot find it

royal mica
#

I feel like all of these half Mirror issues how it works

#

and also Mirror makes this work, like AdminToys

#

I just wish for a RA customization like SSS

soft depot
#

I made my own RA panel with SSS :P

royal mica
#

I do not wish to delegate admin work into an inferior solution lol

#

(im not saying yours is inferior, I'm assuming if I were to do it, it would be jank)

#

I tried to replace ban templating with a custom predefined punisment system and I saw how ban templates were actually handled and was like "yup nope, fuck that"

upper pike
#

Why does the fog overlap the text

royal mica
#

add

span {
  z-index: 100;
}
#

wait this is not webdev

#

but pretty sure you can add some z-indexing somewhere

upper pike
royal mica
#

i just had a great idea

#

Dark Souls like floor message system

#

but with cassie words

upper pike
teal junco
#

lowkey this would be nice just because there are plugins that want this and have to create jank solutions themselves

grand flower
#

ofc

#

that's why I made a request on the repo

teal junco
#

also i never understood why unit names were fixed

topaz yacht
#

will we ever see a way to change the fire rate of guns?

static meteor
teal junco
#

you can do it nw i know you can

#

just one networked byte thats all it takes to change lives

grand flower
#

byte
ew

teal junco
#

so i assume a byte is good enough.

upper pike
#

I assume it would be in RPM which is typically more than 500

#

So a byte would definitely not do

grand flower
#

float's fine for that

#

I don't get the fixation on prematurely optimizing the bandwidth in SL

#

annoying when it starts limiting you

upper pike
#

Im just used to using byte for everything

grand flower
#

If you dont need more than a byte sure

upper pike
#

I dont know if the system would support decimal fire rates so an unsigned short would probably be the lowest thing you can use

#

Unless you want negative fire rates Fear

idle depot
cunning hemlock
#

Permadeath sl server

#

If you die you get banned

#

Can someone code this in

random scaffold
#

bruh

#

use custom roles

upper vapor
#

Waypoints have a max range of 128 so you need to spawn multiple doors if you want a bigger area

vast canopy
#

There are any ways to change holders name on giving keycard at the start?

static meteor
#

I know how do it by manually editing the module

#

I have no clue how to do it on the LabApi wrapper however

                NametagDetail nametagDetail = ParentKeycard.Details.OfType<NametagDetail>().FirstOrDefault();
                if (nametagDetail != null)
                {
                    try
                    {
                        object[] args = { value.Replace("%name%", ParentKeycard.Owner.nicknameSync.MyNick) };
                        ArraySegment<object> arguments = new(args);
                        nametagDetail.SetArguments(arguments);
                    }
                    catch (Exception ex)
                    {
                        LogManager.Error($"Error processing CustomItemNameDetail: {ex.Message}\nStack Trace: {ex.StackTrace}");
                    }
                }
                else
                    LogManager.Error($"{nameof(CustomKeycard)}: This keycard {ParentKeycard.ItemTypeId} doesn't have a NameTag section.");
vast canopy
#

U gave me info where it contains so I can patch it rn. thanks

static meteor
# static meteor 127 yes other guns idk

If anyone was curious this is the patch you would have to do to edit 127s firerate

        [HarmonyPatch(typeof(Scp127ActionModule), nameof(Scp127ActionModule.BaseFireRate), MethodType.Getter)]
        public static class FireRatePatch
        {
            public static void Postfix(Scp127ActionModule __instance, ref float __result)
            {
                try
                {
                    __result = Scp127TierManagerModule.GetTierForItem(__instance.Item) switch
                    {
                        Scp127Tier.Tier1 => 1,
                        Scp127Tier.Tier2 => 1,
                        Scp127Tier.Tier3 => 1,
                        _ => __result
                    };
                }
                catch (Exception ex)
                {
                    LabApi.Features.Console.Logger.Error($"{nameof(FireRatePatch)}: {ex.Message}\n{ex.StackTrace}");
                }
            }
        }
unique crane
#

And will cause desync

#

Or at least I doubt its synced?

unique crane
#

wtf

#

Well yea it works like that

#

if thats fine for you...

celest thorn
#
        public static void Shoot(PlayerHurtEventArgs ev)
        {
                if (ev.DamageHandler is not FirearmDamageHandler handler)
                    return;
                
                if (handler.Hitbox != HitboxType.Headshot)
                    return;
                
                AudioPlayer audioPlayer = AudioPlayer.CreateOrGet($"Player {ev.Player.Nickname}", onIntialCreation: (p) =>
                    {        
                        // This created speaker will be in 2D space ( audio will be always playing directly on you not from specific location ) but make sure that max distance is set to some higher value.
                        Speaker speaker = p.AddSpeaker("Main", isSpatial: false, maxDistance: 5000f);
                    },
                condition: hub =>
                    {
                        if (hub.IsHost)
                            return false;
                        
                        if (hub.authManager.InstanceMode == ClientInstanceMode.Unverified && !hub.nicknameSync.NickSet)
                            return false;
                
                        if (hub.authManager.syncMode == (SyncMode)ClientInstanceMode.DedicatedServer)
                            return false;
                        Logger.Info(ev.Attacker.ReferenceHub.nicknameSync.Network_myNickSync + $" IsAllowed: {ev.Attacker.ReferenceHub == hub} Shooter: {ev.Attacker.ReferenceHub.nicknameSync.Network_myNickSync}");
                        
                        return ev.Attacker.ReferenceHub == hub;
                    });
            
            audioPlayer.AddClip("headshot");
        }

Honestly im confused someone knows why ev.Attacker is always the first referencehub that joined, do i use another event and even if i can take the hitbox that it hit i tried Hurted and Hurting both give the same result

#

its 3 days that im confused on why its happening

teal junco
celest thorn
#

lol

teal junco
#

is there a shotevent btw that way you avoid needing to check the damage handler

teal junco
celest thorn
#

the shot event doesn't give me the Hitbox

teal junco
#

im tired so i cant parse your question properly

teal junco
celest thorn
teal junco
#

the exiled one does i think

celest thorn
teal junco
celest thorn
teal junco
#

oh

#

thats a bug then idk

#

labapi beta buggin sometimes

celest thorn
#

i just think i will patch it myself and fix it?

#

because like it gets the first player who joined or Host

celest thorn
#

transpilers aren't hard so

slender lynx
teal junco
celest thorn
teal junco
#

i think youre just about the only person ive seen talk about transpilers

celest thorn
teal junco
#

i know

#

still

celest thorn
upper vapor
#

transpilers are amazing

terse bone
#

transpilers are peak

upper vapor
#

there we go

#

transpiler enthusiasts are everywhere

#

-# maybe not everywhere but you might not know if someone is

celest thorn
#

i just think the best way is that

#

but still i don't understand why its that the case

teal junco
#

i will study transpilers sometime then

celest thorn
#

i think the value gets reset, after getting deleted, how can i save it and store it?

#

i think like a var?

upper vapor
#

also store the hub outside the lambda so you don't box the whole attacker struct

worn gull
#

What is a OpenHallway?

terse bone
#

that's not how you instantiate gameobjects

random scaffold
#

why it works so low level code?

terse bone
#

there is no wrapper for it yet sadly

terse bone
#

ofc

terse bone
#

that's what the code does rn

royal mica
terse bone
#

i think the only other reasonable option are lockers

worthy rune
royal mica
#

but I do not want to spawn doors just to have moving space

worthy rune
#

you can spawn lockers apparently

royal mica
#

Yeah, but was thinking if I could replicate the waypoint system on Primitives

worthy rune
#

i think lockers dont get culled tho

royal mica
#

by doing correct component init

worthy rune
#

doors would probably be better for performance

royal mica
#

Huh, I would assume a simple object would work better, but I guess toys have too many attachments?

worthy rune
#

im confused about what you want todo

royal mica
#

A weird one, not sure if I actually want or need this, but currently I want to make a grid system where it spawns a cube every 128 and it acts like a waypoint

#

I can do it with doors sure, but not sure if that is a good way to do it

#

sort of think of gmod flatgrass or minecraft superflat world ๐Ÿ˜„

grand flower
#

What was the reasoning behind the relative positioning system

worthy rune
#

its the way todo it currently unfortunately

#

elevators primarily

royal mica
#

That is fine, temporarily during development it can be doors and later when it is implemented can be changed

grand flower
#

That much pain just for elevators? :/

royal mica
#

(if the system is required by then)

tacit oak
#

Bika my beloved

royal mica
#

hewo Quincy

tacit oak
celest thorn
terse bone
#

for me it works

celest thorn
#

For me it just says the first player

worthy rune
celest thorn
#

for example

PlayerA has connected before PlayerB and PlayerB shoots at someone PlayerA will hear it but not PlayerB

#

in the console it will log

PlayerA isAllowed: false Shooter: PlayerB
PlayerB isAllowed: true Shooter: PlayerB

#

even if PlayerA shot them

#

I don't know if its just me or a bug

grand flower
#

No issues here

worthy rune
#

base game code looks fine

celest thorn
#

I don't have any other plugin other than mine so

#

there's an ev.IsAllowed for the hurt but i don't think thats the issue

worthy rune
#

what happens if you print out ((AttackerDamageHandler)ev.DamageHandler).Attacker.Hub instead

terse bone
#

i rewrote the code so it's a bit more optimal, can you try it out and see if the problem persists?

public static void Shoot(PlayerHurtEventArgs ev)
{
    if (ev.Attacker is null || ev.Attacker.IsHost || ev.Attacker.IsDummy)
        return;

    if (ev.DamageHandler is not FirearmDamageHandler handler)
        return;

    if (handler.Hitbox is not HitboxType.Headshot)
        return;

    AudioPlayer audioPlayer = AudioPlayer.CreateOrGet($"Player {ev.Attacker.Nickname}", sendSoundGlobally: false, owners: [ev.Attacker.ReferenceHub], onIntialCreation: (p) =>
    {
        // This created speaker will be in 2D space ( audio will be always playing directly on you not from specific location ) but make sure that max distance is set to some higher value.
        p.AddSpeaker("Main", 5f, isSpatial: false, maxDistance: 5000f);
    });

    audioPlayer.AddClip("headshot");
}
worthy rune
#

yeah ill try it out in a sec

slender lynx
celest thorn
terse bone
#

i broke the game randomly

#

can't see anything

celest thorn
#

Peak

slender lynx
celest thorn
#

this game is stable like a paperclip

slender lynx
#

give it a little high five

#

it'll fix itself

celest thorn
#

if it wants to

grand flower
#

Actually generally when that happens I stay alive at 0 hp

terse bone
grand flower
#

Weird

#

The worst one is the dedicated server being disconnected

terse bone
grand flower
#

I'll be honest the dedicated server player getting kicked should close the server

#

Cause if you dont notice it you're left wondering why things just stop breaking

worthy rune
#

honestly a dedicated server doesnt need a host player in the first place

grand flower
#

Can't reload/unload a gun, and sometimes you can't see players move but you still see them shoot from where they actually are

#

Yeah the dedi should just never be accessible

#

I have no idea why it is

worthy rune
#

mirror has an option to run without it

#

idk why its not used

grand flower
#

I just patched NetworkServer to not disconnect the dedi on failure

#

Because there's zero reason for it to be impacted that bad

worthy rune
#

yeah that works, although not in all cases

grand flower
#

My cases were accidentally sending the dedi a network message

#

Because it's in Player.List

#

The worst part is the failures it causes can be pretty unnoticeable

worthy rune
#

i recommend you use Player.ReadyList or Player.AuthenticatedList anyway

grand flower
#

Yeah I use ReadyList now

#

But I patched it anyway since the dedi not handling a message really isn't fatal heh

worthy rune
#

for sending network messages Player.AuthenticatedList is a better fit

grand flower
#

If someone else on the team makes that mistake they won't have to go through the same amount of pain as I did

#

Noted ๐Ÿ‘Œ

#

OnPlayerJoined is fired for authenticated players right?

worthy rune
#

yep

grand flower
#

Makes sense, will switch tomorrow

#

God that whole dedi disconnect issue got me sweating bullets

#

Thought I wouldn't find the source before 14.1

worthy rune
#

@celest thorn just tested it and hurt is working as expected on my end

random scaffold
#

how get frames from a video ?

grand flower
#

Yeah hurt works fine here got about a hundred different handlers

celest thorn
#

Thank you both of you guys

grand flower
#

I like LabAPI using nullable too, cleaner code. Although I have to report OnPlayerDroppedPickup's pickup shouldn't be not null

worthy rune
#

btw are you still using exiled?

grand flower
#

It can be null if the player starts dropping 1344, since the pickup drop is delayed

celest thorn
#

i just switched everything it took me the entire night

#

but i did it

worthy rune
#

hmmm

grand flower
#

IMO I would call Dropping for 1344 but not Dropped until the animation is finished and the drop actually happens

random scaffold
grand flower
#

Are you trying to translate a video into TextToy frames

terse bone
grand flower
#

Has anyone at NW profiled TextToy

#

Especially when using it for images

random scaffold
terse bone
# random scaffold do you can send the code?

i converted it manually with commands

// Scale it down horizontally
.\ffmpeg.exe -i file.mp4 -vf scale=100:-2,setsar=1:1 -c:a copy file2.mp4

// Take 10 frames from every second of video
.\ffmpeg.exe -i file2.mp4 -r 1/0.1 "%02d.bmp"

then i used my program to convert these images to text files compatible with TMP
And in a plugin i have a command that reads all the text files generated from a selected directory (directory's name is the name of the gif), spawns a texttoy and sets the text to the subsequent contents of the files containing gif frames in a coroutine.

#

it's not realtime

random scaffold
#

how use it with image?

#

server just crash lol

terse bone
#

is there any exception in LocalAdminLogs?

random scaffold
#

ame server has not sent a heartbeat in 31 seconds. Restarting the server in 9 seconds! Type "hbc" command to abort!

terse bone
#

can you show the full code?

random scaffold
#
// Spawn TextToy
GameObject prefab = NetworkClient.prefabs.Select(x => x.Value).First(x =>
{
    return x.TryGetComponent(out AdminToyBase toyBase) && toyBase.CommandName is "Text";
});

GameObject obj = UnityEngine.Object.Instantiate(prefab);

AdminToyBase toyBase = obj.GetComponent<AdminToyBase>();
//toyBase.SpawnerFootprint = new(Server.Host.ReferenceHub);

NetworkServer.Spawn(toyBase.gameObject);

TextToy toy = toyBase as TextToy;

toy.transform.SetPositionAndRotation(pl.Position, Quaternion.identity);

toy.NetworkIsStatic = false;
toy.DisplaySize = new(2000f, 4000f);

for (int i = 0; i < 20000; i++)
{
    toy.TextFormat += $"{i}{(i % 100 == 0 ? "\n" : string.Empty)}";
}

string imagePath = Path.Combine(Path.Combine(LabApi.Loader.ConfigurationLoader.GetConfigDirectory(Plugin.Instance, true).FullName), "test.png");

Bitmap bitmap = new(imagePath);

for (int y = 0; y < bitmap.Height; y++)
{
    for (int x = 0; x < bitmap.Width; x++)
    {
        System.Drawing.Color pixel = bitmap.GetPixel(x, y);

        string hex = $"#{pixel.R:X2}{pixel.G:X2}{pixel.B:X2}";
        toy.Arguments.Add($"<color=#{hex}>โ–†</color>");
    }
}
#

[LabAPI INTERNAL WARN] Backing up to the default AdminToy constructor. Missing constructor handler for type AdminToys.TextToy

#

now it works but it doesn't show up

terse bone
#

this is wrong

random scaffold
#

200x100

#

image

terse bone
#

it should be $"{{{i}}}{(i % 100 == 0 ? "\n" : string.Empty)}";

grand flower
#

What the fuck

terse bone
#

you need to escape the { and } chars

grand flower
#

Oh

#

Right lmao

random scaffold
#

but

#

if it had worked, it would have shown something even like this

terse bone
#

yep, there should have been numbers

random scaffold
#

but it doesnt

random scaffold
#

also nothing show up

#
// Spawn TextToy
GameObject prefab = NetworkClient.prefabs.Select(x => x.Value).First(x =>
{
    return x.TryGetComponent(out AdminToyBase toyBase) && toyBase.CommandName is "Text";
});

GameObject obj = UnityEngine.Object.Instantiate(prefab);

AdminToyBase toyBase = obj.GetComponent<AdminToyBase>();
//toyBase.SpawnerFootprint = new(Server.Host.ReferenceHub);

NetworkServer.Spawn(toyBase.gameObject);

TextToy toy = toyBase as TextToy;

toy.transform.SetPositionAndRotation(pl.Position, Quaternion.identity);

toy.NetworkIsStatic = false;
toy.DisplaySize = new(2000f, 4000f);

for (int i = 0; i < 20000; i++)
{
    toy.TextFormat += $"{{{i}}}{(i % 100 == 0 ? "\n" : string.Empty)}";
}

string imagePath = Path.Combine(Path.Combine(LabApi.Loader.ConfigurationLoader.GetConfigDirectory(Plugin.Instance, true).FullName), "test.png");

Bitmap bitmap = new(imagePath);

for (int y = 0; y < bitmap.Height; y++)
{
    for (int x = 0; x < bitmap.Width; x++)
    {
        System.Drawing.Color pixel = bitmap.GetPixel(x, y);

        string hex = $"#{pixel.R:X2}{pixel.G:X2}{pixel.B:X2}";
        toy.Arguments.Add($"<color=#{hex}>โ–†</color>");
    }
}
terse bone
random scaffold
#

its stupid limit

#

bruh

random scaffold
terse bone
#

you mean image max size?

#

314x314 something like that

unique crane
#

<color=#FF0000>A<color=#00FF00>B will work just fine

random scaffold
unique crane
#

k

grand flower
#

lol

random scaffold
#

but

#

it help with limit

#

ok

grand flower
#

How taxing is updating text toys like that for images

random scaffold
grand flower
#

Can't really profile much without downloading Unity and setting it all up, wondering if someone checked that out already

random scaffold
#

so we use text toy

unique crane
#

I would batch them together as much as possible

#

Since then you have to replace X * Y arguments

#

which yea..

#

takes a bit

#

You can easily do it like per line

terse bone
#

yea you want to use as least amount of chars and make as least Arguments as possible

unique crane
#

You can also compress the image a little bit

#

And merge almost same colors together

random scaffold
#

$"\n{{i}}"

#

need {{{?

terse bone
#

yup

#

{{ is just escaped { so you need to add one more that is not escaped

#

-# Escaped meaning it has no special function, regular char

random scaffold
royal mica
random scaffold
terse bone
#

add <line-height=66%> to TextFormat before the loop

#

but i kinda looks like extra \n

carmine prawn
#

<line-height={0.9f * fontSize}><cspace=-{0.17f * fontSize}><size={fontSize}>
pretty good

#

use โฌ›

random scaffold
carmine prawn
#

just normally

random scaffold
#

?

#

fontSize how much

carmine prawn
#

you can set it, say 1f, 2f, 0.3f, depending on the size you want to display

random scaffold
#

with โ–† it looks better

#

or not

#

idk

carmine prawn
#

if it's square, that's fine

#

yep, it's not

terse bone
random scaffold
heady turret
carmine prawn
#

๐Ÿ‘

terse bone
random scaffold
#

didnt has been changed

carmine prawn
#

yes

#

if it's a video, there's a lot lot lot of pressure

terse bone
#

Static text doesn't impact performance much, unless there is fog/void behind it

#

The only thing that you will feel is a stutter caused by the need to sync all that text data

#

I wonder how bad it will be for people with overall bad internet connection

carmine prawn
#

๐Ÿ’€

#

Bro knows what that means

#

BEACON

terse bone
#

hmm, i know what i will do with these texttoys

#

A label for SCP-1162 :3

unique crane
#

?

worthy rune
#

isnt pl.ReferenceHub.connectionToClient.observing just a hashset?

#

you probably have to call something higher up if you want to destroy it, or just destroy it yourself

#

btw the code your using is from mirror not SL

#

no

terse bone
#

player.Connection.Send(new ObjectDestroyMessage { netid = toy.netid });

worthy rune
#

^

terse bone
#

Maybe Netid with uppercase

#

Idk

#

Oh

#

Yea

#

Removing from observers list shouldn't destroy the object, because you just stop observing changes, object still exists

hearty shard
#

wasnt even a nw change

worthy rune
#

removing stuff from certain clients in not supported by SL in anyway, thats something Mirror allows you todo dont get that confused

terse bone
#

That's how mirror works

#

I guess they were teleported to 0 0 0

#

well, mirror

worthy rune
#

teleporting them out of culling distance would of increased fps iirc, although its better if you send a destroy message

random scaffold
#

how i can spectating for effect?

#

if the effect changes its state

#

only patch?

hearty shard
random scaffold
#

doesnt exists

worthy rune
#

effect updated

upper vapor
royal mica
#

Still has the problem that I have to spawn doors so ppl can move

#

Cause I can spawn them and just remove them clientside

#

or just spawn below

teal junco
#

Spawn them below i think

#

removing client side could cause issues idk

upper vapor
celest thorn
#

Am i going crazy or PlayerValidatedVisibilityEventArgs is like the weirdest event because it flags randomly, like sometimes it does and 99% it doesn't

worthy rune
#

do you mean it flags as invisible randomly?

upper vapor
#

If the two players aren't within distance then IsVisible will be false by default

#

(Most of the time) you're not in range of all other players

celest thorn
#

or in an instance not even run

#

I have a code that makes people invisible and sometimes it works and fires the event if i update it then it doesn't

#

like idk what could be the issue but the event is not firing

teal junco
#

what is playervalidatedvisibility

worthy rune
worthy rune
#

you should be able to override the visibility in the event to make players invisible/or visible to eachother

celest thorn
#

like the event exist but never fires

worthy rune
#

alright

teal junco
royal mica
worthy rune
teal junco
#

oh so every time a player is able to see another player?

#

thats my guess

worthy rune
#

yeah everytime it checks

carmine prawn
teal junco
#

Im gonna make a plugin for powers

restive turret
teal junco
#

what kind of super powers wohld you like to see in scp sl

restive turret
#

flying

#

fire breath

teal junco
#

what is so hype in that livestream

teal junco
carmine prawn
#

What is the maximum length of TextToy supported by the client? (use Arguments and {n}

#

it seems to be between 1587600 strings and 1597696 strings

terse bone
#

strings?

carmine prawn
#

or char? I don't know what to call that๐Ÿ’€

icy knoll
#

What is the room name for the new pipe room?

#

like the RoomName enum or whatever

upper vapor
#

not sure if the roomname enum actually exists

static meteor
#

These are the roomnames

public enum RoomName
{
    Unnamed,
    LczClassDSpawn,
    LczComputerRoom,
    LczCheckpointA,
    LczCheckpointB,
    LczToilets,
    LczArmory,
    Lcz173,
    LczGlassroom,
    Lcz330,
    Lcz914,
    LczGreenhouse,
    LczAirlock,
    HczCheckpointToEntranceZone,
    HczCheckpointA,
    HczCheckpointB,
    HczWarhead,
    Hcz049,
    Hcz079,
    Hcz096,
    Hcz106,
    Hcz939,
    HczMicroHID,
    HczArmory,
    HczServers,
    HczTesla,
    EzCollapsedTunnel,
    EzGateA,
    EzGateB,
    EzRedroom,
    EzEvacShelter,
    EzIntercom,
    EzOfficeStoried,
    EzOfficeLarge,
    EzOfficeSmall,
    Outside,
    Pocket,
    HczTestroom,
    Hcz127
}
icy knoll
#

damn it doesn't exist yet

#

does that mean it won't be inside of RoomIdentifier.OnAdded then or nah?

#

or will i just have to use it's string name for now?

hearty shard
#

IsInvisible is a patch

#

you can use the event tho

#

PlayerValidatingVisibilityEventArgs

#

iirc

terse bone
#

save the player to local hashset and check inside this event

public override void OnPlayerValidatedVisibility(PlayerValidatedVisibilityEventArgs ev)
{
    ev.IsVisible = !hashset.Contains(ev.Player);
}
hearty shard
#

er

#

why is ed

#

yk sure

terse bone
grand flower
#

I wouldn't assign IsVisible directly like that

#

if another plugin tries to change the value you're overriding it

teal junco
#

lemme find it

#

shit wrong project

#

fuck

worn gull
#

How can I turn off LabAPI's Debug?

teal junco
#

yeah

#

i was gonna ask

worn gull
#

They forgot it I guess xd

#

It's a

languid temple
restive turret
#

It can input a bool parameter after string

#

You can definitely a IsDebug in your config (or somewhere else) and you can just do

Logger.Debug("meow", Main.Instance.Config.IsDebug);

restive turret
static meteor
#

Also would have to be updated every time the enum changes

restive turret
#

Yup that too

languid temple
restive turret
#

IDE is usually show these, even the associated tags

grand flower
#

Does SL network ragdoll bones?

#

it doesn't, cool

hollow pewter
#

for whatever reason labapi just started logging every event

#

on early-server-build

grand flower
#

Oof

#

Does the early server build have changes compared to beta?

teal junco
grand flower
#

Yeah I misread the source

#

But we're getting heavy server performance impact with a large amount of ragdolls so I started digging

#

Seems like they keep updating on the server? A little confusing

#

Kinda thought it'd be a one off or something

sick flume
#

Hi. If I am hosting multiple different servers, is it possible to put them in the same place on the verified server list?

teal junco
#

just isnt synced

grand flower
#

seems synced, just didn't think they'd go this far

#

I get that SL needs it for stuff like 3114 disguises, 049 reviving and zombies eating corpses

#

buuut it's tanking our perfs a little too much so I'll probs start patching it left and right if I have to

teal junco
#

idk...

grand flower
#

could be wrong

#

just what I read

worthy rune
grand flower
#

What does MinDistance/MaxDistance in SpeakerToy do?

upper vapor
#

up to mindistance the volume is at max (that you specify)

#

and gradually fades out until you reach maxdistance, where it's completely silent

#

not sure which rolloff is used in the game (linear, logarithmic or custom)

grand flower
#

I see

#

awesome

unique crane
upper vapor
#

yeah that would be the ideal one

unique crane
#

yep

unique crane
terse bone
#

If i destroy a door, will i reclaim a Waypoint?

worthy rune
#

yeah

terse bone
#

Soo in theory, i can replace all the doors in the facility and relative positioning wouldn't break right?

worthy rune
#

maybe

worn gull
restive turret
#

Ah, well idk I not even using that version since it came out when I was going to sleep

random scaffold
unique crane
#

You can only make it change the Min/max distance

royal mica
#

Is that handled clientside or is that a serialized value?

unique crane
#

MinMax is syncvar

royal mica
#

Then the algo itself isn't i assume

unique crane
#

nop

royal mica
#

Time to find an arbitrary mirror packet that can change non syncvar values on client Kappa

unique crane
#

does not exists

#

Do not waste your time

royal mica
#

I was actually wondering if someone made an attempt to make a melee only weapon

#

copying 939 ability or somethign

hearty shard
grand flower
#

Question, is there anything that will go wrong if I patch Player.List as to not include the host player

hearty shard
#

just use Player.ReadyList

grand flower
#

I know about ReadyList, I want to know if patching List is gonna cause issues

hearty shard
#

youd have to check all your plugins PI_Shrug

grand flower
#

The fact you can even get the dedicated player is pretty annoying

#

I managed to kill it by applying an effect to it

#

No idea why that's a thing

worthy rune
#

not sure why you need to use Player.List in that case

grand flower
royal mica
grand flower
#

Because when said error makes the server implode in sometimes pretty sneaky ways it sucks

royal mica
#

Though jailbird is easier yes

grand flower
#

Like I noticed it happened because I couldn't pull the hammer of my revolver back

worthy rune
#

if we remove host its still user error

grand flower
#

Everything worked fine except that

#

I mean, what usecases are there for having the host player accessible

worthy rune
#

i recomend they use Player.GetAll() instead it doesnt have any of the issues that Player.List does

#

i would say for them to read the docs, but atm they are not available until the nuget is ready

grand flower
#

Ay

#

Just a little annoying heh

grand flower
#

Ended up patching a handful so that the server doesn't kill itself, just logs errors and continues

worthy rune
#

yeah thats good, its not good to use player.list without filtering in any case

grand flower
#

Yeah because of unauthenticated/non ready players

worthy rune
#

yeah, people often dont realise that

grand flower
#

I've been moving to ReadyList whenever I see List, just a loooot of things to tweak

#

Porting from 14.0 to 14.1 was hell and it was my first time modding for SL, pretty cool to see the end result though

worthy rune
#

glad it worked out

grand flower
#

Ay

#

LabAPI was definitely a good call from you all

#

And also related to something I did today but SpeakerToy is sweet

#

I like the fact multiple speakers can be sync'd through the same controller id

#

I was worried about potential desync between speakers when I started

worthy rune
#

yeah its a great idea, you can thank killer0992 for that

grand flower
#

10/10

upper vapor
#

he needed it for his audioplayer toomuchtrolling

terse bone
#

the what, nobody's using the radio CatSad

#

just having radio in inv spams the console?

stuck peak
#

The Dev build being on release is unintentional though

terse bone
#

ye i know

terse bone
grand flower
#

Oh yeah, the revolver can shoot bullets and buckshot

#

Is there a way to make it fire buckshot without changing the cylinder module?

#

Lets say idk I wanna shoot a bullet and then buckshot, alternating every shot

hearty shard
#

@stuck peak sry for ping but

#

is it intentional that the current early-server-build has 1.0.0 of labapi

#

i thought it was another beta release

#

also this is bugged

unique crane
hearty shard
#

awesome

restive turret
random scaffold
harsh thorn
restive turret
#

What would happen if I didn't say it catBlurry

harsh thorn
#

itd be pushed when someone notices it

carmine prawn
#

Player.Scale When

soft depot
restive turret
carmine prawn
#

LIE

hearty shard
#

but hasnt been added yet

carmine prawn
#

Ragdoll has Scale

hearty shard
#

yea player doesnt yet

carmine prawn
#

As before, modifying GameObject.transform.localScale and SendSpawnMessage in the previous way results in:

upper vapor
hearty shard
#

yeah

#

Player.List with a network msg doesnt work

carmine prawn
hearty shard
#
public static void SetScale(this Player player, Vector3 scale)
        {
            player.ReferenceHub.transform.localScale = scale;
            foreach (Player target in Player.ReadyList)
                NetworkServer.SendSpawnMessage(player.ReferenceHub.networkIdentity, target.Connection);
        }
#

works for me

#

0 issues

upper vapor
#

Remove Player.List ๐Ÿ—ฃ๏ธ
It's accessible through the dictionary anyway

worthy rune
#

i recommend authenticated list, for network messages, readyList contains dummies

restive turret
#

ah nice to know

worthy rune
#

oh the PR wasnt merged?

hearty shard
#

it seems no

restive turret
#

dont think any pr merged outside of x3rt and prob internal ones

worthy rune
#

yeah its not in yet

carmine prawn
#

๐Ÿ’€

worthy rune
#

you can use Player.GetAll(PlayerSearchFlags.AuthenticatedPlayers) instead

carmine prawn
#

always use ReadyList, use AuthenticatedList if need for network sending, right?

hearty shard
#

pretty much

#

depends what ur doing tho

#

like counting npcs

worthy rune
#

ReadyList contains all players that are authenticated and all npcs that are dummies, and authenticatedList will contain only authenticated players

scenic trout
#

Why is LabAPI built in debug on early-server-build? It makes players to be disconnected because it tries to log PlayerSendingVoiceMessage event which contain a ref property and causes a NotSupportedException on propertyInfo.GetValue(args);

unique crane
#

You can replace the dll to the release in the server files for now, sorry. Hopefully it will be resolved soon.

icy knoll
harsh thorn
#

creating new things fast can be expensive

icy knoll
#

ive not seen anyone use new StringBuilder() other than me

icy knoll
terse bone
#

because of garbage it creates

harsh thorn
#

if you spam 20 stringbuilders every frame

#

yes it is expensive

icy knoll
#

hm

harsh thorn
#

they create objects
which get cleaned up at the end of scope, but if you are creating more than the GC can cleanup intime

#

you get a memory leak

#

or, the GC will do a longer cleanup which can also impact performance as itl pause the program for X time to cleanup

unique crane
#

Or maybe its lazy loaded, not sure

upper vapor
#

me when spans
but i can't get harmony to work in .net standard despair

unique crane
#

But CylinderAmmoModule uses ReadonlySpan

upper vapor
#

well

#

CylinderAmmoModule.GetChambersArrayForSerial

#

exists

unique crane
#

Ik

upper vapor
#

yeah SL can use spans but the plugins (as far as my testing goes) can't have spans and harmony patches in one assembly

terse bone
#

i have them

upper vapor
#

how

terse bone
#

i reference mscorlib.dll and System.dll from SL server files

upper vapor
#

in .net framework?

terse bone
#

and project is just net48

upper vapor
#

dam

#

haven't thought abou tthat

terse bone
#

but you lose debug symbols for all .net methods

hearty shard
upper vapor
#

not that big of a deal

hearty shard
#

well actually nvm

random scaffold
#

so

terse bone
random scaffold
#

when pl.Scale?

hearty shard
#

just doesnt work on all

#

(system.linq)

terse bone
#

if i go into the implementation then it's there somehow

random scaffold
hearty shard
hearty shard
terse bone
#

yea, for me too

random scaffold
#

10-20 minutes work

upper vapor
#

no

#

that's not how it works

hearty shard
upper vapor
#

you gotta specify the t-shirt size

random scaffold
hearty shard
#

theres a public repo for labapi

#

same as exiled

random scaffold
#

he's smarter than me

upper vapor
#

base-game PR toomuchtrolling

hearty shard
#
/// <summary>
        /// Gets a player's scale.
        /// </summary>
        /// <param name="player">The player of which to get the scale of.</param>
        /// <returns>The scale found.</returns>
        public static Vector3 GetScale(this Player player) => player.ReferenceHub.transform.localScale;

        /// <summary>
        /// Sets a player's scale.
        /// </summary>
        /// <param name="player">The player to set scale of.</param>
        /// <param name="scale">The scale to set.</param>
        public static void SetScale(this Player player, Vector3 scale)
        {
            player.ReferenceHub.transform.localScale = scale;
            foreach (Player target in Player.GetAll(PlayerSearchFlags.AuthenticatedPlayers))
                NetworkServer.SendSpawnMessage(player.ReferenceHub.networkIdentity, target.Connection);
        }
#

really simple

unique crane
hearty shard
#

even tho i dont think SL should have that

random scaffold
upper vapor
random scaffold
unique crane
hearty shard
#

its for logic

unique crane
#

Like ofc I can do this, but then like...

#

"why you didnt implement it base game"

#

"wah wah"

upper vapor
#

real

hearty shard
random scaffold
hearty shard
#

no

#

average entitled person

unique crane
#

?

random scaffold
#

or how

hearty shard
#

its included with it

#

but not part of Assembly-CSharp

royal mica
#

Scaling requires base game impl to be properly handled no?
The one always posted is like a crude hack that breaks easily

#

Atleast it always breaks for me and make you unable to move after a while LULE

hearty shard
#

this has never failed me

#

make sure you dont send to server host tho

#

(aka dedi etc)

royal mica
#

Strange

#

                    player.transform.localScale = random ? new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f)) : scale;

                    foreach (var toSendTo in Player.GetPlayers())
                    {
                        SendSpawnMessage.Invoke(null, [player.networkIdentity, toSendTo.Connection]);
                    }
hearty shard
#

whats GetPlayers()

worthy rune
#

NwAPI probably

hearty shard
#

does it include host or anything

worthy rune
#

nope

hearty shard
#

hm

worthy rune
#

well it contains unauthenticated players, but thats "ok" for mirror messages

royal mica
#

Oh I pulled the code from wrong branch oops

#

Same code, just Players.List

#

Judging from previous discussion regard different enumerators in Player, I assume this can break horribly when used at the wrong time causing the issues

hearty shard
#

no its 24/7 it will break

#

use GetAll() or ReadyList

royal mica
#

Funny, cause it works and only breaks much later

hearty shard
upper vapor
#

but yeah, there can be side effects that only manifest some time after changing size

royal mica
#

Those were never broken actually

#

Or what specific way it was broken

upper vapor
#

reloading wouldn't work

#

if you sent a spawn message to the host

royal mica
#

I find it very strange how sending it to the host player breaks so much

grand flower
#

I patched it out because it makes no sense

#

The host just doesn't have the handlers for it so it not doing anything about the message pretty much changes nothing

#

I'll send the patch in a few

royal mica
#

I'm planing on creating an Extension function instead and just hard filter it out

#

and use that everywhere

hearty shard
#

or just

#

dont use Player.List

#

use Player.GetAll()

#

it filters for you

royal mica
#

Isn't GetAll enumerates every player and returns then as a List?

hearty shard
#

er

#

i forgot

#

but theres also ReadyList

royal mica
#

Ah it just creates a yield return

  public static IEnumerable<Player> GetAll(PlayerSearchFlags flags = PlayerSearchFlags.AuthenticatedAndDummy)
  {
    bool authenticated = (flags & PlayerSearchFlags.AuthenticatedPlayers) > PlayerSearchFlags.None;
    bool flag1 = (flags & PlayerSearchFlags.UnauthenticatedPlayers) > PlayerSearchFlags.None;
    bool dummyNpcs = (flags & PlayerSearchFlags.DummyNpcs) > PlayerSearchFlags.None;
    bool flag2 = (flags & PlayerSearchFlags.RegularNpcs) > PlayerSearchFlags.None;
    bool host = (flags & PlayerSearchFlags.Host) > PlayerSearchFlags.None;
    bool includePlayers = authenticated | flag1;
    bool allPlayers = authenticated & flag1;
    bool includeNpcs = dummyNpcs | flag2;
    bool allNpcs = dummyNpcs & flag2;
    foreach (Player player in (IEnumerable<Player>) Player.List)
    {
      if (includePlayers && player.IsPlayer && (allPlayers || player.IsReady == authenticated) || includeNpcs && player.IsNpc && (allNpcs || player.IsDummy == dummyNpcs) || host && player.IsHost)
        yield return player;
    }
  }
#

Though this code looks horrendous decompiled lol

unique crane
#

You can just open it on github

worthy rune
#

the code on github isnt much better lol

hearty shard
#

skull

#

riptide moment

royal mica
#

source makes more sense why it like that ๐Ÿ˜„

unique crane
grand flower
#

tada your server stops killing itself

grand flower
#

what i did a while ago, just didn't filter out the host

celest thorn
#
[2025-05-17 18:17:26.414 +00:00] [ERROR] [LabApi] 'InvalidOperationException' occured while invoking 'Dying' on 'Buckets.EventsHandler.PlayerEvents': 'Collection was modified; enumeration operation may not execute.', stack trace:

If i do ev.Player.ClearInventory(); in PlayerDyingEventArgs, but if i do

            while (ev.Player.Items.Any())
            {
                var first = ev.Player.Items.First();
                ev.Player.Inventory.ServerRemoveItem(first.Base.ItemSerial, null);
            }

It actually works fine but i feel like a while is not a good idea for performance

worthy rune
#

im pretty sure that was fixed in 1.0.0

celest thorn
grand flower
#

while loops

#

As long as you know you're leaving it eventually

celest thorn
worthy rune
#

yeah that method will actually freeze the server if the player is wearing scp1344

grand flower
#

scp 1344 my hated

worthy rune
#

0.8 was missing the .ToArray() part

grand flower
#

love the item, hate the gimmicks when interacting with it in code

celest thorn
worthy rune
#

yeah its easy to forget about

celest thorn
grand flower
#

0.6

celest thorn
#

Im confused

#

Ok you know what

#

im going to just copy and paste it

#

lol

grand flower
#

we just patched it on our end

#

gonna take it out once we update to latest

grand flower
#

Is there a way to debug event handlers and find out which one's affecting something?

hearty shard
#

u could technically patch the event call

grand flower
#

I guess

hearty shard
#

if u just want that

#

but it depends what ur doing

grand flower
#

trying to find out what's fucking up some damage

#

not taking any grenade damage sometimes

icy knoll
#

who is that btw because they fucked up a link lol

hearty shard
#

thats beryl

icy knoll
#

oh beryl

#

should i ping?

hearty shard
#

which link

#

btw

icy knoll
#

releases badge

#

links to nwapi

hearty shard
#

@marble cobalt

marble cobalt
#

What's up?

hearty shard
#

^

icy knoll
hearty shard
#

ur releases link to nwapi

#

not labapi

marble cobalt
#

Oh whoops

hearty shard
#

that one

marble cobalt
#

We'll fix it up later

hearty shard
#

also beryl can u check my dm :3

marble cobalt
#

Later, have too much stuff to do ๐Ÿ˜”

hearty shard
#

fairs

#

time to go make breaking changes to secretapi

icy knoll
hearty shard
#

errr

#

i need to

icy knoll
#

to what?

hearty shard
#

break u

icy knoll
#

no

#

like

#

break what

#

what are we breaking in the code

hearty shard
#

:3

#

i forgot

#

:3

icy knoll
#

better not be ssss stuff

hearty shard
#

no promises

hearty shard
#

errr

#
public static bool HasDoorPermission(this Player player, IDoorPermissionRequester requester, bool checkBypass, bool checkRole = true, bool checkInventory = false, bool checkCurrentItem = true)
        {
            if (player.IsBypassEnabled)
                return true;

            if (player.RoleBase is IDoorPermissionProvider roleProvider && requester.PermissionsPolicy.CheckPermissions(roleProvider.GetPermissions(requester)))
                return true;

            foreach (Item? item in player.Items)
            {
                if (item?.Base is IDoorPermissionProvider itemProvider && requester.PermissionsPolicy.CheckPermissions(itemProvider.GetPermissions(requester)))
                    return true;
            }

            return false;
        }
#

errrrrr

icy knoll
#

oh

#

nothing i need to worry about!

#

also

#

i may make a feature for secretapi

hearty shard
#

then pr it in the next like

icy knoll
#

classes for custom keycards

hearty shard
#

12 hours

#

errr

#

what

icy knoll
#

yeah!

#

instead of just making a method to give u an item, u instead make a class for it :3

hearty shard
#

errrrr

icy knoll
#

what

restive turret
#

what

terse bone
#

not responding

hearty shard
#
public static bool HasDoorPermission(this Player player, IDoorPermissionRequester requester, bool checkBypass, bool checkRole = true, bool? checkInventory = false)
        {
            if (checkBypass && player.IsBypassEnabled)
                return true;

            if (checkRole && player.RoleBase is IDoorPermissionProvider roleProvider && requester.PermissionsPolicy.CheckPermissions(roleProvider.GetPermissions(requester)))
                return true;

            if (!checkInventory.HasValue)
                return false;

            if (checkInventory.Value)
            {
                if (player.Items.Any(item => InternalCheckItemForPermission(requester, item)))
                    return true;
            }
            else
            {
                if (InternalCheckItemForPermission(requester, player.CurrentItem))
                    return true;
            }

            return false;
        }
#

i dont like this

#

hm

#

@restive turret ur like

#

stinky coder

#

what do u think

#

ignore the nullable bool

#

๐Ÿ’€

#

that

#

one

#

is terrible

#

oh

#

@icy knoll what were u on about keycards before

unique crane
#

Why nullable bool

hearty shard
#

cuz i have an idea on what i wanna do w that already

hearty shard
#

brain damage

#

i couldnt decide how to do it

#

its temp

#

until i figure out how i wanna do it

#

enum ?

ashen hound
#

nugett

hearty shard
#

no!

icy knoll
hearty shard
#

idk

#

๐Ÿ’€

#

ill figure it out

icy knoll
#

i think it'd be useful!

wispy dirge
#

i will always call nuget, nugget

icy knoll
#

smh

wispy dirge
#

chicken nugget package

hearty shard
#

well i already had an idea

hearty shard
icy knoll
hearty shard
#

what the skibidi ohio rizz

#

oh

#

thats not blocked

#

anymore

icy knoll
#

modded?

tulip kiln
#

@unique crane Just wanted to quickly ask before making an idea thread on github. Are there any updates on this? (#1313986094978695270 message)
Currently the client still checks for validation with no way to override this server-side.

hearty shard
#

@jaunty trail ur being made fun of here

icy knoll
#

sorry

#

emma*

tulip kiln
#

No custom ammo?

wispy dirge
hearty shard
#

i couldnt see the suggestion

#

i left nwapi

hearty shard
#

3 dollars

#

so worth it

tulip kiln
#

You scared me ๐Ÿ˜ญ

icy knoll
hearty shard
#

yes?

#

i was at burgerking?

wispy dirge
hearty shard
#

so i grabbed it as an extra?

icy knoll
#

bruh

hearty shard
#

its 3 dollars ๐Ÿ’€

icy knoll
#

smh

hearty shard
#

lumi hates burger king confirmed

wispy dirge
#

thats like 2 quid in the UK

hearty shard
#

anyway

wispy dirge
#

so i would def buy too

hearty shard
#
public static bool HasDoorPermission(this Player player, IDoorPermissionRequester requester, bool checkBypass, bool checkRole = true, bool? checkInventory = false)
        {
            if (checkBypass && player.IsBypassEnabled)
                return true;

            if (checkRole && player.RoleBase is IDoorPermissionProvider roleProvider && requester.PermissionsPolicy.CheckPermissions(roleProvider.GetPermissions(requester)))
                return true;

            if (!checkInventory.HasValue)
                return false;

            if (checkInventory.Value)
            {
                if (player.Items.Any(CheckItemForPermission))
                    return true;
            }
            else
            {
                if (CheckItemForPermission(player.CurrentItem))
                    return true;
            }

            return false;

            bool CheckItemForPermission(Item? item)
                => item?.Base is IDoorPermissionProvider itemProvider &&
                   requester.PermissionsPolicy.CheckPermissions(itemProvider.GetPermissions(requester));
        }
#

so uhhh

#

make it enum

#

?

#

idk

restive turret
hearty shard
#

sebt it?

#

๐Ÿ’”

restive turret
#

*didnt i sent this

#

u just edited it

hearty shard
#

i redid it

#

yes

#

but also

#

im doing it with some extra args

#

and uhhhh

icy knoll
hearty shard
#

idk

#

i might just make it enum

restive turret
#

ye

#

good didea

#

idea

hearty shard
#

theyre great

icy knoll
#

mcdonalds >>>

hearty shard
#

what do i call the enum

hearty shard
#

well sometimes

icy knoll
wheat flower
#

what are yall trying to make

#

๐Ÿ’€

hearty shard
#

but its not worth a 20 minute walk over burger kings 2 minutes

wispy dirge
hearty shard
restive turret
hearty shard
#

well

restive turret
#

im not trying to make anythign

brisk matrix
#

What is going on ๐Ÿ˜ญ:

hearty shard
wispy dirge
#

at burger king

#

nugget burger

hearty shard
#

but i need to differentiate current item vs entire inventory

#

hmm

brisk matrix
#

Nuh uh

hearty shard
#

thats it

wheat flower
#

why

hearty shard
#

..... why not?

#

basegame doesnt have a method that checks it all to my knowledge

wheat flower
#

fair enough

#

it does, just with plugin bs

#

so not really

hearty shard
#

yea i mean a single if statement i can call to see if player has permission to do a basegame open

#

wahh

hearty shard
#

ill just make it enum

#

hm

hearty shard
#

yea

#

@restive turret

#

@icy knoll

restive turret
#

Ig

#

And you can do is

if (permflag.HasFlag(..))
...

icy knoll
hearty shard
#

cuz i can

icy knoll
#

grrr

restive turret
#

U r the choosen one

#

Hmm, does the labAPI nuget stuff contains the acs or not

hearty shard
#
public static bool HasDoorPermission(this Player player, IDoorPermissionRequester requester, DoorPermissionCheck checkFlags = DoorPermissionCheck.Bypass | DoorPermissionCheck.Role | DoorPermissionCheck.CurrentItem)
        {
            if (checkFlags.HasFlag(DoorPermissionCheck.Bypass) && player.IsBypassEnabled)
                return true;

            if (checkFlags.HasFlag(DoorPermissionCheck.Role) && player.RoleBase is IDoorPermissionProvider roleProvider && requester.PermissionsPolicy.CheckPermissions(roleProvider.GetPermissions(requester)))
                return true;

            foreach (Item item in player.Items)
            {
                bool isCurrent = item == player.CurrentItem;
                if (!checkFlags.HasFlag(DoorPermissionCheck.CurrentItem) && isCurrent)
                    continue;

                if (!checkFlags.HasFlag(DoorPermissionCheck.InventoryExludingCurrent) && !isCurrent)
                    continue;

                if (item?.Base is IDoorPermissionProvider itemProvider && requester.PermissionsPolicy.CheckPermissions(itemProvider.GetPermissions(requester)))
                    return true;
            }

            return false;
        }
hearty shard
#

docs?

#

yes

#

or what

restive turret
#

Assembly-CSharp

hearty shard
#

errrr

#

dont think so

restive turret
#

a..cs

hearty shard
#

damn

restive turret
#

Bro the first if is wrong

#

Oh wait nvm

hearty shard
#

how

#

oh

#

ok

#

!

restive turret
#

I guess? You can also do is:
if item ==null continue

hearty shard
#

errr

#

item cant be null

#

sshouldnt be null...

restive turret
#

Ye

#

Oh nvm

#

It cant

#

Because if you dont have anything the item is nothing

#

But the current item might return null

hearty shard
#

is it not

#

errr

restive turret
#

errrrr(or)

hearty shard
#

Oh

#

yeah its fine

#

it has a null check

restive turret
#

Ye ik

#

Probably good

hearty shard
#
/// <summary>
    /// Flags to use for <see cref="PlayerExtensions.HasDoorPermission"/>
    /// </summary>
    [Flags]
    public enum DoorPermissionCheck
    {
        /// <summary>
        /// None. Will not check anything.
        /// </summary>
        None = 0,

        /// <summary>
        /// Used to consider <see cref="AdminFlags.BypassMode"/>.
        /// </summary>
        Bypass = 1,

        /// <summary>
        /// Used to consider the player's <see cref="PlayerRoleBase"/>.
        /// </summary>
        Role = 2,

        /// <summary>
        /// Used to consider the player's <see cref="Player.CurrentItem"/>
        /// </summary>
        CurrentItem = 4,

        /// <summary>
        /// Used to consider the player's inventory, not including the item theyre holding.
        /// </summary>
        InventoryExludingCurrent = 8,

        /// <summary>
        /// Used to consider the player's ENTIRE inventory.
        /// </summary>
        FullInventory = CurrentItem | InventoryExludingCurrent,
    }
restive turret
#

Ye seems good

hearty shard
#

awesome

restive turret
#

Can't wait for all your plugins break

hearty shard
#

mine wont

#

trust

#

KeycardCustomTaskForce
KeycardCustomSite02
KeycardCustomManagement
KeycardCustomMetalCase

restive turret
hearty shard
#

errrrr

#

tf am i doing

restive turret
#

Idk