If you ever notice the animation in Speed Run 4 I was wondering where do you put the animation script? Like if in Workspace,StarterPack,ETC
Here is the script? Is there any problems in it?
function waitForChild(instance, name, rec)
if not instance:FindFirstChild(name, rec == true) then
repeat wait() until instance:FindFirstChild(name, rec == true)
end
return instance:FindFirstChild(name, rec == true)
end
function waitForProperty(instance, name)
if not instance[name] then
repeat wait() until instance[name]
end
return instance[name]
end
local rs = game:service("RunService").Stepped
local anim = waitForChild(script, "KeyframeSequence")
local play = waitForChild(script, "Play")
local stop = waitForChild(script, "Stop")
local keyr = waitForChild(script, "KeyframeReached")
local loop = waitForChild(script, "EnableLoop")
local model = waitForProperty(script, "Parent")
local fadeOut = false
local steps = {}
local start = tick()
local fadeTime = 0.1
local speed = 1
local oldstep
local mode
local offset = {
["Head"] = {
c0 = CFrame.new(0, 1, 0) * CFrame.fromAxisAngle(Vector3.new(-1, 0, 0), math.pi/2),
c1 = CFrame.new(0, -0.5, 0) * CFrame.fromAxisAngle(Vector3.new(1, 0, 0), -math.pi/2)},
["Torso"] = {
c0 = CFrame.new(0, 0, 0) * CFrame.fromAxisAngle(Vector3.new(-1, 0, 0), math.pi/2),
c1 = CFrame.new(0, 0, 0) * CFrame.fromAxisAngle(Vector3.new(1, 0, 0), -math.pi/2)},
["Left Leg"] = {
c0 = CFrame.new(-0.5, -1, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), -math.pi/2),
c1 = CFrame.new(0, 1, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), -math.pi/2)},
["Right Leg"] = {
c0 = CFrame.new(0.5, -1, 0) * CFrame.fromAxisAngle(Vector3.new(0, -1, 0), -math.pi/2),
c1 = CFrame.new(0, 1, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), math.pi/2)},
["Left Arm"] = {
c0 = CFrame.new(-1.0, 0.5, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), -math.pi/2),
c1 = CFrame.new(0.5, 0.5, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), -math.pi/2)},
["Right Arm"] = {
c0 = CFrame.new(1.0, 0.5, 0) * CFrame.fromAxisAngle(Vector3.new(0, -1, 0), -math.pi/2),
c1 = CFrame.new(-0.5, 0.5, 0) * CFrame.fromAxisAngle(Vector3.new(0, 1, 0), math.pi/2)}
}
function sortSteps(obj)
local t, ret = 0, {}
for k, v in next, obj:GetChildren() do
ret[#ret + 1] = {v, t}
t = t + v.Time
end
table.sort(ret, function(a, b) return a[2] < b[2] end)
return ret
end
function jointByPart1(par, part1)
for k, v in next, par:GetChildren() do
if v:IsA("JointInstance") and v.Part1 == part1 then
return v
end
local find = jointByPart1(v, part1)
if find then
return find
end
end
return
end
function allposes(par)
local t = {}
for k, v in next, par:GetChildren() do
if v:IsA("Pose") then
t[tostring(v)] = tostring(v)
end
local other = allposes(v)
for k, v in next, other do
t[tostring(v)] = tostring(v)
end
end
return t
end
function poses(par, assoc)
local t = {}
for k, v in next, par:GetChildren() do
if v:IsA("Pose") then
t[(assoc and tostring(v) or #t + 1)] = v
end
local other = poses(v)
for k, v in next, other do
t[(assoc and tostring(v) or #t + 1)] = v
end
end
return t
end
function lerp(obj, from, to, p)
if offset[tostring(obj)] then
if pcall(function() return game.IsA(from, "Pose") end) then
from = from.CFrame
end
local joint = jointByPart1(model, obj)
local x1, y1, z1 = from:toEulerAnglesXYZ()
local x2, y2, z2 = to:toEulerAnglesXYZ()
joint.C0 = offset[tostring(obj)].c0 * CFrame.new(from.p:Lerp(to.p, p)) * CFrame.Angles(x1 + (x2 - x1) * p, y1 + (y2 - y1) * p, z1 + (z2 - z1) * p)
end
end
rs:connect(function(timer, stepped)
if mode or fadeOut then
local mystep = 0
local perc = 0
local elaps = (tick() - start) * speed
for k, v in next, steps do
if elaps > v[2] and (not steps[k + 1] or (elaps <= steps[k + 1][2])) then
mystep = k
if not fadeOut then
perc = (elaps - v[2]) / (mystep == 1 and speed * fadeTime or (mystep == #steps and (not mode.Loop and speed * fadeTime) or v[1].Time))
else
perc = (elaps - v[2]) / fadeTime
end
end
end
if mystep ~= oldstep then
oldstep = mystep
keyr:Fire(tostring(steps[mystep][1]))
end
if mystep == #steps or fadeOut then
if not fadeOut and mode and mode.Loop then
start = tick()
elseif perc <= 1 then
for k, v in next, allposes(mode) do
if model:FindFirstChild(tostring(v)) and model:FindFirstChild(tostring(v)):IsA("BasePart") and offset[tostring(v)] then
lerp(model:FindFirstChild(tostring(v)),
(steps[mystep - 1] and poses(steps[mystep - 1][1], true)[tostring(v)] or CFrame.new()),
CFrame.new(),
perc)
end
end
else
for k, v in next, allposes(mode) do
if model:FindFirstChild(tostring(v)) and model:FindFirstChild(tostring(v)):IsA("BasePart") and offset[tostring(v)] then
lerp(model:FindFirstChild(tostring(v)),
(steps[mystep - 1] and poses(steps[mystep - 1][1], true)[tostring(v)] or CFrame.new()),
CFrame.new(),
1)
end
end
mode = nil
oldstep = nil
fadeOut = false
end
elseif mode then
for k, v in next, poses(steps[mystep][1]) do
if model:FindFirstChild(tostring(v)) and model:FindFirstChild(tostring(v)):IsA("BasePart") and offset[tostring(v)] then
lerp(model:FindFirstChild(tostring(v)),
(steps[mystep - 1] and poses(steps[mystep - 1][1], true)[tostring(v)] or CFrame.new()),
v.CFrame,
perc)
end
end
end
end
end)
play.Event:connect(function(_fadeTime, _speed)
if not mode then
start = tick()
steps = sortSteps(anim)
oldstep = nil
fadeTime = type(_fadeTime) == "number" and _fadeTime or 0.1
speed = type(_speed) == "number" and _speed or 1
mode = anim
end
end)
stop.Event:connect(function()
oldstep = nil
fadeOut = true
repeat
rs:wait()
until not fadeOut
mode = nil
speed = 1
fadeTime = 0.1
-- do stuff?
end)
loop.Event:connect(function(on) -- to skip annoying stuff.
anim.Loop = not not on
end)

1 comment
Can you please add more lines before the open code-block?