
Keyless

print("[Cream x TailsDoll] Now loading... Made by lil2kki <3")
-- MODEL SETUP IN ReplicatedStorage (for UI and overlay ref)
-- Add Icons
while game.ReplicatedStorage.ClientAssets.Icons:FindFirstChild("TailsDoll") do
game.ReplicatedStorage.ClientAssets.Icons.TailsDoll:Destroy()
warn("[Cream x TailsDoll] Old icons removed")
end
local icons = game.ReplicatedStorage.ClientAssets.Icons.Cream:Clone()
icons.Parent = game.ReplicatedStorage.ClientAssets.Icons
icons.Name = "TailsDoll"
icons.Eyes:Destroy()
local tar = game:GetService("ReplicatedStorage")
tar = tar:FindFirstChild("Characters", true)
tar = tar:FindFirstChild("TailsDoll", true)
tar = tar:FindFirstChild("Skins", true)
local old = tar:FindFirstChild("_OLD", true)
if OLD_THERE_ALR then
warn("[Cream x TailsDoll] Restoring original skin")
tar:FindFirstChild("Default", true):Destroy()
OLD_THERE_ALR.Name = "Default"
end
tar = tar:FindFirstChild("Default", true)
local src = game:GetService("ReplicatedStorage")
src = src:FindFirstChild("Characters", true)
src = src:FindFirstChild("Cream", true)
src = src:FindFirstChild("Skins", true)
src = src:FindFirstChild("Default", true)
if not tar or not src then warn("[Cream x TailsDoll] Models not found!") return end
-- clone cream
local model = src:Clone()
model.Name = tar.Name
model.Parent = tar.Parent
tar.Name = "_OLD"
for _, v in ipairs(model:GetDescendants()) do
if v:IsA("BasePart") then
v.Material = Enum.Material.Slate
end
end
local function find(name)
return model:FindFirstChild(name, true)
end
-- red dots :3
local thatslikeevilandscary = game:GetObjects("rbxassetid://120086931957772")[1]
local eyeNames = {{"Eye1","eye1"}, {"Eye2","eye2"}}
for _, pair in ipairs(eyeNames) do
local srcPart = thatslikeevilandscary:FindFirstChild(pair[1], true)
local dstPart = model:FindFirstChild(pair[2], true)
if srcPart and dstPart then
dstPart.Material = Enum.Material.Neon
dstPart.Color = Color3.fromRGB(0,0,0)
dstPart.Transparency = 1
dstPart.Size = dstPart.Size / 3
for _, child in ipairs(srcPart:GetChildren()) do
if child:IsA("ParticleEmitter") or child:IsA("Attachment") then
child.Parent = dstPart
if child.Name == "YiSang" then child:Destroy() end
end
end
for _, child in ipairs(dstPart:GetDescendants()) do
if child:IsA("ParticleEmitter") then
child.LockedToPart = true
if child.Name == "bubble" then
child.LightEmission = 0.1
child.LightInfluence = 0.1
end
end
end
srcPart.Part.ParticleEmitter.Parent = dstPart.Attachment
dstPart.Attachment.ParticleEmitter.LockedToPart = true
end
end
thatslikeevilandscary:Destroy()
-- eyes
local eyes = find("eyes")
if eyes and eyes:IsA("BasePart") then
eyes.Material = Enum.Material.Neon
eyes.Color = Color3.new(0, 0, 0)
end
-- rename parts
local function rename(oldName, newName)
local obj = find(oldName)
while obj do
-- print("renaming: "..obj.Name.." -> "..newName.." //"..obj.ClassName)
obj.Name = newName
obj:SetAttribute("rename_oldName", oldName)
obj:SetAttribute("rename_newName", newName)
obj = find(oldName)
end
end
rename("waist", "Waist")
rename("Body", "MainBody")
rename("eye1", "REye")
rename("eye2", "LEye")
rename("Right Sleeve", "RArm1")
rename("Cylinder.013", "RArm2")
rename("Cylinder.014", "RArm3")
rename("Cylinder.017", "RArm4")
rename("Right Hand", "RHand")
rename("Left Sleeve", "LArm1")
rename("Cylinder.023", "LArm2")
rename("Cylinder.022", "LArm3")
rename("Left Hand", "LHand")
rename("Right Leg", "RLeg1")
rename("Cylinder.001", "RLeg2")
rename("Cylinder", "RLeg3")
rename("Right Shoe", "RShoe")
rename("Left Leg", "LLeg1")
rename("Cylinder.034", "LLeg2")
rename("Cylinder.035", "LLeg3")
rename("Left Shoe", "LShoe")
rename("tail", "RTail")
rename("REar", "RTail")
rename("LEar", "LTail")
--
-- blood on muzzle :3
local muzzle = model:FindFirstChild("muzzle", true)
local drip = game:GetObjects("rbxassetid://84762690015926")[1]
drip.Parent = muzzle
drip.UVScale = Vector2.new(1.5, 1)
-- dress..
local dress = model:FindFirstChild("dress", true)
dress.Material = Enum.Material.Sandstone
print("[Cream x TailsDoll] Model setup done...")
--
local function tryUpdatePlayer(name)
local player = workspace:FindFirstChild(name, true)
if not player then return end
if player:GetAttribute("Character") ~= "TailsDoll" then return end
print("[Cream x TailsDoll] Updating model for " .. player.Name .. "...")
if player:FindFirstChild("OverlayModel") then
warn("[Cream x TailsDoll] Player already have OverlayModel, update cancelled")
return
end
local isLocalPlayer = player.Name == game.Players.LocalPlayer.Name
-- first prebuild setup
-- sometimes game spam errors without it lol
local BeingChased = Instance.new("ObjectValue")
BeingChased.Name = "BeingChased"
BeingChased.Value = player
BeingChased.Parent = player
local healthxd = Instance.new("NumberValue")
healthxd.Name = "Health"
healthxd.Parent = player
coroutine.wrap(function()
task.wait(1) -- breaks health bar :3
healthxd.Value = 100
end)()
--
-- wait server build..
player:WaitForChild("Animate")
local lastCamCFrame = workspace.CurrentCamera.CFrame
repeat task.wait() until workspace.CurrentCamera.CFrame ~= lastCamCFrame
local ogHRP = player:FindFirstChild("HumanoidRootPart", true)
if not ogHRP then return end
local ogHead = player:FindFirstChildOfClass("Motor6D", true)
for _, v in ipairs(player:GetDescendants()) do
if v:IsA("Motor6D") and v.Name == "Head" then ogHead = v end
if v:IsA("BasePart") and v.Name ~= "HumanoidRootPart" then
if string.find(v.Name, "Claw") then v:Destroy() end
v.Transparency = 1
v.LocalTransparencyModifier = 1
v.Material = Enum.Material.Neon
v.Color = Color3.new(0/255, 0/255, 0/255)
v:SetAttribute("HiddenAway", "FOR CREAM")
end
if v:IsA("SurfaceGui") then v.Enabled = false end
if v:IsA("SurfaceAppearance") then v:Destroy() end
if v:IsA("ParticleEmitter") then v:Destroy() end -- soul diamond
if v:IsA("PointLight") then v:Destroy() end -- soul diamond
end
local src = game:GetService("ReplicatedStorage")
src = src:FindFirstChild("Characters", true)
src = src:FindFirstChild("TailsDoll", true)
src = src:FindFirstChild("Skins", true)
src = src:FindFirstChild("Default", true)
local mdl = src:Clone()
mdl.Parent = player
mdl.Name = "OverlayModel"
local myHRP = mdl:FindFirstChild("HumanoidRootPart", true)
if not myHRP then mdl:Destroy() return end
local myHead = mdl:FindFirstChildOfClass("Motor6D", true)
for _, v in ipairs(mdl:GetDescendants()) do
if v:IsA("Motor6D") and v.Name == "Head" then myHead = v end
if v:IsA("Humanoid") then v:Destroy() end
if v:IsA("Animator") then v:Destroy() end
if v:IsA("BasePart") then
v.CanCollide = false
end
end
-- yooo (im stupidoo)
local hrpY = -1.9
local weld = Instance.new("Weld")
weld.Part0 = ogHRP
weld.Part1 = myHRP
weld.C0 = CFrame.new()
weld.C1 = CFrame.new(0, -hrpY, 0)
weld.Parent = myHRP
myHRP:PivotTo(ogHRP.CFrame * CFrame.new(0, hrpY, 0))
-- cam script is horror
coroutine.wrap(function()
while true do
if not myHRP or not myHRP.Parent then return end
myHead.C0 = CFrame.new(myHead.C0.Position) * (ogHead.C0 - ogHead.C0.Position)
task.wait()
end
end)()
-- gods
local LHand = player:FindFirstChild("LHand")
LHand:GetPropertyChangedSignal("Transparency"):Connect(function()
-- warn(LHand:GetFullName().." as "..LHand.Transparency)
for _, v in ipairs(player.OverlayModel:GetDescendants()) do
if v.Name ~= "HumanoidRootPart" then
pcall(function() v.Transparency = LHand.Transparency end)
if v:IsA("ParticleEmitter") then v.Enabled = (LHand.Transparency < 0.5) end
end
end
end)
-- glide anim repl
local function renameByAttribute(attrName)
for _, obj in ipairs(player:GetDescendants()) do
local targetName = obj:GetAttribute(attrName)
if targetName then obj.Name = targetName end
end
end
local isGilding = false
local CreamGlideTrack = player.Humanoid.Animator:LoadAnimation(
game:GetService("ReplicatedStorage"):FindFirstChild("Characters", true)
:FindFirstChild("Cream", true):FindFirstChild("Glide", true)
)
CreamGlideTrack.Name = "CreamGlide"
player.Humanoid.Animator.AnimationPlayed:Connect(function(track)
if track.Name ~= CreamGlideTrack.Name then
if CreamGlideTrack then CreamGlideTrack:Stop() end
renameByAttribute("rename_newName")
track.Stopped:Once(function() if isGilding and CreamGlideTrack then
renameByAttribute("rename_oldName")
CreamGlideTrack:Play(0.1)
end end)
end
if track.Name == "Glide" then
isGilding = true
track.Stopped:Once(function()
isGilding = false
if CreamGlideTrack then CreamGlideTrack:Stop(0.1) end
renameByAttribute("rename_newName")
end)
renameByAttribute("rename_oldName")
if CreamGlideTrack then CreamGlideTrack:Play(0.1) end
end
end)
--
end
_G.CreamTailsDollSkinPlayersConn = _G.CreamTailsDollSkinPlayersConn or nil
if _G.CreamTailsDollSkinPlayersConn then
_G.CreamTailsDollSkinPlayersConn:Disconnect()
_G.CreamTailsDollSkinPlayersConn = nil
print("[Cream x TailsDoll] Previous workspace.Players folder ChildAdded connection destroyed")
end
_G.CreamTailsDollSkinPlayersConn = workspace.Players.ChildAdded:Connect(function(player)
tryUpdatePlayer(player.Name)
end)
for _, player in ipairs(workspace.Players:GetChildren()) do tryUpdatePlayer(player.Name) end
-- if game then return end
-- CUSTOM TEXT
local textReplacements = {
["S.T.E.P."] = "FUN",
["Reach Out"] = " Tag ~",
["Brighter Day"] = "Laser thingy",
["Tripwire"] = " [CORRUPTED] ",
["TailsDoll"] = "TailsDoll (2)",
["Can you feel the sunshine?"] = "[Info] Instance copied successfully.\n"
.."[WARN] ReplicatedStorage missmatch!\n"
.."[WARN] Unauthorized access!\n"
.."> dont worry, thats just a way i can play :>\n"
.."Syntax error."
}
local TextLabelNames = {
CharName = true,
CharDesc = true,
ABName = true,
selectedChar = true,
char = true, -- vote screen (same names xd)
}
local function hookLabel(desc)
if not desc or not desc.Parent then return end
if not desc:IsA("TextLabel") then return end
if not TextLabelNames[desc.Name] then return end
-- warn("[Cream x TailsDoll] Watching TextLabel: "..desc.Name)
coroutine.wrap(function()
while true do
if not desc or not desc.Parent then
-- warn("[Cream x TailsDoll] Lost TextLabel to watch: "..desc:GetFullName())
return
end
if textReplacements[desc.Text] then desc.Text = textReplacements[desc.Text] end
task.wait() -- heartbeat mayb
end
end)()
end
_G.CreamOnTailsDollGUIConn = _G.CreamOnTailsDollGUIConn or nil
if _G.CreamOnTailsDollGUIConn then
_G.CreamOnTailsDollGUIConn:Disconnect()
_G.CreamOnTailsDollGUIConn = nil
end
_G.CreamOnTailsDollGUIConn = game.Players.LocalPlayer:WaitForChild("PlayerGui").DescendantAdded:Connect(hookLabel)
for _, desc in ipairs(game.Players.LocalPlayer:WaitForChild("PlayerGui"):GetDescendants()) do hookLabel(desc) end
print("[Cream x TailsDoll] Listening for your GUI...")
--
-- CUSTOM SOUNDS
local assigns = { ["rbxassetid://97101227703333"] = "rbxassetid://139116822099909" }
local StunSounds = {}
local DownedSounds = {}
local AttackSounds = {}
local lastBloodHitPlayerRef = nil
_G.CreamOnTailsDollSkinSoundConn = _G.CreamOnTailsDollSkinSoundConn or nil
if _G.CreamOnTailsDollSkinSoundConn then
_G.CreamOnTailsDollSkinSoundConn:Disconnect()
_G.CreamOnTailsDollSkinSoundConn = nil
print("[Cream x TailsDoll] Previous sound desc conn destroyed")
end
_G.CreamOnTailsDollSkinSoundConn = workspace.DescendantAdded:Connect(function(desc)
if not desc or not desc:IsA("Sound") then return end
if not desc.Parent or not desc.Parent.Parent then return end
if desc.SoundId == "rbxassetid://131820864449998" then
local Retracts = {
assigns[desc.SoundId]
, DownedSounds[8] -- other giggle
, DownedSounds[1] -- be careful
}
desc.SoundId = Retracts[math.random(1, #Retracts)]
end
if assigns[desc.SoundId] then desc.SoundId = assigns[desc.SoundId] end
local player = desc.Parent.Parent
if player and player:IsA("Model") and player:FindFirstChild("HumanoidRootPart") then
local isTailsDoll = player:GetAttribute("Character") == "TailsDoll"
local path = desc:GetFullName()
if path:find(".Blood Hit") then lastBloodHitPlayerRef = player end
if isTailsDoll and (desc.Name:find("Retract") or desc.Name:find("Unleashed")) then
desc.RollOffMaxDistance = desc.RollOffMaxDistance * 4
desc.RollOffMinDistance = desc.RollOffMinDistance * 2
desc.Volume = 1
for _, child in ipairs(player.Waist:GetChildren()) do
if child.Name:find("CreamSpeech") then
desc.Volume = 0
desc:Stop()
break
end
end
end
if isTailsDoll then
if desc.SoundId == "rbxassetid://77110140707717" then
local clone = desc:Clone()
clone.SoundId = AttackSounds[math.random(1, #AttackSounds)]
clone.Name = clone.SoundId
clone.Parent = desc.Parent
clone:Play()
local endedconn = clone.Ended:Once(function() clone:Destroy() end)
task.delay(10, function()
if clone.Parent then clone:Destroy() end
if endedconn then endedconn:Disconnect() end
end)
end
local isDefLine = (path:find(".Default") and path:find("Line")) -- .Default1Line wth
if isDefLine or path:find(".Downed") then desc.SoundId = DownedSounds[math.random(1, #DownedSounds)] end
if path:find(".Hurt") then desc.SoundId = StunSounds[math.random(1, #StunSounds)] end
if isDefLine or path:find(".Downed") or path:find(".Hurt") then
for _, child in ipairs(player.Waist:GetChildren()) do
if child.Name:find("CreamSpeech") then child:Stop() child:Destroy() end
end
if isDefLine then
local lastPlayer = lastBloodHitPlayerRef
if lastPlayer then
local c = lastPlayer:GetAttribute("Character")
if KillLines[c] then desc.SoundId = KillLines[c][math.random(1, #KillLines[c])] end
end
end
local sound = Instance.new("Sound")
sound.Name = "CreamSpeech - " .. desc.SoundId
sound.SoundId = desc.SoundId
sound.Volume = desc.Volume
sound.RollOffMaxDistance = desc.RollOffMaxDistance
sound.RollOffMinDistance = desc.RollOffMinDistance
sound.SoundGroup = desc.SoundGroup
sound.Parent = player.Waist
sound:Play()
local endedconn = sound.Ended:Once(function() sound:Destroy() end)
task.delay(10, function()
if sound.Parent then sound:Destroy() end
if endedconn then endedconn:Disconnect() end
end)
desc.Volume = 0
end
end
end
end)
print("[Cream x TailsDoll] Listening for new dynamuc sounds in workspace...")
print("[Cream x TailsDoll] Loading custom sounds...")
local function myAsset(fileName)
local cachePath = "cache/cream-on-doll/" .. fileName
if isfile(cachePath) then return getcustomasset(cachePath) end
local success, result = pcall(
function()
return game:HttpGet(
"https://github.com/thaLILNIKKI/Cream.LMS-for-TailsDoll-Outcome-Memories/releases/download/"
.. "assets/" .. fileName
)
end
)
if success and result then
writefile(cachePath, result)
return getcustomasset(cachePath)
else
warn("[Cream x TailsDoll] failed to load " .. fileName)
return nil
end
end
assigns = {
["rbxassetid://117478513053834"] = myAsset("WinScreen.mp3"),
["rbxassetid://80901931085615"] = myAsset("NormalChaseFix.mp3"),
["rbxassetid://129416111545242"] = myAsset("TerrorRadius.mp3"),
["rbxassetid://112879248941055"] = myAsset("LastLifeChase3.mp3"),
["rbxassetid://112976135484851"] = myAsset("Unleashed1.mp3"),
["rbxassetid://106071428647005"] = myAsset("Unleashed2.mp3"),
["rbxassetid://87302988643016"] = myAsset("Unleashed3.mp3"),
["rbxassetid://131820864449998"] = myAsset("Retract.mp3"), -- giggle or smth here ~
["rbxassetid://97101227703333"] = "rbxassetid://139116822099909", -- .Hit1] 2O11x Hit2
["rbxassetid://93465914238963"] = "rbxassetid://88164444698409", -- Lilith.Hit2]
["rbxassetid://113251186335660"] = "rbxassetid://5507830073", -- Lilith.Hit3]
["rbxassetid://73636680793269"] = "rbxassetid://77110140707717", -- basic Swing
["rbxassetid://108753423324802"] = "rbxassetid://77110140707717", -- basic Swing
["rbxassetid://134998846301914"] = "rbxassetid://77110140707717", -- basic Swing
}
KillLines = {
["Sonic"] = { myAsset("Sonic.mp3"), myAsset("Sonic2.mp3") },
["Tails"] = { myAsset("Tails.mp3"), myAsset("Tails2.mp3"), myAsset("Tails3.mp3") },
["MetalSonic"] = { myAsset("MetalSonic.mp3"), myAsset("MetalSonic2.mp3") },
["Amy"] = { myAsset("Amy.mp3"), myAsset("Amy2.mp3"), myAsset("Amy3.mp3"), myAsset("Amy4.mp3") },
["Silver"] = { myAsset("Silver.mp3") },
["Blaze"] = { myAsset("Blaze.mp3") },
["Eggman"] = { myAsset("Eggman.mp3") },
["Cream"] = { myAsset("Cream.mp3"), myAsset("Cream2.mp3") },
["Knuckles"] = { myAsset("Knuckles.mp3") }
}
for i = 1, 28 do table.insert(StunSounds, myAsset("Stun" .. i .. ".mp3")) end
for i = 1, 14 do table.insert(DownedSounds, myAsset("Down" .. i .. ".mp3")) end
for i = 1, 8 do table.insert(AttackSounds, myAsset("Attack" .. i .. ".mp3")) end
print("[Cream x TailsDoll] Finished downloading custom sounds...")
--
print("[Cream x TailsDoll] Ready!")


Don't works..