cream reskin for sonic
Key Required

cream reskin for sonic

(ANNIVERSARY) Outcome Memories v0.2outcomecatoutcomecat 1.1K views 101 executesUpdated Mar 27, 2026
Unrated
00
Lua Script•897 lines (29205 chars)
-- ═══════════════════════════════════════════════════════════════════════════
-- sonic cream
-- ═══════════════════════════════════════════════════════════════════════════
local ANIMATIONS = {
    Idle = {id = "rbxassetid://76127274280299", track = nil, shouldLoop = true},
	Walk = {id = "rbxassetid://110650259897504", track = nil, shouldLoop = true},
	Run = {id = "rbxassetid://91433561966875", track = nil, shouldLoop = true},
	SuperRun = {id = "rbxassetid://93467334988341", track = nil, shouldLoop = true},
	Jump = {id = "rbxassetid://118340091140903", track = nil, shouldLoop = false},
	Fall = {id = "rbxassetid://93467334988341", track = nil, shouldLoop = true},
	PeelCharge = {id = "rbxassetid://93467334988341", 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 = 95339729195359
local ASSET_ID = 79760454992299
local currentSpindashModel = true
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 = "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://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 = "cream but tails";
		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")
			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") == "Tails"
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://91914265832902",
    "rbxassetid://131035860836096",
    "rbxassetid://129887519880329",
    "rbxassetid://113455194234590",
    "rbxassetid://129555938474948"
}
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)
		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), 1)
			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
	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
	-- playAnimation("SuperRun")
	-- currentAnimation = "SuperRun"
	task.spawn(function()
		task.wait(0.5)
		isPeelOutReleasing = false
	end)
end
 
monitorPeelOutSounds = function()
	local function checkForSounds()
		if not isScriptActive or not character or not character.Parent then return end
		local peelChargeSound = humanoidRootPart:FindFirstChild("PeelCharge")
		if peelChargeSound and peelChargeSound:IsA("Sound") and not isPeelOutActive and not isDropDashActive then
			isPeelOutActive = true
			freezePlayer()
			playAnimation("PeelCharge")
			currentAnimation = "PeelCharge"
			startPeelOutSpeedBoost()
		end
		local peelReleaseSound = humanoidRootPart:FindFirstChild("PeelRelease")
		if peelReleaseSound and peelReleaseSound:IsA("Sound") and isPeelOutActive then
			stopPeelOut()
		end
		if isPeelOutActive and not peelChargeSound and not peelReleaseSound then
			stopPeelOut()
		end
	end
	humanoidRootPart.ChildAdded:Connect(function(child)
		if child.Name == "PeelCharge" or child.Name == "PeelRelease" then
			task.wait(0.1)
			checkForSounds()
		end
	end)
	humanoidRootPart.ChildRemoved:Connect(function(child)
		if child.Name == "PeelCharge" or child.Name == "PeelRelease" then
			task.wait(0.1)
			checkForSounds()
		end
	end)
	RunService.Heartbeat:Connect(function()	
		if tick() % 0.2 < 0.1 then
			checkForSounds()
		end
	end)
	checkForSounds()
end
 
local initialSonic = isSonic()
if initialSonic then
	startScript()
else
	showWaitingNotification()
end
isCurrentlySonic = initialSonic
 
RunService.Heartbeat:Connect(onHeartbeat)

Features & Information

cream reskin for sonic a edited version of itsjustyumy script

Community Comments (3)

OutcomeScripterOutcomeScripterMar 27, 2026

Broski imposter

GuywhoplaysomGuywhoplaysomMar 27, 2026

Yo, can you do a reskin of the cl*ic 2011x variant for Blaze? (Or Sonic, either one)

Replying to @Guywhoplaysom
outcomecatoutcomecatMar 27, 2026

@Guywhoplaysom if you can find me a model with animations i will do it

More Scripts for (ANNIVERSARY) Outcome Memories v0.2