public static void Postfix(ushort buildingID, ref Building buildingData, ProcessingFacilityAI __instance, ref ushort[] __state) { int cargoDiff = 0; if (Mod.IsIndustriesBuilding(__instance)) { // Input if (__instance.m_inputResource1 != TransferManager.TransferReason.None) { cargoDiff = Convert.ToInt32((__state[1] - buildingData.m_customBuffer2) / RI_Data.GetFactorCargo(__instance.m_inputResource1)); buildingData.m_customBuffer2 = (ushort)Mathf.Clamp(__state[1] - cargoDiff, 0, 64000); } if (__instance.m_inputResource2 != TransferManager.TransferReason.None) { cargoDiff = Convert.ToInt32((__state[2] - Mod.CombineBytes(buildingData.m_teens, buildingData.m_youngs)) / RI_Data.GetFactorCargo(__instance.m_inputResource2)); Mod.SplitBytes((ushort)Mathf.Clamp(__state[2] - cargoDiff, 0, 64000), ref buildingData.m_teens, ref buildingData.m_youngs); } if (__instance.m_inputResource3 != TransferManager.TransferReason.None) { cargoDiff = Convert.ToInt32((__state[3] - Mod.CombineBytes(buildingData.m_adults, buildingData.m_seniors)) / RI_Data.GetFactorCargo(__instance.m_inputResource3)); Mod.SplitBytes((ushort)Mathf.Clamp(__state[3] - cargoDiff, 0, 64000), ref buildingData.m_adults, ref buildingData.m_seniors); } if (__instance.m_inputResource4 != TransferManager.TransferReason.None) { cargoDiff = Convert.ToInt32((__state[4] - Mod.CombineBytes(buildingData.m_education1, buildingData.m_education2)) / RI_Data.GetFactorCargo(__instance.m_inputResource4)); Mod.SplitBytes((ushort)Mathf.Clamp(__state[4] - cargoDiff, 0, 64000), ref buildingData.m_education1, ref buildingData.m_education2); } // Output (materials being produced) if (__instance.m_outputResource != TransferManager.TransferReason.None) { //try //{ //} catch (OverflowException Ex) //{ // Debug.Log($"Output overflow caught: cargoDiff:{buildingData.m_customBuffer1}-{__state[0]}={(buildingData.m_customBuffer1 - __state[0])} factor:{RI_Data.GetFactorCargo(__instance.m_outputResource)}\n{Ex.ToString()}"); // Singleton<SimulationManager>.instance.SimulationPaused = true; //} cargoDiff = Convert.ToInt32((buildingData.m_customBuffer1 - __state[0]) / RI_Data.GetFactorCargo(__instance.m_outputResource)); buildingData.m_customBuffer1 = (ushort)Mathf.Clamp(__state[0] + cargoDiff, 0, 64000); //Debug.Log($"Out ID:{buildingID}, state:{__state}, buff:{buildingData.m_customBuffer1}, diff:{cargoDiff}"); } //if (__instance is UniqueFactoryAI) // Debug.Log($"PF:{__instance.name}, ID:{buildingID}, lastDiff:{cargoDiff} (Old:{__state[0]}-{__state[1]},{__state[2]},{__state[3]},{__state[4]} - New:{buildingData.m_customBuffer1}-{buildingData.m_customBuffer2},{Mod.CombineBytes(buildingData.m_teens, buildingData.m_youngs)},{Mod.CombineBytes(buildingData.m_adults, buildingData.m_seniors)},{Mod.CombineBytes(buildingData.m_education1, buildingData.m_education2)})"); //else // Debug.Log($"PF:{__instance.name}, ID:{buildingID}, lastDiff:{cargoDiff} (Old:{__state[0]}-{__state[1]} - New:{buildingData.m_customBuffer1}-{buildingData.m_customBuffer2})"); } else { Mod.DebugLine($"Unknown PF instance {__instance.name} ({__instance.GetType()})"); } }
public static void Prefix(ushort buildingID, ref Building buildingData, ProcessingFacilityAI __instance, out ushort[] __state) { __state = new ushort[5]; if (Mod.IsIndustriesBuilding(__instance)) { __state[0] = buildingData.m_customBuffer1; // Output (increases during production) __state[1] = buildingData.m_customBuffer2; // Input1 (used during prodction) __state[2] = Mod.CombineBytes(buildingData.m_teens, buildingData.m_youngs); // Input2 __state[3] = Mod.CombineBytes(buildingData.m_adults, buildingData.m_seniors); // Input3 __state[4] = Mod.CombineBytes(buildingData.m_education1, buildingData.m_education2); // Input4 } else { __state[0] = __state[1] = __state[2] = __state[3] = __state[4] = 0; } }
public static void Postfix(int resourceIndex, ref int amount, ref int capacity, ref InstanceID ___m_InstanceID) { Building building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[___m_InstanceID.Building]; UniqueFactoryAI ai = building.Info.m_buildingAI as UniqueFactoryAI; switch (resourceIndex) { case 0: amount = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource1) * building.m_customBuffer2); capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource1) * ai.GetInputBufferSize1(___m_InstanceID.Building, ref building)); break; case 1: amount = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource2) * Mod.CombineBytes(building.m_teens, building.m_youngs)); capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource2) * ai.GetInputBufferSize2(___m_InstanceID.Building, ref building)); break; case 2: amount = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource3) * Mod.CombineBytes(building.m_adults, building.m_seniors)); capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource3) * ai.GetInputBufferSize3(___m_InstanceID.Building, ref building)); break; case 3: amount = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource4) * Mod.CombineBytes(building.m_education1, building.m_education2)); capacity = Convert.ToInt32(RI_Data.GetFactorCargo(ai.m_inputResource4) * ai.GetInputBufferSize4(___m_InstanceID.Building, ref building)); break; } }