simple drawing esp I open source
Key Required

simple drawing esp I open source

[SEASON 3] Operation Onevaulttvaultt 12.1K views 863 executesUpdated Sep 25, 2025
4.2/ 5(6 votes)
5183% Positive
Lua Script•385 lines (10746 chars)
--player esp
local Players = game:GetService("Players")
local lp = Players.LocalPlayer
local camera = game.Workspace.Camera
local UIS = game:GetService("UserInputService")

local espoverall = true

local espbox = true
local espboxoutline = true

local esptracer = true
local esptraceroutline = true
local tracertype = 1 -- 1: bottom of screen, 2: center of screen:, 3: top of screen

local esphealthbar = true
local esphealthbaroutline = true

local espname = true

local espdrone = true
local espdroneoutline = true

local espboxes = {}
local espboxoutlines = {}
local esptracers = {}
local esptraceroutlines = {}
local esphealthbars = {}
local esphealthbaroutlines = {}
local espnames = {}
local espdrones = {}
local espdroneoutlines = {}

local screensize = game.Workspace.CurrentCamera.ViewportSize
local screenpositions = {Vector2.new(screensize.X / 2, screensize.Y), Vector2.new(screensize.X / 2, screensize.Y / 2), Vector2.new(screensize.X / 2, 0)}

local function removeplr(name)
	if espboxes[name] then espboxes[name].Visible = false; espboxes[name]:Remove(); espboxes[name] = nil end
	if espboxoutlines[name] then espboxoutlines[name].Visible = false; espboxoutlines[name]:Remove(); espboxoutlines[name] = nil end
	if esptracers[name] then esptracers[name].Visible = false; esptracers[name]:Remove(); esptracers[name] = nil end
	if esptraceroutlines[name] then esptraceroutlines[name].Visible = false; esptraceroutlines[name]:Remove(); esptraceroutlines[name] = nil end
	if esphealthbars[name] then esphealthbars[name].Visible = false; esphealthbars[name]:Remove(); esphealthbars[name] = nil end
	if esphealthbaroutlines[name] then esphealthbaroutlines[name].Visible = false; esphealthbaroutlines[name]:Remove(); esphealthbaroutlines[name] = nil end
	if espnames[name] then espnames[name].Visible = false; espnames[name]:Remove(); espnames[name] = nil end
end

local function removedrone(drone)
	if espdrones[drone] then espdrones[drone].Visible = false; espdrones[drone]:Remove(); espdrones[drone] = nil end
	if espdroneoutlines[drone] then espdroneoutlines[drone].Visible = false; espdroneoutlines[drone]:Remove(); espdroneoutlines[drone] = nil end
end

local function getenemies()
	local team = lp.Team
	local enemies = {}
	for _,plr in pairs(Players:GetChildren()) do
		if espoverall and plr.Character and Players[plr.Name].Team ~= team then
			local hum = plr.Character:FindFirstChild("Humanoid")
			if hum and hum.Health > 0 then
				table.insert(enemies, plr.Character)
			end
		end
	end
	local drones = {}
	for _,v in pairs(game.Workspace:GetChildren()) do
		if v.Name == "Drone" then
			table.insert(drones, v)
		end
	end
	return enemies, drones
end

