Server Pos Checker
Key RequiredUniversal

Server Pos Checker

Universal Scriptwumpawumpa 694 views 998 executesUpdated Sep 28, 2026
5.0/ 5(2 votes)
20100% Positive
Lua Script•393 lines (11482 chars)
-- server position shower from client
-- i recommend using it 3-5 times and getting a ms that isnt constantly changing
-- for example 500 and then 502 or 550 on the next test is fine but 500 to 600 or 400 is bad
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local Stats = game:GetService("Stats")
local CoreGui = game:GetService("CoreGui")

local LocalPlayer = Players.LocalPlayer
local mouse = LocalPlayer:GetMouse()

-- Variables
local showingGhost = false
local ghostClone = nil
local positionHistory = {} -- Stores past positions and timestamps
local baseDelayOffset = 0 -- Manual delay offset (seconds)
local calculatedPhysicsPing = 0 -- Total round-trip from the tool

-- GUI Setup
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "ServerGhostGUI"
ScreenGui.ResetOnSpawn = false

local success, uiParent = pcall(function() return gethui() or CoreGui end)
if not success then uiParent = LocalPlayer:WaitForChild("PlayerGui") end
ScreenGui.Parent = uiParent

local MainFrame = Instance.new("Frame")
MainFrame.Size = UDim2.new(0, 200, 0, 190)
MainFrame.Position = UDim2.new(0.5, -100, 0.5, -95)
MainFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
MainFrame.BorderSizePixel = 0
MainFrame.Parent = ScreenGui

local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0, 8)
UICorner.Parent = MainFrame

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, 0, 0, 30)
Title.BackgroundTransparency = 1
Title.Text = "Server Ghost"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 14
Title.Parent = MainFrame

-- Delay Offset Input
local DelayBox = Instance.new("TextBox")
DelayBox.Size = UDim2.new(0.9, 0, 0, 30)
DelayBox.Position = UDim2.new(0.05, 0, 0, 40)
DelayBox.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
DelayBox.TextColor3 = Color3.fromRGB(255, 255, 255)
DelayBox.PlaceholderText = "Manual Offset (e.g. 0)"
DelayBox.Text = "0"
DelayBox.Font = Enum.Font.Gotham
DelayBox.TextSize = 14
DelayBox.Parent = MainFrame

-- Ghost Toggle Button
local GhostButton = Instance.new("TextButton")
GhostButton.Size = UDim2.new(0.9, 0, 0, 35)
GhostButton.Position = UDim2.new(0.05, 0, 0, 85)
GhostButton.BackgroundColor3 = Color3.fromRGB(0, 150, 255)
GhostButton.TextColor3 = Color3.fromRGB(255, 255, 255)
GhostButton.Text = "Show Server Ghost"
GhostButton.Font = Enum.Font.GothamBold
GhostButton.TextSize = 14
GhostButton.Parent = MainFrame

-- Ping Checker Button
local PingButton = Instance.new("TextButton")
PingButton.Size = UDim2.new(0.9, 0, 0, 35)
PingButton.Position = UDim2.new(0.05, 0, 0, 135)
PingButton.BackgroundColor3 = Color3.fromRGB(255, 100, 100)
PingButton.TextColor3 = Color3.fromRGB(255, 255, 255)
PingButton.Text = "Get Ping Tool"
PingButton.Font = Enum.Font.GothamBold
PingButton.TextSize = 14
PingButton.Parent = MainFrame

-- Make GUI Draggable
local dragging, dragInput, dragStart, startPos
MainFrame.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 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)
MainFrame.InputChanged:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseMovement then dragInput = input end
end)
UserInputService.InputChanged:Connect(function(input)
	if input == dragInput and dragging then
		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
end)

-- Update Offset manually
DelayBox.FocusLost:Connect(function()
	local val = tonumber(DelayBox.Text)
	if val then
		baseDelayOffset = val
	else
		DelayBox.Text = tostring(baseDelayOffset)
	end
end)

-- Safely get Network Ping actively
local function getNetworkPing()
	local activePing = 0
	local success, result = pcall(function()
		local label = CoreGui.RobloxGui.PerformanceStats:GetChildren()[6].StatsMiniTextPanelClass.ValueLabel
		return label.Text
	end)
	if success and type(result) == "string" then
		local numStr = string.match(result, "[%d%.]+")
		if numStr then return tonumber(numStr) end
	end
	
	local statSuccess, statResult = pcall(function()
		return Stats.Network.ServerStatsItem["Data Ping"]:GetValue()
	end)
	if statSuccess and type(statResult) == "number" then
		return statResult
	end
	
	return activePing
