--[[ PART ESP CLEAN -- big text only | toggle: RightShift ]] local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local NAMES = { "flamingo", "neptun", "stormshadow", "kalibr", "shahed136", "lutiy", "gerbera", "fp1", "bober", "shahed107", "lisica", "bm35", "italmas", "molniyauav", "molniya2", "hello", "kub", "darts", "shahed238", "chaklyn", "geran5", "ztk", "zhuk", "greywidow", "delta", "geranseeker", "fpv", "fpvvandal", "fpvold", "hornet", "lancet", "swithbl", "x10", } local TEXT_SIZE = 18 -- was 54 local BOX_W = 170 -- was 480 local BOX_H = 26 -- was 80 local TEXT_COLOR = Color3.fromRGB(255, 255, 0) local SHOW_DISTANCE = false local MAX_DIST = 40000000000 local POLL = 0.2 local TRACK_MODELS = true local EDGE_MARGIN = 120 -- stationary detection local MOVE_THRESHOLD = 0.7 -- studs moved per poll to count as "moving" local STATIONARY_TIME = 1.5 -- seconds of no movement before the ESP hides local REMOVE_WHEN_STILL = false -- false = hide (returns if it moves again) -- true = delete the entry permanently local lookup = {} for _, n in ipairs(NAMES) do lookup[(n:lower():gsub("[^%w]", ""))] = true end local function isTarget(name) return lookup[(name:lower():gsub("[^%w]", ""))] == true end local function getGuiRoot() local ok, h = pcall(function() return gethui() end) if ok and h then return h end return Players.LocalPlayer:WaitForChild("PlayerGui") end local gui = Instance.new("ScreenGui") gui.Name = "PartESPClean" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.DisplayOrder = 999 pcall(function() gui.Parent = getGuiRoot() end) if not gui.Parent then gui.Parent = Workspace.CurrentCamera end local tracked = setmetatable({}, { __mode = "k" }) local running, pollConn, addConn, button = false, nil, nil, nil local function getPos(obj) if obj:IsA("BasePart") then return obj.Position end local ok, p = pcall(function() return obj:GetPivot().Position end) if ok then return p end return nil end local function dropEntry(obj, entry) pcall(function() entry.billboard:Destroy() end) tracked[obj] = nil end local function shouldShow(obj, cam) local ok = pcall(function() return obj.Parent end) if not ok or obj.Parent == nil then return false end if not obj:IsDescendantOf(Workspace) then return false end if not isTarget(obj.Name) then return false end if obj:IsA("BasePart") then if obj.Transparency >= 0.99 or obj.LocalTransparencyModifier >= 0.99 then return false end end local pos = getPos(obj) if not pos then return false end local rel = pos - cam.CFrame.Position local dist = rel.Magnitude if dist > MAX_DIST then return false end if dist < 2 then return true end local vp, onScreen = cam:WorldToViewportPoint(pos) if not onScreen then return false end if vp.X < -EDGE_MARGIN or vp.Y < -EDGE_MARGIN then return false end if vp.X > cam.ViewportSize.X + EDGE_MARGIN or vp.Y > cam.ViewportSize.Y + EDGE_MARGIN then return false end return true end local function add(obj) if tracked[obj] then return end local isPart = obj:IsA("BasePart") local isModel = TRACK_MODELS and obj:IsA("Model") if not (isPart or isModel) then return end if not isTarget(obj.Name) then return end if isPart and (obj.Transparency >= 0.99 or obj.LocalTransparencyModifier >= 0.99) then return end local bb = Instance.new("BillboardGui") bb.Name = "PESP" bb.Adornee = obj bb.AlwaysOnTop = true bb.LightInfluence = 0 bb.MaxDistance = MAX_DIST bb.Size = UDim2.fromOffset(BOX_W, BOX_H) bb.StudsOffsetWorldSpace = Vector3.new(0, 5, 0) bb.Enabled = false local label = Instance.new("TextLabel") label.BackgroundColor3 = Color3.new(0, 0, 0) label.BackgroundTransparency = 0.45 label.BorderSizePixel = 0 label.Size = UDim2.fromScale(1, 1) label.Font = Enum.Font.SourceSansBold label.Text = obj.Name label.TextColor3 = TEXT_COLOR label.TextStrokeColor3 = Color3.new(0, 0, 0) label.TextStrokeTransparency = 0 label.TextSize = TEXT_SIZE label.TextWrapped = false label.Parent = bb bb.Parent = obj tracked[obj] = { billboard = bb, label = label, obj = obj, lastPos = getPos(obj), stationaryTime = 0, } obj.Destroying:Connect(function() pcall(function() bb:Destroy() end) tracked[obj] = nil end) end local function poll() if not running then return end local cam = Workspace.CurrentCamera if not cam then return end for obj, entry in pairs(tracked) do local pos = getPos(obj) -- ---- movement check ---- local moved = true if pos and entry.lastPos then moved = (pos - entry.lastPos).Magnitude >= MOVE_THRESHOLD end if pos then entry.lastPos = pos end if moved then entry.stationaryTime = 0 else entry.stationaryTime += POLL end local isStill = entry.stationaryTime >= STATIONARY_TIME if isStill and REMOVE_WHEN_STILL then dropEntry(obj, entry) else -- label hidden entirely while the part sits still local show = (not isStill) and shouldShow(obj, cam) entry.billboard.Enabled = show if show and SHOW_DISTANCE and entry.label and pos then entry.label.Text = string.format("%s\n%d m", obj.Name, math.floor((pos - cam.CFrame.Position).Magnitude + 0.5)) end end end end local function start() if running then return end running = true for _, d in ipairs(Workspace:GetDescendants()) do if d:IsA("BasePart") or (TRACK_MODELS and d:IsA("Model")) then add(d) end end addConn = Workspace.DescendantAdded:Connect(function(d) if running and (d:IsA("BasePart") or d:IsA("Model")) then task.defer(function() if running then add(d) end end) end end) local acc = 0 pollConn = RunService.Heartbeat:Connect(function(dt) if not running then return end acc += dt if acc < POLL then return end acc = 0 poll() end) poll() if button then button.Text = "TEXT ESP: ON" end end local function stop() if not running then return end running = false if addConn then pcall(function() addConn:Disconnect() end); addConn = nil end if pollConn then pcall(function() pollConn:Disconnect() end); pollConn = nil end for obj, entry in pairs(tracked) do pcall(function() entry.billboard:Destroy() end) tracked[obj] = nil end if button then button.Text = "TEXT ESP: OFF" end end local function toggle() if running then stop() else start() end end button = Instance.new("TextButton") button.Size = UDim2.fromOffset(170, 34) button.Position = UDim2.new(0, 14, 0, 14) button.BackgroundColor3 = Color3.fromRGB(18, 18, 22) button.BackgroundTransparency = 0.2 button.TextColor3 = Color3.fromRGB(255, 255, 255) button.Font = Enum.Font.SourceSansBold button.TextSize = 16 button.Text = "TEXT ESP: OFF" button.Active = true button.Draggable = true button.Parent = gui button.MouseButton1Click:Connect(toggle) UserInputService.InputBegan:Connect(function(input, gp) if not gp and input.KeyCode == Enum.KeyCode.RightShift then toggle() end end) start() print("[PartESP Clean] loaded")