コード例 #1
0
        private void Fight()
        {
            var attackTimer = _player.GetAttackDelay().p();
            var spells      = _player.GetSpells().Ready()
                              .Ignore("ESCAPE_DUNGEON").Ignore("PLAYER_COUPDEGRACE")
                              .Ignore("AMBUSH").Ignore("OUTOFCOMBATHEAL");

            var attackTarget = _player.GetAttackTarget();

            Evade evade;

            if (attackTarget != null && IsSpecialMob(attackTarget, out evade))
            {
                _player.CreateTextEffect("[Dodging]");
                Dodge(attackTarget, evade);
                return;
            }

            if (attackTarget != null && elapsedSeconds > attackTimer / 1000f)
            {
                var selfBuffSpells = spells.Target(SpellTarget.Self).Category(SpellCategory.Damage);
                if (selfBuffSpells.Any() && !_player.IsCastingSpell())
                {
                    _player.CreateTextEffect("[Casting Buff Spell]");
                    _player.CastOnSelf(selfBuffSpells.FirstOrDefault().SpellSlot);
                    elapsedSeconds = 0;
                    return;
                }

                var enemyBuffSpells = spells.Target(SpellTarget.Enemy).Category(SpellCategory.Buff);
                if (enemyBuffSpells.Any() && !_player.IsCastingSpell())
                {
                    _player.CreateTextEffect("[Casting Damage Spell]");
                    _player.CastOn(enemyBuffSpells.FirstOrDefault().SpellSlot, attackTarget);
                    elapsedSeconds = 0;
                    return;
                }

                var enemyCCSpells = spells.Target(SpellTarget.Enemy).Category(SpellCategory.CrowdControl);
                if (enemyCCSpells.Any() && !_player.IsCastingSpell())
                {
                    _player.CreateTextEffect("[Casting CrowdControl Spell]");
                    _player.CastOn(enemyCCSpells.FirstOrDefault().SpellSlot, attackTarget);
                    elapsedSeconds = 0;
                    return;
                }

                /* No Longer Working
                 * var groundDamageSpells = spells.Target(gy.SpellTarget.Ground).Category(gy.SpellCategory.Damage);
                 * if (groundDamageSpells.Any()) {
                 *      player.CreateTextEffect("[Casting Ground Spell]");
                 *      player.CastAt(groundDamageSpells.FirstOrDefault().SpellSlot, attackTarget.transform.position);
                 *      return;
                 * } */
            }


            if (_player.IsUnderAttack(out FightingObjectView attacker))
            {
                _player.SetSelectedObject(attacker);
                _player.AttackSelectedObject();
                return;
            }

            if (_player.GetHealth() <= (_player.GetMaxHealth() * 0.1f))
            {
                _state.Fire(Trigger.LowHealth);
                return;
            }

            if (_player.IsCasting())
            {
                return;
            }

            Core.Log("[Expedition] Continuing.");
            _state.Fire(Trigger.Finished);
        }