#plugins-dev-chat

1 messages · Page 126 of 1

celest thorn
#

like guys

#

in this bed

hearty shard
#

also update to latest rider version

subtle ravine
#

quick questions

#

transparently_modded_server i heard that transparently modded can also apply in plugins code?
Never used it yet so gimme quick info

subtle ravine
# hearty shard

So if 1 single plugin has it the server will not have modded flag?

hearty shard
# subtle ravine 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

subtle ravine
#

okay so there is not a chance

#

thanks

hearty shard
#

what r u actually doing

celest thorn
#

i would say don't touch it

#

and done

subtle ravine
#

just checking one thing

#

someone has vanilla server with plugins

#

and the flag in settings is set to false

#

im confused

hearty shard
#

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

subtle ravine
#

yeah its supposed to

#

but its not

#

so thats why im confused

upper vapor
#

at beryl?

#

at jesus?

#

at central servers?

shy karma
#

ill try this out when i get home later and see if my hitboxes still decide to be fucked up TwT

slate flume
#

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

slate flume
#

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

restive turret
#
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));
    }
}
hearty shard
#

guh

slate flume
hearty shard
#

good

#

do it more

slate flume
#

I bet I could make a better dummy movement function than all of you nerds

tepid sluice
#

nulll

slate flume
slate flume
#

Let me finish my cocktails

restive turret
#

This is not only dummy movement it do object moving too

slate flume
#

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

restive turret
#

I think even PlayerFollower has dt

slate flume
#

My point still stands

hearty shard
#

okay ur point can stand while they can also point it out

restive turret
#

My testing server/pc runs perfectly at 60 fps

slate flume
#

His point can stand, just not as a counter to the point I just made

slate flume
#

Not everyone has the same luxury

restive turret
#

Literally every search that i checked made "plz use dt "

slate flume
#

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

restive turret
#

If you provide a solution not just doing critics i would welcome it

slate flume
#

The dummy can continue to work towards the ReceivedPosition even with server stuttering because it sync to the client

slate flume
#

Just give me a bit to

#

You know

#

Finish my drinks and get back to my room

slate flume
#

Does it approximate DeltaTime based on multiple frames

restive turret
#

Burn your pc

upper vapor
#

it
smooths the delta time

#

yes

hearty shard
#

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.

slate flume
#

That still doesn't fix the problem smh

#

ReceivedPosition should be overcompensating for DeltaTime

upper vapor
#

it will be significantly less noticeable

restive turret
#

Not my problem

upper vapor
slate flume
#

You're being very inconsiderate

restive turret
#

I never said use it

#

I shown my version

slate flume
#

Alright whatever I'll propose a better solution for this user when I get back to my room

restive turret
#

The propose is just tp to destination

slate flume
#

I don't want to argue with you anymore we're not going to meet any common ground

restive turret
#

Have fun then

slate flume
#

I will

restive turret
#

Going back to implement dtls

storm bridge
#

Hi

slate flume
restive turret
#

Didn't you mixed deltaTime and fixedTime?

#

Ah ye most places says "do lerping too"

slate flume
#

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

restive turret
#

ah so RecPos should be predicting the next move

slate flume
#

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

hearty shard
#

multiply by 50

restive turret
#

my speed when i set to more than 10 it just flies to pos

slate flume
#

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

celest thorn
#

guys how do you sell a human body?

upper vapor
celest thorn
#

you want it?

#

fresh

upper vapor
#

no

celest thorn
#

sad

#

but sadly i cannot move it

#

i need the debugger tool

#

but thats client side

static meteor
#

There was a video of someone using it

#

And the itemtype for it still exists

upper vapor
#

ItemType.DebugStick

celest thorn
unique crane
#

Shes a witch

celest thorn
royal mica
#

lovely CI pains

unique crane
#

I love when

#

Extra points for

royal mica
#

I love the commit history when I touch any CI related files

lethal cradle
#

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?

hearty shard
#

afaik

#

you can always go to the 096 targets and check it urself what its doing

lethal cradle
#

wait that's not a default unity feature is it?

hearty shard
loud condor
#

How to create custom item via LabApi?

lethal cradle
#

and how does that work?

hearty shard
hearty shard
#

you can decompile it

#

do you use rider

#

or VS

lethal cradle
#

i dont have the game decompiled

#

im too lazy

hearty shard
#

so you use VS?

lethal cradle
#

yeah

hearty shard
#

ah

lethal cradle
#

wait

#

