--// Simple ESP 2025-2026 version --// Put in LocalScript (StarterPlayerScripts / Backpack / etc) local Players = game:GetService("Players") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera local ESP_SETTINGS = { Enabled = true, -- Visuals Box_Thickness = 1.5, Box_Color = Color3.fromRGB(255, 80, 80), Tracer_Thickness = 1, Tracer_Color = Color3.fromRGB(255, 80, 80), Tracer_Origin = "Bottom", -- "Top", "Bottom", "Mouse", "Center" -- Text ShowName = true, ShowHealth = true, ShowDistance = true, Text_Size = 13, Text_Color = Color3.fromRGB(255, 255, 255), Text_Outline = true, -- Team check TeamCheck = true, -- set false to see teammates too MaxDistance = 2500, } -- ──────────────────────────────────────────────── local function createBox() local box = Drawing.new("Square") box.Thickness = ESP_SETTINGS.Box_Thickness box.Color = ESP_SETTINGS.Box_Color box.Filled = false box.Transparency = 1 box.Visible = false return box end local function createTracer() local tracer = Drawing.new("Line") tracer.Thickness = ESP_SETTINGS.Tracer_Thickness tracer.Color = ESP_SETTINGS.Tracer_Color tracer.Transparency = 1 tracer.Visible = false return tracer end local function createText() local text = Drawing.new("Text") text.Size = ESP_SETTINGS.Text_Size text.Color = ESP_SETTINGS.Text_Color text.Outline = ESP_SETTINGS.Text_Outline text.Center = true text.Visible = false return text end local espCache = {} local function removeESP(plr) if espCache[plr] then for _, obj in pairs(espCache[plr]) do obj:Remove() end espCache[plr] = nil end end local function addESP(plr) if plr == LocalPlayer then return end if espCache[plr] then return end local box = createBox() local tracer = createTracer() local name = createText() local info = createText() espCache[plr] = {box = box, tracer = tracer, name = name, info = info} local con con = plr.CharacterRemoving:Connect(function() removeESP(plr) con:Disconnect() end) end -- Initial players for _, plr in ipairs(Players:GetPlayers()) do task.spawn(addESP, plr) end Players.PlayerAdded:Connect(addESP) Players.PlayerRemoving:Connect(removeESP) RunService.RenderStepped:Connect(function() if not ESP_SETTINGS.Enabled then for _, data in pairs(espCache) do for k,v in pairs(data) do v.Visible = false end end return end for plr, drawings in pairs(espCache) do local char = plr.Character if not char then for k,v in pairs(drawings) do v.Visible = false end continue end local hrp = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChildOfClass("Humanoid") if not hrp or not hum or hum.Health <= 0 then for k,v in pairs(drawings) do v.Visible = false end continue end if ESP_SETTINGS.TeamCheck and plr.Team == LocalPlayer.Team then for k,v in pairs(drawings) do v.Visible = false end continue end local rootPos, onScreen = Camera:WorldToViewportPoint(hrp.Position) local headPos = Camera:WorldToViewportPoint(hrp.Position + Vector3.new(0, 3, 0)) local legPos = Camera:WorldToViewportPoint(hrp.Position - Vector3.new(0, 3.5, 0)) if not onScreen then for k,v in pairs(drawings) do v.Visible = false end continue end local distance = (LocalPlayer.Character.HumanoidRootPart.Position - hrp.Position).Magnitude if distance > ESP_SETTINGS.MaxDistance then for k,v in pairs(drawings) do v.Visible = false end continue end -- Box local boxHeight = math.abs(headPos.Y - legPos.Y) local boxWidth = boxHeight * 0.55 drawings.box.Size = Vector2.new(boxWidth, boxHeight) drawings.box.Position = Vector2.new(rootPos.X - boxWidth/2, rootPos.Y - boxHeight/2) drawings.box.Visible = true -- Tracer local tracerFrom if ESP_SETTINGS.Tracer_Origin == "Bottom" then tracerFrom = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y) elseif ESP_SETTINGS.Tracer_Origin == "Top" then tracerFrom = Vector2.new(Camera.ViewportSize.X /