Пример #1
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        if (actor.IsFrozen() || actor.IsStunned())
        {
            return;
        }

        float fDistance = actor.transform.position.x - LevelController.fMIN_X_COORD;

        Vector3 diagonal = new Vector3(-1.0f, 0.0f, -0.25f * Mathf.Sign(actor.transform.position.z) / (fDistance + 1.0f));

        diagonal.Normalize();
        actor.Move(diagonal * fMoveSpeed);

        // Small delay to give player actors first strike and therefore allow zephyrs to push before damage
        if (actor.GetDistanceFromPlayerArea() <= fAttackRange && !actor.IsStunned() && actor.fTimeInMeleeZone > 0.1f)
        {
            // ---- ATTACK CODE ----
            actor.fTimeSinceLastAttack += Core.GetEnemyFixedDeltaTime();
            if (actor.fTimeSinceLastAttack >= fAttackInterval)
            {
                actor.fTimeSinceLastAttack = 0.0f;
                PlaySoundEffect(actor);

                for (int i = 0; i < numAttacks; i++)
                {
                    MeleeAttackPlayer(actor, damage);
                }
                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
            }
        }
        else
        {
            actor.render.SetAnimState(AnimState.WALKING, false);
        }
    }
Пример #2
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        // Wurm acts like a support, but teleports between spots. Go stand in a player zone, leave it, stand in it, repeat
        if (actor.IsFrozen() || actor.IsStunned())
        {
            return;
        }

        actor.fTimeSinceLastAttack += Core.GetEnemyDeltaTime();
        if (actor.GetDistanceFromPlayerArea() <= fAttackRange && actor.fTimeSinceLastAttack >= fAttackInterval)
        {
            // ---- ATTACK CODE ----
            if (actor.fTimeSinceLastAttack >= fAttackInterval)
            {
                PlaySoundEffect(actor);

                actor.fTimeSinceLastAttack = 0.0f;
                MeleeAttackPlayer(actor, damage, MinionSlot.MELEE_1);
                MeleeAttackPlayer(actor, damage, MinionSlot.MELEE_2);
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_1);
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_2);
                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
                if (actor.render.attackParticles != null)
                {
                    actor.render.attackParticles.Play();
                }
            }
        }
        // If we are waiting, do that.
        else if (actor.fTimeToNextMove > 0.0f)
        {
            actor.fTimeToNextMove -= Core.GetEnemyDeltaTime();
            if (actor.fTimeToNextMove <= 0.0f && actor.render.GetAnimState() != AnimState.ATTACK)
            {
                if (actor.bPickedPositionInPlayerZone)
                {
                    // Last pick was in a zone, so wherever is fine this time.
                    actor.target = new Vector3(Random.Range(LevelController.fMIN_X_COORD, Core.GetLevel().GetRangedZoneMax() + 3.0f), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                }
                else
                {
                    // We just wandered off wherever, so make sure we walk back through a zone this time.
                    if (Random.Range(0, 2) == 0)
                    {
                        actor.target = new Vector3(Random.Range(LevelController.fMIN_X_COORD, Core.GetLevel().GetMeleeZoneLimit()), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                    }
                    else
                    {
                        actor.target = new Vector3(Random.Range(Core.GetLevel().GetRangedZoneMin(), Core.GetLevel().GetRangedZoneMax()), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                    }
                }

                actor.bPickedPositionInPlayerZone = !actor.bPickedPositionInPlayerZone;

                actor.render.SetAnimStateAndNext(AnimState.WALKING, AnimState.IDLE);
                if (actor.render.moveParticles != null)
                {
                    actor.render.moveParticles.Play();
                }
            }
        }
        // Else, we made it to idle, so teleport and re-emerge by playing a reverse walk
        else if (actor.render.GetAnimState() == AnimState.IDLE)
        {
            actor.Move(actor.target - actor.transform.position, true);
            actor.render.SetAnimStateAndNext(AnimState.WALKING, AnimState.IDLE);
            actor.render.SetReverse(true);
            actor.fTimeToNextMove = 2.0f;
        }
    }