-- 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")