// TODO: review logic public static bool CanReachImmediate(IntVec3 start, LocalTargetInfo target, Map map, PathEndMode peMode, Thing thing) { if (!target.IsValid) { return(false); } // TODO //target = (LocalTargetInfo)GenPath.ResolvePathMode(pawn, target.ToTargetInfo(map), ref peMode); if (target.HasThing) { Thing thing2 = target.Thing; if (!thing2.Spawned) { return(false); } if (thing2.Map != map) { return(false); } } if (!target.HasThing || (target.Thing.def.size.x == 1 && target.Thing.def.size.z == 1)) { if (start == target.Cell) { return(true); } } else if (start.IsInside(target.Thing)) { return(true); } return(peMode == PathEndMode.Touch && TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, target, map)); }
public static bool CanReachImmediate(IntVec3 start, LocalTargetInfo target, Map map, PathEndMode peMode, Pawn pawn) { if (!target.IsValid) { return(false); } target = (LocalTargetInfo)GenPath.ResolvePathMode(pawn, target.ToTargetInfo(map), ref peMode); if (target.HasThing) { Thing thing = target.Thing; if (thing.Spawned) { if (thing.Map != map) { return(false); } goto IL_00d3; } if (pawn != null) { if (pawn.carryTracker.innerContainer.Contains(thing)) { return(true); } if (pawn.inventory.innerContainer.Contains(thing)) { return(true); } if (pawn.apparel != null && pawn.apparel.Contains(thing)) { return(true); } if (pawn.equipment != null && pawn.equipment.Contains(thing)) { return(true); } } return(false); } goto IL_00d3; IL_00d3: if (!target.HasThing || (target.Thing.def.size.x == 1 && target.Thing.def.size.z == 1)) { if (start == target.Cell) { return(true); } } else if (start.IsInside(target.Thing)) { return(true); } if (peMode == PathEndMode.Touch && TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, target, map)) { return(true); } return(false); }
private static void Prefix(ref Building_Cage[] __state, Map ___map, ref IntVec3 start, ref LocalTargetInfo dest, TraverseParms traverseParms, PathEndMode peMode) { if (traverseParms.pawn is null) { return; } var map = ___map; (var cage1, var cage2) = (start.CageHere(map), dest.Cell.CageHere(map)); __state = new Building_Cage[] { cage1, cage2 }; foreach (var cage in map.CagesOnMap()) { if (cage1 != cage && cage2 != cage) { cage.isBlocking = true; } } if (cage1 != null && (peMode == PathEndMode.Touch || peMode == PathEndMode.ClosestTouch) && TouchPathEndModeUtility.IsAdjacentOrInsideAndAllowedToTouch(start, dest, traverseParms.pawn.Map)) { dest = dest.Cell.ClampInsideRect(cage1.OccupiedRect()); return; } if (cage1 == cage2) { if (cage1 != null) { cage1.pathCost = 0; } return; } if (cage1 != null) { var spot1 = cage1.InteractionCell; var spot2 = cage1.EntranceCell; dest = start == spot2 ? spot1 : spot2; cage1.pathCost = 0; } else { var spot1 = cage2.InteractionCell; dest = start == spot1 ? cage2.EntranceCell : spot1; cage2.pathCost = 8000; } }
public static bool Reachable(IntVec3 start, LocalTargetInfo dest, PathEndMode peMode, TraverseParms traverseParams) { var pawn = traverseParams.pawn; if (pawn is null || !pawn.IsCaptiveOf(null)) { return(false); } if ((peMode == PathEndMode.Touch || peMode == PathEndMode.ClosestTouch) && TouchPathEndModeUtility. IsAdjacentOrInsideAndAllowedToTouch(start, dest, pawn.Map)) { return(true); } else if (dest.Cell.IsInside(pawn.CurrentCage())) { return(true); } return(false); }