
KeylessUniversal

--[[
WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
-- Combined Animation + Movement Script (R6 & R15 Compatible)
-- Auto-respawns with all features enabled
local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- Movement Configuration
local MASS_MULTIPLIER = 1
local CLASSIC_CLIMB_SPEED = 12
-- Track if this is the first setup
local isFirstSetup = true
local function setupCharacter(character)
-- Wait for essential parts
local humanoid = character:WaitForChild("Humanoid")
local rootPart = character:WaitForChild("HumanoidRootPart")
-- Detect if R6 or R15
local isR6 = character:FindFirstChild("Torso") ~= nil
local isR15 = character:FindFirstChild("UpperTorso") ~= nil
-- ============================================
-- ANIMATION SCRIPT SETUP (R6 ONLY)
-- ============================================
if isR6 then
-- Only break joints on FIRST setup, not on respawns
if isFirstSetup then
isFirstSetup = false
character:BreakJoints()
player.Character = nil
-- Wait for respawn
repeat wait() until player.Character
character = player.Character
humanoid = character:WaitForChild("Humanoid")
rootPart = character:WaitForChild("HumanoidRootPart")
end
-- Disable default animations
local AnimConnection = game.Workspace.DescendantAdded:Connect(function(c)
if c.Name == "Animate" then
c.Disabled = true
end
end)
-- Also disable any existing Animate script
local existingAnimate = character:FindFirstChild("Animate")
if existingAnimate then
existingAnimate.Disabled = true
end
wait(0.1)
function waitForChild(parent, childName)
local child = parent:findFirstChild(childName)
if child then return child end
while true do
child = parent.ChildAdded:wait()
if child.Name == childName then return child end
end
end
-- Animation declarations
local Figure = character
local Torso = waitForChild(Figure, "Torso")
local RightShoulder = waitForChild(Torso, "Right Shoulder")
local LeftShoulder = waitForChild(Torso, "Left Shoulder")
local RightHip = waitForChild(Torso, "Right Hip")
local LeftHip = waitForChild(Torso, "Left Hip")
local Neck = waitForChild(Torso, "Neck")
local pose = "Standing"
local toolAnim = "None"
local toolAnimTime = 0
local jumpMaxLimbVelocity = 0.75
-- Animation functions
function onRunning(speed)
if speed > 0 then
pose = "Running"
else
pose = "Standing"
end
end
function onDied()
pose = "Dead"
end
function onJumping()
pose = "Jumping"
end
function onClimbing()
pose = "Climbing"
end
function onGettingUp()
pose = "GettingUp"
end
function onFreeFall()
pose = "FreeFall"
end
function onFallingDown()
pose = "FallingDown"
end
function onSeated()
pose = "Seated"
end
function onPlatformStanding()
pose = "PlatformStanding"
end
function onSwimming(speed)
if speed > 0 then
pose = "Running"
else
pose = "Standing"
end
end
function moveJump()
RightShoulder.MaxVelocity = jumpMaxLimbVelocity
LeftShoulder.MaxVelocity = jumpMaxLimbVelocity
RightShoulder:SetDesiredAngle(3.14)
LeftShoulder:SetDesiredAngle(-3.14)
RightHip:SetDesiredAngle(0)
LeftHip:SetDesiredAngle(0)
end
function moveFreeFall()
RightShoulder.MaxVelocity = jumpMaxLimbVelocity
LeftShoulder.MaxVelocity = jumpMaxLimbVelocity
RightShoulder:SetDesiredAngle(3.14)
LeftShoulder:SetDesiredAngle(-3.14)
RightHip:SetDesiredAngle(0)
LeftHip:SetDesiredAngle(0)
end
function moveFallingDown()
RightShoulder.MaxVelocity = jumpMaxLimbVelocity
LeftShoulder.MaxVelocity = jumpMaxLimbVelocity
RightShoulder:SetDesiredAngle(3.14)
LeftShoulder:SetDesiredAngle(-3.14)
RightHip:SetDesiredAngle(0)
LeftHip:SetDesiredAngle(0)
end
function moveSit()
RightShoulder.MaxVelocity = 0.15
LeftShoulder.MaxVelocity = 0.15
RightShoulder:SetDesiredAngle(3.14 / 2)
LeftShoulder:SetDesiredAngle(-3.14 / 2)
RightHip:SetDesiredAngle(3.14 / 2)
LeftHip:SetDesiredAngle(-3.14 / 2)
end
function getTool()
for _, kid in ipairs(Figure:GetChildren()) do
if kid.className == "Tool" then return kid end
end
return nil
end
function getToolAnim(tool)
for _, c in ipairs(tool:GetChildren()) do
if c.Name == "toolanim" and c.className == "StringValue" then
return c
end
end
return nil
end
function animateTool()
if (toolAnim == "None") then
RightShoulder:SetDesiredAngle(1.57)
return
end
if (toolAnim == "Slash") then
RightShoulder.MaxVelocity = 0.5
RightShoulder:SetDesiredAngle(0)
return
end
if (toolAnim == "Lunge") then
RightShoulder.MaxVelocity = 0.5
LeftShoulder.MaxVelocity = 0.5
RightHip.MaxVelocity = 0.5
LeftHip.MaxVelocity = 0.5
RightShoulder:SetDesiredAngle(1.57)
LeftShoulder:SetDesiredAngle(1.0)
RightHip:SetDesiredAngle(1.57)
LeftHip:SetDesiredAngle(1.0)
return
end
end
function move(time)
local amplitude
local frequency
-- Check if player is NOT in idle, walking, or sitting state
if pose ~= "Standing" and pose ~= "Running" and pose ~= "Seated" then
moveFreeFall()
return
end
if (pose == "Seated") then
moveSit()
return
end
local climbFudge = 0
if (pose == "Running") then
if (RightShoulder.CurrentAngle > 1.5 or RightShoulder.CurrentAngle < -1.5) then
RightShoulder.MaxVelocity = jumpMaxLimbVelocity
else
RightShoulder.MaxVelocity = 0.15
end
if (LeftShoulder.CurrentAngle > 1.5 or LeftShoulder.CurrentAngle < -1.5) then
LeftShoulder.MaxVelocity = jumpMaxLimbVelocity
else
LeftShoulder.MaxVelocity = 0.15
end
amplitude = 1
frequency = 9
elseif (pose == "Climbing") then
RightShoulder.MaxVelocity = 0.5
LeftShoulder.MaxVelocity = 0.5
amplitude = 1
frequency = 9
climbFudge = 3.14
else
amplitude = 0.1
frequency = 1
end
desiredAngle = amplitude * math.sin(time * frequency)
RightShoulder:SetDesiredAngle(desiredAngle + climbFudge)
LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge)
RightHip:SetDesiredAngle(-desiredAngle)
LeftHip:SetDesiredAngle(-desiredAngle)
local tool = getTool()
if tool then
animStringValueObject = getToolAnim(tool)
if animStringValueObject then
toolAnim = animStringValueObject.Value
animStringValueObject.Parent = nil
toolAnimTime = time + 0.3
end
if time > toolAnimTime then
toolAnimTime = 0
toolAnim = "None"
end
animateTool()
else
toolAnim = "None"
toolAnimTime = 0
end
end
-- Connect animation events
humanoid.Died:connect(onDied)
humanoid.Running:connect(onRunning)
humanoid.Jumping:connect(onJumping)
humanoid.Climbing:connect(onClimbing)
humanoid.GettingUp:connect(onGettingUp)
humanoid.FreeFalling:connect(onFreeFall)
humanoid.FallingDown:connect(onFallingDown)
humanoid.Seated:connect(onSeated)
humanoid.PlatformStanding:connect(onPlatformStanding)
humanoid.Swimming:connect(onSwimming)
-- Start animation loop
local animationActive = true
task.spawn(function()
while Figure.Parent ~= nil and animationActive do
local _, time = wait(0.1)
pcall(function()
move(time)
end)
end
end)
-- Cleanup animation on death
humanoid.Died:Connect(function()
animationActive = false
if AnimConnection then
AnimConnection:Disconnect()
end
end)
else
-- R15: Just disable default animations for the effect
local existingAnimate = character:FindFirstChild("Animate")
if existingAnimate then
existingAnimate.Disabled = true
end
print("R15 character detected - animations disabled for effect")
end
-- ============================================
-- MOVEMENT SCRIPT SETUP (WORKS FOR BOTH R6 AND R15)
-- ============================================
-- Function to modify a single part
local function modifyPart(part)
if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
part.CanCollide = true
part.CanTouch = true
part.CanQuery = true
part.Massless = false
local currentProps = part.CustomPhysicalProperties
local density = currentProps and currentProps.Density or 0.7
local friction = currentProps and currentProps.Friction or 0.3
local elasticity = currentProps and currentProps.Elasticity or 0.5
part.CustomPhysicalProperties = PhysicalProperties.new(
density * MASS_MULTIPLIER,
friction * 2,
elasticity * 0.2,
1,
1
)
end
end
-- Disable default Roblox climbing
humanoid:SetStateEnabled(Enum.HumanoidStateType.Climbing, false)
-- Apply to all body parts
for _, part in pairs(character:GetDescendants()) do
modifyPart(part)
end
-- Create BodyGyro (only active during jumps)
local bodyGyro = Instance.new("BodyGyro")
bodyGyro.Name = "UprightGyro"
bodyGyro.MaxTorque = Vector3.new(0, 0, 0)
bodyGyro.P = 50000
bodyGyro.D = 5000
bodyGyro.CFrame = rootPart.CFrame
bodyGyro.Parent = rootPart
local isJumping = false
local jumpMomentum = Vector3.new(0, 0, 0)
-- Classic climbing variables
local isClimbing = false
local climbingPart = nil
local UserInputService = game:GetService("UserInputService")
local function checkForClimbableSurface()
local touchingParts = workspace:GetPartsInPart(rootPart)
for _, part in pairs(touchingParts) do
if part:IsA("BasePart") and not part:IsDescendantOf(character) and part.CanCollide then
local normal = (rootPart.Position - part.Position).Unit
if math.abs(normal.Y) < 0.5 then
return part
end
end
end
return nil
end
local climbConnection
local function startClimbing(surface)
if isClimbing then return end
isClimbing = true
climbingPart = surface
humanoid.PlatformStand = true
local bodyVelocity = Instance.new("BodyVelocity")
bodyVelocity.Name = "ClimbVelocity"
bodyVelocity.MaxForce = Vector3.new(0, 4000, 0)
bodyVelocity.Velocity = Vector3.new(0, 0, 0)
bodyVelocity.Parent = rootPart
climbConnection = game:GetService("RunService").Heartbeat:Connect(function()
if not isClimbing or not bodyVelocity or not bodyVelocity.Parent then
return
end
local touchingSurface = checkForClimbableSurface()
if not touchingSurface then
if climbConnection then
climbConnection:Disconnect()
end
isClimbing = false
humanoid.PlatformStand = false
if bodyVelocity and bodyVelocity.Parent then
bodyVelocity:Destroy()
end
return
end
local moveDirection = humanoid.MoveDirection
local climbVelocity = Vector3.new(0, 0, 0)
if moveDirection.Magnitude > 0 then
local upInput = -moveDirection.Z
climbVelocity = Vector3.new(0, upInput * CLASSIC_CLIMB_SPEED, 0)
end
bodyVelocity.Velocity = climbVelocity
end)
end
local function stopClimbing()
if not isClimbing then return end
isClimbing = false
climbingPart = nil
humanoid.PlatformStand = false
if climbConnection then
climbConnection:Disconnect()
climbConnection = nil
end
local climbVel = rootPart:FindFirstChild("ClimbVelocity")
if climbVel then
climbVel:Destroy()
end
end
-- Detect climbing
game:GetService("RunService").Heartbeat:Connect(function()
if not isJumping and not isClimbing then
local surface = checkForClimbableSurface()
if surface and humanoid.MoveDirection.Magnitude > 0 then
startClimbing(surface)
end
end
end)
-- Jump to stop climbing
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if not gameProcessed and input.KeyCode == Enum.KeyCode.Space then
if isClimbing then
stopClimbing()
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
elseif humanoid.PlatformStand == true then
humanoid.PlatformStand = false
humanoid:ChangeState(Enum.HumanoidStateType.Running)
end
end
end)
-- Update gyro - ONLY active during jumps
game:GetService("RunService").Heartbeat:Connect(function()
if bodyGyro and bodyGyro.Parent and rootPart then
local state = humanoid:GetState()
if state == Enum.HumanoidStateType.Jumping or state == Enum.HumanoidStateType.Freefall then
if not isJumping then
isJumping = true
bodyGyro.MaxTorque = Vector3.new(500000, 500000, 500000)
local lookVector = rootPart.CFrame.LookVector
local uprightLook = Vector3.new(lookVector.X, 0, lookVector.Z).Unit
bodyGyro.CFrame = CFrame.lookAt(Vector3.zero, uprightLook) * CFrame.Angles(0, math.pi, 0)
end
else
if isJumping then
isJumping = false
bodyGyro.MaxTorque = Vector3.new(0, 0, 0)
end
end
end
end)
-- State changes
humanoid.StateChanged:Connect(function(oldState, newState)
if newState == Enum.HumanoidStateType.Jumping then
jumpMomentum = rootPart.AssemblyVelocity
rootPart.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
if isClimbing then
stopClimbing()
end
elseif newState == Enum.HumanoidStateType.Freefall then
rootPart.AssemblyAngularVelocity = Vector3.new(0, 0, 0)
elseif newState == Enum.HumanoidStateType.Landed then
isJumping = false
bodyGyro.MaxTorque = Vector3.new(0, 0, 0)
jumpMomentum = Vector3.new(0, 0, 0)
end
end)
local isAirborne = false
-- Air control management with momentum preservation
humanoid.StateChanged:Connect(function(oldState, newState)
if newState == Enum.HumanoidStateType.Jumping then
isAirborne = true
task.wait(0.05)
if humanoid:GetState() == Enum.HumanoidStateType.Jumping or
humanoid:GetState() == Enum.HumanoidStateType.Freefall then
humanoid.PlatformStand = true
end
elseif newState == Enum.HumanoidStateType.Freefall then
isAirborne = true
if not humanoid.PlatformStand then
humanoid.PlatformStand = true
end
elseif newState == Enum.HumanoidStateType.Landed then
task.wait(0.1)
isAirborne = false
humanoid.PlatformStand = false
humanoid:ChangeState(Enum.HumanoidStateType.Running)
end
end)
-- Safety auto-recover
task.spawn(function()
while character.Parent and humanoid.Health > 0 do
task.wait(0.5)
if humanoid.PlatformStand == true and
humanoid:GetState() ~= Enum.HumanoidStateType.Jumping and
humanoid:GetState() ~= Enum.HumanoidStateType.Freefall and
not isClimbing then
humanoid.PlatformStand = false
humanoid:ChangeState(Enum.HumanoidStateType.Running)
end
end
end)
-- Force collisions - Works for both R6 and R15
local function forcePartCollisions(part)
if part:IsA("BasePart") then
-- R6 limb detection
local isR6Limb = part.Name:lower():find("arm") or
part.Name:lower():find("leg")
-- R15 limb detection
local isR15Limb = part.Name:lower():find("hand") or
part.Name:lower():find("lowerarm") or
part.Name:lower():find("upperarm") or
part.Name:lower():find("lowerleg") or
part.Name:lower():find("upperleg") or
part.Name:lower():find("foot")
-- Torso detection for both
local isTorso = part.Name:lower():find("torso") or
part.Name:lower():find("uppertrunk") or
part.Name:lower():find("lowertrunk")
local isHead = part.Name:lower() == "head"
local isAccessory = part.Parent and part.Parent:IsA("Accessory")
if ((isR6Limb or isR15Limb or isTorso or isHead) and not isAccessory) then
pcall(function()
part.CollisionGroup = "Default"
end)
part.CanCollide = true
part.CanTouch = true
part.CanQuery = true
-- More aggressive collision enforcement especially for legs
task.spawn(function()
while part and part.Parent and character.Parent do
-- Force collision EVERY frame for legs to fix landing issues
if part.Name:lower():find("leg") or part.Name:lower():find("foot") then
if not part.CanCollide then
part.CanCollide = true
end
task.wait() -- Every frame check
else
if not part.CanCollide then
part.CanCollide = true
end
task.wait(0.1) -- Regular check for other parts
end
end
end)
end
end
end
for _, part in pairs(character:GetDescendants()) do
forcePartCollisions(part)
end
character.DescendantAdded:Connect(function(descendant)
if descendant:IsA("BasePart") then
task.wait(0.1)
modifyPart(descendant)
forcePartCollisions(descendant)
end
end)
-- Cleanup on death
humanoid.Died:Connect(function()
if bodyGyro then
bodyGyro:Destroy()
end
stopClimbing()
end)
if isR6 then
print("Combined script loaded - R6 animations + heavy physics!")
else
print("Combined script loaded - R15 movement physics (animations disabled for effect)!")
end
end
-- Setup on spawn/respawn
player.CharacterAdded:Connect(function(character)
setupCharacter(character)
end)
-- Setup current character if it exists
if player.Character then
setupCharacter(player.Character)
end



is it only client sided?
@Airookz No, I've tested this before and other should be able to see it since it's just an animation script.
Pretty Nice