private static void ExecuteTicks() { if (mapPreTickComplete && 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 (tickListNormalComplete && 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 (tickListRareComplete && 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 (tickListLongComplete && 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 (worldTickComplete && 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 (worldTickComplete && 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 (worldTickComplete && 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 (mapPostTickComplete && steadyEnvironmentEffectsTicksCompleted < totalSteadyEnvironmentEffectsTicks) { int ticketIndex = Interlocked.Increment(ref steadyEnvironmentEffectsTicksCompleted) - 1; int steadyEnvironmentEffectsIndex = 0; while (ticketIndex < totalSteadyEnvironmentEffectsTicks) { int index = ticketIndex; while (ticketIndex >= steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex].steadyEnvironmentEffectsTicks) { steadyEnvironmentEffectsIndex++; } if (steadyEnvironmentEffectsIndex > 0) { index = ticketIndex - steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex - 1].steadyEnvironmentEffectsTicks; } int cycleIndex = (steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex].steadyEnvironmentEffectsCycleIndexOffset - index) % steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex].steadyEnvironmentEffectsArea; IntVec3 c = steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex].steadyEnvironmentEffectsCellsInRandomOrder.Get(cycleIndex); try { SteadyEnvironmentEffects_Patch.DoCellSteadyEffects( steadyEnvironmentEffectsStructures[steadyEnvironmentEffectsIndex].steadyEnvironmentEffects, c); } catch (Exception ex) { Log.Error("Exception ticking steadyEnvironmentEffectsCells " + index.ToStringSafe() + ": " + ex); } //Interlocked.Increment(ref SteadyEnvironmentEffects_Patch.cycleIndex(steadyEnvironmentEffectsInstance)); ticketIndex = Interlocked.Increment(ref steadyEnvironmentEffectsTicksCompleted) - 1; } if (ticketIndex == totalSteadyEnvironmentEffectsTicks) { Interlocked.Increment(ref listsFullyProcessed); } } else if (mapPostTickComplete && wildPlantSpawnerTicksCompleted < wildPlantSpawnerTicksCount) { int ticketIndex = Interlocked.Increment(ref wildPlantSpawnerTicksCompleted) - 1; int wildPlantSpawnerIndex = 0; WildPlantSpawnerStructure wildPlantSpawner; int index; while (ticketIndex < wildPlantSpawnerTicksCount) { index = ticketIndex; while (ticketIndex >= wildPlantSpawners[wildPlantSpawnerIndex].WildPlantSpawnerTicks) { wildPlantSpawnerIndex++; } if (wildPlantSpawnerIndex > 0) { index = ticketIndex - wildPlantSpawners[wildPlantSpawnerIndex - 1].WildPlantSpawnerTicks; } try { wildPlantSpawner = wildPlantSpawners[wildPlantSpawnerIndex]; int cycleIndex = (wildPlantSpawner.WildPlantSpawnerCycleIndexOffset - index) % wildPlantSpawner.WildPlantSpawnerArea; IntVec3 intVec = wildPlantSpawner.WildPlantSpawnerCellsInRandomOrder.Get(cycleIndex); if ((wildPlantSpawner.WildPlantSpawnerCycleIndexOffset - index) > wildPlantSpawner.WildPlantSpawnerArea) { Interlocked.Add(ref wildPlantSpawner.DesiredPlants2Tmp1000, 1000 * (int)WildPlantSpawner_Patch.GetDesiredPlantsCountAt2( wildPlantSpawner.WildPlantSpawnerMap, intVec, intVec, wildPlantSpawner.WildPlantSpawnerCurrentPlantDensity)); if (intVec.GetTerrain(wildPlantSpawners[wildPlantSpawnerIndex].WildPlantSpawnerMap).fertility > 0f) { Interlocked.Increment(ref wildPlantSpawner.FertilityCells2Tmp); } float mtb = WildPlantSpawner_Patch.GoodRoofForCavePlant2( wildPlantSpawner.WildPlantSpawnerMap, intVec) ? 130f : wildPlantSpawner.WildPlantSpawnerMap.Biome.wildPlantRegrowDays; if (Rand.Chance(wildPlantSpawner.WildPlantSpawnerChance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && WildPlantSpawner_Patch.CanRegrowAt2(wildPlantSpawner.WildPlantSpawnerMap, intVec)) { wildPlantSpawner.WildPlantSpawnerInstance.CheckSpawnWildPlantAt(intVec, wildPlantSpawner.WildPlantSpawnerCurrentPlantDensity, wildPlantSpawner.DesiredPlantsTmp1000 / 1000.0f); } } else { Interlocked.Add(ref wildPlantSpawner.DesiredPlantsTmp1000, 1000 * (int)WildPlantSpawner_Patch.GetDesiredPlantsCountAt2( wildPlantSpawner.WildPlantSpawnerMap, intVec, intVec, wildPlantSpawner.WildPlantSpawnerCurrentPlantDensity)); if (intVec.GetTerrain(wildPlantSpawner.WildPlantSpawnerMap).fertility > 0f) { Interlocked.Increment(ref wildPlantSpawner.FertilityCellsTmp); } float mtb = WildPlantSpawner_Patch.GoodRoofForCavePlant2(wildPlantSpawner.WildPlantSpawnerMap, intVec) ? 130f : wildPlantSpawner.WildPlantSpawnerMap.Biome.wildPlantRegrowDays; if (Rand.Chance(wildPlantSpawner.WildPlantSpawnerChance) && Rand.MTBEventOccurs(mtb, 60000f, 10000) && WildPlantSpawner_Patch.CanRegrowAt2(wildPlantSpawner.WildPlantSpawnerMap, intVec)) { wildPlantSpawner.WildPlantSpawnerInstance.CheckSpawnWildPlantAt(intVec, wildPlantSpawner.WildPlantSpawnerCurrentPlantDensity, wildPlantSpawner.DesiredPlants); } } if (ticketIndex == wildPlantSpawners[wildPlantSpawnerIndex].WildPlantSpawnerTicks - 1) { if ((wildPlantSpawner.WildPlantSpawnerCycleIndexOffset - index) > wildPlantSpawner.WildPlantSpawnerArea) { WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlants(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.DesiredPlantsTmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlantsTmp(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.DesiredPlants2Tmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCells(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.FertilityCellsTmp; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCellsTmp(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.FertilityCells2Tmp; } else { WildPlantSpawner_Patch.calculatedWholeMapNumDesiredPlantsTmp(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.DesiredPlantsTmp1000 / 1000.0f; WildPlantSpawner_Patch.calculatedWholeMapNumNonZeroFertilityCells(wildPlantSpawner.WildPlantSpawnerInstance) = wildPlantSpawner.FertilityCellsTmp; } if (index == -1) { Interlocked.Increment(ref listsFullyProcessed); } } } catch (Exception ex) { Log.Error("Exception ticking WildPlantSpawner: " + ex); } ticketIndex = Interlocked.Increment(ref wildPlantSpawnerTicksCompleted) - 1; } if (ticketIndex == wildPlantSpawnerTicksCount) { Interlocked.Increment(ref listsFullyProcessed); } } else if (mapPostTickComplete && totalTradeShipTicksCompleted < totalTradeShipTicks) { int ticketIndex = Interlocked.Increment(ref totalTradeShipTicksCompleted) - 1; int totalTradeShipIndex = 0; while (ticketIndex < totalTradeShipTicks) { int index = ticketIndex; while (ticketIndex >= tradeShips[totalTradeShipIndex].TradeShipTicks) { totalTradeShipIndex++; } if (totalTradeShipIndex > 0) { index = ticketIndex - tradeShips[totalTradeShipIndex - 1].TradeShipTicks; } Pawn pawn = tradeShips[totalTradeShipIndex].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 (tradeShips[totalTradeShipIndex].TradeShipThings) { tradeShips[totalTradeShipIndex].TradeShipThings.Remove(pawn); } } } ticketIndex = Interlocked.Increment(ref totalTradeShipTicksCompleted) - 1; } if (ticketIndex == totalTradeShipTicks) { Interlocked.Increment(ref listsFullyProcessed); } } else if (worldTickComplete && 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); * } * } * } */ }
public static void MapPostListTick() { SteadyEnvironmentEffects_Patch.SteadyEffectTick(); WildPlantSpawner_Patch.WildPlantSpawnerListTick(); TradeShip_Patch.PassingShipListTick(); }