Carry an Egg System

I’m trying to make something similar to the carry an egg game where an egg bounces around
in a tray. I’m just doing a ball for testing.
Current problems: Watch 2025-02-16 10-14-23 | Streamable

Right now the ball bounces around and when it hits the side of the tray,
it flings the player. I’m trying to limit the y axis movement so when the player spins around, the ball bounces around but ONLY on the x and z axis and the ball only goes up with the tray when the player jumps.

I’ve tried a lot of what people have said, using a vector foce causes the player to get pushed back. I can’t use stuff like welds cause then the ball can’t roll around. I’ve tried a plane constraint but then the ball moves really weird and it still pushes the player.

This is using the plane constraint: Watch 2025-02-16 10-19-53 | Streamable
The y axis is good but the ball pushes the player



game.Players.PlayerAdded:Connect(function(plr)
	
	local char = plr.Character or plr.CharacterAdded:Wait()
	local humanoid = char.Humanoid
	humanoid.WalkSpeed = 0
	task.wait(.5)
	local animation = Instance.new("Animation")
	animation.AnimationId = "rbxassetid://117802467595811"
	
	local holdTray = humanoid:LoadAnimation(animation)
	
	holdTray:Play()
	task.wait(.25)
	holdTray:AdjustSpeed(0)
	task.wait(.15)
	
	local tray = game.Workspace.Tray:Clone()
	tray.Name = 'trayRuntime'
	tray.Parent = char
	
	local weld = Instance.new("Weld")
	weld.Part0 =  tray
	weld.Part1 = char:FindFirstChild("HumanoidRootPart")
	print("Before weld:", tray.Position)
	weld.C0 = CFrame.new(2.5, -.5, 0) * CFrame.Angles(0, math.rad(90), 0) 
	weld.Parent = tray

	local ball = game.Workspace.Default:Clone()
	ball.Name = 'bombRuntime'

	ball.Parent = workspace
	ball:SetNetworkOwner(game.Players:GetPlayers()[1])

	ball:PivotTo(tray.CFrame * CFrame.new(0, .5, 0))


	humanoid.WalkSpeed = 16

end)


-- plane constraint code
--local plane = Instance.new("PlaneConstraint")
--local att = Instance.new("Attachment")
--att.Orientation = Vector3.new(0,0,90)
--att.Parent = tray

--local att1 = Instance.new("Attachment", ball)
--plane.Attachment0 = att
--plane.Attachment1 = att1
--plane.Parent = tray

As you can see all i do is play an animation and weld the tray to the humanoid root part.
I’ve tried root priority, massless, density. If anyone could help that would be amazing!