static bool Prefix(PreciseStrike __instance, RulePrepareDamage evt) { if (!evt.Target.isFlankedByAttacker(__instance.Owner.Unit) || evt.DamageBundle.Weapon == null) { return(false); } bool flag = (bool)__instance.Owner.State.Features.SoloTactics; if (!flag) { foreach (UnitEntityData unitEntityData in evt.Target.CombatState.EngagedBy) { flag = unitEntityData.Descriptor.HasFact(__instance.PreciseStrikeFact) && unitEntityData != __instance.Owner.Unit; if (flag && evt.Target.isFlankedByAttacker(unitEntityData)) { break; } } } if (!flag) { return(false); } BaseDamage damage = __instance.Damage.CreateDamage(); evt.DamageBundle.Add(damage); return(false); }
static bool Prefix(PreciseStrike __instance, RulePrepareDamage evt) { BlueprintUnitFact preciseStrikeFact = __instance.PreciseStrikeFact; Func <UnitEntityData, UnitEntityData, UnitEntityData, bool> hasPreciseStrike = (target, owner, flankingPartner) => owner.Descriptor.State.Features.SoloTactics || flankingPartner.Descriptor.HasFact(preciseStrikeFact); FlankingParameters flankingParameters = new FlankingParameters(typeof(PreciseStrike_OnEventAboutToTrigger_Patch), __instance.Owner.Unit, hasPreciseStrike); UnitCombatState_get_IsFlanked_Patch.PushFlankingParameters(flankingParameters); return(true); }