#plugins-dev-chat

1 messages ยท Page 100 of 1

restive turret
#

I even have difficulties with using unity just for khhmm reversing prpusese

cyan crown
#

dude making my own version is probably better lol

#

i'm gonna update to Unity 2019.4 since i got this error for C# 6.0

restive turret
#

ye update to tat

#

tbh i would just update to latest

#

and try to fix bugs

cyan crown
#

i can just use open it to unity 6.2

restive turret
#

ye sure

cyan crown
#

fuck it i'm upgrading it lol i still have a backup for the decompile

restive turret
#

make a backup

cyan crown
#

i already have it

#

fucking hell man its gonna reimport every single asset

#

its gonna take a while again

#

see you in 2 hours

restive turret
#

:DDD

tulip kiln
#

Are you sure making a clone based off of 8.0.1 is a good idea? The game's code was very messy back then

glad pagoda
#

decompiling the code is breaking the EULA

soft turtle
#

I hate these errors. How to understand why this happened ๐Ÿ˜ญ
Server crushed
Caught fatal signal - signo:11 code:1 errno:0 addr:0x7d9f20e0c970

glad pagoda
#

so @harsh thorn could ban you

restive turret
cyan crown
tulip kiln
cyan crown
#

but if i don't use SL code is it fine?

restive turret
#

also this would be like hella funny since many IL patch and stuff require to use the decompiled code

glad pagoda
glad pagoda
#

(bugfixing and interoperability)

restive turret
#

and personal usecase

#

I think

glad pagoda
#

no

cyan crown
#

i still need to get viewmodels from this specific version so i can use them on my version of SL

glad pagoda
#

and afair no other region has the law make it more permissive than EU does

tulip kiln
glad pagoda
cyan crown
glad pagoda
#

with the exception of some 3rd party ones that we do not control the licensing of

cyan crown
#

unity opened Slejm

#

few errors seem to be fixable i guess

restive turret
#

haha

#

wait till you have more

#

I know bc i did the same thing

#

fixed like 10 issue, 100 more popped up

cyan crown
glad pagoda
#

FYI iirc we did DMCA people that decompiled client code in the past

cyan crown
restive turret
#

did they shared the code or what?

glad pagoda
#

ye

restive turret
#

ah

#

I meant as long as you dont share you can somewhat use it i think

#

dont exactly remember spec things or stuff

glad pagoda
#

well as long as you don't share it and don't tell anyone we can't know KEK

restive turret
#

but sharing is yes indeed you can track

unique crane
#

Cant hurt anyone if you wont tell us

cyan crown
#

its even more broken

restive turret
#

but for example a no name guy who decompile the release version for itself cantr trace it

cyan crown
unique crane
#

I mean that is obvious your missing a package...

#

silly

cyan crown
#

i deleted it :'D

restive turret
#

real

cyan crown
#

all gone

cyan crown
#

๐Ÿฅฐ

restive turret
cyan crown
#

i just redownloaded the package lol but a newer version

restive turret
#

sometimes I dont even know how they compiled it

cyan crown
#

the game?

restive turret
#

ye

#

with magic and hope

cyan crown
#

i used asset ripper

restive turret
#

i meant NW

cyan crown
#

oh i see yeah i'm clueless as well

#

if this shit works dude i'm gonna be so happy

restive turret
cyan crown
#

since there is an error it probably wouldn't even take a .4 seconds to build

restive turret
#

ah so you still fixing the trillioniths errors

cyan crown
#

as you said fix one the other one appears

#

this is simpler then the other one

restive turret
#

tehehehe

hearty shard
#

what the flip?!

restive turret
cyan crown
#

i think i fixed it

#

but i need to import fucking mirror

hearty shard
#

Is Mirror even real

cyan crown
#

yeah :'D

hearty shard
#

@unique crane when make sl into lua

cyan crown
#

๐Ÿ’€

tulip kiln
#

One step closer to lua client

restive turret
#

when make a new prog lang ?
SL++#_

cyan crown
#

yeah scpsl gonna get its own engine

#

will be made in 1 year trust me

restive turret
#

!remindme 1y

regal lakeBOT
cyan crown
#

they gonna hire 200 programmers work all day on scpsl own engine

#

!remindme 50y

regal lakeBOT
restive turret
#

I mean

#

lmao

cyan crown
#

!remindme cancel

regal lakeBOT
cyan crown
#

!remindme 50y cancel

regal lakeBOT
cyan crown
#

๐Ÿ’€

#

this fucking bot

#

ok dude remind me in 50 years

restive turret
#

Factorio use lua and c++ so

cyan crown
#

!remindme Cancel

regal lakeBOT
hearty shard
#

Lel

restive turret
cyan crown
#

how do i cancel this shit

restive turret
#

crazy

hearty shard
#

!remindme

regal lakeBOT
cyan crown
#

๐Ÿ’€

hearty shard
#

!help remindme

regal lakeBOT
# hearty shard !help remindme
! | C.A.S.S.I.E. Help Menu
Syntax: !remindme [time_and_optional_text]
Create a reminder with optional reminder text.

Either of the following formats are allowed:
!remindme [in] <time> [to] [reminder_text]
!remindme [to] [reminder_text] [in] <time>

<time> supports commas, spaces, and "and":
12h30m, 6 hours 15 minutes, 2 weeks, 4 days, and 10 seconds
Accepts seconds, minutes, hours, days, and weeks.

You can also add every <repeat_time> to the command for repeating reminders.
<repeat_time> accepts days and weeks only, but otherwise is the same as <time>.

Examples:
!remindme in 8min45sec to do that thing
!remindme to water my plants in 2 hours
!remindme in 3 days
!remindme 8h
!remindme every 1 week to take out the trash
!remindme in 1 hour to drink some water every 1 day

cyan crown
#

this fucking bot

#

!remindme 67000y

regal lakeBOT
cyan crown
#

lol

#

!remindme 500y

regal lakeBOT
cyan crown
#

ok dude

#

i'm not gonna be alive at that time

hearty shard
#

!remindme 1y why am i still on this forsaken game

regal lakeBOT
cyan crown
#

(maybe) there is a chance

#

if i became a robot

restive turret
#

ye sure

#

GLaDOS

cyan crown
#

took me ages to fix the first bug so im gonna fix this shit then gonna take me years to fix the others

slate flume
#

That's crazy

icy knoll
#

