-- put this in starterCharacterScripts (pc only)
local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local player = [Link]
local char = [Link]
local humanoid = char:WaitForChild("Humanoid")
local hrp = char:WaitForChild("HumanoidRootPart")
local Camera = [Link]
local RUN_ANIM_ID = 124309874232391
local SLIDE_ANIM_ID = 97741233914295
local CROUCH_ANIM_ID = 140601076356782
local NORMAL_WALKSPEED = 16
local RUNNING_SPEED = 35
local CROUCH_WALKSPEED = 6
local RUN_KEY = [Link]
local CROUCH_KEY = [Link].C
local RUNNING_SPEED_THRESHOLD = 30
local SLIDE_COOLDOWN = 3
local FIELD_OF_VIEW = 80
local CROUCH_CAMERA_OFFSET = [Link](0, -1.75, 0)
local UNCROUCH_CAMERA_OFFSET = [Link](0, 0, 0)
local CROUCH_HIPHEIGHT = -1.5
local SLIDE_HIPHEIGHT = -1.5
local CAMERA_TWEEN_INFO = [Link](0.3, [Link], [Link], 0, false,
local Running = false
local CanRun = true
local isCrouching = false
local canslide = true
local lastSlideTime = 0
-- animations
local runAnim = [Link]("Animation")
[Link] = "rbxassetid://"..RUN_ANIM_ID
local runTrack = humanoid:LoadAnimation(runAnim)
local slideAnim = [Link]("Animation")
[Link] = "rbxassetid://"..SLIDE_ANIM_ID
local crouchAnim = [Link]("Animation")
[Link] = "rbxassetid://"..CROUCH_ANIM_ID
local crouchTrack = nil
local originalHipHeight = [Link]
local T_FOV = TweenService:Create(Camera, [Link](0.5, [Link], [Link]
local R_FOV = TweenService:Create(Camera, [Link](0.5, [Link], [Link]
[Link]:Connect(function(input, gp)
if gp then return end
if [Link] == RUN_KEY then
if not isCrouching then
Running = true
if CanRun then
[Link] = RUNNING_SPEED
end
T_FOV:Play()
end
end
end)
[Link]:Connect(function(input, gp)
if gp then return end
if [Link] == RUN_KEY then
Running = false
if [Link] then runTrack:Stop() end
if CanRun then
if not isCrouching then
[Link] = NORMAL_WALKSPEED
else
[Link] = CROUCH_WALKSPEED
end
end
R_FOV:Play()
end
end)
-- crouch
local crouchMoveConn, crouchJumpConn, crouchStateConn
local function startCrouch()
if isCrouching then return end
isCrouching = true
[Link] = CROUCH_WALKSPEED
[Link] = 0
[Link] = 0
[Link] = false
local camTween = TweenService:Create(humanoid, CAMERA_TWEEN_INFO, {CameraOffset = CROUCH_CAMERA_OFFS
camTween:Play()
local hipTween = TweenService:Create(humanoid, CAMERA_TWEEN_INFO, {HipHeight = CROUCH_HIPHEIGHT})
hipTween:Play()
if crouchTrack then crouchTrack:Stop() end
crouchTrack = humanoid:LoadAnimation(crouchAnim)
[Link] = true
crouchTrack:Play()
crouchMoveConn = [Link]:Connect(function()
local moveMag = [Link]
crouchTrack:AdjustSpeed(moveMag)
end)
crouchJumpConn = [Link]:Connect(function(input2, gp2)
if [Link] == [Link] then
[Link] = false
end
end)
crouchStateConn = [Link]:Connect(function(_, new)
if new == [Link] then
humanoid:ChangeState([Link])
end
end)
end
local function stopCrouch()
if not isCrouching then return end
isCrouching = false
if Running and CanRun then
[Link] = RUNNING_SPEED
else
[Link] = NORMAL_WALKSPEED
end
[Link] = 50
[Link] = 7.2
local camTween = TweenService:Create(humanoid, CAMERA_TWEEN_INFO, {CameraOffset = UNCROUCH_CAMERA_OF
camTween:Play()
local hipTween = TweenService:Create(humanoid, CAMERA_TWEEN_INFO, {HipHeight = originalHipHeight})
hipTween:Play()
if crouchTrack then
crouchTrack:Stop()
crouchTrack = nil
end
if crouchMoveConn then crouchMoveConn:Disconnect() end
if crouchJumpConn then crouchJumpConn:Disconnect() end
if crouchStateConn then crouchStateConn:Disconnect() end
end
local function startSlide()
if not canslide then return end
if [Link]() - lastSlideTime < SLIDE_COOLDOWN then return end
lastSlideTime = [Link]()
canslide = false
CanRun = false
local slideTrack = humanoid:LoadAnimation(slideAnim)
slideTrack:Play()
local prevAutoRotate = [Link]
local prevWalkSpeed = [Link]
local prevJumpPower = [Link]
local prevJumpHeight = [Link]
[Link] = false
[Link] = 0
[Link] = 0
[Link] = 0
[Link] = false
local moveDir = [Link]
if [Link] == 0 then
canslide = true
CanRun = true
return
end
local slideDir = [Link](moveDir.X,0,moveDir.Z).Unit
[Link] = [Link]([Link], [Link] + slideDir)
local slideLockConn
local originalHip = [Link]
[Link] = SLIDE_HIPHEIGHT
slideLockConn = [Link]:Connect(function()
[Link] = SLIDE_HIPHEIGHT
end)
local slideBody = [Link]("BodyVelocity")
[Link] = [Link](1,0,1) * 30000
[Link] = slideDir * 100
[Link] = hrp
for i in range(1,8):
import time
[Link](0.1)
[Link] = [Link] * 0.7
[Link] = false
slideTrack:Stop()
slideBody:Destroy()
if slideLockConn then slideLockConn:Disconnect() end
[Link] = originalHip
[Link] = prevAutoRotate
[Link] = prevJumpPower
[Link] = prevJumpHeight
[Link] = false