local ESP = {
Enabled = false,
Boxes = true,
BoxShift = CFrame.new(0, -1.5, 0),
BoxSize = Vector3.new(4, 6, 0),
Color = Color3.fromRGB(255, 170, 0),
Thickness = 2,
AttachShift = 1,
Objects = setmetatable({}, {__mode="kv"}),
Overrides = {}
}
local cam = workspace.CurrentCamera
local plrs = game:GetService("Players")
local plr = plrs.LocalPlayer
local mouse = plr:GetMouse()
local V3new = Vector3.new
local WorldToViewportPoint = cam.WorldToViewportPoint
local function Draw(obj, props)
local new = Drawing.new(obj)
props = props or {}
for i, v in pairs(props) do
new[i] = v
end
return new
end
function ESP:GetColor(obj)
local ov = self.Overrides.GetColor
if ov then
return ov(obj)
end
local p = self:GetPlrFromChar(obj)
return p and self.Color
end
function ESP:GetPlrFromChar(char)
local ov = self.Overrides.GetPlrFromChar
if ov then
return ov(char)
end
return plrs:GetPlayerFromCharacter(char)
end
function ESP:Toggle(bool)
self.Enabled = bool
if not bool then
for i, v in pairs(self.Objects) do
if v.Type == "Box" then
if v.Temporary then
v:Remove()
else
for i, v in pairs(v.Components) do
v.Visible = false
end
end
end
end
end
end
function ESP:GetBox(obj)
return self.Objects[obj]
end
function ESP:AddObjectListener(parent, options)
if not parent then
warn("Parent is nil. Ensure the folder or object exists before adding a
listener.")
return
end
local function NewListener(c)
if type(options.Type) == "string" and c:IsA(options.Type) or options.Type
== nil then
if type(options.Name) == "string" and c.Name == options.Name or
options.Name == nil then
if not options.Validator or options.Validator(c) then
if c.Parent and workspace:IsAncestorOf(c) then
local box = ESP:Add(c, {
PrimaryPart = type(options.PrimaryPart) == "string" and
c:WaitForChild(options.PrimaryPart) or type(options.PrimaryPart) == "function" and
options.PrimaryPart(c),
Color = type(options.Color) == "function" and
options.Color(c) or options.Color,
ColorDynamic = options.ColorDynamic,
IsEnabled = options.IsEnabled,
RenderInNil = options.RenderInNil
})
if options.OnAdded then
coroutine.wrap(options.OnAdded)(box)
end
else
warn(c.Name .. " has no parent, skipping ESP addition.")
end
end
end
end
end
if options.Recursive then
parent.DescendantAdded:Connect(NewListener)
for i, v in pairs(parent:GetDescendants()) do
NewListener(v)
end
else
parent.ChildAdded:Connect(NewListener)
for i, v in pairs(parent:GetChildren()) do
NewListener(v)
end
end
end
local boxBase = {}
boxBase.__index = boxBase
function boxBase:Remove()
ESP.Objects[self.Object] = nil
for i, v in pairs(self.Components) do
if v then
v.Visible = false
v:Remove()
self.Components[i] = nil
end
end
end
function boxBase:Update()
if not self.PrimaryPart then
return self:Remove()
end
local allow = true
if ESP.Overrides.UpdateAllow and not ESP.Overrides.UpdateAllow(self) then
allow = false
end
if self.IsEnabled and (type(self.IsEnabled) == "string" and not
ESP[self.IsEnabled] or type(self.IsEnabled) == "function" and not self:IsEnabled())
then
allow = false
end
if not workspace:IsAncestorOf(self.PrimaryPart) and not self.RenderInNil then
allow = false
end
if not allow then
for i, v in pairs(self.Components) do
if v then
v.Visible = false
end
end
return
end
local size = self.Size
local cf = self.PrimaryPart.CFrame
local locs = {
TopLeft = WorldToViewportPoint(cam, (cf * ESP.BoxShift *
CFrame.new(size.X / 2, size.Y / 2, 0)).Position),
TopRight = WorldToViewportPoint(cam, (cf * ESP.BoxShift * CFrame.new(-
size.X / 2, size.Y / 2, 0)).Position),
BottomLeft = WorldToViewportPoint(cam, (cf * ESP.BoxShift *
CFrame.new(size.X / 2, -size.Y / 2, 0)).Position),
BottomRight = WorldToViewportPoint(cam, (cf * ESP.BoxShift * CFrame.new(-
size.X / 2, -size.Y / 2, 0)).Position)
}
if self.Components.Quad then
if locs.TopRight.Z > 0 and locs.TopLeft.Z > 0 and locs.BottomLeft.Z > 0 and
locs.BottomRight.Z > 0 then
self.Components.Quad.Visible = true
self.Components.Quad.PointA = Vector2.new(locs.TopRight.X,
locs.TopRight.Y)
self.Components.Quad.PointB = Vector2.new(locs.TopLeft.X,
locs.TopLeft.Y)
self.Components.Quad.PointC = Vector2.new(locs.BottomLeft.X,
locs.BottomLeft.Y)
self.Components.Quad.PointD = Vector2.new(locs.BottomRight.X,
locs.BottomRight.Y)
self.Components.Quad.Color = self.Color or ESP.Color
else
self.Components.Quad.Visible = false
end
self.Components.Quad.Color = self.Color or ESP.Color
end
end
function ESP:Add(obj, options)
if not obj.Parent and not options.RenderInNil then
warn(obj.Name .. " has no parent, skipping ESP addition.")
return
end
local box = setmetatable({
Type = "Box",
Color = options.Color,
Size = options.Size or self.BoxSize,
Object = obj,
Player = options.Player or plrs:GetPlayerFromCharacter(obj),
PrimaryPart = options.PrimaryPart or obj.ClassName == "Model" and
(obj.PrimaryPart or obj:FindFirstChild("HumanoidRootPart") or
obj:FindFirstChildWhichIsA("BasePart")) or obj:IsA("BasePart") and obj,
Components = {},
IsEnabled = options.IsEnabled,
Temporary = options.Temporary,
ColorDynamic = options.ColorDynamic,
RenderInNil = options.RenderInNil
}, boxBase)
if not box.PrimaryPart then
warn("PrimaryPart not found for object:", obj.Name)
return
end
if self:GetBox(obj) then
self:GetBox(obj):Remove()
end
box.Components["Quad"] = Draw("Quad", {
Thickness = self.Thickness,
Color = box.Color,
Transparency = 1,
Filled = false,
Visible = self.Enabled and self.Boxes
})
self.Objects[obj] = box
obj.AncestryChanged:Connect(function(_, parent)
if parent == nil and ESP.AutoRemove ~= false then
box:Remove()
end
end)
obj:GetPropertyChangedSignal("Parent"):Connect(function()
if obj.Parent == nil and ESP.AutoRemove ~= false then
box:Remove()
end
end)
local hum = obj:FindFirstChildOfClass("Humanoid")
if hum then
hum.Died:Connect(function()
if ESP.AutoRemove ~= false then
box:Remove()
end
end)
end
return box
end
local function CharAdded(char)
local p = plrs:GetPlayerFromCharacter(char)
if not char:FindFirstChild("HumanoidRootPart") then
local ev
ev = char.ChildAdded:Connect(function(c)
if c.Name == "HumanoidRootPart" then
ev:Disconnect()
print("Adding ESP for character:", char.Name)
ESP:Add(char, {
Player = p,
PrimaryPart = c
})
end
end)
else
print("Adding ESP for character:", char.Name)
ESP:Add(char, {
Player = p,
PrimaryPart = char.HumanoidRootPart
})
end
end
local function PlayerAdded(p)
p.CharacterAdded:Connect(CharAdded)
if p.Character then
coroutine.wrap(CharAdded)(p.Character)
end
end
plrs.PlayerAdded:Connect(PlayerAdded)
for i, v in pairs(plrs:GetPlayers()) do
if v ~= plr then
PlayerAdded(v)
end
end
game:GetService("RunService").RenderStepped:Connect(function()
cam = workspace.CurrentCamera
for i, v in pairs(ESP.Objects) do
if v.Update then
local s, e = pcall(v.Update, v)
if not s then
warn("[ESP Update Error]", e)
end
end
end
end)
ESP:Toggle(true)
ESP.Boxes = true
local charBodies
for _, folder in pairs(workspace:GetChildren()) do
if folder:IsA("Folder") then
local humanoidFound = false
for _, model in pairs(folder:GetChildren()) do
if model:FindFirstChildOfClass("Humanoid") then
humanoidFound = true
break
end
end
if humanoidFound then
charBodies = folder
break
end
end
end
if charBodies then
print("Got esp folder. Please wait")
else
print("Failed to get esp folder..dm aida64")
end
ESP:AddObjectListener(charBodies, {
Type = "Model",
Color = Color3.fromRGB(255, 0, 4),
PrimaryPart = function(obj)
return obj:FindFirstChild("HumanoidRootPart") or
obj:FindFirstChildOfClass("BasePart")
end,
Validator = function(obj)
task.wait(1)
return true
end,
IsEnabled = "player"
}); ESP.player = true