vs as in visual studio

#

right?

hearty shard
#

yes

lethal cradle
#

ok yeah i wanted to make sure theres not like a modded variant of the game called vs

hearty shard
#

wait does VS rly not have a decompiler built in

lethal cradle
#

i dont think so?

#

i don't have the game decompiled in the first place

hearty shard
#

ctrl + left click VisionInformation

lethal cradle
#

?

#

i dont have the game

hearty shard
#

oh

#

u dont?

lethal cradle
#

i mean i do in steam but like

#

i havent made it into a unity project

hearty shard
#

i mean

#

a plugin

lethal cradle
#

no i dont

hearty shard
#

i thought you were writing a plugin

lethal cradle
#

nah

hearty shard
lethal cradle
#

just wanted to know how 096 works xd

hearty shard
#

busy rn so cant do it for you

lethal cradle
#

alr ty tho

static meteor
hearty shard
grand flower
#

rider > all

hearty shard
#

all > rider

hearty shard
#

@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;
        }
lethal cradle
#

that

#

looks very inefficient

#

and very inaccurate

hearty shard
#

i cant send vision info

#

too long

lethal cradle
#

thats fine

hearty shard
#
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

lethal cradle
#

wait thats decompiled code right?

hearty shard
#

yes

lethal cradle
#

ok yeah that explains it

#

that seems way too overcomplicated tho tbh

hearty shard
#

its 049, 173, 096 minimum

#

i dont remember what else uses it

lethal cradle
#

hmm fair enough

hearty shard
#

1344 + the sound track that plays if ur alone uses it too

lethal cradle
#

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

hearty shard
#

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

lethal cradle
#

so all you have to do is get the player's x and y pixels and then just do simple maths

true cedar
#

be quiet eve

#

ugh

hearty shard
#

shut UP

lethal cradle
#

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

hearty shard
#

vision information isnt only used by 096

#

and same floor might be used by smth else

lethal cradle
#

yeah it could be the exact same thing for peanut

hearty shard
#

ya they all use the same method

lethal cradle
#

or anything that needs los

#

but

#

there has to be a reason why they use that specific method of doing the LOS check

hearty shard
#

096, 049, 049-2, 173, 1344, 1853, alonetrack

lethal cradle
#

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

lethal cradle
#

collider that's used as a trigger

hearty shard
#

yes...

#

ig youd have the collider be around the player

#

a big ol collider

lethal cradle
#

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?

hearty shard
#

usually

lethal cradle
#

hope they see this cuz i really wanna know why they made it this way

hearty shard
#

afaik its old code

#

so prob from hubert

#

ping hubert (dont actually)

lethal cradle
#

Ah

hearty shard
#

idk

#

it doesnt necessarily have to be hubert

lethal cradle
#

would be funny if i pinged one of them instead of the hubert

lethal cradle
#

i do wonder if the code was inspired by the CB implementation

hearty shard
#

someone wrote it, and its been there for years

lethal cradle
#

fair enough

true cedar
#

it was me

#

i wrote it

hearty shard
#

shut up

lethal cradle
#

@grok is this true?

true cedar
#

grok: yea

#

wow guys

restive turret
celest thorn
#

me sad

severe grail
#
        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?

hearty shard
#

prob

severe grail
teal junco
lethal cradle
#

lol

lethal cradle
#

im curious

hearty shard
#

Eg elevator or door

lethal cradle
#

ah

#

interesting

hearty shard
#

i dont have it but thats what i remember

lethal cradle
#

why would it be relative to a door though

hearty shard
#

doors are around the facility a lot

#

So they use doors as "waypoints"

teal junco
#

is there a reason for waypoints besides elevators? not too sure when they were introduced

lethal cradle
#

interesting

#

wonder if nw is cooking a navigation system

#

or is it just leftover code from the SNAV days?

grand flower
#

Since they use relative positioning it's easier to re-use something that's always on the map anyway for waypoints

spare zodiac
#

fun fact, you can even make extension for generics trollface

grand flower
#

wtf kind of syntax is that

#

extension blocks huh

#

cool

spare zodiac
#

we trust the process

grand flower
#

neat

shy karma
worthy rune
shy karma
# worthy rune 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);
            }
        }
grand flower
#

try calling ServerOverridePosition after setting ReceivedPosition

#

use the same position as the received one

#

see if that helps

teal junco
#

can we make a way to disable smallcaps in hints 🥺

worthy rune
true cedar
#

u already can

