-- LocalScript in StarterPlayerScripts local Players = game:GetService("Players") local RunService = game:GetService("RunService") local player = Players.LocalPlayer -- Wait for character and parts local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local rootPart = character:WaitForChild("HumanoidRootPart") -- Wait until character is likely grounded repeat task.wait() until rootPart.Velocity.Magnitude < 1 -- Freeze movement humanoid.PlatformStand = true -- Settings local amplitude = 10 -- height local speed = 10 -- bounce speed local startPosition = rootPart.Position -- should now be correct -- Bouncing RunService.RenderStepped:Connect(function() if rootPart and rootPart.Parent then local bounceY = math.sin(tick() * speed) * amplitude local newPosition = Vector3.new(startPosition.X, startPosition.Y + bounceY, startPosition.Z) rootPart.Velocity = Vector3.zero rootPart.RotVelocity = Vector3.zero rootPart.CFrame = CFrame.new(newPosition) end end)