bool CheckIfAbortOnStateCondition(PlayerController.PlayerStates newState)
    {
        bool returnVal = false;

        switch (newState)
        {
        case PlayerController.PlayerStates.idle:
            break;

        case PlayerController.PlayerStates.left:
            break;

        case PlayerController.PlayerStates.right:
            break;

        case PlayerController.PlayerStates.jump:
            break;

        case PlayerController.PlayerStates.landing:
            break;

        case PlayerController.PlayerStates.falling:
            break;

        case PlayerController.PlayerStates.kill:
            break;

        case PlayerController.PlayerStates.resurrect:
            break;

        case PlayerController.PlayerStates.firingWeapon:
            if (PlayerController.stateDelayTimer[(int)PlayerController.PlayerStates.firingWeapon] > Time.time)
            {
                returnVal = true;
            }
            break;
        }
        // True means 'Abort', false means 'Continue'
        return(returnVal);
    }
    bool CheckForValidStatePair(PlayerController.PlayerStates newState)
    {
        bool returnVal = false;

        switch (currentState)
        {
        case PlayerController.PlayerStates.idle:
            // From idle you can go to any state
            returnVal = true;
            break;

        case PlayerController.PlayerStates.left:
            // From left you can go to any state
            FacinRight = 0;
            returnVal  = true;
            break;

        case PlayerController.PlayerStates.right:
            // From right you can go to any state
            FacinRight = 1;
            returnVal  = true;
            break;

        case PlayerController.PlayerStates.jump:
            // From jump you can go to the next step if certain conditions are met
            if (newState == PlayerController.PlayerStates.falling || newState == PlayerController.PlayerStates.kill || newState == PlayerController.PlayerStates.firingWeapon)
            {
                returnVal = true;
            }
            else if (!IsNextToWall() && (newState == PlayerController.PlayerStates.left || newState == PlayerController.PlayerStates.right) || ((transform.localScale.x < 0 && previousState == PlayerController.PlayerStates.right && newState == PlayerController.PlayerStates.right) || (transform.localScale.x > 0 && previousState == PlayerController.PlayerStates.left && newState == PlayerController.PlayerStates.left)))
            {
                returnVal = true;
            }
            else
            {
                returnVal = false;
            }
            break;

        case PlayerController.PlayerStates.landing:
            // You get how this works
            if (newState == PlayerController.PlayerStates.left || newState == PlayerController.PlayerStates.right || newState == PlayerController.PlayerStates.idle || newState == PlayerController.PlayerStates.firingWeapon)
            {
                returnVal = true;
            }
            else
            {
                returnVal = false;
            }
            break;

        case PlayerController.PlayerStates.falling:
            if (newState == PlayerController.PlayerStates.landing || newState == PlayerController.PlayerStates.kill || newState == PlayerController.PlayerStates.firingWeapon || newState == PlayerController.PlayerStates.right || newState == PlayerController.PlayerStates.left)
            {
                returnVal = true;
            }
            else
            {
                returnVal = false;
            }
            break;

        case PlayerController.PlayerStates.kill:
            if (newState == PlayerController.PlayerStates.resurrect)
            {
                returnVal = true;
            }
            else
            {
                returnVal = false;
            }
            break;

        case PlayerController.PlayerStates.resurrect:
            if (newState == PlayerController.PlayerStates.idle)
            {
                returnVal = true;
            }
            else
            {
                returnVal = false;
            }
            break;

        case PlayerController.PlayerStates.firingWeapon:
            returnVal = true;
            break;
        }
        return(returnVal);
    }
    public void OnStateChange(PlayerController.PlayerStates newState)
    {
        if (newState == currentState)
        {
            return;
        }

        if (CheckIfAbortOnStateCondition(newState))
        {
            return;
        }

        if (!CheckForValidStatePair(newState))
        {
            return;
        }

        switch (newState)
        {
        case PlayerController.PlayerStates.idle:
            anim.SetBool("Walking", false);
            break;

        case PlayerController.PlayerStates.left:
        case PlayerController.PlayerStates.right:
            if (IsGrounded())
            {
                //Debug.Log("Entrei em Walking");
                anim.SetBool("Walking", true);
            }
            else
            {
                anim.SetBool("Walking", false);
            }
            break;

        case PlayerController.PlayerStates.jump:
            if ((/*playerHasLanded && */ IsGrounded()) || (!IsGrounded() && IsNextToWall()))
            {
                anim.SetBool("isOnWall", false);
                anim.SetBool("Landing", false);
                anim.SetBool("Jumping", true);

                if (IsNextToWall())
                {
                    jumpingFromWall = true;
                }
                r2d.AddForce(new Vector2(r2d.velocity.x, jumpForce) * moveSpeed * Time.deltaTime, ForceMode2D.Impulse);
                //playerHasLanded = false;
            }
            break;

        case PlayerController.PlayerStates.landing:
            anim.SetBool("Falling", false);
            anim.SetBool("Landing", true);
            //playerHasLanded = true;
            break;

        case PlayerController.PlayerStates.falling:
            anim.SetBool("Falling", true);
            anim.SetBool("Jumping", false);
            break;

        case PlayerController.PlayerStates.kill:
            break;

        case PlayerController.PlayerStates.resurrect:
            //transform.position = playerRespawnPoint.transform.position;
            //transform.rotation = Quaternion.identity; //rotacio: cap
            //GetComponent<Rigidbody2D>().velocity = Vector2.zero; //velocitat lineal: zero
            break;

        case PlayerController.PlayerStates.firingWeapon:
            PlayerController.stateDelayTimer[(int)PlayerController.PlayerStates.firingWeapon] = Time.time + 0.2f;
            GameObject newBullet = Instantiate(bulletPrefab);
            //Debug.Log(transform.localScale * 4);
            if (IsNextToWall())
            {
                newBullet.transform.localScale = -transform.localScale * 4;
            }
            else
            {
                newBullet.transform.localScale = transform.localScale * 4;
            }
            newBullet.transform.position = bulletSpawn.position;
            BulletController bullCon = newBullet.GetComponent <BulletController>();
            bullCon.ShootBullet();
            OnStateChange(currentState);
            break;
        }

        previousState = currentState;

        currentState = newState;
    }