What’s the best way to implement SCP-173’s movement?

SCP-173 is known for its speed and stealth. In SCP: Containment Breach , it moves unpredictably and becomes completely motionless when observed. Currently, I’ve implemented its movement by setting Humanoid.WalkSpeed = 100 and stopping its pathfinding cycle abruptly when a player detects it. The issue is that this creates a sudden, jarring halt when players notice it, which looks unnatural.

Additionally, it must be accounted for that SCP-173 can be shot at, with hits detected using raycasts.

How can I improve this? I’m open to any suggestions!

Could you clarify what you’re looking for? You mention SCP-173 is supposed to become motionless when observed, but that it stopping when being observed is jarring. What is it that you are envisioning, exactly?

you could just instantly set the AssemblyLinearVelocity to Vector3.new(0, 0, 0)

Yeah I’d do this if the problem is that it’s not stopping fast enough. That or toggle on custom physical properties for SCP-173’s primary part and set the density way up (this affects momentum). Otherwise we need more context

I’ll show you the video.

That seems more like a pathfinding issue, but it would be worth trying to set the density super high to prevent sliding (like @Kizylle mentioned)

Try either what zerod suggested or what I suggested. If it still does that then you’ll have to implement a workaround to stop roblox from interpolating the rig, like anchoring the rig on the client when the client sees it.

You could also try setting the waypoint spacing to something low like 1, and just teleport the npc to each waypoint instead of using moveto

1 Like

Yeah if this is for an scp game you could probably recycle the code for peanut to do this more easily, assuming you’ll add him at some point

Maybe set the walk speed to 0 instead of breaking the path finding cycle

Instead of using moveto you can use lerping

it’s also easy to create your own movetostopped function

local function MoveToStopped(model, position)

     local start = tick()

     local distance = 9999

     repeat

           distance = (model.PrimaryPart.Position - position).Magnitude

     until distance < 5 or tick() - start > 8

end