public override IEnumerable <IntVec3> PotentialWorkCellsGlobal(Pawn pawn) { Danger maxDanger = pawn.NormalMaxDanger(); List <Building> bList = pawn.Map.listerBuildings.allBuildingsColonist; for (int i = 0; i < bList.Count; i++) { Building_PlantGrower b = bList[i] as Building_PlantGrower; if ((b != null) && b.TryGetComp <CompBotanyPlanter>().GetIsBotanyPlanter) { if (this.ExtraRequirements(b, pawn)) { if (!b.IsForbidden(pawn)) { if (pawn.CanReach(b, PathEndMode.OnCell, maxDanger, false, TraverseMode.ByPawn)) { if (!b.IsBurning()) { foreach (IntVec3 intVec in b.OccupiedRect()) { yield return(intVec); } WorkGiver_GrowerBotany.wantedPlantDef = null; } } } } } } WorkGiver_GrowerBotany.wantedPlantDef = null; List <Zone> zonesList = pawn.Map.zoneManager.AllZones; for (int j = 0; j < zonesList.Count; j++) { Zone_GrowingBotanics growZone = zonesList[j] as Zone_GrowingBotanics; if (growZone != null) { if (growZone.cells.Count == 0) { Log.ErrorOnce("Grow zone has 0 cells: " + growZone, -563487, false); } else if (this.ExtraRequirements(growZone, pawn)) { if (!growZone.ContainsStaticFire) { if (pawn.CanReach(growZone.Cells[0], PathEndMode.OnCell, maxDanger, false, TraverseMode.ByPawn)) { for (int k = 0; k < growZone.cells.Count; k++) { yield return(growZone.cells[k]); } WorkGiver_GrowerBotany.wantedPlantDef = null; } } } } } WorkGiver_GrowerBotany.wantedPlantDef = null; }
// Note: this function must be overriden as the one in WorkGiver_Grower class only takes into account colony's hydroponics basins. // Growing zone are not managed though! public override IEnumerable <IntVec3> PotentialWorkCellsGlobal(Pawn pawn) { List <IntVec3> workCells = new List <IntVec3>(); List <Thing> hydroponicsList = Find.ListerThings.ThingsOfDef(ThingDef.Named("HydroponicsBasin")); for (int plantGrowerIndex = 0; plantGrowerIndex < hydroponicsList.Count; plantGrowerIndex++) { Thing potentialPlantGrower = hydroponicsList[plantGrowerIndex]; if ((potentialPlantGrower.Faction != null) && (potentialPlantGrower.Faction == OG_Util.FactionOfMAndCo)) { Building_PlantGrower plantGrower = potentialPlantGrower as Building_PlantGrower; if (plantGrower == null) { Log.Warning("WorkGiver_GrowerOutpost: found a thing of def HydroponicsBasin or PlantPot which is not a Building_PlantGrower."); continue; } if (GenPlant.GrowthSeasonNow(plantGrower.Position) == false) { continue; } if (this.ExtraRequirements(plantGrower) == false) { continue; } if (plantGrower.IsForbidden(pawn)) { continue; } if (pawn.CanReach(plantGrower, PathEndMode.OnCell, pawn.NormalMaxDanger(), false) == false) { continue; } if (plantGrower.IsBurning()) { continue; } base.DetermineWantedPlantDef(plantGrower.Position); if (WorkGiver_Grower.wantedPlantDef == null) { continue; } foreach (IntVec3 cell in plantGrower.OccupiedRect().Cells) { workCells.Add(cell); } } } return(workCells); }
public static IEnumerable <IntVec3> PotentialWorkCellsGlobalWithoutCanReach(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 || !funcExtraRequirements(__instance, building_PlantGrower, pawn) || building_PlantGrower.IsForbidden(pawn) || building_PlantGrower.IsBurning()) { continue; } foreach (IntVec3 item in building_PlantGrower.OccupiedRect()) { yield return(item); } } 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 (funcExtraRequirements(__instance, growZone, pawn) && !growZone.ContainsStaticFire && pawn.CanReach(growZone.Cells[0], PathEndMode.OnCell, maxDanger)) { for (int k = 0; k < growZone.cells.Count; k++) { yield return(growZone.cells[k]); } } } }
public static bool PotentialWorkCellsGlobal(WorkGiver_Grower __instance, ref IEnumerable <IntVec3> __result, Pawn pawn) { List <IntVec3> result = new List <IntVec3>(); Danger maxDanger = pawn.NormalMaxDanger(); List <Building_PlantGrower> bList = ListerBuildings_Patch.get_AllBuildingsColonistBuilding_PlantGrower(pawn.Map.listerBuildings); //List<Building> bList = pawn.Map.listerBuildings.allBuildingsColonist; sw1.Reset(); sw2.Reset(); sw3.Reset(); sw4.Reset(); sw5.Reset(); sw6.Reset(); sw7.Reset(); sw7.Start(); for (int j = 0; j < bList.Count; j++) { bool flag = false;; Building_PlantGrower building_PlantGrower = bList[j]; // as Building_PlantGrower; sw1.Start(); flag = building_PlantGrower == null; sw1.Stop(); if (flag) { continue; } sw2.Start(); flag = !ExtraRequirements(building_PlantGrower, pawn); sw2.Stop(); if (flag) { continue; } sw3.Start(); flag = building_PlantGrower.IsForbidden(pawn); sw3.Stop(); if (flag) { continue; } sw4.Start(); flag = !pawn.CanReach(building_PlantGrower, PathEndMode.OnCell, maxDanger); sw4.Stop(); if (flag) { continue; } sw5.Start(); flag = building_PlantGrower.IsBurning(); sw5.Stop(); if (flag) { continue; } sw6.Start(); foreach (IntVec3 item in building_PlantGrower.OccupiedRect()) { result.Add(item); } sw6.Stop(); wantedPlantDef = null; } sw7.Stop(); Log.Message("1: " + sw1.ElapsedMilliseconds.ToString() + "ms"); Log.Message("2: " + sw2.ElapsedMilliseconds.ToString() + "ms"); Log.Message("3: " + sw3.ElapsedMilliseconds.ToString() + "ms"); Log.Message("4: " + sw4.ElapsedMilliseconds.ToString() + "ms"); Log.Message("5: " + sw5.ElapsedMilliseconds.ToString() + "ms"); Log.Message("6: " + sw6.ElapsedMilliseconds.ToString() + "ms"); Log.Message("7: " + sw6.ElapsedMilliseconds.ToString() + "ms"); 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 (ExtraRequirements(growZone, pawn) && !growZone.ContainsStaticFire && pawn.CanReach(growZone.Cells[0], PathEndMode.OnCell, maxDanger)) { for (int k = 0; k < growZone.cells.Count; k++) { result.Add(growZone.cells[k]); } wantedPlantDef = null; } } wantedPlantDef = null; __result = result; return(false); }