print("[FAKETAILSDOLL] Now loading... Made by lil2kki <3") game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.Skins.Default:Destroy() game.ReplicatedStorage.ClientAssets.Characters.Survivors.Tails.Skins.Default:Clone().Parent = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.Skins game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate:Destroy() game.ReplicatedStorage.ClientAssets.Characters.Survivors.Tails.scriptstuff.Animate:Clone().Parent = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff for _, v in ipairs(game.ReplicatedStorage.ClientAssets:FindFirstChild("FAKETAILSDOLL", true).Anims:GetChildren()) do game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims[v.Name]:Destroy() v:Clone().Parent = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims end game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims.Canon.Walk:Clone().Parent = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims.Canon game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims.Canon.Walk.Name = "Run" while game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims:FindFirstChild("SelectPose") do game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims:FindFirstChild("SelectPose"):Destroy() end game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims.Default.Run:Clone().Parent = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate.Anims.Run.Name = "SelectPose" game.ReplicatedStorage.ClientAssets.WinScreens.TailsDoll.WinAnim.AnimationId = "rbxassetid://92259033776440" -- tails sit local model = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.Skins.Default local function find(name) return model:FindFirstChild(name, true) end while find("Tails") do find("Tails").Name = "bruh. ability input script brokes so i had to rename it" end -- details for _, v in ipairs(model.Head:GetChildren()) do if v:IsA("BasePart") and v.Name == "MAD_HEAD" then v.Name = v.Name.."_PART" end if v:IsA("BasePart") and v.Name == "SAD_HEAD" then v.Name = v.Name.."_PART" end end local applycomestic = loadstring(game:HttpGet("https://pastebin.com/raw/qHzmXnbm"))() model:SetAttribute("EquippedCosmetics", "FAKETAILSDOLL,") model:SetAttribute("Character", "Tails") applycomestic(model) -- custom animmmm local function playSwing(model) local body = model:FindFirstChild("Body", true) local waist = model:FindFirstChild("waist", true) if not body or not waist then return end local rArm = body:FindFirstChild("Cylinder.010", true) local lArm = body:FindFirstChild("Left Arm", true) local head = body:FindFirstChild("Head", true) local torso = waist:FindFirstChild("Body", true) if not rArm or not lArm or not head or not torso then return end if model:GetAttribute("playSwing") then return end model:SetAttribute("playSwing", true) -- base C0 positionsss (originals have identity rotation) local rb = CFrame.new(0.3922, 0.5312, 0.1235) local lb = CFrame.new(-0.4071, 0.5312, 0.1235) local hb = CFrame.new(0, 0.8754, 0.1455) local wb = CFrame.new(0.0003, 0.0453, -0.0847) -- rest pose local oR, oL, oH, oW = rArm.C0, lArm.C0, head.C0, torso.C0 local rad = math.rad local Ang = CFrame.Angles local kfs = { -- windup {0.06, rb*Ang(rad(-130),rad(-25),rad(15)), lb*Ang(rad(40),rad(-15),0), hb*Ang(rad(-10),rad(-20),0), wb*Ang(0,rad(-15),0)}, -- strike {0.05, rb*Ang(rad(20),rad(50),rad(-15)), lb*Ang(rad(-10),rad(35),0), hb*Ang(rad(5),rad(20),0), wb*Ang(0,rad(25),0)}, -- impact {0.04, rb*Ang(rad(55),rad(70),rad(-25)), lb*Ang(rad(-30),rad(50),0), hb*Ang(rad(10),rad(30),0), wb*Ang(0,rad(35),0)}, -- follow through {0.06, rb*Ang(rad(85),rad(90),rad(-35)), lb*Ang(rad(-45),rad(55),0), hb*Ang(rad(15),rad(35),0), wb*Ang(0,rad(40),0)}, -- recovery {0.12, oR, oL, oH, oW}, } local cur = {rArm.C0, lArm.C0, head.C0, torso.C0} for _, kf in ipairs(kfs) do local dur, tR, tL, tH, tW = kf[1], kf[2], kf[3], kf[4], kf[5] local steps = math.max(1, math.floor(dur / 0.015)) local st = dur / steps for i = 1, steps do local a = i / steps rArm.C0 = cur[1]:Lerp(tR, a) lArm.C0 = cur[2]:Lerp(tL, a) head.C0 = cur[3]:Lerp(tH, a) torso.C0 = cur[4]:Lerp(tW, a) task.wait(st) end rArm.C0, lArm.C0, head.C0, torso.C0 = tR, tL, tH, tW cur = {tR, tL, tH, tW} end model:SetAttribute("playSwing", nil) end -- player upd local function tryUpdatePlayer(player) if not player:IsA("Model") then return end if player:GetAttribute("Character") ~= "TailsDoll" then return end if player:GetAttribute("Skin") ~= "Default" then return end print("[FAKETAILSDOLL] Prebuild updating model for " .. player.Name .. "...") if player:FindFirstChild("OverlayModel") then warn("[FAKETAILSDOLL] Player already have OverlayModel, update cancelled") return end if player:WaitForChild("Animate") and player:WaitForChild("Humanoid") then local Animate = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.scriptstuff.Animate:Clone() Animate.Name = "Tails"..Animate.Name Animate.Parent = player Animate.Enabled = true function loadTrack(id) local anim = Instance.new("Animation") anim.AnimationId = id local track = player.Humanoid.Animator:LoadAnimation(anim) return track end function playWhileTrack(track, myTrack) myTrack:Play(0.1) track.Stopped:Once(function() myTrack:Stop(0.1) end) return myTrack end local ServerBrustHit = loadTrack("rbxassetid://75852355428865") local Strangled = player.Humanoid.Animator:LoadAnimation(Animate.Anims.Strangled) local Jump = player.Humanoid.Animator:LoadAnimation(Animate.Anims.Jump) local Glide = player.Humanoid.Animator:LoadAnimation(Animate.Anims.alt.Run) local SitTails = loadTrack("rbxassetid://132926716277265") local Pipebomb = loadTrack("rbxassetid://137946742808216") local Cory = loadTrack("rbxassetid://118810363050448") player.Humanoid.Animator.AnimationPlayed:Connect(function(track) -- print("PLAYED: "..track.Name.." - "..track.Animation.AnimationId) local id = track.Animation.AnimationId if id == "rbxassetid://92259033776440" then playWhileTrack(track, SitTails) end if id == "rbxassetid://112656139256072" then playWhileTrack(track, Cory) end if id == "rbxassetid://100732265533480" then playWhileTrack(track, Pipebomb):AdjustSpeed(0.815) end if track.Name == "DoubleJump" then Jump:Play(0.1) Jump:AdjustSpeed(2) end if (track.Name == "Glide" or id == player.Glide.ANIMS.Glide.AnimationId) and Glide.Animation.AnimationId ~= track.Animation.AnimationId then -- Glide Glide:Play(0.2) track.Stopped:Once(function() Glide:Stop(0.2) end) end if id == "rbxassetid://138468646867674" or id == "rbxassetid://101931899083669" then -- swings --if math.random() < 0.2 then ServerBrustHit:Play(0.1) ServerBrustHit:AdjustSpeed(2) return end if id == "rbxassetid://107665101569245" then -- kill Strangled:Play(0.1) Strangled:AdjustSpeed(0.1) track.Stopped:Once(function() Strangled:Stop(0.1) end) return end if track.Name == "Animation" then -- try to sync server anims if game.Players.LocalPlayer.Name ~= player.Name then for _, Anim in ipairs(player.Animate.Anims:GetDescendants()) do if not Anim:IsA("Animation") then continue end if id ~= Anim.AnimationId then continue end -- print("^ Thats", Anim:GetFullName()) local MyAnim = Animate:FindFirstChild(Anim.Parent.Name, true):FindFirstChild(Anim.Name) local TempTrack = player.Humanoid.Animator:LoadAnimation(MyAnim) TempTrack:Play(0.1) TempTrack:AdjustSpeed(track.Speed) track.Stopped:Once(function() TempTrack:Stop(0.1) end) return end end end end) local StrangledR = player.Humanoid.Animator:LoadAnimation(Animate.Anims.StrangledR) player.AttributeChanged:Connect(function(attr) if attr == "StunDur" or attr == "BurnDur" then local val = player:GetAttribute(attr) if val and val > 0 then if player:GetAttribute("State") == "default" then task.spawn(function() StrangledR:Play(0.1) StrangledR:AdjustSpeed(1.51) task.wait(0.9) StrangledR:Stop(0.3) end) end player:SetAttribute("State", "alt") elseif not val or val <= 0 then player:SetAttribute("State", "default") end end end) print("[FAKETAILSDOLL] Tails animatior added!") end print("[FAKETAILSDOLL] Character ready! Updating " .. player:GetFullName() .. "...") -- Char Model local ogHRP = player:FindFirstChild("HumanoidRootPart", true) if not ogHRP then return end for _, v in ipairs(player:GetDescendants()) do if v:IsA("BasePart") and v.Name ~= "HumanoidRootPart" then v.Color = Color3.new(0/255, 0/255, 0/255) v.Material = Enum.Material.Neon v.LocalTransparencyModifier = 1 v.Changed:Connect(function(property) if property == "LocalTransparencyModifier" then v.LocalTransparencyModifier = 1 end if property == "Transparency" and v.Name == "Head" then --warn(v:GetFullName(), v.Transparency) for _, ov in ipairs(player.OverlayModel:GetDescendants()) do if not ov:GetAttribute("IgnoreTransparency") then pcall(function() ov.Transparency = v.Transparency end) end end end end) end if v:IsA("SurfaceGui") then v.Enabled = false end if v:IsA("SurfaceAppearance") then v:Destroy() end end -- Overlay Model local OverlayModel = game.ReplicatedStorage.ClientAssets.Characters.EXE.TailsDoll.Skins.Default:Clone() OverlayModel.Name = "OverlayModel" OverlayModel.Parent = player local myHRP = OverlayModel:FindFirstChild("HumanoidRootPart", true) if not myHRP then OverlayModel:Destroy() return end for _, v in ipairs(OverlayModel:GetDescendants()) do if v:IsA("Humanoid") then v:Destroy() end if v:IsA("Animator") then v:Destroy() end if v:IsA("BasePart") then v.CanCollide = false v.Anchored = false v.CanTouch = false v.CanQuery = false v.Massless = true if v.Transparency > 0 then v:SetAttribute("IgnoreTransparency", true) end end end -- yooo (im stupidoo) local hrpY = -0.0 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)) pcall(function() -- retarget camera player.Waist.MainBody.Part0 = OverlayModel.waist player.MainBody.Head.Part0 = OverlayModel.Head end) -- sounds and stuff... player.DescendantAdded:Connect(function(desc) -- if desc:GetFullName():find(".FOVMultiplier") then return end -- print(desc.ClassName, desc:GetFullName()) if desc.Name == "Rolling" then desc:Destroy() end -- NO ROLL VELOC if desc.Name == "_BLOOD" then desc.Name = "_BLOOD_HANDLED" local depth1 = {} local depth2 = {} local depth3 = {} for _, v in ipairs(OverlayModel:GetDescendants()) do if not v:IsA("MeshPart") then continue end if #v:GetFullName():split(".") - #OverlayModel:GetFullName():split(".") <= 1 then table.insert(depth1, v) end if #v:GetFullName():split(".") - #OverlayModel:GetFullName():split(".") <= 2 then table.insert(depth2, v) end if #v:GetFullName():split(".") - #OverlayModel:GetFullName():split(".") <= 3 then table.insert(depth3, v) end end -- depth 1 if #depth1 > 0 then desc.Parent = depth1[math.random(#depth1)] end -- move org and then clone it if #depth1 > 0 then desc:Clone().Parent = depth1[math.random(#depth1)] end -- depth 2 if #depth2 > 0 then desc:Clone().Parent = depth2[math.random(#depth2)] end if #depth2 > 0 then desc:Clone().Parent = depth2[math.random(#depth2)] end if #depth2 > 0 then desc:Clone().Parent = depth2[math.random(#depth2)] end if #depth2 > 0 then desc:Clone().Parent = depth2[math.random(#depth2)] end -- depth 3 if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end if #depth3 > 0 then desc:Clone().Parent = depth3[math.random(#depth3)] end end if not desc:IsA("Sound") then return end if not desc.Parent or not desc.Parent.Parent then return end if desc:GetAttribute("IsMyCloneToIgnore") then return end --print(desc.ClassName, desc:GetFullName()) if desc.Name:find("Retract") then desc:Destroy() end if desc.Name:find("Unleashed") then desc:Destroy() end if desc.Name:find("Swings") then desc.SoundId = game.ReplicatedStorage.ClientAssets.Sounds.sfx.Game.EXE.Swing.SoundId return end end) print("[FAKETAILSDOLL] Updating finished for", player.Name .. "!") end local function onPlayerAdded(player) -- Check if they already spawned in if player.Character then tryUpdatePlayer(player.Character) end -- Listen for the player (re)spawning _G.FAKETAILSDOLLCharacterAddedConn = _G.FAKETAILSDOLLCharacterAddedConn or {} if _G.FAKETAILSDOLLCharacterAddedConn[player.Name] then _G.FAKETAILSDOLLCharacterAddedConn[player.Name]:Disconnect() print("[FAKETAILSDOLL] Previous FAKETAILSDOLLCharacterAddedConn disconnected for", player.Name) end _G.FAKETAILSDOLLCharacterAddedConn[player.Name] = player.CharacterAdded:Connect(tryUpdatePlayer) end for _, player in game.Players:GetPlayers() do onPlayerAdded(player) end if _G.FAKETAILSDOLLPlayerAddedConn then _G.FAKETAILSDOLLPlayerAddedConn:Disconnect() print("[FAKETAILSDOLL] Previous FAKETAILSDOLLPlayerAddedConn disconnected") end _G.FAKETAILSDOLLPlayerAddedConn = game.Players.PlayerAdded:Connect(onPlayerAdded) -- debug xd pcall(function() -- game:GetService("Players").LocalPlayer.PlayerGui.FUNPanel.RemoteEvent:FireServer("changeascharacter", {"TailsDoll", "EXE"}) end)