ADVERTISEMENTREMOVE ADS
[BOX ESP] [UPDATED]
54,589 views

Script Preview
Description
Simple BOX ESP. Based on Drawing API.
Answers to frequent questions.
Why there is no TeamCheck - technically not possible.
Why you can't change box when a player is lying or sitting - ESP selection feature - this part of the body doesn't change its position.
Otherwise there are no problems
Should work on all executors
Tested with
ADVERTISEMENTREMOVE ADS
314 Lines β’ 9.19 KiB
Verified
-- working 31.08.25
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
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
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
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
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()
ESP:Add(char, {
Player = p,
PrimaryPart = c
})
end
end)
else
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
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
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
ADVERTISEMENTREMOVE ADS
ADVERTISEMENTREMOVE ADS

![[Xray/Box ESP] TrapSE Scorched Earth thumbnail](/_next/image?url=%2Fassets%2Fscripts%2F68bb4e62ef3248bb1bba57fc_1757191854834_CqEcvQBeNC.webp&w=640&q=75)




Comments
I recreated ESP completely from scratch with no garbage code from the past lua enjoyer. Now I don't even have any bugs. But this ESP is still in development and may be released tomorrow
If there are bugs and lags in the code that you know, then you have to fix them before posting it.
@Maanaaaa FPS is not affected by such ESP. And there is only 1 problem. And even with such a script is quite comfortable to play. I looked in the publick working options was not a single one. So I at least temporarily provided people with such a version
@maanaaaa hes working on new one too so...
Fixed bugs of the previous version
yo keep these types of bangers up!!!!1111111