end

-- Create Ghost Function
local function createGhost()
	if ghostClone then ghostClone:Destroy() end
	local char = LocalPlayer.Character
	if not char then return end

	char.Archivable = true
	local clone = char:Clone()
	char.Archivable = false
	
	clone.Name = "ServerGhost"
	-- Fixes the sinking bug by explicitly locking the center of the model to the HRP
	clone.PrimaryPart = clone:FindFirstChild("HumanoidRootPart")
	
	for _, v in ipairs(clone:GetDescendants()) do
		if v:IsA("Script") or v:IsA("LocalScript") then
			v:Destroy()
		elseif v:IsA("BasePart") then
			-- Strip completely of physics
			v.CanCollide = false
			v.CanTouch = false 
			v.CanQuery = false
			v.Massless = true
			v.Anchored = true
			v.Material = Enum.Material.ForceField
			v.Color = Color3.fromRGB(0, 255, 255) -- Cyan color
			v.CastShadow = false
			if v.Name == "HumanoidRootPart" then
				v.Transparency = 1
			else
				v.Transparency = 0
			end
		elseif v:IsA("Decal") or v:IsA("Texture") then
			v:Destroy()
		end
	end
	
	-- Paralyze the ghost's Humanoid so it doesn't force collision states
	local hum = clone:FindFirstChild("Humanoid")
	if hum then
		hum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
		hum.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOff
		hum.PlatformStand = true
		for _, state in pairs(Enum.HumanoidStateType:GetEnumItems()) do
			pcall(function() hum:SetStateEnabled(state, false) end)
		end
	end
	
	clone.Parent = workspace
	ghostClone = clone
end

-- Toggle Logic
GhostButton.MouseButton1Click:Connect(function()
	showingGhost = not showingGhost
	if showingGhost then
		createGhost()
		GhostButton.Text = "Hide Server Ghost"
		GhostButton.BackgroundColor3 = Color3.fromRGB(255, 50, 50)
	else
		if ghostClone then
			ghostClone:Destroy()
			ghostClone = nil
		end
		GhostButton.Text = "Show Server Ghost"
		GhostButton.BackgroundColor3 = Color3.fromRGB(0, 150, 255)
		Title.Text = "Server Ghost"
	end
end)

-- Re-create ghost if character respawns while enabled
LocalPlayer.CharacterAdded:Connect(function()
	positionHistory = {} -- clear history
	if showingGhost then
		task.wait(0.5)
		createGhost()
	end
end)

-- Loop: Record History & Update Ghost
RunService.Heartbeat:Connect(function()
	local char = LocalPlayer.Character
	local hrp = char and char:FindFirstChild("HumanoidRootPart")
	if not hrp then return end

	-- 1. Log Current Position
	table.insert(positionHistory, {
		t = os.clock(),
		cf = hrp.CFrame
	})

	-- 2. Clean up history older than 3 seconds (prevent memory leaks)
	while #positionHistory > 0 and (os.clock() - positionHistory[1].t) > 3 do
		table.remove(positionHistory, 1)
	end

	-- 3. Update Ghost if toggled
	if showingGhost and ghostClone and ghostClone.PrimaryPart then
		
		-- OVERRIDE ENFORCER: Absolutely ensure Roblox didn't turn collisions back on
		for _, v in ipairs(ghostClone:GetDescendants()) do
			if v:IsA("BasePart") and v.CanCollide then
				v.CanCollide = false
			end
		end

		local currentNetPing = getNetworkPing()
		local delayMs = currentNetPing -- Default to raw network ping
		
		-- Use our Physics test minus Network ping if available
		if calculatedPhysicsPing > 0 then
			delayMs = math.max(0, calculatedPhysicsPing - currentNetPing)
		end
		
		Title.Text = string.format("Delaying by %dms", delayMs)
		
		-- Target time we want to show (current time minus delay)
		local targetDelaySeconds = (delayMs / 1000) + baseDelayOffset
		local targetTime = os.clock() - targetDelaySeconds
		
		local targetCFrame = hrp.CFrame
		
		-- Interpolate to find exact CFrame in the past
		if #positionHistory >= 2 then
			for i = #positionHistory, 2, -1 do
				local current = positionHistory[i]
				local previous = positionHistory[i-1]
				
				if current.t >= targetTime and previous.t <= targetTime then
					local alpha = (targetTime - previous.t) / (current.t - previous.t)
					targetCFrame = previous.cf:Lerp(current.cf, alpha)
					break
				elseif i == 2 and targetTime < previous.t then
					targetCFrame = previous.cf
				end
			end
		end
		
		-- Pivot directly to the calculated CFrame (safe from ground-sinking due to PrimaryPart lock)
		ghostClone:PivotTo(targetCFrame)
	end
end)

