private static bool Prefix(ref bool __result, Reachability __instance, IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseParms traverseParams, out bool __state) { __state = false; var pawn = traverseParams.pawn; if (pawn != null) { if (pawn.RaceProps.Humanlike) { if (dest.HasThing && dest.thingInt.Map != null && dest.thingInt.Map != pawn.Map) { var cell = ZUtils.GetCellToTeleportFrom(pawn.Map, pawn.Position, dest.thingInt.Map); if (cell.IsValid) { __state = true; oldMap = pawn.Map; oldPosition = pawn.Position; ZUtils.TeleportThing(pawn, dest.thingInt.Map, cell); if (dest.thingInt.Map != __instance.map) { __result = dest.thingInt.Map.reachability.CanReach(start, dest, peMode, traverseParams); ZLogger.Message($"CanReach: Used other's map reachability: pawn: {pawn}, thing: {dest.thingInt}, pawn.Map: {pawn.Map}, thing.Map: {dest.thingInt.Map}, result: {__result}"); return(false); } } else { ZLogger.Pause($"CanReach: Detected reachability disfunction: pawn: {pawn}, thing: {dest.thingInt}, pawn.Map: {pawn.Map}, thing.Map: {dest.thingInt.Map}"); } } } } return(true); }
private static bool Prefix(ref bool __result, ReservationManager __instance, Pawn claimant, LocalTargetInfo target, out bool __state, int maxPawns = 1, int stackCount = -1, ReservationLayerDef layer = null, bool ignoreOtherReservations = false) { __state = false; if (claimant.RaceProps.Humanlike) { if (target.HasThing && target.thingInt.Map != null && target.thingInt.Map != claimant.Map) { var cell = ZUtils.GetCellToTeleportFrom(claimant.Map, claimant.Position, target.thingInt.Map); if (cell.IsValid) { __state = true; oldMap = claimant.Map; oldPosition = claimant.Position; ZUtils.TeleportThing(claimant, target.thingInt.Map, cell); ZLogger.Message($"Teleporting claimaint {claimant} to {target.thingInt.Map}"); __result = claimant.CanReserve(target, maxPawns, stackCount, layer, ignoreOtherReservations); return(false); } else { ZLogger.Pause($"CanReserve: Detected reservation disfunction: pawn: {claimant}, thing: {target.thingInt}, pawn.Map: {claimant.Map}, thing.Map: {target.thingInt.Map}"); } } } return(true); }
private static bool Prefix(ref bool __result, ReservationManager __instance, Pawn claimant, LocalTargetInfo target, out bool __state, int maxPawns = 1, int stackCount = -1, ReservationLayerDef layer = null, bool ignoreOtherReservations = false) { __state = false; if (claimant.RaceProps.Humanlike) { if (target.HasThing) { if (target.thingInt.Map != null && target.thingInt.Map != claimant.Map) { var cellToTeleport = ZUtils.GetCellToTeleportFrom(claimant.Map, claimant.Position, target.thingInt.Map); var cell = cellToTeleport.IsValid ? cellToTeleport : claimant.Position; __state = true; oldMap = claimant.Map; oldPosition = claimant.Position; ZUtils.TeleportThing(claimant, target.thingInt.Map, cell); ZLogger.Message($"Teleporting claimaint {claimant} to {target.thingInt.Map}"); __result = claimant.CanReserve(target, maxPawns, stackCount, layer, ignoreOtherReservations); return(false); } } else { if (ZUtils.ZTracker.jobTracker.TryGetValue(claimant, out var jobTracker) && jobTracker.lookedAtLocalCellMap != null && jobTracker.lookedAtLocalCellMap.TryGetValue(target.cellInt, out var mapDest)) { if (mapDest != null && mapDest != claimant.Map) { var cellToTeleport = ZUtils.GetCellToTeleportFrom(claimant.Map, claimant.Position, mapDest); var cell = cellToTeleport.IsValid ? cellToTeleport : claimant.Position; __state = true; oldMap = claimant.Map; oldPosition = claimant.Position; ZUtils.TeleportThing(claimant, mapDest, cell); ZLogger.Message($"3 Teleporting claimaint {claimant} to {mapDest}"); __result = claimant.CanReserve(target, maxPawns, stackCount, layer, ignoreOtherReservations); return(false); } } //else //{ // if (ZUtils.ZTracker.jobTracker.TryGetValue(claimant, out var job)) // { // } // ZLogger.Pause($"2 Unsupported target (most likely cell), claimant: {claimant}, target {target}"); //} } } return(true); }
private static bool Prefix(ref bool __result, Reachability __instance, IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseParms traverseParams, out bool __state) { __state = false; var pawn = traverseParams.pawn; if (pawn != null && pawn.Map != null) { if (dest.HasThing && dest.thingInt.Map != null) { if (dest.thingInt.Map != pawn.Map) { var cellToTeleport = ZUtils.GetCellToTeleportFrom(pawn.Map, pawn.Position, dest.thingInt.Map); var cell = cellToTeleport.IsValid ? cellToTeleport : pawn.Position; __state = true; oldMap = pawn.Map; oldPosition = pawn.Position; ZUtils.TeleportThing(pawn, dest.thingInt.Map, cell); if (dest.thingInt.Map != __instance.map) { __result = dest.thingInt.Map.reachability.CanReach(start, dest, peMode, traverseParams); ZLogger.Message($"1 CanReach: Used dest thing map reachability: __instance.map: {__instance.map}, pawn: {pawn}, thing: {dest.thingInt}, pawn.Map: {pawn.Map}, thing.Map: {dest.thingInt.Map}, result: {__result}"); return(false); } } else if (dest.thingInt.Map != __instance.map) { __result = dest.thingInt.Map.reachability.CanReach(start, dest, peMode, traverseParams); ZLogger.Message($"2 CanReach: Used dest thing map reachability: __instance.map: {__instance.map}, pawn: {pawn}, thing: {dest.thingInt}, pawn.Map: {pawn.Map}, thing.Map: {dest.thingInt.Map}, result: {__result}"); return(false); } } else if (ZUtils.ZTracker.jobTracker.TryGetValue(pawn, out var jobTracker) && jobTracker.lookedAtLocalCellMap != null && jobTracker.lookedAtLocalCellMap.TryGetValue(dest.cellInt, out var mapDest) && mapDest != null) { if (mapDest != pawn.Map) { var cellToTeleport = ZUtils.GetCellToTeleportFrom(pawn.Map, pawn.Position, mapDest); var cell = cellToTeleport.IsValid ? cellToTeleport : pawn.Position; __state = true; oldMap = pawn.Map; oldPosition = pawn.Position; ZUtils.TeleportThing(pawn, mapDest, cell); if (mapDest != __instance.map) { __result = mapDest.reachability.CanReach(start, dest, peMode, traverseParams); ZLogger.Message($"3 CanReach: Used mapDest map reachability: __instance.map: {__instance.map}, pawn: {pawn}, mapDest: {mapDest}, pawn.Map: {pawn.Map}, result: {__result}"); return(false); } } else if (mapDest != __instance.map) { __result = mapDest.reachability.CanReach(start, dest, peMode, traverseParams); ZLogger.Message($"4 CanReach: Used mapDest map reachability: __instance.map: {__instance.map}, pawn: {pawn}, mapDest: {mapDest}, pawn.Map: {pawn.Map}, result: {__result}"); return(false); } } } return(true); }