#plugins-dev-chat
1 messages · Page 170 of 1
Uhhh... Worshiping capybaras should help.
I worship cats
Am I crazy
Why was all my Cassie shit broken in the experimental branch but not in the new update
I'm getting no errors
My leading theory is that my server didn't update properly
Ts gonna make me crash out
I know it's not up to date
Oh I need to use the experimental branch for the dedicated server still don't I
The correct server build should be on the live branch
Well tell that to SteamCMD
It's telling me it's already up to date for the early-server-build and the non-beta build
If it doesn't want to update I'd try changing the branch name from public to none or vice versa
Usually gets it working for me
Lemme try that
You're actually my hero
Public beta branch worked
Time to fix all the shit that broke 💪🏼
Happy to help :)
try app_info_update in the future too
since thats supposed to force steam to look for new updates
Doesn't app_info_update just essentially refresh steamcmd?
Every time I update my server I use a new instance so it doesn't really matter
no idea how steamcmd works exactly but it does work in normal steam client
It doesn't trigger an update it just refreshes the info
To actually update you still need to run app_update
I still would've ran into the same issue if I used app_info_update because I was looking at the wrong branch
yes but what I've meant is that it might help if update says its already up to date
Oh you mean for if I'm on the correct branch
Gotcha
I thought you were saying to use it for updates lol
I shouldn't have to worry about it in the future cause when you launch a new SteamCMD instance it does that automatically
It has to establish a new connection each time you run
well it could cache stuff
like apt on debian/ubuntu does
where you have to update before upgrade
It does that automatically too
I don't leave steamcmd open
isn't that for steamcmd updates?
not app updates?
You said "update before upgrade"
That's that first step
After that when you run app_update it runs a check for updates anyways
The local cache is updated during the login step
Which happens whenever I run an update check
No idea, I assume there must be some cases where it doesn't refresh since they added the command
Yeah if you have SteamCMD launched and don't refresh the login, then it never automatically updates the cache
Logins are more intensive than updating the cache so people may keep it up and update rather than logging in every time if they're working with some app or something
Well
It's time to find out if SCP friendly fire terminations are still broken
They are!
Epic 
At least it doesn't break the client anymore
did you report it to QA?
I forget if I logged it for LabAPI issues
I'm just gonna fix it myself
It's what I did last time
That would probably be MethodNotFoundException
Yeah sooo
We love base-game namespaces having the same name as the labapi wrapper class
using Cassie = LabApi.Features.Wrappers.Cassie;
It's actually cooked

Programmers try not to break labapi challenge (impossible)
Plugin development going well
Since when was https://plugins.scpslgame.com/ festive?
that was added at least a week ago
so what i wrote doesn't work xd
you gotta type LabApi.Features.Wrappers.Cassie every time
I mean LabApi CASSIE is broken rn anyways (Push the new CASSIE GRRRR)
what new cassie

uh the Wrapper is using RespawnEffectsController but yeah its gone
huh
yeah we don't have the new version on nuget yet
but the dll should be updated in the server's files
Oh yeah I only looked on github so yeah that makes sense
ye, labapi releaase cyle is kinda cooked
so how can i use cassie in plugin,I still dont get it
you can use the base game
LabApi.Features.Wrappers.Cassie
can I omit LabApi.Features.Wrappers. in ide? 
it appears there is a namespace conflict
Because
It happened like that
And no you can't omit it, not even using aliases
I mean
You can do Casie = LabApi.Features.Wrappers.Cassie

