I create a ball that is supposed to rotate the player at 90 deg per second and it works fine when the player spawns but when the player starts to move the ball starts getting farther away from the player.

Local

local RS = game:GetService("RunService")
local RepStore = game:GetService("ReplicatedStorage")
local rotatePart = RepStore:WaitForChild("RotatePart_E")

function rotatePoint(point, center, angle)
	angle = angle * (math.pi / 180) -- Convert to radians
	local rotX = math.cos(angle) * (point.x - center.x) - math.sin(angle) * (point.z - center.z) + center.x
	local rotZ = math.sin(angle) * (point.x - center.x) + math.cos(angle) * (point.z - center.z) + center.z
	
	return {rotX, rotZ}
end


rotatePart.OnClientEvent:Connect(function(center, ball)
	RS.RenderStepped:Connect(function(delta)
		local rotateBy = 90 * delta
		
		local ballPosition = {x = ball.Position.X, z = ball.Position.Z}
		local centerPosition = {x = center.Position.X, z = center.Position.Z}
		
		-- Update position
		local rotatedPosition = rotatePoint(
			ballPosition,
			centerPosition,
			rotateBy
		)
		
		ball.Position = Vector3.new(
			rotatedPosition[1],
			center.Position.Y,
			rotatedPosition[2]
		)
	end)
end)

Server

local RepStor = game:GetService("ReplicatedStorage")
local rotatePart = Instance.new("RemoteEvent")
rotatePart.Name = "RotatePart_E"
rotatePart.Parent = RepStor

game.Players.PlayerAdded:Connect(function(plr)
	-- local center = workspace:WaitForChild("CenterPart")
	local char = workspace:WaitForChild(plr.Name)
	local center = char:FindFirstChild("HumanoidRootPart")
	
	local ball = Instance.new("Part")
	ball.Parent = center
	ball.Shape = "Ball"
	ball.Anchored = true
	ball.CanCollide = false
	ball.BrickColor = BrickColor.new("Really red")
	ball.Size = Vector3.new(1, 1, 1)
	ball.Position = Vector3.new(
		center.Position.X + 3, 
		center.Position.Y, 
		center.Position.Z + 3
	)
	
	rotatePart:FireClient(plr, center, ball)
end)