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