Slasher ms4 animations
Key RequiredUniversal

Slasher ms4 animations

Universal ScriptFEscript_showcaserFEscript_showcaser 1K views 1.2K executesUpdated Feb 19, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•410 lines (11258 chars)
local MODEL_ASSET_ID = 120538196837455

local IDLE_KEYFRAMES_NAME = "Jason Idle"
local WALK_KEYFRAMES_NAME = "Walk"
local RUN_KEYFRAMES_NAME  = "Run"

local SLASH_KEYFRAMES_NAME = "Swing"
local BEHEAD_KEYFRAMES_NAME = "RagingBehead"
local GASHING_KEYFRAMES_NAME = "Gashing Wound Hit"

local RAGINGPACE_START = "RagingPaceStart"
local RAGING_IDLE = "RagingIdle"
local RAGE_WALK = "RageWalk"
local RAGING_SWING = "RagingSwing"

local KILL_KEYFRAMES_NAME = "Kill"
local GUESTKILL_KEYFRAMES_NAME = "GuestKills"

local RUN_SPEED = 30
local BEHEAD_PUSH_DISTANCE = 6
local RAGING_SPEED = 20

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")

local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")

local DEFAULT_WALK_SPEED = humanoid.WalkSpeed

for _, track in ipairs(humanoid:GetPlayingAnimationTracks()) do
	pcall(function()
		track:Stop()
		track:Destroy()
	end)
end

local animate = character:FindFirstChild("Animate")
if animate then animate:Destroy() end

local animator = humanoid:FindFirstChildOfClass("Animator")
if animator then animator:Destroy() end

local R6_MAPPING = {
	["Torso"] = "RootJoint",
	["Head"] = "Neck",
	["Right Arm"] = "Right Shoulder",
	["Left Arm"] = "Left Shoulder",
	["Right Leg"] = "Right Hip",
	["Left Leg"] = "Left Hip",
}

local motors = {}
for _, m in ipairs(character:GetDescendants()) do
	if m:IsA("Motor6D") then
		motors[m.Name] = m
	end
end

local function resetMotors()
	for _, m in pairs(motors) do
		if m then
			m.Transform = CFrame.identity
		end
	end
end

local asset
local ok, result = pcall(function()
	return game:GetObjects("rbxassetid://" .. MODEL_ASSET_ID)
end)

if ok and result and #result > 0 then
	asset = result[1]
else
	warn("FAILED TO LOAD ASSET")
	return
end

local idleSeq, walkSeq, runSeq
local slashSeq, beheadSeq, gashingSeq
local ragingPaceStartSeq, ragingIdleSeq, rageWalkSeq, ragingSwingSeq
local killSeq, guestKillSeq

for _, obj in ipairs(asset:GetDescendants()) do
	if obj:IsA("KeyframeSequence") then
		if obj.Name == IDLE_KEYFRAMES_NAME then idleSeq = obj
		elseif obj.Name == WALK_KEYFRAMES_NAME then walkSeq = obj
		elseif obj.Name == RUN_KEYFRAMES_NAME then runSeq = obj
		elseif obj.Name == SLASH_KEYFRAMES_NAME then slashSeq = obj
		elseif obj.Name == BEHEAD_KEYFRAMES_NAME then beheadSeq = obj
		elseif obj.Name == GASHING_KEYFRAMES_NAME then gashingSeq = obj
		elseif obj.Name == RAGINGPACE_START then ragingPaceStartSeq = obj
		elseif obj.Name == RAGING_IDLE then ragingIdleSeq = obj
		elseif obj.Name == RAGE_WALK then rageWalkSeq = obj
		elseif obj.Name == RAGING_SWING then ragingSwingSeq = obj
		elseif obj.Name == KILL_KEYFRAMES_NAME then killSeq = obj
		elseif obj.Name == GUESTKILL_KEYFRAMES_NAME then guestKillSeq = obj
	end
	end
end

if not idleSeq then warn("Missing '" .. IDLE_KEYFRAMES_NAME .. "'") return end
if not walkSeq then warn("Missing '" .. WALK_KEYFRAMES_NAME .. "'") return end

local conn
local currentSeq

local function stopAnimation()
	if conn then
		conn:Disconnect()
		conn = nil
	end
	resetMotors()
	currentSeq = nil
end

