
KeylessUniversal

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local localPlayer = Players.LocalPlayer
local mouse = localPlayer:GetMouse()
local targetPlayer = nil
local connection = nil
local FOLLOW_DISTANCE = 1.0 -- How close do you want to be to the back of the player..
local STOP_DISTANCE = 0.6 -- Stop where exactly it is.
local MAX_SPEED = 16 -- how fast can you follow to the player
local function stopFollowing()
targetPlayer = nil
if connection then
connection:Disconnect()
connection = nil
end
local char = localPlayer.Character
if char then
local hum = char:FindFirstChild("Humanoid")
local root = char:FindFirstChild("HumanoidRootPart")
if hum then
hum.PlatformStand = false
hum.WalkSpeed = 16
end
if root then
root.AssemblyLinearVelocity = Vector3.new(0, 0, 0)
end
end
end
local function startFollowing(target)
targetPlayer = target
if connection then connection:Disconnect() end
connection = RunService.Heartbeat:Connect(function()
local myChar = localPlayer.Character
local targetChar = targetPlayer.Character
if not myChar or not targetChar then
stopFollowing()
return
end
local myRoot = myChar:FindFirstChild("HumanoidRootPart")
local targetRoot = targetChar:FindFirstChild("HumanoidRootPart")
local myHum = myChar:FindFirstChild("Humanoid")
if not myRoot or not targetRoot or not myHum then
stopFollowing()
return
end
myHum.PlatformStand = false
myHum.WalkSpeed = 16
-- Precise position: Exactly 1 stud behind
local behindCFrame = targetRoot.CFrame * CFrame.new(0, 0, FOLLOW_DISTANCE)
local targetPos = behindCFrame.Position
local currentPos = myRoot.Position
local direction = (targetPos - currentPos)
local distance = direction.Magnitude
-- Smooth movement
if distance > STOP_DISTANCE then
local moveDir = direction.Unit
local speed = math.min(distance * 11, MAX_SPEED)
local desiredVel = moveDir * speed
myRoot.AssemblyLinearVelocity = Vector3.new(desiredVel.X, myRoot.AssemblyLinearVelocity.Y, desiredVel.Z)
else
myRoot.AssemblyLinearVelocity = Vector3.new(0, myRoot.AssemblyLinearVelocity.Y, 0)
end
-- === Facing Logic ===
if distance > 7 then
-- Look at player while approaching
myRoot.CFrame = CFrame.lookAt(currentPos, targetRoot.Position)
else
-- When close (1 stud behind): Face AWAY from the player
local desiredLook = -targetRoot.CFrame.LookVector
local currentLook = myRoot.CFrame.LookVector
local newLook = currentLook:Lerp(desiredLook, 0.15) -- Smooth turn
myRoot.CFrame = CFrame.lookAt(currentPos, currentPos + newLook)
end
end)
end
-- Mouse Click Handler
mouse.Button1Down:Connect(function()
local target = mouse.Target
if not target then
stopFollowing()
return
end
local character = target.Parent
if not character then
stopFollowing()
return
end
local player = Players:GetPlayerFromCharacter(character)
if player and player ~= localPlayer then
if targetPlayer == player then
stopFollowing()
print("Stopped following")
else
startFollowing(player)
print("Following: " .. player.Name .. " (1 stud behind)")
end
else
stopFollowing()
print("Stopped following")
end
end)
-- Safety
Players.PlayerRemoving:Connect(function(plr)
if plr == targetPlayer then stopFollowing() end
end)
UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == Enum.KeyCode.F then
stopFollowing()
end
end)No comments yet for this script.



