
Key Required VerifiedUniversal

-- Global settings (can be changed via menu)
_G.WRDESPEnabled = true
_G.WRDESPBoxes = true
_G.WRDESPChams = true
_G.WRDESPText = true
_G.WRDESPMenuKey = Enum.KeyCode.Insert
local players = game:GetService("Players")
local runService = game:GetService("RunService")
local starterGui = game:GetService("StarterGui")
local workspace = game:GetService("Workspace")
local camera = workspace.CurrentCamera
local localPlayer = players.LocalPlayer
local userInputService = game:GetService("UserInputService")
local MAX_RENDER_DISTANCE = 4000
local FONT_MIN_SIZE = 4
local FONT_MAX_SIZE = 14
local REFERENCE_DISTANCE = 150
local MIN_SIZE_DISTANCE = 600
local function showNotification(title, text)
starterGui:SetCore("SendNotification", {
Title = title;
Text = text;
Duration = 5;
})
end
local function getHealthColor(healthPercent)
local r, g, b
if healthPercent >= 0.5 then
local t = (healthPercent - 0.5) * 2
r = 255 * (1 - t)
g = 255
b = 0
else
local t = healthPercent * 2
r = 255
g = 255 * t
b = 0
end
return Color3.fromRGB(r, g, b)
end
local function isBot(character)
if not character then return false end
local player = players:GetPlayerFromCharacter(character)
if player then return false end
if character.Parent and character.Parent.Name == "Characters" then
if character:FindFirstChildOfClass("Humanoid") then
return true
end
end
if character.Parent and character.Parent ~= players and character:FindFirstChildOfClass("Humanoid") then
if not players:GetPlayerFromCharacter(character) then
return true
end
end
return false
end
local espData = {}
-- Create Fill (Chams)
local function createFill(character, isBotCharacter)
if not character then return end
local oldFill = character:FindFirstChild("ESPHighlightFill")
if oldFill then oldFill:Destroy() end
local fill = Instance.new("Highlight")
fill.Name = "ESPHighlightFill"
fill.FillTransparency = 0.6
fill.OutlineTransparency = 1
fill.FillColor = Color3.fromRGB(0, 255, 0)
fill.DepthMode = Enum.HighlightDepthMode.Occluded
fill.Parent = character
fill.Adornee = character
local function updateFillColor()
if not character or not character.Parent then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local healthPercent = humanoid.Health / humanoid.MaxHealth
local color
if isBotCharacter then
color = Color3.fromRGB(128, 0, 255)
else
color = getHealthColor(healthPercent)
end
fill.FillColor = color
end
updateFillColor()
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.HealthChanged:Connect(updateFillColor)
end
if not espData[character] then espData[character] = {} end
espData[character].fill = fill
fill.Enabled = _G.WRDESPEnabled and _G.WRDESPChams
return fill
end
-- Create Box (Quad)
local function createBox(character, isBotCharacter)
if not character then return end
if espData[character] and espData[character].boxQuad then
espData[character].boxQuad:Remove()
espData[character].boxQuad = nil
end
local quad = Drawing.new("Quad")
quad.Thickness = 2
quad.Transparency = 1
quad.Filled = false
quad.Visible = true
quad.Color = Color3.fromRGB(255, 255, 255)
if not espData[character] then
espData[character] = {}
end
espData[character].boxQuad = quad
espData[character].isBot = isBotCharacter
espData[character].character = character
local function updateBoxColor()
if not character or not character.Parent then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local healthPercent = humanoid.Health / humanoid.MaxHealth
local color
if isBotCharacter then
color = Color3.fromRGB(128, 0, 255)
else
color = getHealthColor(healthPercent)
end
quad.Color = Color3.new(color.R * 0.4, color.G * 0.4, color.B * 0.4)
end
updateBoxColor()
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.HealthChanged:Connect(updateBoxColor)
end
quad.Visible = _G.WRDESPEnabled and _G.WRDESPBoxes
return quad
end
-- Create Text (BillboardGui)
local function createText(character, isBotCharacter)
if not character then return end
local oldFolder = character:FindFirstChild("ESP_Folder")
if oldFolder then oldFolder:Destroy() end
local espFolder = Instance.new("Folder")
espFolder.Name = "ESP_Folder"
espFolder.Parent = character
local billboard = Instance.new("BillboardGui")
billboard.Name = "ESP_Billboard"
billboard.Size = UDim2.new(0, 200, 0, 80)
billboard.Adornee = character
billboard.AlwaysOnTop = true
billboard.MaxDistance = MAX_RENDER_DISTANCE
billboard.StudsOffset = Vector3.new(0, 11, 0)
billboard.Parent = espFolder
local mainContainer = Instance.new("Frame")
mainContainer.Name = "MainContainer"
mainContainer.Size = UDim2.new(1, 0, 1, 0)
mainContainer.BackgroundTransparency = 1
mainContainer.BorderSizePixel = 0
mainContainer.Parent = billboard
-- Distance
local distContainer = Instance.new("Frame")
distContainer.Name = "DistContainer"
distContainer.Size = UDim2.new(1, 0, 0.25, 0)
distContainer.Position = UDim2.new(0, 0, 0, 0)
distContainer.BackgroundTransparency = 1
distContainer.BorderSizePixel = 0
distContainer.Parent = mainContainer
local distLabel = Instance.new("TextLabel")
distLabel.Name = "DistLabel"
distLabel.Size = UDim2.new(1, 0, 1, 0)
distLabel.BackgroundTransparency = 1
distLabel.Text = "0 studs"
distLabel.TextColor3 = Color3.fromRGB(255, 255, 100)
distLabel.TextScaled = false
distLabel.TextSize = 10
distLabel.Font = Enum.Font.GothamBold
distLabel.TextStrokeTransparency = 0.1
distLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
distLabel.TextXAlignment = Enum.TextXAlignment.Center
distLabel.Parent = distContainer
-- HP
local hpContainer = Instance.new("Frame")
hpContainer.Name = "HPContainer"
hpContainer.Size = UDim2.new(1, 0, 0.3, 0)
hpContainer.Position = UDim2.new(0, 0, 0.25, 0)
hpContainer.BackgroundTransparency = 1
hpContainer.BorderSizePixel = 0
hpContainer.Parent = mainContainer
local hpLabel = Instance.new("TextLabel")
hpLabel.Name = "HPLabel"
hpLabel.Size = UDim2.new(1, 0, 1, 0)
hpLabel.BackgroundTransparency = 1
hpLabel.TextColor3 = Color3.fromRGB(255, 50, 50)
hpLabel.TextScaled = false
hpLabel.TextSize = 12
hpLabel.Font = Enum.Font.GothamBold
hpLabel.TextStrokeTransparency = 0.1
hpLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
hpLabel.TextXAlignment = Enum.TextXAlignment.Center
hpLabel.Parent = hpContainer
-- Name
local nameContainer = Instance.new("Frame")
nameContainer.Name = "NameContainer"
nameContainer.Size = UDim2.new(1, 0, 0.45, 0)
nameContainer.Position = UDim2.new(0, 0, 0.55, 0)
nameContainer.BackgroundTransparency = 1
nameContainer.BorderSizePixel = 0
nameContainer.Parent = mainContainer
local nameLabel = Instance.new("TextLabel")
nameLabel.Name = "NameLabel"
nameLabel.Size = UDim2.new(1, 0, 1, 0)
nameLabel.BackgroundTransparency = 1
nameLabel.TextScaled = false
nameLabel.TextSize = 14
nameLabel.Font = Enum.Font.GothamBold
nameLabel.TextStrokeTransparency = 0.1
nameLabel.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
nameLabel.TextXAlignment = Enum.TextXAlignment.Center
nameLabel.Parent = nameContainer
if isBotCharacter then
nameLabel.Text = "🤖 " .. character.Name
nameLabel.TextColor3 = Color3.fromRGB(180, 130, 255)
hpLabel.Text = "⚡ 100%"
else
local player = players:GetPlayerFromCharacter(character)
if player then
nameLabel.Text = player.Name
else
nameLabel.Text = character.Name
end
nameLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
hpLabel.Text = "❤️ 100%"
end
local function updateHP()
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid.MaxHealth > 0 then
local healthPercent = humanoid.Health / humanoid.MaxHealth
local percent = math.round(healthPercent * 100)
if isBotCharacter then
hpLabel.Text = "⚡ " .. percent .. "%"
hpLabel.TextColor3 = Color3.fromRGB(180, 130, 255)
else
hpLabel.Text = "❤️ " .. percent .. "%"
hpLabel.TextColor3 = getHealthColor(healthPercent)
end
end
end
if not espData[character] then espData[character] = {} end
espData[character].billboard = billboard
espData[character].nameLabel = nameLabel
espData[character].hpLabel = hpLabel
espData[character].distLabel = distLabel
espData[character].character = character
espData[character].nameText = nameLabel.Text
espData[character].isBot = isBotCharacter
espData[character].updateHP = updateHP
updateHP()
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
humanoid.HealthChanged:Connect(updateHP)
end
billboard.Enabled = _G.WRDESPEnabled and _G.WRDESPText
return billboard
end
local function updateESP()
if not localPlayer.Character or not localPlayer.Character:FindFirstChild("HumanoidRootPart") then
return
end
local localPos = localPlayer.Character.HumanoidRootPart.Position
local cam = workspace.CurrentCamera
for character, data in pairs(espData) do
if not character or not character.Parent then
if data.boxQuad then
data.boxQuad:Remove()
data.boxQuad = nil
end
espData[character] = nil
continue
end
local rootPart = character:FindFirstChild("HumanoidRootPart") or character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso")
if not rootPart then continue end
-- Update text
if data.billboard and data.nameLabel and data.hpLabel and data.distLabel then
local distance = (rootPart.Position - localPos).Magnitude
local scale
if distance <= REFERENCE_DISTANCE then
scale = 1
elseif distance >= MIN_SIZE_DISTANCE then
scale = 0
else
scale = 1 - ((distance - REFERENCE_DISTANCE) / (MIN_SIZE_DISTANCE - REFERENCE_DISTANCE))
scale = math.clamp(scale, 0, 1)
end
local textSize = FONT_MIN_SIZE + (FONT_MAX_SIZE - FONT_MIN_SIZE) * scale
textSize = math.max(textSize, FONT_MIN_SIZE)
data.nameLabel.TextSize = textSize
local hpSize = math.max(textSize * 0.7, 3)
data.hpLabel.TextSize = hpSize
local distSize = math.max(textSize * 0.6, 3)
data.distLabel.TextSize = distSize
local nameLength = string.len(data.nameText)
local charWidth = textSize * 0.55
local textWidth = nameLength * charWidth
local newWidth = math.clamp(textWidth + 30, 30, 300)
local newHeight = math.clamp(textSize * 4, 20, 80)
data.billboard.Size = UDim2.new(0, newWidth, 0, newHeight)
local offsetY = 11 + (1 - scale) * 1.5
data.billboard.StudsOffset = Vector3.new(0, offsetY, 0)
data.billboard.Enabled = (distance <= MAX_RENDER_DISTANCE) and _G.WRDESPEnabled and _G.WRDESPText
end
-- Update box
if data.boxQuad then
local distance = (rootPart.Position - localPos).Magnitude
if distance > MAX_RENDER_DISTANCE or not (_G.WRDESPEnabled and _G.WRDESPBoxes) then
data.boxQuad.Visible = false
else
local size = Vector3.new(4, 6, 0)
local shift = CFrame.new(0, -0.192, 0)
local cf = rootPart.CFrame * shift
local corners = {
cf * CFrame.new(size.X/2, size.Y/2, 0),
cf * CFrame.new(-size.X/2, size.Y/2, 0),
cf * CFrame.new(-size.X/2, -size.Y/2, 0),
cf * CFrame.new(size.X/2, -size.Y/2, 0)
}
local viewportPoints = {}
local allVisible = true
for i, corner in ipairs(corners) do
local pos, vis = camera:WorldToViewportPoint(corner.p)
if not vis then allVisible = false end
viewportPoints[i] = Vector2.new(pos.X, pos.Y)
end
if allVisible then
data.boxQuad.Visible = true
data.boxQuad.PointA = viewportPoints[1]
data.boxQuad.PointB = viewportPoints[2]
data.boxQuad.PointC = viewportPoints[3]
data.boxQuad.PointD = viewportPoints[4]
else
data.boxQuad.Visible = false
end
end
end
-- Update fill
if data.fill then
data.fill.Enabled = _G.WRDESPEnabled and _G.WRDESPChams
end
end
end
local function addESPToCharacter(character)
if not character or character == localPlayer.Character then return end
if espData[character] then return end
local isBotCharacter = isBot(character)
createFill(character, isBotCharacter)
createBox(character, isBotCharacter)
createText(character, isBotCharacter)
end
local function scanForBots()
for _, obj in pairs(workspace:GetDescendants()) do
if obj:IsA("Model") and obj:FindFirstChildOfClass("Humanoid") then
if not players:GetPlayerFromCharacter(obj) then
if obj.Parent and (obj.Parent.Name == "Characters" or obj.Parent ~= players) then
addESPToCharacter(obj)
end
end
end
end
end
local function setupPlayer(player)
if player == localPlayer then return end
local character = player.Character
if character then
task.wait(0.3)
addESPToCharacter(character)
end
player.CharacterAdded:Connect(function(newCharacter)
task.wait(0.5)
if player ~= localPlayer then
addESPToCharacter(newCharacter)
end
end)
end
for _, player in pairs(players:GetPlayers()) do
task.wait(0.2)
setupPlayer(player)
end
players.PlayerAdded:Connect(function(player)
task.wait(0.5)
setupPlayer(player)
end)
task.wait(1)
scanForBots()
workspace.DescendantAdded:Connect(function(obj)
task.wait(0.5)
if obj:IsA("Model") and obj:FindFirstChildOfClass("Humanoid") then
if not players:GetPlayerFromCharacter(obj) then
addESPToCharacter(obj)
end
end
end)
players.PlayerRemoving:Connect(function(player)
if player.Character then
local fill = player.Character:FindFirstChild("ESPHighlightFill")
if fill then fill:Destroy() end
local folder = player.Character:FindFirstChild("ESP_Folder")
if folder then folder:Destroy() end
if espData[player.Character] and espData[player.Character].boxQuad then
espData[player.Character].boxQuad:Remove()
end
espData[player.Character] = nil
end
end)
runService.RenderStepped:Connect(function()
updateESP()
end)
-- ========== GUI MENU ==========
local function createMenu()
local playerGui = localPlayer:FindFirstChild("PlayerGui")
if not playerGui then
playerGui = Instance.new("PlayerGui")
playerGui.Parent = localPlayer
end
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "ESPMenuGui"
screenGui.Parent = playerGui
local frame = Instance.new("Frame")
frame.Name = "MainFrame"
frame.Size = UDim2.new(0, 300, 0, 350)
frame.Position = UDim2.new(0.5, -150, 0.5, -175)
frame.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
frame.BackgroundTransparency = 0.1
frame.BorderSizePixel = 2
frame.BorderColor3 = Color3.fromRGB(100, 100, 150)
frame.Active = true
frame.Draggable = true
frame.Parent = screenGui
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 30)
title.Position = UDim2.new(0, 0, 0, 0)
title.BackgroundTransparency = 1
title.Text = "ESP Menu"
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.TextSize = 18
title.Font = Enum.Font.GothamBold
title.Parent = frame
local function createToggle(parent, labelText, variable, yPos)
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(0.9, 0, 0, 30)
btn.Position = UDim2.new(0.05, 0, 0, yPos)
btn.BackgroundColor3 = Color3.fromRGB(60, 60, 80)
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.TextSize = 14
btn.Font = Enum.Font.Gotham
btn.Parent = parent
local function updateText()
local state = _G[variable]
btn.Text = labelText .. ": " .. (state and "ON" or "OFF")
btn.BackgroundColor3 = state and Color3.fromRGB(40, 200, 40) or Color3.fromRGB(200, 40, 40)
end
updateText()
btn.MouseButton1Click:Connect(function()
_G[variable] = not _G[variable]
updateText()
end)
return btn
end
createToggle(frame, "Box ESP", "WRDESPBoxes", 35)
createToggle(frame, "Chams (Fill)", "WRDESPChams", 70)
createToggle(frame, "Text (Name/HP/Dist)", "WRDESPText", 105)
createToggle(frame, "ESP Enabled", "WRDESPEnabled", 140)
-- Bind button
local bindBtn = Instance.new("TextButton")
bindBtn.Size = UDim2.new(0.9, 0, 0, 30)
bindBtn.Position = UDim2.new(0.05, 0, 0, 180)
bindBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 80)
bindBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
bindBtn.TextSize = 14
bindBtn.Font = Enum.Font.Gotham
bindBtn.Parent = frame
local function updateBindText()
local keyName = _G.WRDESPMenuKey.Name
bindBtn.Text = "Menu Key: " .. keyName .. " (click to change)"
end
updateBindText()
local waitingForBind = false
bindBtn.MouseButton1Click:Connect(function()
waitingForBind = true
bindBtn.Text = "Press any key..."
bindBtn.BackgroundColor3 = Color3.fromRGB(200, 200, 0)
end)
userInputService.InputBegan:Connect(function(input, gameProcessed)
if waitingForBind and not gameProcessed then
if input.KeyCode ~= Enum.KeyCode.Unknown then
_G.WRDESPMenuKey = input.KeyCode
waitingForBind = false
updateBindText()
bindBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 80)
showNotification("Bind changed", "New key: " .. _G.WRDESPMenuKey.Name)
end
end
end)
-- Close menu button (hides menu)
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0.4, 0, 0, 30)
closeBtn.Position = UDim2.new(0.3, 0, 0, 220)
closeBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 120)
closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
closeBtn.TextSize = 14
closeBtn.Font = Enum.Font.Gotham
closeBtn.Text = "Close Menu"
closeBtn.Parent = frame
closeBtn.MouseButton1Click:Connect(function()
frame.Visible = false
end)
-- Show menu button (appears when hidden)
local showBtn = Instance.new("TextButton")
showBtn.Name = "ShowMenuBtn"
showBtn.Size = UDim2.new(0, 60, 0, 30)
showBtn.Position = UDim2.new(0, 10, 0, 10)
showBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 80)
showBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
showBtn.TextSize = 12
showBtn.Font = Enum.Font.Gotham
showBtn.Text = "☰ Menu"
showBtn.Visible = false
showBtn.Parent = screenGui
showBtn.MouseButton1Click:Connect(function()
frame.Visible = true
showBtn.Visible = false
end)
-- Toggle menu with bind
userInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == _G.WRDESPMenuKey then
if frame.Visible then
frame.Visible = false
showBtn.Visible = true
else
frame.Visible = true
showBtn.Visible = false
end
end
end)
-- Show menu immediately after creation
frame.Visible = true
showBtn.Visible = false
return screenGui
end
createMenu()
local keyName = _G.WRDESPMenuKey.Name
showNotification("ESP Activated", "Press " .. keyName .. " to open menu")No comments yet for this script.



