ESP
Key Required

ESP

🧟 Survive the ApocalypseTheTUCKSTERTheTUCKSTER 448 views 3.6K executesUpdated Jul 20, 2026
0.0/ 5(1 votes)
010% Positive
Lua Script•479 lines (17775 chars)
local Players          = game:GetService("Players")
local RunService       = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local LocalPlayer      = Players.LocalPlayer

local espEnabled = {
    Zombie = false, Heals  = false, Food  = false,
    Gas    = false, Armor  = false, Weapon = false, Scrap = false,
}
local espDistance = 150

local ESP_COLORS = {
    Zombie = Color3.fromRGB(255,  60,  60),
    Heals  = Color3.fromRGB( 80, 255, 160),
    Food   = Color3.fromRGB( 80, 255,  80),
    Gas    = Color3.fromRGB(220, 100, 255),
    Armor  = Color3.fromRGB( 80, 150, 255),
    Weapon = Color3.fromRGB(255, 140,   0),
    Scrap  = Color3.fromRGB(200, 160,  70),
}

local TAG_MAP = {
    Zombie = {"zombie","undead","infected","walker","crawler","ghoul","zomb"},
    Heals  = {
        "medkit", "med kit", "firstaid", "first aid", "medbox", "health kit",
        "bandage", "gauze", "wrap",
    },
    Food   = {
        "food","cola","soda","water bottle","can of","canned","snack","bloxy",
        "chips","candy","juice","coffee","energy drink","apple","banana","pizza",
        "burger","soup","meal","ration","hearts","heart","bread","beef",
    },
    Gas    = {"gas can","gascan","gas_can","jerry can","jerrycan","fuel can","fuelcan","canister","fuel jug","fuel"},
    Armor  = {
        "light armor","lightarmor","light_armor","medium armor","mediumarmor","medium_armor",
        "heavy armor","heavyarmor","heavy_armor","power arm","powerarm","power_arm",
        "power core","powercore","power_core","vest","helmet","plate carrier","body armor","armor","armour",
    },
    Weapon = {
        "heavy sniper","heavysniper","uzi","pistol","revolver","rifle","shotgun","smg","sniper",
        "carbine","assault","lmg","dmr","ak","m4","m16","m1911","mp5","mp40","ump",
        "deagle","glock","beretta","colt","awp","awm","kar98","mosin","barrett",
        "remington","winchester","spas","aa12","rpg","crossbow","flamethrower",
        "crowbar","hammer","wrench","bat","knife","machete","hatchet","axe","sword","katana","gun","weapon","firearm",
        "pistol ammo","medium ammo","long ammo","shotgun ammo","sniper ammo",
        "rifle ammo","shells","shell","ammo","rounds","bullets","magazine","mag",
    },
    Scrap  = {"scrap","scraps","metal scrap","junk","salvage","batteries","battery"},
}

local function matchItem(name)
    local low = name:lower()
    for item, kws in pairs(TAG_MAP) do
        for _, kw in ipairs(kws) do
            if low:find(kw, 1, true) then return item end
        end
    end
end

local cachedObjects = {}
for item in pairs(TAG_MAP) do cachedObjects[item] = {} end

local function alreadyCached(obj, item)
    for _, v in ipairs(cachedObjects[item]) do if v == obj then return true end end
end

local function tryRegister(obj)
    local parent = obj.Parent
    if not parent then return end
    if parent.Name == "DroppedItems" or (parent.Parent and parent.Parent.Name == "DroppedItems") then
        local item = matchItem(obj.Name)
        if item and not alreadyCached(obj, item) then
            table.insert(cachedObjects[item], obj)
        end
    elseif parent.Name == "Characters" then
        local isPlayer = false
        for _, p in ipairs(Players:GetPlayers()) do
            if p.Character == obj then isPlayer = true; break end
        end
        if not isPlayer and not alreadyCached(obj, "Zombie") then
            table.insert(cachedObjects["Zombie"], obj)
        end
    end