true cedar
teal junco
worthy rune
#

you will need to interpolate the position on the server if you want backtracking to work

teal junco
true cedar
teal junco
#

idk why my first thought was </smallcaps> 😭

true cedar
#

if only

teal junco
#

ur a genius thanks very much

true cedar
#

:3

teal junco
true cedar
#

ive been working with hints for a looooong time

teal junco
#

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.

upper vapor
#

that's kind of a side effect

upper vapor
grand flower
#

doesn't matter as much as people make it seem to be

teal junco
#

but i dont see how it becomes 7

true cedar
#

okay but imagine 5 bytes times ten trillion

true cedar
#

wait

#

wouldn't padding make that the same size basically lmfao???

teal junco
upper vapor
true cedar
#

oh

#

yea

worthy rune
upper vapor
grand flower
#

In this instance the processing cost outweighs any kind of perceived benefit from reducing the bandwidth cost

true cedar
#

okay but again

#

imagine five times ten trillion

grand flower
#

lmk when the game can handle more than 50 players without dying and then we can talk about that mmLul

#

those 5 bytes are cheaper than all the relative positioning computations

#

(i know you're memeing)

true cedar
#

i would never

grand flower
#

Don't tell Northwood Unreal uses doubles for positions

#

They'll have a heart attack

restive turret
#

Omg 8*3 bytes

#

And 8*4 for rot

#

What if it's a decimal?
16 bytes

grand flower
#

wat

restive turret
#

C# has decimal (i think that's the name) that is 16 bytes

grand flower
#

If you ever use decimal for vectors/quats you need help

restive turret
#

Why, i want the perfect positionsClassDTroll1

grand flower
#

Simulating ants in SL time

restive turret
#

The real ray tracing

true cedar
#

i fucking hate the names they choose for types

#

like why decimal

#

well

#

ik why decimal

#

but its just an unhelpful name

grand flower
#

quadruple was kind of a mouthful

restive turret
#

QBit

true cedar
#

name it f128 or like d128

#

pull a rust

celest thorn
#

Rust

restive turret
#

No

celest thorn
#

Rust

slate flume
#

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

grand flower
#

Riptide said it's likely backtracking

#

And considering shooting ahead works it probably is

swift nexus
#

animation information isn't a part of backtracking

grand flower
#

Always wondered why not just do a simple capsule check

#

cheaper

worthy rune
grand flower
#

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

grand flower
#

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

worthy rune
grand flower
#

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

worthy rune
#

i see

grand flower
#

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

worthy rune
#

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

grand flower
#

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

slate flume
slate flume
slate flume
grand flower
#

Tbh the same issue was happening while they werent moving and shooting a moving dummy

#

Backtracking defo has issues

slate flume
worthy rune
slate flume
worthy rune
#

im pretty sure it was a big issue, would be surprised if it wasnt

grand flower
slate flume
#

I can try recreating it with and without dummies to demonstrate

#

But that'll take some time

grand flower
#

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

worthy rune
slate flume
#

But suffice it to say I don't think the problem is just with dummies

grand flower
#

Sweet

worthy rune
#

i think jesusQC is the one working on it

grand flower
#

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

worthy rune
#

not sure i havnt look to much into the new system

grand flower
#

I'm still sad at the amount of network messages being used for stuff, really hope it gets a refactor pass one day

swift nexus
unique crane
#

What's wrong with that

grand flower
#

Heavy, could be lighter

unique crane
#

How...

swift nexus
#

consistent reproduction steps have been difficult, and the exact cause for why that scenario occurred is hard to confirm

unique crane
#

Your sending message "this person fired a gun"

#

That's not crazy idea in my opinion

grand flower
#

Full server, everyone has the FMG, starts shooting all at once

#

RPC spam

unique crane
#

And

#

Mirror does this thing where it merges messages in one packet

grand flower
#

That's... not good? They have overhead.

#

Nice feature but there's a way cheaper alternative

#

sec

worthy rune
# swift nexus with what change?

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?)

swift nexus
#

would be something good to look into

swift nexus
unique crane
grand flower
#

Sending a link to something that's Unreal related but the logic can be applied to Unity/Mirror

unique crane
#

Okay

grand flower
#

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

swift nexus
#

I've noted this down on the old QA servers

grand flower
#

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

unique crane
#

I guess that's something that can be looked at in future

grand flower
#

aye

#

to note that property replication in unreal is unreliable

unique crane
grand flower
#

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

unique crane
#

Reliable

