#plugins-dev-chat
1 messages · Page 126 of 1
quick questions
transparently_modded_server i heard that transparently modded can also apply in plugins code?
Never used it yet so gimme quick info
So if 1 single plugin has it the server will not have modded flag?
/// <summary>
/// Whether this plugin is considered transparent.<br/>
/// A plugin can be marked as transparent if the server’s modifications are strictly limited to non-intrusive features that do not affect gameplay balance or make significant alterations to the user interface.
/// Examples of transparent modifications are: admin tools, automated timed broadcasts for tips, message of the day or other administrative utilities.<br/>
/// For more information, see article 5.2 in the official documentation: https://scpslgame.com/csg.
/// </summary>
/// <remarks>
/// You can keep using the 'transparently modded' flag during occasional short events organized and supervised by
/// Server Staff, regardless of the Modifications used for these events.
/// </remarks>
public virtual bool IsTransparent { get; } = false;
ALL plugins need this to true for Modded flag to be hidden
afaik
what r u actually doing
just checking one thing
someone has vanilla server with plugins
and the flag in settings is set to false
im confused
i dont get it
what r u looking for
if a vanilla server has plugins that do not set themself as IsTransparent then it will show modded
or is it not doing that
ill try this out when i get home later and see if my hitboxes still decide to be fucked up TwT
This is still doing too much for most people IMO
You should really not post that function and instead tell people how to actually move the dummies
Especially given that that doesn't actually have the dummy move to the target position, it has them take a step in that direction
What you want to do is get the dummy.RoleBase, cast it to IFpcRole, then go IFpcRole.FpcModule.Motor.ReceivedPosition = new(targetPosition);
Now fair warning I've heard you need to set the targetPosition not an insane distance from the dummy's current position, otherwise it might fail
public class MoveTowardsPoint : MonoBehaviour
{
public event Action<MoveTowardsPoint> OnSuccess;
public float speed = 8.0f;
public Func<Vector3> PointToMove;
public Action<Vector3> SetPosition;
public Func<Vector3> GetPosition;
public object Data;
public void Update()
{
if (PointToMove == null)
return;
if (GetPosition == null)
return;
if (SetPosition == null)
return;
Vector3 point = PointToMove();
if (point == Vector3.zero)
return;
Vector3 getPos = GetPosition();
if ((getPos - point).sqrMagnitude < 2)
{
OnSuccess?.Invoke(this);
Destroy(this);
return;
}
SetPosition(Vector3.MoveTowards(getPos, point, speed * Time.deltaTime));
}
}
guh
Three null checks on separate lines one after another is crazy
I bet I could make a better dummy movement function than all of you nerds
nulll
Then go and do it
This runs the risk of server stuttering causing dummy stuttering
This is not only dummy movement it do object moving too
DeltaTime is dependent on the time between previous frames, it can't predict future stuttering
You're predicting movement as though the previous DeltaTime is going to be the same as the next DeltaTime
That can be an issue if DeltaTime ends up being a good bit larger than the previous one
It'll cause the dummy to pause
My immediate issues with your guys' systems is that the first one is doing too much and the second one has that issue
I think even PlayerFollower has dt
okay ur point can stand while they can also point it out
My testing server/pc runs perfectly at 60 fps
Yes but he's saying it as though it's a counter to the issue I have with his method
His point can stand, just not as a counter to the point I just made
This is fair but also you shouldn't be recommending solutions that rely on consistent full TPS server performance
Not everyone has the same luxury
Literally every search that i checked made "plz use dt "
It is good to use DeltaTime but you're still missing my point
If the next DeltaTime is larger than the previous one, than the dummy stutters
If you provide a solution not just doing critics i would welcome it
The dummy can continue to work towards the ReceivedPosition even with server stuttering because it sync to the client
I will
Just give me a bit to
You know
Finish my drinks and get back to my room
then use smoothDeltaTime
What does smoothDeltaTime do
Does it approximate DeltaTime based on multiple frames
Burn your pc
This value is equal to Time.deltaTime when it is constant (i.e. smooth frame rate). When deltaTime varies between frames (e.g. on a frame hitch), this value increases or decreases gradually towards deltaTime over multiple frames.
That still doesn't fix the problem smh
ReceivedPosition should be overcompensating for DeltaTime
it will be significantly less noticeable
Not my problem
XDD
It could be for the people you're proposing this too
You're being very inconsiderate
Alright whatever I'll propose a better solution for this user when I get back to my room
The propose is just tp to destination
I don't want to argue with you anymore we're not going to meet any common ground
Have fun then
I will
Going back to implement dtls
Hi
Greetings
Didn't you mixed deltaTime and fixedTime?
Ah ye most places says "do lerping too"
No
Lerping is fine
But you're underestimating the lerp
You're calculating movement to say
"ReceivedPosition should be where the dummy will end up next frame"
If the next frame takes longer than you thought, then the dummy will make it the spot before the next frame runs
Meaning you stutter
You're confusing my argument as "Lerping bad"
No lerping is fine
ah so RecPos should be predicting the next move
Generally yes
You want to overestimate because the client will sync the received position
So you can calculate the movement as far as a few frames and everything will run the same, but avoid the stuttering
Really all you need for an easy fix to do is take the speed and multiply it to be larger than the dummies current speed
It'll allow the position to overcompensate in case of server lag
my speed when i set to more than 10 it just flies to pos
It's not about changing the dummies speed, it's about overcompensating the position in where the dummy needs to be
When the dummy receives a position, it moves at whatever speed it can to that position
And that movement is client synced
So if I tell the dummy "move to X" it'll move like a regular player to position X
It's like if I'm telling an artist to make a painting
I can tell them what painting I want them to make, or I can tell them each individual brush stroke and wait for confirmation after each one
If I take a long time to tell them the next brush stroke, the painting will take longer
The artist already knows how to paint
I can just tell them what to paint and they'll paint it
I guess maybe the more adept analogy is that I can tell the painter the next few brush strokes they should make, in case I take a longer time to tell them the next brush strokes they should be making
guys how do you sell a human body?
you find someone that'll buy it
no
ItemType.DebugStick
Jailbird
Using that on Eve rn
Shes a witch
Fr
lovely CI pains
I love the commit history when I touch any CI related files
Does anyone know how 096 knows if he's been looked at?
Does it use Camera.WorldToScreenPoint and then using a raycast check if it's within LOS and in range?
VisionInformation class
afaik
you can always go to the 096 targets and check it urself what its doing
wait that's not a default unity feature is it?
no its custom
How to create custom item via LabApi?
write your own custom item api
i dont remember
you can decompile it
do you use rider
or VS
so you use VS?
yeah
ah
yes
ok yeah i wanted to make sure theres not like a modded variant of the game called vs
ctrl + left click VisionInformation
no i dont
i thought you were writing a plugin
nah

