local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer -- REPLACEABLE ASSETS local idleId = "rbxassetid://98946450554814" local forwardWalkId = "rbxassetid://87493540718854" local backwardWalkId = "rbxassetid://95970874156673" local sprintAnimId = "rbxassetid://108891884872744" -- REPLACEABLE ASSETS FOR ALTERNATIVE ANIMATIONS (50 Health Animations!!) local altIdleId = "rbxassetid://90685886162807" local altWalkId = "rbxassetid://101924559363550" local SPRINT_SPEED = 23 -- how fast you can run local NORMAL_SPEED = 11 -- how fast do you wander local BACKWARD_SPEED = 8 -- how slow do you want to walk backwards as. local SPRINT_ANIMATION_SPEED = 3.5 -- Run Animation Speed local isSprinting = false -- detects if ur sprinting local isAltMode = false - checks if ur low local character local humanoid local rootPart local animator -- Tracks local idleTrack, forwardTrack, backwardTrack, sprintTrack local altIdleTrack, altForwardTrack, altBackwardTrack local heartbeatConn local speedLoopTask local currentTrack local function stopTrack(track, fadeTime) if track and track.IsPlaying then track:Stop(fadeTime or 0.1) end end local function playOnly(track, speedOverride) if not track then return end if currentTrack == track then if not track.IsPlaying then track:Play(0.1, 1, speedOverride or 1) end if speedOverride then track:AdjustSpeed(speedOverride) end return end if currentTrack then currentTrack:Stop(0.1) end currentTrack = track track:Play(0.1, 1, speedOverride or 1) if speedOverride then track:AdjustSpeed(speedOverride) end end local function makeTrack(animationId, priority, looped) if not animationId or animationId == "" then return nil end local anim = Instance.new("Animation") anim.AnimationId = animationId local track = animator:LoadAnimation(anim) track.Priority = priority track.Looped = looped or false return track end local function cleanup() if heartbeatConn then heartbeatConn:Disconnect() end if speedLoopTask then speedLoopTask = nil end -- Stop all tracks... for _, track in ipairs({idleTrack, forwardTrack, backwardTrack, sprintTrack, altIdleTrack, altForwardTrack, altBackwardTrack}) do stopTrack(track, 0) end idleTrack = nil; forwardTrack = nil; backwardTrack = nil; sprintTrack = nil altIdleTrack = nil; altForwardTrack = nil; altBackwardTrack = nil currentTrack = nil if character then local animate = character:FindFirstChild("Animate") if animate then animate.Enabled = true end end end local function getCurrentTracks() if isAltMode then return altIdleTrack, altForwardTrack, altBackwardTrack or backwardTrack, nil else return idleTrack, forwardTrack, backwardTrack, sprintTrack end end local function applyWalkSpeed() if not humanoid or not rootPart then return end local moveDir = humanoid.MoveDirection local moving = moveDir.Magnitude > 0.1 if isAltMode then humanoid.WalkSpeed = NORMAL_SPEED -- Sprint disabled in alt mode return end if not moving then humanoid.WalkSpeed = isSprinting and SPRINT_SPEED or NORMAL_SPEED return end local dot = moveDir:Dot(rootPart.CFrame.LookVector) if dot < -0.2 then humanoid.WalkSpeed = BACKWARD_SPEED elseif isSprinting then humanoid.WalkSpeed = SPRINT_SPEED else humanoid.WalkSpeed = NORMAL_SPEED end end local function updateAnimations() if not humanoid or not rootPart then return end local idleT, forwardT, backwardT, sprintT = getCurrentTracks() local moveDir = humanoid.MoveDirection local moving = moveDir.Magnitude > 0.1 if not moving then playOnly(idleT) return end local dot = moveDir:Dot(rootPart.CFrame.LookVector) if dot < -0.2 then playOnly(backwardT) return end if not isAltMode and isSprinting and sprintT then playOnly(sprintT, SPRINT_ANIMATION_SPEED) return end playOnly(forwardT) end local function setupTracks() if not animator then return end -- Assets Priotries idleTrack = makeTrack(idleId, Enum.AnimationPriority.Action, true) forwardTrack = makeTrack(forwardWalkId, Enum.AnimationPriority.Action, true) backwardTrack = makeTrack(backwardWalkId, Enum.AnimationPriority.Action, true) sprintTrack = makeTrack(sprintAnimId, Enum.AnimationPriority.Action4, true) -- Alts altIdleTrack = makeTrack(altIdleId, Enum.AnimationPriority.Action, true) altForwardTrack = makeTrack(altWalkId, Enum.AnimationPriority.Action, true) altBackwardTrack = makeTrack(backwardWalkId, Enum.AnimationPriority.Action, true) -- Reuse backward end local function setupCharacter(char) cleanup() character = char task.wait(0.2) humanoid = character:WaitForChild("Humanoid", 5) rootPart = character:WaitForChild("HumanoidRootPart", 5) if not humanoid or not rootPart then return end animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator") animator.Parent = humanoid local animate = character:FindFirstChild("Animate") if animate then animate.Enabled = false end setupTracks() applyWalkSpeed() updateAnimations() -- checks if you're low local healthConn = humanoid.HealthChanged:Connect(function(health) if health <= 50 then if not isAltMode then isAltMode = true updateAnimations() applyWalkSpeed() end end -- Note: it doesn't go back until you go above health 50 end) speedLoopTask = task.spawn(function() while character and character.Parent and humanoid and humanoid.Parent do applyWalkSpeed() task.wait(0.1) end end) heartbeatConn = RunService.Heartbeat:Connect(function() if not character or not character.Parent then return end if not isAltMode and isSprinting and sprintTrack and sprintTrack.IsPlaying then sprintTrack:AdjustSpeed(SPRINT_ANIMATION_SPEED) end updateAnimations() end) -- Cleanup HP connections task.spawn(function() while character and character.Parent do task.wait(1) end if healthConn then healthConn:Disconnect() end end) end -- Input Handling UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.L then -- Toggle ALT Anims isAltMode = not isAltMode applyWalkSpeed() updateAnimations() elseif input.KeyCode == Enum.KeyCode.X then -- Toggle Sprint, CHANGE THIS.. if not isAltMode then isSprinting = not isSprinting applyWalkSpeed() updateAnimations() end end end) player.CharacterAdded:Connect(setupCharacter) player.CharacterRemoving:Connect(cleanup) if player.Character then task.spawn(setupCharacter, player.Character) end