or if the bot team decides to not use the old system when and if bot engineers come back

slate flume
#

Remind me not to use it

#

The idea of a permanent reminder rattles me to my bones

#

I generally don't like having things permanently online

restive turret
static meteor
#

Truly a Northwood moment

restive turret
#

Truly assetripper moment

#

I bet it moved to GlobalUsings

#

But since UnItTY it just rewrote the csproj

cyan crown
#

its the fuckass server relay script dude

restive turret
#

Remove it

#

You dont need server relay

cyan crown
#

as soon as i remove it everything else will break lmao

#

yeah fuck this shit i'm not fixing it lmao

restive turret
pine parcel
#

If no one got back to you, I had a rather roundabout way to do this, but my code is probably not the best to copy, still I'll post it incase it helps

public void On079Pinged(Scp079PingedEventArgs ev)
{
    if (ev.PingType == LabApi.Features.Enums.Scp079PingType.Human)
    {
        Room room = Room.GetRoomAtPosition(ev.Position);
        Dictionary<Vector3, Player> positions = new Dictionary<Vector3, Player>();
        foreach (Player player in room.Players)
        {
            positions[player.Position] = player;
        }
        Player target = HelperFunctions.GetClosestPlayer(positions, ev.Position);
    }
}

public static Player GetClosestPlayer(Dictionary<Vector3, Player> positions, Vector3 targetPosition)
{
    Player closestPlayer = null;
    float closestDistance = float.MaxValue;

    foreach (var kvp in positions)
    {
        float distance = Vector3.Distance(kvp.Key, targetPosition);
        if (distance < closestDistance)
        {
            closestDistance = distance;
            closestPlayer = kvp.Value;
        }
    }
    return closestPlayer;
}
restive turret
#

^ target

pine parcel
#

damn, thanks for the optimization lmao

restive turret
#

Remove is human

restive turret
pine parcel
#

hahaha, still I appreciate the help

restive turret
#

Np

#

The getroomatpos is absolutely genius idea

pine parcel
#

thanks!

restive turret
#

Idk which is more efficient

#

While your at it you can try both?
With the GetRoomPos and just with Player.ReadyList

upper vapor
cyan crown
#

Since i need to focus on my game

restive turret
#

Ah yes, a three month long side project

cyan crown
#

Not like 3 months like never side project lmao

restive turret
cyan crown
#

Evil bean

#

He's so stupid he cant climb up ladders

restive turret
#

I said to myself if that bean gonna jumpscare me i fucking gone

dire widget
#

Quick (dumb) question, how can i make a tesla not idle/trigger when a player gets close to it?

restive turret
#

Deny

#

OnTeslaTriggering

#

Or smth

dire widget
#

yeah that's what i did

#

but it still triggers

restive turret
#

Sadge

#

Did you denied it

#

IsAllowed false

dire widget
#

yes

restive turret
#

Show

dire widget
#

same with idling

barren pasture
#

Why would the collider be null here?

pine parcel
#

am I implementing this wrong?

    public void SetPosition(Vector3 dir, float distance, Player player)
    {
        if (player.RoleBase is IFpcRole fpcRole)
        {
            var motor = fpcRole.FpcModule.Motor;

            Transform cam = player.ReferenceHub.PlayerCameraReference;
            Vector3 relDir = cam.TransformDirection(dir).NormalizeIgnoreY();

            motor.ReceivedPosition = new RelativePosition(player.Position + relDir * distance);
            LabLogger.Info($"Moved player {player.Nickname} to {player.Position}");
        }
        else
        {
            LabLogger.Warn($"Player {player.Nickname} does not have an IFpcRole (current role: {player.Role})");
        }
    }

this still doesn't move my dummy. I tried fpcRole.FirstPersonModule, but fpcRole doesn't have a FirstPersonModule definition

slate flume
#

Where are you calling the code?

#

What are you seeing in the console when it runs?

#

Also you can just do player.Camera you don't need to do player.ReferenceHub.PlayerCameraReference

pine parcel
#

this happens inside an MEC coroutine