just wanted to know how 096 works xd
busy rn so cant do it for you
alr ty tho
It does
i was gonna say
rider > all
all > rider
@lethal cradle
public bool IsObservedBy(ReferenceHub target)
{
Vector3 position = (base.CastRole.FpcModule.CharacterModelInstance as Scp096CharacterModel).Head.position;
return Vector3.Dot((target.PlayerCameraReference.position - position).normalized, base.Owner.PlayerCameraReference.forward) >= 0.1f && VisionInformation.GetVisionInformation(target, target.PlayerCameraReference, position, 0.12f, 60f, true, true, 0, true).IsLooking;
}
thats fine
GetVisionInformation()
{
bool isOnSameFloor = false;
bool flag = false;
if (VisionInformation.TargetOnTheSameFloor(sourceCam.position, target))
{
isOnSameFloor = true;
flag = true;
}
bool flag2 = visionTriggerDistance == 0f;
Vector3 directionToTarget = target - sourceCam.position;
float magnitude = directionToTarget.magnitude;
if (flag && visionTriggerDistance > 0f)
{
float num = checkFog ? ((target.y > 980f) ? visionTriggerDistance : (visionTriggerDistance / 2f)) : visionTriggerDistance;
if (magnitude <= num)
{
flag2 = true;
}
flag = flag2;
}
float lookingAmount = 1f;
if (flag)
{
flag = false;
if (magnitude < targetRadius)
{
if (Vector3.Dot(source.transform.forward, (target - source.transform.position).normalized) > 0f)
{
flag = true;
lookingAmount = 1f;
}
}
else
{
flag = VisionInformation.TargetInViewDirection(source, target, targetRadius, out lookingAmount);
}
}
bool flag3 = !checkLineOfSight;
if (flag && checkLineOfSight)
{
flag3 = VisionInformation.TargetVisibilityUnobstructed(sourceCam, directionToTarget, 0);
flag = flag3;
}
bool flag4 = false;
if (checkInDarkness)
{
flag4 = (!VisionInformation.CheckAttachments(source) && RoomLightController.IsInDarkenedRoom(target));
flag &= !flag4;
}
}
ok i removed all the params from the method
ez
wait thats decompiled code right?
yes
i mean it has to track stuff for more than just 096
its 049, 173, 096 minimum
i dont remember what else uses it
hmm fair enough
1344 + the sound track that plays if ur alone uses it too
hm
i still feel like using
world to screen point
with a simple raycast
would be the same but faster and more compact
if the raycast returns unitynull then the target is outside the range
and if the screen point is higher than uhhhhh i think it's -0.5/0.5 then it's outside the player's fov
i mean it has to check how much ur looking, the amount of distance to target, whether ur looking, whether ur in darkness, whether ur on the same floor, whether ur in line of sight
oh wait no it returns pixels i remember now
so all you have to do is get the player's x and y pixels and then just do simple maths
shut UP
the how much youre looking is determined by WorldToScreenPoint
and the rest by the raycast
dont even have to check if they're both on the same floor because the raycast would not return that it hit 096's face for example
yes but
vision information isnt only used by 096
and same floor might be used by smth else
yeah it could be the exact same thing for peanut
ya they all use the same method
or anything that needs los
but
there has to be a reason why they use that specific method of doing the LOS check
096, 049, 049-2, 173, 1344, 1853, alonetrack
because thats what they made
yeah but there's prob a reason why they made it this way specifically
surprised the alonetrack isn't just a basic distance check/trigger collider
trigger collider?
yeah
tho idk if it's actually lighter than looping through all entities checking their range
it may be lighter above a certain amount of entities

