Ejemplo n.º 1
0
        public override IEnumerator <AbilityDeliveryTarget> Deliver(AbilityExecutionContext context, TargetWrapper target)
        {
            if (target.Unit == null)
            {
                UberDebug.LogError("Target unit is missing", Array.Empty <object>());
                yield break;
            }
            UnitAttack cmd = new UnitAttack(target.Unit)
            {
                IsSingleAttack = true
            };

            cmd.Init(context.Caster);
            cmd.Start();
            AttackHandInfo   attackHandInfo = cmd.AllAttacks.FirstOrDefault <AttackHandInfo>();
            ItemEntityWeapon weapon         = (attackHandInfo != null) ? attackHandInfo.Weapon : null;

            if (weapon == null)
            {
                UberDebug.LogError("Has no weapon for attack", Array.Empty <object>());
                cmd.Interrupt();
                yield break;
            }
            bool hitHandled = false;
            bool isMelee    = weapon.Blueprint.IsMelee;

            for (; ;)
            {
                if (cmd.IsFinished)
                {
                    RuleAttackWithWeapon lastAttackRule = cmd.LastAttackRule;
                    if (((lastAttackRule != null) ? lastAttackRule.Projectile : null) == null || cmd.LastAttackRule.Projectile.IsHit || cmd.LastAttackRule.Projectile.Cleared || cmd.LastAttackRule.Projectile.Destroyed)
                    {
                        break;
                    }
                }
                bool wasActed = cmd.IsActed;
                if (!cmd.IsFinished)
                {
                    cmd.Tick();
                }
                RuleAttackWithWeapon lastAttackRule2 = cmd.LastAttackRule;
                if (!wasActed && cmd.IsActed && isMelee)
                {
                    hitHandled = true;
                    if (lastAttackRule2.AttackRoll.IsHit)
                    {
                        yield return(new AbilityDeliveryTarget(target));
                    }
                }
                yield return(null);
            }
            if (!hitHandled && !isMelee)
            {
                RuleAttackWithWeapon lastAttackRule3 = cmd.LastAttackRule;
                bool?flag3 = (lastAttackRule3 != null) ? new bool?(lastAttackRule3.AttackRoll.IsHit) : null;
                if (flag3 != null && flag3.Value)
                {
                    yield return(new AbilityDeliveryTarget(target));
                }
            }
            yield break;
        }