LabCassie
True
Yep! The Cassie namespace will always take precedence
On some real shit
It's in Assembly-CSharp, so I just did using Cassie;
That's not the labapu wrapper
Yeah it's more versatile but people who used the Cassie wrapper now have their source code broken
Okay so is it possible to make your own SubtitleParts?
Like if I want to make a custom ScpTerminationMessage to get the same prioritization stuff, how do I convert whatever custom subtitles I have to SubtitleParts
what have the damn liberals done to cassie
Custom subtitle part type
Not sure if you can mix-and-match translated and custom elements
I'll check in a sec
My ongoing issue is that SubtitleParts are not in some SCP damage handlers
huh
It's exactly as it sounds
If one SCP kills another, the termination message will not play
which ones
I'm not sure
ummmm
Most of them in my experience
That's why the SubtitleParts ends up as null in the first place
My worry was that null checking was going to be a band-aid fix, instead of the underlying problem being solved
And I was correct
So here we are
And I'm patching it again
To run the same BS
i'm looking at the scp damage handlers but none of them have null subtitle parts
oh wait
nevermind
😁
new CassieAnnouncement() != CassieAnnouncement.Default
soooooo
yeah
do you know what you need to patch?
I ended up just rolling with LabAPI events
Decently simple fix actually
But I want the new message I make to register as an SCP Termination Message instead of a regular message
public class CassieScpFriendlyFire : CustomEventsHandler
{
public override void OnPlayerDeath(PlayerDeathEventArgs ev)
{
if (ev.OldRole.GetTeam() != Team.SCPs || ev.Attacker is not { Team: Team.SCPs } attacker)
return;
string scp1 = Resources.GetFirstNumberGroup(ev.OldRole.ToString());
string scp2 = Resources.GetFirstNumberGroup(attacker.Role.ToString());
// TO-DO, make this an SCP termination message instead
LabApi.Features.Wrappers.Cassie.Message($"SCP {Resources.SpaceNumbers(scp1)} terminated by SCP {Resources.SpaceNumbers(scp2)}", $"SCP-{scp1} terminated by SCP-{scp2}.");
}
public override void OnServerCassieQueuingScpTermination(CassieQueuingScpTerminationEventArgs ev)
{
if (ev.DamageHandler is AttackerDamageHandler dh && dh.Attacker.Role.GetTeam() == Team.SCPs)
ev.IsAllowed = false;
}
}
yeah you can create a CassieScpTerminationAnnouncement and queue it
oh btw
Yeah but then I need the SubtitleParts
if the announcement is queued and another scp is terminated with the same subtitles, the labapi event won't becalled
Which brings me back to
I don't know how 😭 that's why I asked lmao
but like is this cassie update a new thing that i wasnt aware of at all
I don't know the structure, or how they're parsed, or how to make them
Doesn't really matter since I ev.IsAllowed = false; it
[new SubtitlePart(custom type, ["my string"])]
right
have you read the changelog
Is that planned to be changed in the future?
if the answer is no, then the answer is yes
hopefully we'll get a fix implemented soon-ish
idk how the release cycle works though
might not be out before christmas
theres a changelog?
serverhost-announcements 
Game Changes Added unused third-person jump animations to SCP-096. Made the E11-SR lightweight stock running accuracy bonus into a hip-firing accuracy bonus instead. Added new loading screens variants. Map Changes Replaced all of the ten current HCZ layouts with new ones. The lift in the Heav...
So what's the deal with SubtitleType? Are SubtitleParts broken up by line or by word? Should my entire announcement be in one SubtitlePart?
oh and
by <split>s
or uhh
i didnt even realize there was like
hold on
an update
it's a small one zo ye
I use args for event arguments
when Ruei for Cassie subtitles? 
makes it easier for me to read
so they're just joined
Yeah I've seen people do that
or uhh
This is literally why I am confused 😭 some of ts is not well documented
having subtitles anywhere
yeah so SubtitleController is stripped for some reason
I just want to make SCP termination messages work :'(
idk how stripping works ngl
there's no preprocessor so probably some unity magic
i'm looking though
okay so
seems like you can't
Nice!
it's not possible to combine translated and custom parts
it just quits if it finds a non-translatable subtitle type 
So I have no way of properly fixing SCP termination messages being broken?
The SubtitleParts on most SCP DamageHandlers is null
Meaning that if an SCP kills another, it doesn't send a termination message
It used to disconnect the client, but then a null check was added
It doesn't solve the underlying problem, but it prevents the problem from being more severe
maybe patch ScpDamageHandlerBase and Scp049DamageHandler and Scp096DamageHandler
-# yes, the latter two override the former and do the same thing
you can return CassieAnnouncement.Default
in whatever property that is
I'd need to patch 3114 and other SCPs too
that one too
This will bring back proper termination messages?
but other scps use ScpDamageHandler, no?
or the universal one
yes
termination cause unspecified
oh since when do we have SilentDamageHandler
dam
Well the odd thing is IIRC some of the SCPs work
SCP-xxx terminated by SCP-xxx
AttackerDamageHandler probably
Thats only for 079 and tesla gates no?
Cant think of any other way for scp to kill another scp
or well if you give the other scp a gun
939 too with FF nvm
I patched the code
SCP-xxx terminated by SCP-xxx is more what I was hoping for
well
make it then