but then it could simply go through a list of entities for the current floor instead of the entire level
im really curious now
do any nw programmers check this channel often?
hope they see this cuz i really wanna know why they made it this way
i mean
afaik its old code
so prob from hubert
ping hubert (dont actually)
Ah
would be funny if i pinged one of them instead of the hubert

i do wonder if the code was inspired by the CB implementation
someone wrote it, and its been there for years
fair enough
shut up
@grok is this true?
public static void SpawnRagdoll(Vector3 position, Quaternion rotation, string Name, string DeathReason, RoleTypeId roleTypeId)
{
// Damage info: here we use a custom reason "Plugin Test"
var damage = new CustomReasonDamageHandler(DeathReason);
Log.Debug("SPAWNING RAGDOLL");
// Create ragdoll data
var data = new RagdollData(
Server.Host.ReferenceHub, // attacker (host so it’s always valid)
damage, // damage handler
roleTypeId, // role type for the ragdoll body
position, // spawn position
rotation, // spawn rotation
Name, // name shown on the ragdoll
double.MaxValue // time to stay (use MaxValue = infinite)
);
// Create the ragdoll
if (Ragdoll.TryCreate(data, out Ragdoll ragdoll))
{
ragdoll.Spawn(); // actually spawns it in the world
Log.Info($"Spawned ragdoll: {ragdoll.Name}");
}
}
Hello guys i got a Ragedoll spawner and after the Update it doesnt take Vector3 Position but rather "RelativePosition"
Argument type 'UnityEngine.Vector3' is not assignable to parameter type 'RelativePositioning.RelativePosition'
Someone knows a fix?
new RelativePosition(position)
prob
Yes perfect thanksss
my nickname in another server is grok and this msg activated a brain cell in me
lol
do u have the code snippet for how that one works xd
im curious
Its just a compressed vector3 afaik that does it relative to a point
Eg elevator or door
i dont have it but thats what i remember
why would it be relative to a door though
is there a reason for waypoints besides elevators? not too sure when they were introduced
interesting
wonder if nw is cooking a navigation system
or is it just leftover code from the SNAV days?
Since they use relative positioning it's easier to re-use something that's always on the map anyway for waypoints
fun fact, you can even make extension for generics 
yeah it gives so much more freedom then extension methods
we trust the process
neat
I rewrote my code to manage it this way but hitboxes are still....
can we see the code
{
while (npc != null)
{
Vector3 dir = npc.Rotation * Vector3.forward;
dir.y = 0f;
if (dir.sqrMagnitude < 0.0001f) dir = Vector3.forward;
dir.Normalize();
Vector3 start = npc.Position;
Vector3 target = start + dir * Dist;
target.y = npc.Position.y;
Vector3 cubePos = target + new Vector3(0f, 1.5f, 0f);
var cube = SpawnPrimitive(cubePos, Quaternion.identity, 0.5f);
float elapsed = 0f;
while (npc != null && Vector3.Distance(new Vector3(npc.Position.x, 0f, npc.Position.z),
new Vector3(target.x, 0f, target.z)) > 0.05f)
{
if (npc.RoleBase is IFpcRole fpcRole)
{
fpcRole.FpcModule.Motor.ReceivedPosition =
new RelativePosition(target);
}
elapsed += Time.deltaTime;
if (elapsed >= 5f) break;
yield return Timing.WaitForOneFrame;
}
DespawnPrimitive(cube);
}
}
try calling ServerOverridePosition after setting ReceivedPosition
use the same position as the received one
see if that helps
can we make a way to disable smallcaps in hints 🥺
if i understand this correctly you are setting the position to the target which is under the primitive in the video, and are not doing any interpolation.
u already can
use the <lowercase> tag
wait are you for real
you will need to interpolate the position on the server if you want backtracking to work
hold on !!
yea
idk why my first thought was </smallcaps> 😭
if only
ur a genius thanks very much
:3
ive been working with hints for a looooong time
yea i can tell, i remember that thing u said about working with hints and having like infinite hint knowledge
after i said the thing about technical aspects of cassie. but i think that your hint knowledge is way better than my cassie knowledge.
7 bytes instead of 12 per position
that's kind of a side effect
that is NOT how instances work 😭
That's really not worth the hassle of the system tbf
doesn't matter as much as people make it seem to be
why 7 bytes? i assume 12 being default is because 4 bytes per float for a 3d vector for pos
but i dont see how it becomes 7
okay but imagine 5 bytes times ten trillion
1 byte = id, 2 * 3 (ushort)
wait they represent pos as ushort in network?
not when sent over the network
mirror packs them
yes
hence the 128 range
In this instance the processing cost outweighs any kind of perceived benefit from reducing the bandwidth cost
lmk when the game can handle more than 50 players without dying and then we can talk about that 
those 5 bytes are cheaper than all the relative positioning computations
(i know you're memeing)
i would never
wat
C# has decimal (i think that's the name) that is 16 bytes
If you ever use decimal for vectors/quats you need help
Why, i want the perfect positions
Simulating ants in SL time
The real ray tracing
i fucking hate the names they choose for types
like why decimal
well
ik why decimal
but its just an unhelpful name
quadruple was kind of a mouthful
QBit
Rust
No
This is more of a NW hitbox thing than it is a problem with dummy movement afaik
Look at the bullet spread
Bullet spread while you're moving with an FR-MG-0 is crazy, that's why you're experiencing this
Well it also combined with NW's bad hitboxes (see HitboxExtender plugin)
This is not because the hitboxes are off, it's a combination of those two issues
Your hitboxes are fine
Try standing still and ADS shooting them
You should have a lot less issues
Riptide said it's likely backtracking
And considering shooting ahead works it probably is
yeah it probably is
animation information isn't a part of backtracking
i remember you talking about implementing it server side to save TPS, did you ever try it out in a plugin
Sure cheaters might lie about what they hit, but they already shred with aimbot anyway, it'd only make them a lot easier to spot
Never found the time, but from exploring the shooting logic, I don't think it'd be possible
i'd need clientside access
backtracking also seems to assume RTT is 50/50 between client & server, which makes it inaccurate at higher speeds
Due to the lack of buffering in SL, you can't rollback to an exact position for hitreg, so my idea of using a capsule wouldn't do much anyway
might help a bit more but without client modifications I would barely make an improvement imo
i dont think you can calculate the time between server-client client-server? unless im missing something
Since SL doesn't really use a move input kind of system like other fps games do, not really
If the server sent move data to clients (with timestamps) and clients buffered them for X ms before running them (let's say a fix 100/200ms buffer), you'd be able to tell the server "hey I hit player X at timestamp Y"
the server keeps a buffer of the sent moves to roll back at the time the client described
do simple check
i see
Keep a max rollback time that's reasonable and you have cheap hit validation that feels good for players
Don't even have to move the players back on the server, a simple capsule/line intersection check means no transform updates
i know mirror includes a timestamp with every batch of messages, but ngl when i looked at the docs it just confused the shit out of me
I'd just have your own in this scenario
Easier
with a synced time clock between server and client you can have reasonably good validation
Watch the video, you will see the bullet holes going to the left of the dummy
^
I've seen this exact thing happen without dummies
Tbh the same issue was happening while they werent moving and shooting a moving dummy
Backtracking defo has issues
^^
wasnt this fixed?
I never saw anything about it
im pretty sure it was a big issue, would be surprised if it wasnt
oh and a circular buffer that holds the rollback data/move history.
I can try recreating it with and without dummies to demonstrate
But that'll take some time
I can't get into too much detail about past work since I'm under NDAs but I can say that it works pretty well
Although SL would require a rewrite of movement networking for that
thats in the works atm
But suffice it to say I don't think the problem is just with dummies
Sweet
i think jesusQC is the one working on it
Might be a good time to simplify hitreg
i dunno why the server simulates the shots completely for example
Instead of just checking if a shot could've been fired and doing a line/capsule intersection
You get rid of transform updates from backtracking, hitreg costs less
(also iirc every shot done on the server sends an RPC to everyone but the owner?)
(that stings)
Hopefully automatic guns don't do that
not sure i havnt look to much into the new system
I'm still sad at the amount of network messages being used for stuff, really hope it gets a refactor pass one day
with what change?
Heavy, could be lighter
How...
consistent reproduction steps have been difficult, and the exact cause for why that scenario occurred is hard to confirm
That's... not good? They have overhead.
Nice feature but there's a way cheaper alternative
sec
wasnt something todo with the animator of a weapon delaying shots and network packet loss delaying messages(that one i dont think was fixed, but the former i think was?)
would be something good to look into
first was fixed, but this still occurs
Only issue I ever had with that was the audio started dying
Sending a link to something that's Unreal related but the logic can be applied to Unity/Mirror
Okay
just replace replicated property with SyncVar if you dont know Unreal
i've applied similar logic for games targeting 64-100 players per server and it's extremely cheap networking wise
instead of sending an RPC every time a player shoots, you increment a counter in a struct
struct is a sync var
on the client's side, when the sync var updates, they compare the previous bullet count with the new one
the difference is the amount of shots they have to simulate on their end
add that difference to an accumulated counter, just simulate at whatever the firerate of the gun is
Now regardless of how fast a gun shoots, the networking cost is pretty much static (more or less)
Bonus points if only people that are relevant to you (SL terms would be no invisibility flags i think?) send you that data
the server can die as well, especially on weak hardware
I've noted this down on the old QA servers
It does have a performance cost in the end
With this kind of setup too, you can have some packet loss and still have bullets simulating stably enough
It's resilient enough for players not to notice it once it's setup properly
I guess that's something that can be looked at in future
QA server was barely running on 6 tps
the server will just send the data until the client acks, there's no ordering guarantee
compared to RPCs, although I need to double check what channel is used for server to client shot networking in SL
Reliable
Ordered?
Nop
phew
Default is just reliable
Or wait
Is the other value ordered or unordered
Uhhhummmm
Idk
im in bed too
hah
um
you sent this here a while ago
so im gonna assume it's reliable ordered

yeah
big side effect is any packet loss will causes massive delay
which is why stuff is being reworked to use unreliable/unordered
I would beg thee to move a lot of the stateful stuff to sync vars
I'm sure Mirror can handle throttling network updates better with sync vars (at least I hope so lol)
im not sure mirror can do any throttling, or atleast i havnt seen any
you kinda just set the update rate on the NetworkBehaviour and then for the rest of the game it uses that, although you could easily script your own dynamic update rate
pretty sure it uses channel 0 by default
for sync vars too?
yeah
oof
gonna double check
Yeah cause that kinda just makes them a little better but only marginally
the thing I like about Unreal's networked properties is that they're unreliable and they're not ordered
you set them, you know the client will eventually get it
and packet loss won't nuke everything
😭
oh right, so its not mirror that determines if its reliable/ordered or what ever. mirror just has the abstract concept of channels. and its lite net 4 mirror which is setting the default
Ay
@grand flower dw the movement rewrite from Jesus sets it to unreliable
he's still cooking on that though
I think I've just been waaaaay too spoiled by Unreal's networking layer heh
My relative positioning calculation inline made it 7
so question actually

Don't need it for elevators, I've talked about other more standard solutions to the same problem
huh
It's staying afaik. It was discussed in some channel some time ago
rip
But some optimalization wouldn't hurt
@limber silo ^
I guess it could be optimized a little more but like
It's still gonna have a big cost in the end
Compared to other solutions
Such as
Well, starting off my ignoring the few bytes saved by it bandwidth wise because it honestly does not matter much
The only real use of it is elevators, so any moving platform a player can be based on
(backtracking waypoints are another thing I'll touch on after this)
Yes that was the intention
The less networking is not the primary goal for that
Just moving elevators
There's a simple solution, you give anything dynamic the player can use as a movement base an id (that is the same on client and server, hell could be a network identity, but I'd go for a byte because honestly you're not gonna have > 255 elevators in the facility, heck save one for the Chaos jeep heh)
When the player steps on the dynamic movement base (i.e. elevator), they set it as their base in movement data they send to the server
No base id set = relative to world (0,0,0)
base id set = relative to dynamic movement base of that id
When the client changes their base, the server checks that they could've
This (afaik) is already in the game through backtracking waypoints
except instead you just backtrack the dynamic movement base according to when the client said they switched to them
or off them (elevator -> facility floor)
Server's happy enough with what the client says, their movement is now relative to the base
and for other clients, they receive the data of the base id + relative position
relative position this time just being a simple vector for position and vector/quat for rotation depending on how SL does it I don't remember
no base? world space
base set? relative to set base
Clients will see no jitter/desync of any kind
You no longer are bound by the limitations and performance cost of waypoint calculations
Yea but yknow
You don't step on the surface instantly
You can jump there
You can also jump out while it's moving
You can't just check touching
Bounds check is required
Yep, and generally the way it's done is by having a "max distance to floor" leniency setting
Yeah so you just do bounds check
You are allowed to change base when grounded (so jumping into an elevator sets the base the second the elevator floor touches your feet)
leaving base can be done by hopping on another or being too far from the floor of the base
could do bounds check but the issue is that will "snatch" the player
and look goofy
SL example is warhead elevators sometimes a player jumps down at the right time and you suddenly see them accelerate before they even hit the elevator floor
Not flagrant but noticed it a few times, and you make the connection after reading the code for those hehe
Keeping track of the floor under players isn't much of a performance issue
pretty cheap all things considered
So now you have gotten rid of relative positions and waypoints and have waaaaay cheaper movement
Can still do smoothing, and you don't need to have perfect networking of the dynamic movement bases because clients will follow whatever movement data they receive for other players, and assign positions relative to the set base if any
I'd be happy to answer questions if it ever goes that far
Cc @marble cobalt what do you think
#plugins-dev-chat message begin here
I'm just trying to get rid of my nemesis the waypoints and relative positions 😭
And make our servers run smoother
Base ID -> GameObject would be free since you dont find it by position, just by contact (reported by client, or corrected by server)
Just make sure to do this properly
Titanfall uses this system and it has a couple useful movement bugs surrounding it
how come platform not move it work ok but when move it no?
Patreon: https://patreon.com/zweek
Twitch: https://twitch.tv/zweek
Bluesky: https://zweek.bsky.social
Music (in order of appearance)
castle and fortress - Louie Zong [yoshologie] https://louiezong.bandcamp.com/album/yoshologie
Gracie Grace [Animal Crossing City Folk OST]
El Bunko [Piku...
Not a bug, it's a feature
@slate flume here's some juicy linq
might as well just do a foreach atp, that's so many loops 😭
YIPPIE
well
this is much more readable
that is true, but the nanoseconds ax...
okay i'll optimize sometime
no dont do that
only bad developers optimize
You mean event print?
yea
You have debug labapi dll on the server then
😭
Guh
reminds me
Can I get a "hell yeah" in the chat for linq
what about it
oh
yea but im an api
it doesnt do anything to affect gameplay
That kinda does impact gameplay
its a plugin dependency api
how?
effects are disabled
it shouldnt do anything unless enabled (and if it does so, that is a bug and not intended and will be fixed)
rah
ill leave it commented for now
but yea it doesnt do anything unless im stupid and mess up 
me when i make everyone fly to the moon
I mean yeah prob
That's so peak
You can even fake sync it
🔥🔥🔥🔥🔥
@upper vapor also i think rider broke the summary parsing
😭
actually
only one file
tf
do you have BOM?
bom?
this one is fine
and its outside the extension
just checked another extension thing and yea
its broken
tf
good to know at least
vs better
ur worst
I know some people are creating minimaps using TMP or Primitive, but how do they get the map structure?
homophobe
what the hell david
Spot the issue
get out
What the fuck david
you?
oh.
YOU
hi
when make more music
soon
what the fucky
When make more code
rooms have an icon that 106 atlas uses
so you gotta recreate that
foreach (RoomIdentifier allRoomIdentifier in RoomIdentifier.AllRoomIdentifiers)
{
Transform transform = allRoomIdentifier.transform;
Vector3 position = transform.position;
if (allRoomIdentifier.Zone != FacilityZone.None && (double) Mathf.Abs(position.y - camPos.y) <= 100.0)
{
Scp106MinimapElement scp106MinimapElement = Scp106Minimap._pool[this._usedRooms];
scp106MinimapElement.Room = allRoomIdentifier;
scp106MinimapElement.Img.sprite = allRoomIdentifier.Icon;
((Behaviour) scp106MinimapElement.Img).enabled = true;
scp106MinimapElement.Rt.localEulerAngles = Vector3.back * transform.eulerAngles.y;
scp106MinimapElement.Rt.localPosition = new Vector3(position.x, position.z, 0.0f) * this._gridScale;
++this._usedRooms;
}
}
is what basegame does
never i quit
:'(
Hello
u gotta take care of secretapi now
What if they generate an overview map instead of a minimap?
wdym
good point
i dont wanna either
i mean ill keep doing it
but
holy macaroni
not like 106 map, it shows whole hcz map
then its the same thing just a bigger map
If only the room icons actually fucking worked
How does 079 do it
Does 079 experience the same room icon bug
public void Generate()
{
this._parentImage = this._parent.GetComponent<Image>();
this._nonExactTransform = ((Component) this.GetComponentInChildren<LayoutGroup>(true)).transform;
((TMP_Text) this._zoneLabel).text = Translations.Get<Scp079HudTranslation>(ProceduralZoneMap.ZoneTranslations[FacilityZone.Surface]);
this._surfaceCameras = new List<Scp079Camera>();
foreach (Scp079InteractableBase allInstance in Scp079InteractableBase.AllInstances)
{
if (allInstance is Scp079Camera scp079Camera && allInstance.Room.Zone == FacilityZone.Surface)
this._surfaceCameras.Add(scp079Camera);
}
int count = this._surfaceCameras.Count;
this._icons = new Image[count];
for (int index = 0; index < count; ++index)
{
this._icons[index] = Object.Instantiate<Image>(this._template, (Transform) this._parent);
((Graphic) this._icons[index]).rectTransform.anchoredPosition = this.WorldspaceToAnchored(this._surfaceCameras[index].Position);
}
Object.Destroy((Object) this._template);
}
this is surface zone
btw is this able to patch and change room distance to show?
dont think you can patch it
its client that decides the scale of 106 map
🔥🔥🔥🔥🔥
Love it when NW decides not to sync shit
to me it makes sense
It doesn't make sense for a game that encourages modding
If you're making a regular game and don't care about the ability to mod it then it's fine
Otherwise you should be adding ways to change these things or at least just sync them
istg
same way they handle position, same way they handle scale
but yk
they havent yet
you havent suggested it 
u guys will complain about not having a sync message for the strands of hair on players
yes
that being said
we sure do love it
(lcz has the zone map for entrance... but doesnt use it)
also has hcz but does use it
okay that is a bit dumb but
do i get off my ass and fix ruei v3
Sleeping is good
Sleeping 16h a day
i thought you would want me to work on it
true
slimy boy
Go sleep you too
im BUSY
Busy being dead because y'know you murdered me
good
guh
What if
ive been waiting... for ruei v3 to be fully released... for 20 years! /j
huh wha huh
Real
goofy
um
not invisible
go fix it
fuck u
Bc not closed
and then after that
Whoa
u gotta make the changes for me
A quick (1h) naptime
ill do what i want
+1
I dont use hints so do whatever u want
you click "merge"
u should
Idk i never used rider
Skilll issue
ruei is the most advanced thing ever created ever
if you tried to push but was rejected, you should probably undo commit, pull, then commit again
except its just ignoring my changes from my branch and taking the one im merging in
id like to get the changes i did on each branch in the same file so i can just
i didnt try push
i tried merge
show screenshot
I write apis and backend usually , i dont really care how its draw on screen
oh
Altf4
git merge --hard --force
read the top comment (i miss it sometimes too)
mostly same but thats kinda why i like hints
i dont actually have to do proper ui
well thing is
the middle is removing stuff i do want
the changes i do want is what it removes 💀
no
what is happening
i am NOT used to this
this is very little context
i made the changes
and now i haveaabort
and thats rlyi t
theres nothing else to show 😭
cant even abort 💀
ok i could through github desktop
wait ruei-3 works???

its released?
CRAZY
not yet
How stable?
try it and see 
I honestly don't wanna bet
ruei?
because in 1h 30m i have a testing
How good?
its just about porting
and stable
I didn't even implement on this project Ruei
tell me there's a wiki
ig it will be 30 seconds to add it
Zero speedrunning coding
any% (bugfull)
I already made it work
PLEASE DISPLAY TIMER
FUCK
not yet but everything is documented
I think i foudn a bug already lol
huh
public static class SimpleElements
{
public static string Timer(ReferenceHub hub)
{
if (GameManager.CurrentArena == null)
return "Test";
Logger.Info("WORKS");
TimeSpan t = TimeSpan.FromSeconds(GameManager.CurrentArena.RoundRemaining);
return $"{t.Minutes:D2}:{t.Seconds:D2}";
}
}
display.Show(new Tag("Timer"), new DynamicElement(970, SimpleElements.Timer));
this is done in the OnPlayerJoin
It will always display test
but CurrentArena isn't null
oh update interval
lol
there u go
speaking of RUEI, can sombody help me out here? cant really tell what im doing wrong in here. ill need to build on the features a ton later but just to show a normal hint here
public static bool ShowHint(Player player, string hintText, float duration, HintType hintType = HintType.Standard)
{
if (player is null || !player.IsReady)
{
return false;
}
string baseContent = hintText ?? string.Empty;
TimedElemRef<SetElement> elemRef = new();
float functionalPosition = hintType switch
{
HintType.Standard => 0f,
_ => 0f,
};
DisplayCore display = DisplayCore.Get(player.ReferenceHub);
TimeSpan timeSpan = TimeSpan.FromSeconds(duration);
display.SetElemTemp(
baseContent,
Ruetility.FunctionalToScaledPosition(functionalPosition),
timeSpan,
elemRef);
display.Update();
return true;
}
ruei 3 or 2
actually thats 2
im just trying to get it to show the hint on the screen for a duration then destroy it when its done more or less. I have a long feature list but ill build it late
idk anything about ruei v2 anymore
idc what it is as long as i can get something working 
like i tried with v3 then with v2 and couldnt once get anything to even appear on screen. any help is better then where im at,
i got v3 working for me kinda
literally been trying to get a hint framework done for about 2 weeks and every time i go to work on it nothing
i have a working element at least
300 is default position, that's what i did to fix it, because that util method ur using always threw the text under the viewport for me
also you dont need to run .Update() whenever you add a hint
public static void ShowString(this ReferenceHub hub, string text, float duration = 3f, float? position = null)
{
DisplayCore.Get(hub).SetElemTemp(text, position ?? 300, TimeSpan.FromSeconds(duration), new ());
}```
this is my code
hmm alright. ill have to build a shitton of features off of it but ill try that now
rue v3 isnt that difficult, but its in beta and ofc not everything works
i find it very difficult ngl. a lot of it goes right over my head, but im trying to make sense of it
i mean
v3 for me was
RueDisplay.Get(ev.Player).Show(_watermarkTag, _aliveWatermarkElement);
_aliveWatermarkElement is just a BasicElement
id be fine doing basic elements, given i can update the text. because eventually ill want features like fade in/fade out , 2-3 on screen simultaniously etc.
and i have a working version with HSM but its laggy at scale* and the only person that knows it that was willing to help is out of country
i mean you can do DynamicElement to auto update it, or when the thing refreshes it will try build it again
im a bit confused why u would make ur own hint framework based on top of ruei/hsm
because i just needed more features from it, that and a way for all other plugins in the codebase to just call the hint framework rather than make new elements and etc every time i want a new hint
wait does it not show docs
i dont have the nuget
I just use HSM 

me when TPS drops when high player counts
brainrot incoming
idc what I use as long as it works. which neither do 
im so happy i removed my stylecop
Make your own 
im gonna end it all
Just get better hardware smh
ruei 2 and 3 both do 
perhaps a...
i literally just copy pasted Lumi code for the hint and it didnt work on local
i take it back
Why did you just drop that like you're about drop the nastiest slur
just copy paste. nothing else
i cant see what ur responding to
this dndt work
externally, anytime i want to call a hint
The only time I've seen this happen is when another plugin is showing a hint
same as basegame calling
oh