local function getCharMinMax(char)
	local minX, maxX = math.huge, -math.huge
	local minY, maxY = math.huge, -math.huge

	for _, part in pairs(char:GetChildren()) do
		if part:IsA("BasePart") then
			local cf = part.CFrame
			local size = part.Size / 2

			-- Generate the 8 corners of the bounding box
			local corners = {
				Vector3.new(-size.X, -size.Y, -size.Z),
				Vector3.new(-size.X, -size.Y,  size.Z),
				Vector3.new(-size.X,  size.Y, -size.Z),
				Vector3.new(-size.X,  size.Y,  size.Z),
				Vector3.new( size.X, -size.Y, -size.Z),
				Vector3.new( size.X, -size.Y,  size.Z),
				Vector3.new( size.X,  size.Y, -size.Z),
				Vector3.new( size.X,  size.Y,  size.Z),
			}

			for _, offset in pairs(corners) do
				local worldPoint = cf:PointToWorldSpace(offset)
				local screenPos, onScreen = camera:WorldToViewportPoint(worldPoint)
				if onScreen then
					minX = math.min(minX, screenPos.X)
					maxX = math.max(maxX, screenPos.X)
					minY = math.min(minY, screenPos.Y)
					maxY = math.max(maxY, screenPos.Y)
				end
			end
		end
	end

	return maxX, maxY, minX, minY
end

local function torture(char) -- healthbar position calculations
	local maxX, maxY, minX, minY = getCharMinMax(char)
	local topleft = Vector2.new(minX, minY)

	local boxCFrame, boxSize = char:GetBoundingBox()
	local topCenterWorld = boxCFrame.Position + boxCFrame.UpVector * (boxSize.Y / 2)

	local camLeft = -camera.CFrame.RightVector -- big thanks to roblox devforums
	local p0, on0 = camera:WorldToViewportPoint(topCenterWorld)
	local pL, onL = camera:WorldToViewportPoint(topCenterWorld + camLeft * 0.3)

	if not (on0 and onL) then
		return topleft, topleft
	end

	local LOffset = Vector2.new(pL.X - p0.X, pL.Y - p0.Y)

	local left2d = topleft + LOffset

	return topleft, left2d
end

local function mainESP(target)
	if target == nil or (not target) then
		return
	end
	if not target:IsA("Model") then
		return
	end

	local maxX, maxY, minX, minY = getCharMinMax(target)
	local outline

	-- BOX & OUTLINE
	local box

	if espboxoutlines[target.Name] then
		outline = espboxoutlines[target.Name]
	else
		outline = Drawing.new("Square")
		outline.Visible = true
		outline.Transparency = 0.5
		outline.Color = Color3.new(0,0,0)
		outline.Thickness = 2
		outline.Filled = false
		espboxoutlines[target.Name] = outline
	end

	if espboxes[target.Name] then
		box = espboxes[target.Name]
	else
		box = Drawing.new("Square")
		box.Visible = true
		box.Transparency = 0.5
		box.Color = Color3.new(1,1,1)
		box.Thickness = 1
		box.Filled = false
		espboxes[target.Name] = box
	end

	box.Size = Vector2.new(maxX - minX, maxY - minY)
	box.Position = Vector2.new(minX, minY)

	outline.Size = Vector2.new(maxX - minX, maxY - minY)
	outline.Position = Vector2.new(minX, minY)
	-- BOX & OUTLINE DONE

	-- TRACER & OUTLINE
	local line
	--outlines first cuz we love drawing zindex!!
	if esptraceroutlines[target.Name] then -- use old one
		outline = esptraceroutlines[target.Name]
	else -- make new one
		outline = Drawing.new("Line")
		outline.Visible = true
		outline.Color = Color3.new(0,0,0)
		outline.Thickness = 2 -- or the outline wont show :(
		esptraceroutlines[target.Name] = outline
	end
	-- ok and NOW we do the tracer
	if esptracers[target.Name] then -- tracer exists lets use old
		line = esptracers[target.Name]
	else -- new one baby!!
		line = Drawing.new("Line")
		line.Visible = true
		line.Color = Color3.new(1,1,1)
		line.Thickness = 1 -- make it not cover the outline
		esptracers[target.Name] = line
	end

	--now we update position stuff :)
	outline.From = screenpositions[tracertype]
	line.From = screenpositions[tracertype]

	outline.To = Vector2.new(minX + (maxX - minX)/2, minY) -- center top of the player box
	line.To = Vector2.new(minX + (maxX - minX)/2, minY)
	-- TRACER & OUTLINE DONE

	-- HEALTHBAR & OUTLINE

	local healthbar

	if esphealthbaroutlines[target.Name] then
		outline = esphealthbaroutlines[target.Name]
	else
		outline = Drawing.new("Square")
		outline.Visible = true
		outline.Color = Color3.new(0,0,0)
		outline.Thickness = 2
		outline.Filled = false
		esphealthbaroutlines[target.Name] = outline
	end

	if esphealthbars[target.Name] then
		healthbar = esphealthbars[target.Name]
	else
		healthbar = Drawing.new("Square")
		healthbar.Visible = true
		healthbar.Color = Color3.new(0,1,0)
		healthbar.Thickness = 1
		healthbar.Filled = true
		esphealthbars[target.Name] = healthbar
	end

	local topleft, width = torture(target)
	local hWidth = (topleft - width).Magnitude
	local targethealthloss = Vector2.new(0, (maxY - minY) * (1 - target.Humanoid.Health/100))

	healthbar.Size = Vector2.new(hWidth, (maxY - minY)) - targethealthloss
	healthbar.Position = Vector2.new(topleft.X - hWidth, minY) + targethealthloss

	outline.Size = Vector2.new(hWidth, (maxY - minY)) - targethealthloss
	outline.Position = Vector2.new(topleft.X - hWidth, minY) + targethealthloss
	-- HEALTHBAR & OUTLINE (finally) DONE

	--NAME ESP
	local name

	if espnames[target.Name] then
		name = espnames[target.Name]
	else
		name = Drawing.new("Text")
		name.Visible = true
		name.Color = Color3.new(1,1,1)
		name.Text = target.Name
		name.Size = 12
		name.Center = true
		name.Outline = true
		name.OutlineColor = Color3.new(0,0,0)
		espnames[target.Name] = name
	end

	name.Position = Vector2.new(minX + (maxX - minX)/2, minY - name.TextBounds.Y - 3)
	--NAME ESP DONE
