ESP With Health Bar
Key RequiredUniversal

ESP With Health Bar

Universal ScriptRazeDevRazeDev 790 views 2K executesUpdated Sep 27, 2026
Unrated
00
Lua Script•151 lines (5590 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")

local Camera = Workspace.CurrentCamera
local LocalPlayer = Players.LocalPlayer

-- Configuration
local ESPEnabled = true
local ESPColor = Color3.new(1, 0, 0) -- Red for boxes
local ESPThickness = 1

local activeDrawings = {}

-- Helper function to create a player's visual elements (Box + Health Bar)
local function createVisuals()
    local visuals = {}
    
    -- Main ESP Box
    visuals.Box = Drawing.new("Square")
    visuals.Box.Visible = false
    visuals.Box.Color = ESPColor
    visuals.Box.Thickness = ESPThickness
    visuals.Box.Filled = false
    
    -- Health Bar Background (Outline)
    visuals.HealthBarBg = Drawing.new("Line")
    visuals.HealthBarBg.Visible = false
    visuals.HealthBarBg.Color = Color3.new(0, 0, 0)
    visuals.HealthBarBg.Thickness = 3
    
    -- Health Bar Fill (Dynamic)
    visuals.HealthBar = Drawing.new("Line")
    visuals.HealthBar.Visible = false
    visuals.HealthBar.Color = Color3.new(0, 1, 0) -- Green
    visuals.HealthBar.Thickness = 1
    
    return visuals
end

-- Helper function to clean up a player's drawings
local function removeVisuals(player)
    if activeDrawings[player] then
        activeDrawings[player].Box:Remove()
        activeDrawings[player].HealthBarBg:Remove()
        activeDrawings[player].HealthBar:Remove()
        activeDrawings[player] = nil
    end
end

-- Initialize tracking for existing players
for _, player in ipairs(Players:GetPlayers()) do
    if player ~= LocalPlayer then
        activeDrawings[player] = createVisuals()
    end
end

-- Handle new players joining
Players.PlayerAdded:Connect(function(player)
    if player ~= LocalPlayer then
        activeDrawings[player] = createVisuals()
    end
end)

-- Handle players leaving (cleanup memory)
Players.PlayerRemoving:Connect(function(player)
    removeVisuals(player)
end)

-- Centralized render loop (runs every frame)
RunService.RenderStepped:Connect(function()
    if not ESPEnabled then
        for _, visuals in pairs(activeDrawings) do
            visuals.Box.Visible = false
            visuals.HealthBarBg.Visible = false
            visuals.HealthBar.Visible = false
        end
        return
    end

    for player, visuals in pairs(activeDrawings) do
        local character = player.Character
        local rootPart = character and character:FindFirstChild("HumanoidRootPart")
        local humanoid = character and character:FindFirstChildOfClass("Humanoid")
        
        -- Verify character validity and life state
        if character and rootPart and humanoid and humanoid.Health > 0 then
            -- Project 3D world position to 2D screen space (Z represents distance/depth)
            local vector, onScreen = Camera:WorldToViewportPoint(rootPart.Position)
            
            if onScreen then
                -- Distance-based sizing: Scale inversely with depth (vector.Z)
                local distance = vector.Z
                local boxHeight = math.clamp(2500 / distance, 15, 800)
                local boxWidth = boxHeight * 0.6
                
                local boxX = vector.X - (boxWidth / 2)
                local boxY = vector.Y - (boxHeight / 2)
                
                -- Update main box
                visuals.Box.Size = Vector2.new(boxWidth, boxHeight)
                visuals.Box.Position = Vector2.new(boxX, boxY)
                visuals.Box.Visible = true
                
                -- Health Bar Calculations
                local healthPercent = math.clamp(humanoid.Health / humanoid.MaxHealth, 0, 1)
                local currentHealthHeight = boxHeight * healthPercent
                
                -- Position health bar just to the left of the box
                local barX = boxX - 6
                local barTopY = boxY
                local barBottomY = boxY + boxHeight
                
                -- Update Health Bar Background (full height)
                visuals.HealthBarBg.From = Vector2.new(barX, barBottomY)
                visuals.HealthBarBg.To = Vector2.new(barX, barTopY)
                visuals.HealthBarBg.Visible = true
                
                -- Update Health Bar Fill (scaled by health percentage, starting from bottom)
                visuals.HealthBar.From = Vector2.new(barX, barBottomY)
                visuals.HealthBar.To = Vector2.new(barX, barBottomY - currentHealthHeight)
                -- Optional: Shift color from green to red as health drops
                visuals.HealthBar.Color = Color3.new(1 - healthPercent, healthPercent, 0)
                visuals.HealthBar.Visible = true
            else
                visuals.Box.Visible = false
                visuals.HealthBarBg.Visible = false
                visuals.HealthBar.Visible = false
            end
        else
            visuals.Box.Visible = false
            visuals.HealthBarBg.Visible = false
            visuals.HealthBar.Visible = false
        end
    end
end)

-- Toggle ESP with the F9 key
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if not gameProcessed and input.KeyCode == Enum.KeyCode.F9 then
        ESPEnabled = not ESPEnabled
        if not ESPEnabled then
            for _, visuals in pairs(activeDrawings) do
                visuals.Box.Visible = false
                visuals.HealthBarBg.Visible = false
                visuals.HealthBar.Visible = false
            end
        end
    end
end)

Features & Information

Most Of My Scripts Are Open Source! Feel Free To Learn Off It Or Take It MAKE SURE TO FOLLOW!!!

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts