--[[ Universal Player Info ESP Script for Roblox Works with any injector (Synapse X, Krnl, ScriptWare, etc.) Displays detailed information above all players' heads Includes custom team/group support ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Camera = workspace.CurrentCamera local LocalPlayer = Players.LocalPlayer -- Configuration local Settings = { Enabled = true, ShowName = true, ShowPosition = true, ShowTool = true, ShowHealth = true, ShowDistance = true, ShowTeam = true, -- NEW: Show team/group TextSize = 14, Font = Enum.Font.GothamBold, TextColor = Color3.fromRGB(255, 255, 255), OutlineColor = Color3.fromRGB(0, 0, 0), UpdateRate = 0.1, -- Team color settings UseTeamColors = true, -- Color text based on team DefaultTeamColor = Color3.fromRGB(255, 255, 255) } -- Store GUI elements local PlayerLabels = {} -- Custom team detection system local CustomTeams = {} -- Function to detect player's team/group (supports both native and custom systems) local function GetPlayerTeam(player) -- Check native Roblox team first if player.Team then return { Name = player.Team.Name, Color = player.Team.TeamColor and player.Team.TeamColor.Color or Settings.DefaultTeamColor, Type = "Native" } end -- Check for common group systems local character = player.Character if character then -- Check for group value in character local groupValue = character:FindFirstChild("Group") or character:FindFirstChild("Team") if groupValue and groupValue:IsA("StringValue") then return { Name = groupValue.Value, Color = Settings.DefaultTeamColor, Type = "Custom" } end -- Check for number-based team values local teamValue = character:FindFirstChild("TeamNumber") or character:FindFirstChild("GroupId") if teamValue and teamValue:IsA("NumberValue") then local teamNum = teamValue.Value -- Try to get custom team name from our registry if CustomTeams[teamNum] then return { Name = CustomTeams[teamNum].Name, Color = CustomTeams[teamNum].Color, Type = "Custom" } else return { Name = "Team " .. teamNum, Color = Settings.DefaultTeamColor, Type = "Custom" } end end end -- Check for leaderstats team local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local teamStat = leaderstats:FindFirstChild("Team") or leaderstats:FindFirstChild("Group") if teamStat and (teamStat:IsA("StringValue") or teamStat:IsA("NumberValue")) then if teamStat:IsA("StringValue") then return { Name = teamStat.Value, Color = Settings.DefaultTeamColor, Type = "Custom" } else return { Name = "Team " .. teamStat.Value, Color = Settings.DefaultTeamColor, Type = "Custom" } end end end -- Check for custom group system via attributes local success, groupName = pcall(function() return player:GetAttribute("Group") or player:GetAttribute("Team") or player:GetAttribute("Faction") end) if success and groupName then return { Name = groupName, Color = Settings.DefaultTeamColor, Type = "Custom" } end return nil -- No team found end -- Function to register custom teams (for game developers to use) local function RegisterCustomTeam(teamId, teamName, teamColor) CustomTeams[teamId] = { Name = teamName, Color = teamColor or Settings.DefaultTeamColor } end -- Example custom team registration (uncomment and modify for your game) --[[ RegisterCustomTeam(1, "Red Team", Color3.fromRGB(255, 50, 50)) RegisterCustomTeam(2, "Blue Team", Color3.fromRGB(50, 50, 255)) RegisterCustomTeam(3, "Green Team", Color3.fromRGB(50, 255, 50)) RegisterCustomTeam(4, "Yellow Team", Color3.fromRGB(255, 255, 50)) ]] -- Function to get team color for text local function GetTeamColor(player) if not Settings.UseTeamColors then return Settings.TextColor end local team = GetPlayerTeam(player) if team then return team.Color end return Settings.TextColor end -- Function to format team name with emoji local function FormatTeamName(team) if not team then return "" end local teamEmojis = { ["Red"] = "🔴", ["Blue"] = "🔵", ["Green"] = "🟢", ["Yellow"] = "🟡", ["Purple"] = "🟣", ["Orange"] = "🟠", ["Pink"] = "💗", ["Brown"] = "🟤" } local teamName = team.Name local emoji = "" -- Add emoji for common team names for name, icon in pairs(teamEmojis) do if teamName:find(name, 1, true) then emoji = icon .. " " break end end -- Add custom indicator based on team type if team.Type == "Native" then return emoji .. "🏆 " .. teamName elseif team.Type == "Custom" then return emoji .. "⚡ " .. teamName else return emoji .. teamName end end -- Function to get current tool in hand local function GetCurrentTool(player) local character = player.Character if not character then return "None" end local tool = character:FindFirstChildOfClass("Tool") if tool then return tool.Name end local hopperBin = character:FindFirstChildOfClass("HopperBin") if hopperBin then return hopperBin.Name end return "None" end -- Function to get player health local function GetPlayerHealth(player) local character = player.Character if not character then return 0 end local humanoid = character:FindFirstChildOfClass("Humanoid") if humanoid then return math.floor(humanoid.Health) end return 0 end -- Function to format position local function FormatPosition(position) return string.format("X: %.0f Y: %.0f Z: %.0f", position.X, position.Y, position.Z) end -- Function to calculate distance local function GetDistance(position) local cameraPos = Camera.CFrame.Position return math.floor((position - cameraPos).Magnitude) end -- Function to create or update label for a player local function UpdatePlayerLabel(player) if not Settings.Enabled then return end -- Skip local player if player == LocalPlayer then return end local character = player.Character if not character or not character:FindFirstChild("HumanoidRootPart") then -- Remove label if player doesn't have character if PlayerLabels[player] then PlayerLabels[player]:Destroy() PlayerLabels[player] = nil end return end -- Get player info local name = player.Name local position = character.HumanoidRootPart.Position local tool = GetCurrentTool(player) local health = GetPlayerHealth(player) local distance = GetDistance(position) local formattedPos = FormatPosition(position) local team = GetPlayerTeam(player) -- Build info text local infoText = {} if Settings.ShowName then table.insert(infoText, name) end if Settings.ShowTeam and team then local teamFormatted = FormatTeamName(team) table.insert(infoText, "[" .. teamFormatted .. "]") end if Settings.ShowHealth then table.insert(infoText, string.format("❤️ %d HP", health)) end if Settings.ShowPosition then table.insert(infoText, string.format("📍 %s", formattedPos)) end if Settings.ShowTool then table.insert(infoText, string.format("🔧 %s", tool)) end if Settings.ShowDistance then table.insert(infoText, string.format("📏 %d studs", distance)) end local fullText = table.concat(infoText, " | ") -- Determine text color based on team local textColor = GetTeamColor(player) -- Create or update BillboardGui if not PlayerLabels[player] then local billboardGui = Instance.new("BillboardGui") billboardGui.Adornee = character:FindFirstChild("HumanoidRootPart") billboardGui.Size = UDim2.new(0, 500, 0, 60) billboardGui.StudsOffset = Vector3.new(0, 2.5, 0) billboardGui.AlwaysOnTop = true billboardGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling local textLabel = Instance.new("TextLabel") textLabel.Size = UDim2.new(1, 0, 1, 0) textLabel.BackgroundTransparency = 1 textLabel.TextScaled = false textLabel.TextSize = Settings.TextSize textLabel.Font = Settings.Font textLabel.TextColor3 = textColor textLabel.TextStrokeTransparency = 0 textLabel.TextStrokeColor3 = Settings.OutlineColor textLabel.Text = fullText textLabel.Parent = billboardGui billboardGui.Parent = character PlayerLabels[player] = { Gui = billboardGui, Label = textLabel, CurrentTeam = team } else -- Update existing label PlayerLabels[player].Label.Text = fullText PlayerLabels[player].Label.TextColor3 = textColor -- Update team info if changed if team and (not PlayerLabels[player].CurrentTeam or PlayerLabels[player].CurrentTeam.Name ~= team.Name) then PlayerLabels[player].CurrentTeam = team end end end -- Function to remove all labels local function ClearAllLabels() for player, data in pairs(PlayerLabels) do if data and data.Gui then data.Gui:Destroy() end end PlayerLabels = {} end -- Function to update all players local function UpdateAllPlayers() if not Settings.Enabled then ClearAllLabels() return end for _, player in ipairs(Players:GetPlayers()) do UpdatePlayerLabel(player) end end -- Handle player added local function OnPlayerAdded(player) player.CharacterAdded:Connect(function() task.wait(0.5) -- Wait for character to fully load UpdatePlayerLabel(player) end) player.CharacterRemoving:Connect(function() if PlayerLabels[player] then PlayerLabels[player].Gui:Destroy() PlayerLabels[player] = nil end end) -- Listen for team changes (for native Roblox teams) if player.Team then local teamConnection teamConnection = player:GetPropertyChangedSignal("Team"):Connect(function() UpdatePlayerLabel(player) end) -- Store connection for cleanup if not player._teamConnection then player._teamConnection = teamConnection end end end -- Handle player removed local function OnPlayerRemoved(player) if PlayerLabels[player] then PlayerLabels[player].Gui:Destroy() PlayerLabels[player] = nil end end -- Setup GUI controls (toggle with Insert key) local function SetupControls() local userInputService = game:GetService("UserInputService") userInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.KeyCode == Enum.KeyCode.Insert then Settings.Enabled = not Settings.Enabled if Settings.Enabled then UpdateAllPlayers() print("[ESP] Enabled") else ClearAllLabels() print("[ESP] Disabled") end end -- Add more controls if input.KeyCode == Enum.KeyCode.RightControl then -- Toggle team colors Settings.UseTeamColors = not Settings.UseTeamColors print("[ESP] Team colors: " .. tostring(Settings.UseTeamColors)) UpdateAllPlayers() end end) end -- Main loop for continuous updates local function StartUpdateLoop() task.spawn(function() while true do if Settings.Enabled then UpdateAllPlayers() end task.wait(Settings.UpdateRate) end end) end -- Initialize ESP local function Initialize() -- Clear any existing labels ClearAllLabels() -- Setup players for _, player in ipairs(Players:GetPlayers()) do OnPlayerAdded(player) end -- Connect events Players.PlayerAdded:Connect(OnPlayerAdded) Players.PlayerRemoving:Connect(OnPlayerRemoved) -- Setup controls SetupControls() -- Start update loop StartUpdateLoop() print("[ESP] Script loaded successfully") print("[ESP] Press INSERT to toggle ESP on/off") print("[ESP] Press RIGHT CONTROL to toggle team colors") print("[ESP] Team detection supports native and custom systems") -- Export functions for custom team registration _G.RegisterCustomTeam = RegisterCustomTeam _G.ESP_Settings = Settings end -- Run the script Initialize()