SubtitleType.TerminatedBySCP
look at how AttackerDamageHandler creates announcements
Wait what if I just redirect the ScpDamageHandler::CassieDeathAnnouncement to AttackerDamageHandler::CassieDeathAnnouncement?
Is there a point to having it overriden in the first place?
No prob with transpilers
I have like 15 of them atp
W
I keep having to patch NW code 😭
This is one of my favorites
crazy
I have longer and more complicated ones
I made one to fix custom keycard collisions
I actually quite like that one
this is devious
the comments
are hurting my eyes
It was actually a little easier to do a transpiler than use a helper method because I inserted it in the middle of a bunch of if conditionals
I needed them for my own sanity
I transpile to that part right there
I have parts that go to the normal execution path and parts that do an early return so this was the more optimized way to do it and a bit simpler for me to figure out
yo how do i make a custom item
which one tho
pick one that suits your use case
if you really feel like it, try each one
[2025-12-16 20:43:34.445 +08:00] [STDOUT] Parameter name: index
[2025-12-16 20:43:34.445 +08:00] [STDOUT] at System.Collections.Generic.List`1[T].get_Item (System.Int32 index) [0x00009] in <069d7b80a3914a08b6825aa362b07f5e>:0
[2025-12-16 20:43:34.445 +08:00] [STDOUT] at RandomElement.RandomItem[T] (System.Collections.Generic.List`1[T] list) [0x0000d] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-16 20:43:34.445 +08:00] [STDOUT] at MapGeneration.Scenarios.DistributorScenario.SelectProcessors () [0x0003a] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-16 20:43:34.445 +08:00] [STDOUT] at MapGeneration.Distributors.ItemDistributor.PlaceSpawnables () [0x00021] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-16 20:43:34.445 +08:00] [STDOUT] at MapGeneration.Distributors.SpawnablesDistributorBase.Update () [0x0004e] in <97f73857ad8f4e28bfb2a0949c9a9509>:0```
After the game update, my server occasionally has an issue where items on the map don’t naturally spawn (SCP locker items spawn normally). After checking the logs, I found this
Totally no idea how to fix it atm

I believe this is happening because the list runs out of scenario processors
Now the thing is, the only way this can happen is if PlaceSpawnables is firing before the map is generated
At least as far as I can tell from my cursory glance
My plugin doesn’t deal with that at all. I don’t even know what scenario processors are☠️
I thought it might be a game bug at first, but it looks like only my server has this problem, and I couldn’t reproduce it
If the problem is indeed that PlaceSpawnables is firing before the map is generated, you could try something like
[HarmonyPatch(typeof(SpawnablesDistributorBase), nameof(SpawnablesDistributorBase.Update))]
public class TestFix
{
public static bool Prefix() => SeedSynchronizer.MapGenerated;
}
Thx, will try
I would recommend https://discord.com/channels/330432627649544202/1357469765421109250
had the same
seed: 1022878331
[2025-12-15 20:56:13.078 +00:00] [STDOUT] ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
[2025-12-15 20:56:13.078 +00:00] [STDOUT] Parameter name: index
[2025-12-15 20:56:13.078 +00:00] [STDOUT] at System.Collections.Generic.List`1[T].get_Item (System.Int32 index) [0x00009] in <069d7b80a3914a08b6825aa362b07f5e>:0
[2025-12-15 20:56:13.078 +00:00] [STDOUT] at RandomElement.RandomItem[T] (System.Collections.Generic.List`1[T] list) [0x0000d] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-15 20:56:13.078 +00:00] [STDOUT] at MapGeneration.Scenarios.DistributorScenario.SelectProcessors () [0x0003a] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-15 20:56:13.078 +00:00] [STDOUT] at MapGeneration.Distributors.ItemDistributor.PlaceSpawnables () [0x00021] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
[2025-12-15 20:56:13.078 +00:00] [STDOUT] at MapGeneration.Distributors.SpawnablesDistributorBase.Update () [0x0004e] in <97f73857ad8f4e28bfb2a0949c9a9509>:0
oh
did you fix that?
Or it's a game issue💀
I didnt touch anything with mapgen
must be the wind
tbh after i looked at them all i think im just gonna make my own system for customitems
Based as hell
I have my own too: https://discord.com/channels/330432627649544202/1442106795370872913
Tbh I care the little as possible which one you use
Have fun writing one if you doing it
(bc i had fun doing it)
Another custom items plugin to the pile
Billions must create their "universal" solution 
nah its not for the public just for me to suit my specific needs
I made the best one trust
its not a "universal" solution
I guess not if he doesnt like it
It's private 

It's a dope combination of instance and static
Each member is inherited from the base custom item, and they're all kept in a registry, but they also have static elements I can access
i made the weirdest one trust
-# only i know about it
Like the serials
I can access the serials for each custom item as a static member, so I don't need to find the instance in the registry
And they're all separate
It made my thing slow down if I tried to make into a every instance
So instead of "manager" one for each item instance it would be slown down like many many times
slej custom items stuff is lowkey the best
ill glaze this guy to the ends of the earth hes a very smart indavidual
Why does separating it out cause a slow-down?
I'm just uninformed as to the inner workings of your API
It creates a new object every damn time a new item creates
Oh lmao
*a new ci object
Weird
I through you doing the same thing
It worked pre 14
Then check it in LabAPI events
After 14 it just slowed down significantly
I do the same
Essentially all the data I need for my custom items is a dictionary of serials, the associated pickup lightsourcetoy, and then the events that run based off the serials
14 century's ago
I have this base class that includes a registry for all the custom items
Then a generic class deriving from it
The benefit of the generic class is this
I basically added an ILightObject to it
I can inherit a custom item from the generic class and be able to use the stored serials in a static context
Incredibly useful for harmony patches
I handle light stuff in other places
Makes sense
I didn't really need to go that far
The benefit of making your own API is you can choose how much you need
And I didnt liked the idea of serials inside the custom item
I added the events already on it (virtual all) [by hand] and when I need it override it
Yeah I heard about that
You're insane for that
In a cool way
For that stuff I tend to just override the give or spawn functions
I have to check how the new MeleeAutoItemSync work and probably make internal pr (mayhaps) so those can be overridable
Also wanted to add Rarity system too but I think was too much
Cus I would end up doing what Factorio did
Common
Uncommon
Rare
Legendary
Custom
..
Byte.MaxValue
base class with a generic implementation that's a base class 🗣️🗣️🗣️
That's what I did haha
I did it to do random spawning mechanics
Some of the custom items are obviously more powerful than others
It's so beautiful 🥹
I wanted to do these but didn't but spawning was fucked up inmost of the times i tried so I went with "spawn & do stuff in this method"
ie:
I replaced the micro
Lol I've been procrastinating a spawning overhaul for my custom items
They just randomly spawn around the facility currently
For us its either spawned by other plugin or replaced by scp 500
i've been procrastinating on everything (except for one project, i absolutely locked in)
🗣️
Based as hell
I gave up on plugin dev stuff for a few weeks cause I burnt out
moral of the story: don't spend 54h a week working on a unity project
I playing GoWR since fridays
Unity sucks the life out of you
Been 12h now in
I know the patreon proceeds are fueling hubert's crack addiction
1 and 2
1 isn't really good but rhe 2nd is gold
I did 1 GOTY Enhanced, then 2, and got most of the achievements in 2
Sadly BL2 fucked up LAN play
at least 10 crashes a day
Worse than a Fallout game ong
We tried it but wasnt working cus fucking gearbox
I'm onto the pre-sequel next
how does one manage to do that 😭
After that I might have 3? But I wanna play some Tales from the Borderlands
Apparently the first one is peak
And the second is abysmal dogshit
With gearbox? Everything can happen
You can probably only play "lan" if you connected to "shift" system which requires internet but in lan play we dont usually have that
??????????????????????????????????????????
We play games without outside internet access
So we can always simulate (and scream to whoever fucked up) the offline lan play
why is steamcmd installing an older server?
because it sucks

specific the branch public
Just put
steamcmd.exe +login anonymous +app_update 996560 -beta public +app_update 996560 -beta public validate +quit
pause
cinema
In a .bat file
Then whenever you run it it updates to the latest public beta
I have three bat files for different branches
i might just be stupid actually
i told them to do -branch public and not -beta public

-# well, i didn't tell them specifically, but i said yes it looks good

So I have used:
steamcmd +force_install_dir /home/servers/scpsl/ +login anonymous +app_update 996560 -branch public validate +quit
but it did not update the game version
is this right command?
Cassie
thx
np
that's the namespace
CassieTtsAnnouncer
Thanks
np
Run !hostrole in your console iirc
With your discord id or you can email S&C
thx
Hi
public static Team GetTeam(this RoleTypeId role)
{
PlayerRoleBase result;
return !PlayerRoleLoader.TryGetRoleTemplate<PlayerRoleBase>(role, out result) ? Team.OtherAlive : result.Team;
}```
How can I get refHub here
I want to patch it and I need RefHub of the player
what
So I can get the team like this Hurting.Attacker.Role.GetTeam()
And the code is up there
I need to get the refHub
Here with patch
you... can't
I wanted to avoid 10000 patches in the code (where this is called xd)
Well this GetTeam is an extension method that only takes in the RoleTypeId
I could define
var role = RoleTypeId.ClassD and then do role.GetTeam() on it because it's not dependent on a ReferenceHub
There is a GetTeam in the part above it that uses a ReferenceHub, and is probably what you should use for your case
But
If you're instead looking to fake the team a player is on, you should patch the PlayerRoleBase
You can fake team and fake RoleTypeId too
That's what I did to fake some players as dead
What's your use case?
I make a new RoleBase with the faked team
And patched playerrolemanager.currentrole
So yeah you can patch the RoleTypeId too
That fixes your problem
Haha ofc
I was wondering why my code was throwing exceptions when using drawablelines, but now i see the issue
Here it uses connectionToServer (As a server) instead of connectionToClient, and since it's null on the server, it throws NRE when it tries to send the message
Huh
Your right
Report it as base game bug please
okay
Can somebody please explain to me what is Pooled/IPoolSpawnable in FpcStandardRoleBase?
Ye. (My perception)
Pooling is a definition of if not used anymore go in storage instead of destroying it.
Role stuff is pooled (and have basic X amount of stuff available to it) so when spawning and changing roles you dont have to wait X time to unity spawn models and the actual role related stuffs
Hmmmm
Could you please check DM
95% of this time was used for development
Hmm...
Does anyone have a copy of the NWAPI? I'm trying to remake a plugin here on LabApi, but I'm not understanding what this method is trying to find 😭
specifically 13.1.2 if possible
nvrm ill jst try and look through 12.0.0
wait
I can jst compile 13.1.2 on my own
I'm stupid
Since the first of december
You can't
You're gonna need to patch the call sites
You can look at the nwapi source code on GitHub
How did you do that
I faked a PlayerRoleBase
I wanted the game to think a player was dead when they weren't
Including full access to things like respawn mechanics
Solution? Fake the PlayerRoleBase
Return Team.Dead and RoleTypeId.Spectator
Oh fuck you
Why are some of the SCP DamageHandlers not ScpDamageHandler 😭
Bffr
Because
Dictionary lookup in a harmony patch
Okay
That really is fake 
It works tho
Does it work for non-spectator roles?
No clue
Probably not
I only did it like that because some places in the code check if RoleBase is SpectatorRole
Pain in my fucking ass
You can problem get away with just patching Team and RoleTypeId for non-spectator roles
Lel prob requires some stuff from specrole
Nope!
You'd think so
But no :)
At least half the cases don't
Some of them might?
But there's a lot of
How would i know, i don't know every code from my mind
You're a LabAPI maintainer, you have to know.
If you haven't memorized the entire codebase you're a disgrace to your kind
I barely even know what i ate yesterday
I know the base-game code base and not the labapi one 
Get working computer boy
[HarmonyPatch]
public class CassieScpFriendlyFire : CustomEventsHandler
{
public static IEnumerable<MethodBase> TargetMethods()
{
yield return typeof(ScpDamageHandler).PropertyGetter(nameof(ScpDamageHandler.CassieDeathAnnouncement));
yield return typeof(Scp049DamageHandler).PropertyGetter(nameof(Scp049DamageHandler.CassieDeathAnnouncement));
yield return typeof(Scp096DamageHandler).PropertyGetter(nameof(Scp096DamageHandler.CassieDeathAnnouncement));
yield return typeof(Scp3114DamageHandler).PropertyGetter(nameof(Scp3114DamageHandler.CassieDeathAnnouncement));
}
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) => [
CodeInstruction.LoadArgument(0),
new CodeInstruction(OpCodes.Call, typeof(AttackerDamageHandler).PropertyGetter(nameof(AttackerDamageHandler.CassieDeathAnnouncement))),
new CodeInstruction(OpCodes.Ret)
];
}
It's fixed now 
I'm so happy I was right
I did not want to have to deal with the alternative
I would if it was my 6th lesson rn (4 more lessons remain)

