Universal Corner ESP Script
Key RequiredUniversal

Universal Corner ESP Script

Universal Scriptbird7bird7 705 views 1.2K executesUpdated Mar 23, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•275 lines (10880 chars)
-- Settings
local Settings = {
    Box_Thickness = 2,
    Autothickness = true
}

local Space     = game:GetService("Workspace")
local Player    = game:GetService("Players").LocalPlayer
local Camera    = Space.CurrentCamera
local PlayerGui = Player:WaitForChild("PlayerGui")

local espActive      = true
local allConnections = {}
local allParts       = {}
local allDrawings    = {}

local function healthColor(ratio)
    ratio = math.clamp(ratio, 0, 1)
    if ratio >= 0.5 then
        local t = (1 - ratio) * 2
        return Color3.new(t, 1, 0)
    else
        local t = ratio * 2
        return Color3.new(1, t, 0)
    end
end

local function NewLine(color, thickness)
    local line = Drawing.new("Line")
    line.Visible      = false
    line.From         = Vector2.new(0,0)
    line.To           = Vector2.new(0,0)
    line.Color        = color
    line.Thickness    = thickness
    line.Transparency = 1
    return line
end

local function NewText(size)
    local t = Drawing.new("Text")
    t.Visible      = false
    t.Center       = true
    t.Outline      = true
    t.Size         = size or 13
    t.Font         = Drawing.Fonts.UI
    t.Transparency = 1
    t.Color        = Color3.new(1,1,1)
    return t
end

local function Vis(lib, state)
    for _, v in pairs(lib) do v.Visible = state end
end

local function Colorize(lib, color)
    for _, v in pairs(lib) do v.Color = color end
end

local function Main(plr)
    repeat wait() until plr.Character ~= nil
        and plr.Character:FindFirstChild("Humanoid") ~= nil

    local Library = {
        TL1 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        TL2 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        TR1 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        TR2 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        BL1 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        BL2 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        BR1 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
        BR2 = NewLine(Color3.new(1,1,1), Settings.Box_Thickness),
    }

    local nameText = NewText(13)  -- display name above box
    local hpText   = NewText(13)
    local distText = NewText(12)

    for _, v in pairs(Library) do table.insert(allDrawings, v) end
    table.insert(allDrawings, nameText)
    table.insert(allDrawings, hpText)
    table.insert(allDrawings, distText)

    local oripart = Instance.new("Part")
    oripart.Parent       = Space
    oripart.Transparency = 1
    oripart.CanCollide   = false
    oripart.Anchored     = true
    oripart.Size         = Vector3.new(1,1,1)
    table.insert(allParts, oripart)

    local function Updater()
        local c
        c = game:GetService("RunService").RenderStepped:Connect(function()
            local char = plr.Character
            local hum  = char and char:FindFirstChild("Humanoid")
            local hrp  = char and char:FindFirstChild("HumanoidRootPart")

            if not espActive then
                Vis(Library, false)
                nameText.Visible = false
                hpText.Visible   = false
                distText.Visible = false
                return
            end

            if char and hum and hrp and hum.Health > 0 then
                local _, vis = Camera:WorldToViewportPoint(hrp.Position)

                if vis then
                    local teamCol = plr.Team and plr.TeamColor.Color or Color3.new(1,1,1)
                    Colorize(Library, teamCol)

                    oripart.Size   = Vector3.new(hrp.Size.X, hrp.Size.Y * 1.5, hrp.Size.Z)
                    oripart.CFrame = CFrame.new(hrp.CFrame.Position, Camera.CFrame.Position)

                    local SizeX = oripart.Size.X
                    local SizeY = oripart.Size.Y

                    local TL = Camera:WorldToViewportPoint((oripart.CFrame * CFrame.new( SizeX,  SizeY, 0)).p)
                    local TR = Camera:WorldToViewportPoint((oripart.CFrame * CFrame.new(-SizeX,  SizeY, 0)).p)
                    local BL = Camera:WorldToViewportPoint((oripart.CFrame * CFrame.new( SizeX, -SizeY, 0)).p)
                    local BR = Camera:WorldToViewportPoint((oripart.CFrame * CFrame.new(-SizeX, -SizeY, 0)).p)

                    local ratio  = (Camera.CFrame.p - hrp.Position).Magnitude
                    local offset = math.clamp(1/ratio * 750, 2, 300)

                    Library.TL1.From = Vector2.new(TL.X,TL.Y) ; Library.TL1.To = Vector2.new(TL.X+offset,TL.Y)
                    Library.TL2.From = Vector2.new(TL.X,TL.Y) ; Library.TL2.To = Vector2.new(TL.X,TL.Y+offset)
                    Library.TR1.From = Vector2.new(TR.X,TR.Y) ; Library.TR1.To = Vector2.new(TR.X-offset,TR.Y)
                    Library.TR2.From = Vector2.new(TR.X,TR.Y) ; Library.TR2.To = Vector2.new(TR.X,TR.Y+offset)
                    Library.BL1.From = Vector2.new(BL.X,BL.Y) ; Library.BL1.To = Vector2.new(BL.X+offset,BL.Y)
                    Library.BL2.From = Vector2.new(BL.X,BL.Y) ; Library.BL2.To = Vector2.new(BL.X,BL.Y-offset)
                    Library.BR1.From = Vector2.new(BR.X,BR.Y) ; Library.BR1.To = Vector2.new(BR.X-offset,BR.Y)
                    Library.BR2.From = Vector2.new(BR.X,BR.Y) ; Library.BR2.To = Vector2.new(BR.X,BR.Y-offset)

                    Vis(Library, true)

                    if Settings.Autothickness then
                        local lhrp = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart")
                        local dist = lhrp and (lhrp.Position - hrp.Position).Magnitude or 100
                        local val  = math.clamp(1/dist * 100, 1, 4)
                        for _, x in pairs(Library) do x.Thickness = val end
                    else
                        for _, x in pairs(Library) do x.Thickness = Settings.Box_Thickness end
                    end

                    local topY = math.min(TL.Y, TR.Y)
                    local botY = math.max(BL.Y, BR.Y)
                    local midX = (TL.X + TR.X) / 2

                    -- Display name above box
                    nameText.Text     = plr.DisplayName
                    nameText.Color    = teamCol
                    nameText.Position = Vector2.new(midX, topY - 16)
                    nameText.Visible  = true

                    -- Health
                    local hpRatio = math.clamp(hum.Health / hum.MaxHealth, 0, 1)
                    hpText.Text     = math.floor(hum.Health) .. "/" .. math.floor(hum.MaxHealth)
                    hpText.Color    = healthColor(hpRatio)
                    hpText.Position = Vector2.new(midX, botY + 4)
                    hpText.Visible  = true

                    -- Distance (number only)
                    local lhrp2 = Player.Character and Player.Character:FindFirstChild("HumanoidRootPart")
                    local studs = lhrp2 and math.floor((hrp.Position - lhrp2.Position).Magnitude) or 0
                    distText.Text     = tostring(studs)
                    distText.Color    = teamCol
                    distText.Position = Vector2.new(midX, botY + 18)
                    distText.Visible  = true

                else
                    Vis(Library, false)
                    nameText.Visible = false
                    hpText.Visible   = false
                    distText.Visible = false
                end
            else
                Vis(Library, false)
                nameText.Visible = false
                hpText.Visible   = false
                distText.Visible = false

                if game:GetService("Players"):FindFirstChild(plr.Name) == nil then
                    for _, v in pairs(Library) do v:Remove() end
                    nameText:Remove() ; hpText:Remove() ; distText:Remove()
                    oripart:Destroy()
                    c:Disconnect()
                end
            end
        end)
        table.insert(allConnections, c)
    end

    coroutine.wrap(Updater)()