grand flower
#

Ordered?

unique crane
#

Nop

grand flower
#

phew

unique crane
#

Default is just reliable

#

Or wait

#

Is the other value ordered or unordered

#

Uhhhummmm

#

Idk

grand flower
#

uhhhh

#

lemme check (and pray)

unique crane
#

I would have to look

#

But I'm in bed

grand flower
#

im in bed too

#

hah

#

um

#

you sent this here a while ago

#

so im gonna assume it's reliable ordered

unique crane
#

Yea

#

Seems like it

grand flower
worthy rune
#

yeah

#

big side effect is any packet loss will causes massive delay

#

which is why stuff is being reworked to use unreliable/unordered

grand flower
#

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)

worthy rune
#

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

grand flower
#

at the very least there's an interval

#

And they'd hopefully not be ordered

worthy rune
#

pretty sure it uses channel 0 by default

grand flower
#

for sync vars too?

worthy rune
#

yeah

grand flower
#

oof

worthy rune
#

gonna double check

grand flower
#

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

swift nexus
worthy rune
#

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

grand flower
#

Ay

swift nexus
#

@grand flower dw the movement rewrite from Jesus sets it to unreliable

#

he's still cooking on that though

grand flower
#

I think I've just been waaaaay too spoiled by Unreal's networking layer heh

unique crane
grand flower
#

so question actually

unique crane
grand flower
#

Jesus is rewriting movement right

#

so um

#

why not toss out relative positioning?

unique crane
#

That's because of elevators

#

No

#

Decision was clear on that

grand flower
#

Don't need it for elevators, I've talked about other more standard solutions to the same problem

#

huh

unique crane
#

It's staying afaik. It was discussed in some channel some time ago

grand flower
#

rip

unique crane
#

But some optimalization wouldn't hurt

swift nexus
#

@limber silo ^

unique crane
#

Instead of going through each waypoint

#

And be like

#

"are you in this"

grand flower
#

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

unique crane
#

Such as

grand flower
#

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)

unique crane
#

Yes that was the intention

#

The less networking is not the primary goal for that

#

Just moving elevators

grand flower
#

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

unique crane
#

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

grand flower
#

Yep, and generally the way it's done is by having a "max distance to floor" leniency setting

unique crane
#

Yeah so you just do bounds check

grand flower
#

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

unique crane
#

Hmmmmmm

#

Maybe we can forward this to beryl or someone

grand flower
#

I'd be happy to answer questions if it ever goes that far

unique crane
grand flower
#

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)

slate flume
#

Titanfall uses this system and it has a couple useful movement bugs surrounding it

slate flume
restive turret
upper vapor
#

@slate flume here's some juicy linq

icy knoll
hearty shard
upper vapor
icy knoll
#

that is true, but the nanoseconds ax...

upper vapor
#

okay i'll optimize sometime

hearty shard
#

only bad developers optimize

upper vapor
#

where's the labapi event debug switch

#

i wanna turn it off

#

idk why it shows at all

unique crane
upper vapor
#

yea

unique crane
#

You have debug labapi dll on the server then

upper vapor
#

rigth

#

cuz i compiled it

#

i forgor

#

thx

unique crane
#

1234567890098/1234 here is my bank account

upper vapor
#

😭

hearty shard
#

Guh

icy knoll
#

don’t forget

hearty shard
#

mmmm linq

#

wait thats not the right branch

#

static mmm

hearty shard
#

reminds me

slate flume
#

Can I get a "hell yeah" in the chat for linq

hearty shard
#

should make secretapi transparently modded

#

right

#

hmm

unique crane
hearty shard
#

oh

#

yea but im an api

#

it doesnt do anything to affect gameplay

unique crane
#

That kinda does impact gameplay

hearty shard
#

unless you use the api to then do so with it

#

how?

unique crane
#

Wait so secret api

#

is not dependency

#

but plugin?

hearty shard
#

its a plugin dependency api

hearty shard
#

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)

unique crane
#

I would ask verif then

#

for final word

hearty shard
#

rah

#

ill leave it commented for now

#

but yea it doesnt do anything unless im stupid and mess up Trol

#

me when i make everyone fly to the moon

restive turret
#

You can change badgetext

#

You can even dynamicly edit it

slate flume
slate flume
restive turret
#

You can even fake sync it

slate flume
hearty shard
#

@upper vapor also i think rider broke the summary parsing

#

😭

#

actually

#

only one file

#

tf

upper vapor
#

huh

