Modern Sonic Rework
Key Required

Modern Sonic Rework

(ANNIVERSARY) Outcome Memories v0.2Arambo0331Arambo0331 2.9K views 554 executesUpdated Mar 30, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•1373 lines (41760 chars)
local ANIMATIONS = {
	Idle = {id = "rbxassetid://120101636793898", track = nil, shouldLoop = true},
	Walk = {id = "rbxassetid://91043029480065", track = nil, shouldLoop = true},
	Run = {id = "rbxassetid://139348920670961", track = nil, shouldLoop = true},
	SuperRun = {id = "rbxassetid://139348920670961", track = nil, shouldLoop = true},
	Jump = {id = "rbxassetid://139272524520189", track = nil, shouldLoop = false},
	Fall = {id = "rbxassetid://139272524520189", track = nil, shouldLoop = true},
	PeelCharge = {id = "rbxassetid://95970005202318", 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 isMobile = UserInputService.TouchEnabled
local Workspace = game:GetService("Workspace")
local ContextActionService = game:GetService("ContextActionService")
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 peeloutPlayed = false
local SPINDASH_ASSET_ID = 95339729195359
local ASSET_ID = 139567169544950
local LMS_ASSET_ID = 95285665897654   
local currentNormalModel = nil
local currentLMSModel = nil
local isInLMS = false
local lmsModelConnection = nil
local CUSTOM_BUTTON_ASSET_ID = 9259054284
local PEEL_OUT_VOICE_ID = 537371462
local highlightEnabled = false
local highlightCooldown = false
local HIGHLIGHT_COOLDOWN_TIME = 20
local HIGHLIGHT_DURATION = 5
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 playSound(id, parent, volume)
    local sound = Instance.new("Sound")
    sound.SoundId = "rbxassetid://" .. id
    sound.Volume = volume or 1.5
    sound.Parent = parent or humanoidRootPart
    sound:Play()
    sound.Ended:Connect(function()
        sound:Destroy()
    end)
end
 
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", 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 = "139567169544950"
	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://raw.githubusercontent.com/makinmaking/NOMOREGAMES/main/NO%20MORE%20GAMES%20-%20Sonic.exe_%20OUTCOME%20MEMORIES%20UST%20(Super%20Sonic%20THEME).mp3",
	"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!") 
 
	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, 0.68, 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(0,20,0.5,220)   
	end
 
	indicatorFrame.Parent = player:WaitForChild("PlayerGui")
		:WaitForChild("Round", 5)
		:WaitForChild("Game", 5)
 
	createButton(
		indicatorFrame,
		0, 0,
		Color3.fromRGB(0, 255, 255),
		"INDICATOR",
		"Y",
		activateIndicator
	)
 
	print("✅ sigma sigma boi sigma boi sigma boi")
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("SonicSolo")
 
		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 = "Sonic but being Modern is scary";
		Text = "made by itsjustyumy da goat";
		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("SonicSolo")
		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") == "Sonic"
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(5)
			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
 
local function getNearestEXE()
	local playersFolder = workspace:FindFirstChild("Players")
	if not playersFolder then return nil end
 
	local myModel = getPlayerModel()
	if not myModel then return nil end
 
	local myHRP = myModel:FindFirstChild("HumanoidRootPart") or myModel:FindFirstChildWhichIsA("BasePart")
	if not myHRP then return nil end
 
	local nearest = nil
	local shortestDistance = 140  
 
	for _, model in ipairs(playersFolder:GetChildren()) do
		if model ~= myModel then
			local charType = model:GetAttribute("Character") or model.Name  
 
			if charType then
				local lower = tostring(charType):lower()
 
 
				if lower:find("fleetway") or 
				   lower:find("tripwire") or 
				   lower:find("kolossos") or 
				   lower:find("2011x") or 
				   lower:find("2011 x") or 
				   lower:find("x") or 
				   lower:find("exe") then
 
					local exeHRP = model:FindFirstChild("HumanoidRootPart")
					if exeHRP then
						local dist = (myHRP.Position - exeHRP.Position).Magnitude
						if dist < shortestDistance then
							shortestDistance = dist
							nearest = exeHRP
						end
					end
				end
			end
		end
	end
 
	return nearest
end
 
local function performDropDashLunge()
	local targetHRP = getNearestEXE()
	if not targetHRP or not humanoidRootPart then 
 
		local bodyVel = Instance.new("BodyVelocity")
		bodyVel.Name = "DropDashBoost"
		bodyVel.MaxForce = Vector3.new(8000, 0, 8000)
		bodyVel.Velocity = humanoidRootPart.CFrame.LookVector * 90
		bodyVel.Parent = humanoidRootPart
		task.delay(0.6, function() if bodyVel.Parent then bodyVel:Destroy() end end)
		return 
	end
 
	local direction = (targetHRP.Position - humanoidRootPart.Position).Unit
	local distance = (targetHRP.Position - humanoidRootPart.Position).Magnitude
 
	local bodyVelocity = Instance.new("BodyVelocity")
	bodyVelocity.Name = "DropDashLunge"
	bodyVelocity.MaxForce = Vector3.new(15000, 1000, 15000)
	bodyVelocity.Velocity = direction * math.clamp(85 + distance * 0.8, 85, 180)
	bodyVelocity.Parent = humanoidRootPart
 
 
	local attach0 = Instance.new("Attachment", humanoidRootPart)
	local attach1 = Instance.new("Attachment", humanoidRootPart)
	attach1.Position = Vector3.new(0, -2.5, 0)
 
	local trail = Instance.new("Trail", humanoidRootPart)
	trail.Color = ColorSequence.new(Color3.fromRGB(220, 255, 255))
	trail.LightEmission = 1
	trail.LightInfluence = 0
	trail.Lifetime = 0.5
	trail.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0.1), NumberSequenceKeypoint.new(1, 1)})
	trail.Attachment0 = attach0
	trail.Attachment1 = attach1
 
	task.delay(0.85, function()
		if bodyVelocity and bodyVelocity.Parent then bodyVelocity:Destroy() end
		if trail and trail.Parent then trail:Destroy() end
		if attach0 and attach0.Parent then attach0:Destroy() end
		if attach1 and attach1.Parent then attach1:Destroy() end
	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("PeelCharge")
 
		if peelCharge and peelCharge:IsA("Sound") and not isPeelOutActive then
			local now = tick()
 
			isPeelOutActive = true
			freezePlayer()
			playAnimation("PeelCharge")
			currentAnimation = "PeelCharge"
 
 
			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("PeelRelease")
		if (peelRelease and peelRelease:IsA("Sound")) or 
		   (isPeelOutActive and not peelCharge) then
 
			if isPeelOutActive then
				stopPeelOut()
			end
		end
	end
 
 
	humanoidRootPart.ChildAdded:Connect(function(child)
		if child.Name == "PeelCharge" or child.Name == "PeelRelease" then
			task.delay(0.08, checkForSounds)
		end
	end)
 
	humanoidRootPart.ChildRemoved:Connect(function(child)
		if child.Name == "PeelCharge" or child.Name == "PeelRelease" 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)

Features & Information

Voice lines rework Mobile support
#Outcome Memories v

Community Comments (2)

Arambo0331Arambo0331Mar 30, 2026

This is from itsjustyumy but he never puts the script in.

AxoPleys8AxoPleys8Apr 6, 2026

EE como lo uso???

More Scripts for (ANNIVERSARY) Outcome Memories v0.2