CodeInstruction.Ret
me when i just type Return (static using)
imagine a source generator that translates modified C# code into a transpiler
-# oh the edge cases
Good luck on source generators I hate them
*writing it
I kinda more better writing a weaver than scr gen
i understand the point of source generators right, but do i want to willingly submit to torture? fuck no
I wrote one for generating ini file parser
cryotherapy 
skill issue
Searched 5 forums, asked AI to tell me what the actual fuck is that shit, had 2 headache when looking at it
ngl the source generator code i've written is absolute dogshit
i really wanted to force tokenized generation on myself
instead of using string templates
You mean what?
Stringbuilder
StringBuilder is the goat
Then what
i'm talking typed tokens
Bro i never touched that how would i know what u mean
let me show
Do i have a magic power to know what u think 
(that would be great and not great at the same time)
what the hell is this
this is what the compiler sees when it looks at your code
hmm
yeah because i made it overcomplicated
this turns [Aliases(whatever here)] into public string[] Aliases { get; } = whatever there;
if whatever here is null or empty, it'll be public string[] Aliases => Array.Empty<string>();
@slate flume what do you think of the expressiveness of this xd
one day ill do source generation
Nah
i mean
i could do this for the uhhh
secretapi command tool
extender?
whatever
many words
i think one day u should be funny
ur just a hater
im stating the truth
nuh uh
any idea why destroying a dummy through mirror doesn't remove them from the player list?
🤷♂️
it works that way base game
I read this as "one day ill (sick), do source generation"
When are you destroying it
at the end of a coroutine
basically a creeper
there might be a more efficient way to handle it but i'll probably rewrite it later
wait i might know, i forgot to remove something
mayhaps
okay that was it
it just spawned two dummies

