public static bool Prefix(BehaviorNode __instance, ref BehaviorTreeResults __result, ref BehaviorTree ___tree, ref AbstractActor ___unit) { try { List <AbstractActor> allAlliesOf = ___unit.Combat.GetAllAlliesOf(___unit); AuraBubble sensors = ___unit.sensorAura(); for (int index1 = 0; index1 < ___tree.enemyUnits.Count; ++index1) { ICombatant enemyUnit = ___tree.enemyUnits[index1]; AbstractActor abstractActor = enemyUnit as AbstractActor; float magnitude = (enemyUnit.CurrentPosition - ___unit.CurrentPosition).magnitude; if (AIUtil.UnitHasVisibilityToTargetFromPosition(___unit, enemyUnit, ___unit.CurrentPosition, allAlliesOf)) { if (___unit.CanEngageTarget(enemyUnit) || ___unit.CanDFATargetFromPosition(enemyUnit, ___unit.CurrentPosition)) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } if ((double)magnitude <= (double)___unit.MaxWalkDistance) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } if (abstractActor != null && abstractActor.IsGhosted) { float num = Mathf.Lerp(___unit.MaxWalkDistance, ___unit.MaxSprintDistance, ___unit.BehaviorTree.GetBehaviorVariableValue(BehaviorVariableName.Float_SignalInWeapRngWhenEnemyGhostedWithinMoveDistance).FloatVal); float range = sensors.collider.radius; if ((double)Vector3.Distance(___unit.CurrentPosition, abstractActor.CurrentPosition) - (double)range >= (double)num) { continue; } } for (int index2 = 0; index2 < ___unit.Weapons.Count; ++index2) { Weapon weapon = ___unit.Weapons[index2]; if (weapon.CanFire && (double)weapon.MaxRange >= (double)magnitude) { __result = new BehaviorTreeResults(BehaviorNodeState.Success); return(false); } } } } __result = new BehaviorTreeResults(BehaviorNodeState.Failure); return(false); } catch (Exception e) { Log.Debug?.Write(e.ToString() + "\n"); __result = new BehaviorTreeResults(BehaviorNodeState.Failure); return(false); } }