public static void Postfix(ref IEnumerable <Gizmo> __result, Building_PlantGrower __instance) { var list = __result.ToList(); Priority priority = PriorityTracker.plantBuildingPriorities.TryGetValue(__instance, out PriorityIntHolder intp) ? (Priority)intp.Int : Priority.Normal; list.Add(new Command_GrowingPriority((int)priority) { defaultLabel = $"Priority {priority}", defaultDesc = $"Set this growing zone's priority. Current priority = {priority}", icon = TexCommand.ForbidOff, onChanged = (x) => { var p = PriorityTracker.plantBuildingPriorities; if (p.ContainsKey(__instance)) { p[__instance].Int = x; } else { p[__instance] = new PriorityIntHolder(x); } } }); __result = list; }
//public override IEnumerable<Gizmo> GetGizmos() static void Postfix(Building_PlantGrower __instance, ref IEnumerable <Gizmo> __result) { if (!Mod.settings.zoneHarvestableToggle) { return; } List <Gizmo> result = new List <Gizmo>(__result); Gizmo harvestGizmo = new Command_Toggle { defaultLabel = "TD.AllowHarvesting".Translate(), defaultDesc = "TD.AllowHarvestingDesc".Translate(), icon = ContentFinder <UnityEngine.Texture2D> .Get("UI/Designators/Harvest", true), isActive = (() => __instance.CanHarvest()), toggleAction = delegate { __instance.ToggleHarvest(); } }; result.Add(harvestGizmo); // make caller use the list __result = result.AsEnumerable(); }
private void GatherSingleZoneData(Building_PlantGrower plantGrower, out SinglePlantGrowerData data) { data = new SinglePlantGrowerData(); data.plantGrower = plantGrower; int growthRate; float harvestMinGrowth = plantGrower.GetPlantDefToGrow().plant.harvestMinGrowth * 100; //analyze growth values foreach (Plant plant in plantGrower.PlantsOnMe) { if (plant != null) { growthRate = (int)(plant.Growth * 100); data.growRatesAbsolute[growthRate]++; data.totalPlantedCount++; if (growthRate >= 100) { data.fullyGrownPlants.Add(plant); } if (growthRate >= harvestMinGrowth) { data.harvestablePlants.Add(plant); } } } //add curve points growthValueDrawInfo.curve = new SimpleCurve(); float maxYValue = 0; if (data.totalPlantedCount > 0) { for (int i = 0; i < data.growRatesAbsolute.Length; i++) { growthValueDrawInfo.curve.Add(new CurvePoint((float)i, 100 * data.growRatesAbsolute[i] / data.totalPlantedCount), false); } maxYValue = 100 * data.growthRateMaxCount / data.totalPlantedCount + 5; } else { growthValueDrawInfo.curve.Add(new CurvePoint(0f, 0f), false); growthValueDrawInfo.curve.Add(new CurvePoint(100f, 0f), false); maxYValue = 5; } //draw vertical marker harvestableMarkerDrawInfo.color = Color.white; harvestableMarkerDrawInfo.curve = new SimpleCurve(); harvestableMarkerDrawInfo.curve.Add(-5, -5f, false); harvestableMarkerDrawInfo.curve.Add(harvestMinGrowth, -5f, false); harvestableMarkerDrawInfo.curve.Add(harvestMinGrowth, Math.Min(100, maxYValue), false); harvestableMarkerDrawInfo.curve.Add(harvestMinGrowth, -5f, false); curves.Add(growthValueDrawInfo); curves.Add(harvestableMarkerDrawInfo); }
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 Postfix(ref IEnumerable <Gizmo> __result, Building_PlantGrower __instance) { var priority = PriorityTracker.plantBuildingPriorities.TryGetValue(__instance, out var intp) ? (Priority)intp.Int : Priority.Normal; __result = __result.Append(new Command_GrowingPriority(priority)); }
public static void GetInspectString_PostFix(Building_PlantGrower __instance, ref string __result) { if (__result.Substring(1, 1) == "G") { __result = __result.Substring(1, __result.Length - 1); } return; }
public static void Postfix(Building_PlantGrower __instance) { if (!PriorityTracker.plantBuildingPriorities.ContainsKey(__instance)) { PriorityTracker.plantBuildingPriorities[__instance] = new PriorityIntHolder((int)Priority.Normal); } Scribe_Values.Look <int>(ref PriorityTracker.plantBuildingPriorities[__instance].Int, "growingPriority", (int)Priority.Normal, false); }
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); } } }
public void Clear() { plantGrower = null; totalOccupiedCells = 0; totalPlantedCount = 0; harvestablePlants.Clear(); fullyGrownPlants.Clear(); for (int i = 0; i < 101; i++) { growRatesAbsolute[i] = 0; } }
// 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 void GenerateBigRoomHydroponics(IntVec3 areaSouthWestOrigin, int zoneAbs, int zoneOrd, Rot4 rotation, ref OG_OutpostData outpostData) { IntVec3 origin = Zone.GetZoneOrigin(areaSouthWestOrigin, zoneAbs, zoneOrd); IntVec3 rotatedOrigin = Zone.GetZoneRotatedOrigin(areaSouthWestOrigin, zoneAbs, zoneOrd, rotation); OG_Common.GenerateEmptyRoomAt(rotatedOrigin, Genstep_GenerateOutpost.zoneSideSize, Genstep_GenerateOutpost.zoneSideSize, rotation, TerrainDefOf.Concrete, TerrainDef.Named("SterileTile"), ref outpostData); // Spawn doors. OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(5, 0, 10).RotatedBy(rotation), ref outpostData); OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(10, 0, 5).RotatedBy(rotation), ref outpostData); OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(5, 0, 0).RotatedBy(rotation), ref outpostData); OG_Common.SpawnDoorAt(rotatedOrigin + new IntVec3(0, 0, 5).RotatedBy(rotation), ref outpostData); // Spawn sun lamp. OG_Common.TrySpawnThingAt(ThingDef.Named("SunLamp"), null, rotatedOrigin + new IntVec3(5, 0, 5).RotatedBy(rotation), false, Rot4.Invalid, ref outpostData); // Spawn hydroponics basins. Building_PlantGrower hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(1, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantStrawberry")); hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(3, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantCorn")); hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(4, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantCorn")); hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(6, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantCorn")); hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(7, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantCorn")); hydroponics = OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(9, 0, 2).RotatedBy(rotation), true, rotation, ref outpostData) as Building_PlantGrower; hydroponics.SetPlantDefToGrow(ThingDef.Named("PlantStrawberry")); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(1, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(3, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(4, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(6, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(7, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); OG_Common.TrySpawnThingAt(ThingDef.Named("HydroponicsBasin"), null, rotatedOrigin + new IntVec3(9, 0, 7).RotatedBy(rotation), true, rotation, ref outpostData); // Spawn heaters and coolers. OG_Common.TrySpawnHeaterAt(rotatedOrigin + new IntVec3(2, 0, 1).RotatedBy(rotation), ref outpostData); OG_Common.TrySpawnHeaterAt(rotatedOrigin + new IntVec3(8, 0, 1).RotatedBy(rotation), ref outpostData); OG_Common.TrySpawnHeaterAt(rotatedOrigin + new IntVec3(2, 0, 9).RotatedBy(rotation), ref outpostData); OG_Common.TrySpawnHeaterAt(rotatedOrigin + new IntVec3(8, 0, 9).RotatedBy(rotation), ref outpostData); OG_Common.SpawnCoolerAt(rotatedOrigin + new IntVec3(2, 0, 0).RotatedBy(rotation), new Rot4(Rot4.South.AsInt + rotation.AsInt), ref outpostData); OG_Common.SpawnCoolerAt(rotatedOrigin + new IntVec3(8, 0, 0).RotatedBy(rotation), new Rot4(Rot4.South.AsInt + rotation.AsInt), ref outpostData); OG_Common.SpawnCoolerAt(rotatedOrigin + new IntVec3(2, 0, 10).RotatedBy(rotation), new Rot4(Rot4.North.AsInt + rotation.AsInt), ref outpostData); OG_Common.SpawnCoolerAt(rotatedOrigin + new IntVec3(8, 0, 10).RotatedBy(rotation), new Rot4(Rot4.North.AsInt + rotation.AsInt), ref outpostData); OG_Common.GenerateHorizontalAndVerticalPavedAlleys(origin); }
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; }
public static void IsResting(Plant __instance, ref bool __result) { bool isInBasin = false; foreach (var cri in __instance.OccupiedRect()) { List<Thing> thingList = __instance.Map.thingGrid.ThingsListAt(cri); for (int i = 0; i < thingList.Count; i++) { Building_PlantGrower pg = thingList[i] as Building_PlantGrower; if (pg != null) { isInBasin = true; break; } } } if (isInBasin) __result = false; }
/* * public void Initialize() * { * // Plant Traps * for (int i = 0; i < this.def.comps.Count; i++) { * ThingComp thingComp = (ThingComp)Activator.CreateInstance (this.def.comps [i].compClass); * thingComp.parent = this; * this.comps.Add (thingComp); * thingComp.Initialize (this.def.comps [i]); * } * } */ // find the pot this is in protected bool initPot() { if (base.Map == null) { return(false); } List <Thing> list = base.Map.thingGrid.ThingsListAt(base.Position); for (int i = 0; i < list.Count; i++) { Thing thing = list[i]; if (thing is Building_PlantGrower) { // Log.Warning("PlantTrap found pot"); this.thepot = (Building_PlantGrower)thing; } } // Log.Warning("PlantTrap pot : "+this.thepot); // Log.Warning("Creating Plant_Trap with properties:"); // Helpers.PrintObject(this.def.planttraps); //((DruidPlantProperties)this.def.plant).planttraps); return(true); }
private void SyncAllGroups() { for (int i = 0; i < plantGrowerGroups.Count; i++) { ThingDef groupPlantDef = (plantGrowerGroups[i][0] as Building_PlantGrower).GetPlantDefToGrow(); /* * NOTE * The following code is heavily based on the plant syncing code in Plant Growth Sync by Lanilor. * This is so that people using this alongside Plant Growth Sync will have their crops synced in a similar way. * * LINKS * https://steamcommunity.com/sharedfiles/filedetails/?id=1454228967&searchtext=Plant+Growth+Sync * https://github.com/Lanilor/Simple-Mods-Collection * */ List <Plant> plantsToSync = new List <Plant>(); float averageGrowth = 0f; for (int j = 0; j < plantGrowerGroups[i].Count; j++) { Building_PlantGrower plantGrower = plantGrowerGroups[i][j] as Building_PlantGrower; foreach (Plant plant in plantGrower.PlantsOnMe) { if (plant.def == groupPlantDef && plant.IsCrop && plant.LifeStage == PlantLifeStage.Growing) { plantsToSync.Add(plant); averageGrowth += plant.Growth; } } } if (plantsToSync.Count < 2) { continue; } averageGrowth /= plantsToSync.Count; float marginFromAverage = SyncRatePerFullGrowth / (groupPlantDef.plant.growDays * 30f); int numUnderAverage = 0; int numAboveAverage = 0; for (int k = plantsToSync.Count - 1; 0 <= k; k--) { if (Mathf.Abs(averageGrowth - plantsToSync[k].Growth) <= marginFromAverage) { plantsToSync[k].Growth = averageGrowth; plantsToSync.RemoveAt(k); } else { if (plantsToSync[k].Growth > averageGrowth) { numAboveAverage++; } if (plantsToSync[k].Growth < averageGrowth) { numUnderAverage++; } } } float underMultiplier = 1f; float aboveMultiplier = 1f; if (numUnderAverage > 0 && numAboveAverage > 0) { if (numUnderAverage > numAboveAverage) { underMultiplier = numAboveAverage / (float)numUnderAverage; } else { aboveMultiplier = numUnderAverage / (float)numAboveAverage; } } for (int l = 0; l < plantsToSync.Count; l++) { if (plantsToSync[l].Growth < averageGrowth) { plantsToSync[l].Growth += marginFromAverage * underMultiplier; } if (plantsToSync[l].Growth > averageGrowth) { plantsToSync[l].Growth -= marginFromAverage * aboveMultiplier; } } } }
public static bool CanBeGroupedTo(this Building_PlantGrower lhs, Building_PlantGrower rhs) { return(lhs.IsConnectedTo(rhs) && lhs.GetPlantDefToGrow() == rhs.GetPlantDefToGrow()); }
public static void Postfix(Building_PlantGrower __instance) { PriorityTracker.plantBuildingPriorities.Remove(__instance); }
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); }