private static bool TryFindPlaceSpotNear(IntVec3 center, Map map, Thing thing, bool allowStacking, out IntVec3 bestSpot, Predicate <IntVec3> extraValidator = null) { GenPlace.PlaceSpotQuality placeSpotQuality = GenPlace.PlaceSpotQuality.Unusable; bestSpot = center; for (int i = 0; i < 9; i++) { IntVec3 intVec = center + GenRadial.RadialPattern[i]; GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator); if (placeSpotQuality2 > placeSpotQuality) { bestSpot = intVec; placeSpotQuality = placeSpotQuality2; } if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect) { break; } } if (placeSpotQuality >= GenPlace.PlaceSpotQuality.Okay) { return(true); } for (int j = 0; j < GenPlace.PlaceNearMiddleRadialCells; j++) { IntVec3 intVec = center + GenRadial.RadialPattern[j]; GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator); if (placeSpotQuality2 > placeSpotQuality) { bestSpot = intVec; placeSpotQuality = placeSpotQuality2; } if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect) { break; } } if (placeSpotQuality >= GenPlace.PlaceSpotQuality.Okay) { return(true); } for (int k = 0; k < GenPlace.PlaceNearMaxRadialCells; k++) { IntVec3 intVec = center + GenRadial.RadialPattern[k]; GenPlace.PlaceSpotQuality placeSpotQuality2 = GenPlace.PlaceSpotQualityAt(intVec, map, thing, center, allowStacking, extraValidator); if (placeSpotQuality2 > placeSpotQuality) { bestSpot = intVec; placeSpotQuality = placeSpotQuality2; } if (placeSpotQuality == GenPlace.PlaceSpotQuality.Perfect) { break; } } if (placeSpotQuality > GenPlace.PlaceSpotQuality.Unusable) { return(true); } bestSpot = center; return(false); }
private static GenPlace.PlaceSpotQuality PlaceSpotQualityAt(IntVec3 c, Map map, Thing thing, IntVec3 center, bool allowStacking, Predicate <IntVec3> extraValidator = null) { if (!c.InBounds(map) || !c.Walkable(map)) { return(GenPlace.PlaceSpotQuality.Unusable); } if (extraValidator != null && !extraValidator(c)) { return(GenPlace.PlaceSpotQuality.Unusable); } List <Thing> list = map.thingGrid.ThingsListAt(c); for (int i = 0; i < list.Count; i++) { Thing thing2 = list[i]; if (thing.def.saveCompressible && thing2.def.saveCompressible) { return(GenPlace.PlaceSpotQuality.Unusable); } if (thing.def.category == ThingCategory.Item && thing2.def.category == ThingCategory.Item && (!thing2.CanStackWith(thing) || thing2.stackCount >= thing.def.stackLimit)) { return(GenPlace.PlaceSpotQuality.Unusable); } } if (c.GetRoom(map, RegionType.Set_Passable) == center.GetRoom(map, RegionType.Set_Passable)) { if (allowStacking) { for (int j = 0; j < list.Count; j++) { Thing thing3 = list[j]; if (thing3.def.category == ThingCategory.Item && thing3.CanStackWith(thing) && thing3.stackCount < thing.def.stackLimit) { return(GenPlace.PlaceSpotQuality.Perfect); } } } Pawn pawn = thing as Pawn; bool flag = pawn != null && pawn.Downed; GenPlace.PlaceSpotQuality placeSpotQuality = GenPlace.PlaceSpotQuality.Perfect; for (int k = 0; k < list.Count; k++) { Thing thing4 = list[k]; if (thing4.def.IsDoor) { return(GenPlace.PlaceSpotQuality.Bad); } if (thing4 is Building_WorkTable) { return(GenPlace.PlaceSpotQuality.Bad); } Pawn pawn2 = thing4 as Pawn; if (pawn2 != null) { if (pawn2.Downed || flag) { return(GenPlace.PlaceSpotQuality.Bad); } if (placeSpotQuality > GenPlace.PlaceSpotQuality.Okay) { placeSpotQuality = GenPlace.PlaceSpotQuality.Okay; } } if (thing4.def.category == ThingCategory.Plant && thing4.def.selectable && placeSpotQuality > GenPlace.PlaceSpotQuality.Okay) { placeSpotQuality = GenPlace.PlaceSpotQuality.Okay; } } return(placeSpotQuality); } if (!map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly)) { return(GenPlace.PlaceSpotQuality.Awful); } return(GenPlace.PlaceSpotQuality.Bad); }