} //public public static int TotalWorkCount(ushort buildingID, Building data, bool checkOnly, bool update) { int totalWorkCount = 0; //For performance #if FASTRUN update = false; #endif if (BuildingData.isBuildingWorkerUpdated[buildingID] && !update) { totalWorkCount = BuildingData.buildingWorkCount[buildingID]; } else { if (data.Info.m_buildingAI is LandfillSiteAI) { LandfillSiteAI buildingAI = data.Info.m_buildingAI as LandfillSiteAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is ExtractingFacilityAI) { ExtractingFacilityAI buildingAI = data.Info.m_buildingAI as ExtractingFacilityAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is ProcessingFacilityAI) { ProcessingFacilityAI buildingAI = data.Info.m_buildingAI as ProcessingFacilityAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is PoliceStationAI) { PoliceStationAI buildingAI = data.Info.m_buildingAI as PoliceStationAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is FireStationAI) { FireStationAI buildingAI = data.Info.m_buildingAI as FireStationAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is HospitalAI) { HospitalAI buildingAI = data.Info.m_buildingAI as HospitalAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is CargoStationAI) { CargoStationAI buildingAI = data.Info.m_buildingAI as CargoStationAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is TransportStationAI) { TransportStationAI buildingAI = data.Info.m_buildingAI as TransportStationAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is CemeteryAI) { CemeteryAI buildingAI = data.Info.m_buildingAI as CemeteryAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MedicalCenterAI) { MedicalCenterAI buildingAI = data.Info.m_buildingAI as MedicalCenterAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MonumentAI) { MonumentAI buildingAI = data.Info.m_buildingAI as MonumentAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is DepotAI) { DepotAI buildingAI = data.Info.m_buildingAI as DepotAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is HelicopterDepotAI) { HelicopterDepotAI buildingAI = data.Info.m_buildingAI as HelicopterDepotAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MaintenanceDepotAI) { MaintenanceDepotAI buildingAI = data.Info.m_buildingAI as MaintenanceDepotAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is FirewatchTowerAI) { FirewatchTowerAI buildingAI = data.Info.m_buildingAI as FirewatchTowerAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is DoomsdayVaultAI) { DoomsdayVaultAI buildingAI = data.Info.m_buildingAI as DoomsdayVaultAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is DisasterResponseBuildingAI) { DisasterResponseBuildingAI buildingAI = data.Info.m_buildingAI as DisasterResponseBuildingAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is HadronColliderAI) { HadronColliderAI buildingAI = data.Info.m_buildingAI as HadronColliderAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is SchoolAI) { SchoolAI buildingAI = data.Info.m_buildingAI as SchoolAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is PowerPlantAI) { PowerPlantAI buildingAI = data.Info.m_buildingAI as PowerPlantAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is SnowDumpAI) { SnowDumpAI buildingAI = data.Info.m_buildingAI as SnowDumpAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is WarehouseAI) { WarehouseAI buildingAI = data.Info.m_buildingAI as WarehouseAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is WaterFacilityAI) { WaterFacilityAI buildingAI = data.Info.m_buildingAI as WaterFacilityAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is SaunaAI) { SaunaAI buildingAI = data.Info.m_buildingAI as SaunaAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is PostOfficeAI) { PostOfficeAI buildingAI = data.Info.m_buildingAI as PostOfficeAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is RadioMastAI) { RadioMastAI buildingAI = data.Info.m_buildingAI as RadioMastAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is SpaceElevatorAI) { SpaceElevatorAI buildingAI = data.Info.m_buildingAI as SpaceElevatorAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is SpaceRadarAI) { SpaceRadarAI buildingAI = data.Info.m_buildingAI as SpaceRadarAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MainIndustryBuildingAI) { MainIndustryBuildingAI buildingAI = data.Info.m_buildingAI as MainIndustryBuildingAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is AuxiliaryBuildingAI) { AuxiliaryBuildingAI buildingAI = data.Info.m_buildingAI as AuxiliaryBuildingAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is ShelterAI) { ShelterAI buildingAI = data.Info.m_buildingAI as ShelterAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is HeatingPlantAI) { HeatingPlantAI buildingAI = data.Info.m_buildingAI as HeatingPlantAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MainCampusBuildingAI) { MainCampusBuildingAI buildingAI = data.Info.m_buildingAI as MainCampusBuildingAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MuseumAI) { MuseumAI buildingAI = data.Info.m_buildingAI as MuseumAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is UniqueFactoryAI) { UniqueFactoryAI buildingAI = data.Info.m_buildingAI as UniqueFactoryAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is UniqueFacultyAI) { UniqueFacultyAI buildingAI = data.Info.m_buildingAI as UniqueFacultyAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is VarsitySportsArenaAI) { VarsitySportsArenaAI buildingAI = data.Info.m_buildingAI as VarsitySportsArenaAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is LibraryAI) { LibraryAI buildingAI = data.Info.m_buildingAI as LibraryAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is FishFarmAI) { FishFarmAI buildingAI = data.Info.m_buildingAI as FishFarmAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is FishingHarborAI) { FishingHarborAI buildingAI = data.Info.m_buildingAI as FishingHarborAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is EldercareAI) { EldercareAI buildingAI = data.Info.m_buildingAI as EldercareAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is ChildcareAI) { ChildcareAI buildingAI = data.Info.m_buildingAI as ChildcareAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else if (data.Info.m_buildingAI is MarketAI) { MarketAI buildingAI = data.Info.m_buildingAI as MarketAI; totalWorkCount = buildingAI.m_workPlaceCount0 + buildingAI.m_workPlaceCount1 + buildingAI.m_workPlaceCount2 + buildingAI.m_workPlaceCount3; } else { if (!checkOnly) { DebugLog.LogToFileOnly("Error: find unknow building = " + data.Info.m_buildingAI.ToString()); } } BuildingData.isBuildingWorkerUpdated[buildingID] = true; BuildingData.buildingWorkCount[buildingID] = totalWorkCount; } return(totalWorkCount); }
public static void Postfix(FishFarmAI __instance, ushort buildingID, ref Building buildingData, ref Building.Frame frameData, int productionRate, int finalProductionRate, ref Citizen.BehaviourData behaviour, int aliveWorkerCount, int totalWorkerCount, int workPlaceCount, int aliveVisitorCount, int totalVisitorCount, int visitPlaceCount) { DistrictManager instance = Singleton <DistrictManager> .instance; byte district = instance.GetDistrict(buildingData.m_position); DistrictPolicies.Services servicePolicies = instance.m_districts.m_buffer[(int)district].m_servicePolicies; Notification.Problem problem = Notification.RemoveProblems(buildingData.m_problems, Notification.Problem.WaterNotConnected | Notification.Problem.NoResources | Notification.Problem.NoNaturalResources | Notification.Problem.FishFarmWaterDirty | Notification.Problem.NoPlaceForFishingGoods); int num = 0; int num2 = 0; int num3 = 0; bool shoreLineFishFarm = false; if (buildingData.Info.m_placementMode == BuildingInfo.PlacementMode.Shoreline) { shoreLineFishFarm = true; } if (__instance.m_extractionPositions != null && __instance.m_extractionPositions.Length > 0) { for (int i = 0; i < __instance.m_extractionPositions.Length; i++) { if (shoreLineFishFarm) { Vector3 position = buildingData.CalculatePosition(__instance.m_extractionPositions[i]); int b; int num4; int value; Singleton <TerrainManager> .instance.CountWaterCoverage(position, 20f, out b, out num4, out value); num += Mathf.Clamp(value, 0, 128); // check if pollution is in range num3 = Mathf.Max(num3, b); } else { byte buildingGroundPollution; Singleton <NaturalResourceManager> .instance.CheckPollution(buildingData.m_position, out buildingGroundPollution); num += Mathf.Clamp((int)buildingGroundPollution, 0, 128); // check if pollution is in range num3 = 1; } } num2 = num / __instance.m_extractionPositions.Length; } else { finalProductionRate = 0; } if (num2 > 32) { GuideController properties = Singleton <GuideManager> .instance.m_properties; if (properties != null) { Singleton <BuildingManager> .instance.m_fishingPollutionDetected.Activate(properties.m_fishingPollutionDetected, buildingID); } } if (num3 == 0) { finalProductionRate = 0; } if (finalProductionRate != 0) { int num5 = finalProductionRate; if (num2 > 96) { problem = (Notification.Problem.FishFarmWaterDirty | Notification.Problem.FatalProblem); } else if (num2 > 64) { problem = Notification.AddProblems(problem, Notification.Problem.FishFarmWaterDirty | Notification.Problem.MajorProblem); } else if (num2 > 32) { problem = Notification.AddProblems(problem, Notification.Problem.FishFarmWaterDirty); } finalProductionRate = finalProductionRate * Mathf.Clamp(255 - num2 * 2, 0, 255) / 255; int num6 = finalProductionRate * __instance.m_noiseAccumulation / 100; if (num6 != 0) { Singleton <ImmaterialResourceManager> .instance.AddResource(ImmaterialResourceManager.Resource.NoisePollution, num6, buildingData.m_position, __instance.m_noiseRadius); } BaseHandleDead(__instance, buildingID, ref buildingData, ref behaviour, totalWorkerCount); int num7 = 0; int num8 = 0; if (__instance.m_outputResource != TransferManager.TransferReason.None) { int num9 = (__instance.m_productionRate * finalProductionRate + 99) / 100; if (__instance.m_info.m_class.m_level == ItemClass.Level.Level3 && (servicePolicies & DistrictPolicies.Services.AlgaeBasedWaterFiltering) != DistrictPolicies.Services.None) { District[] buffer = instance.m_districts.m_buffer; byte b2 = district; buffer[(int)b2].m_servicePoliciesEffect = (buffer[(int)b2].m_servicePoliciesEffect | DistrictPolicies.Services.AlgaeBasedWaterFiltering); num9 = (num9 * 50 + 49) / 100; } int cycleBufferSize = __instance.GetCycleBufferSize(buildingID, ref buildingData); int num10 = (int)buildingData.m_customBuffer1; num7 = __instance.GetStorageBufferSize(buildingID, ref buildingData); num8 = (int)(buildingData.m_customBuffer2 * 100); if (num9 >= cycleBufferSize - num10) { if (cycleBufferSize > num7 - num8) { num9 = cycleBufferSize - num10; num10 = cycleBufferSize; problem = Notification.AddProblems(problem, Notification.Problem.NoPlaceForFishingGoods); } else { num10 = num10 + num9 - cycleBufferSize; num8 += cycleBufferSize; } } else { num10 += num9; } Singleton <StatisticsManager> .instance.Acquire <StatisticInt64>(StatisticType.FishFarmed).Add(num9); buildingData.m_customBuffer1 = (ushort)num10; buildingData.m_customBuffer2 = (ushort)(num8 / 100); } if (__instance.m_outputResource != TransferManager.TransferReason.None) { int num11 = (num5 * __instance.m_outputVehicleCount + 99) / 100; int num12 = 0; int num13 = 0; int num14 = 0; int value2 = 0; BaseCalculateOwnVehicles(__instance, buildingID, ref buildingData, __instance.m_outputResource, ref num12, ref num13, ref num14, ref value2); buildingData.m_tempExport = (byte)Mathf.Clamp(value2, (int)buildingData.m_tempExport, 255); if (buildingData.m_finalExport != 0) { District[] buffer2 = instance.m_districts.m_buffer; byte b3 = district; buffer2[(int)b3].m_playerConsumption.m_finalExportAmount = buffer2[(int)b3].m_playerConsumption.m_finalExportAmount + (uint)buildingData.m_finalExport; } int num15 = num8; if (num15 >= 8000 && num12 < num11) { TransferManager.TransferOffer offer = default(TransferManager.TransferOffer); offer.Priority = Mathf.Max(1, num15 * 8 / num7); offer.Building = buildingID; offer.Position = buildingData.m_position; offer.Amount = 1; offer.Active = true; Singleton <TransferManager> .instance.AddOutgoingOffer(__instance.m_outputResource, offer); } } } buildingData.m_problems = problem; buildingData.m_education3 = (byte)Mathf.Clamp(finalProductionRate * __instance.m_productionRate / Mathf.Max(1, __instance.m_productionRate), 0, 255); BaseProduceGoods(__instance, buildingID, ref buildingData, ref frameData, productionRate, finalProductionRate, ref behaviour, aliveWorkerCount, totalWorkerCount, workPlaceCount, aliveVisitorCount, totalVisitorCount, visitPlaceCount); }