ESP
Key Required

ESP

[EARLY PAID ACCESS] HavocNekoProdNekoProd 129 views 996 executesUpdated Jul 6, 2026
Unrated
00
Lua Script•587 lines (21126 chars)
-- 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")

Features & Information

Pretty universal i'd say. Made by ai and has wrdesp boxes has bots/scavs/players esp
#ESP#Universal#Bot ESP

Community Comments (0)

No comments yet for this script.

More Scripts for [EARLY PAID ACCESS] Havoc