0_0
This is wild
guh
Evil
yes
anyone here got the memory leak from unity 6.2
is the plugin repo down?
wrong channel oops
Which memory leak
Idk if I've had a memory leak but I've definitely had a shit ton of crashes
Maybe 2 memory leaks in the past few weeks
But >=10 crashes every day
I just heard people saying they lost some projects because with all of memory leaks in 6.2
Yeah same i had like 3 crashes recently
I might move to unity 6.3
Ai
I saw they upgraded some bloom filters
Wdym?
They have ai now
Crazy update
6.2 is no longer supported btw
I haven't read all the changelogs for it i only saw bloom changes
Yeah im looking into flax engine or something else in the time being i might stick to unity
I checked the changes there is no mention of AI for 6.3
Its only some other stuff like multiplayer and 2D stuff and now you can disable physX sdk as well
Huh
Huuuhhhh
I should've bought the 128gb ddr5 rams earlier :"(
Blud thinks he's cyn
that shit is worth like a house rn
Yeah the market is absolutely chopped
Yeah im still broke

This will probably affect server hosting in long term
Or even game development
The car is crazy
I'd also be rich had I not eaten it all
Huh you can edit the csproj in VS 2026
You couldn't before?
I swear you couldn't before
VS user realizes that the ide lets you edit the csproj
You always could
You just had to click edit or something
Honestly I wouldn't have been surprised but it's had the capability
wouldn't know haven't used VS in like 4 years
VS doesn't allow direct editing of .csproj when the build system is MSBuild - you have to unload the project before editing (idk if it's still the case in VS 2026)
Here you use NET.Sdk and it can be editied directly
Just read that it's the style of project that changes, not the build system
Lmfao
How are so many people still using it
(Both VS and old framework-style projects)
You can edit the new sdk style project in vs22 too
i remember using it a long time before
before i discovered that rider had the same feature
now im ridermaxxing
🗣️ 🗣️
why doesnt a text toy in front of another always block the one behind?
under some angles the one in front seems to be behind
i assume it has something to do with rotation
but these dont rotate on their own
depth buffer fuckup?
move one forward
.1 of separation for anyone curious
lovely
i know it gets very wonky after like 10k units but not at 300
i maked this : LabApi.Features.Wrappers.Cassie.Message("customcassie mtf", playBackground: false);
how to disable subtiles and glitch effect
tried he not exist
also, what do you mean by glitch effect?
there is somme crick when the anouncement is here
it's in the method
um
what's the cassie message you're sending
if you have .g1 and stuff like that then remove those
no
have not .g1... .g2 ect
its only a anounce : "customcassie mtf"
u puted this : LabApi.Features.Wrappers.Cassie.Message("customcassie mtf", "", isSubtitles: false,);
and he said : expretion term ) not valid
going do a record
you have an extra comma
???
send u a reacord with the crick
can you record it for me?
soon
aight, be sure to ping me
why not cancel the announcement
what you mean ?
i thought you wanted to replace the announcement with a completely custom one
cause i'm using exiled
and exiled have labapi. (ect..)
just help me with LabApi.Features.Wrappers.Cassie.Message
Cause i need it for mor than 40+ anouncement
well, Cassie.Message shouldn't add any glitches
soooo
ummmm
soooo
set glitchScale to 0
that should fix it
so why he doing an error at ) ?
read the error
it should (99.9999%)
no +rep TvT
dunno why the glitch scale was set to 1 by default, i'm pretty sure it just used to send the message as it is
breaking changes 
huh
LabApi.Features.Wrappers.Cassie.Message("customcassie mtf", glitchScale: 0, customSubtitles: null);
um
also sound continue
ok
what
play at wii U
due to last scp:sl version
CassieTtsPayload false false so ?
i wish i couldnt read
then you don't need customSubtitles
read what it does
its in LabAPI.Features.Wrappers ?
i d'int find anithing about CassieTtsPayload
anyway
can u give me
the source of your source generator thing
Teehee
No
:c
Quick fixes -> add using
whyyy
Lazy
damn
didnt understand what u mean exactely
just i add using ?
just i put this ? : new CassieTtsPayload("message", false, false);
Yes use that
Your ide should be able to import it for you
Crazy
how does one check for STUPIDNESS
get out
by comparing to YOU
ge just do noannounce
You don't
^p^
The compiler will yell at the user
i see
Huh
You probably shouldn't specify the accessibility modifier in the generated code
oh is it not needed
The user will set it themselves
ur so right
You shouldn't cause a conflict
whoops
i was writing it based on the user class
um
"private public class"
Lmao
shut the fuck UPPP
i think we ought to exsanguinate eve
ur literally bald
didnt undrstand for the announce TvT @upper vapor ;-;
i have fur
Yeah can we like deport Eve
guh...
Ive been asking for that for at least a year now
What the fuck is this
idk im going insane
Define that word starting with e
idk what im doin
Idk what that word means either
You wanna commit war crimes
eve means stupid
Bruh
But defenestration is surely better
Ok furry
woah...
Perhaps
exsanguinate means to drain someone of their blood
Friendly fire will not be tolerated
Right so you're like a vampire but a dog
It will be tolerated :33
how would u do it 
Oki :3
StringBuilder
Not sure if it's any better ngl
18th century ahh medical treatment
"We" as in you (singular)
i mean
sort of?
but
i think the current one is fine
its just writing the code itself thats the problem
which is why i asked for your code lel
Why not use string format
It's 10000x worse
hmmm
yea well im building this for the case of like
if i need to add to it
its easy to
rather than like all of it in 1 string format 😭
ill bite u
It's hundreds of lines
For 1 command
You can have multiple
Woah
wtf is this for
Check the message below
oh is this ur command framework?
Nah
It was for testing
A new one
But I scraped it cuz it's genuinely horrible to look at
It's nice and ugly af
the greatest command framework ever imagined perhaps
it would abuse the shit out of attributes
Mhm
unfortunately i am very busy and also i dont wanna use c#
You have a skill issue
you have a
wrong because mine will be so unbelievably amazing in every way
what if no namespace?
i suppose i should handle that then
UsableItemsController.GetHandler(plr).ResetAll();
why doesnt this remove the 268 coolown?
prob because it also using GlobalItemCooldowns?
why do you have a separated method
you can just make execute abstract
it has literally the same signature
this works
no subtitles, no background noise, no glitches
thouhg, why do you need a cassie announcement if you have it fully custom?
i dont think doing this in the string way is good way
😭
i genuinely think your way is better, if not a simpler version
how many lines for your command generation
i meant the source gen code
118 lines of extension for the writing
95 for the source gen file itself
the generate method is a lot smaller tho
mine is 78 + 221 + 137 lines
guh
yea ngl i wouldnt be opposed to doing smth similiar 😭
arguably it has more features
this is also why i asked for yours tbh
well
not because i wanted the exact, but if ik how u do it, i can probably do it in a cleaner way...
i have attributes that specify properties so you don't have to override
then the execute method
gulp
and it builds tokens instead of stringbuilder or whatever
how does tokens actually work
its just a stringbuilder with indentation built in
thats it
guh
you don't really need indentation though

