Universal Skeleton ESP OPEN SOURCE
Key RequiredUniversal Patched

Universal Skeleton ESP OPEN SOURCE

Universal ScriptChangedDevChangedDev 1.5K views 57 executesUpdated Oct 25, 2025
2.5/ 5(2 votes)
1150% Positive
Lua Script•181 lines (6613 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Camera = workspace.CurrentCamera

local ESP = {}
local LocalPlayer = Players.LocalPlayer

local Config = {
    SkeletonColor = Color3.fromRGB(255, 255, 255),
    Thickness = 2.5,
    Transparency = 1,
    DistanceFade = true,
    MaxDistance = 500
}

local function IsAlive(player)
    if not player or not player.Character then return false end
    local humanoid = player.Character:FindFirstChildOfClass("Humanoid")
    return humanoid and humanoid.Health > 0
end

function ESP.CreateESP(player)
    if player == LocalPlayer then return end
    if not player or not player.Character then return end

    pcall(function()
        local character = player.Character
        local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
        if not humanoidRootPart then return end

        if ESP[player] then
            ESP.RemoveESP(player)
        end

        ESP[player] = {lines = {}}

        local head = character:FindFirstChild("Head")
        local torso = character:FindFirstChild("Torso") or character:FindFirstChild("UpperTorso")
        local lowerTorso = character:FindFirstChild("LowerTorso")
        local leftArm = character:FindFirstChild("Left Arm") or character:FindFirstChild("LeftUpperArm")
        local rightArm = character:FindFirstChild("Right Arm") or character:FindFirstChild("RightUpperArm")
        local leftLeg = character:FindFirstChild("Left Leg") or character:FindFirstChild("LeftUpperLeg")
        local rightLeg = character:FindFirstChild("Right Leg") or character:FindFirstChild("RightUpperLeg")
        local leftHand = character:FindFirstChild("LeftHand") or character:FindFirstChild("LeftLowerArm")
        local rightHand = character:FindFirstChild("RightHand") or character:FindFirstChild("RightLowerArm")
        local leftFoot = character:FindFirstChild("LeftFoot") or character:FindFirstChild("LeftLowerLeg")
        local rightFoot = character:FindFirstChild("RightFoot") or character:FindFirstChild("RightLowerLeg")

        local connections = {}
        
        if head and torso then table.insert(connections, {head, torso}) end
        if torso and lowerTorso then table.insert(connections, {torso, lowerTorso}) end
        if torso and leftArm then table.insert(connections, {torso, leftArm}) end
        if torso and rightArm then table.insert(connections, {torso, rightArm}) end
        if leftArm and leftHand then table.insert(connections, {leftArm, leftHand}) end
        if rightArm and rightHand then table.insert(connections, {rightArm, rightHand}) end
        if (lowerTorso or torso) and leftLeg then 
            table.insert(connections, {lowerTorso or torso, leftLeg}) 
        end
        if (lowerTorso or torso) and rightLeg then 
            table.insert(connections, {lowerTorso or torso, rightLeg}) 
        end
        if leftLeg and leftFoot then table.insert(connections, {leftLeg, leftFoot}) end
        if rightLeg and rightFoot then table.insert(connections, {rightLeg, rightFoot}) end

        for _, connection in ipairs(connections) do
            local part1 = connection[1]
            local part2 = connection[2]

            if part1 and part2 then
                pcall(function()
                    local line = Drawing.new("Line")
                    line.Color = Config.SkeletonColor
                    line.Thickness = Config.Thickness
                    line.Transparency = Config.Transparency
                    line.Visible = false
                    table.insert(ESP[player].lines, {line = line, part1 = part1, part2 = part2})
                end)
            end
        end
    end)
end

function ESP.UpdateESP(player)
    if not ESP[player] then return end
    if not IsAlive(player) then return end

    pcall(function()
        local character = player.Character
        local humanoidRootPart = character:FindFirstChild("HumanoidRootPart")
        local localCharacter = LocalPlayer.Character
        local localRoot = localCharacter and localCharacter:FindFirstChild("HumanoidRootPart")

        if not humanoidRootPart or not localRoot then return end

        local distance = (humanoidRootPart.Position - localRoot.Position).Magnitude

        local transparency = Config.Transparency
        if Config.DistanceFade and distance > 0 then
            transparency = math.clamp(1 - (distance / Config.MaxDistance), 0.3, 1)
        end

        for _, data in ipairs(ESP[player].lines) do
            local part1 = data.part1
            local part2 = data.part2
            local line = data.line

            if part1 and part2 and part1.Parent and part2.Parent then
                local pos1, onScreen1 = Camera:WorldToViewportPoint(part1.Position)
                local pos2, onScreen2 = Camera:WorldToViewportPoint(part2.Position)

                if onScreen1 and onScreen2 and pos1.Z > 0 and pos2.Z > 0 then
                    line.From = Vector2.new(pos1.X, pos1.Y)
                    line.To = Vector2.new(pos2.X, pos2.Y)
                    line.Transparency = transparency
                    line.Visible = true
                else
                    line.Visible = false
                end
            else
                line.Visible = false
            end
        end
    end)
end

function ESP.RemoveESP(player)
    if ESP[player] then
        pcall(function()
            for _, data in ipairs(ESP[player].lines) do
                if data.line then
                    data.line:Remove()
                end
            end
        end)
        ESP[player] = nil
    end
end

local function SetupPlayer(player)
    if player == LocalPlayer then return end
    
    local charAddedConn
    local charRemovingConn
    
    charAddedConn = player.CharacterAdded:Connect(function(character)
        task.wait(0.5)
        ESP.CreateESP(player)
    end)
    
    charRemovingConn = player.CharacterRemoving:Connect(function(character)
        ESP.RemoveESP(player)
    end)
    
    if player.Character then
        task.spawn(function()
            task.wait(0.5)
            ESP.CreateESP(player)
        end)
    end
end

Players.PlayerAdded:Connect(SetupPlayer)

Players.PlayerRemoving:Connect(function(player)
    ESP.RemoveESP(player)
end)

for _, player in ipairs(Players:GetPlayers()) do
    SetupPlayer(player)
end

RunService.RenderStepped:Connect(function()
    for _, player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer then
            ESP.UpdateESP(player)
        end
    end
end)

print("Made by ._changed_ on discord | guns.lol/xup")

Features & Information

- ESP
#Skeleton ESP#ESP#Skeleton

Community Comments (4)

RicoszRicoszOct 26, 2025

AI is a nice thing huh?

Replying to @Ricosz
ChangedDevChangedDevOct 26, 2025

@vowzys where do you think it's AI??

Replying to @ChangedDev
RicoszRicoszOct 26, 2025

@ChangedDev it has the exact same issues as an AI coded ESP, also the same format, lets use our brains chap.. if ur gonna use AI, then use LM studio to do it, then you'll have better results.

Matukex_StudioMatukex_StudioDec 12, 2025

Why this is patched. still works

More Scripts for Universal Scripts