Hello so I was trying to play an animation on a unpublished place and the output says that :
23:52:38.314 Using AnimationId: rbxassetid://107025376890511 - Server - TestScript [READ ME!]:33
23:52:38.585 Failed to load animation with sanitized ID rbxassetid://107025376890511: Animation failed to load, assetId: https://assetdelivery.roblox.com/v1/asset?id=107025376890511&serverplaceid=0 - Studio
23:52:39.060 The experience doesn’t have access permission to use asset id 107025376890511. Click to share access - Studio
23:52:39.102 ANALYSIS BEGIN - Server - TestScript [READ ME!]:82
The script I used :
local AnimationClipProvider = game:GetService("AnimationClipProvider")
local RunService = game:GetService("RunService")
local ANIM_MAX_DURATION = 10
local ANIM_MAX_BOUNDS = 5
local ANIM_MAX_DELTA = 1
local ANIM_FPS = 30
local testDummy = script.Parent
local humanoid = testDummy.Humanoid
local localAnimation = testDummy.LocalAnimation
local rootPart = testDummy.HumanoidRootPart
local safeZone = testDummy.SafeZone
local animRef = localAnimation.Value
local animId = script:GetAttribute("AnimationId")
local animation = Instance.new("Animation")
if animRef and animRef:IsA("AnimationClip") then
warn("Using LocalAnimation:", animRef)
animation.AnimationId = AnimationClipProvider:RegisterAnimationClip(animRef)
else
-- Utilise directement l'ID sans GetAnimationClipAsync
local numeric = tonumber(animId)
if numeric then
animId = `rbxassetid://{numeric}`
end
warn("Using AnimationId:", animId)
animation.AnimationId = animId
end
animation.Parent = script
-- CORRECTION ICI : Utilise humanoid:LoadAnimation() au lieu de animator:LoadAnimation()
local track = humanoid:LoadAnimation(animation)
track.Looped = true
track:Play()
local limbs = {} :: {
[MeshPart]: Highlight
}
local lastPoses = {} :: {
[MeshPart]: CFrame
}
for i, child in testDummy:GetChildren() do
if child:IsA("MeshPart") then
local highlight = Instance.new("Highlight")
highlight.OutlineColor = Color3.new(1, 0, 0)
highlight.Enabled = false
highlight.Parent = child
limbs[child] = highlight
end
end
local baseLoopRange = NumberRange.new(0, 60000)
safeZone.Size = Vector3.one * ANIM_MAX_BOUNDS * 2
while true do
local frameDelay = tonumber(script:GetAttribute("FrameDelay")) or 0.1
local userLoopRange = script:GetAttribute("LoopRange")
local loopRange = if typeof(userLoopRange) == "NumberRange"
then userLoopRange
else baseLoopRange
task.wait(frameDelay)
local timePos = track.TimePosition
local frame = (timePos * ANIM_FPS) // 1
local maxFrames = "?"
if frame == 0 then
table.clear(lastPoses)
warn("ANALYSIS BEGIN")
end
if track.Length == track.Length then
local frameLen = (track.Length * ANIM_FPS) // 1
maxFrames = tostring(frameLen)
end
if timePos > ANIM_MAX_DURATION then
print("ANIMATION IS TOO LONG! CURRENTLY GOING", ANIM_MAX_DURATION - timePos, "SECONDS OVER LIMIT!!")
end
humanoid.DisplayName = `Frame: {frame} / {maxFrames}`
RunService.PostSimulation:Wait()
local origin = rootPart.CFrame
local outOfBounds = false
for part, highlight in limbs do
local cf = part.CFrame
local lastCF = lastPoses[part]
local showHighlight = false
if lastCF then
local diff = (cf.Position - lastCF.Position).Magnitude
local isError = diff > ANIM_MAX_DELTA
if isError and time() > 0.25 then
local severity = (diff - ANIM_MAX_DELTA)
showHighlight = true
local line = Instance.new("LineHandleAdornment")
line.Color3 = Color3.new(1, 0, 0)
line.Adornee = workspace.Terrain
line.Length = diff
line.CFrame = CFrame.lookAt(lastCF.Position, cf.Position)
line.Thickness = 2
line.Parent = script
local box = Instance.new("BoxHandleAdornment")
box.Size = part.Size / 2
box.AlwaysOnTop = true
box.ZIndex = 2
box.Transparency = 1 - severity
box.Color3 = Color3.new(1, 0, 0)
box.CFrame = lastCF:Lerp(cf, 0.5)
box.Adornee = workspace.Terrain
box.Parent = line
task.delay(1, function ()
line:Destroy()
end)
print(`[Frame {frame}/{maxFrames}] BodyPart '{part}' moved {diff} studs between this frame and the previous! (max: {ANIM_MAX_DELTA})`)
end
end
local offset = origin:ToObjectSpace(cf)
local distToOrigin = offset.Position.Magnitude
if distToOrigin > ANIM_MAX_BOUNDS then
print(`[Frame {frame}/{maxFrames}] BodyPart '{part}' moved outside max radius of {ANIM_MAX_BOUNDS} studs relative to the HumanoidRootPart!`)
showHighlight = true
outOfBounds = true
end
if timePos > ANIM_MAX_DURATION then
showHighlight = true
end
highlight.Enabled = showHighlight
lastPoses[part] = cf
end
safeZone.Color = if outOfBounds
then Color3.new(1, 0, 0)
else Color3.new(0, 1, 1)
if frame > loopRange.Max then
local jumpTo = loopRange.Min * (1 / ANIM_FPS)
track.TimePosition = jumpTo
table.clear(lastPoses)
else
track.TimePosition = timePos + (1 / ANIM_FPS)
end
end
But for strange reason, if I try to play the same animation with a basic script like this one, the animation plays :
local animation = script:WaitForChild(‘Animation’)
local humanoid = script.Parent:WaitForChild(‘Humanoid’)
local dance = humanoid:LoadAnimation(animation)
dance:play()
So that’s extremely weird.
Shout out to @Maximum_ADHD for making the original script.




