local ANIMATIONS = { Idle = {id = "rbxassetid://124843566051454", track = nil, shouldLoop = true}, Walk = {id = "rbxassetid://129576499223816", track = nil, shouldLoop = true}, Run = {id = "rbxassetid://139819904274304", track = nil, shouldLoop = true}, SuperRun = {id = "rbxassetid://139819904274304", track = nil, shouldLoop = true}, Jump = {id = "rbxassetid://78826341374889", track = nil, shouldLoop = false}, Fall = {id = "rbxassetid://78826341374889", track = nil, shouldLoop = true}, PeelCharge = {id = "rbxassetid://140509140429829", 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 Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local workspace = Workspace local player = Players.LocalPlayer 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 SPINDASH_ASSET_ID = 136199367000340 local ASSET_ID = 136199367000340 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 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 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 if currentOffset ~= lastImageRectOffset and currentOffset ~= Vector2.new(0, 0) then isDropDashActive = true if isPeelOutActive and stopPeelOut then stopPeelOut() end elseif currentOffset == Vector2.new(0, 0) then isDropDashActive = false end lastImageRectOffset = currentOffset end end) end local function replacePlayerFrame() 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 teamsGui = gameGui:WaitForChild("Teams", 5) if not teamsGui then return end local playerFrame = teamsGui:FindFirstChild(player.Name) if not playerFrame then teamsGui.ChildAdded:Wait() playerFrame = teamsGui:FindFirstChild(player.Name) end if playerFrame and playerFrame:FindFirstChild("Frame") then local frame = playerFrame.Frame if frame and frame:FindFirstChild("Character") then local characterContainer = frame.Character characterContainer:ClearAllChildren() local success, objects = pcall(game.GetObjects, game, "rbxassetid://136982160236927") if success and #objects > 0 then local asset = objects[1] for _, obj in asset:GetChildren() do obj:Clone().Parent = characterContainer end if characterContainer:IsA("GuiObject") then characterContainer.BackgroundTransparency = 1 end end end 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 = "124322645393011" 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://github.com/makinmaking/dihinmyahh/raw/refs/heads/main/(SH1NYY2)%20FULL%20MODERN%20SONIC%20LMS%20%5BOutcome%20Memories%5D.mp3", "MODERN.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 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 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 end local function showWaitingNotification() local StarterGui = game:GetService("StarterGui") StarterGui:SetCore("SendNotification", { Title = "hi"; Text = "waiting to be sonic, vee script made by itsjustyumy for om :D"; Duration = 20; }) end local function stopScript() if not isScriptActive then return end isScriptActive = false 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") an