#

how can that be line 2

hearty shard
#

i dont know

#

wait

#

is it because its inside an extension?

upper vapor
#

do you have BOM?

hearty shard
#

bom?

upper vapor
#

could be

hearty shard
#

this one is fine

#

and its outside the extension

#

just checked another extension thing and yea

#

its broken

#

tf

#

good to know at least

true cedar
#

vs better

hearty shard
agile tartan
#

I know some people are creating minimaps using TMP or Primitive, but how do they get the map structure?

true cedar
unique crane
hearty shard
#

what the hell david

unique crane
#

Spot the issue

hearty shard
#

get out

slate flume
#

What the fuck david

hearty shard
slate flume
#

^

#

For real

hearty shard
#

oh.

burnt hearth
#

hi

slate flume
#

Hi FBI

burnt hearth
#

yo

#

i lurk

hearty shard
burnt hearth
#

soon

upper vapor
slate flume
hearty shard
# agile tartan I know some people are creating minimaps using TMP or Primitive, but how do they...

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

upper vapor
#

😭

hearty shard
slate flume
celest thorn
#

Hello

hearty shard
agile tartan
slate flume
#

I don't wanna deal with SSSS :'(

hearty shard
#

i dont wanna either

#

i mean ill keep doing it

#

but

#

holy macaroni

agile tartan
hearty shard
agile tartan
#

thank you

slate flume
#

How does 079 do it

#

Does 079 experience the same room icon bug

hearty shard
#

public MonoBehaviour[] _zoneMaps;

#

the what now

hearty shard
# slate flume How does 079 do it
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

agile tartan
hearty shard
#

its client that decides the scale of 106 map

slate flume
#

Love it when NW decides not to sync shit

hearty shard
#

to me it makes sense

slate flume
hearty shard
#

but yea they could add a network message

#

like they did scale

slate flume
#

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

hearty shard
#

ya

#

nw could add a sync message

true cedar
#

istg

hearty shard
#

same way they handle position, same way they handle scale

#

but yk

#

they havent yet

#

you havent suggested it Trol

true cedar
#

u guys will complain about not having a sync message for the strands of hair on players

hearty shard
#

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

true cedar
#

okay that is a bit dumb but

hearty shard
#

it mightve been used before

#

its silly

true cedar
#

do i get off my ass and fix ruei v3

hearty shard
#

go to sleep

#

zzzz

unique crane
#

Sleeping is good

restive turret
#

Sleeping 16h a day

true cedar
hearty shard
#

zzzz

true cedar
#

true

restive turret
hearty shard
restive turret
#

Go sleep you too

hearty shard
restive turret
#

Busy being dead because y'know you murdered me

hearty shard
#

good

true cedar
#

without hintbuilder

#

:3

hearty shard
#

guh

restive turret
#

What if

hearty shard
#

its all your fault

icy knoll
#

ive been waiting... for ruei v3 to be fully released... for 20 years! /j

true cedar
true cedar
#

OH

#

FUCK

hearty shard
#

💀

#

you cspace it and then </size> it

icy knoll
#

goofy

hearty shard
#

that does quite explain it all

#

why theres a cspace=50% for me 💀

true cedar
#

ummmm

#

well at least it isnt a parser issue

#

although why does the cspace not show

hearty shard
#

yea its a hint builder

#

issue

#

or ruei space

hearty shard
#

thats the issue

true cedar
#

i mean like

#

yea why isnt it parsed

hearty shard
#

oh

#

you mean why its not closed by parser

true cedar
#

NO

#

why is it

hearty shard
#

um

true cedar
#

not invisible

hearty shard
#

go fix it

true cedar
#

fuck u

restive turret
#

Bc not closed

hearty shard
#

and then after that

restive turret
hearty shard
#

u gotta make the changes for me

restive turret
#

A quick (1h) naptime

true cedar
#

ill do what i want

slate flume
restive turret
#

I dont use hints so do whatever u want

hearty shard
#

how does one handle a merge conflict properly in rider

#

i forgot

upper vapor
#

you click "merge"

true cedar
restive turret
#

Skilll issue

true cedar
#

ruei is the most advanced thing ever created ever

upper vapor
hearty shard
# upper vapor you click "merge"

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

hearty shard
#

i tried merge

upper vapor
#

show screenshot

hearty shard
restive turret
upper vapor
#

yeah you click merge

#

crazy

hearty shard
#

oh

restive turret
#

Altf4

hearty shard
#

i just reaized

#

the middle is the merged

upper vapor
#

big blue button

#

yeah

restive turret
#

git merge --hard --force

hearty shard
#

not all the way to the right

#

WHYS IT SO SMALL I HATE IT

upper vapor
#

read the top comment (i miss it sometimes too)

true cedar
#

i dont actually have to do proper ui

hearty shard
#

the middle is removing stuff i do want

#

the changes i do want is what it removes 💀

upper vapor
#

then click the arrow you want to add

#

if you want to discard, click the x

hearty shard
#

oh

#

i se

#

e

#

i thought i did it

#

do i just commit?

upper vapor
#

no

hearty shard
#

ok good

#

idk then 😭

upper vapor
#

what is happening

hearty shard
#

i am NOT used to this

upper vapor
#

this is very little context

hearty shard
#

and now i haveaabort

#

and thats rlyi t

upper vapor
#

how about you screenshot the ide so i don't only see the ants

#

only abort? 😭

hearty shard
#

cant even abort 💀

#

ok i could through github desktop

celest thorn
#

wait ruei-3 works???

upper vapor
celest thorn
#

its released?

upper vapor
#

it's stable mostly

celest thorn
#

CRAZY

upper vapor
#

not yet

celest thorn
#

How stable?

upper vapor
#

(not fully at least)

#

@true cedar

celest thorn
#

Like can it crash the server?

#

or not work?

#

will it display?

upper vapor
#

try it and see toomuchtrolling

celest thorn
#

I honestly don't wanna bet

hearty shard
celest thorn
#

because in 1h 30m i have a testing

hearty shard
#

i mean

#

it works

celest thorn
hearty shard
#

its just about porting

celest thorn
#

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

unique crane
#

any% (bugfull)

celest thorn
#

PLEASE DISPLAY TIMER

#

FUCK

true cedar
celest thorn
#

I think i foudn a bug already lol

true cedar
#

huh

celest thorn
#
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

true cedar
#

there u go

celest thorn
#

im speedrunning

#

so

warped prairie
#

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;
} 
warped prairie
#

