--// Player Tracker GUI --// Put this LocalScript in StarterPlayerScripts or StarterGui --// Local-only tracker GUI local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer --======================== -- EDIT HERE --======================== local guiTitle = "Player Tracker" local trackButtonText = "Track Nearest" local smallButtonText = "Open" local listTitleText = "Players:" local updateRate = 0.15 -- lower = faster refresh --======================== local tracking = false local selectedPlayer = nil local selectedCharacter = nil local selectedRoot = nil local character = player.Character or player.CharacterAdded:Wait() local humanoidRootPart = character:WaitForChild("HumanoidRootPart") local screenGui = Instance.new("ScreenGui") screenGui.Name = "PlayerTrackerGui" screenGui.ResetOnSpawn = false screenGui.Parent = player:WaitForChild("PlayerGui") local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 320, 0, 360) mainFrame.Position = UDim2.new(0.5, -160, 0.5, -180) mainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25) mainFrame.BorderSizePixel = 0 mainFrame.Active = true mainFrame.ClipsDescendants = true mainFrame.Parent = screenGui local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 12) mainCorner.Parent = mainFrame local titleBar = Instance.new("TextLabel") titleBar.Size = UDim2.new(1, 0, 0, 35) titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35) titleBar.BorderSizePixel = 0 titleBar.Text = guiTitle titleBar.TextColor3 = Color3.fromRGB(255, 255, 255) titleBar.TextScaled = true titleBar.Font = Enum.Font.GothamBold titleBar.Parent = mainFrame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 12) titleCorner.Parent = titleBar local hideButton = Instance.new("TextButton") hideButton.Size = UDim2.new(0, 60, 0, 25) hideButton.Position = UDim2.new(1, -65, 0, 5) hideButton.BackgroundColor3 = Color3.fromRGB(70, 70, 70) hideButton.Text = "Hide" hideButton.TextColor3 = Color3.fromRGB(255, 255, 255) hideButton.TextScaled = true hideButton.Font = Enum.Font.Gotham hideButton.BorderSizePixel = 0 hideButton.Parent = mainFrame local hideCorner = Instance.new("UICorner") hideCorner.CornerRadius = UDim.new(0, 8) hideCorner.Parent = hideButton local closeButton = Instance.new("TextButton") closeButton.Size = UDim2.new(0, 25, 0, 25) closeButton.Position = UDim2.new(1, -30, 0, 5) closeButton.BackgroundColor3 = Color3.fromRGB(170, 50, 50) closeButton.Text = "X" closeButton.TextColor3 = Color3.fromRGB(255, 255, 255) closeButton.TextScaled = true closeButton.Font = Enum.Font.GothamBold closeButton.BorderSizePixel = 0 closeButton.Parent = mainFrame local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(0, 8) closeCorner.Parent = closeButton local infoLabel = Instance.new("TextLabel") infoLabel.Size = UDim2.new(1, -20, 0, 28) infoLabel.Position = UDim2.new(0, 10, 0, 45) infoLabel.BackgroundTransparency = 1 infoLabel.Text = "Target: None" infoLabel.TextColor3 = Color3.fromRGB(255, 255, 255) infoLabel.TextScaled = true infoLabel.Font = Enum.Font.GothamBold infoLabel.Parent = mainFrame local distanceLabel = Instance.new("TextLabel") distanceLabel.Size = UDim2.new(1, -20, 0, 24) distanceLabel.Position = UDim2.new(0, 10, 0, 75) distanceLabel.BackgroundTransparency = 1 distanceLabel.Text = "Distance: --" distanceLabel.TextColor3 = Color3.fromRGB(220, 220, 220) distanceLabel.TextScaled = true distanceLabel.Font = Enum.Font.Gotham distanceLabel.Parent = mainFrame local directionLabel = Instance.new("TextLabel") directionLabel.Size = UDim2.new(1, -20, 0, 24) directionLabel.Position = UDim2.new(0, 10, 0, 100) directionLabel.BackgroundTransparency = 1 directionLabel.Text = "Direction: --" directionLabel.TextColor3 = Color3.fromRGB(220, 220, 220) directionLabel.TextScaled = true directionLabel.Font = Enum.Font.Gotham directionLabel.Parent = mainFrame local statusLabel = Instance.new("TextLabel") statusLabel.Size = UDim2.new(1, -20, 0, 24) statusLabel.Position = UDim2.new(0, 10, 0, 125) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "Status: Idle" statusLabel.TextColor3 = Color3.fromRGB(180, 180, 180) statusLabel.TextScaled = true statusLabel.Font = Enum.Font.Gotham statusLabel.Parent = mainFrame local trackButton = Instance.new("TextButton") trackButton.Size = UDim2.new(1, -20, 0, 32) trackButton.Position = UDim2.new(0, 10, 0, 155) trackButton.BackgroundColor3 = Color3.fromRGB(50, 120, 50) trackButton.Text = trackButtonText trackButton.TextColor3 = Color3.fromRGB(255, 255, 255) trackButton.TextScaled = true trackButton.Font = Enum.Font.GothamBold trackButton.BorderSizePixel = 0 trackButton.Parent = mainFrame local trackCorner = Instance.new("UICorner") trackCorner.CornerRadius = UDim.new(0, 10) trackCorner.Parent = trackButton local nearestButton = Instance.new("TextButton") nearestButton.Size = UDim2.new(0.5, -15, 0, 28) nearestButton.Position = UDim2.new(0, 10, 0, 193) nearestButton.BackgroundColor3 = Color3.fromRGB(80, 80, 150) nearestButton.Text = "Select Nearest" nearestButton.TextColor3 = Color3.fromRGB(255, 255, 255) nearestButton.TextScaled = true nearestButton.Font = Enum.Font.GothamBold nearestButton.BorderSizePixel = 0 nearestButton.Parent = mainFrame local nearestCorner = Instance.new("UICorner") nearestCorner.CornerRadius = UDim.new(0, 10) nearestCorner.Parent = nearestButton local clearButton = Instance.new("TextButton") clearButton.Size = UDim2.new(0.5, -15, 0, 28) clearButton.Position = UDim2.new(0.5, 5, 0, 193) clearButton.BackgroundColor3 = Color3.fromRGB(120, 80, 40) clearButton.Text = "Clear Target" clearButton.TextColor3 = Color3.fromRGB(255, 255, 255) clearButton.TextScaled = true clearButton.Font = Enum.Font.GothamBold clearButton.BorderSizePixel = 0 clearButton.Parent = mainFrame local clearCorner = Instance.new("UICorner") clearCorner.CornerRadius = UDim.new(0, 10) clearCorner.Parent = clearButton local listHeader = Instance.new("TextLabel") listHeader.Size = UDim2.new(1, -20, 0, 22) listHeader.Position = UDim2.new(0, 10, 0, 228) listHeader.BackgroundTransparency = 1 listHeader.Text = listTitleText listHeader.TextColor3 = Color3.fromRGB(255, 255, 255) listHeader.TextScaled = true listHeader.Font = Enum.Font.GothamBold listHeader.Parent = mainFrame local listFrame = Instance.new("ScrollingFrame") listFrame.Size = UDim2.new(1, -20, 0, 95) listFrame.Position = UDim2.new(0, 10, 0, 252) listFrame.BackgroundColor3 = Color3.fromRGB(32, 32, 32) listFrame.BorderSizePixel = 0 listFrame.ScrollBarThickness = 5 listFrame.CanvasSize = UDim2.new(0, 0, 0, 0) listFrame.Parent = mainFrame local listCorner = Instance.new("UICorner") listCorner.CornerRadius = UDim.new(0, 10) listCorner.Parent = listFrame local listLayout = Instance.new("UIListLayout") listLayout.Padding = UDim.new(0, 4) listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = listFrame local listPadding = Instance.new("UIPadding") listPadding.PaddingTop = UDim.new(0, 6) listPadding.PaddingBottom = UDim.new(0, 6) listPadding.PaddingLeft = UDim.new(0, 6) listPadding.PaddingRight = UDim.new(0, 6) listPadding.Parent = listFrame local smallButton = Instance.new("TextButton") smallButton.Size = UDim2.new(0, 70, 0, 30) smallButton.Position = UDim2.new(0, 10, 0.5, -15) smallButton.BackgroundColor3 = Color3.fromRGB(35, 35, 35) smallButton.Text = smallButtonText smallButton.TextColor3 = Color3.fromRGB(255, 255, 255) smallButton.TextScaled = true smallButton.Font = Enum.Font.GothamBold smallButton.BorderSizePixel = 0 smallButton.Visible = false smallButton.Active = true smallButton.Parent = screenGui local smallCorner = Instance.new("UICorner") smallCorner.CornerRadius = UDim.new(0, 10) smallCorner.Parent = smallButton local function updateCharacter() character = player.Character or player.CharacterAdded:Wait() humanoidRootPart = character:WaitForChild("HumanoidRootPart") end player.CharacterAdded:Connect(function() task.wait(1) updateCharacter() end) local function getRootFromPlayer(plr) if plr and plr.Character then return plr.Character:FindFirstChild("HumanoidRootPart") end return nil end local function getNearestPlayer() if not humanoidRootPart then return nil end local nearest = nil local nearestDistance = math.huge for _, plr in ipairs(Players:GetPlayers()) do if plr ~= player and plr.Character then local root = plr.Character:FindFirstChild("HumanoidRootPart") local hum = plr.Character:FindFirstChildOfClass("Humanoid") if root and hum and hum.Health > 0 then local dist = (root.Position - humanoidRootPart.Position).Magnitude if dist < nearestDistance then nearestDistance = dist nearest = plr end end end end return nearest, nearestDistance end local function clearPlayerList() for _, child in ipairs(listFrame:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end end local function rebuildPlayerList() clearPlayerList() local y = 0 for _, plr in ipairs(Players:GetPlayers()) do if plr ~= player then local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, 0, 0, 28) btn.Position = UDim2.new(0, 0, 0, y) btn.BackgroundColor3 = Color3.fromRGB(45, 45, 45) btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextScaled = true btn.Font = Enum.Font.Gotham btn.BorderSizePixel = 0 btn.Text = plr.Name btn.Parent = listFrame local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, 8) c.Parent = btn btn.MouseButton1Click:Connect(function() selectedPlayer = plr selectedRoot = getRootFromPlayer(plr) infoLabel.Text = "Target: " .. plr.Name statusLabel.Text = "Status: Tracking selected player" end) y += 32 end end listFrame.CanvasSize = UDim2.new(0, 0, 0, y) end local function setTrackingState(on) tracking = on if tracking then trackButton.Text = "Stop Tracking" trackButton.BackgroundColor3 = Color3.fromRGB(150, 60, 60) statusLabel.Text = "Status: Tracking..." else trackButton.Text = trackButtonText trackButton.BackgroundColor3 = Color3.fromRGB(50, 120, 50) statusLabel.Text = "Status: Idle" end end local function getDirectionText(targetPos) if not humanoidRootPart then return "--" end local delta = targetPos - humanoidRootPart.Position local x = delta.X local z = delta.Z if math.abs(x) < 2 and math.abs(z) < 2 then return "Very Close" end if math.abs(x) > math.abs(z) then return x > 0 and "Right" or "Left" else return z > 0 and "Forward" or "Back" end end trackButton.MouseButton1Click:Connect(function() setTrackingState(not tracking) end) nearestButton.MouseButton1Click:Connect(function() local nearest = getNearestPlayer() if nearest then selectedPlayer = nearest selectedRoot = getRootFromPlayer(nearest) infoLabel.Text = "Target: " .. nearest.Name statusLabel.Text = "Status: Selected nearest player" else selectedPlayer = nil selectedRoot = nil infoLabel.Text = "Target: None" statusLabel.Text = "Status: No players found" end end) clearButton.MouseButton1Click:Connect(function() selectedPlayer = nil selectedRoot = nil infoLabel.Text = "Target: None" distanceLabel.Text = "Distance: --" directionLabel.Text = "Direction: --" statusLabel.Text = "Status: Idle" end) hideButton.MouseButton1Click:Connect(function() mainFrame.Visible = false smallButton.Visible = true end) smallButton.MouseButton1Click:Connect(function() mainFrame.Visible = true smallButton.Visible = false end) closeButton.MouseButton1Click:Connect(function() screenGui:Destroy() end) Players.PlayerAdded:Connect(function() task.wait(0.2) rebuildPlayerList() end) Players.PlayerRemoving:Connect(function(plr) if selectedPlayer == plr then selectedPlayer = nil selectedRoot = nil end task.wait(0.2) rebuildPlayerList() end) task.spawn(function() while screenGui.Parent do updateCharacter() if tracking then if not selectedPlayer or not selectedPlayer.Parent then local nearest = getNearestPlayer() if nearest then selectedPlayer = nearest selectedRoot = getRootFromPlayer(nearest) end else selectedRoot = getRootFromPlayer(selectedPlayer) end if selectedPlayer and selectedRoot and humanoidRootPart then local dist = (selectedRoot.Position - humanoidRootPart.Position).Magnitude infoLabel.Text = "Target: " .. selectedPlayer.Name distanceLabel.Text = "Distance: " .. string.format("%.1f", dist) directionLabel.Text = "Direction: " .. getDirectionText(selectedRoot.Position) statusLabel.Text = "Status: Tracking " .. selectedPlayer.Name else infoLabel.Text = "Target: None" distanceLabel.Text = "Distance: --" directionLabel.Text = "Direction: --" statusLabel.Text = "Status: Waiting for target..." end end task.wait(updateRate) end end) rebuildPlayerList() -- Draggable for mobile and PC local function makeDraggable(guiObject) local dragging = false local dragInput local dragStart local startPos guiObject.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = guiObject.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) guiObject.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 local delta = input.Position - dragStart guiObject.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) end makeDraggable(mainFrame) makeDraggable(smallButton)