// Update is called once per frame
    void FixedUpdate()
    {
        if (!stopUpdate && !disabled)
        {
            refreshTimer  -= Time.fixedDeltaTime;
            refreshTimer2 -= Time.fixedDeltaTime;
            if (vehicleScript != null)
            {
                if (vehicleScript.player)
                {
                    stopUpdate = true; //temp solution
                }
                else if (!vehicleScript.broken)
                {
                    {
                        Vector3 pos = transform.position + transform.up;

                        RaycastHit hit;

                        if (refreshTimer <= 0 && Physics.Raycast(pos, -transform.up, out hit, 1000f))//, 1 << LayerMask.NameToLayer("Road")))
                        {
                            if (hit.transform.GetComponent <LevelBlockInfo>() && hit.transform.GetComponent <LevelBlockInfo>() != curLBI)
                            {
                                curLBI      = hit.transform.GetComponent <LevelBlockInfo>();
                                curWaypoint = 0;
                                if (curLBI.Lanes != null)
                                {
                                    curLBIQueue = curLBI.Lanes[laneID];
                                }
                            }
                            else if (hit.transform.parent != null && hit.transform.parent.transform.GetComponent <LevelBlockInfo>() && hit.transform.parent.transform.GetComponent <LevelBlockInfo>() != curLBI)
                            {
                                curLBI      = hit.transform.parent.transform.GetComponent <LevelBlockInfo>();
                                curWaypoint = 0;
                                if (curLBI.Lanes != null)
                                {
                                    curLBIQueue = curLBI.Lanes[laneID];
                                }
                            }
                            else if (hit.transform.parent != null && hit.transform.parent.transform.parent != null && hit.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>() && hit.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>() != curLBI)
                            {
                                curLBI      = hit.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>();
                                curWaypoint = 0;
                                if (curLBI.Lanes != null)
                                {
                                    curLBIQueue = curLBI.Lanes[laneID];
                                }
                            }
                            else if (hit.transform.parent != null && hit.transform.parent.transform.parent != null && hit.transform.parent.transform.parent.transform.parent != null && hit.transform.parent.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>() && hit.transform.parent.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>() != curLBI)
                            {
                                curLBI      = hit.transform.parent.transform.parent.transform.parent.transform.GetComponent <LevelBlockInfo>();
                                curWaypoint = 0;
                                if (curLBI.Lanes != null)
                                {
                                    curLBIQueue = curLBI.Lanes[laneID];
                                }
                            }
                        }


                        if (refreshTimer2 <= 0 && Physics.Raycast(pos, transform.forward, out hit, dist, layerMask))
                        {
                            float distance = hit.distance;

                            if (distance <= 5)
                            {
                                // Mash dat break
                                breakForce = 10000f;
                                motor      = -1f;
                            }
                            else if (prevHitDistance >= distance)
                            {
                                // Getting close to something need to slow down
                                breakForce = 1850f;
                                motor      = 0f;
                            }
                            else
                            {
                                // Object in front of me is moving I can move
                                breakForce = 0f;
                                motor      = 1f;
                            }

                            prevHitDistance = distance;
                        }
                        else
                        {
                            // Open road just drive
                            motor      = 1f;
                            breakForce = 0f;
                        }

                        //input motor movement
                        vehicleScript.inputAccel(motor);

                        //lr movement based on waypoints
                        Vector3 target = Vector3.zero;
                        if (curLBIQueue != null && curLBIQueue.Count > curWaypoint && curLBIQueue[curWaypoint] != null)
                        {
                            target = curLBIQueue[curWaypoint].position;
                            Vector3 targetDir = (target - transform.position);


                            //input horizontal movement
                            vehicleScript.inputHorz(AngleDir(transform.forward, targetDir, transform.up));

                            if (DebugThis)
                            {
                                Debug.Log(" left or right " + AngleDir(transform.forward, targetDir, transform.up));
                            }

                            //update waypoints
                            if ((transform.position - target).magnitude < 4f)
                            {
                                curWaypoint++;
                            }
                        }
                        else
                        {
                            vehicleScript.inputHorz(0);
                        }

                        if (refreshTimer <= 0)
                        {
                            refreshTimer = refreshTimeSet;
                        }
                        if (refreshTimer2 <= 0)
                        {
                            refreshTimer2 = refreshTimeSet;
                        }
                    }
                }
            }
        }
    }
        // IMPORTANT: This should never be fixed update. Input always needs to be in normal update, or you constantly drop inputs.
        // TLDR: Use Update() for input and FixedUpdate() for motors/movement
        void Update()
        {
            if (comboBS == null && GameObject.Find("HUD") && GameObject.Find("HUD").GetComponent <ButtonScripts>())
            {
                //Debug.Log("found");
                comboBS = GameObject.Find("HUD").GetComponent <ButtonScripts>(); //.comboUpdate(comboTimer, comboTimeSet, comboMultiplier);
            }
            //Debug.Log("cm " + comboMultiplier);
            //combo stuff
            if (comboBS)
            {
                comboBS.comboUpdate(comboTimer, comboTimeSet, comboMultiplier);
            }

            if (curState != PlayerState.Rider)
            {
                foreach (GameObject go in GameObject.FindGameObjectsWithTag("VisibleWhenPlaying"))
                {
                    go.SetActive(false);
                }
            }

            //update vehicle or rider respectively, depending on state.
            switch (curState)
            {
            //process input for vehicle
            case PlayerState.Vehicle:

                //---------------------------------------------------------speed
                //Speedometer.ShowSpeed(curVehicle.transform.GetComponent<Rigidbody>().velocity.magnitude, 0, 100);

                //speed > boost threshold
                if (curVehicle.transform.GetComponent <Rigidbody>().velocity.magnitude > curVehicle.returnActualMaxSpeed() * selectedCharacter_Prefab.GetComponent <BasicRider>().boostThreshold)
                {
                    if (!prevBoostEffect)
                    {
                        prevBoostEffect = true;
                        curBoostEffect  = Instantiate(boostEffectPrefab, curVehicle.transform.position, curVehicle.transform.rotation);
                        //mainCamera.ChangeDistance(15, 2f);
                    }

                    curBoostEffect.transform.position = curVehicle.transform.position;
                    curBoostEffect.transform.rotation = curVehicle.transform.rotation;
                }
                else
                {
                    if (curBoostEffect != null)
                    {
                        prevBoostEffect = false;
                        //mainCamera.ChangeDistance(10f, 2f);
                        Destroy(curBoostEffect);
                    }
                }

                //---------------------------------------------------------sound
                if (curVehicle.GetComponent <AudioSource>().isPlaying == false)
                {
                    SoundScript.PlaySound(curVehicle.GetComponent <AudioSource>(), "Engine");
                }

                //-------------------------------------------------------input:
                //input horizontal movement
                curVehicle.inputHorz(InputManager.GetAxis("Horizontal"));

                float v_input = InputManager.GetAxis("Vertical") == 0 ? InputManager.GetAxis("Accelerate") : InputManager.GetAxis("Vertical");

                //Debug.Log("1 " + ((v_input / Mathf.Abs(v_input)) * 0.5f) + " 2 " + (v_input * 0.5f) + " 3 " + (((v_input / Mathf.Abs(v_input)) * 0.5f) + (v_input * 0.5f)));

                //(v_input == 0) ? 0.5f : v_input
                //input accelleration
                curVehicle.inputAccel(InputManager.GetAxis("Vertical") == 0 ? InputManager.GetAxis("Accelerate") : InputManager.GetAxis("Vertical"));

                //input vertical movement
                curVehicle.inputVert(InputManager.GetAxis("Vertical"));

                //input jump
                if (InputManager.GetButtonDown("Jump") || curVehicle.GetComponent <BasicVehicle>().broken || curVehicle.transform.position.y < floorPerson - 25)
                {
                    if (curVehicle.GetComponent <BasicVehicle>().broken)
                    {
                        prevBroken = true;
                        if (comboBS)
                        {
                            comboBS.comboEnd(comboMultiplier);
                        }
                        comboMultiplier = 0;
                        comboTimer      = 0;
                    }
                    else
                    {
                        prevBroken = false;
                    }

                    ExitVehicle();

                    break;
                }

                break;

            //process input for air movement
            case PlayerState.Rider:
                if (curRider.cashoutcombo)
                {
                    CashOutCombo();
                }

                //If player has died, whether by ragdolling or being lower than an arbitrary threshold provided by the variable deadFloor.
                if (curRider.checkRagdoll() != null || curRider.transform.position.y < floorPerson)
                {
                    if (Time.timeScale == 1)
                    {
                        SoundScript.PlaySound(playerSource, "Death");

                        if (comboBS)
                        {
                            comboBS.GameOver();
                        }

                        curState = PlayerState.Dead;

                        if (curRider.checkRagdoll() == null)
                        {
                            curRider.spawnRagdoll();
                        }
                        curRagdoll = curRider.checkRagdoll().transform.GetComponent <RagdollStorage>().rb;

                        mainCamera.ChangeFocus(curRagdoll.transform, -1);
                        //mainCamera.ChangeDistance(6f, 2f);
                        curRider.destroyThis();
                    }

                    //drop combo before cashing in for death
                    comboMultiplier = 0;
                    comboTimer      = 0;
                    if (comboBS)
                    {
                        comboBS.comboEnd(comboMultiplier);
                    }

                    break;
                }
                else
                {
                    //only countdown combo in air
                    if (comboTimer > 0)
                    {
                        comboTimer -= Time.deltaTime;
                        if (comboTimer <= 0)
                        {
                            if (comboBS)
                            {
                                comboBS.comboEnd(comboMultiplier);
                            }
                            comboTimer      = 0;
                            comboMultiplier = 0;
                        }
                    }

                    //ENTER VEHICLE
                    if (prevVehicleIntangibility > 0)
                    {
                        prevVehicleIntangibility -= Time.deltaTime;

                        if (curRider.curAbilityAmmo == 0 || curRider.rb.velocity.y <= -50)
                        {
                            prevVehicleIntangibility = 0;
                        }
                        if (prevVehicleIntangibility < 0)
                        {
                            prevVehicleIntangibility = 0;
                        }
                    }
                    //maybe ut this back curRider.vehicleToEnter().gameObject != prevVehicle ||
                    if (curRider.vehicleToEnter() != null && curState != PlayerState.Dead && (prevVehicleIntangibility <= 0 || curRider.vehicleToEnter().gameObject != prevVehicle))
                    {
                        EnterVehicle(curRider.vehicleToEnter());
                        //if(curRider.veh)
                        //curState != PlayerState.Dead && (newVehicle.gameObject != prevVehicle || (newVehicle.easyCheckWheelsOnGround() && newVehicle.getGravity() == Vector3.down) || prevVehicleIntangibility <= 0)
                        break;
                    }
                    else
                    {
                        curRider.rejectVehicleToEnter();
                    }

                    //ambience
                    if (curRider)
                    {
                        ambientSource.volume = 0;    //forever.S curRider.GetComponent<Rigidbody>().velocity.magnitude / 100;
                    }

                    //win
                    if (!win && curRider.goalCollider.collidersCount() > 0)
                    {
                        win = true;

                        if (comboBS && comboMultiplier != 0)
                        {
                            comboBS.comboEnd(comboMultiplier);
                        }
                        comboMultiplier = 0;
                        comboTimer      = 0;

                        GameObject.FindGameObjectWithTag("HUD").GetComponent <timerScript>().setWin();


                        curRider.goalCollider.returnColliders()[0].transform.root.Find("shatter1").gameObject.SetActive(true);
                        curRider.goalCollider.returnColliders()[0].gameObject.SetActive(false);
                        curState = PlayerState.Win;
                        mainCamera.ChangeFocus(curRider.transform, 1);
                        mainCamera.SetCameraPosition(curRider.transform.position + curRider.transform.forward * 1.3f + curRider.transform.up * 1.1f);

                        //curRider.off = true;
                        Rigidbody killrb = curRider.rb;
                        Destroy(curRider);
                        killrb.isKinematic = true;
                        killrb.velocity    = Vector3.zero;

                        SoundScript.PlaySound(playerSource, "Win");
                        if (comboBS)
                        {
                            comboMultiplier = 0;
                            comboBS.comboEnd(comboMultiplier);
                            comboBS.Win(GameObject.FindGameObjectWithTag("HUD").GetComponent <timerScript>().timeRemaining > 0);
                        }
                    }


                    //input horizontal movement
                    curRider.inputHorz(InputManager.GetAxis("Horizontal"));

                    //float v_input = InputManager.GetAxis("Vertical") == 0 ? InputManager.GetAxis("Accelerate") : InputManager.GetAxis("Vertical");


                    //input vertical movement
                    curRider.inputVert(InputManager.GetAxis("Vertical") == 0 ? InputManager.GetAxis("Accelerate") : InputManager.GetAxis("Vertical"));

                    //input fastfall
                    if (InputManager.GetButtonDown("FastFall"))
                    {
                        curRider.inputFastFall(1);
                        SoundScript.PlaySound(playerSource, "Ability");
                    }

                    //input abilty
                    if (InputManager.GetButtonDown("Jump"))
                    {
                        curRider.inputAbility(1);
                    }
                    else if (InputManager.GetButton("Jump"))
                    {
                        curRider.inputAbility(2);
                    }
                    else if (InputManager.GetButtonUp("Jump"))
                    {
                        curRider.inputAbility(3);
                    }
                    else
                    {
                        curRider.inputAbility(0);
                    }

                    //input breakin
                    if (InputManager.GetButtonDown("BreakIn"))
                    {
                        curRider.inputBreakIn(1);
                    }
                    else if (InputManager.GetButton("BreakIn"))
                    {
                        curRider.inputBreakIn(2);
                    }
                    else if (InputManager.GetButtonUp("BreakIn"))
                    {
                        curRider.inputBreakIn(3);
                    }
                    else
                    {
                        curRider.inputBreakIn(0);
                    }
                }


                break;

            case PlayerState.Dead:

                updateReset();

                break;

            default:
                //Debug.Log("ERROR - NO RIDER OR VEHICLE");
                break;
            }
        }