public static void WildPlantSpawnerListTick() { while (true) { int ticketIndex = Interlocked.Increment(ref wildPlantSpawnerTicksCompleted) - 1; if (ticketIndex >= wildPlantSpawnerTicksCount) { return; } int wildPlantSpawnerIndex = 0; while (ticketIndex < wildPlantSpawnerTicksCount) { int index = ticketIndex; while (ticketIndex >= wildPlantSpawners[wildPlantSpawnerIndex].ticks) { wildPlantSpawnerIndex++; } if (wildPlantSpawnerIndex > 0) { index = ticketIndex - wildPlantSpawners[wildPlantSpawnerIndex - 1].ticks; } try { WildPlantSpawnerStructure wpsStruct = wildPlantSpawners[wildPlantSpawnerIndex]; WildPlantSpawner spawner = wpsStruct.wildPlantSpawnerInstance; int cycleIndex = (wpsStruct.cycleIndexOffset - index) % wpsStruct.area; IntVec3 intVec = wpsStruct.randomCells.Get(cycleIndex); if ((wpsStruct.cycleIndexOffset - index) > wpsStruct.area) { Interlocked.Add(ref wpsStruct.desiredPlants2Tmp1000, 1000 * (int)spawner.GetDesiredPlantsCountAt( intVec, intVec, wpsStruct.plantDensity)); if (intVec.GetTerrain(wildPlantSpawners[wildPlantSpawnerIndex].map).fertility > 0f) { Interlocked.Increment(ref wpsStruct.fertilityCells2Tmp); } float mtb = spawner.GoodRoofForCavePlant(intVec) ? 130f : wpsStruct.map.Biome.wildPlantRegrowDays; if (Rand.Chance(wpsStruct.chance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && spawner.CanRegrowAt(intVec)) { spawner.CheckSpawnWildPlantAt(intVec, wpsStruct.plantDensity, wpsStruct.desiredPlantsTmp1000 / 1000.0f); } } else { Interlocked.Add(ref wpsStruct.desiredPlantsTmp1000, 1000 * (int)spawner.GetDesiredPlantsCountAt(intVec, intVec, wpsStruct.plantDensity)); if (intVec.GetTerrain(wpsStruct.map).fertility > 0f) { Interlocked.Increment(ref wpsStruct.fertilityCellsTmp); } float mtb = spawner.GoodRoofForCavePlant(intVec) ? 130f : wpsStruct.map.Biome.wildPlantRegrowDays; if (Rand.Chance(wpsStruct.chance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && spawner.CanRegrowAt(intVec)) { spawner.CheckSpawnWildPlantAt(intVec, wpsStruct.plantDensity, wpsStruct.desiredPlants); } } if (ticketIndex == wildPlantSpawners[wildPlantSpawnerIndex].ticks - 1) { if ((wpsStruct.cycleIndexOffset - index) > wpsStruct.area) { spawner.calculatedWholeMapNumDesiredPlants = wpsStruct.desiredPlantsTmp1000 / 1000.0f; spawner.calculatedWholeMapNumDesiredPlantsTmp = wpsStruct.desiredPlants2Tmp1000 / 1000.0f; spawner.calculatedWholeMapNumNonZeroFertilityCells = wpsStruct.fertilityCellsTmp; spawner.calculatedWholeMapNumNonZeroFertilityCellsTmp = wpsStruct.fertilityCells2Tmp; } else { spawner.calculatedWholeMapNumDesiredPlantsTmp = wpsStruct.desiredPlantsTmp1000 / 1000.0f; spawner.calculatedWholeMapNumNonZeroFertilityCells = wpsStruct.fertilityCellsTmp; } } } catch (Exception ex) { Log.Error("Exception ticking WildPlantSpawner: " + ex); } ticketIndex = Interlocked.Increment(ref wildPlantSpawnerTicksCompleted) - 1; } } }
private static void ExecuteTicks() { if (thingListNormalTicks > 0) { int index = Interlocked.Decrement(ref thingListNormalTicks); while (index >= 0) { Thing thing = thingListNormal[index]; if (!thing.Destroyed) { try { thing.Tick(); } catch (Exception ex) { string text = thing.Spawned ? (" (at " + thing.Position + ")") : ""; if (Prefs.DevMode) { Log.Error("Exception ticking " + thing.ToStringSafe() + text + ": " + ex); } else { Log.ErrorOnce("Exception ticking " + thing.ToStringSafe() + text + ". Suppressing further errors. Exception: " + ex, thing.thingIDNumber ^ 0x22627165); } } } index = Interlocked.Decrement(ref thingListNormalTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (thingListRareTicks > 0) { int index = Interlocked.Decrement(ref thingListRareTicks); while (index >= 0) { Thing thing = thingListRare[index]; if (!thing.Destroyed) { try { thing.TickRare(); } catch (Exception ex) { string text = thing.Spawned ? (" (at " + thing.Position + ")") : ""; if (Prefs.DevMode) { Log.Error("Exception ticking " + thing.ToStringSafe() + text + ": " + ex); } else { Log.ErrorOnce("Exception ticking " + thing.ToStringSafe() + text + ". Suppressing further errors. Exception: " + ex, thing.thingIDNumber ^ 0x22627165); } } } index = Interlocked.Decrement(ref thingListRareTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (thingListLongTicks > 0) { int index = Interlocked.Decrement(ref thingListLongTicks); while (index >= 0) { Thing thing = thingListLong[index]; if (!thing.Destroyed) { try { thing.TickLong(); } catch (Exception ex) { string text = thing.Spawned ? (" (at " + thing.Position + ")") : ""; if (Prefs.DevMode) { Log.Error("Exception ticking " + thing.ToStringSafe() + text + ": " + ex); } else { Log.ErrorOnce("Exception ticking " + thing.ToStringSafe() + text + ". Suppressing further errors. Exception: " + ex, thing.thingIDNumber ^ 0x22627165); } } } index = Interlocked.Decrement(ref thingListLongTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (worldPawnsTicks > 0) { int index = Interlocked.Decrement(ref worldPawnsTicks); while (index >= 0) { Pawn pawn = worldPawnsAlive[index]; try { pawn.Tick(); } catch (Exception ex) { Log.ErrorOnce("Exception ticking world pawn " + pawn.ToStringSafe() + ". Suppressing further errors. " + (object)ex, pawn.thingIDNumber ^ 1148571423, false); } try { if (!pawn.Dead && !pawn.Destroyed && (pawn.IsHashIntervalTick(7500) && !pawn.IsCaravanMember()) && !PawnUtility.IsTravelingInTransportPodWorldObject(pawn)) { TendUtility.DoTend(null, pawn, null); } } catch (Exception ex) { Log.ErrorOnce("Exception tending to a world pawn " + pawn.ToStringSafe() + ". Suppressing further errors. " + (object)ex, pawn.thingIDNumber ^ 8765780, false); } index = Interlocked.Decrement(ref worldPawnsTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (worldObjectsTicks > 0) { int index = Interlocked.Decrement(ref worldObjectsTicks); while (index >= 0) { try { worldObjects[index].Tick(); } catch (Exception ex) { Log.Error("Exception ticking " + worldObjects[index].ToStringSafe() + ": " + ex); } index = Interlocked.Decrement(ref worldObjectsTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (steadyEnvironmentEffectsTicks > 0) { int index = Interlocked.Decrement(ref steadyEnvironmentEffectsTicks); while (index >= 0) { int cycleIndex = (steadyEnvironmentEffectsCycleIndexOffset - index) % steadyEnvironmentEffectsArea; IntVec3 c = steadyEnvironmentEffectsCellsInRandomOrder.Get(cycleIndex); try { SteadyEnvironmentEffects_Patch.DoCellSteadyEffects(steadyEnvironmentEffectsInstance, c); } catch (Exception ex) { Log.Error("Exception ticking steadyEnvironmentEffectsCells " + index.ToStringSafe() + ": " + ex); } //Interlocked.Increment(ref SteadyEnvironmentEffects_Patch.cycleIndex(steadyEnvironmentEffectsInstance)); index = Interlocked.Decrement(ref steadyEnvironmentEffectsTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (plantMaterialsCount > 0) { int index = Interlocked.Decrement(ref plantMaterialsCount); while (index >= 0) { try { WindManager_Patch.plantMaterials[index].SetFloat(ShaderPropertyIDs.SwayHead, plantSwayHead); } catch (Exception ex) { Log.Error("Exception ticking " + WindManager_Patch.plantMaterials[index].ToStringSafe() + ": " + ex); } index = Interlocked.Decrement(ref plantMaterialsCount); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (allFactionsTicks > 0) { int index = Interlocked.Decrement(ref allFactionsTicks); while (index >= 0) { try { allFactions[index].FactionTick(); } catch (Exception ex) { Log.Error("Exception ticking " + allFactions[index].ToStringSafe() + ": " + ex); } index = Interlocked.Decrement(ref allFactionsTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (WildPlantSpawnerTicks > 0) { int index = Interlocked.Decrement(ref WildPlantSpawnerTicks); while (index >= 0) { int cycleIndex = (WildPlantSpawnerCycleIndexOffset - index) % WildPlantSpawnerArea; try { IntVec3 intVec = WildPlantSpawnerCellsInRandomOrder.Get(cycleIndex); if ((WildPlantSpawnerCycleIndexOffset - index) > WildPlantSpawnerArea) { Interlocked.Add(ref DesiredPlants2Tmp1000, 1000 * (int)WildPlantSpawner_Patch.GetDesiredPlantsCountAt2(WildPlantSpawnerMap, intVec, intVec, WildPlantSpawnerCurrentPlantDensity)); if (intVec.GetTerrain(WildPlantSpawnerMap).fertility > 0f) { Interlocked.Increment(ref FertilityCells2Tmp); } float mtb = WildPlantSpawner_Patch.GoodRoofForCavePlant2(WildPlantSpawnerMap, intVec) ? 130f : WildPlantSpawnerMap.Biome.wildPlantRegrowDays; if (Rand.Chance(WildPlantSpawnerChance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && WildPlantSpawner_Patch.CanRegrowAt2(WildPlantSpawnerMap, intVec)) { WildPlantSpawnerInstance.CheckSpawnWildPlantAt(intVec, WildPlantSpawnerCurrentPlantDensity, DesiredPlantsTmp1000 / 1000.0f); } } else { Interlocked.Add(ref DesiredPlantsTmp1000, 1000 * (int)WildPlantSpawner_Patch.GetDesiredPlantsCountAt2(WildPlantSpawnerMap, intVec, intVec, WildPlantSpawnerCurrentPlantDensity)); if (intVec.GetTerrain(WildPlantSpawnerMap).fertility > 0f) { Interlocked.Increment(ref FertilityCellsTmp); } float mtb = WildPlantSpawner_Patch.GoodRoofForCavePlant2(WildPlantSpawnerMap, intVec) ? 130f : WildPlantSpawnerMap.Biome.wildPlantRegrowDays; if (Rand.Chance(WildPlantSpawnerChance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && WildPlantSpawner_Patch.CanRegrowAt2(WildPlantSpawnerMap, intVec)) { WildPlantSpawnerInstance.CheckSpawnWildPlantAt(intVec, WildPlantSpawnerCurrentPlantDensity, DesiredPlants); } } } catch (Exception ex) { Log.Error("Exception ticking WildPlantSpawner: " + ex); } index = Interlocked.Decrement(ref WildPlantSpawnerTicks); } if ((WildPlantSpawnerCycleIndexOffset - index) > WildPlantSpawnerArea) { WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlants(WildPlantSpawnerInstance) = DesiredPlantsTmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlantsTmp(WildPlantSpawnerInstance) = DesiredPlants2Tmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCells(WildPlantSpawnerInstance) = FertilityCellsTmp; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCellsTmp(WildPlantSpawnerInstance) = FertilityCells2Tmp; } else { WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlantsTmp(WildPlantSpawnerInstance) = DesiredPlantsTmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCells(WildPlantSpawnerInstance) = FertilityCellsTmp; } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (TradeShipTicks > 0) { int index = Interlocked.Decrement(ref TradeShipTicks); while (index >= 0) { Pawn pawn = TradeShipThings[index] as Pawn; if (pawn != null) { try { pawn.Tick(); } catch (Exception ex) { Log.Error("Exception ticking Pawn: " + pawn.ToStringSafe() + " " + ex); } if (pawn.Dead) { lock (TradeShipThings) { TradeShipThings.Remove(pawn); } } } index = Interlocked.Decrement(ref TradeShipTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } else if (WorldComponentTicks > 0) { int index = Interlocked.Decrement(ref WorldComponentTicks); while (index >= 0) { //try //{ WorldComponent wc = WorldComponents[index]; if (null != wc) { lock (wc) { try { wc.WorldComponentTick(); } catch (Exception ex) { Log.Error("Exception ticking World Component: " + wc.ToStringSafe() + ex); } } } //} //catch (Exception ex) //{ // Log.Error(ex.ToString()); //} index = Interlocked.Decrement(ref WorldComponentTicks); } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } /* * while(drawQueue.TryDequeue(out Thing drawThing)) * { * IntVec3 position = drawThing.Position; * if ((cellRect.Contains(position) || drawThing.def.drawOffscreen) && (!fogGrid[cellIndices.CellToIndex(position)] || drawThing.def.seeThroughFog) && (drawThing.def.hideAtSnowDepth >= 1.0 || snowGrid.GetDepth(position) <= (double)drawThing.def.hideAtSnowDepth)) * { * try * { * drawThing.Draw(); * } * catch (Exception ex) * { * Log.Error("Exception drawing " + (object)drawThing + ": " + ex.ToString(), false); * } * } * } */ }