end

local function unregister(obj)
    for _, list in pairs(cachedObjects) do
        for i = #list, 1, -1 do
            if list[i] == obj then table.remove(list, i) end
        end
    end
end

local function scanFolder(name)
    local folder = workspace:FindFirstChild(name)
    if not folder then return end
    for _, obj in ipairs(folder:GetChildren()) do
        tryRegister(obj)
        for _, child in ipairs(obj:GetChildren()) do
            tryRegister(child)
        end
    end
    folder.ChildAdded:Connect(tryRegister)
    folder.ChildRemoved:Connect(unregister)
end

scanFolder("DroppedItems")
scanFolder("Characters")
task.delay(3, function() scanFolder("DroppedItems"); scanFolder("Characters") end)

local CAR_EXACT = {
    ["Crashed Car 1"] = true,
    ["Crashed Car 2"] = true,
}
local CAR_CONTAINS = {"vehicle","truck","van","sedan","suv"}

local function isCarName(name)
    if CAR_EXACT[name] then return true end
    local low = name:lower()
    for _, kw in ipairs(CAR_CONTAINS) do
        if low:find(kw, 1, true) then return true end
    end
    return false
end

local function tryRegisterCar(obj)
    if not (obj:IsA("Model") or obj:IsA("BasePart")) then return end
    if isCarName(obj.Name) and not alreadyCached(obj, "Scrap") then
        table.insert(cachedObjects["Scrap"], obj)
    end
end

local function scanCars()
    for _, obj in ipairs(workspace:GetDescendants()) do
        tryRegisterCar(obj)
    end
end

scanCars()
task.delay(3, scanCars)

workspace.DescendantAdded:Connect(tryRegisterCar)
workspace.DescendantRemoving:Connect(unregister)

local activeESP = {}

local function getBasePart(obj)
    if obj:IsA("BasePart") then return obj end
    if obj:IsA("Model") and obj.PrimaryPart then return obj.PrimaryPart end
    return obj:FindFirstChildWhichIsA("BasePart", true)
end

local function getPosition(obj)
    local bp = getBasePart(obj)
    return bp and bp.Position
end

local function showESP(obj, item, dist)
    local color = ESP_COLORS[item]
    local data  = activeESP[obj]
    if not data then
        local h = Instance.new("Highlight")
        h.FillColor           = color
        h.OutlineColor        = color
        h.FillTransparency    = 0.45
        h.OutlineTransparency = 0
        h.DepthMode           = Enum.HighlightDepthMode.AlwaysOnTop
        h.Adornee             = obj
        h.Parent              = obj

        local adornee = getBasePart(obj)
        local bb
        if adornee then
            bb = Instance.new("BillboardGui")
            bb.Size           = UDim2.new(0, 140, 0, 40)
            bb.StudsOffset    = Vector3.new(0, 4.5, 0)
            bb.AlwaysOnTop    = true
            bb.LightInfluence = 0
            bb.Adornee        = adornee
            bb.Parent         = obj

            local nameLbl = Instance.new("TextLabel", bb)
            nameLbl.Size                   = UDim2.new(1, 0, 0.55, 0)
            nameLbl.BackgroundTransparency = 1
            nameLbl.Text                   = obj.Name
            nameLbl.TextColor3             = color
            nameLbl.Font                   = Enum.Font.GothamBold
            nameLbl.TextSize               = 13
            nameLbl.TextXAlignment         = Enum.TextXAlignment.Center
            nameLbl.TextStrokeTransparency = 0.3
            nameLbl.TextStrokeColor3       = Color3.new(0, 0, 0)

            local distLbl = Instance.new("TextLabel", bb)
            distLbl.Name                   = "DistLabel"
            distLbl.Size                   = UDim2.new(1, 0, 0.45, 0)
            distLbl.Position               = UDim2.new(0, 0, 0.55, 0)
            distLbl.BackgroundTransparency = 1
            distLbl.Text                   = math.floor(dist) .. " m"
            distLbl.TextColor3             = Color3.fromRGB(220, 220, 220)
            distLbl.Font                   = Enum.Font.Gotham
            distLbl.TextSize               = 11
            distLbl.TextXAlignment         = Enum.TextXAlignment.Center
            distLbl.TextStrokeTransparency = 0.3
            distLbl.TextStrokeColor3       = Color3.new(0, 0, 0)
        end
        activeESP[obj] = { highlight = h, billboard = bb }
    else
        if data.billboard then
            local distLbl = data.billboard:FindFirstChild("DistLabel")
            if distLbl then distLbl.Text = math.floor(dist) .. " m" end
        end
    end