How turn off the noise while the cassie is broadcasting?
playBackground: false
LabApi.Features.Wrappers.Cassie.Message("emergency alert . . errors detected in operation lighting system, false, false , false");
?
you don't have the bools outside of the string
nothing.,..
right, you're probably using it from nuget (which hasn't been updated)
Yep
you can either switch to directly referencing labapi or using Message("whatever", isNoisy: false)
Sorry, but where can I download the new version, because this one doesn't work either?
Did anyone find a workaround for the VC issue where people going up an elevator are not heard anymore?
Or like, when using radios too.
it's a base game issue
at least when using radios
I am aware of that
Was just wondering if anyone knew of a workaround which could lessen its impact
could have jst done throw new NotImplementedException(); but that works too.
Generally a bad idea inside of a command
I mean... if it works, it works. ¯_(ツ)_/¯
how to disable mtf entrance and chaos entrance anouncement
look at #1404556538944950434
This is why instead of porting old ass plugins, you recreate them from scratch
More time, but generally better quality
^^^^
Sometimes it takes less time to just make it yourself because you're now dumping your time and energy into un-obsoleting an obsolete plugin framework 😭
You have to question if this is genuinely the best route here man
Trying to save yourself time and effort may just be having the effect of costing more time and effort
remember, 5h of decompiling can save you 5 minutes of reading docs 
Anything to avoid... 🤢
Having to read the docs~
🤮
you don't need to read the docs if there are none
