local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local espEnabled = false local isMinimized = false local activeEspObjects = {} local renderConnection = nil local scanTask = nil local screenGui = Instance.new("ScreenGui") screenGui.Name = "PencilEspGui" screenGui.ResetOnSpawn = false screenGui.Parent = PlayerGui local mainFrame = Instance.new("Frame") mainFrame.Name = "MainFrame" mainFrame.Size = UDim2.new(0, 180, 0, 85) mainFrame.Position = UDim2.new(0.5, -90, 0, 10) mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 40) mainFrame.ClipsDescendants = true mainFrame.Parent = screenGui local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 8) frameCorner.Parent = mainFrame local frameStroke = Instance.new("UIStroke") frameStroke.Color = Color3.fromRGB(60, 60, 80) frameStroke.Thickness = 2 frameStroke.Parent = mainFrame local titleBar = Instance.new("Frame") titleBar.Name = "TitleBar" titleBar.Size = UDim2.new(1, 0, 0, 30) titleBar.BackgroundColor3 = Color3.fromRGB(20, 20, 28) titleBar.Parent = mainFrame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 8) titleCorner.Parent = titleBar local titleText = Instance.new("TextLabel") titleText.Size = UDim2.new(1, -60, 1, 0) titleText.Position = UDim2.new(0, 10, 0, 0) titleText.BackgroundTransparency = 1 titleText.Text = "Pencil ESP" titleText.TextColor3 = Color3.fromRGB(240, 240, 240) titleText.Font = Enum.Font.SourceSansBold titleText.TextSize = 14 titleText.TextXAlignment = Enum.TextXAlignment.Left titleText.Parent = titleBar local minimizeButton = Instance.new("TextButton") minimizeButton.Name = "MinimizeButton" minimizeButton.Size = UDim2.new(0, 25, 0, 25) minimizeButton.Position = UDim2.new(1, -55, 0, 2.5) minimizeButton.BackgroundTransparency = 1 minimizeButton.Text = "-" minimizeButton.TextColor3 = Color3.fromRGB(200, 200, 200) minimizeButton.Font = Enum.Font.SourceSansBold minimizeButton.TextSize = 18 minimizeButton.Parent = titleBar local closeButton = Instance.new("TextButton") closeButton.Name = "CloseButton" closeButton.Size = UDim2.new(0, 25, 0, 25) closeButton.Position = UDim2.new(1, -28, 0, 2.5) closeButton.BackgroundTransparency = 1 closeButton.Text = "×" closeButton.TextColor3 = Color3.fromRGB(255, 80, 80) closeButton.Font = Enum.Font.SourceSansBold closeButton.TextSize = 18 closeButton.Parent = titleBar local toggleButton = Instance.new("TextButton") toggleButton.Name = "PencilEspButton" toggleButton.Size = UDim2.new(1, -16, 0, 40) toggleButton.Position = UDim2.new(0, 8, 0, 36) toggleButton.BackgroundColor3 = Color3.fromRGB(45, 45, 60) toggleButton.TextColor3 = Color3.fromRGB(255, 255, 255) toggleButton.Text = "ESP: OFF" toggleButton.Font = Enum.Font.SourceSansBold toggleButton.TextSize = 15 toggleButton.Parent = mainFrame local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 6) btnCorner.Parent = toggleButton local dragging, dragInput, dragStart, startPos local function updateInput(input) local delta = input.Position - dragStart mainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = mainFrame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) titleBar.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then updateInput(input) end end) local function getTargetPosition(target) if target:IsA("BasePart") then return target.Position elseif target:IsA("Model") then if target.PrimaryPart then return target.PrimaryPart.Position else return target:GetBoundingBox().Position end end return nil end local function clearEsp() if renderConnection then renderConnection:Disconnect() renderConnection = nil end if scanTask then task.cancel(scanTask) scanTask = nil end for _, item in ipairs(activeEspObjects) do if item.Highlight then item.Highlight:Destroy() end if item.Billboard then item.Billboard:Destroy() end end activeEspObjects = {} end local function applyEsp(target) for _, item in ipairs(activeEspObjects) do if item.Target == target then return end end local highlight = Instance.new("Highlight") highlight.Name = "PencilESP_Highlight" highlight.FillColor = Color3.fromRGB(255, 0, 0) highlight.FillTransparency = 0.5 highlight.OutlineColor = Color3.fromRGB(255, 255, 255) highlight.OutlineTransparency = 0 highlight.Adornee = target highlight.Parent = target local billboard = Instance.new("BillboardGui") billboard.Name = "PencilESP_Billboard" billboard.Size = UDim2.new(0, 180, 0, 40) billboard.StudsOffset = Vector3.new(0, 2.5, 0) billboard.AlwaysOnTop = true billboard.Adornee = target billboard.Parent = target local label = Instance.new("TextLabel") label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.TextColor3 = Color3.fromRGB(255, 255, 255) label.TextStrokeColor3 = Color3.fromRGB(0, 0, 0) label.TextStrokeTransparency = 0 label.Font = Enum.Font.SourceSansBold label.TextSize = 14 label.Text = target.Name .. "\n[ Calculating... ]" label.Parent = billboard table.insert(activeEspObjects, { Target = target, Highlight = highlight, Billboard = billboard, Label = label }) end local function scanPencils() for _, descendant in ipairs(Workspace:GetDescendants()) do if string.match(descendant.Name, "Pencil$") then applyEsp(descendant) end end end local function startDistanceTracker() renderConnection = RunService.RenderStepped:Connect(function() local character = LocalPlayer.Character if not character then return end local rootPart = character:FindFirstChild("HumanoidRootPart") if not rootPart then return end local playerPos = rootPart.Position for i = #activeEspObjects, 1, -1 do local item = activeEspObjects[i] if item.Target and item.Target.Parent then local targetPos = getTargetPosition(item.Target) if targetPos then local distance = math.floor((playerPos - targetPos).Magnitude) item.Label.Text = string.format("%s\n[%d Studs]", item.Target.Name, distance) end else if item.Highlight then item.Highlight:Destroy() end if item.Billboard then item.Billboard:Destroy() end table.remove(activeEspObjects, i) end end end) end local function start1SecondLoop() scanTask = task.spawn(function() while espEnabled do scanPencils() task.wait(1) end end) end toggleButton.MouseButton1Click:Connect(function() espEnabled = not espEnabled if espEnabled then toggleButton.Text = "ESP: ON" toggleButton.BackgroundColor3 = Color3.fromRGB(180, 40, 40) scanPencils() startDistanceTracker() start1SecondLoop() else toggleButton.Text = "ESP: OFF" toggleButton.BackgroundColor3 = Color3.fromRGB(45, 45, 60) clearEsp() end end) minimizeButton.MouseButton1Click:Connect(function() isMinimized = not isMinimized if isMinimized then mainFrame.Size = UDim2.new(0, 180, 0, 30) minimizeButton.Text = "+" else mainFrame.Size = UDim2.new(0, 180, 0, 85) minimizeButton.Text = "-" end end) closeButton.MouseButton1Click:Connect(function() clearEsp() screenGui:Destroy() end)