end

local function drone_esp(target)
	if target == nil or (not target) then
		return
	end
	if not target:IsDescendantOf(game.Workspace) then
		removedrone(target)
		return
	end
	if not target:IsA("Model") then
		return
	end

	local maxX, maxY, minX, minY = getCharMinMax(target)
	local outline

	-- BOX & OUTLINE
	local box

	if espdroneoutlines[target] then
		outline = espdroneoutlines[target]
	else
		outline = Drawing.new("Square")
		outline.Visible = true
		outline.Transparency = 0.5
		outline.Color = Color3.new(0,0,0)
		outline.Thickness = 2
		outline.Filled = false
		espdroneoutlines[target] = outline
	end

	if espdrones[target] then
		box = espdrones[target]
	else
		box = Drawing.new("Square")
		box.Visible = true
		box.Transparency = 0.5
		box.Color = Color3.new(1,0,0)
		box.Thickness = 1
		box.Filled = false
		espdrones[target] = box
	end

	box.Size = Vector2.new(maxX - minX, maxY - minY)
	box.Position = Vector2.new(minX, minY)

	outline.Size = Vector2.new(maxX - minX, maxY - minY)
	outline.Position = Vector2.new(minX, minY)
	-- BOX & OUTLINE DONE
end

Players.PlayerRemoving:Connect(function(plr)
	removeplr(plr.Name)
end)

local function charhook(plr)
	local char = plr.Character
	if not char then return end
	local hum = char:FindFirstChildOfClass("Humanoid")
	if hum then
		hum.Died:Connect(function()
			removeplr(plr.Name)
		end)
	end
end

Players.PlayerAdded:Connect(function(plr)
	plr.CharacterAdded:Connect(function()
		charhook(plr)
	end)
end)

for _,plr in ipairs(Players:GetPlayers()) do
	if plr.Character then charhook(plr) end
end