private IEnumerator<float> MoveToRoom_Centered(Room currentRoom, Room targetRoom)
{
    // 1. Move to center of currentRoom
    Vector3 currentRoomCenter = currentRoom.Shape == RoomShape.Curve
        ? GetCurveRoomCenter(currentRoom)
        : currentRoom.Position;

    while (Vector3.Distance(transform.position, currentRoomCenter) > 2f)
    {
        Vector3 direction = (currentRoomCenter - transform.position).normalized;
        float yaw = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
        float pitch = -Mathf.Asin(direction.y) * Mathf.Rad2Deg;
        pitch = Mathf.Clamp(pitch, -88f, 88f);
        selfPlayer.LookRotation = new Vector2(pitch, yaw);
    
        float distance = Vector3.Distance(transform.position, currentRoomCenter);
        LabLogger.Info("About to use new method to set position");
        SetPosition(Vector3.forward, distance, selfPlayer); //<- right here
        yield return Timing.WaitForOneFrame;
    }
    LabLogger.Info("Reached center of current room");
    //more code further down
slate flume
#

Wait, so you're just trying to move the player to the center of the room?

pine parcel
#

yes, I'm trying to move the dummy to the center of the room, but properly, not janky lol

#

technically I'm trying to write a full pathfinder function to give dummies movement, the best way I figured to do this was to get the current room, find the center, move to the center, get the target room, find the door that both room share, move to the door, then move to center of the target room

slate flume
#
private IEnumerator<float> MoveToRoom_Centered(Room currentRoom, Room targetRoom)
    {
        // 1. Move to center of currentRoom
        Vector3 currentRoomCenter = currentRoom.Shape == RoomShape.Curve
            ? GetCurveRoomCenter(currentRoom)
            : currentRoom.Position;

        while (Vector3.Distance(transform.position, currentRoomCenter) > 2f)
        {
            Vector3 direction = (currentRoomCenter - transform.position).normalized;
            float yaw = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
            float pitch = -Mathf.Asin(direction.y) * Mathf.Rad2Deg;
            pitch = Mathf.Clamp(pitch, -88f, 88f);
            selfPlayer.LookRotation = new Vector2(pitch, yaw);

            float distance = Vector3.Distance(transform.position, currentRoomCenter);
            LabLogger.Info("About to use new method to set position");
            if (dummy.ReferenceHub.roleManager.CurrentRole is not IFpcRole fpcRole) throw new Exception();
            fpcRole.FpcModule.Motor.ReceivedPosition = new RelativePosition(currentRoomCenter);
            yield return Timing.WaitForOneFrame;
        }

        LabLogger.Info("Reached center of current room");
        //more code further down
    }
#

You're doing a lot of work you don't have to do

pine parcel
#

oh, wow

#

I'll try this lol

slate flume
#

Also

#

When you give the motor a received position, it'll keep going to it until it gets there

#

You don't have to update it every frame

pine parcel
#

I'll do some rewriting in that case

slate flume
#

On top of that, if you are moving in a straight line, I presume the camera will stay the same as well, so you don't need to update that every frame either

slate flume
pine parcel
#

ah, yeah that simplifies things

slate flume
#

Lol that's like 3 optimizations back to back

#

Baller

pine parcel
#

lmao, thank you, slowly I'll work these optimizations into all my code

#

I think as I learn more about all the components, I'll stop overcomplicating my life

slate flume
#

Real shit

dire widget
#

I lowkey cant understand why the fuck it always triggers

slate flume
#

Give me a sec

slate flume
# pine parcel I think as I learn more about all the components, I'll stop overcomplicating my ...
private void MoveToCenterOfRoom(Vector3 roomCenter, Player dummy)
{
  if (dummy.RoleBase is not IFpcRole fpcRole) return;
  FirstPersonMovementModule fpcModule = fpcRole.FpcModule;
  fpcModule.MouseLook.LookAtDirection(Vector3.Scale(roomCenter - dummy.Position, new Vector3(1, 0, 1)));
  fpcModule.Motor.ReceivedPosition = new RelativePosition(roomCenter);
}

Now unless I did something really wrong here, this should really be all you need to get this working

slate flume
slate flume
#

I use it myself

#

If that's not working then you're not initializing your plugin correctly

dire widget
#

Every other event works

slate flume
#

You'll have to show code

dire widget
#

1 sec

#
 public override void OnPlayerHurting(PlayerHurtingEventArgs ev) <--- This works
        {
            if (!NetRoleManager.Instance.HasCustomRole(ev.Player, Lucky.Singleton.Config.Ly.RoleId) ||
                ev.Attacker == null) return;
            PlayerDisplay pD = PlayerDisplay.Get(ev.Player);
            PlayerDisplay aD = null;
            aD = PlayerDisplay.Get(ev.Attacker);
            if (RandomNumberGenerator.GetInt32(101) <= Lucky.Singleton.Config.dodgebulets)
            {
                ev.IsAllowed = false;
                pD.AddHint(dH);
                Timing.CallDelayed(2f, () => pD.RemoveHint(dH));
                if (aD != null)
                {
                    aD.AddHint(aH);
                    Timing.CallDelayed(2f, () => aD.RemoveHint(aH));
                }
            }
        }

        public override void OnPlayerIdlingTesla(PlayerIdlingTeslaEventArgs ev)
        {
            ev.IsAllowed = false;

        } <--- this doesnt



        public override void OnPlayerTriggeringTesla(PlayerTriggeringTeslaEventArgs ev)
        {
            ev.IsAllowed = false;
        } <--- this neither

slate flume
#

And you updated the plugin

#

And pushed it on the server

dire widget
#

Og i didnt

#

ah wait

#

yes

slate flume
#

And restarted the round

dire widget
#

Yep

#

like 5 times

slate flume
#

Like full restart?

#

Make sure it's not a soft restart

dire widget
#

dam

#

lemme try that rq

#

i feel quite dumb rn

slate flume
#

Do sr in the server console

slate flume
dire widget
slate flume
#

That doesn't actually restart the server

#

It restarts the round

dire widget
#

yeah ik that

slate flume
#

Sr is a soft restart in the sense that it actually restarts the server, but has people reconnect

#

A hard restart makes it so people don't reconnect

dire widget
#

That's what i've been doing

slate flume
#

Do this

#

Add a Logger statement to the beginning of OnPlayerHurting

#

You say it works, correct?

dire widget
#

Yep

slate flume
#

So Logger.Info("OnPlayerHurting Running")

#

Push the update, restart the server, then tell me if that outputs in the console like it's supposed to when a player is hurt

slate flume
dire widget
#

Yep

slate flume
#

Can I see your plugin entry

dire widget
#

added a logger to the both the idling and triggering and it doesnt even show up in the console

slate flume
#

I want to see how you initialize the events

slate flume
dire widget
#

1 sec

slate flume
#

You can send a screenshot or really anything you don't have to add comments or shit

dire widget
#

( the events are right after the hints )

#

What confuses me is that literally every other event works

slate flume
#

Okay now I'm about to crash out

dire widget
#

?

slate flume
#

The problem isn't obvious and that's upsetting to me

#

I presume all of your references are up to date

dire widget
#

yep

slate flume
#

Do you have any other plugins?

dire widget
#

Yep

slate flume
#

Which ones

dire widget
#

Enabled: an effect visualizer, spectators count, custom zombies, one to give spawn protection to a wave, 3 custom commands and nothing else i think

slate flume
#

Okay so what the fuck

dire widget
#

Yeah

slate flume
#

It's insane to me that it's not calling the events because for everyone else and me it works fine

slate flume
#

Fire

#

Lmk how that goes

dire widget
#

and it still doesnt work

#

i'm going insane

slate flume
slate flume
#

Are your in-game tesla gates from hell or something

#

How are you testing if they're being triggered

dire widget
#

I'm walking through them

#

also tried spawning a dummy infront of them

#

Ok so

#

I fixed it(?)

slate flume
#

What'd you do

dire widget
#

I mean i managed to get the staging server of the vps working ( not gonna dive into why i didnt do it earlier ), i then uploaded the plugin on there and now it just magically works

slate flume
#

I have no idea what that means

dire widget
#

I'm still confused as to why it didnt work on my server

slate flume
#

You mean you put it on a different server and it started working?

dire widget
#

Yep

slate flume
#

And you're 100% sure your server is up to date?

dire widget
#

Yep

slate flume
#

Has all the right dependencies?

dire widget
#

Wat

#

i wrote yep and it just disappeared

#

but yes

slate flume
#

Interesting

#

You might wanna ask david about that or smthn

dire widget
#

I mean as long as it works im not gonna question why

#

That was a quite big waste of time SteamHappy

slate flume
#

@grand flower
I modify 173 blink timer to be shorter than usual
The problem is that when people look away, the "residual" timer decays very quickly
I've been told Dr. Bright's Mayhem got around that and if you're cool with sharing your trade secrets, I'm curious as to how you did that

pine parcel
#

-# Is now a bad time?

slate flume
#

Nah

pine parcel
#

so, fpcModule.Motor.ReceivedPosition = new RelativePosition(targetRoom.Position);

does not move my dummy lol

#

the look seems to work, but not the move

slate flume
#

Maybe make sure the position isn't too far way

#

Try moving the dummy 1m first

pine parcel
#

that seems to work, so how do I fix that, the dummy was in the same room, just somewhat offcenter

slate flume
pine parcel
#

gotcha, I'll try an implementation of that

dire widget
#

Ah almost forgot but thanks for the help @slate flume

slate flume
slate flume
grand flower
pine parcel
#

Cyn, do you know if I need to do the while loops forward, or is there really a max distance they can move?

grand flower
#

Uhhh what are you trying to do exactly?

pine parcel
#

but I found that while the look was working, the move wasn't until I manually brought them closer to the center of the room

grand flower
#

I'd just do that in a component using Update()

slate flume
pine parcel
#

I've got it in a component, how are you suggesting to do this in update?

#

call a coroutine from update, or a regular function?

grand flower
#

No just do your logic in Update

#

Since it runs every frame

#

Move the dummy towards the target position

pine parcel
#

and if I want the ability for the dummy to shoot and such, would I add another component to handle that, or link that logic into the Update() tick as well?

ashen hound
#

Some proxy showcase after rewriting most of code

  • Lobby is custom and its hosted on proxy side soo you don't need to have seperate sl server running for it
  • Proxy keeps your connection always as connected soo when for example server round restarts it will not disconnect you but instead reconnect and if its online it will connect back.
slate flume
#

How the fuck do you redirect players like that I thought that was exclusive to when they were preauth

ashen hound
#

I just reusing preauth from connection which is on proxy

#

player connects to proxy I save pre auth -> connect to other server with same preauth if connection was accepted I switching in background connections and client thinks its connected to that server

slate flume
#

That's mad interesting

ashen hound
#

anyway server can idk crash in anytime and it will connect you to lobby in this case

pine parcel
#

yeah those suggestions don't work, they just lead to the dummy teleporting

#

ah well, I'll have to come back and fix it later

slate flume
#

Sort of how you did originally

#

You don't need to update every frame cause travel isn't instant

pine parcel
#

but using your suggestion with FPC?

slate flume
#

Yep!

pine parcel
#

can I await the movement? how do I know when it's done?

slate flume
#

You got short-distance movement working, so just make it a series of short-distance movements

#

Lemme draft smthn up rq

static meteor
#

This is what i do

        private void MoveTowardsTarget(Vector3 target)
        {
            if (_fpcRole?.FpcModule?.Motor == null)
                return;

            Vector3 currentPosition = transform.position;
            Vector3 direction = (target - currentPosition).normalized;

            float distanceToTarget = Vector3.Distance(currentPosition, target);
            if (distanceToTarget <= _stoppingDistance)
                return;

            Vector3 movement = Time.deltaTime * _speed * direction;
            if (movement.magnitude > distanceToTarget)
                movement = direction * distanceToTarget;

            _fpcRole.FpcModule.Motor.ReceivedPosition = new RelativePosition(currentPosition + movement);
            _fpcRole.FpcModule.MouseLook.LookAtDirection(direction);
        }
slate flume
#

Interesting

pine parcel
#

where is _fpcRole defined?

slate flume
#

I was thinking like

#
private IEnumerator<float> MoveDummy(Player dummy, Vector3 targetPos)
{
  Vector3 direction;
  while ((direction = targetPos - dummy.Position).sqrMagnitude > 1)
  {
    direction = direction.NormalizeIgnoreY();
    if (dummy.RoleBase is not IFpcRole fpcRole) yield break;
    fpcRole.FpcModule.Motor.ReceivedPosition = new RelativePosition(dummy.Position + direction);
    direction.y = 0;
    fpcRole.FpcModule.MouseLook.LookAtDirection(direction);
    yield return Timing.WaitForSeconds(0.1f);
  }
}
static meteor
slate flume
static meteor
#

idk

#

It works for me

slate flume
#

For long distances?

#

They had movement working for them but it didn't work over long distances

static meteor
#

I use it for a waypoint system between rooms

slate flume
grand flower
# slate flume <@1269801279253909565> I modify 173 blink timer to be shorter than usual The pr...
/// <summary>
/// Patches potential seizure inducing issues.
/// Remove the blink timer bonus from breakneck speed since they get distance and speed from it.
/// </summary>
[HarmonyPatch(typeof(Scp173BlinkTimer), nameof(Scp173BlinkTimer.TotalCooldownServer), MethodType.Getter)]
public static class Scp173BlinkCooldown
{
    [HarmonyTranspiler]
    public static IEnumerable<CodeInstruction> GetTotalCooldownServer_Transpiler(IEnumerable<CodeInstruction> instructions, MethodBase method,
        ILGenerator generator)
    {
        var matcher = new CodeMatcher(instructions, generator);
        
        // this._totalCooldown
        matcher.MatchEndForward(
                new(OpCodes.Ldarg_0),
                new(OpCodes.Ldfld, AccessTools.Field(typeof(Scp173BlinkTimer), nameof(Scp173BlinkTimer._totalCooldown)))    
            )
            .Advance(1)
            .RemoveInstructions(matcher.Remaining)
            // return this._totalCooldown
            .InsertAndAdvance(new CodeInstruction(OpCodes.Ret));
            
        return matcher.InstructionEnumeration();
    }
}
        // In our Scp173 component's Awake() method (not that method really but it'd work anyway)
        // Get the blink timer so we can hook onto the observers changed event.
        var role = (Scp173Role)Player.RoleBase;
        if (role.SubroutineModule.TryGetSubroutine(out _blinkTimer))
        {
            // Remove the original subroutine's OnObserversChanged since we'll want to override the logic.
            _blinkTimer._observers.OnObserversChanged -= _blinkTimer.OnObserversChanged;
            _blinkTimer._observers.OnObserversChanged += OnObserversChanged;
        }
/// <summary>
/// Called by the Scp173ObserversTracker when our amount of observers changes.
/// </summary>
/// <param name="previous">The previous amount of observers.</param>
/// <param name="current">The new amount of observers.</param>
private void OnObserversChanged(int previous, int current)
{
    if (!NetworkServer.active)
    {
        return;
    }

    var role = (Scp173Role)Player.RoleBase;
    if (!role.SubroutineModule.TryGetSubroutine<Scp173BlinkTimer>(out var blinkTimer))
    {
        Logger.Error("Failed to get Scp173BlinkTimer subroutine from Scp173!");
        return;
    }

    if (previous == 0 && blinkTimer.RemainingSustainPercent == 0f)
    {
        var count = Math.Min(Player.ReadyList.Count(p => p.Role == RoleTypeId.Spectator), 32);
        blinkTimer._initialStopTime = NetworkTime.time;
        blinkTimer._totalCooldown = SomeRedactedMathInvolvingCount;
    }

    blinkTimer._totalCooldown += 0f * (current - previous);
    blinkTimer._endSustainTime = current > 0 ? -1.0 : NetworkTime.time + 2.0;
    blinkTimer.ServerSendRpc(true);
}
slate flume
#

My actual hero

pine parcel
#

so, here's something interesting, maybe you guys can figure out what this means:

private IEnumerator<float> MoveDummy(Player dummy, Vector3 targetPos)
{
    LabLogger.Info("Starting MoveDummy");
    while ((targetPos - dummy.Position).sqrMagnitude > 1f)
    {
        if (dummy.RoleBase is not IFpcRole fpcRole) yield break;

        Vector3 worldDir = (targetPos - dummy.Position).normalized;
        worldDir.y = 0;

        LabLogger.Info($"[MoveDummy] Target: {targetPos} | Current: {dummy.Position} | Dir: {worldDir}");

        fpcRole.FpcModule.MouseLook.LookAtDirection(worldDir);

        Vector3 localStep = dummy.GameObject.transform.InverseTransformDirection(worldDir);
        LabLogger.Info($"[MoveDummy] Local step = {localStep}");

        fpcRole.FpcModule.Motor.ReceivedPosition = new RelativePosition(localStep);
        LabLogger.Info($"[MoveDummy] Applied RelativePosition = {localStep}");

        yield return Timing.WaitForSeconds(0.1f);
    }
    LabLogger.Info("MoveDummy finished");
}

Everything logs as it should, which implies that the full function is being carried out, I see the dummy turn and face the correct direction, the relative position is listed correctly, but the dummy still does not move

#

trying to figure out what this means? is it possible ReceivedPosition isn't updating properly?

grand flower
#

Call ServerOverridePosition on the dummy after setting the received position

slate flume
slate flume
pine parcel
grand flower
#

Set the Position too

#

after the ReceivedPosition

#

but they should still walk

#

it works for us

pine parcel
#

yeah, they didn't walk, they just teleported

grand flower
#

Don't use a coroutine

pine parcel
#

I'll try it again

grand flower
#

Do it in Update()

pine parcel
#

but then how do I fit in the pathfinding logic at the same time?

grand flower
#

You can still do it in Update()

#

just only every so often

#

But update the dummy's position every frame

slate flume
grand flower
#

It works for us, and there's nothing wrong with that

slate flume
slate flume
grand flower
#

which is why you should do it in Update

slate flume
grand flower
#

How is it unnecessary if it works

slate flume
#

Because you can update it less often and have it work

grand flower
#

Yeah but why

slate flume
#

You're doing extra calculations that you dont need

#

The definition of optimization

grand flower
#

Yeah and you don't optimize until it becomes an issue

#

And if that becomes an issue, idk what you're doing

slate flume
#

Yeah but you could just, keep it optimized in the first place

pine parcel
#

maybe it's also making life harder, but my logic is if through the admin menu, I can have the dummy walk just fine, then why am I unable to use that same method to have my dummy walk normally instead of tick teleports

slate flume
#

Especially if it works better with the solution you're making

grand flower
#

There's larger fish to fry

#

Than just dummy movement

static meteor
pine parcel
pine parcel
slate flume
#

Lmk if it works

grand flower
#

I'm just stating what works for us @ 48 player servers

#

The only optimization required is that we don't send movement updates to our custom dummies

slate flume
grand flower
#

If it works at 48 players you don't need to do premature optimization

slate flume
#

Yeah but for my purposes it works better

#

Because I can do variable timings to prevent unnecessary clutter

#

Instead of having a forced update every frame

#

The reason I'm being so hard-headed here is because it appears to me they already almost have it working

#

Why overhaul the entire thing if one small change will get it working

pine parcel
#

I know my project can pathfind well, I can have it teleport in tests, I just need that natural walking motion, and I've got a solid base

grand flower
#

eh I'm always component oriented for things like these

#

I don't use coroutines to move gameobjects around

pine parcel
#

I appreciate the input from everyone here, it also doesn't help that I'm still new to csharp in general

slate flume
static meteor
#

probably not the best project to do if your new

slate flume
#

It prevents required updates every frame and allows you to pass in a few commands to get the desired result

pine parcel
slate flume
#

Jump into the weeds

grand flower
#

To smoothe things out

#

You can still do your updates every frame

slate flume
#

That's true

pine parcel
#

the movement is working now, I just need to sort out a small bug that causes the dummy to effectively pace over the middle of the room

#

thank you both for your help

slate flume
#

Only normalize if the magnitude is greater than 1

#

The direction I mean

#

Instead of direction.normalized do like

float sqrMagnitude = direction.sqrMagnitude
if (sqrMagnitude > 1) direction /= Mathf.Sqrt(sqrMagnitude)
#

Or something to that effect

#

I'm on mobile so it's weird

pine parcel
#

no worries lol, so I can understand it better, what's the reason for this?

upper vapor
#

๐Ÿ˜ญ

#

why can't you just use normalized

grand flower
#

^

upper vapor
#

oh because you only wanted to normalize directions with a magnitude larger than one

grand flower
#

shouldn't you always normalize though

#

I guess this technically slows it down if you're close to it

upper vapor
#

the nanoseconds

grand flower
#

Your server will thank you for that 0.0004 tps boost

celest thorn
#

Rn i need the nano seconds lol

#

and an entire rack lol

#

I just need a smart way to optimize now

celest thorn
unique crane
#

and what do you do with it

celest thorn
#

In mathematics, the Menger sponge (also known as the Menger cube, Menger universal curve, Sierpinski cube, or Sierpinski sponge) is a fractal curve. It is a three-dimensional generalization of the one-dimensional Cantor set and two-dimensional Sierpinski carpet. It was first described by Karl Menger in 1926, in his studies of the concept of topo...

grave eagle
#

Greate

celest thorn
#

this is used for topology test and how much can you explode a gpu because it can be easily scaled to massive

grave eagle
#

It is fractal

celest thorn
#

and im using as a test to stress the amount of prim

celest thorn
cyan crown
#

Bruh

#

Cap

celest thorn
#

Sponge Dimension

cyan crown
#

๐Ÿ‡ซ๐Ÿ‡ท

tepid sluice
#

Use primitives restore particle in Minecraft

cyan crown
#

Kill this guy ^

celest thorn
#

lol

tepid sluice
#

yo we can acturaly make hypixel in SL

cyan crown
#

Brutally kill this guy^

celest thorn
#

but im 100% sure with meow its possible

#

rn the max we tested was 35k primitive for a client

tepid sluice
#

lmao

cyan crown
#

Yeah its possible with

#

"Meow"

#

๐Ÿ’€

celest thorn
#

you don't like the name?

cyan crown
#

๐Ÿคก

#

No

celest thorn
tepid sluice
#

ur framework or smth?

celest thorn
cyan crown
#

Name DeniedDisagree SteamHappy

tepid sluice
#

@celest thorn so ur pannel also called meow

celest thorn
cyan crown
#

Why did you ping him hes literally in chat๐Ÿ’€ ๐Ÿคก ๐Ÿ‘ฝ

celest thorn
#

we have

MeowEditor
MeowMenuSystem
MeowImporter (which i cannot say what it is, NDA)
MeowUnityProjects
MeowHitbox

tepid sluice
#

meow framework

#

๐Ÿ’€

celest thorn
#

It started as a meme

#

Oh and i forgot

hearty shard
#

guh

celest thorn
#

debug menus for all gamemodes are called Meow Debug

cyan crown
#

Meow system

tepid sluice
#

Eve has evil system

cyan crown
#

Meow Refactoring

celest thorn
tepid sluice
#

i believe it

celest thorn
#

Meow Existence

hearty shard
celest thorn
#

Idk how tf it even started

hearty shard
#

although

#

Good idea

celest thorn
#

you are evil

hearty shard
celest thorn
#

This is a picture of you

tepid sluice
#

๐Ÿ’€

celest thorn
#

Trust me

#

173 would NOT compete

cyan crown
#

Thats worst then 173

celest thorn
#

with A.M

cyan crown
#

That mf robot is evil as fuck

celest thorn
#

i played the game

#

lol

#

i didn't read the book

#

but i know the story

cyan crown
#

Damn๐Ÿ˜ฟ

celest thorn
#

and i know the book is more graphic

tepid sluice
#

wtf is it then

cyan crown
#

Anime

celest thorn
#

created by the US Government

#

but it went rough realizing that humanity is just evil and it wiped out everyone, and now tortures for eternity 5 people

#

which rappresent each sin that man has committed

tepid sluice
#

did u play mcsm

celest thorn
#

I love story games

#

and that is a peak one

tepid sluice
#

yea

#

pama

celest thorn
#

A.M is far worst than pama

#

he controls ANYTHING in the world

#

the world is A.M

tepid sluice
#

jesus

celest thorn
#

like idk how the lore goes deep but he rewrote PHYSICS just to torture them

tepid sluice
#

Humans are 'too inefficient'

hearty shard
celest thorn
cyan crown
#

๐Ÿ’€ mf robot has the source code for the world

celest thorn
#

lol

#

but you know who hates him the most the chinese

tepid sluice
#

y

celest thorn
#

SPoiler ||The chinese and russians are the one taking him down, via a virus||

tepid sluice
#

virus

celest thorn
#

yes

tepid sluice
#

bro it just got source code of the world

celest thorn
tepid sluice
#

how

cyan crown
#

Can they just nuke it

celest thorn
cyan crown
#

Its a pc after all

celest thorn
#

He has a safety protocol

cyan crown
#

๐Ÿ˜ฟ

celest thorn
#

and millions of pcs around the globe

cyan crown
#

Unplug the power cable then

#

๐Ÿ˜Ž

celest thorn
cyan crown
#

Ez fix

celest thorn
#

itself

#

so no

cyan crown
#

Nuke the world

celest thorn
#

But A.M would still be fine

#

lol

cyan crown
#

๐Ÿ˜ฟ

tepid sluice
#

bruh he thinks he is playing as foundation in 5K

cyan crown
#

Dude this fucking robot

#

๐Ÿ˜ฟ ๐Ÿคก

celest thorn
#

Read the entire wiki or watch 3 hours of gameplay of the game

#

which has some banger songs

#

Title: I Have No Mouth, and I Must Scream
Developer: Cyberdreams
Publisher: Nightdive Studios

Release Date: 31 October 1996

"Assume the roles of five different characters, each in a unique environment
Challenging dilemmas dealing with powerfully charged emotional issues
Provocative psychological and adult-oriented themes
Based on Harlan ...

โ–ถ Play video
#

I wanted to present it to the commission for my exam

#

but sadly i couldn't

#

just because the author wasn't in our program

#

Btw there's ALOT of torture, animal cruelty, Death, dismembering, Religion, Magic, like a ton of shit that this game should be by itself a Warning

tepid sluice
#

i can imagine it

celest thorn
#

Idk i know the book is more graphic

#

the game isn't that much

#

but its disturbing sometimes

#

like i found a bit creepy the entire section for the animal cruelty which is a puzzle

#

imagine being a mod and reading all of this shit

modern lark
celest thorn
#

but i mean its a pretty accurate description of a dev suffering

modern lark
#

lmao

celest thorn
#

i know for sure that when we reach A.M levels thats where we need to pull the plug

modern lark
#

Well, it's accurate for me, I keep looking for a way to hide the name when talking on the radio without patches nor redoing the whole process behind the audiomessage

celest thorn
#

best way

#

is Speaker

modern lark
#

yay

#

crying rn

#

you broke my dreams

celest thorn
#

but im doing something much more complicated

#

the greater evil

modern lark
#

Well, I'm gonna propose this change in game

#

brb

celest thorn
#

Crazy

tranquil yacht
#

Hi

#

Does some one know terabit hosting?

#

I had said if I can make a geolocation

#

To my server because is Spanish and itโ€™s on the part of uk

#

I donโ€™t know if the admins of scp could make me a favour and put my server next to Spanish ones

south socket
#

Thatโ€™s something you should sort out directly with your hosting provider. The "SCP admins" canโ€™t change the geolocation of your serverโ€™s IP that information comes from your host and the geolocation databases. If you need your server to appear in Spain, youโ€™ll have to ask your hoster for an IP range that is registered there.

icy knoll
#

well yes

#

that is a solution

#

but

#

you can contact verif specialists and get a geolocation request

south socket
#

poor verify specialists

icy knoll
#

also, please use the right channels

#

this is the dev channel not server host support

tranquil yacht
#

Srry

restive turret
#

So how is the fixing

cyan crown
#

Fuck that shit

#

Im continuing working on my clone its better tbh

harsh haven
harsh haven
#

Oh nvm

#

I thought that was my image for a second

restive turret
cyan crown
harsh haven
cyan crown
#

๐Ÿคก

harsh haven
cyan crown
#

โ™ป๏ธ

grave eagle
tulip kiln
#

Does anyone have a method to fake a synclist?

#

I need to fake the intensity of an effect

icy knoll
#

i knew starring this repo would come in handy some day :3

tulip kiln
#

God Bless ๐Ÿ™

#

and of course Axwabo is the latest commit kekw

icy knoll
#

ax is elite

tulip kiln
#

So how do we return null on an event that expects a non-nullable enum?
public static event Func<ReferenceHub, ReferenceHub, RoleTypeId, RoleTypeId> RoleSyncEvent

#

Seems like subscribing to this event kills the system entirely

#

Since you have to return a non-null value no matter what

harsh thorn
tulip kiln
icy knoll
#

absolutely no clue Kek

tulip kiln
tulip kiln
#

Ok I think I know what it is, testing rn

#

Ok it doesn't work ๐Ÿ˜ญ

celest thorn
#

what are you trying to do?

tepid sluice
#

when today's live

celest thorn
#

live?

restive turret
tulip kiln
#

I thought its index is 0 but it doesn't work (unless I'm doing something else wrong)

