static void Postfix(UnitCombatEngagementController __instance, UnitEntityData attacker, UnitEntityData target) { var tr = Harmony12.Traverse.Create(__instance); var m_ForceAttackOfOpportunity = tr.Field("m_ForceAttackOfOpportunity").GetValue <IList>(); //get units adjacent to attacker //check if they have solo tactics with paired opportunist or both attacker and unit have paired opportunist bool attacker_has_paired_ooportunist = attacker.Descriptor.Progression.Features.HasFact(PairedOpportunistFact); foreach (var u in target.CombatState.EngagedBy) { if (u == attacker) { continue; } if (u.Descriptor.Progression.Features.HasFact(PairedOpportunistFact) && (attacker_has_paired_ooportunist || (bool)u.Descriptor.State.Features.SoloTactics) && (u.DistanceTo(attacker) < u.Corpulence + attacker.Corpulence + 5.Feet().Meters) && !hasPair(m_ForceAttackOfOpportunity, u, target) ) { __instance.ForceAttackOfOpportunity(u, target); } } }
static bool Prefix(UnitCombatEngagementController __instance, UnitEntityData unit) { if ((unit.Get <UnitPartAooAgainstAllies>()?.active()).GetValueOrDefault()) { foreach (UnitGroupMemory.UnitInfo enemy in unit.Memory.UnitsList) { UnitEntityData unit1 = enemy.Unit; if (unit1.Descriptor.State.IsConscious && unit.IsEngage(unit1) && unit != unit1) { unit.CombatState.Engage(unit1); } } } return(true); }