Cream.LMS for TailsDoll
Key Required

Cream.LMS for TailsDoll

(ANNIVERSARY) Outcome Memories v0.2lil2kki_lil2kki_ 649 views 236 executesUpdated Jun 26, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•530 lines (20732 chars)
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!")

Features & Information

huge as hell script what adds evil cream.lms over tripwire. new model, sounds, text and stuff ya

Community Comments (1)

YummyPancakesYummyPancakesJul 9, 2026

Don't works..

More Scripts for (ANNIVERSARY) Outcome Memories v0.2