game:GetService("RunService").RenderStepped:Connect(function()
	local enemies, drones = getenemies()

	local alive = {}
	for _,e in pairs(enemies) do
		alive[e.Name] = true
		mainESP(e)
	end

	for _,d in pairs(drones) do
		drone_esp(d)
	end

	for name,_ in pairs(espboxes) do
		if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(espboxoutlines) do
	if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(esptracers) do
		if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(esptraceroutlines) do
		if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(esphealthbars) do
		if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(esphealthbaroutlines) do
		if not alive[name] then removeplr(name) end
	end
	for name,_ in pairs(espnames) do
		if not alive[name] then removeplr(name) end
	end

	for drone,_ in pairs(espdrones) do
		if not drone or not drone:IsDescendantOf(game.Workspace) then
			removedrone(drone)
		end
	end
	for drone,_ in pairs(espdroneoutlines) do
		if not drone or not drone:IsDescendantOf(game.Workspace) then
			removedrone(drone)
		end
	end
end)

Features & Information

just box esp, tracers, healthbars, name esp, and drone esp drone esp is the red boxes theres a few settings at the top of the script, tracertype is the only one that works, ill implement the rest later with a ui settings & ui after that aimbot/silent aim, etc coming last :)

Community Comments (23)

zxcvzxcvSep 25, 2025

very simple. The code: 😭😭

chunky4musty69chunky4musty69Sep 25, 2025

PLEASE ADD MORE STUFF TO IT

zxcvzxcvSep 25, 2025

PLEASE TRACER

vaulttvaulttSep 25, 2025

uh ill go add stuff some time soon im busy with exams also @zxcv most of the code is team/health check & get min max for the boxes lol

vaulttvaulttSep 25, 2025

ok i added tracer @zxcv

vaulttvaulttSep 26, 2025

healthbar added, name & skeleton next

Replying to @vaultt
israel422756israel422756Mar 27, 2026

@ttokenn are you guys using it use it in Roblox

vaulttvaulttSep 26, 2025

nvm skeleton too hard :pray: ill add name & then work on silent and stuff

vaulttvaulttSep 26, 2025

drone esp added alongside name esp, updated script to cleanup the leftover bits and bobs of esp

Replying to @vaultt
TennesseeblahcTennesseeblahcDec 12, 2025

@ttokenn I think its detected yo

Replying to @Tennesseeblahc

@Agaydude is it?

Replying to @Tennesseeblahc
vaulttvaulttDec 21, 2025

@Agaydude how can drawing esp be detected lmao (it cant) you likely got reported and banned manually

Replying to @vaultt
TennesseeblahcTennesseeblahcDec 22, 2025

@ttokenn uhh ok

Anonymous_user0630Anonymous_user0630Dec 19, 2025

Pls teach me how to make exploits

3*3*Jan 10, 2026

if its possible, could you add a visible check where the esp turns green if visible or behind a breakable wall, i also saw something interesting where anything breakable/ able to shoot through such as the walls or floors are see-through able, if that's possible I think that would be a great feature

3*3*Jan 10, 2026

sorry if this is too much to ask, the esp im using rn sucks (using inf yield partesp HumanoidRootPart/torso)

Replying to @3*
vaulttvaulttJan 11, 2026

@3 hi there :) i dont really work on this anymore, sorry!

Replying to @vaultt
3*3*Jan 12, 2026

@ttokenn unfortunate, I haven't seen anything that works as well as this 💔

i think they patched the script causing the esp to be broken

LurIsAqtLurIsAqtJan 23, 2026

alr,hopefully i dont get detected :)

LurIsAqtLurIsAqtJan 24, 2026

gng,pls make the hitbox make the hitbox the same as the player pls :-(

israel422756israel422756Mar 27, 2026

What are you guys using t use it in Roblox

israel422756israel422756Mar 27, 2026

@ttokenn are you guys using it use it in Roblox

More Scripts for [SEASON 3] Operation One