2

#

ye

hearty shard
#

you need a temp one?

#

i have the code somewhere...

warped prairie
#

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

true cedar
#

idk anything about ruei v2 anymore

hearty shard
#

i uh

#

deleted my temp thing

#

ill find it in commits somewhere

#

gimme a bit

warped prairie
#

idc what it is as long as i can get something working pepeLA

#

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,

hearty shard
#

i got v3 working for me kinda

warped prairie
#

literally been trying to get a hint framework done for about 2 weeks and every time i go to work on it nothing

hearty shard
#

i have a working element at least

icy knoll
#

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

warped prairie
#

hmm alright. ill have to build a shitton of features off of it but ill try that now

hearty shard
#

rue v3 isnt that difficult, but its in beta and ofc not everything works

warped prairie
#

i find it very difficult ngl. a lot of it goes right over my head, but im trying to make sense of it

hearty shard
#

i mean

#

v3 for me was

#

RueDisplay.Get(ev.Player).Show(_watermarkTag, _aliveWatermarkElement);

#

_aliveWatermarkElement is just a BasicElement

warped prairie
#

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

hearty shard
true cedar
#

im a bit confused why u would make ur own hint framework based on top of ruei/hsm

hearty shard
#

but v3 uses a tag system

#

so Tag is the id of the hint basically

warped prairie
true cedar
hearty shard
slate flume
#

I just use HSM troll

warped prairie
icy knoll
hearty shard
#

brainrot incoming

warped prairie
#

idc what I use as long as it works. which neither do ICommittedTaxFraud

hearty shard
#

im so happy i removed my stylecop

warped prairie
#

im gonna end it all

slate flume
hearty shard
#

perhaps a...

hearty shard
#

s-s-s--s-s

#

SKILL ISSUE?!

warped prairie
#

i literally just copy pasted Lumi code for the hint and it didnt work on local

hearty shard
#

show full

#

@true cedar im stealing ruei and claiming it as my own Trol

true cedar
#

okay

#

gl maintaining it

hearty shard
#

i take it back

slate flume
warped prairie
hearty shard
hearty shard
#

you dont even have a license

warped prairie
hearty shard
#

when is showhint claled

#

called

warped prairie
#

externally, anytime i want to call a hint

slate flume
#

The only time I've seen this happen is when another plugin is showing a hint

warped prairie
#

same as basegame calling

true cedar
hearty shard
#

do i put cc0