ScriptKeyless
Tdi script walkspeed chest esp and more keyless
[OPEN BETA] Total Drama IslandDesktop & mobile readyWave · Codex · Delta · Synapse Z · Volt · Potassium · Seliware · OpiumWare · Real · Matcha
Description
Mobile friendly is the first tdi script and is good
GAME[OPEN BETA] Total Drama Island
UPDATEDOct 18, 2026
ACCESSKeyless
PLATFORMDesktop & Mobile
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
--[[
tdi_ultimate_suite_v4.lua
Total Drama Island — Ultimate Suite + Chest ESP
Features:
- Chest ESP (Gold highlights on chests/treasure/loot)
- Desync Ghost Mode
- Invisibility (Client-side)
- Player ESP
- WalkSpeed & JumpPower
- Whisper Spy
--]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local CoreGui = game:GetService("CoreGui")
local TextChatService = game:GetService("TextChatService")
local LP = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local CFG = {
invis = false,
esp = true,
chestESP = true,
ghostMode = false,
speedEnabled = false,
speedValue = 16,
jumpEnabled = false,
jumpValue = 50,
}
local highlights = {}
local chestHighlights = {}
local ghostClone = nil
local ghostConnection = nil
local originalCFrame = nil
-- ============================================================
-- DESYNC GHOST LOGIC
-- ============================================================
local function toggleGhostMode()
if CFG.ghostMode then
if not LP.Character or not LP.Character:FindFirstChild("HumanoidRootPart") then return end
originalCFrame = LP.Character.HumanoidRootPart.CFrame
LP.Character.HumanoidRootPart.CFrame = CFrame.new(100000, 100000, 100000)
LP.Character.HumanoidRootPart.Anchored = true
ghostClone = LP.Character:Clone()
ghostClone.Name = "GhostClone"
for _, v in pairs(ghostClone:GetDescendants()) do
if v:IsA("BaseScript") or v:IsA("LocalScript") then v:Destroy() end
end
ghostClone.Parent = workspace
for _, v in pairs(ghostClone:GetDescendants()) do
if v:IsA("BasePart") then
v.CanCollide = false
v.Anchored = false
end
end
local cloneHum = ghostClone:FindFirstChildOfClass("Humanoid")
if cloneHum then Camera.CameraSubject = cloneHum end
ghostConnection = RunService.RenderStepped:Connect(function()
if not ghostClone or not ghostClone.PrimaryPart then return end
local moveDir = Vector3.new()
if UIS:IsKeyDown(Enum.KeyCode.W) then moveDir += Camera.CFrame.LookVector end
if UIS:IsKeyDown(Enum.KeyCode.S) then moveDir -= Camera.CFrame.LookVector end
if UIS:IsKeyDown(Enum.KeyCode.A) then moveDir -= Camera.CFrame.RightVector end
if UIS:IsKeyDown(Enum.KeyCode.D) then moveDir += Camera.CFrame.RightVector end
local speed = CFG.speedEnabled and CFG.speedValue or 16
ghostClone.HumanoidRootPart.CFrame = ghostClone.HumanoidRootPart.CFrame + (moveDir * speed * 0.033)
ghostClone.HumanoidRootPart.CFrame = CFrame.new(ghostClone.HumanoidRootPart.Position, ghostClone.HumanoidRootPart.Position + Camera.CFrame.LookVector)
end)
else
if ghostConnection then ghostConnection:Disconnect() ghostConnection = nil end
if LP.Character and LP.Character:FindFirstChild("HumanoidRootPart") then
LP.Character.HumanoidRootPart.Anchored = false
if ghostClone and ghostClone:FindFirstChild("HumanoidRootPart") then
LP.Character.HumanoidRootPart.CFrame = ghostClone.HumanoidRootPart.CFrame
elseif originalCFrame then
LP.Character.HumanoidRootPart.CFrame = originalCFrame
end
end
if ghostClone then ghostClone:Destroy() ghostClone = nil end
if LP.Character and LP.Character:FindFirstChildOfClass("Humanoid") then
Camera.CameraSubject = LP.Character.Humanoid
end
end
end
LP.CharacterAdded:Connect(function()
if CFG.ghostMode then
CFG.ghostMode = false
if ghostConnection then ghostConnection:Disconnect() ghostConnection = nil end
if ghostClone then ghostClone:Destroy() ghostClone = nil end
Camera.CameraSubject = LP.Character:WaitForChild("Humanoid")
end
end)
-- ============================================================
-- INVIS, SPEED, JUMP LOOP
-- ============================================================
RunService.Stepped:Connect(function()
if not LP.Character then return end
local hum = LP.Character:FindFirstChildOfClass("Humanoid")
if hum then
if CFG.speedEnabled then hum.WalkSpeed = CFG.speedValue else hum.WalkSpeed = 16 end
if CFG.jumpEnabled then hum.UseJumpPower = true; hum.JumpPower = CFG.jumpValue else hum.JumpPower = 50 end
end
for _, v in pairs(LP.Character:GetDescendants()) do
if v:IsA("BasePart") then
v.LocalTransparencyModifier = CFG.invis and 1 or 0
elseif v:IsA("Decal") then
v.Transparency = CFG.invis and 1 or 0
end
end
end)
-- ============================================================
-- ESP LOOPS (Players + Chests)
-- ============================================================
task.spawn(function()
while true do
task.wait(1)
-- Player ESP
for plr, hl in pairs(highlights) do
if not plr.Character or not plr.Character:FindFirstChild("HumanoidRootPart") then
hl:Destroy() highlights[plr] = nil
end
end
if CFG.esp then
for _, plr in ipairs(Players:GetPlayers()) do
if plr ~= LP and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
if not highlights[plr] then
local hl = Instance.new("Highlight")
hl.FillColor = Color3.fromRGB(255, 50, 50)
hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
hl.Adornee = plr.Character
hl.Parent = plr.Character
highlights[plr] = hl
end
end
end
else
for _, hl in pairs(highlights) do hl:Destroy() end
highlights = {}
end
-- Chest ESP
for obj, hl in pairs(chestHighlights) do
if not obj.Parent then
hl:Destroy() chestHighlights[obj] = nil
end
end
if CFG.chestESP then
for _, v in pairs(workspace:GetDescendants()) do
if (v:IsA("Model") or v:IsA("BasePart")) and not chestHighlights[v] then
local name = string.lower(v.Name)
if name:find("chest") or name:find("treasure") or name:find("loot") or name:find("crate") then
local hl = Instance.new("Highlight")
hl.FillColor = Color3.fromRGB(255, 215, 0) -- Gold
hl.FillTransparency = 0.3
hl.OutlineColor = Color3.fromRGB(255, 255, 255)
hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
hl.Adornee = v
hl.Parent = v
chestHighlights[v] = hl
end
end
end
else
for _, hl in pairs(chestHighlights) do hl:Destroy() end
chestHighlights = {}
end
end
end)
-- ============================================================
-- GUI
-- ============================================================
local function makeGUI()
local old = CoreGui:FindFirstChild("TDI_Ultimate")
if old then old:Destroy() end
local sg = Instance.new("ScreenGui")
sg.Name = "TDI_Ultimate"
sg.ResetOnSpawn = false
sg.Parent = CoreGui
local main = Instance.new("Frame")
main.Size = UDim2.new(0, 260, 0, 470)
main.Position = UDim2.new(0.5, -130, 0.5, -235)
main.BackgroundColor3 = Color3.fromRGB(20, 20, 26)
main.BorderSizePixel = 0
main.Active = true
main.ClipsDescendants = true
main.Parent = sg
Instance.new("UICorner", main).CornerRadius = UDim.new(0, 10)
local st = Instance.new("UIStroke", main)
st.Color = Color3.fromRGB(255, 100, 150)
st.Thickness = 1.5
-- Drag
local dragging, dStart, sPos
main.InputBegan:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then
dragging = true; dStart = i.Position; sPos = main.Position
end
end)
UIS.InputChanged:Connect(function(i)
if not dragging then return end
if i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch then
local d = i.Position - dStart
main.Position = UDim2.new(0, sPos.X.Offset + d.X, 0, sPos.Y.Offset + d.Y)
end
end)
UIS.InputEnded:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging = false end
end)
-- Title Bar
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 32)
title.BackgroundColor3 = Color3.fromRGB(50, 20, 35)
title.BorderSizePixel = 0
title.Text = " TDI Ultimate v4"
title.TextColor3 = Color3.fromRGB(255, 180, 200)
title.Font = Enum.Font.GothamBold
title.TextSize = 13
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = main
Instance.new("UICorner", title).CornerRadius = UDim.new(0, 10)
-- Minimize Button
local minBtn = Instance.new("TextButton")
minBtn.Size = UDim2.new(0, 26, 0, 26)
minBtn.Position = UDim2.new(1, -60, 0, 3)
minBtn.BackgroundColor3 = Color3.fromRGB(80, 80, 110)
minBtn.BorderSizePixel = 0
minBtn.Text = "–"
minBtn.TextColor3 = Color3.fromRGB(255,255,255)
minBtn.Font = Enum.Font.GothamBold
minBtn.TextSize = 18
minBtn.Parent = title
Instance.new("UICorner", minBtn).CornerRadius = UDim.new(0, 5)
-- Close Button
local close = Instance.new("TextButton")
close.Size = UDim2.new(0, 26, 0, 26)
close.Position = UDim2.new(1, -30, 0, 3)
close.BackgroundColor3 = Color3.fromRGB(180, 50, 70)
close.BorderSizePixel = 0
close.Text = "×"
close.TextColor3 = Color3.fromRGB(255,255,255)
close.Font = Enum.Font.GothamBold
close.TextSize = 18
close.Parent = title
Instance.new("UICorner", close).CornerRadius = UDim.new(0, 5)
close.MouseButton1Click:Connect(function()
if CFG.ghostMode then CFG.ghostMode = false; toggleGhostMode() end
sg:Destroy()
end)
-- Minimize Logic
local minimized = false
minBtn.MouseButton1Click:Connect(function()
minimized = not minimized
if minimized then
main.Size = UDim2.new(0, 260, 0, 32)
minBtn.Text = "+"
else
main.Size = UDim2.new(0, 260, 0, 470)
minBtn.Text = "–"
end
end)
-- Main Content
local body = Instance.new("ScrollingFrame")
body.Size = UDim2.new(1, -16, 1, -40)
body.Position = UDim2.new(0, 8, 0, 36)
body.BackgroundTransparency = 1
body.BorderSizePixel = 0
body.CanvasSize = UDim2.new(0, 0, 0, 600)
body.ScrollBarThickness = 3
body.Parent = main
local layout = Instance.new("UIListLayout", body)
layout.Padding = UDim.new(0, 4)
layout.SortOrder = Enum.SortOrder.LayoutOrder
local y = 1
local function toggle(name, key, func)
local b = Instance.new("TextButton")
b.Size = UDim2.new(1, 0, 0, 28)
b.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
b.BorderSizePixel = 0
b.Text = name .. ": " .. (CFG[key] and "ON" or "OFF")
b.TextColor3 = CFG[key] and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
b.Font = Enum.Font.Gotham
b.TextSize = 12
b.LayoutOrder = y
b.Parent = body
Instance.new("UICorner", b).CornerRadius = UDim.new(0, 6)
b.MouseButton1Click:Connect(function()
CFG[key] = not CFG[key]
b.Text = name .. ": " .. (CFG[key] and "ON" or "OFF")
b.TextColor3 = CFG[key] and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
if func then func() end
end)
y += 1
end
toggle("Invisibility (Local)", "invis")
toggle("Player ESP", "esp")
toggle("Chest ESP (Gold)", "chestESP")
-- Ghost Mode Button
local ghostBtn = Instance.new("TextButton")
ghostBtn.Size = UDim2.new(1, 0, 0, 28)
ghostBtn.BackgroundColor3 = Color3.fromRGB(50, 20, 30)
ghostBtn.BorderSizePixel = 0
ghostBtn.Text = "DESYNC GHOST: OFF"
ghostBtn.TextColor3 = Color3.fromRGB(255, 100, 100)
ghostBtn.Font = Enum.Font.GothamBold
ghostBtn.TextSize = 12
ghostBtn.LayoutOrder = y
ghostBtn.Parent = body
Instance.new("UICorner", ghostBtn).CornerRadius = UDim.new(0, 6)
ghostBtn.MouseButton1Click:Connect(function()
CFG.ghostMode = not CFG.ghostMode
if CFG.ghostMode then
ghostBtn.Text = "DESYNC GHOST: ACTIVE"
ghostBtn.TextColor3 = Color3.fromRGB(150, 255, 150)
ghostBtn.BackgroundColor3 = Color3.fromRGB(20, 50, 30)
else
ghostBtn.Text = "DESYNC GHOST: OFF"
ghostBtn.TextColor3 = Color3.fromRGB(255, 100, 100)
ghostBtn.BackgroundColor3 = Color3.fromRGB(50, 20, 30)
end
toggleGhostMode()
end)
y += 1
-- Speed Input Box
local spFrame = Instance.new("Frame")
spFrame.Size = UDim2.new(1, 0, 0, 28)
spFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
spFrame.BorderSizePixel = 0
spFrame.LayoutOrder = y
spFrame.Parent = body
Instance.new("UICorner", spFrame).CornerRadius = UDim.new(0, 6)
y += 1
local spToggle = Instance.new("TextButton")
spToggle.Size = UDim2.new(0.6, 0, 1, 0)
spToggle.BackgroundTransparency = 1
spToggle.Text = "WalkSpeed: " .. (CFG.speedEnabled and "ON" or "OFF")
spToggle.TextColor3 = CFG.speedEnabled and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
spToggle.Font = Enum.Font.Gotham
spToggle.TextSize = 12
spToggle.Parent = spFrame
spToggle.MouseButton1Click:Connect(function()
CFG.speedEnabled = not CFG.speedEnabled
spToggle.Text = "WalkSpeed: " .. (CFG.speedEnabled and "ON" or "OFF")
spToggle.TextColor3 = CFG.speedEnabled and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
end)
local spBox = Instance.new("TextBox")
spBox.Size = UDim2.new(0.3, 0, 0.8, 0)
spBox.Position = UDim2.new(0.65, 0, 0.1, 0)
spBox.BackgroundColor3 = Color3.fromRGB(20, 20, 26)
spBox.BorderSizePixel = 0
spBox.Text = tostring(CFG.speedValue)
spBox.TextColor3 = Color3.fromRGB(255, 255, 255)
spBox.Font = Enum.Font.Gotham
spBox.TextSize = 12
spBox.Parent = spFrame
Instance.new("UICorner", spBox).CornerRadius = UDim.new(0, 4)
spBox:GetPropertyChangedSignal("Text"):Connect(function()
local num = tonumber(spBox.Text)
if num then CFG.speedValue = num end
end)
-- Jump Input Box
local jpFrame = Instance.new("Frame")
jpFrame.Size = UDim2.new(1, 0, 0, 28)
jpFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
jpFrame.BorderSizePixel = 0
jpFrame.LayoutOrder = y
jpFrame.Parent = body
Instance.new("UICorner", jpFrame).CornerRadius = UDim.new(0, 6)
y += 1
local jpToggle = Instance.new("TextButton")
jpToggle.Size = UDim2.new(0.6, 0, 1, 0)
jpToggle.BackgroundTransparency = 1
jpToggle.Text = "JumpPower: " .. (CFG.jumpEnabled and "ON" or "OFF")
jpToggle.TextColor3 = CFG.jumpEnabled and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
jpToggle.Font = Enum.Font.Gotham
jpToggle.TextSize = 12
jpToggle.Parent = jpFrame
jpToggle.MouseButton1Click:Connect(function()
CFG.jumpEnabled = not CFG.jumpEnabled
jpToggle.Text = "JumpPower: " .. (CFG.jumpEnabled and "ON" or "OFF")
jpToggle.TextColor3 = CFG.jumpEnabled and Color3.fromRGB(150, 255, 150) or Color3.fromRGB(200, 200, 210)
end)
local jpBox = Instance.new("TextBox")
jpBox.Size = UDim2.new(0.3, 0, 0.8, 0)
jpBox.Position = UDim2.new(0.65, 0, 0.1, 0)
jpBox.BackgroundColor3 = Color3.fromRGB(20, 20, 26)
jpBox.BorderSizePixel = 0
jpBox.Text = tostring(CFG.jumpValue)
jpBox.TextColor3 = Color3.fromRGB(255, 255, 255)
jpBox.Font = Enum.Font.Gotham
jpBox.TextSize = 12
jpBox.Parent = jpFrame
Instance.new("UICorner", jpBox).CornerRadius = UDim.new(0, 4)
jpBox:GetPropertyChangedSignal("Text"):Connect(function()
local num = tonumber(jpBox.Text)
if num then CFG.jumpValue = num end
end)
-- Whisper Spy Section
local spyTitle = Instance.new("TextLabel")
spyTitle.Size = UDim2.new(1, 0, 0, 24)
spyTitle.BackgroundTransparency = 1
spyTitle.Text = "WHISPER SPY"
spyTitle.TextColor3 = Color3.fromRGB(150, 110, 220)
spyTitle.Font = Enum.Font.GothamBold
spyTitle.TextSize = 12
spyTitle.TextXAlignment = Enum.TextXAlignment.Left
spyTitle.LayoutOrder = y
spyTitle.Parent = body
y += 1
local spyLog = Instance.new("ScrollingFrame")
spyLog.Size = UDim2.new(1, 0, 0, 120)
spyLog.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
spyLog.BorderSizePixel = 0
spyLog.CanvasSize = UDim2.new(0, 0, 0, 0)
spyLog.ScrollBarThickness = 2
spyLog.LayoutOrder = y
spyLog.Parent = body
Instance.new("UICorner", spyLog).CornerRadius = UDim.new(0, 6)
local spyLayout = Instance.new("UIListLayout", spyLog)
spyLayout.Padding = UDim.new(0, 2)
spyLayout.SortOrder = Enum.SortOrder.LayoutOrder
local function addSpyLog(sender, message)
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(1, -4, 0, 20)
lbl.BackgroundTransparency = 1
lbl.Text = string.format("[W] %s: %s", sender, message)
lbl.TextColor3 = Color3.fromRGB(255, 150, 180)
lbl.Font = Enum.Font.Gotham
lbl.TextSize = 11
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextTruncate = Enum.TextTruncate.AtEnd
lbl.LayoutOrder = #spyLog:GetChildren()
lbl.Parent = spyLog
spyLog.CanvasSize = UDim2.new(0, 0, 0, spyLayout.AbsoluteContentSize.Y + 4)
spyLog.CanvasPosition = Vector2.new(0, spyLog.CanvasSize.Y.Offset)
end
-- Hook Whisper Chat
if TextChatService.ChatVersion == Enum.ChatVersion.TextChatService then
local general = TextChatService:FindFirstChild("TextChannels") and TextChatService.TextChannels:FindFirstChild("RBXGeneral")
if general then
local oldSend = general.SendAsync
general.SendAsync = function(self, text)
if string.sub(text, 1, 2):lower() == "/w" then
local parts = string.split(text, " ")
if #parts >= 3 then
local target = parts[2]
local msg = table.concat(parts, " ", 3)
addSpyLog("You -> " .. target, msg)
end
end
return oldSend(self, text)
end
end
end
end
makeGUI()
print("[TDI Ultimate v4] loaded with Chest ESP.")Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place