-- ANIMAÇÃO SKYBOX EMOTE (usando o mesmo método do menu) local player = game.Players.LocalPlayer local runService = game:GetService("RunService") -- Configurações (máximas) local ANIM_ID = 93224413172183 local SPEED = 20 local WEIGHT = 200 local FADE_IN = 200 local FADE_OUT = 200 local ALLOW_INVISIBLE = true local currentTrack = nil local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local humanoidRootPart = character:WaitForChild("HumanoidRootPart") -- Função para extrair ID (igual do menu) local function extractIdFromInput(input) local num = tonumber(input) if num then return num end local assetIdMatch = string.match(input, "rbxassetid://(%d+)") if assetIdMatch then return tonumber(assetIdMatch) end local catalogMatch = string.match(input, "roblox%.com/catalog/(%d+)") if catalogMatch then return tonumber(catalogMatch) end local libraryMatch = string.match(input, "roblox%.com/library/(%d+)") if libraryMatch then return tonumber(libraryMatch) end local assetMatch = string.match(input, "roblox%.com/asset/%?id=(%d+)") if assetMatch then return tonumber(assetMatch) end return tonumber(input) end -- Função que carrega a animação exatamente como no menu local function LoadTrack(id) if currentTrack then currentTrack:Stop(0) currentTrack = nil end local animId local ok, result = pcall(function() return game:GetObjects("rbxassetid://" .. tostring(id)) end) if ok and result and #result > 0 then local anim = result[1] if anim:IsA("Animation") then animId = anim.AnimationId else animId = "rbxassetid://" .. tostring(id) end else animId = "rbxassetid://" .. tostring(id) end local newAnim = Instance.new("Animation") newAnim.AnimationId = animId local newTrack = humanoid:LoadAnimation(newAnim) newTrack.Priority = Enum.AnimationPriority.Action4 local weight = WEIGHT if weight == 0 then weight = 0.001 end newTrack:Play(FADE_IN, weight, SPEED) newTrack:AdjustSpeed(SPEED) currentTrack = newTrack return newTrack end -- Para a animação local function StopTrack() if currentTrack then currentTrack:Stop(FADE_OUT) currentTrack = nil end end -- Desativa animações padrão do Roblox (opcional, mas evita conflito) local function disableRobloxAnimate() local animate = character:FindFirstChild("Animate") if animate then animate.Disabled = true end end local function enableRobloxAnimate() local animate = character:FindFirstChild("Animate") if animate then animate.Disabled = false end end -- Gerencia colisões (Allow Invisible) local originalCollisionStates = {} local function saveCollisionStates() for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") and part ~= humanoidRootPart then originalCollisionStates[part] = part.CanCollide end end end local function disableCollisions() if not ALLOW_INVISIBLE then return end for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") and part ~= humanoidRootPart then part.CanCollide = false end end end local function restoreCollisions() for part, canCollide in pairs(originalCollisionStates) do if part and part.Parent then part.CanCollide = canCollide end end originalCollisionStates = {} end -- Inicia a animação local function startAnimation() StopTrack() task.wait(0.1) local track = LoadTrack(ANIM_ID) if track and track.IsPlaying then disableRobloxAnimate() else enableRobloxAnimate() end end -- Gerencia colisões saveCollisionStates() disableCollisions() runService.Stepped:Connect(function() if character and character.Parent then if ALLOW_INVISIBLE then disableCollisions() else restoreCollisions() end else restoreCollisions() end end) -- Quando o personagem renascer player.CharacterAdded:Connect(function(newChar) character = newChar humanoid = character:WaitForChild("Humanoid") humanoidRootPart = character:WaitForChild("HumanoidRootPart") saveCollisionStates() if ALLOW_INVISIBLE then disableCollisions() end task.wait(0.2) startAnimation() end) -- Inicialização startAnimation()