#

I did

                p.SendFakeSyncListSet<byte>(
                  Player.ReferenceHub.playerEffectsController,
                    0,
                    fadeIndex, <- this is fade's effect index
                    valueToSend); <- this is a byte
#

p is the target, while Player is the effect holder

restive turret
#

thats funny cus its hould work

#

is your mirror publicized?

#

can you do:

int c = 0;
foreach (var so in ReferenceHub.playerEffectsController.syncObjects)
{
// log so an c
c++;
}
#

tbh I think you should do is both have hte p.refhub.pec

upper vapor
tepid sluice
celest thorn
#

not me

#

i cannot like show the server without permission

restive turret
#

with just *-1

#

:P

#

c-= ClassDTroll1

upper vapor
#

omega bruh

tepid sluice
#

we also have

#

c่‰น

upper vapor
tepid sluice
#

nah thats a chinese character

upper vapor
worn gull
#

How can I change a Grenade's range?

upper vapor
upper vapor
#

but not the demo

celest thorn
#

but i can leak the plugin Trolley

#

nah idc

upper vapor
#

no big deal tbh

celest thorn
#

lol

icy knoll
#

and this is why you've not been responding to my dms!! ๐Ÿ˜ญ

#

so peak tho

upper vapor
upper vapor
upper vapor
icy knoll
upper vapor
icy knoll
unique crane
#

