private static bool Prefix(ref JobGiver_AIFightEnemy __instance, ref Job __result, ref Pawn pawn) { bool result = true; if (!recursiveTrap) { recursiveTrap = true; Map oldMap = pawn.Map; IntVec3 oldPosition = pawn.Position; foreach (var map in ZUtils.GetAllMapsInClosestOrder(pawn, oldMap, oldPosition)) { var job = Traverse.Create(__instance).Method("TryGiveJob", new object[] { pawn }).GetValue <Job>(); Log.Message("2: " + ZUtils.ZTracker.GetMapInfo(pawn.Map) + " - result: " + job); if (job != null) { __result = job; result = false; break; } } ZUtils.TeleportThing(pawn, oldMap, oldPosition); recursiveTrap = false; } Log.Message(pawn + " - 4 TEST: " + __result); return(result); }
public static bool Prefix(ref IAttackTarget __result, IAttackTargetSearcher searcher, TargetScanFlags flags, Predicate <Thing> validator = null, float minDist = 0f, float maxDist = 9999f, IntVec3 locus = default(IntVec3), float maxTravelRadiusFromLocus = 3.40282347E+38f, bool canBash = false, bool canTakeTargetsCloserThanEffectiveMinRange = true) { bool result = true; if (!recursiveTrap) { recursiveTrap = true; Map oldMap = searcher.Thing.Map; IntVec3 oldPosition = searcher.Thing.Position; foreach (var map in ZUtils.GetAllMapsInClosestOrder(searcher.Thing, oldMap, oldPosition)) { var target = AttackTargetFinder.BestAttackTarget(searcher, flags, validator, minDist, maxDist, locus, maxTravelRadiusFromLocus, canBash, canTakeTargetsCloserThanEffectiveMinRange); Log.Message(ZUtils.ZTracker.GetMapInfo(searcher.Thing.Map) + " - result: " + target); if (target != null) { __result = target; result = false; break; } } ZUtils.TeleportThing(searcher.Thing, oldMap, oldPosition); recursiveTrap = false; } return(result); }
public static bool Prefix(ref IAttackTarget __result, List <IAttackTarget> ___tmpTargets, List <Pair <IAttackTarget, float> > ___availableShootingTargets, List <float> ___tmpTargetScores, List <bool> ___tmpCanShootAtTarget, List <IntVec3> ___tempDestList, List <IntVec3> ___tempSourceList, IAttackTargetSearcher searcher, TargetScanFlags flags, Predicate <Thing> validator = null, float minDist = 0f, float maxDist = 9999f, IntVec3 locus = default(IntVec3), float maxTravelRadiusFromLocus = 3.40282347E+38f, bool canBash = false, bool canTakeTargetsCloserThanEffectiveMinRange = true) { bool result = true; if (!recursiveTrap && multiMapSearch) { recursiveTrap = true; Map oldMap = searcher.Thing.Map; IntVec3 oldPosition = searcher.Thing.Position; bool dontCheckForStairs = searcher.Thing is Building; foreach (var map in ZUtils.GetAllMapsInClosestOrder(searcher.Thing, oldMap, oldPosition, dontCheckForStairs: dontCheckForStairs)) { if (ZUtils.ZTracker.GetZIndexFor(map) < ZUtils.ZTracker.GetZIndexFor(oldMap)) { CanBeSeenOverFast_Patch.checkLevels = true; CanBeSeenOverFast_Patch.upperMap = oldMap; CanBeSeenOverFast_Patch.lowerMap = map; CanBeSeenOverFast_Patch.caster = searcher.Thing; } var target = AttackTargetFinder.BestAttackTarget(searcher, flags, validator, minDist, maxDist, locus, maxTravelRadiusFromLocus, canBash, canTakeTargetsCloserThanEffectiveMinRange); //ZLogger.Message(searcher.Thing + " - 1: " + ZUtils.ZTracker.GetMapInfo(searcher.Thing.Map) + " - result: " + target); if (target != null) { __result = target; result = false; break; } } //ZLogger.Message("1 Trying to get " + searcher.Thing + " back to " + oldMap + " - " + oldPosition, true); ZUtils.TeleportThing(searcher.Thing, oldMap, oldPosition); recursiveTrap = false; CanBeSeenOverFast_Patch.checkLevels = false; CanBeSeenOverFast_Patch.upperMap = null; CanBeSeenOverFast_Patch.lowerMap = null; CanBeSeenOverFast_Patch.caster = null; } //else if (!multiMapSearch) //{ // ZLogger.Message("BestAttackTarget: multiMapSearch: " + multiMapSearch, true); //} return(result); }
private static void Postfix(Pawn ___pawn, ref IEnumerable <Thing> __result, Pawn playerNegotiator) { var result = __result.ToList(); Map oldMap = ___pawn.Map; IntVec3 oldPosition = playerNegotiator.Position; bool select = false; if (Find.Selector.SelectedObjects.Contains(___pawn)) { select = true; } foreach (var map in ZUtils.GetAllMapsInClosestOrder(___pawn, oldMap, oldPosition)) { if (map != oldMap) { IEnumerable <Thing> enumerable = ___pawn.Map.listerThings.AllThings.Where((Thing x) => x.def.category == ThingCategory.Item && TradeUtility.PlayerSellableNow(x, ___pawn) && !x.Position.Fogged(x.Map) && (___pawn.Map.areaManager.Home[x.Position] || x.IsInAnyStorage()) && ReachableForTrade(x, ___pawn)); foreach (Thing item in enumerable) { result.Add(item); } if (___pawn.GetLord() != null) { foreach (Pawn item2 in from x in TradeUtility.AllSellableColonyPawns(___pawn.Map) where !x.Downed && ReachableForTrade(x, ___pawn) select x) { result.Add(item2); } } } } if (___pawn.Map != oldMap) { Traverse.Create(___pawn).Field("mapIndexOrState") .SetValue((sbyte)Find.Maps.IndexOf(oldMap)); Traverse.Create(___pawn).Field("positionInt") .SetValue(oldPosition); } if (select) { Find.Selector.Select(___pawn); } __result = result; }