-- Ping Checker Script Implementation
PingButton.MouseButton1Click:Connect(function()
	if LocalPlayer.Backpack:FindFirstChild("PingCheck") then 
		PingButton.Text = "Already have Tool!"
		task.wait(1)
		PingButton.Text = "Get Ping Tool"
		return 
	end
	
	local tool = Instance.new("Tool")
	tool.Name = "PingCheck"
	tool.RequiresHandle = false
	tool.Parent = LocalPlayer.Backpack

	local function getHRP(p)
		local c = p and p.Character
		return c and c:FindFirstChild("HumanoidRootPart")
	end

	local function noCollide(c)
		for _, d in ipairs(c:GetDescendants()) do
			if d:IsA("BasePart") then d.CanCollide = false end
		end
	end

	local function slide(part, goal, dur)
		local tw = TweenService:Create(part, TweenInfo.new(dur, Enum.EasingStyle.Linear), { CFrame = goal })
		tw:Play()
		tw.Completed:Wait()
	end

	local function run(target)
		local th = getHRP(target)
		local mh = getHRP(LocalPlayer)
		if not th or not mh then return end

		noCollide(LocalPlayer.Character)
		task.wait(0.2)

		local last = th.Position
		local still = 0
		while still < 30 do
			RunService.Heartbeat:Wait()
			th = getHRP(target) or th
			local p = th.Position
			if (p - last).Magnitude > 0.15 then still = 0 else still += 1 end
			last = p
		end

		mh = getHRP(LocalPlayer) or mh
		th = getHRP(target) or th
		slide(mh, th.CFrame * CFrame.new(0, 0, 10), 1.2)
		task.wait(0.5)

		local t0 = nil
		local p0 = nil
		local moved = false
		local ms = 0
		local done = false
		local endT = nil

		task.spawn(function()
			local m = getHRP(LocalPlayer) or mh
			local t = getHRP(target) or th
			slide(m, t.CFrame * CFrame.new(0, 0, -10), 1.2)
			done = true
			endT = os.clock()
		end)

		while not moved do
			RunService.Heartbeat:Wait()
			mh = getHRP(LocalPlayer) or mh
			th = getHRP(target) or th

			if not t0 then
				if (mh.Position - th.Position).Magnitude <= 3 then
					t0 = os.clock()
					p0 = th.Position
				elseif done and endT and (os.clock() - endT) > 5 then
					break
				end
			else
				ms = (os.clock() - t0) * 1000
				if (th.Position - p0).Magnitude > 0.05 then
					moved = true
				elseif ms > 5000 then
					break
				end
			end
		end

		if moved then
			print(string.format("Calculated Physics Ping: %.6f ms", ms))
			-- Sync it with the ghost script
			calculatedPhysicsPing = ms 
		end
	end

	tool.Activated:Connect(function()
		local hit = mouse.Target
		if not hit then return end
		local model = hit:FindFirstAncestorOfClass("Model")
		if not model then return end
		local plr = Players:GetPlayerFromCharacter(model)
		if plr and plr ~= LocalPlayer then
			run(plr)
		end
	end)
	
	PingButton.Text = "Tool Given!"
	task.wait(1)
	PingButton.Text = "Get Ping Tool"
end)

Features & Information

hey guys welcome back to another script in todays script i got a banger for yall its ai paste of my last one it basically lets u accurately check ur server position ik i used ai but its not that bad to use ik ai scripts usually feel like shit to use but its super basic so it works fine ui isnt that bad

Community Comments (4)

so uh? It checks ur server position? What's the purpose of- no. why would someone want that?

Replying to @ppppppppppppppppppp
wumpawumpaSep 30, 2026

@ppppppppppppppppppp i use it for prediction it can help in some aimbots and most visual or welding scripts or just advantage of knowing where others see u also stop using reddit grammar noone uses . or - like son sybau

Replying to @wumpa

Chill broskito just asking

Replying to @ppppppppppppppppppp
wumpawumpaOct 1, 2026

@ppppppppppppppppppp ok

More Scripts for Universal Scripts