private static IEnumerable <IntVec3> PotentialWorkCellsGlobalIE(WorkGiver_Grower __instance, Pawn pawn) { Danger maxDanger = pawn.NormalMaxDanger(); List <Building> bList = pawn.Map.listerBuildings.allBuildingsColonist; for (int j = 0; j < bList.Count; j++) { Building_PlantGrower building_PlantGrower = bList[j] as Building_PlantGrower; if (building_PlantGrower == null || !__instance.ExtraRequirements(building_PlantGrower, pawn) || building_PlantGrower.IsForbidden(pawn) || //!pawn.CanReach(building_PlantGrower, PathEndMode.OnCell, maxDanger) || building_PlantGrower.IsBurning()) { continue; } foreach (IntVec3 item in building_PlantGrower.OccupiedRect()) { yield return(item); } wantedPlantDef = null; } wantedPlantDef = null; List <Zone> zonesList = pawn.Map.zoneManager.AllZones; for (int j = 0; j < zonesList.Count; j++) { Zone_Growing growZone = zonesList[j] as Zone_Growing; if (growZone == null) { continue; } if (growZone.cells.Count == 0) { Log.ErrorOnce("Grow zone has 0 cells: " + growZone, -563487); } else if (__instance.ExtraRequirements(growZone, pawn) && !growZone.ContainsStaticFire && pawn.CanReach(growZone.Cells.First(), PathEndMode.OnCell, maxDanger)) { for (int k = 0; k < growZone.cells.Count; k++) { yield return(growZone.cells[k]); } wantedPlantDef = null; growZone = null; } } wantedPlantDef = null; }
internal static IntVec3 ClosestLocationReachable(WorkGiver_Grower workGiver_Grower, Pawn pawn) { Danger maxDanger = pawn.NormalMaxDanger(); //wantedPlantDef = null; //List<Zone> zonesList = pawn.Map.zoneManager.AllZones; //for (int j = 0; j < zonesList.Count; j++) //{ //if (growZone.cells.Count == 0) //{ //Log.ErrorOnce("Grow zone has 0 cells: " + growZone, -563487); //} bool forced = false; Map map = pawn.Map; ZoneManager zoneManager = pawn.Map.zoneManager; foreach (IntVec3 actionableLocation in PlantSowing_Cache.GetClosestActionableLocations(pawn, map, awaitingPlantCellsMapDict)) { List <Thing> thingsAtLocation = GridsUtility.GetThingList(actionableLocation, map); foreach (Thing thingAtLocation in thingsAtLocation) { if (thingAtLocation is Building_PlantGrower building_PlantGrower) { if (building_PlantGrower == null || !workGiver_Grower.ExtraRequirements(building_PlantGrower, pawn) || building_PlantGrower.IsForbidden(pawn) || !pawn.CanReach(building_PlantGrower, PathEndMode.OnCell, maxDanger) //|| building_PlantGrower.IsBurning() ) { continue; } //foreach (IntVec3 item in building_PlantGrower.OccupiedRect()) //{ //return item; //TODO ADD check //} return(actionableLocation); } } if (!(zoneManager.ZoneAt(actionableLocation) is Zone_Growing growZone)) { continue; } if (!workGiver_Grower.ExtraRequirements(growZone, pawn)) { continue; } if (!JobOnCellTest(workGiver_Grower.def, pawn, actionableLocation, forced)) { continue; } //!growZone.ContainsStaticFire && if (!workGiver_Grower.HasJobOnCell(pawn, actionableLocation)) { continue; } if (!pawn.CanReach(actionableLocation, PathEndMode.OnCell, maxDanger)) { continue; } return(actionableLocation); } //wantedPlantDef = null; return(IntVec3.Invalid); }