Simple ESP Open source
Key Required

Simple ESP Open source

Silent Assassinseddy36eddy36 1.6K views 4.9K executesUpdated May 2, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•137 lines (5258 chars)
-- ==================================================
-- Silent Assassins ESP Source code

-- made by yours truly eddy36.

-- remember to join my discord server cz why not c:
-- ==================================================
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local LocalPlayer = Players.LocalPlayer

local ESP_ENABLED = true
local TOGGLE_KEY = Enum.KeyCode.H
local ESP_COLOR = Color3.fromRGB(0, 255, 255)

local bodyConnections = {
    R15 = {
        {"Head", "UpperTorso"}, {"UpperTorso", "LowerTorso"},
        {"UpperTorso", "LeftUpperArm"}, {"LeftUpperArm", "LeftLowerArm"},
        {"UpperTorso", "RightUpperArm"}, {"RightUpperArm", "RightLowerArm"},
        {"LowerTorso", "LeftUpperLeg"}, {"LeftUpperLeg", "LeftLowerLeg"},
        {"LowerTorso", "RightUpperLeg"}, {"RightUpperLeg", "RightLowerLeg"}
    },
    R6 = {
        {"Head", "Torso"}, {"Torso", "Left Arm"}, {"Torso", "Right Arm"},
        {"Torso", "Left Leg"}, {"Torso", "Right Leg"}
    }
}

local ESP_Cache = {}

local function createDrawing(type, props)
    local d = Drawing.new(type)
    for k, v in pairs(props) do d[k] = v end
    return d
end

local function removeESP(player)
    local data = ESP_Cache[player]
    if data then
        data.Name:Remove()
        data.Box:Remove()
        for _, line in pairs(data.Skeleton) do line:Remove() end
        ESP_Cache[player] = nil
    end
end

local function setupESP(player)
    if player == LocalPlayer then return end
    
    local function onCharacter(char)
        removeESP(player)
        
        local data = {
            Name = createDrawing("Text", {Size = 16, Center = true, Outline = true, Color = Color3.new(1,1,1), Visible = false}),
            Box = createDrawing("Square", {Thickness = 1, Color = ESP_COLOR, Filled = false, Visible = false}),
            Skeleton = {}
        }
        
        local humanoid = char:WaitForChild("Humanoid", 15)
        if not humanoid then return end
        
        local rig = (humanoid.RigType == Enum.HumanoidRigType.R15) and "R15" or "R6"
        for _, conn in ipairs(bodyConnections[rig]) do
            data.Skeleton[conn[1]..conn[2]] = createDrawing("Line", {Thickness = 1, Color = ESP_COLOR, Visible = false})
        end
        
        ESP_Cache[player] = data
    end
    
    player.CharacterAdded:Connect(onCharacter)
    if player.Character then task.spawn(onCharacter, player.Character) end
end

RunService.RenderStepped:Connect(function()
    local Camera = workspace.CurrentCamera
    for player, data in pairs(ESP_Cache) do
        local char = player.Character
        local hrp = char and char:FindFirstChild("HumanoidRootPart")
        local hum = char and char:FindFirstChild("Humanoid")
        
        if ESP_ENABLED and char and hrp and hum and hum.Health > 0 then
            local hrpPos, onScreen = Camera:WorldToViewportPoint(hrp.Position)
            
            if onScreen then
                local factor = 1 / (hrpPos.Z * math.tan(math.rad(Camera.FieldOfView * 0.5)) * 2) * 100
                local width, height = 40 * factor, 60 * factor
                
                data.Box.Size = Vector2.new(width, height)
                data.Box.Position = Vector2.new(hrpPos.X - width/2, hrpPos.Y - height/2)
                data.Box.Visible = true
                
                data.Name.Text = player.Name
                data.Name.Position = Vector2.new(hrpPos.X, hrpPos.Y - height/2 - 15)
                data.Name.Visible = true
                
                local rig = (hum.RigType == Enum.HumanoidRigType.R15) and "R15" or "R6"
                for _, conn in ipairs(bodyConnections[rig]) do
                    local p1, p2 = char:FindFirstChild(conn[1]), char:FindFirstChild(conn[2])
                    local line = data.Skeleton[conn[1]..conn[2]]
                    if p1 and p2 and line then
                        local pos1, vis1 = Camera:WorldToViewportPoint(p1.Position)
                        local pos2, vis2 = Camera:WorldToViewportPoint(p2.Position)
                        if vis1 and vis2 then
                            line.From = Vector2.new(pos1.X, pos1.Y)
                            line.To = Vector2.new(pos2.X, pos2.Y)
                            line.Visible = true
                        else
                            line.Visible = false
                        end
                    end
                end
            else
                data.Name.Visible = false
                data.Box.Visible = false
                for _, l in pairs(data.Skeleton) do l.Visible = false end
            end
        else
            data.Name.Visible = false
            data.Box.Visible = false
            for _, l in pairs(data.Skeleton) do l.Visible = false end
        end
    end
end)

for _, p in ipairs(Players:GetPlayers()) do setupESP(p) end
Players.PlayerAdded:Connect(setupESP)
Players.PlayerRemoving:Connect(removeESP)

UserInputService.InputBegan:Connect(function(input, processed)
    if not processed and input.KeyCode == TOGGLE_KEY then
        ESP_ENABLED = not ESP_ENABLED
    end
end)

print("[eddy36] Enjoy the script gng -  https://discord.gg/tesGDjJq5t")

Features & Information

ESP NAMETAGS

Community Comments (1)

FX_CezarFX_CezarMay 20, 2026

Works very well, recommended.

More Scripts for Silent Assassins