What

upper vapor
#

what

icy knoll
#

just a joke to say that david will try make that in 2049

#

smh

upper vapor
#

interesting choice of words there

restive turret
icy knoll
#

i dont see any issue with it but sure ๐Ÿ˜ญ

#

HOW ARE PEOPLE SEEING ISSUES WITH IT

#

fine ill edit it

#

there

#

๐Ÿ˜ญ

upper vapor
restive turret
upper vapor
#

ty

restive turret
tulip kiln
#

Unless they are using 1-based indexing

#

like psychopaths

restive turret
#

0 shouldnt be there

#

bc it does Count + 1

tulip kiln
#

Ah

#

Either way, just checked and works okis

warped prairie
upper vapor
#

what can be done, can be done in SL

warped prairie
#

lmao

upper vapor
#

-# sun tzu, i guess

pallid galleon
upper vapor
#

tyyy

spare zodiac
#

this looks awesome

#

you cooked

upper vapor
#

Thanks

#

I'll be releasing it today or tomorrow

spare zodiac
#

you are not DJ, but a 5 star chef

upper vapor
#

๐Ÿ˜ญ ๐Ÿ˜ญ

icy knoll
upper vapor
#

This is the dependency for it

restive turret
#

Cant wait to someone make a Redeemer from UT98 as a playable weapon in SL