end

local function hideESP(obj)
    local data = activeESP[obj]
    if not data then return end
    if data.highlight and data.highlight.Parent then data.highlight:Destroy() end
    if data.billboard and data.billboard.Parent then data.billboard:Destroy() end
    activeESP[obj] = nil
end

local TICK_RATE = 0.1
local ticker    = 0

RunService.Heartbeat:Connect(function(dt)
    ticker = ticker + dt
    if ticker < TICK_RATE then return end
    ticker = 0

    local char   = LocalPlayer.Character
    local root   = char and char:FindFirstChild("HumanoidRootPart")
    local origin = root and root.Position
    local shouldShow = {}

    if origin then
        for item, enabled in pairs(espEnabled) do
            if enabled then
                for _, obj in ipairs(cachedObjects[item]) do
                    if obj and obj.Parent then
                        local pos = getPosition(obj)
                        if pos then
                            local d = (pos - origin).Magnitude
                            if d <= espDistance then
                                shouldShow[obj] = {item = item, dist = d}
                            end
                        end
                    end
                end
            end
        end
    end

    for obj, info in pairs(shouldShow) do showESP(obj, info.item, info.dist) end
    for obj in pairs(activeESP) do
        if not shouldShow[obj] then hideESP(obj) end
    end
end)

_G.SurviveESP_Debug = function()
    print("=== Survive ESP Cache ===")
    for item, list in pairs(cachedObjects) do
        print(item .. ": " .. #list)
        for _, obj in ipairs(list) do print("   " .. obj.Name) end
    end
    local di = workspace:FindFirstChild("DroppedItems")
    if di then
        print("--- DroppedItems ---")
        for _, c in ipairs(di:GetChildren()) do print("   " .. c.Name) end
    end
    print("=========================")
end

local BLACK     = Color3.fromRGB(0,   0,   0)
local ORANGE    = Color3.fromRGB(255, 140,  0)
local DARK_GREY = Color3.fromRGB(18,  18,  18)
local MID_GREY  = Color3.fromRGB(45,  45,  45)
local WHITE     = Color3.fromRGB(255, 255, 255)

local gui = Instance.new("ScreenGui")
gui.Name           = "SurviveESP_GUI"
gui.ResetOnSpawn   = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent         = (gethui and gethui()) or game:GetService("CoreGui")

local outerFrame = Instance.new("Frame")
outerFrame.Name             = "OuterBorder"
outerFrame.Size             = UDim2.new(0, 220, 0, 100)
outerFrame.Position         = UDim2.new(0, 40, 0, 80)
outerFrame.BackgroundColor3 = ORANGE
outerFrame.BorderSizePixel  = 0
outerFrame.Active           = true
outerFrame.Draggable        = true
outerFrame.Parent           = gui
Instance.new("UICorner", outerFrame).CornerRadius = UDim.new(0, 6)

local main = Instance.new("Frame")
main.Name             = "Main"
main.Size             = UDim2.new(1, -4, 1, -4)
main.Position         = UDim2.new(0, 2, 0, 2)
main.BackgroundColor3 = BLACK
main.BorderSizePixel  = 0
main.Parent           = outerFrame
Instance.new("UICorner", main).CornerRadius = UDim.new(0, 5)

local title = Instance.new("TextLabel")
title.Size                   = UDim2.new(1, -50, 0, 32)
title.Position               = UDim2.new(0, 0, 0, 6)
title.BackgroundTransparency = 1
title.Text                   = "Survive The Apocalypse"
title.TextColor3             = ORANGE
title.Font                   = Enum.Font.GothamBold
title.TextSize               = 14
title.Parent                 = main

local toggleHint = Instance.new("TextLabel")
toggleHint.Size                   = UDim2.new(0, 44, 0, 32)
toggleHint.Position               = UDim2.new(1, -46, 0, 6)
toggleHint.BackgroundTransparency = 1
toggleHint.Text                   = "[P]"
toggleHint.TextColor3             = Color3.fromRGB(100, 100, 100)
toggleHint.Font                   = Enum.Font.Gotham
toggleHint.TextSize               = 10
toggleHint.TextXAlignment         = Enum.TextXAlignment.Right
toggleHint.TextYAlignment         = Enum.TextYAlignment.Top
toggleHint.Parent                 = main

local function makeDivider(y)
    local d = Instance.new("Frame")
    d.Size             = UDim2.new(1, -16, 0, 1)
    d.Position         = UDim2.new(0, 8, 0, y)
    d.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
    d.BorderSizePixel  = 0
    d.Parent           = main
end
makeDivider(40)

local distLabel = Instance.new("TextLabel")
distLabel.Size                   = UDim2.new(1, -16, 0, 16)
distLabel.Position               = UDim2.new(0, 8, 0, 48)
distLabel.BackgroundTransparency = 1
distLabel.Text                   = "ESP Distance:  150 m"
distLabel.TextColor3             = Color3.fromRGB(200, 200, 200)
distLabel.Font                   = Enum.Font.Gotham
distLabel.TextSize               = 11
distLabel.TextXAlignment         = Enum.TextXAlignment.Left
distLabel.Parent                 = main

local sliderTrack = Instance.new("Frame")
sliderTrack.Size             = UDim2.new(1, -16, 0, 4)
sliderTrack.Position         = UDim2.new(0, 8, 0, 68)
sliderTrack.BackgroundColor3 = MID_GREY
sliderTrack.BorderSizePixel  = 0
sliderTrack.Parent           = main
Instance.new("UICorner", sliderTrack).CornerRadius = UDim.new(1, 0)

local sliderFill = Instance.new("Frame")
sliderFill.Size             = UDim2.new((espDistance - 10) / 490, 0, 1, 0)
sliderFill.BackgroundColor3 = ORANGE
sliderFill.BorderSizePixel  = 0
sliderFill.Parent           = sliderTrack
Instance.new("UICorner", sliderFill).CornerRadius = UDim.new(1, 0)

local sliderHandle = Instance.new("TextButton")
sliderHandle.Size             = UDim2.new(0, 12, 0, 12)
sliderHandle.Position         = UDim2.new((espDistance - 10) / 490, -6, 0.5, -6)
sliderHandle.BackgroundColor3 = WHITE
sliderHandle.BorderSizePixel  = 0
sliderHandle.Text             = ""
sliderHandle.Parent           = sliderTrack
Instance.new("UICorner", sliderHandle).CornerRadius = UDim.new(1, 0)

local dragging = false
sliderHandle.MouseButton1Down:Connect(function() dragging = true end)
UserInputService.InputEnded:Connect(function(i)
    if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
end)
UserInputService.InputChanged:Connect(function(i)
    if not dragging or i.UserInputType ~= Enum.UserInputType.MouseMovement then return end
    local ratio           = math.clamp((i.Position.X - sliderTrack.AbsolutePosition.X) / sliderTrack.AbsoluteSize.X, 0, 1)
    espDistance           = math.floor(10 + ratio * 490)
    distLabel.Text        = "ESP Distance:  " .. espDistance .. " m"
    sliderFill.Size       = UDim2.new(ratio, 0, 1, 0)
    sliderHandle.Position = UDim2.new(ratio, -6, 0.5, -6)
end)

makeDivider(80)

local espHeader = Instance.new("TextLabel")
espHeader.Size                   = UDim2.new(1, -16, 0, 16)
espHeader.Position               = UDim2.new(0, 8, 0, 86)
espHeader.BackgroundTransparency = 1
espHeader.Text                   = "ESP"
espHeader.TextColor3             = ORANGE
espHeader.Font                   = Enum.Font.GothamBold
espHeader.TextSize               = 11
espHeader.TextXAlignment         = Enum.TextXAlignment.Left
espHeader.Parent                 = main

local ITEMS  = {"Zombie","Heals","Food","Gas","Armor","Weapon","Scrap"}
local BASE_Y = 106
local ROW_H  = 26

local toggleBtns = {}
local dots       = {}

local function rebuildLayout()
    local y = BASE_Y
    for _, item in ipairs(ITEMS) do
        toggleBtns[item].Position = UDim2.new(0, 8, 0, y)
        dots[item].Position       = UDim2.new(1, -22, 0, y + 7)
        y = y + ROW_H
    end
    local totalH     = y + 10
    main.Size        = UDim2.new(1, -4, 0, totalH)
    outerFrame.Size  = UDim2.new(0, 220, 0, totalH + 4)
end

for _, item in ipairs(ITEMS) do
    local col = ESP_COLORS[item]

    local btn = Instance.new("TextButton")
    btn.Size             = UDim2.new(1, -16, 0, 22)
    btn.BackgroundColor3 = DARK_GREY
    btn.BorderSizePixel  = 0
    btn.Text             = item
    btn.TextColor3       = Color3.fromRGB(210, 210, 210)
    btn.Font             = Enum.Font.Gotham
    btn.TextSize         = 12
    btn.TextXAlignment   = Enum.TextXAlignment.Left
    btn.AutoButtonColor  = false
    btn.Parent           = main
    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
    local pad = Instance.new("UIPadding", btn)
    pad.PaddingLeft = UDim.new(0, 10)
    toggleBtns[item] = btn

    local accent = Instance.new("Frame")
    accent.Name             = "Accent"
    accent.Size             = UDim2.new(0, 3, 1, -6)
    accent.Position         = UDim2.new(0, 0, 0, 3)
    accent.BackgroundColor3 = col
    accent.BorderSizePixel  = 0
    accent.Visible          = false
    accent.Parent           = btn
    Instance.new("UICorner", accent).CornerRadius = UDim.new(1, 0)

    local dot = Instance.new("Frame")
    dot.Size             = UDim2.new(0, 8, 0, 8)
    dot.BackgroundColor3 = Color3.fromRGB(55, 55, 55)
    dot.BorderSizePixel  = 0
    dot.Parent           = main
    Instance.new("UICorner", dot).CornerRadius = UDim.new(1, 0)
    dots[item] = dot

    btn.MouseButton1Click:Connect(function()
        espEnabled[item] = not espEnabled[item]
        local on = espEnabled[item]
        dot.BackgroundColor3 = on and col or Color3.fromRGB(55, 55, 55)
        accent.Visible       = on
        btn.TextColor3       = on and col or Color3.fromRGB(210, 210, 210)
        if not on then
            for _, obj in ipairs(cachedObjects[item]) do hideESP(obj) end
        end
        rebuildLayout()
    end)

    btn.MouseEnter:Connect(function() btn.BackgroundColor3 = Color3.fromRGB(30, 30, 30) end)
    btn.MouseLeave:Connect(function() btn.BackgroundColor3 = DARK_GREY end)
end

rebuildLayout()

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed then return end
    if input.KeyCode == Enum.KeyCode.P then
        outerFrame.Visible = not outerFrame.Visible
    end
end)

Features & Information

I have never ever seen a survive the apocalypse ESP script that worked. So here is one.

Community Comments (0)

No comments yet for this script.

More Scripts for 🧟 Survive the Apocalypse