local ANIMATIONS = { Idle = {id = "rbxassetid://121514984215513", track = nil, shouldLoop = true}, Walk = {id = "rbxassetid://121514984215513", track = nil, shouldLoop = true}, Run = {id = "rbxassetid://123726206807935", track = nil, shouldLoop = true}, SuperRun = {id = "rbxassetid://82114565363304", track = nil, shouldLoop = true}, Jump = {id = "rbxassetid://71459504024777", track = nil, shouldLoop = false}, Fall = {id = "rbxassetid://77532784364790", track = nil, shouldLoop = true}, PeelCharge = {id = "rbxassetid://82114565363304", track = nil, shouldLoop = true} } local function loadAsset(id) local ok, objects = pcall(game.GetObjects, game, "rbxassetid://" .. id) if not ok or not objects or #objects == 0 then return nil end return objects[1]:Clone() end local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local camera = workspace.CurrentCamera local character, root, humanoid local function setupCharacter(char) character = char root = char:WaitForChild("HumanoidRootPart") humanoid = char:WaitForChild("Humanoid") end if player.Character then setupCharacter(player.Character) end player.CharacterAdded:Connect(setupCharacter) -- ====================== HOOK ABILITY (TUFF + Made by the goat itsjustyumy.) ====================== local hookCooldown = false local grappling = false local pulling = false local cancelPull = false local cooldownTime = 4 local maxDistance = 250 local hookPart, tipPart, beam, rope, rootAttachment, hookAttachment local hookCooldownLbl = nil local footAttachment = Instance.new("Attachment") footAttachment.Name = "FootAttachment" footAttachment.Position = Vector3.new(0, -2, 0) footAttachment.Parent = root or workspace local dustEmitter = Instance.new("ParticleEmitter") dustEmitter.Texture = "rbxassetid://363622340" dustEmitter.Color = ColorSequence.new(Color3.fromRGB(150,150,150)) dustEmitter.Rate = 50 dustEmitter.Lifetime = NumberRange.new(0.3,0.5) dustEmitter.Speed = NumberRange.new(2,4) dustEmitter.Rotation = NumberRange.new(0,360) dustEmitter.RotSpeed = NumberRange.new(-180,180) dustEmitter.Size = NumberSequence.new({NumberSequenceKeypoint.new(0,0.5), NumberSequenceKeypoint.new(1,0)}) dustEmitter.Enabled = false dustEmitter.Parent = footAttachment local windEmitter = Instance.new("ParticleEmitter") windEmitter.Texture = "rbxassetid://243660364" windEmitter.Color = ColorSequence.new(Color3.fromRGB(200,200,255)) windEmitter.Rate = 80 windEmitter.Lifetime = NumberRange.new(0.2,0.4) windEmitter.Speed = NumberRange.new(10,15) windEmitter.VelocitySpread = 180 windEmitter.Size = NumberSequence.new({NumberSequenceKeypoint.new(0,0.3), NumberSequenceKeypoint.new(1,0)}) windEmitter.Enabled = false windEmitter.Parent = root or workspace local function startParticles() dustEmitter.Enabled = true windEmitter.Enabled = true end local function stopParticles() dustEmitter.Enabled = false windEmitter.Enabled = false end local function flashEffect(char, duration, color) if not char then return end local highlight = Instance.new("Highlight") highlight.Adornee = char highlight.OutlineColor = Color3.fromRGB(255,255,255) highlight.FillColor = color highlight.FillTransparency = 1 highlight.OutlineTransparency = 0 highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop highlight.Parent = char local fillTween = TweenService:Create(highlight, TweenInfo.new(duration/2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {FillTransparency = 0}) fillTween:Play() fillTween.Completed:Connect(function() TweenService:Create(highlight, TweenInfo.new(duration/2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {FillTransparency = 1}):Play() end) local outlineTween = TweenService:Create(highlight, TweenInfo.new(duration, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {OutlineTransparency = 1}) outlineTween:Play() outlineTween.Completed:Connect(function() if highlight then highlight:Destroy() end end) end local function getNearestPlayer() local nearest, shortest = nil, math.huge if not root then return nil end local myPos = root.Position for _, plr in ipairs(Players:GetPlayers()) do if plr ~= player and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then local dist = (plr.Character.HumanoidRootPart.Position - myPos).Magnitude if dist < shortest and dist <= maxDistance then shortest = dist nearest = plr end end end return nearest end local function shootGrapple() if not root or grappling then return end local target = getNearestPlayer() if not target or not target.Character or not target.Character:FindFirstChild("HumanoidRootPart") then return end local targetPos = target.Character.HumanoidRootPart.Position local origin = root.Position local direction = (targetPos - origin).Unit hookPart = Instance.new("Part") hookPart.Size = Vector3.new(0.7,0.7,0.7) hookPart.Position = origin hookPart.Anchored = true hookPart.CanCollide = false hookPart.Transparency = 1 hookPart.Parent = workspace tipPart = Instance.new("Part") tipPart.Size = Vector3.new(0.5,0.5,0.5) tipPart.Position = origin tipPart.Anchored = true tipPart.CanCollide = false tipPart.Color = Color3.fromRGB(255,255,255) tipPart.Parent = workspace rootAttachment = Instance.new("Attachment", root) hookAttachment = Instance.new("Attachment", tipPart) local trailAttachment0 = Instance.new("Attachment"); trailAttachment0.Position = Vector3.new(0,0,0); trailAttachment0.Parent = tipPart local trailAttachment1 = Instance.new("Attachment"); trailAttachment1.Position = Vector3.new(0,0,-1.5); trailAttachment1.Parent = tipPart local trail = Instance.new("Trail") trail.Attachment0 = trailAttachment0 trail.Attachment1 = trailAttachment1 trail.Lifetime = 0.5 trail.Color = ColorSequence.new(Color3.fromRGB(255,255,255)) trail.WidthScale = NumberSequence.new({NumberSequenceKeypoint.new(0,1),NumberSequenceKeypoint.new(0.3,0.7),NumberSequenceKeypoint.new(0.6,0.4),NumberSequenceKeypoint.new(1,0.05)}) trail.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,0),NumberSequenceKeypoint.new(0.7,0.1),NumberSequenceKeypoint.new(1,1)}) trail.MinLength = 0.1 trail.FaceCamera = true trail.Parent = tipPart beam = Instance.new("Beam") beam.Attachment0 = rootAttachment beam.Attachment1 = hookAttachment beam.Width0 = 0.15 beam.Width1 = 0.15 beam.Color = ColorSequence.new(Color3.new(0,0,0)) beam.Transparency = NumberSequence.new(0) beam.FaceCamera = true beam.Parent = root flashEffect(character, 0.4, Color3.fromRGB(173,216,230)) local velocity = direction * 140 + Vector3.new(0,60,0) local gravity = Vector3.new(0,-workspace.Gravity,0) local pos = origin local hitSomething = false while true do local dt = task.wait() velocity += gravity * dt local newPos = pos + velocity * dt local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {character} rayParams.FilterType = Enum.RaycastFilterType.Blacklist local result = workspace:Raycast(pos, newPos-pos, rayParams) if result and result.Instance.CanCollide then hookPart.Position = result.Position tipPart.Position = result.Position hitSomething = true flashEffect(character, 0.4, Color3.fromRGB(255,255,255)) break end pos = newPos hookPart.Position = pos tipPart.Position = pos if (pos - origin).Magnitude > maxDistance then break end end if not hitSomething then flashEffect(character, 0.6, Color3.fromRGB(144,238,144)) end rope = Instance.new("RopeConstraint") rope.Attachment0 = rootAttachment rope.Attachment1 = hookAttachment rope.Length = (root.Position - hookPart.Position).Magnitude rope.Visible = false rope.Parent = root if hookPart then hookPart:Destroy() hookPart = nil end if tipPart then tipPart:Destroy() tipPart = nil end grappling = true end local function pullPlayer() if not hookPart or not root then return end cancelPull = false startParticles() local forceAttachment = Instance.new("Attachment", root) local vectorForce = Instance.new("VectorForce") vectorForce.Attachment0 = forceAttachment vectorForce.RelativeTo = Enum.ActuatorRelativeTo.World vectorForce.Parent = root local forcePower = 4500 local maxSpeed = 80 while true do if cancelPull then break end local distance = (hookPart.Position - root.Position).Magnitude if distance <= 6 then flashEffect(character, 0.6, Color3.fromRGB(144,238,144)) break end local dir = (hookPart.Position - root.Position).Unit local speed = root.AssemblyLinearVelocity.Magnitude if speed < maxSpeed then vectorForce.Force = dir * forcePower else vectorForce.Force = Vector3.new(0,0,0) end task.wait() end if vectorForce then vectorForce:Destroy() end if forceAttachment then forceAttachment:Destroy() end stopParticles() removeHook() end local function removeHook() cancelPull = true stopParticles() if hookPart then hookPart:Destroy() hookPart = nil end if tipPart then tipPart:Destroy() tipPart = nil end if beam then beam:Destroy() beam = nil end if rope then rope:Destroy() rope = nil end if rootAttachment then rootAttachment:Destroy() rootAttachment = nil end if hookAttachment then hookAttachment:Destroy() hookAttachment = nil end task.spawn(startHookCooldown) grappling = false pulling = false end local function startHookCooldown() hookCooldown = true for i = cooldownTime, 0.1, -0.1 do if hookCooldownLbl then hookCooldownLbl.Text = string.format("%.1f", i) end task.wait(0.1) end if hookCooldownLbl then hookCooldownLbl.Text = "" end hookCooldown = false end local function activateHook() if hookCooldown then return end shootGrapple() task.wait(0.3) pullPlayer() end local function playSound(id, parent, volume) if not parent then return end local sound = Instance.new("Sound") sound.SoundId = "rbxassetid://" .. tostring(id) sound.Volume = volume or 1 sound.Parent = parent sound:Play() sound.Ended:Connect(function() sound:Destroy() end) end local CONFIG = { HitboxSize = Vector3.new(10, 10, 10), Transparency = 1, TargetAnimationId = "122414915357020" } local function getNumericAnimationId(assetId) return tostring(assetId):match("%d+") end local trackedPlayers = {} local function isPlayingTargetAnimation(player) if not player or not player.Character then return false end local humanoid = player.Character:FindFirstChildOfClass("Humanoid") if not humanoid then return false end local animator = humanoid.Animator if not animator then return false end for _, track in ipairs(animator:GetPlayingAnimationTracks()) do local anim = track.Animation if anim and getNumericAnimationId(anim.AnimationId) == CONFIG.TargetAnimationId then return true end end return false end local function createHitboxForTarget(targetPlayer) if trackedPlayers[targetPlayer] then return end local hitbox = Instance.new("Part") hitbox.Size = CONFIG.HitboxSize hitbox.Transparency = CONFIG.Transparency hitbox.Anchored = true hitbox.CanCollide = false hitbox.Material = Enum.Material.Neon hitbox.BrickColor = BrickColor.new("Bright red") hitbox.Parent = Workspace local data = { hitbox = hitbox, teleportActive = false, cooldownActive = false, teleportLoop = nil, touchConnection = nil, touchEndConnection = nil, followLoop = nil } data.touchConnection = hitbox.Touched:Connect(function(part) if part.Parent == LocalPlayer.Character then if not data.cooldownActive then data.teleportActive = true if not data.teleportLoop then data.teleportLoop = RunService.Heartbeat:Connect(function() if data.teleportActive and targetPlayer and targetPlayer.Character then local localChar = LocalPlayer.Character local targetChar = targetPlayer.Character if localChar and targetChar then local localRoot = localChar:FindFirstChild("HumanoidRootPart") or localChar.PrimaryPart local targetRoot = targetChar:FindFirstChild("HumanoidRootPart") or targetChar.PrimaryPart if localRoot and targetRoot then localRoot.CFrame = targetRoot.CFrame end end end end) end end end end) data.touchEndConnection = hitbox.TouchEnded:Connect(function(part) end) trackedPlayers[targetPlayer] = data spawn(function() while trackedPlayers[targetPlayer] and targetPlayer.Character do local root = targetPlayer.Character:FindFirstChild("HumanoidRootPart") or targetPlayer.Character.PrimaryPart if root then hitbox.CFrame = root.CFrame end wait(0.03) end end) end local function removeHitboxForTarget(targetPlayer) local data = trackedPlayers[targetPlayer] if data then if data.hitbox then data.hitbox:Destroy() end if data.teleportLoop then data.teleportLoop:Disconnect() end if data.touchConnection then data.touchConnection:Disconnect() end if data.touchEndConnection then data.touchEndConnection:Disconnect() end trackedPlayers[targetPlayer] = nil end end local function updateTracking() for player, data in pairs(trackedPlayers) do if not isPlayingTargetAnimation(player) then removeHitboxForTarget(player) end end for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer and isPlayingTargetAnimation(player) then if not trackedPlayers[player] then createHitboxForTarget(player) end end end end RunService.Heartbeat:Connect(updateTracking) UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.Space then for player, data in pairs(trackedPlayers) do if data.teleportActive and not data.cooldownActive then local character = LocalPlayer.Character if character then local root = character:FindFirstChild("HumanoidRootPart") or character.PrimaryPart if root and data.hitbox then local localPos = data.hitbox.CFrame:PointToObjectSpace(root.Position) local halfSize = data.hitbox.Size / 2 if math.abs(localPos.X) <= halfSize.X and math.abs(localPos.Y) <= halfSize.Y and math.abs(localPos.Z) <= halfSize.Z then data.teleportActive = false data.cooldownActive = true task.delay(1, function() if trackedPlayers[player] then data.cooldownActive = false end end) end end end end end end end) player.CharacterRemoving:Connect(function() for plr, data in pairs(trackedPlayers) do removeHitboxForTarget(plr) end end) print("sonic peelout for metal loaded : " .. CONFIG.TargetAnimationId) print("Touch sonic to start teleport like an chud. Press SPACE to get out of the peelout for 1 secound.") local Players = game:GetService("Players") local player = Players.LocalPlayer player.CharacterAdded:Connect(function() task.defer(function() local src = script.Source local new = Instance.new("LocalScript") new.Name = script.Name new.Source = src new.Parent = player:WaitForChild("PlayerGui") end) end) local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local char = player.Character or player.CharacterAdded:Wait() local humanoid = char:WaitForChild("Humanoid") local root = char:WaitForChild("HumanoidRootPart") local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled local MAX_SPEEDCAP = 90 local ACCELERATION = 60 local DECELERATION = 650 local VERTICAL_BOOST = 0.14 local FLY = { MaxMeter = 1000, RegenDelay = 2.9, DrainIdle = 100 / 2.6, DrainFast = 100 / 3.9, HighSpeedMultiplier = 4, RegenRate = 100.8 } local FLY_ANIMATION_ID = "rbxassetid://77532784364790" local STAMINA_FULL_SOUND = "rbxassetid://7547436144" local UI_CONFIG = { ImageFrameSize = UDim2.new(0, 60, 0, 210), StaminaBarSize = UDim2.new(0, 170, 0, 20), StaminaBarPosition = UDim2.new(0, -57, 0, 90), FadeSpeed = 5, StudsOffset = Vector3.new(3, 2, 0), MaxDistance = 200, } local flyMeter = FLY.MaxMeter local flying = false local flyVelocity = Vector3.new(0, 0, 0) local regenLocked = false local jumpHeld = false local hasDrained = false local wasFullLastTick = true local bv, bg, highlight, windSfx local flyConn local flyAnimTrack local flyGui = Instance.new("BillboardGui") flyGui.Name = "FlyMeter" flyGui.Adornee = root flyGui.AlwaysOnTop = true flyGui.MaxDistance = UI_CONFIG.MaxDistance flyGui.Size = UI_CONFIG.ImageFrameSize flyGui.StudsOffset = UI_CONFIG.StudsOffset flyGui.ResetOnSpawn = false flyGui.Parent = player.PlayerGui local anchorFrame = Instance.new("Frame") anchorFrame.Name = "AnchorFrame" anchorFrame.AnchorPoint = Vector2.new(0.5, 0.5) anchorFrame.Position = UDim2.new(0.5, 0, 0.5, 0) anchorFrame.Size = UDim2.new(1, 0, 1, 0) anchorFrame.BackgroundTransparency = 1 anchorFrame.Parent = flyGui local imageLabel = Instance.new("ImageLabel") imageLabel.Name = "FlyBarImage" imageLabel.Size = UDim2.new(1, 0, 1, 0) imageLabel.Position = UDim2.new(0, 0, 0, 0) imageLabel.BackgroundTransparency = 1 imageLabel.Image = "rbxassetid://93111832921348" imageLabel.ImageTransparency = 1 imageLabel.ScaleType = Enum.ScaleType.Stretch imageLabel.ZIndex = 2 imageLabel.Parent = anchorFrame local staminaBg = Instance.new("Frame") staminaBg.Name = "StaminaBg" staminaBg.Size = UI_CONFIG.StaminaBarSize staminaBg.Position = UI_CONFIG.StaminaBarPosition staminaBg.BackgroundColor3 = Color3.fromRGB(25, 0, 0) staminaBg.BackgroundTransparency = 1 staminaBg.BorderSizePixel = 0 staminaBg.Rotation = -90 staminaBg.ClipsDescendants = true staminaBg.ZIndex = 1 staminaBg.Parent = anchorFrame local bgCorner = Instance.new("UICorner") bgCorner.CornerRadius = UDim.new(0.3, 0) bgCorner.Parent = staminaBg local staminaFill = Instance.new("Frame") staminaFill.Name = "StaminaFill" staminaFill.AnchorPoint = Vector2.new(0, 0) staminaFill.Size = UDim2.new(1, 0, 1, 0) staminaFill.Position = UDim2.new(0, 0, 0, 0) staminaFill.BackgroundColor3 = Color3.fromRGB(139, 0, 0) staminaFill.BackgroundTransparency = 1 staminaFill.BorderSizePixel = 0 staminaFill.ZIndex = 1 staminaFill.Parent = staminaBg local staminaFullSfx = Instance.new("Sound") staminaFullSfx.Name = "StaminaFullSfx" staminaFullSfx.SoundId = STAMINA_FULL_SOUND staminaFullSfx.Volume = 0.6 staminaFullSfx.Parent = root local function updateFlyBar() local pct = math.clamp(flyMeter / FLY.MaxMeter, 0, 1) staminaFill.Size = UDim2.new(pct, 0, 1, 0) if flyMeter < FLY.MaxMeter then hasDrained = true end local isFull = (flyMeter >= FLY.MaxMeter) if hasDrained and isFull and not wasFullLastTick then staminaFullSfx:Play() hasDrained = false end wasFullLastTick = isFull end updateFlyBar() RunService.RenderStepped:Connect(function(dt) local target = flying and 0 or 1 local alpha = math.clamp(dt * UI_CONFIG.FadeSpeed, 0, 1) imageLabel.ImageTransparency = imageLabel.ImageTransparency + (target - imageLabel.ImageTransparency) * alpha staminaBg.BackgroundTransparency = staminaBg.BackgroundTransparency + (target - staminaBg.BackgroundTransparency) * alpha staminaFill.BackgroundTransparency = staminaFill.BackgroundTransparency + (target - staminaFill.BackgroundTransparency) * alpha end) local function startCyanEffect() if highlight then highlight:Destroy() end highlight = Instance.new("Highlight") highlight.Adornee = char highlight.FillColor = Color3.fromRGB(255, 0, 0) highlight.OutlineColor = Color3.fromRGB(139, 0, 0) highlight.Parent = char end local function stopCyanEffect() if highlight then highlight:Destroy() highlight = nil end end local function flyCancel() if not flying then return end flying = false if flyConn then flyConn:Disconnect(); flyConn = nil end if bv then bv:Destroy(); bv = nil end if bg then bg:Destroy(); bg = nil end if windSfx then windSfx:Stop(); windSfx:Destroy(); windSfx = nil end stopCyanEffect() if flyAnimTrack then flyAnimTrack:Stop() flyAnimTrack = nil end flyVelocity = Vector3.new(0, 0, 0) end local function flyStart() if flying or flyMeter <= 0 then return end flying = true flyVelocity = Vector3.new(0, 0, 0) local sfx = Instance.new("Sound") sfx.SoundId = "rbxassetid://1295448103" sfx.Volume = 0.8 sfx.Parent = root sfx:Play() task.delay(3, function() sfx:Destroy() end) windSfx = Instance.new("Sound") windSfx.SoundId = "rbxassetid://87629646373295" windSfx.Looped = true windSfx.Volume = 0.4 windSfx.Parent = root windSfx:Play() startCyanEffect() local animator = humanoid:FindFirstChildOfClass("Animator") or humanoid:WaitForChild("Animator") local anim = Instance.new("Animation") anim.AnimationId = FLY_ANIMATION_ID local success, track = pcall(function() return animator:LoadAnimation(anim) end) if success and track then flyAnimTrack = track flyAnimTrack:Play() else warn("SilverFlight: Could not load animation with ID", FLY_ANIMATION_ID) end bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(1e5, 1e5, 1e5) bv.Velocity = Vector3.new() bv.Parent = root bg = Instance.new("BodyGyro") bg.MaxTorque = Vector3.new(1e5, 1e5, 1e5) bg.P = 1e4 bg.D = 500 bg.CFrame = root.CFrame bg.Parent = root flyConn = RunService.RenderStepped:Connect(function(dt) if not flying then return end local cam = workspace.CurrentCamera local move = Vector3.new() if UserInputService.KeyboardEnabled then if UserInputService:IsKeyDown(Enum.KeyCode.W) then move += cam.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then move -= cam.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then move -= cam.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then move += cam.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then move -= Vector3.new(0, 1, 0) end else local dir = humanoid.MoveDirection if dir.Magnitude > 0 then move = dir end end local targetVelocity if move.Magnitude > 0 then targetVelocity = move.Unit * MAX_SPEEDCAP + Vector3.new(0, MAX_SPEEDCAP * VERTICAL_BOOST, 0) else targetVelocity = Vector3.new(0, 0, 0) end local accel = (move.Magnitude > 0 and ACCELERATION or DECELERATION) flyVelocity = flyVelocity:Lerp(targetVelocity, math.clamp(accel * dt / MAX_SPEEDCAP, 0, 1)) if flyVelocity ~= flyVelocity then flyVelocity = Vector3.new(0, 0, 0) end bv.Velocity = flyVelocity bg.CFrame = cam.CFrame local speedRatio = math.clamp(flyVelocity.Magnitude / MAX_SPEEDCAP, 0, 1) local drain = FLY.DrainIdle + (FLY.DrainFast - FLY.DrainIdle) * speedRatio if flyVelocity.Magnitude > 30 then drain *= FLY.HighSpeedMultiplier end flyMeter = math.max(flyMeter - drain * dt, 0) updateFlyBar() if flyMeter <= 0 then flyCancel() regenLocked = true task.delay(FLY.RegenDelay, function() regenLocked = false end) end end) end task.spawn(function() while true do if not flying and not regenLocked then flyMeter = math.min(flyMeter + FLY.RegenRate, FLY.MaxMeter) updateFlyBar() end task.wait(0.3) end end) if UserInputService.KeyboardEnabled then UserInputService.InputBegan:Connect(function(i, g) if g then return end if i.KeyCode == Enum.KeyCode.Space then jumpHeld = true task.delay(0.3, function() if jumpHeld and not flying and flyMeter > 0 then flyStart() end end) end end) UserInputService.InputEnded:Connect(function(i) if i.KeyCode == Enum.KeyCode.Space then jumpHeld = false flyCancel() end end) end if isMobile then local btn = Instance.new("ImageButton") btn.Parent = player.PlayerGui btn.Size = UDim2.new(0, 50, 0, 50) btn.Position = UDim2.new(1, -60, 0.6, 0) btn.BackgroundTransparency = 1 btn.Image = "rbxassetid://72410974345101" btn.ZIndex = 10 local label = Instance.new("TextLabel") label.Parent = btn label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.TextScaled = true label.Font = Enum.Font.GothamBold label.TextColor3 = Color3.fromRGB(0, 150, 255) label.ZIndex = 11 local function update() label.Text = flying and "Fly ON" or "Fly OFF" end update() btn.InputBegan:Connect(function() jumpHeld = true task.delay(0.3, function() if jumpHeld and not flying and flyMeter > 0 then flyStart() update() end end) end) btn.InputEnded:Connect(function() jumpHeld = false flyCancel() update() end) end print("[May the gooning goonnence]") local Players = game:GetService("Players") local lp = Players.LocalPlayer local CollectionService = game:GetService("CollectionService") local RunService = game:GetService("RunService") local function antiStun(char) local humanoid = char:WaitForChild("Humanoid") RunService.Heartbeat:Connect(function() if CollectionService:HasTag(char, "Stunned") then CollectionService:RemoveTag(char, "Stunned") end local currentState = humanoid:GetState() if currentState == Enum.HumanoidStateType.Physics or currentState == Enum.HumanoidStateType.Ragdoll or currentState == Enum.HumanoidStateType.FallingDown or currentState == Enum.HumanoidStateType.PlatformStanding then humanoid:ChangeState(Enum.HumanoidStateType.RunningNoPhysics) end end) end if lp.Character then antiStun(lp.Character) end lp.CharacterAdded:Connect(antiStun) 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") RunService.Heartbeat:Connect(disableAnimations) player.CharacterAdded:Connect(function(newCharacter) character = newCharacter humanoid = character:WaitForChild("Humanoid") end) local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local isMobile = UserInputService.TouchEnabled local Workspace = game:GetService("Workspace") local ContextActionService = game:GetService("ContextActionService") local workspace = Workspace local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local humanoidRootPart = character:WaitForChild("HumanoidRootPart") local isScriptActive = false local animationConnections = {} local meshReplacementConnection = nil local peeloutPlayed = false local SPINDASH_ASSET_ID = 95339729195359 local ASSET_ID = 84745056881844 local LMS_ASSET_ID = 140348017868432 local currentNormalModel = nil local currentLMSModel = nil local isInLMS = false local lmsModelConnection = nil local CUSTOM_BUTTON_ASSET_ID = 9259054284 local PEEL_OUT_VOICE_ID = 137940454798357 local INDICATOR_SOUND_ID = 137940454798357 local lastIndicatorSound = 0 local INDICATOR_VOICE_COOLDOWN = 9.1 local highlightEnabled = false local highlightCooldown = false local HIGHLIGHT_COOLDOWN_TIME = 12 local HIGHLIGHT_DURATION = 9 local activeHighlights = {} local activeBillboards = {} local ADDITIONAL_ASSET_ID = 73750640215993 local GUI_ID = 96036286115324 local currentSpindashModel = nil local spindashSpinConnection = nil local spindashSpeedBoostConnection = nil local isSpindashActive = false local spindashSpeedBoost = 1 local spindashTargetSpeed = 1 local SPINDASH_BASELINE = 0.1 local SPINDASH_MAX = 1.5 local SPINDASH_RAMP_TIME = 1 local spindashSpeedRate = (SPINDASH_MAX - SPINDASH_BASELINE) / SPINDASH_RAMP_TIME local isPeelOutActive = false local isHoldingPeelOut = false local isPeelOutReleasing = false local isDropDashActive = false local lastImageRectOffset = Vector2.new(0, 0) local dropDashCheckConnection = nil local isHoldingInput = false local function onIndicatorAction(actionName, inputState, inputObject) if inputState == Enum.UserInputState.Begin then activateIndicator() end end ContextActionService:BindAction("ActivateIndicator", onIndicatorAction, false, Enum.KeyCode.Y) local function onInputBegan(input, gp) if gp then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isHoldingInput = true if isPeelOutActive then isHoldingPeelOut = true end end end local function onInputEnded(input, gp) if gp then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isHoldingInput = false isHoldingPeelOut = false end end UserInputService.InputBegan:Connect(onInputBegan) UserInputService.InputEnded:Connect(onInputEnded) local function setCharacterSpeedBoost(value) if character and character.Parent then character:SetAttribute("SpeedBoost", value) end end local function stopSpindashSpeedBoost() isSpindashActive = false if spindashSpeedBoostConnection then spindashSpeedBoostConnection:Disconnect() spindashSpeedBoostConnection = nil end setCharacterSpeedBoost(1) end local function startSpindashSpeedBoost() if spindashSpeedBoostConnection then return end isSpindashActive = true spindashSpeedBoost = SPINDASH_BASELINE spindashTargetSpeed = SPINDASH_BASELINE setCharacterSpeedBoost(spindashSpeedBoost) spindashSpeedBoostConnection = RunService.Heartbeat:Connect(function(delta) if not isSpindashActive then if spindashSpeedBoostConnection then spindashSpeedBoostConnection:Disconnect() spindashSpeedBoostConnection = nil end return end if isPeelOutActive then stopSpindashSpeedBoost() return end local holding = isHoldingInput or UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) if holding then spindashTargetSpeed = SPINDASH_MAX else spindashTargetSpeed = SPINDASH_BASELINE end if spindashSpeedBoost < spindashTargetSpeed then spindashSpeedBoost = math.min(spindashSpeedBoost + (spindashSpeedRate * delta), spindashTargetSpeed) elseif spindashSpeedBoost > spindashTargetSpeed then spindashSpeedBoost = math.max(spindashSpeedBoost - (spindashSpeedRate * delta), spindashTargetSpeed) end if not isPeelOutActive then setCharacterSpeedBoost(spindashSpeedBoost) end end) end local function stopSpindashFollow() if spindashSpinConnection then spindashSpinConnection:Disconnect() spindashSpinConnection = nil end if currentSpindashModel then currentSpindashModel:Destroy() currentSpindashModel = nil end local playersFolder = workspace:FindFirstChild("Players") if playersFolder then local playerFolder = playersFolder:FindFirstChild(player.Name) if playerFolder then local spindashFolder = playerFolder:FindFirstChild("Spindash") if spindashFolder then local spindashPart = spindashFolder:FindFirstChild("Spindash") if spindashPart then spindashPart.Transparency = 0 end end end end stopSpindashSpeedBoost() end local function stopPeelOutSpeedBoost() end local function startPeelOutSpeedBoost() end local function freezePlayer() setCharacterSpeedBoost(0) humanoid.WalkSpeed = 0 end local function unfreezePlayer() humanoid.WalkSpeed = 16 end local stopPeelOut = nil local monitorPeelOutSounds = nil local lastDropDashState = false local function detectDropDash() local playerGui = player:WaitForChild("PlayerGui", 5) if not playerGui then return end local roundGui = playerGui:WaitForChild("Round", 5) if not roundGui then return end local gameGui = roundGui:WaitForChild("Game", 5) if not gameGui then return end local abilityGui = gameGui:WaitForChild("Ability", 5) if not abilityGui then return end local barGui = abilityGui:WaitForChild("Bar", 5) if not barGui then return end local ab1Gui = barGui:WaitForChild("AB1", 5) if not ab1Gui then return end local imgGui = ab1Gui:WaitForChild("iMG", 5) if not imgGui then return end dropDashCheckConnection = RunService.Heartbeat:Connect(function() if imgGui and imgGui.ImageRectOffset then local currentOffset = imgGui.ImageRectOffset local isCurrentlyDropDashing = (currentOffset ~= Vector2.new(0, 0)) if isCurrentlyDropDashing and not lastDropDashState then isDropDashActive = true performDropDashLunge() elseif not isCurrentlyDropDashing then isDropDashActive = false end lastImageRectOffset = currentOffset lastDropDashState = isCurrentlyDropDashing end end) end local function replacePlayerFrame() local playerGui = player:WaitForChild("PlayerGui", 15) if not playerGui then return end local roundGui = playerGui:WaitForChild("Round", 15) if not roundGui then return end local gameGui = roundGui:WaitForChild("Game", 15) if not gameGui then return end local teamsGui = gameGui:WaitForChild("Teams", 15) if not teamsGui then return end local playerFrame = nil for _ = 1, 60 do playerFrame = teamsGui:FindFirstChild(player.Name) or teamsGui:FindFirstChild(player.DisplayName) if playerFrame then break end task.wait(0.25) end if not playerFrame then return end local frame = playerFrame:FindFirstChild("Frame") if not frame then return end local characterContainer = frame:FindFirstChild("Character") if not characterContainer then return end characterContainer:ClearAllChildren() local iconLabel = Instance.new("ImageLabel") iconLabel.Image = "rbxassetid://137740600089778" iconLabel.Size = UDim2.new(0.60, 0, 0.60, 0) iconLabel.Position = UDim2.new(0.5, 0, 0.38, 0) iconLabel.AnchorPoint = Vector2.new(0.5, 0.5) iconLabel.BackgroundTransparency = 1 iconLabel.ScaleType = Enum.ScaleType.Fit iconLabel.Parent = characterContainer if characterContainer:IsA("GuiObject") then characterContainer.BackgroundTransparency = 1 end end local function startSpindashFollow() if not currentSpindashModel then return end local spindashFolder = currentSpindashModel.Parent local spindashPart = spindashFolder and spindashFolder:FindFirstChild("Spindash") if not spindashPart then return end if spindashSpinConnection then spindashSpinConnection:Disconnect() end spindashSpinConnection = RunService.Heartbeat:Connect(function() if not currentSpindashModel or not currentSpindashModel.Parent or not spindashPart or not spindashPart.Parent then if spindashSpinConnection then spindashSpinConnection:Disconnect() spindashSpinConnection = nil end currentSpindashModel = nil stopSpindashFollow() return end local liftOffset = Vector3.new(0, 0, 0) if currentSpindashModel:IsA("BasePart") then currentSpindashModel.CFrame = spindashPart.CFrame * CFrame.new(liftOffset) else local primary = currentSpindashModel.PrimaryPart or currentSpindashModel:FindFirstChildWhichIsA("BasePart") if primary then primary.CFrame = spindashPart.CFrame * CFrame.new(liftOffset) end end end) end local function replaceSpindashMesh() local playersFolder = workspace:FindFirstChild("Players") if not playersFolder then return end local playerFolder = playersFolder:FindFirstChild(player.Name) if not playerFolder then return end local spindashFolder = playerFolder:FindFirstChild("Spindash") if not spindashFolder then return end local spindashPart = spindashFolder:FindFirstChild("Spindash") if spindashPart and spindashPart:IsA("BasePart") and not currentSpindashModel then local ok, objects = pcall(game.GetObjects, game, "rbxassetid://" .. SPINDASH_ASSET_ID) if ok and objects and #objects > 0 then local newMesh = objects[1]:Clone() local inserted = nil if newMesh:IsA("BasePart") then inserted = newMesh newMesh.Parent = spindashPart.Parent else newMesh.Parent = spindashPart.Parent inserted = newMesh.PrimaryPart or newMesh:FindFirstChildWhichIsA("BasePart") end if inserted then inserted.CFrame = spindashPart.CFrame * CFrame.new(0, 5, 0) inserted.Anchored = false inserted.CanCollide = false currentSpindashModel = newMesh spindashPart.Transparency = 1 startSpindashFollow() startSpindashSpeedBoost() else newMesh:Destroy() end end end end local function monitorSpindashMesh() local function checkAndReplace() if isScriptActive then replaceSpindashMesh() end end checkAndReplace() local playersFolder = workspace:FindFirstChild("Players") if playersFolder then local playerFolder = playersFolder:FindFirstChild(player.Name) if playerFolder then local spindashFolder = playerFolder:FindFirstChild("Spindash") if spindashFolder then spindashFolder.DescendantAdded:Connect(function(descendant) if descendant.Name == "Spindash" and descendant:IsA("BasePart") and not currentSpindashModel then task.wait(0.1) checkAndReplace() end end) spindashFolder.DescendantRemoving:Connect(function(descendant) if descendant.Name == "Spindash" and descendant:IsA("BasePart") then task.wait(0.1) if not (spindashFolder:FindFirstChild("Spindash")) then stopSpindashFollow() end end end) else playerFolder.ChildAdded:Connect(function(child) if child.Name == "Spindash" then child.DescendantAdded:Connect(function(descendant) if descendant.Name == "Spindash" and descendant:IsA("BasePart") and not currentSpindashModel then task.wait(0.1) checkAndReplace() end end) end end) end else playersFolder.ChildAdded:Connect(function(child) if child.Name == player.Name then child.ChildAdded:Connect(function(spindashChild) if spindashChild.Name == "Spindash" then spindashChild.DescendantAdded:Connect(function(descendant) if descendant.Name == "Spindash" and descendant:IsA("BasePart") and not currentSpindashModel then task.wait(0.1) checkAndReplace() end end) end end) end end) end end if meshReplacementConnection then meshReplacementConnection:Disconnect() meshReplacementConnection = nil end meshReplacementConnection = RunService.Heartbeat:Connect(function() if isScriptActive and tick() % 1 < 0.1 then checkAndReplace() end end) end local function setupSonicViewport() local ok, viewportFrame = pcall(function() return player.PlayerGui :WaitForChild("Round", 30) :WaitForChild("Game", 30) :WaitForChild("SurvivorHP", 30) :WaitForChild("ViewportFrame", 30) end) if not ok or not viewportFrame then return end local viewportModel = viewportFrame :WaitForChild("WorldModel", 30) :WaitForChild("Default", 30) local assetId = "140348017868432" local function replaceViewportModel() local ok2, objects = pcall(game.GetObjects, game, "rbxassetid://" .. assetId) if not ok2 or #objects == 0 then return end local newModel = objects[1]:Clone() for _, part in ipairs(viewportModel:GetDescendants()) do if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then part.Transparency = 1 end end newModel.Parent = viewportModel local newHumanoid = newModel:FindFirstChildOfClass("Humanoid") if newHumanoid then newHumanoid:Destroy() end local viewportRootPart = viewportModel:FindFirstChild("HumanoidRootPart") if viewportRootPart then newModel:PivotTo(viewportRootPart.CFrame * CFrame.new(0, 0, 0) * CFrame.Angles(math.rad(0), math.rad(0), 0)) local primaryPart = newModel.PrimaryPart or newModel:FindFirstChildWhichIsA("BasePart") if primaryPart then local weld = Instance.new("WeldConstraint") weld.Part0 = viewportRootPart weld.Part1 = primaryPart weld.Parent = viewportRootPart end end end replaceViewportModel() local viewportHumanoid = viewportModel:FindFirstChild("Humanoid") local currentViewportAnimation = nil local viewportAnimations = { Idle = {id = "rbxassetid://103492267285940", track = nil, shouldLoop = true}, Walk = {id = "rbxassetid://124016876172487", track = nil, shouldLoop = true}, Run = {id = "rbxassetid://102091744008058", track = nil, shouldLoop = true}, Jump = {id = "rbxassetid://125236763187476", track = nil, shouldLoop = false}, Fall = {id = "rbxassetid://72841784729233", track = nil, shouldLoop = true} } local function loadViewportAnimation(animName) local animData = viewportAnimations[animName] if not animData or not viewportHumanoid then return nil end local animation = Instance.new("Animation") animation.AnimationId = animData.id local track = viewportHumanoid:LoadAnimation(animation) track.Looped = animData.shouldLoop animData.track = track return track end local function playViewportAnimation(animName) if not viewportHumanoid then return end for _, animData in pairs(viewportAnimations) do if animData.track and animData.track.IsPlaying then animData.track:Stop() end end local animData = viewportAnimations[animName] if animData then if not animData.track then loadViewportAnimation(animName) end if animData.track then animData.track:Play() end end end local function updateViewportAnimations() local newAnimation = "Idle" if viewportHumanoid then if viewportHumanoid.MoveDirection.Magnitude > 0.1 then if viewportHumanoid:GetState() == Enum.HumanoidStateType.Running then if viewportHumanoid.WalkSpeed > 16 then newAnimation = "Run" else newAnimation = "Walk" end end else local state = viewportHumanoid:GetState() if state == Enum.HumanoidStateType.Jumping then newAnimation = "Jump" elseif state == Enum.HumanoidStateType.Freefall then newAnimation = "Fall" else newAnimation = "Idle" end end end if newAnimation ~= currentViewportAnimation then playViewportAnimation(newAnimation) currentViewportAnimation = newAnimation end end RunService.Heartbeat:Connect(updateViewportAnimations) viewportModel.DescendantAdded:Connect(function() task.wait(0.5) replaceViewportModel() end) end local function loadCustomAsset(url, filename) if not isfile(filename) then writefile(filename, game:HttpGet(url)) end return getcustomasset(filename) end local DEFAULT_MUSIC = loadCustomAsset( "https://cdn.discordapp.com/attachments/1489017103469248613/1489372093027192832/ALL_THE_SMOKE_Omega_LMS_Outcome_Memories_UST.mp3?ex=69d02d5a&is=69cedbda&hm=1a457972d56b498966e8ce64a643e126e1147abee6ae023464aa252a2c7b3a81&", "default.mp3" ) local function setupSonicMusic() if not isScriptActive then return end local theme = game:GetService("ReplicatedStorage") :FindFirstChild("ClientAssets") and game.ReplicatedStorage.ClientAssets:FindFirstChild("Sounds") and game.ReplicatedStorage.ClientAssets.Sounds:FindFirstChild("mus") and game.ReplicatedStorage.ClientAssets.Sounds.mus:FindFirstChild("Game") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game:FindFirstChild("Round") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round:FindFirstChild("SoloTheme") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round.SoloTheme:FindFirstChild("SonicSolo") if theme then theme.Looped = true theme.Volume = 2 theme.SoundId = DEFAULT_MUSIC end end local function setupCharacter(char) if not isScriptActive then return end local originalParts = {} for _, v in ipairs(char:GetDescendants()) do if v:IsA("BasePart") then table.insert(originalParts, v) end end for _, part in ipairs(originalParts) do part.Transparency = 1 end local playersFolder = workspace:FindFirstChild("Players") local oldVisual = playersFolder and playersFolder:FindFirstChild(player.Name) if oldVisual then for _, v in ipairs(oldVisual:GetDescendants()) do if v:IsA("BasePart") then v.Transparency = 1 end end end local mdl = loadAsset(ASSET_ID) if not mdl then return end currentNormalModel = mdl if oldVisual then mdl.Parent = oldVisual else mdl.Parent = char end local hrp = char:FindFirstChild("HumanoidRootPart") local newHrp = mdl:FindFirstChild("HumanoidRootPart") if not hrp or not newHrp then mdl:Destroy() return end newHrp.Anchored = true newHrp.Transparency = 1 local existingHum = mdl:FindFirstChildOfClass("Humanoid") if existingHum then existingHum:Destroy() end local existingAnim = mdl:FindFirstChildOfClass("Animator") if existingAnim then existingAnim:Destroy() end for _, v in ipairs(mdl:GetDescendants()) do if v:IsA("BasePart") then v.CanCollide = false v.Transparency = 0 end end newHrp.CFrame = hrp.CFrame task.wait(0.1) newHrp.Transparency = 1 local syncConn syncConn = RunService.Stepped:Connect(function() if not char.Parent or not hrp.Parent or not newHrp.Parent then if syncConn then syncConn:Disconnect() end return end newHrp.CFrame = hrp.CFrame * CFrame.new(0, 1.1, 0) end) local animateScript = char:FindFirstChild("Animate") if animateScript then animateScript.Disabled = true end end -- ==================== FIXED BUTTON + INDICATOR ==================== local function highlightPlayers(enable) if enable then for _, hl in ipairs(activeHighlights) do if hl and hl.Parent then hl:Destroy() end end for _, b in ipairs(activeBillboards) do if b and b.Parent then b:Destroy() end end activeHighlights = {} activeBillboards = {} for _, p in ipairs(Players:GetPlayers()) do if p ~= player and p.Character and p.Character:FindFirstChild("HumanoidRootPart") then local hl = Instance.new("Highlight") hl.FillColor = Color3.fromRGB(255, 0, 0) hl.FillTransparency = 0.7 hl.OutlineTransparency = 0.5 hl.OutlineColor = Color3.fromRGB(255, 100, 100) hl.Parent = p.Character table.insert(activeHighlights, hl) local success, billboards = pcall(function() return game:GetObjects("rbxassetid://" .. ADDITIONAL_ASSET_ID) end) if success and #billboards > 0 then local billboard = billboards[1]:Clone() billboard.Parent = p.Character.HumanoidRootPart table.insert(activeBillboards, billboard) end end end else for _, hl in ipairs(activeHighlights) do if hl and hl.Parent then hl:Destroy() end end for _, b in ipairs(activeBillboards) do if b and b.Parent then b:Destroy() end end activeHighlights = {} activeBillboards = {} end end local function activateIndicator() if highlightCooldown then print("Indicator on cooldown!") return end print("✅ INDICATOR ACTIVATED!") local now = tick() if now - lastIndicatorSound > INDICATOR_VOICE_COOLDOWN then lastIndicatorSound = now playSound(INDICATOR_SOUND_ID, humanoidRootPart, 2) end highlightCooldown = true highlightEnabled = true highlightPlayers(true) task.delay(HIGHLIGHT_DURATION, function() highlightPlayers(false) highlightEnabled = false end) task.delay(HIGHLIGHT_COOLDOWN_TIME, function() highlightCooldown = false end) end local function createButton(parent, x, y, color, name, key, callback) local btn = Instance.new("ImageButton") btn.Name = name btn.BackgroundTransparency = 1 btn.Image = "rbxassetid://72410974345101" btn.ImageColor3 = color if isMobile then btn.Size = UDim2.new(0, 55, 0, 55) btn.Position = UDim2.new(0, x, 0, y) else btn.Size = UDim2.new(0, 80, 0, 80) btn.Position = UDim2.new(0, x, 0, y) end btn.Parent = parent local nameLbl = Instance.new("TextLabel") nameLbl.Size = UDim2.new(1, 0, 0.32, 0) nameLbl.Position = UDim2.new(0, 0, 1.05, 0) nameLbl.BackgroundTransparency = 1 nameLbl.Text = name nameLbl.TextColor3 = color nameLbl.Font = Enum.Font.GothamBold nameLbl.TextScaled = true nameLbl.TextStrokeTransparency = 0.8 nameLbl.Parent = btn local cdLbl = Instance.new("TextLabel") cdLbl.Name = "CooldownLabel" cdLbl.Size = UDim2.new(1, 0, 1, 0) cdLbl.Position = UDim2.new(0, 0, 0, 0) cdLbl.BackgroundTransparency = 1 cdLbl.Text = "" cdLbl.TextColor3 = Color3.fromRGB(255, 60, 60) cdLbl.Font = Enum.Font.GothamBold cdLbl.TextScaled = true cdLbl.TextStrokeTransparency = 0.7 cdLbl.Parent = btn local keyLbl = Instance.new("TextLabel") keyLbl.Size = UDim2.new(1, 0, 0.25, 0) keyLbl.Position = UDim2.new(0, 5, -0.18, 0) keyLbl.BackgroundTransparency = 1 keyLbl.Text = key keyLbl.TextColor3 = color keyLbl.Font = Enum.Font.GothamBold keyLbl.TextScaled = true keyLbl.TextXAlignment = Enum.TextXAlignment.Left keyLbl.Parent = btn btn.Activated:Connect(function() if name == "INDICATOR" and highlightCooldown then return end if callback then callback() end end) return btn, cdLbl end local function setupCustomButton() if indicatorFrame then indicatorFrame:Destroy() end indicatorFrame = Instance.new("Frame") indicatorFrame.Name = "IndicatorFrame" indicatorFrame.BackgroundTransparency = 1 if isMobile then indicatorFrame.Size = UDim2.new(0,72,0,96) indicatorFrame.Position = UDim2.new(0,8,0.5,150-40) else indicatorFrame.Size = UDim2.new(0,150,0,220) indicatorFrame.Position = UDim2.new(1,-20,0.5,220) end indicatorFrame.Parent = player:WaitForChild("PlayerGui") :WaitForChild("Round", 5) :WaitForChild("Game", 5) local darkRed = Color3.fromRGB(140, 0, 0) createButton(indicatorFrame, -70, 0, darkRed, "INDICATOR", "Y", activateIndicator) createButton(indicatorFrame, -160, 0, Color3.fromRGB(140,0,0), "EMOTE", "F", function() local humanoid = character:FindFirstChildOfClass("Humanoid") if humanoid then local animator = humanoid:FindFirstChildOfClass("Animator") if animator then local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://75751811262833" animator:LoadAnimation(anim):Play() end end end) createButton(indicatorFrame, -250, 0, Color3.fromRGB(140,0,0), "PUNCH", "R", function() local humanoid = character:FindFirstChildOfClass("Humanoid") if humanoid then local animator = humanoid:FindFirstChildOfClass("Animator") if animator then local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://119975552824132" animator:LoadAnimation(anim):Play() end end end) local hookBtn, hookCdLbl = createButton(indicatorFrame, -340, 0, Color3.fromRGB(0,255,255), "HOOK", "T", activateHook) hookCooldownLbl = hookCdLbl end local function cleanupCustomButton() if customButton then customButton:Destroy() customButton = nil end end -- ==================== LMS MODEL SWITCHER ==================== local function switchToLMSModel() if isInLMS or not character then return end isInLMS = true print("🔄 Switching to LMS Model...") if currentNormalModel then for _, v in ipairs(currentNormalModel:GetDescendants()) do if v:IsA("BasePart") then v.Transparency = 1 end end end if currentLMSModel then currentLMSModel:Destroy() currentLMSModel = nil end local ok, objects = pcall(game.GetObjects, game, "rbxassetid://" .. LMS_ASSET_ID) if not ok or #objects == 0 then warn("Failed to load LMS model:", LMS_ASSET_ID) return end local lmsModel = objects[1]:Clone() lmsModel.Name = "LMS_Model" local playersFolder = workspace:FindFirstChild("Players") local visualFolder = playersFolder and playersFolder:FindFirstChild(player.Name) if visualFolder then lmsModel.Parent = visualFolder else lmsModel.Parent = character end local hrp = character:FindFirstChild("HumanoidRootPart") local newHrp = lmsModel:FindFirstChild("HumanoidRootPart") or lmsModel:FindFirstChildWhichIsA("BasePart") if hrp and newHrp then newHrp.Anchored = true newHrp.Transparency = 1 local hum = lmsModel:FindFirstChildOfClass("Humanoid") if hum then hum:Destroy() end local anim = lmsModel:FindFirstChildOfClass("Animator") if anim then anim:Destroy() end for _, v in ipairs(lmsModel:GetDescendants()) do if v:IsA("BasePart") then v.CanCollide = false v.Transparency = 0 end end task.spawn(function() while isInLMS and lmsModel.Parent and hrp.Parent and character.Parent do newHrp.CFrame = hrp.CFrame * CFrame.new(0, 1.1, 0) task.wait() end end) end currentLMSModel = lmsModel print("✅ LMS Model Successfully Loaded") end local function revertToNormalModel() isInLMS = false if currentLMSModel then currentLMSModel:Destroy() currentLMSModel = nil end if currentNormalModel then for _, v in ipairs(currentNormalModel:GetDescendants()) do if v:IsA("BasePart") then v.Transparency = 0 end end print("✅ Reverted to Normal Model") else setupCharacter(character) end end local function monitorLMS() if lmsModelConnection then lmsModelConnection:Disconnect() end lmsModelConnection = RunService.Heartbeat:Connect(function() if not isScriptActive then return end local soloTheme = game:GetService("ReplicatedStorage") :FindFirstChild("ClientAssets") and game.ReplicatedStorage.ClientAssets:FindFirstChild("Sounds") and game.ReplicatedStorage.ClientAssets.Sounds:FindFirstChild("mus") and game.ReplicatedStorage.ClientAssets.Sounds.mus:FindFirstChild("Game") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game:FindFirstChild("Round") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round:FindFirstChild("SoloTheme") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round.SoloTheme:FindFirstChild("MetalSonicSolo") local isSoloPlaying = soloTheme and soloTheme.IsPlaying local aliveCount = 0 local playersFolder = workspace:FindFirstChild("Players") if playersFolder then for _, folder in ipairs(playersFolder:GetChildren()) do local hum = folder:FindFirstChild("Humanoid") if hum and hum.Health > 0 then aliveCount += 1 end end end local shouldBeInLMS = isSoloPlaying or (aliveCount <= 1) if shouldBeInLMS and not isInLMS then switchToLMSModel() elseif not shouldBeInLMS and isInLMS then revertToNormalModel() end end) end local function startScript() if isScriptActive then return end task.wait(3) isScriptActive = true task.spawn(setupSonicViewport) setupSonicMusic() monitorPeelOutSounds() detectDropDash() replacePlayerFrame() if character then setupCharacter(character) end setupCustomButton() monitorLMS() end local function showWaitingNotification() local StarterGui = game:GetService("StarterGui") StarterGui:SetCore("SendNotification", { Title = "mega o-o-omega"; Text = "made by itsjustyumy caz im sigma skibidi toileto bear"; Duration = 20; }) end local function stopScript() if not isScriptActive then return end isScriptActive = false cleanupCustomButton() showWaitingNotification() for _, animData in pairs(ANIMATIONS) do if animData.track and animData.track.IsPlaying then animData.track:Stop() end end stopSpindashFollow() if stopPeelOut then stopPeelOut() end if dropDashCheckConnection then dropDashCheckConnection:Disconnect() dropDashCheckConnection = nil end for _, connection in ipairs(animationConnections) do if connection then connection:Disconnect() end end animationConnections = {} if meshReplacementConnection then meshReplacementConnection:Disconnect() meshReplacementConnection = nil end if stopPeelOut then stopPeelOut() end task.spawn(function() task.wait(10) local theme = game:GetService("ReplicatedStorage") :FindFirstChild("ClientAssets") and game.ReplicatedStorage.ClientAssets:FindFirstChild("Sounds") and game.ReplicatedStorage.ClientAssets.Sounds:FindFirstChild("mus") and game.ReplicatedStorage.ClientAssets.Sounds.mus:FindFirstChild("Game") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game:FindFirstChild("Round") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round:FindFirstChild("SoloTheme") and game.ReplicatedStorage.ClientAssets.Sounds.mus.Game.Round.SoloTheme:FindFirstChild("MetalSonicSolo") if theme then theme:Stop() end end) end local playerModelCache = nil local isCurrentlySonic = false local function getPlayerModel() if not playerModelCache or not playerModelCache.Parent then local playersFolder = workspace:FindFirstChild("Players") if playersFolder then playerModelCache = playersFolder:FindFirstChild(player.Name) end end return playerModelCache end local function isSonic() local model = getPlayerModel() return model and model:GetAttribute("Character") == "MetalSonic" end local function onHeartbeat() local sonicCheck = isSonic() if sonicCheck ~= isCurrentlySonic then isCurrentlySonic = sonicCheck if isCurrentlySonic then startScript() else stopScript() end end end local function checkCharacterAttribute() end local function monitorCharacterAttribute() end local currentAnimation = nil local animationsToDisable = { "rbxassetid://106608035337434343447", "rbxassetid://9191426583290243434", "rbxassetid://1381145986434514343434", "rbxassetid://12355823787878779758443434", "rbxassetid://12830070429117134343434", "rbxassetid://8308909881303234343434", "rbxassetid://1246987295976683434343343", "rbxassetid://7622317178271243434343434" } local jumpStartTime = 0 local jumpAnimationDuration = 0.6 local runStartTime = 0 local isRunning = false local speedBoostRate = (4 - 1) / 1.25 local lastWalkSpeed = 16 local speedChangeThreshold = 2 local isSpeedBoostActive = false local lastSpeedCheckTime = 0 local speedCheckInterval = 0.1 local function loadAnimation(animName) local animData = ANIMATIONS[animName] if not animData then return nil end local animation = Instance.new("Animation") animation.AnimationId = animData.id local track = humanoid:LoadAnimation(animation) track.Looped = animData.shouldLoop animData.track = track return track end local function playAnimation(animName) for _, animData in pairs(ANIMATIONS) do if animData.track and animData.track.IsPlaying then animData.track:Stop() end end local animData = ANIMATIONS[animName] if animData then if not animData.track then loadAnimation(animName) end if animData.track then animData.track:Play() if animName == "SuperRun" then animData.track:AdjustSpeed(3.8) end end end end local function updateAnimations() if not isScriptActive then return end if isPeelOutActive then character:SetAttribute("SpeedBoost", 1.1) isSpeedBoostActive = false isRunning = false stopSpindashSpeedBoost() return end if isSpindashActive then return end if not isSpindashActive and not isPeelOutActive and not isPeelOutReleasing then local currentTime = tick() if currentTime - lastSpeedCheckTime >= speedCheckInterval then lastSpeedCheckTime = currentTime local currentWalkSpeed = humanoid.WalkSpeed local speedChange = currentWalkSpeed - lastWalkSpeed if speedChange > speedChangeThreshold and currentWalkSpeed > 16 and humanoid.MoveDirection.Magnitude > 0.1 then if not isRunning then isRunning = true runStartTime = tick() end isSpeedBoostActive = true elseif speedChange < -speedChangeThreshold or (currentWalkSpeed <= 16 and isSpeedBoostActive) then if isRunning then isRunning = false end isSpeedBoostActive = false character:SetAttribute("SpeedBoost", 1) end lastWalkSpeed = currentWalkSpeed end end local state = humanoid:GetState() local newAnimation = nil if state == Enum.HumanoidStateType.Jumping then if currentAnimation ~= "Jump" then jumpStartTime = tick() end newAnimation = "Jump" elseif state == Enum.HumanoidStateType.Freefall then if tick() - jumpStartTime > jumpAnimationDuration then newAnimation = "Fall" else newAnimation = "Jump" end elseif humanoid.MoveDirection.Magnitude > 0.1 then if humanoid.WalkSpeed > 16 then newAnimation = "Run" else newAnimation = "Walk" end else newAnimation = "Idle" end if not isPeelOutActive and not isSpindashActive then local currentSpeedBoost = character:GetAttribute("SpeedBoost") or 1 if currentSpeedBoost >= 2.5 and isSpeedBoostActive and humanoid.MoveDirection.Magnitude > 0.1 and humanoid.WalkSpeed > 16 and state ~= Enum.HumanoidStateType.Jumping and state ~= Enum.HumanoidStateType.Freefall then newAnimation = "SuperRun" end if isSpeedBoostActive and isRunning then local runDuration = tick() - runStartTime local newSpeedBoost = math.min(1 + (runDuration * speedBoostRate), 3) local currentBoost = character:GetAttribute("SpeedBoost") if currentBoost ~= nil then character:SetAttribute("SpeedBoost", newSpeedBoost) end end end if newAnimation and newAnimation ~= currentAnimation then playAnimation(newAnimation) currentAnimation = newAnimation end end local function disableAnimations() if not isScriptActive then return end local animator = humanoid:FindFirstChildOfClass("Animator") if not animator then return end for _, track in ipairs(humanoid:GetPlayingAnimationTracks()) do for _, animId in ipairs(animationsToDisable) do if track.Animation and track.Animation.AnimationId == animId then track:Stop() break end end end end player.CharacterAdded:Connect(function(newChar) character = newChar humanoid = newChar:WaitForChild("Humanoid") humanoidRootPart = newChar:WaitForChild("HumanoidRootPart") playerModelCache = nil monitorSpindashMesh() setupCharacter(newChar) for name in pairs(ANIMATIONS) do if ANIMATIONS[name].track then ANIMATIONS[name].track:Stop() ANIMATIONS[name].track = nil end end for name in pairs(ANIMATIONS) do loadAnimation(name) end playAnimation("Idle") table.insert(animationConnections, humanoid.StateChanged:Connect(updateAnimations)) table.insert(animationConnections, RunService.Heartbeat:Connect(updateAnimations)) table.insert(animationConnections, RunService.Heartbeat:Connect(disableAnimations)) end) if monitorSpindashMesh then monitorSpindashMesh() end if setupCharacter and character and isScriptActive then setupCharacter(character) end if isScriptActive then for name in pairs(ANIMATIONS) do loadAnimation(name) end playAnimation("Idle") if humanoid then table.insert(animationConnections, humanoid.StateChanged:Connect(updateAnimations)) table.insert(animationConnections, RunService.Heartbeat:Connect(updateAnimations)) table.insert(animationConnections, RunService.Heartbeat:Connect(disableAnimations)) end end task.spawn(function() while true do local playersFolder = workspace:FindFirstChild("Players") if playersFolder then local playerFolder = playersFolder:FindFirstChild(player.Name) if playerFolder then local defaultFolder = playerFolder:FindFirstChild("Default") if defaultFolder then local waist = defaultFolder:FindFirstChild("Waist") local hrpDefault = defaultFolder:FindFirstChild("HumanoidRootPart") if waist and waist:IsA("BasePart") then waist.Transparency = 1 end if hrpDefault and hrpDefault:IsA("BasePart") then hrpDefault.Transparency = 1 end end end end task.wait(0.1) end end) stopPeelOut = function() isPeelOutActive = false peeloutPlayed = false isHoldingPeelOut = false isPeelOutReleasing = true unfreezePlayer() stopPeelOutSpeedBoost() isRunning = false isSpeedBoostActive = false runStartTime = tick() character:SetAttribute("SpeedBoost", 1.1) if ANIMATIONS.PeelCharge.track and ANIMATIONS.PeelCharge.track.IsPlaying then ANIMATIONS.PeelCharge.track:Stop() end task.spawn(function() task.wait(0.5) isPeelOutReleasing = false end) end monitorPeelOutSounds = function() if not humanoidRootPart then return end local lastPeelStart = 0 local VOICE_COOLDOWN = 8.9 local function checkForSounds() if not isScriptActive or not humanoidRootPart.Parent then return end local peelCharge = humanoidRootPart:FindFirstChild("DashStart") or humanoidRootPart:FindFirstChild("DestructiveCharge") if peelCharge and peelCharge:IsA("Sound") and not isPeelOutActive then local now = tick() isPeelOutActive = true freezePlayer() playAnimation("Charge") currentAnimation = "Charge" if now - lastPeelStart > VOICE_COOLDOWN then lastPeelStart = now playSound(PEEL_OUT_VOICE_ID, humanoidRootPart, 2.0) print("🔊 Peel Out voice played once") end if startPeelOutSpeedBoost then startPeelOutSpeedBoost() end end local peelRelease = humanoidRootPart:FindFirstChild("DashEnd") or humanoidRootPart:FindFirstChild("DestructiveRelease") if peelRelease and peelRelease:IsA("Sound") then if isPeelOutActive then stopPeelOut() end end end humanoidRootPart.ChildAdded:Connect(function(child) if child.Name == "DashStart" or child.Name == "DashEnd" or child.Name == "DestructiveCharge" or child.Name == "DestructiveRelease" then task.delay(0.08, checkForSounds) end end) humanoidRootPart.ChildRemoved:Connect(function(child) if child.Name == "DashStart" or child.Name == "DashEnd" or child.Name == "DestructiveCharge" or child.Name == "DestructiveRelease" then task.delay(0.08, checkForSounds) end end) RunService.Heartbeat:Connect(function() if tick() % 0.5 < 0.06 then checkForSounds() end end) checkForSounds() print("✅ PeelOut monitor fixed - voice should play only once now") end local initialSonic = isSonic() if initialSonic then startScript() else showWaitingNotification() end isCurrentlySonic = initialSonic RunService.Heartbeat:Connect(onHeartbeat) Players.PlayerAdded:Connect(function(plr) plr.CharacterAdded:Connect(function() if highlightEnabled then task.wait(0.5) highlightPlayers(true) end end) end) -- ====================== KEYBINDS FOR ALL ABILITY BUTTONS (PC) ====================== task.wait(2) UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end local hum = character and character:FindFirstChildOfClass("Humanoid") local animator = hum and hum:FindFirstChildOfClass("Animator") if input.KeyCode == Enum.KeyCode.F then if animator then local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://75751811262833" local track = animator:LoadAnimation(anim) track:Play() end elseif input.KeyCode == Enum.KeyCode.R then if animator then local anim = Instance.new("Animation") anim.AnimationId = "rbxassetid://119975552824132" local track = animator:LoadAnimation(anim) track:Play() end elseif input.KeyCode == Enum.KeyCode.T then if activateHook then activateHook() end elseif input.KeyCode == Enum.KeyCode.Y then if activateIndicator then activateIndicator() end end end)