celest thorn
#

This is my code amazing am i right?

#

I can become eliot (Mr Robot) for sure

warped prairie
#

question, does player.ReferenceHub.serverRoles.Network_myColor have a set of values it can or cant be when setting. or does it just take any hex?

tulip kiln
warped prairie
#

oh ok, ty man

upper vapor
#

np

warped prairie
celest thorn
#

so idk anything about it

#

but i've played all of the watch dogs

#

both of them REALLY great

#

last one is written by a psychopath

celest thorn
#

Crazy name

upper vapor
#

:3

celest thorn
unique crane
celest thorn
#

btw how are you doing david?

unique crane
#

Yea good

celest thorn
# unique crane Yea good

nice, i was tryharding on that game again and got pass the habitation layer (2nd floor and i lost because i didn't have an item)

unique crane
#

rip

celest thorn
#

tomorrow grinding

#

another day of rewriting sl

#

for a crazy idea

#

this time it will be something none has ever imagined (v4)

random scaffold
#

how i can install unity without stupid register?

unique crane
unique crane
#

why

celest thorn
# unique crane why

On SpigotMC there's a guy who is like crazy most contributor every question you ask this guy makes you feel stupid and uses this website

#

for 90% of the questions you ask

#

the other 10 is calling you stupid and saying that its basic shit

#

and pulling up the most elaborate shit ever

south socket
#

How can I use Unity without Unity

celest thorn
celest thorn
unique crane
#

Like I understand if you ask basic Java questions

south socket
#

When FINALLY LabAPI Bungeecordโ€ฆ

celest thorn
#

like that guy cracks 10k

#

a month

#

as he told me

#

so im not surprised and he is the most active contributor on spigot

#

so like crazy

#

(its not md5, never spoke to that guy, i know he is nice)

unique crane
#

Is he paid to do that

south socket
#

md5 my loveโ€ฆ. always

celest thorn
#

Spigot is all free

#

work

#

slavery

#

like contributing to LabAPI

#

but

unique crane
#

I do get paid tho

celest thorn
south socket
#

can you pay us

unique crane
#

You didnt ask

celest thorn
unique crane
celest thorn
#

anyone else can pay me

#

but not maro

#

(i refunded always the money she gave me)

south socket
#

I mean we almost have every big mc plugin here ClassDTroll

unique crane
#

You just say that you dont want to get paid by the only person who could pay you

#

right now

celest thorn
#

but i refuse

south socket
celest thorn
#

sl map is small asf

#

its useless asf

south socket
#

I want to build my Plot?????

celest thorn
#

and it would be heavy asf for normal servers

celest thorn
#

and no more

#

so imagine

#

how limiting it is

south socket
#

I mean

celest thorn
#

you give 1 block per player?

#

(meow can reach the 100m)

south socket
#

Some servers already have 1 fps

celest thorn
#

I mean thats true

#

@unique crane can you cooldown a keycard?

#

I know the strangest question ever

unique crane
#

Wdym?

celest thorn
#

because the hat has like the cooldown

#

thingy

unique crane
#

You can cooldown a door

celest thorn
#

an item in the inventory

unique crane
#

Well

#

make system that checks the keycard you use

#

while opening doors

#

and make the cooldown yourself

celest thorn
#

i just wanted to make it visualize like the one for the hat

#

so thats why

#

i was asking

unique crane
#

I dont think thats possible yea

tulip kiln
#

If someone didn't say outright that it was HID, I wouldn't have realised it myself xD

unique crane
#

Well.. you dont really interact with it

#

But I guess make issue about it

unique crane
#

and I or someone else can add event for it

celest thorn
unique crane
#

is there

tulip kiln
#

I still have to make that armor penetration issue from a week ago

celest thorn
#

i worked a bit on armors on Exiled

#

so i could try helping you

tulip kiln
random scaffold
tulip kiln
#

becaue ExplosionDamageHandler will not set its values

tulip kiln
unique crane
#

Yea ExplosionDamageHandler is kinda like

#

weird

random scaffold
unique crane
#

If you pass 0 penetration to the ExplosionDamageHandler it ignored all damage

#

for some reason

celest thorn
# tulip kiln yeah
        if (num > 0f && dest.Damage(num, new ExplosionDamageHandler(attacker, force, num, 50, explosionType), dest.CenterOfMass) && flag)

Class is ExplosionGrenade line 205

This is used by the game code it seems to be a magic number decided by someone at nw to be 50

celest thorn
#

and you will obtain the same result as base game

tulip kiln
#

The issue isn't with reproducing base game explosion penetration. It's that if you want to damage a player for let's say, 5 damage, you will need to set armorPenetration to at least 1, since anything lower than 1 will be ignored.

#

It's due to ExplosionDamageHandler's constructor

celest thorn
#

i mean just patch it ig

#

easy enough

tulip kiln
#

That's not the point ๐Ÿ˜ญ

#

I already solved it locally

celest thorn
#

i know

#

but i mean best solution to the problem

#

sl is a great game

#

OH i know why

#

because it could be 0 the damage

#
            Damage = BodyArmorUtils.ProcessDamage((attacker.Hub != null && attacker.Hub.inventory.TryGetBodyArmor(out var bodyArmor)) ? bodyArmor.VestEfficacy : 0, damage, armorPenetration);
restive turret
#

If i remember right it just force open without any labapi stuff

warped prairie
random scaffold
#

where i can get System.ValueTuple.dll?

mild walrus
#

is there any updated exiled version? or the latest release on github is the last version?

restive turret
random scaffold
warped prairie
random scaffold
#

there doesnt exists

thin tusk
#

What element is in charge of providing data to the player info hovering text

random scaffold
thin tusk
#

what if I dont want to show it for a certain role

#

or for a player with a certain effect

warped prairie
#

github is liked there iirc

thin tusk
#

I'm trying to pair the visibility of the display element to the Fade effect of the player being targetted

static meteor
#

That would be client side

thin tusk
#

and what if I just want to hide it

#

or make it empty

static meteor
#

Set it to be empty

#

Idk how never messed with it

thin tusk
#

what should I set is my question

random scaffold
#

Could not load type of field 'NVorbis.Ogg.ForwardOnlyPacketProvider:_pageQueue' (1) due to: Could not load file or assembly 'System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies.

restive turret
upper vapor
#

oh you mean as a dependency for another plugin

ashen hound
#

AudioPlayerApi, messing with streams support

#

ffmpeg required tho

south socket
# ashen hound

๐Ÿ˜ญ i love this.. finally i can listen to my taylor swift radio in sl

ashen hound
#

ffmpeg and piping data to make this work

upper vapor
icy knoll
#

@restive turret ur up buddy, do you know how to make GetType().Assembly.GetName().Version to work via csproj? It seems to only work for me if I build a nuget package to go with my project, but without it refuses to work. I'm setting it all in csproj with GenerateAssemblyInfo as false so yeah, me confusion :3

#

legit doing this

unique crane
#

not assembly version

icy knoll
#

I use GetType().Assembly.GetName().Version for that version

#

lol

unique crane
#

How about Assembly::GetVersion()

#

or wait

#

but ive seen something like that before

#

Oh it uses that

#

and its internal

icy knoll
#

๐Ÿ˜ญ

unique crane
#

Assembly.GetExecutingAssembly().GetName().Version?

upper vapor
#

this works for me though

icy knoll
upper vapor
#

no

icy knoll
#

yeah so microsoft is just being rude

upper vapor
#

solved

#

AssemblyVersion can be omitted

icy knoll
#

and I need to remove the GenerateAssemblyInfo thing

#

(don't false it, just remove it)

restive turret
#

Hey, uh the armor penetration damage is only server side?
So i can make a fake armor with for example ap of 5

unique crane
#

Damage is server side

#

so yes

restive turret
#

Nice

#

My next question is, how can I move the player where the player looking

hearty shard
#

Physics.Raycast my beloved