local function playSequence(seq, looped)
	if not seq then return end

	if currentSeq == seq then return end

	stopAnimation()
	currentSeq = seq

	local keyframes = seq:GetKeyframes()
	if #keyframes == 0 then return end

	table.sort(keyframes, function(a, b)
		return a.Time < b.Time
	end)

	local start = os.clock()
	local length = keyframes[#keyframes].Time

	conn = RunService.RenderStepped:Connect(function()
		local t = os.clock() - start

		for i = #keyframes, 1, -1 do
			local kf = keyframes[i]
			if t >= kf.Time then
				for _, pose in ipairs(kf:GetDescendants()) do
					if pose:IsA("Pose") then
						local motorName = R6_MAPPING[pose.Name]
						local motor = motors[motorName]
						if motor then
							motor.Transform = pose.CFrame
						end
					end
				end
				break
			end
		end

		if t >= length then
			if looped then
				start = os.clock()
			else
				stopAnimation()
			end
		end
	end)
end

local runEnabled = false
local manualSeqPlaying = false

local normalIdleSeq = idleSeq
local normalWalkSeq = walkSeq

local activeIdleSeq = idleSeq
local activeWalkSeq = walkSeq

local isRaging = false

RunService.RenderStepped:Connect(function()
	if manualSeqPlaying then return end

	local moving = humanoid.MoveDirection.Magnitude > 0

	if moving then
		if runEnabled and runSeq then
			playSequence(runSeq, true)
			humanoid.WalkSpeed = RUN_SPEED
		else
			playSequence(activeWalkSeq, true)
			humanoid.WalkSpeed = (isRaging and RAGING_SPEED or DEFAULT_WALK_SPEED)
		end
	else
		playSequence(activeIdleSeq, true)
		humanoid.WalkSpeed = (isRaging and RAGING_SPEED or DEFAULT_WALK_SPEED)
	end
end)

local gui = Instance.new("ScreenGui")
gui.Name = "AnimationGui"
gui.ResetOnSpawn = false
gui.Parent = player:WaitForChild("PlayerGui")

local jumpBtn = player.PlayerGui:FindFirstChild("MobileControlsFrame")
	and player.PlayerGui.MobileControlsFrame:FindFirstChild("JumpButton")

local positions = {}

if jumpBtn then
	local pos = jumpBtn.Position
	positions["Run"] = UDim2.new(pos.X.Scale, pos.X.Offset - 80, pos.Y.Scale, pos.Y.Offset)
	positions["Slash"] = UDim2.new(pos.X.Scale, pos.X.Offset - 160, pos.Y.Scale, pos.Y.Offset)
	positions["Behead"] = UDim2.new(pos.X.Scale, pos.X.Offset - 240, pos.Y.Scale, pos.Y.Offset)
	positions["Gash"] = UDim2.new(pos.X.Scale, pos.X.Offset - 320, pos.Y.Scale, pos.Y.Offset)
	positions["Raging"] = UDim2.new(pos.X.Scale, pos.X.Offset - 400, pos.Y.Scale, pos.Y.Offset)
	positions["Kill"] = UDim2.new(pos.X.Scale, pos.X.Offset - 480, pos.Y.Scale, pos.Y.Offset)
	positions["GuestKill"] = UDim2.new(pos.X.Scale, pos.X.Offset - 560, pos.Y.Scale, pos.Y.Offset)
else
	positions["Run"] = UDim2.new(0, 50, 0, 50)
	positions["Slash"] = UDim2.new(0, 130, 0, 50)
	positions["Behead"] = UDim2.new(0, 210, 0, 50)
	positions["Gash"] = UDim2.new(0, 290, 0, 50)
	positions["Raging"] = UDim2.new(0, 370, 0, 50)
	positions["Kill"] = UDim2.new(0, 450, 0, 50)
	positions["GuestKill"] = UDim2.new(0, 530, 0, 50)
end

local function createButton(name, position, callback)
	local btn = Instance.new("TextButton")
	btn.Size = UDim2.new(0, 70, 0, 70)
	btn.Position = position
	btn.Text = name
	btn.Font = Enum.Font.SourceSansBold
	btn.TextScaled = true
	btn.TextColor3 = Color3.fromRGB(170, 0, 255)
	btn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
	btn.BorderColor3 = Color3.fromRGB(170, 0, 255)
	btn.BorderSizePixel = 2

	local corner = Instance.new("UICorner")
	corner.CornerRadius = UDim.new(0, 12)
	corner.Parent = btn

	btn.Parent = gui
	btn.MouseButton1Click:Connect(callback)

	return btn
end


createButton("Run", positions["Run"], function()
	runEnabled = not runEnabled
end)

createButton("Slash", positions["Slash"], function()
	if not slashSeq then return end
	manualSeqPlaying = true
	playSequence(slashSeq, false)

	local totalTime = slashSeq:GetKeyframes()[#slashSeq:GetKeyframes()].Time
	task.delay(totalTime, function()
		manualSeqPlaying = false
	end)
end)

createButton("Behead", positions["Behead"], function()
	if not beheadSeq then return end
	manualSeqPlaying = true

	local keyframes = beheadSeq:GetKeyframes()
	local totalTime = keyframes[#keyframes].Time
	local pushStart = totalTime * 0.4
	local pushEnd = totalTime * 0.7

	playSequence(beheadSeq, false)

	local connPush
	connPush = RunService.RenderStepped:Connect(function()
		local t = os.clock() % totalTime
		if t >= pushStart and t <= pushEnd then
			local step = (BEHEAD_PUSH_DISTANCE / (pushEnd - pushStart)) * RunService.RenderStepped:Wait()
			rootPart.CFrame = rootPart.CFrame + rootPart.CFrame.LookVector * step
		end
	end)

	task.delay(totalTime, function()
		manualSeqPlaying = false
		if connPush then connPush:Disconnect() end
	end)
end)

createButton("Gash", positions["Gash"], function()
	if not gashingSeq then return end
	manualSeqPlaying = true

	local oldSpeed = humanoid.WalkSpeed
	humanoid.WalkSpeed = 0

	playSequence(gashingSeq, false)

	local totalTime = gashingSeq:GetKeyframes()[#gashingSeq:GetKeyframes()].Time
	task.delay(totalTime, function()
		humanoid.WalkSpeed = oldSpeed
		manualSeqPlaying = false
	end)
end)

createButton("Kill", positions["Kill"], function()
	if not killSeq then return end
	manualSeqPlaying = true

	local oldSpeed = humanoid.WalkSpeed
	humanoid.WalkSpeed = 0

	playSequence(killSeq, false)

	local totalTime = killSeq:GetKeyframes()[#killSeq:GetKeyframes()].Time
	task.delay(totalTime, function()
		humanoid.WalkSpeed = oldSpeed
		manualSeqPlaying = false
	end)
end)

createButton("Guest Kill", positions["GuestKill"], function()
	if not guestKillSeq then return end
	manualSeqPlaying = true

	local oldSpeed = humanoid.WalkSpeed
	humanoid.WalkSpeed = 0

	playSequence(guestKillSeq, false)

	local totalTime = guestKillSeq:GetKeyframes()[#guestKillSeq:GetKeyframes()].Time
	task.delay(totalTime, function()
		humanoid.WalkSpeed = oldSpeed
		manualSeqPlaying = false
	end)
end)

createButton("Raging Pace", positions["Raging"], function()
	if not ragingPaceStartSeq then return end
	if not ragingIdleSeq then return end
	if not rageWalkSeq then return end

	manualSeqPlaying = true
	playSequence(ragingPaceStartSeq, false)

	local totalTime = ragingPaceStartSeq:GetKeyframes()[#ragingPaceStartSeq:GetKeyframes()].Time

	task.delay(totalTime, function()
		isRaging = true
		activeIdleSeq = ragingIdleSeq
		activeWalkSeq = rageWalkSeq
		humanoid.WalkSpeed = RAGING_SPEED
		manualSeqPlaying = false

		-- Slash Raging Pace button
		local slashRagingBtn = Instance.new("TextButton")
		slashRagingBtn.Size = UDim2.new(0, 110, 0, 80)
		slashRagingBtn.Position = UDim2.new(
			positions["Raging"].X.Scale,
			positions["Raging"].X.Offset,
			positions["Raging"].Y.Scale,
			positions["Raging"].Y.Offset + 90
		)

		slashRagingBtn.Text = "Slash RP"
		slashRagingBtn.Font = Enum.Font.SourceSansBold
		slashRagingBtn.TextScaled = true
		slashRagingBtn.TextColor3 = Color3.fromRGB(170, 0, 255)
		slashRagingBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
		slashRagingBtn.BorderColor3 = Color3.fromRGB(170, 0, 255)
		slashRagingBtn.BorderSizePixel = 2

		local corner = Instance.new("UICorner")
		corner.CornerRadius = UDim.new(0, 12)
		corner.Parent = slashRagingBtn

		slashRagingBtn.Parent = gui

		slashRagingBtn.MouseButton1Click:Connect(function()
			if not ragingSwingSeq then return end

			manualSeqPlaying = true
			playSequence(ragingSwingSeq, false)

			local totalSwingTime = ragingSwingSeq:GetKeyframes()[#ragingSwingSeq:GetKeyframes()].Time
			local launchDistance = 12

			local connLaunch
			connLaunch = RunService.RenderStepped:Connect(function()
				local step = (launchDistance / totalSwingTime) * RunService.RenderStepped:Wait()
				rootPart.CFrame = rootPart.CFrame + rootPart.CFrame.LookVector * step
			end)

			task.delay(totalSwingTime, function()
				if connLaunch then connLaunch:Disconnect() end

				isRaging = false
				activeIdleSeq = normalIdleSeq
				activeWalkSeq = normalWalkSeq

				humanoid.WalkSpeed = DEFAULT_WALK_SPEED
				manualSeqPlaying = false

				slashRagingBtn:Destroy()
			end)
		end)
	end)
end)

print("Added Kill animations")

Features & Information

Kill animations added. Kill may make your character tweak a little

Community Comments (1)

CrypticCoderxCrypticCoderxMar 4, 2026

Cool :D

More Scripts for Universal Scripts