end

-- ================================================
--  GUI
-- ================================================
local gui = Instance.new("ScreenGui", PlayerGui)
gui.Name           = "ESP_GUI"
gui.ResetOnSpawn   = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

local panel = Instance.new("Frame", gui)
panel.Size             = UDim2.new(0, 150, 0, 90)
panel.Position         = UDim2.new(0, 18, 0.5, -45)
panel.BackgroundColor3 = Color3.fromRGB(10, 10, 16)
panel.BorderSizePixel  = 0
panel.Active           = true
panel.Draggable        = true
Instance.new("UICorner", panel).CornerRadius = UDim.new(0, 8)
local stroke = Instance.new("UIStroke", panel)
stroke.Color = Color3.fromRGB(60, 60, 100) ; stroke.Thickness = 1

local titleBar = Instance.new("Frame", panel)
titleBar.Size             = UDim2.new(1, 0, 0, 26)
titleBar.BackgroundColor3 = Color3.fromRGB(22, 22, 40)
titleBar.BorderSizePixel  = 0
Instance.new("UICorner", titleBar).CornerRadius = UDim.new(0, 8)

local titleLbl = Instance.new("TextLabel", titleBar)
titleLbl.Size                   = UDim2.new(1, -10, 1, 0)
titleLbl.Position               = UDim2.new(0, 10, 0, 0)
titleLbl.BackgroundTransparency = 1
titleLbl.Text                   = "ESP"
titleLbl.TextColor3             = Color3.fromRGB(180, 180, 255)
titleLbl.TextSize               = 13
titleLbl.Font                   = Enum.Font.GothamBold
titleLbl.TextXAlignment         = Enum.TextXAlignment.Left

local function makeBtn(yPos, text, r, g, b)
    local btn = Instance.new("TextButton", panel)
    btn.Size             = UDim2.new(1, -16, 0, 26)
    btn.Position         = UDim2.new(0, 8, 0, yPos)
    btn.BackgroundColor3 = Color3.fromRGB(r, g, b)
    btn.BorderSizePixel  = 0
    btn.Text             = text
    btn.TextColor3       = Color3.new(1,1,1)
    btn.TextSize         = 12
    btn.Font             = Enum.Font.GothamBold
    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 5)
    return btn
end

local toggleBtn = makeBtn(31, "ESP: ON",   35, 165, 85)
local closeBtn  = makeBtn(61, "Close ESP", 160, 35,  35)

toggleBtn.MouseButton1Click:Connect(function()
    espActive = not espActive
    if espActive then
        toggleBtn.Text             = "ESP: ON"
        toggleBtn.BackgroundColor3 = Color3.fromRGB(35, 165, 85)
    else
        toggleBtn.Text             = "ESP: OFF"
        toggleBtn.BackgroundColor3 = Color3.fromRGB(75, 75, 75)
    end
end)

closeBtn.MouseButton1Click:Connect(function()
    for _, c in ipairs(allConnections) do c:Disconnect() end
    for _, d in ipairs(allDrawings)    do pcall(function() d:Remove() end) end
    for _, p in ipairs(allParts)       do pcall(function() p:Destroy() end) end
    gui:Destroy()
end)

-- Start
for _, v in pairs(game:GetService("Players"):GetPlayers()) do
    if v.Name ~= Player.Name then coroutine.wrap(Main)(v) end
end

game:GetService("Players").PlayerAdded:Connect(function(newplr)
    coroutine.wrap(Main)(newplr)
end)

Features & Information

FEAUTURES Health indicator Stud distance Display name Team colours Lightweight Turn on/off Close script Tested with Xeno. Made with Claude AI, can be altered to your liking.
#ESP#Universal#Roblox#Script#Cheat

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts