-- ESP Module local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Camera = workspace.CurrentCamera -- Cache services local LocalPlayer = Players.LocalPlayer local LocalCharacter = LocalPlayer and LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() local LocalHumanoidRootPart = LocalCharacter:WaitForChild("HumanoidRootPart") local ESP = {} ESP.__index = ESP function ESP.new() local self = setmetatable({}, ESP) self.espCache = {} return self end function ESP:createDrawing(type, properties) local drawing = Drawing.new(type) for prop, val in pairs(properties) do drawing[prop] = val end return drawing end function ESP:createComponents() return { Box = self:createDrawing("Square", { Thickness = 1, Transparency = 1, Color = Color3.fromRGB(255, 255, 255), Filled = false }), Tracer = self:createDrawing("Line", { Thickness = 1, Transparency = 1, Color = Color3.fromRGB(255, 255, 255) }), DistanceLabel = self:createDrawing("Text", { Size = 18, Center = true, Outline = true, Color = Color3.fromRGB(255, 255, 255), OutlineColor = Color3.fromRGB(0, 0, 0) }), NameLabel = self:createDrawing("Text", { Size = 18, Center = true, Outline = true, Color = Color3.fromRGB(255, 255, 255), OutlineColor = Color3.fromRGB(0, 0, 0) }), HealthBar = { Outline = self:createDrawing("Square", { Thickness = 1, Transparency = 1, Color = Color3.fromRGB(0, 0, 0), Filled = false }), Health = self:createDrawing("Square", { Thickness = 1, Transparency = 1, Color = Color3.fromRGB(0, 255, 0), Filled = true }) }, ItemLabel = self:createDrawing("Text", { Size = 18, Center = true, Outline = true, Color = Color3.fromRGB(255, 255, 255), OutlineColor = Color3.fromRGB(0, 0, 0) }), SkeletonLines = {}, ChamsParts = {} } end local bodyConnections = { R15 = { {"Head", "UpperTorso"}, {"UpperTorso", "LowerTorso"}, {"LowerTorso", "LeftUpperLeg"}, {"LowerTorso", "RightUpperLeg"}, {"LeftUpperLeg", "LeftLowerLeg"}, {"LeftLowerLeg", "LeftFoot"}, {"RightUpperLeg", "RightLowerLeg"}, {"RightLowerLeg", "RightFoot"}, {"UpperTorso", "LeftUpperArm"}, {"UpperTorso", "RightUpperArm"}, {"LeftUpperArm", "LeftLowerArm"}, {"LeftLowerArm", "LeftHand"}, {"RightUpperArm", "RightLowerArm"}, {"RightLowerArm", "RightHand"} }, R6 = { {"Head", "Torso"}, {"Torso", "Left Arm"}, {"Torso", "Right Arm"}, {"Torso", "Left Leg"}, {"Torso", "Right Leg"} } } function ESP:updateComponents(components, character, player) local hrp = character:FindFirstChild("HumanoidRootPart") local humanoid = character:FindFirstChild("Humanoid") if hrp and humanoid then local hrpPosition, onScreen = Camera:WorldToViewportPoint(hrp.Position) local mousePosition = Camera:WorldToViewportPoint(LocalPlayer:GetMouse().Hit.p) if onScreen then local screenWidth, screenHeight = Camera.ViewportSize.X, Camera.ViewportSize.Y local factor = 1 / (hrpPosition.Z * math.tan(math.rad(Camera.FieldOfView * 0.5)) * 2) * 100 local width, height = math.floor(screenHeight / 25 * factor), math.floor(screenWidth / 27 * factor) local distanceFromPlayer = math.floor((LocalHumanoidRootPart.Position - hrp.Position).magnitude) -- Box properties components.Box.Size = Vector2.new(width, height) components.Box.Position = Vector2.new(hrpPosition.X - width / 2, hrpPosition.Y - height / 2) components.Box.Visible = true -- Tracer properties components.Tracer.From = Vector2.new(mousePosition.X, mousePosition.Y) components.Tracer.To = Vector2.new(hrpPosition.X, hrpPosition.Y + height / 2) components.Tracer.Visible = true -- Distance label properties components.DistanceLabel.Text = string.format("[%dM]", distanceFromPlayer) components.DistanceLabel.Position = Vector2.new(hrpPosition.X, hrpPosition.Y + height / 2 + 15) components.DistanceLabel.Visible = true -- Name label properties components.NameLabel.Text = string.format("[%s]", player.Name) components.NameLabel.Position = Vector2.new(hrpPosition.X, hrpPosition.Y - height / 2 - 15) components.NameLabel.Visible = true -- Health bar properties local healthBarHeight = height local healthBarWidth = 5 local healthFraction = humanoid.Health / humanoid.MaxHealth components.HealthBar.Outline.Size = Vector2.new(healthBarWidth, healthBarHeight) components.HealthBar.Outline.Position = Vector2.new(components.Box.Position.X - healthBarWidth - 2, components.Box.Position.Y) components.HealthBar.Outline.Visible = true components.HealthBar.Health.Size = Vector2.new(healthBarWidth - 2, healthBarHeight * healthFraction) components.HealthBar.Health.Position = Vector2.new(components.HealthBar.Outline.Position.X + 1, components.HealthBar.Outline.Position.Y + healthBarHeight * (1 - healthFraction)) components.HealthBar.Health.Visible = true -- Item label properties local backpack = player.Backpack local tool = backpack:FindFirstChildOfClass("Tool") or character:FindFirstChildOfClass("Tool") if tool then components.ItemLabel.Text = string.format("[Holding: %s]", tool.Name) else components.ItemLabel.Text = "[Holding: No tool]" end components.ItemLabel.Position = Vector2.new(hrpPosition.X, hrpPosition.Y + height / 2 + 35) components.ItemLabel.Visible = true -- Skeleton properties local connections = bodyConnections[humanoid.RigType.Name] or {} for _, connection in ipairs(connections) do local partA = character:FindFirstChild(connection[1]) local partB = character:FindFirstChild(connection[2]) if partA and partB then local line = components.SkeletonLines[connection[1] .. "-" .. connection[2]] or self:createDrawing("Line", {Thickness = 1, Color = Color3.fromRGB(255, 255, 255)}) local posA, onScreenA = Camera:WorldToViewportPoint(partA.Position) local posB, onScreenB = Camera:WorldToViewportPoint(partB.Position) if onScreenA and onScreenB then line.From = Vector2.new(posA.X, posA.Y) line.To = Vector2.new(posB.X, posB.Y) line.Visible = true components.SkeletonLines[connection[1] .. "-" .. connection[2]] = line else line.Visible = false end end end -- Chams properties for _, part in ipairs(character:GetChildren()) do if part:IsA("BasePart") then local chamsPart = components.ChamsParts[part] or Instance.new("BoxHandleAdornment") chamsPart.Adornee = part chamsPart.Size = part.Size chamsPart.Color3 = Color3.fromRGB(255, 255, 255) chamsPart.Transparency = 0.5 chamsPart.AlwaysOnTop = true chamsPart.ZIndex = 0 chamsPart.Parent = part components.ChamsParts[part] = chamsPart end end else self:hideComponents(components) end else self:hideComponents(components) end end function ESP:hideComponents(components) components.Box.Visible = false components.Tracer.Visible = false components.DistanceLabel.Visible = false components.NameLabel.Visible = false components.HealthBar.Outline.Visible = false components.HealthBar.Health.Visible = false components.ItemLabel.Visible = false for _, line in pairs(components.SkeletonLines) do line.Visible = false end for _, chamsPart in pairs(components.ChamsParts) do chamsPart:Destroy() end components.ChamsParts = {} end function ESP:removeEsp(player) local components = self.espCache[player] if components then components.Box:Remove() components.Tracer:Remove() components.DistanceLabel:Remove() components.NameLabel:Remove() components.HealthBar.Outline:Remove() components.HealthBar.Health:Remove() components.ItemLabel:Remove() for _, line in pairs(components.SkeletonLines) do line:Remove() end for _, chamsPart in pairs(components.ChamsParts) do chamsPart:Destroy() end self.espCache[player] = nil end end local espInstance = ESP.new() RunService.RenderStepped:Connect(function() for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer and player.Team ~= LocalPlayer.Team then local character = player.Character if character then if not espInstance.espCache[player] then espInstance.espCache[player] = espInstance:createComponents() end espInstance:updateComponents(espInstance.espCache[player], character, player) else if espInstance.espCache[player] then espInstance:hideComponents(espInstance.espCache[player]) end end end end end) Players.PlayerRemoving:Connect(function(player) espInstance:removeEsp(player) end)