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; }