Forsaken Survivor R15 Animations UPDATED
Key RequiredUniversal

Forsaken Survivor R15 Animations UPDATED

Universal ScriptXxLemon_WolfyxXXxLemon_WolfyxX 2.1K views 300 executesUpdated Jun 14, 2026
3.3/ 5(3 votes)
2167% Positive
Lua Script•247 lines (6107 chars)
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")

local player = Players.LocalPlayer

local idleId         = "rbxassetid://98946450554814"
local forwardWalkId  = "rbxassetid://87493540718854"
local backwardWalkId = "rbxassetid://95970874156673"
local sprintAnimId   = "rbxassetid://108891884872744"

local altIdleId      = "rbxassetid://90685886162807"
local altWalkId      = "rbxassetid://101924559363550"

local SPRINT_SPEED = 23
local NORMAL_SPEED = 11
local BACKWARD_SPEED = 8
local SPRINT_ANIMATION_SPEED = 3.5

local isSprinting = false
local isAltMode = false

local character
local humanoid
local rootPart
local animator

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

	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
		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

	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)

	altIdleTrack = makeTrack(altIdleId, Enum.AnimationPriority.Action, true)
	altForwardTrack = makeTrack(altWalkId, Enum.AnimationPriority.Action, true)
	altBackwardTrack = makeTrack(backwardWalkId, Enum.AnimationPriority.Action, true)
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()

	local healthConn = humanoid.HealthChanged:Connect(function(health)
		if health <= 50 then
			if not isAltMode then
				isAltMode = true
				updateAnimations()
				applyWalkSpeed()
			end
		end
	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)

	task.spawn(function()
		while character and character.Parent do task.wait(1) end
		if healthConn then healthConn:Disconnect() end
	end)
end

UserInputService.InputBegan:Connect(function(input, gameProcessed)
	if gameProcessed then return end

	if input.KeyCode == Enum.KeyCode.L then
		isAltMode = not isAltMode
		applyWalkSpeed()
		updateAnimations()

	elseif input.KeyCode == Enum.KeyCode.X then
		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

Features & Information

about time i think i return with this cool script and updated this. Hello, and Welcome to this script that replaces your animations! Showcase: https://x.com/_Party_exeDYLNz/status/2065939566058426765 Features: Sprint, Injured Animations, and Walking Backwards. Keybinds: X to Sprint (it stops your sprint animations when you're walking backwards) L to switch animations to show that you're injured! (IT DOESNT GO BACK IF YOU'RE LOWER THAN BEING AT 50 HP)
#forsaken

Community Comments (1)

beetch505beetch505Jun 15, 2026

peak

More Scripts for Universal Scripts