void Update()
    {
        if (!ball)
        {
            return;
        }

        var mousePosition = Input.mousePosition;

        if (Input.GetButtonDown("Fire3"))
        {
            mousePosition.z = mainCamera.transform.position.y;
            ball.CheatJumpTo(mainCamera.ScreenToWorldPoint(mousePosition));
        }
        else if (Input.GetButtonDown("Fire1"))
        {
            if (_holding)
            {
                mousePosition.z = mainCamera.transform.position.y;
                hover           = mainCamera.ScreenToWorldPoint(mousePosition);
                _holding        = false;
                ball.PlanTrajectory(hover, holdingTime);
                GetComponentInChildren <PlayerController>().disableScroll = false;
                hud.AddShot();
                if (ball.inOrbitAround)
                {
                    var distance = Helper.DistanceToFillFrustum(GetComponentInChildren <PlayerController>().playerCamera, Vector2.one * (ball.inOrbitAround.radiusGravity * 2));
                    GetComponentInChildren <SmoothCamera>().SetZoomTarget(distance);
                }
                ball.SubmitPlan();
            }
            else
            {
                _holding    = true;
                holdingTime = 0;
                ball.StartPlanning();
                if (ball.velocity.sqrMagnitude == 0)
                {
                    holdingTime = 5f;
                }
                if (ball.inOrbitAround || ball.velocity.sqrMagnitude == 0)
                {
                    GetComponentInChildren <SmoothCamera>().SetZoomTarget(100);
                }
                else
                {
                    GetComponentInChildren <SmoothCamera>().SetZoomTarget(Math.Min(100 * ball.velocity.magnitude / 15, 140));
                }
                GetComponentInChildren <PlayerController>().disableScroll = true;
            }
        }
        else if (_holding)
        {
            // holdingTime += Time.deltaTime;
            mousePosition.z = mainCamera.transform.position.y;
            hover           = mainCamera.ScreenToWorldPoint(mousePosition);
            hover.y         = 0;

            var vv = ball.velocity.magnitude;
            // holdingTime += Input.mouseScrollDelta.y * Time.deltaTime * (vv == 0 ? 10 : vv);
            holdingTime += (float)Math.Round(Input.mouseScrollDelta.y * Time.deltaTime * (vv == 0 ? 10 : vv) / 5, 2);
        }

        if (Input.GetButtonDown("Fire2"))
        {
            if (ball.HasPlan()) // Abort with R-Click
            {
                ball.ScrapPlan();
                _holding = false;
                GetComponentInChildren <PlayerController>().disableScroll = false;
            }
            else
            {
                ball.EngangeBrakes();
            }
        }

        if (Input.GetButtonDown("BackSpace"))
        {
            ball.ScrapPlan();
            _holding = false;
            ball.Revive();
        }

        if (_holding)
        {
            ball.PlanTrajectory(hover, holdingTime);
        }
    }