local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local Mouse = LocalPlayer:GetMouse() local FONT = Enum.Font.SourceSans local MAX_PLAYERS = Players.MaxPlayers local function formatSmart(n) local rounded = math.round(n) if math.abs(n - rounded) < 1e-9 then return tostring(rounded) end return string.format("%.2f", n) end local function formatGravity(n) return string.format("%.2f", n) end local function formatPing(n) return tostring(math.max(0, math.round(n))) end local function formatFps(n) return string.format("%.1f", n) end local function createLabel(adornee, size, offset) local gui = Instance.new("BillboardGui") gui.Name = "StatLabel" gui.Size = size gui.StudsOffset = offset gui.AlwaysOnTop = true gui.LightInfluence = 0 gui.MaxDistance = 1000 gui.Adornee = adornee gui.Parent = adornee.Parent local label = Instance.new("TextLabel") label.Size = UDim2.fromScale(1, 1) label.BackgroundTransparency = 1 label.BorderSizePixel = 0 label.TextScaled = true label.Font = FONT label.TextSize = 18 label.TextColor3 = Color3.new(1, 1, 1) label.TextStrokeTransparency = 0 label.Parent = gui return gui, label end local function getPreciseState(humanoid, rootPart) if humanoid.Health <= 0 then return "Dead" end local state = humanoid:GetState() local grounded = humanoid.FloorMaterial ~= Enum.Material.Air local velocity = rootPart.AssemblyLinearVelocity local yVelocity = velocity.Y local horizontalVelocity = Vector3.new(velocity.X, 0, velocity.Z).Magnitude local moveMagnitude = humanoid.MoveDirection.Magnitude if humanoid.Sit then if state == Enum.HumanoidStateType.Seated then return "Seated" end return "Sitting" end if humanoid.PlatformStand then return "Physics" end if state == Enum.HumanoidStateType.Swimming then return "Swimming" end if state == Enum.HumanoidStateType.Climbing then return "Climbing" end if state == Enum.HumanoidStateType.Ragdoll then return "Ragdoll" end if state == Enum.HumanoidStateType.FallingDown then return "FallingDown" end if state == Enum.HumanoidStateType.GettingUp then return "GettingUp" end if state == Enum.HumanoidStateType.Jumping then return "Jumping" end if state == Enum.HumanoidStateType.Landed then return "Landed" end if state == Enum.HumanoidStateType.Freefall then if grounded then if moveMagnitude < 0.05 and horizontalVelocity < 0.1 and math.abs(yVelocity) < 1 then return "Idle" end return "Running" end if yVelocity > 1 then return "Jumping" end return "Freefall" end if state == Enum.HumanoidStateType.Running or state == Enum.HumanoidStateType.RunningNoPhysics then if grounded then if moveMagnitude < 0.05 and horizontalVelocity < 0.1 and math.abs(yVelocity) < 1 then return "Idle" end return "Running" end if yVelocity > 1 then return "Jumping" end return "Freefall" end if state == Enum.HumanoidStateType.Physics then return "Physics" end if state == Enum.HumanoidStateType.Dead then return "Dead" end return state.Name end local function getClientPingMs() local ok, ping = pcall(function() return LocalPlayer:GetNetworkPing() end) if ok and typeof(ping) == "number" then return ping * 1000 end return 0 end local function getPlayerText() local totalPlayers = #Players:GetPlayers() local friendCount = 0 for _, otherPlayer in ipairs(Players:GetPlayers()) do if otherPlayer ~= LocalPlayer then local ok, isFriend = pcall(function() return otherPlayer:IsFriendsWith(LocalPlayer.UserId) end) if ok and isFriend then friendCount += 1 end end end local currentPlayers = math.max(totalPlayers - friendCount, 0) if friendCount > 0 then return "Player: " .. tostring(currentPlayers) .. "+" .. tostring(friendCount) .. "/" .. tostring(MAX_PLAYERS) end return "Player: " .. tostring(currentPlayers) .. "/" .. tostring(MAX_PLAYERS) end local function setHidden(labels, hidden, alpha) local textTransparency = hidden and 1 or alpha local strokeTransparency = hidden and 1 or math.clamp(alpha + 0.15, 0, 1) for _, label in ipairs(labels) do label.TextTransparency = textTransparency label.TextStrokeTransparency = strokeTransparency end end local function attachStats(character) local humanoid = character:WaitForChild("Humanoid") local rootPart = character:WaitForChild("HumanoidRootPart") local torso = character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso") or rootPart local speedGui, speedLabel = createLabel(torso, UDim2.new(0, 108, 0, 22), Vector3.new(-4, 1.55, 0)) local jumpGui, jumpLabel = createLabel(torso, UDim2.new(0, 122, 0, 22), Vector3.new(4, 1.55, 0)) local stateGui, stateLabel = createLabel(torso, UDim2.new(0, 128, 0, 22), Vector3.new(-4, 0.5, 0)) local playersGui, playersLabel = createLabel(torso, UDim2.new(0, 128, 0, 22), Vector3.new(4, 0.5, 0)) local pingGui, pingLabel = createLabel(torso, UDim2.new(0, 128, 0, 22), Vector3.new(-4, -0.5, 0)) local fpsGui, fpsLabel = createLabel(torso, UDim2.new(0, 128, 0, 22), Vector3.new(4, -0.5, 0)) local alive = true local hidden = false local speedSample = 0 local fpsValue = 0 local fpsFrames = 0 local fpsElapsed = 0 local connections = {} local function disconnectAll() for _, connection in ipairs(connections) do if connection.Connected then connection:Disconnect() end end end local function destroyAll() if speedGui then speedGui:Destroy() end if jumpGui then jumpGui:Destroy() end if stateGui then stateGui:Destroy() end if playersGui then playersGui:Destroy() end if pingGui then pingGui:Destroy() end if fpsGui then fpsGui:Destroy() end end local function stop() if not alive then return end alive = false disconnectAll() destroyAll() end table.insert(connections, humanoid.Died:Connect(stop)) table.insert(connections, Mouse.Button1Down:Connect(function() if not alive or humanoid.Health <= 0 or not character.Parent then return end if Mouse.Target == torso then hidden = not hidden end end)) task.spawn(function() local previousPosition = rootPart.Position while alive and humanoid.Health > 0 and character.Parent do local currentPosition = rootPart.Position speedSample = (currentPosition - previousPosition).Magnitude previousPosition = currentPosition task.wait(1) end end) table.insert(connections, RunService.RenderStepped:Connect(function(dt) if not alive then return end if not character.Parent or humanoid.Health <= 0 then stop() return end local camera = Workspace.CurrentCamera if not camera then return end fpsFrames += 1 fpsElapsed += dt if fpsElapsed >= 1 then fpsValue = fpsFrames / fpsElapsed fpsFrames = 0 fpsElapsed = 0 end local state = getPreciseState(humanoid, rootPart) local pingMs = getClientPingMs() local currentPos = rootPart.Position local distanceAlpha = math.clamp(((camera.CFrame.Position - currentPos).Magnitude - 12) / 28, 0, 1) speedLabel.Text = "Speed: " .. formatSmart(humanoid.WalkSpeed) .. " (" .. formatSmart(speedSample) .. ")" jumpLabel.Text = "Jump: " .. formatSmart(humanoid.UseJumpPower and humanoid.JumpPower or humanoid.JumpHeight) .. " (" .. formatGravity(Workspace.Gravity) .. ")" stateLabel.Text = "State: " .. state playersLabel.Text = getPlayerText() pingLabel.Text = "Ping: " .. formatPing(pingMs) .. " ms" fpsLabel.Text = "FPS: " .. formatFps(fpsValue) setHidden({ speedLabel, jumpLabel, stateLabel, playersLabel, pingLabel, fpsLabel, }, hidden, distanceAlpha) end)) end LocalPlayer.CharacterAdded:Connect(attachStats) if LocalPlayer.Character then attachStats(LocalPlayer.Character) end