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;
        }
 public static void SetPlantDefToGrow(Building_PlantGrower __instance, ThingDef plantDef)
 {
     if (Current.ProgramState == ProgramState.Playing)
     {
         foreach (IntVec3 c in __instance.OccupiedRect())
         {
             PlantSowing_Cache.ReregisterObject(__instance.Map, c, WorkGiver_Grower_Patch.awaitingPlantCellsMapDict);
         }
     }
 }
        // 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);
        }
Пример #4
0
        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;
        }
Пример #5
0
        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);
        }