public override bool TryExecuteWorker(IncidentParms parms) { if (def.mechClusterBuilding == null) { return(false); } if (!def.mechClusterBuilding.HasModExtension <HiveDefExtension>()) { return(false); } HiveDefExtension ext = def.mechClusterBuilding.GetModExtension <HiveDefExtension>(); Map map = (Map)parms.target; if (parms.faction == null) { try { IEnumerable <Faction> factions = Find.FactionManager.AllFactions.Where(x => x.def.defName.Contains(ext.Faction.defName)); if (!factions.EnumerableNullOrEmpty()) { parms.faction = factions.RandomElement(); } else { parms.faction = FactionGenerator.NewGeneratedFaction(new FactionGeneratorParms(ext.Faction)); } // Log.Message(parms.faction.def.defName); } catch (System.Exception) { Faction faction = Find.FactionManager.FirstFactionOfDef(ext.Faction); if (faction == null) { faction = FactionGenerator.NewGeneratedFaction(new FactionGeneratorParms(ext.Faction)); } parms.faction = faction; } } CompProperties_SpawnerPawn spawnerPawn = def.mechClusterBuilding.GetCompProperties <CompProperties_SpawnerPawn>(); float points = spawnerPawn?.initialPawnsPoints ?? 250f; int count = Mathf.Max(GenMath.RoundRandom(parms.points / points), 1); Thing t = InfestationUtility.SpawnTunnels(def.mechClusterBuilding, count, map, true, true, faction: parms.faction); SendStandardLetter(parms, t); Find.TickManager.slower.SignalForceNormalSpeedShort(); return(true); }
// Token: 0x06003E46 RID: 15942 RVA: 0x00148B70 File Offset: 0x00146D70 public override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; if (def.mechClusterBuilding == null) { Log.Error("Hivedef (def.mechClusterBuilding) not set"); return(false); } if (!def.mechClusterBuilding.HasModExtension <HiveDefExtension>()) { Log.Error("Hivedef (def.mechClusterBuilding) missing HiveExtension"); return(false); } ThingDef hiveDef = def.mechClusterBuilding; HiveDefExtension hive = hiveDef.GetModExtension <HiveDefExtension>(); if (hive == null) { return(false); } if (parms.faction == null) { try { parms.faction = Find.FactionManager.AllFactions.Where(x => x.def.defName.Contains(hive.Faction.defName)) /*.Where(x => (float)GenDate.DaysPassed >= x.def.earliestRaidDays)*/.RandomElement(); // Log.Message(parms.faction.def.defName); } catch (System.Exception) { parms.faction = Find.FactionManager.FirstFactionOfDef(hive.Faction); } } ThingDef tunnelDef = hive.TunnelDef ?? RimWorld.ThingDefOf.TunnelHiveSpawner; IncidentWorker_GrowZoneInfestation.tmpZones.Clear(); ExtraInfestationIncidentUtility.GetUsableGrowZones(map, IncidentWorker_GrowZoneInfestation.tmpZones); Zone_Growing growZone; IntVec3 intVec = IntVec3.Invalid; if (IncidentWorker_GrowZoneInfestation.tmpZones.TryRandomElementByWeight(x => x.Cells.Count, out growZone)) { intVec = CellFinder.FindNoWipeSpawnLocNear(growZone.Cells.RandomElement(), map, tunnelDef, Rot4.North, 2, (IntVec3 x) => x.Walkable(map) && x.GetFirstThing(map, hiveDef) == null && x.GetFirstThingWithComp <ThingComp>(map) == null && x.GetFirstThing(map, RimWorld.ThingDefOf.Hive) == null && x.GetFirstThing(map, RimWorld.ThingDefOf.TunnelHiveSpawner) == null && !x.Roofed(map) && x.UsesOutdoorTemperature(map)); if (intVec == growZone.Position) { Log.Error("intVec == growZone.Position"); return(false); } } else { RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, 0); if (RCellFinder.TryFindRandomSpotJustOutsideColony(intVec, map, out intVec)) { Log.Warning("Found spot outside colony"); } else { Log.Warning("failed to find interesting location, use map edge"); } // intVec = CellFinder.FindNoWipeSpawnLocNear(intVec, map, hiveDef, Rot4.North, 10, (IntVec3 x) => x.Walkable(map) && x.GetFirstThing(map, hiveDef) == null && x.GetFirstThingWithComp<ThingComp>(map) == null && x.GetFirstThing(map, ThingDefOf.Hive) == null && x.GetFirstThing(map, ThingDefOf.TunnelHiveSpawner) == null && !x.Roofed(map) && x.UsesOutdoorTemperature(map)); } if (intVec == IntVec3.Invalid) { Log.Error("intVec == IntVec3.Invalid"); return(false); } CompProperties_SpawnerPawn spawnerPawn = def.mechClusterBuilding.GetCompProperties <CompProperties_SpawnerPawn>(); float points = spawnerPawn?.initialPawnsPoints ?? 250f; Thing t = InfestationUtility.SpawnTunnels(def.mechClusterBuilding, Mathf.Max(GenMath.RoundRandom(parms.points / points), 1), map, intVec, true, true, faction: parms.faction); /* * TunnelHiveSpawner tunnelHiveSpawner = (TunnelHiveSpawner)ThingMaker.MakeThing(tunnelDef, null); * tunnelHiveSpawner.spawnHive = true; * tunnelHiveSpawner.insectsPoints = Mathf.Clamp(parms.points * Rand.Range(0.3f, 0.6f), 200f, 1000f); * tunnelHiveSpawner.spawnedByInfestationThingComp = true; * GenSpawn.Spawn(tunnelHiveSpawner, intVec, map, WipeMode.FullRefund); */ base.SendStandardLetter(parms, new TargetInfo(intVec, map, false), Array.Empty <NamedArgument>()); return(true); }