Ejemplo n.º 1
0
 public virtual void BumpMe(Vector3 _bumpDirectionFlat, BumpForce _force)
 {
     if (!isBumpable)
     {
         return;
     }
     ChangePawnState("Bumped", Bump_C(_bumpDirectionFlat, _force), CancelBump_C());
 }
Ejemplo n.º 2
0
    private IEnumerator Bump_C(Vector3 _bumpDirectionFlat, BumpForce _force)
    {
        animator.SetTrigger("BumpTrigger");
        moveState = MoveState.Pushed;
        FeedbackManager.SendFeedback(eventOnBeingBumpedAway, this);

        float bumpDistance = 0;
        float bumpDuration = 0;

        switch (_force)
        {
        case BumpForce.Force1:
            if (isPlayer)
            {
                bumpDistance = pushDatas.BumpPlayerForce1Distance;
                bumpDuration = pushDatas.BumpPlayerForce1Duration;
            }
            else
            {
                bumpDistance = pushDatas.BumpForce1Distance;
                bumpDuration = pushDatas.BumpForce1Duration;
            }
            break;

        case BumpForce.Force2:
            if (isPlayer)
            {
                bumpDistance = pushDatas.BumpPlayerForce2Distance;
                bumpDuration = pushDatas.BumpPlayerForce2Duration;
            }
            else
            {
                bumpDistance = pushDatas.BumpForce2Distance;
                bumpDuration = pushDatas.BumpForce2Duration;
            }
            break;

        case BumpForce.Force3:
            if (isPlayer)
            {
                bumpDistance = pushDatas.BumpPlayerForce3Distance;
                bumpDuration = pushDatas.BumpPlayerForce3Duration;
            }
            else
            {
                bumpDistance = pushDatas.BumpForce3Distance;
                bumpDuration = pushDatas.BumpForce3Duration;
            }
            break;
        }
        bumpDistance = bumpDistance + Random.Range(pushDatas.bumpRandomRangeModifier.x, pushDatas.bumpRandomRangeModifier.y);
        bumpDuration = bumpDuration + Random.Range(pushDatas.bumpRandomDurationModifier.x, pushDatas.bumpRandomDurationModifier.y);
        float i_restDuration = pushDatas.bumpRestDuration;

        if (isPlayer)
        {
            i_restDuration = pushDatas.bumpPlayerRestDuration;
        }
        i_restDuration = i_restDuration + Random.Range(pushDatas.bumpRandomRestModifier.x, pushDatas.bumpRandomRestModifier.y);
        Vector3 i_bumpDirection = _bumpDirectionFlat;

        i_bumpDirection.y = 0;
        Vector3 i_bumpInitialPosition     = transform.position;
        Vector3 i_bumpDestinationPosition = transform.position + i_bumpDirection * bumpDistance;

        transform.rotation = Quaternion.LookRotation(-i_bumpDirection);
        float i_gettingUpDuration = maxGettingUpDuration;

        EnemyBehaviour i_enemy = GetComponent <EnemyBehaviour>();

        if (i_enemy != null)
        {
            i_enemy.ChangeState(EnemyState.Bumped);
        }

        float i_bumpTimeProgression = 0;
        bool  i_playedEndOfFall     = false;

        while (i_bumpTimeProgression < 1)
        {
            moveState = MoveState.Pushed;

            i_bumpTimeProgression += Time.deltaTime / bumpDuration;

            //move !
            Vector3 i_newPosition = Vector3.Lerp(i_bumpInitialPosition, i_bumpDestinationPosition, pushDatas.bumpSpeedCurve.Evaluate(i_bumpTimeProgression));

            //check of collision
            Collider i_hitCollider = CheckForCollision();
            if (i_hitCollider != null)
            {
                if (isPlayer)
                {
                    WallSplat(WallSplatForce.Heavy, transform.position - i_hitCollider.ClosestPoint(transform.position));
                }
                else
                {
                    WallSplat(WallSplatForce.Heavy, transform.position - i_hitCollider.ClosestPoint(transform.position));
                }
            }

            rb.MovePosition(i_newPosition);

            //trigger end anim
            if (i_bumpTimeProgression >= whenToTriggerFallingAnim && i_playedEndOfFall == false)
            {
                animator.SetTrigger("FallingTrigger");

                i_playedEndOfFall = true;
            }
            yield return(null);
        }

        // After the whole bump-fly-fall sequence
        if (damageAfterBump > 0)
        {
            if ((currentHealth - damageAfterBump) <= 0)
            {
                DeathOverrideWithBump();
            }
            Damage(damageAfterBump);
        }

        //when arrived on ground
        while (i_restDuration > 0)
        {
            i_restDuration -= Time.deltaTime;
            if (i_restDuration <= 0)
            {
                animator.SetTrigger("StandingUpTrigger");
            }
            yield return(null);
        }

        //time to get up
        while (i_gettingUpDuration > 0)
        {
            i_gettingUpDuration -= Time.deltaTime;
            if (i_gettingUpDuration <= 0 && GetComponent <EnemyBehaviour>() != null)
            {
                i_enemy.ChangeState(EnemyState.Following);
            }
            yield return(null);
        }
        moveState = MoveState.Idle;
    }