using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CommonAPI; using HarmonyLib; using UnityEngine; using UnityEngine.UI; using crecheng.DSPModSave; using xiaoye97; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("MultipleDelivery-MOD")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MultipleDelivery-MOD")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("0bae28ef-6943-4552-9b88-c8a9e6b5eb28")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace MultipleDelivery_MOD.src; internal class DispenserMutiFilterManager { private static readonly DispenserMutiFilterManager _instance = new DispenserMutiFilterManager(); private static Dictionary> DispenserMutiFilterdata = new Dictionary>(); private static Dictionary> DispenserPlayerOrderCountdata = new Dictionary>(); private static Dictionary> DispenserStorageOrderCountdata = new Dictionary>(); public static DispenserMutiFilterManager Instance => _instance; private DispenserMutiFilterManager() { } public Dictionary GetMutiFilterdata(int planetId) { return GeneralExtensions.GetValueSafe>(DispenserMutiFilterdata, planetId); } public Dictionary GetPlayerOrderdata(int planetId) { return GeneralExtensions.GetValueSafe>(DispenserPlayerOrderCountdata, planetId); } public Dictionary GetStorageOrderdata(int planetId) { return GeneralExtensions.GetValueSafe>(DispenserStorageOrderCountdata, planetId); } [HarmonyPatch(typeof(PlanetTransport), "NewDispenserComponent")] [HarmonyPostfix] public static void PlanetTransport_NewDispenserComponent_Patch(PlanetTransport __instance, int __result) { int id = __instance.planet.id; if (!DispenserMutiFilterdata.ContainsKey(id)) { DispenserMutiFilterdata[id] = new Dictionary(); } DispenserMutiFilterdata[id][__result] = new int[5]; if (!DispenserPlayerOrderCountdata.ContainsKey(id)) { DispenserPlayerOrderCountdata[id] = new Dictionary(); } DispenserPlayerOrderCountdata[id][__result] = new int[5]; if (!DispenserStorageOrderCountdata.ContainsKey(id)) { DispenserStorageOrderCountdata[id] = new Dictionary(); } DispenserStorageOrderCountdata[id][__result] = new int[5]; } [HarmonyPatch(typeof(PlanetTransport), "RemoveDispenserComponent")] [HarmonyPostfix] public static void PlanetTransport_RemoveDispenserComponent_Patch(PlanetTransport __instance, int id) { int id2 = __instance.planet.id; if (!DispenserMutiFilterdata.ContainsKey(id2) || !DispenserMutiFilterdata[id2].ContainsKey(id)) { return; } DispenserMutiFilterdata[id2].Remove(id); if (DispenserPlayerOrderCountdata.ContainsKey(id2) && DispenserPlayerOrderCountdata[id2].ContainsKey(id)) { DispenserPlayerOrderCountdata[id2].Remove(id); if (DispenserStorageOrderCountdata.ContainsKey(id2) && DispenserStorageOrderCountdata[id2].ContainsKey(id)) { DispenserStorageOrderCountdata[id2].Remove(id); } } } public void SetDispenserFilter(int planetId, int dispenserId, int filterId, int filter) { if (planetId == 0 || dispenserId == 0) { return; } if (filter != 0) { int[] valueSafe = GeneralExtensions.GetValueSafe(GeneralExtensions.GetValueSafe>(DispenserMutiFilterdata, planetId), dispenserId); for (int i = 0; i < valueSafe.Length; i++) { if (i != filterId && valueSafe[i] == filter) { return; } } } if (DispenserMutiFilterdata[planetId][dispenserId][filterId] != filter) { DispenserMutiFilterdata[planetId][dispenserId][filterId] = filter; } MultipleDelivery.LogError($"SetDispenserFilter planetId {planetId} dispenserId {dispenserId} filterId {filterId} filter {filter}"); } [HarmonyPatch(typeof(PlanetTransport), "SetDispenserFilter")] [HarmonyPrefix] public static bool PlanetTransport_SetDispenserFilter_Patch(PlanetTransport __instance, int dispenserId, int filter) { if (filter == 0) { return true; } int id = __instance.planet.id; if (!DispenserMutiFilterdata.ContainsKey(id)) { return true; } if (!DispenserMutiFilterdata[id].ContainsKey(dispenserId)) { return true; } int[] valueSafe = GeneralExtensions.GetValueSafe(GeneralExtensions.GetValueSafe>(DispenserMutiFilterdata, id), dispenserId); for (int i = 0; i < 5; i++) { if (valueSafe[i] == filter) { return false; } } return true; } internal static void Export(BinaryWriter w) { w.Write(DispenserMutiFilterdata.Count); foreach (KeyValuePair> dispenserMutiFilterdatum in DispenserMutiFilterdata) { w.Write(dispenserMutiFilterdatum.Key); w.Write(dispenserMutiFilterdatum.Value.Count); foreach (KeyValuePair item in dispenserMutiFilterdatum.Value) { w.Write(item.Key); for (int i = 0; i < 5; i++) { w.Write(item.Value[i]); } } } w.Write(DispenserPlayerOrderCountdata.Count); foreach (KeyValuePair> dispenserPlayerOrderCountdatum in DispenserPlayerOrderCountdata) { w.Write(dispenserPlayerOrderCountdatum.Key); w.Write(dispenserPlayerOrderCountdatum.Value.Count); foreach (KeyValuePair item2 in dispenserPlayerOrderCountdatum.Value) { w.Write(item2.Key); for (int j = 0; j < 5; j++) { w.Write(item2.Value[j]); } } } w.Write(DispenserStorageOrderCountdata.Count); foreach (KeyValuePair> dispenserStorageOrderCountdatum in DispenserStorageOrderCountdata) { w.Write(dispenserStorageOrderCountdatum.Key); w.Write(dispenserStorageOrderCountdatum.Value.Count); foreach (KeyValuePair item3 in dispenserStorageOrderCountdatum.Value) { w.Write(item3.Key); for (int k = 0; k < 5; k++) { w.Write(item3.Value[k]); } } } } internal static void Import(BinaryReader r) { IntoOtherSave(); try { int num = r.ReadInt32(); for (int i = 0; i < num; i++) { int key = r.ReadInt32(); int num2 = r.ReadInt32(); for (int j = 0; j < num2; j++) { int key2 = r.ReadInt32(); int[] array = new int[5]; for (int k = 0; k < 5; k++) { array[k] = r.ReadInt32(); } if (!DispenserMutiFilterdata.ContainsKey(key)) { DispenserMutiFilterdata[key] = new Dictionary(); } DispenserMutiFilterdata[key][key2] = array; } } int num3 = r.ReadInt32(); for (int l = 0; l < num3; l++) { int key3 = r.ReadInt32(); int num4 = r.ReadInt32(); for (int m = 0; m < num4; m++) { int key4 = r.ReadInt32(); int[] array2 = new int[5]; for (int n = 0; n < 5; n++) { array2[n] = r.ReadInt32(); } if (!DispenserPlayerOrderCountdata.ContainsKey(key3)) { DispenserPlayerOrderCountdata[key3] = new Dictionary(); } DispenserPlayerOrderCountdata[key3][key4] = array2; } } int num5 = r.ReadInt32(); for (int num6 = 0; num6 < num5; num6++) { int key5 = r.ReadInt32(); int num7 = r.ReadInt32(); for (int num8 = 0; num8 < num7; num8++) { int key6 = r.ReadInt32(); int[] array3 = new int[5]; for (int num9 = 0; num9 < 5; num9++) { array3[num9] = r.ReadInt32(); } if (!DispenserStorageOrderCountdata.ContainsKey(key5)) { DispenserStorageOrderCountdata[key5] = new Dictionary(); } DispenserStorageOrderCountdata[key5][key6] = array3; } } } catch (EndOfStreamException) { } } internal static void IntoOtherSave() { DispenserMutiFilterdata.Clear(); DispenserPlayerOrderCountdata.Clear(); DispenserStorageOrderCountdata.Clear(); } [HarmonyPatch(typeof(PlanetTransport), "Import")] [HarmonyPostfix] public static void PlanetTransport_Import_Patch(PlanetTransport __instance) { int id = __instance.planet.id; if (!DispenserMutiFilterdata.ContainsKey(id)) { DispenserMutiFilterdata[id] = new Dictionary(); } for (int i = 1; i < __instance.dispenserCursor; i++) { if (!DispenserMutiFilterdata[id].ContainsKey(i)) { DispenserMutiFilterdata[id][i] = new int[5]; } } if (!DispenserPlayerOrderCountdata.ContainsKey(id)) { DispenserPlayerOrderCountdata[id] = new Dictionary(); } for (int j = 1; j < __instance.dispenserCursor; j++) { if (!DispenserPlayerOrderCountdata[id].ContainsKey(j)) { DispenserPlayerOrderCountdata[id][j] = new int[5]; } } if (!DispenserStorageOrderCountdata.ContainsKey(id)) { DispenserStorageOrderCountdata[id] = new Dictionary(); } for (int k = 1; k < __instance.dispenserCursor; k++) { if (!DispenserStorageOrderCountdata[id].ContainsKey(k)) { DispenserStorageOrderCountdata[id][k] = new int[5]; } } } } internal class DispenserPatch { private static readonly FieldInfo _tmp_iter_Field = AccessTools.Field(typeof(DispenserComponent), "_tmp_iter"); [HarmonyPatch(typeof(PlanetTransport), "RefreshDispenserTraffic")] [HarmonyPrefix] public static bool PlanetTransport_RefreshDispenserTraffic_Patch(PlanetTransport __instance, int keyId) { //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Invalid comparison between Unknown and I4 //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Invalid comparison between Unknown and I4 //IL_03d3: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Invalid comparison between Unknown and I4 //IL_04c4: Unknown result type (might be due to invalid IL or missing references) //IL_04ca: Invalid comparison between Unknown and I4 //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Invalid comparison between Unknown and I4 //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Invalid comparison between Unknown and I4 //IL_040d: Unknown result type (might be due to invalid IL or missing references) //IL_0413: Invalid comparison between Unknown and I4 //IL_04fe: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Invalid comparison between Unknown and I4 //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Invalid comparison between Unknown and I4 //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Invalid comparison between Unknown and I4 //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Invalid comparison between Unknown and I4 //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Invalid comparison between Unknown and I4 int logisticCourierCarries = GameMain.history.logisticCourierCarries; __instance.playerDeliveryPackage.ClearPairs(); for (int i = 1; i < __instance.dispenserCursor; i++) { if (__instance.dispenserPool[i] != null && __instance.dispenserPool[i].id == i) { __instance.dispenserPool[i].ClearPairs(); } } if (__instance.playerDeliveryEnabled) { GRID[] grids = __instance.playerDeliveryPackage.grids; for (int j = 0; j < grids.Length; j++) { __instance.playerDeliveryPackage.gridsPairOffsets[j] = __instance.playerDeliveryPackage.pairCount; if (grids[j].itemId <= 0 || !__instance.playerDeliveryPackage.IsGridActive(j)) { continue; } int itemId = grids[j].itemId; for (int k = 1; k < __instance.dispenserCursor; k++) { DispenserComponent val = __instance.dispenserPool[k]; if (val == null || val.id != k) { continue; } if (((int)val.playerMode == 3 || (int)val.playerMode == 2) && itemId == val.filter) { val.AddPair(k, 0, -(j + 1), j); __instance.playerDeliveryPackage.AddGridPair(k, 0, -(j + 1), j); } if (((int)val.playerMode == 1 || (int)val.playerMode == 2) && (itemId == val.filter || (val.filter < 0 && itemId > 0))) { val.AddPair(-(j + 1), j, k, 0); __instance.playerDeliveryPackage.AddGridPair(-(j + 1), j, k, 0); } Dictionary mutiFilterdata = DispenserMutiFilterManager.Instance.GetMutiFilterdata(__instance.planet.id); if (mutiFilterdata == null || !mutiFilterdata.ContainsKey(val.id)) { continue; } int[] array = mutiFilterdata[val.id]; for (int l = 0; l < 5; l++) { if (((int)val.playerMode == 3 || (int)val.playerMode == 2) && itemId == array[l]) { val.AddPair(k, 0, -(j + 1), j); __instance.playerDeliveryPackage.AddGridPair(k, 0, -(j + 1), j); } if (((int)val.playerMode == 1 || (int)val.playerMode == 2) && (itemId == array[l] || (array[l] < 0 && itemId > 0))) { val.AddPair(-(j + 1), j, k, 0); __instance.playerDeliveryPackage.AddGridPair(-(j + 1), j, k, 0); } } } } } for (int m = 1; m < __instance.dispenserCursor; m++) { DispenserComponent val2 = __instance.dispenserPool[m]; if (val2 == null || val2.id != m) { continue; } Dictionary mutiFilterdata2 = DispenserMutiFilterManager.Instance.GetMutiFilterdata(__instance.planet.id); if (mutiFilterdata2 == null || !mutiFilterdata2.ContainsKey(val2.id)) { continue; } int[] array2 = mutiFilterdata2[val2.id]; for (int n = 0; n < 6; n++) { int num = ((n == 0) ? val2.filter : array2[n - 1]); if (num <= 0) { continue; } if ((int)val2.storageMode == 1) { for (int num2 = m + 1; num2 < __instance.dispenserCursor; num2++) { DispenserComponent val3 = __instance.dispenserPool[num2]; if (val3 == null || val3.id != num2 || (int)val3.storageMode != 2) { continue; } int[] array3 = DispenserMutiFilterManager.Instance.GetMutiFilterdata(__instance.planet.id)[val3.id]; for (int num3 = 0; num3 < 6; num3++) { int num4 = ((num3 == 0) ? val3.filter : array3[num3 - 1]); if (num == num4) { val2.AddPair(m, n, num2, num3); val3.AddPair(m, n, num2, num3); } } } } else { if ((int)val2.storageMode != 2) { continue; } for (int num5 = m + 1; num5 < __instance.dispenserCursor; num5++) { DispenserComponent val4 = __instance.dispenserPool[num5]; if (val4 == null || val4.id != num5 || (int)val4.storageMode != 1) { continue; } int[] array4 = DispenserMutiFilterManager.Instance.GetMutiFilterdata(__instance.planet.id)[val4.id]; for (int num6 = 0; num6 < 6; num6++) { int num7 = ((num6 == 0) ? val4.filter : array4[num6 - 1]); if (num == num7) { val2.AddPair(num5, num6, m, n); val4.AddPair(num5, num6, m, n); } } } } } val2.OnRematchPairs(__instance.factory, __instance.dispenserPool, keyId, logisticCourierCarries); } if (PlanetTransport.onFactoryRefreshDispenserTraffic != null) { PlanetTransport.onFactoryRefreshDispenserTraffic(__instance.factory, keyId); } return false; } public static bool CheckItemId(DispenserComponent dispenser, PlanetFactory factory, int itemId) { if (itemId == dispenser.filter) { return true; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (itemId == array[i]) { return true; } } return false; } public static bool CheckHasFilter(DispenserComponent dispenser, PlanetFactory factory) { if (dispenser.filter > 0) { return true; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (array[i] > 0) { return true; } } return false; } public static int GetItemPlayerOrdered(DispenserComponent dispenser, PlanetFactory factory, int itemId) { if (itemId == dispenser.filter) { return dispenser.playerOrdered; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (array[i] == itemId) { int[] array2 = DispenserMutiFilterManager.Instance.GetPlayerOrderdata(factory.planet.id)[dispenser.id]; return array2[i]; } } return 0; } public static int GetItemStorageOrdered(DispenserComponent dispenser, PlanetFactory factory, int itemId) { if (itemId == dispenser.filter) { return dispenser.storageOrdered; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (array[i] == itemId) { int[] array2 = DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[dispenser.id]; return array2[i]; } } return 0; } public static void AddPlayerOrdered(DispenserComponent dispenser, PlanetFactory factory, int itemId, int orderCount) { if (itemId == dispenser.filter) { dispenser.playerOrdered += orderCount; return; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; int[] array2 = DispenserMutiFilterManager.Instance.GetPlayerOrderdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (array[i] == itemId) { array2[i] += orderCount; break; } if (array[i] == 0 && array2[i] != 0) { array2[i] += orderCount; break; } } } public static void AddStorageOrdered(DispenserComponent dispenser, PlanetFactory factory, int itemId, int orderCount) { if (itemId == dispenser.filter) { dispenser.storageOrdered += orderCount; return; } int[] array = DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[dispenser.id]; int[] array2 = DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[dispenser.id]; for (int i = 0; i < 5; i++) { if (array[i] == itemId) { array2[i] += orderCount; break; } if (array[i] == 0 && array2[i] != 0) { array2[i] += orderCount; break; } } } [HarmonyPatch(typeof(DispenserComponent), "InternalTick")] [HarmonyPrefix] public static bool DispenserComponent_InternalTick(DispenserComponent __instance, PlanetFactory factory, EntityData[] entityPool, DispenserComponent[] dispenserPool, Vector3 playerPos, long time, float power, float courierSpeed, int courierCarries, double deliveryRange) { //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_096a: Unknown result type (might be due to invalid IL or missing references) //IL_13de: Unknown result type (might be due to invalid IL or missing references) //IL_13e3: Unknown result type (might be due to invalid IL or missing references) //IL_143a: Unknown result type (might be due to invalid IL or missing references) //IL_1449: Unknown result type (might be due to invalid IL or missing references) //IL_1458: Unknown result type (might be due to invalid IL or missing references) //IL_1465: Unknown result type (might be due to invalid IL or missing references) //IL_146c: Unknown result type (might be due to invalid IL or missing references) //IL_1474: Unknown result type (might be due to invalid IL or missing references) //IL_147b: Unknown result type (might be due to invalid IL or missing references) //IL_1484: Unknown result type (might be due to invalid IL or missing references) //IL_148b: Unknown result type (might be due to invalid IL or missing references) //IL_149d: Unknown result type (might be due to invalid IL or missing references) //IL_14a4: Unknown result type (might be due to invalid IL or missing references) //IL_14ac: Unknown result type (might be due to invalid IL or missing references) //IL_14b3: Unknown result type (might be due to invalid IL or missing references) //IL_14bc: Unknown result type (might be due to invalid IL or missing references) //IL_14c3: Unknown result type (might be due to invalid IL or missing references) //IL_1702: Unknown result type (might be due to invalid IL or missing references) //IL_1707: Unknown result type (might be due to invalid IL or missing references) //IL_1558: Unknown result type (might be due to invalid IL or missing references) //IL_155f: Unknown result type (might be due to invalid IL or missing references) //IL_1567: Unknown result type (might be due to invalid IL or missing references) //IL_156e: Unknown result type (might be due to invalid IL or missing references) //IL_1577: Unknown result type (might be due to invalid IL or missing references) //IL_157e: Unknown result type (might be due to invalid IL or missing references) //IL_15c6: Unknown result type (might be due to invalid IL or missing references) //IL_15d5: Unknown result type (might be due to invalid IL or missing references) //IL_15e5: Unknown result type (might be due to invalid IL or missing references) //IL_1733: Unknown result type (might be due to invalid IL or missing references) //IL_173d: Unknown result type (might be due to invalid IL or missing references) //IL_1747: Unknown result type (might be due to invalid IL or missing references) //IL_178e: Unknown result type (might be due to invalid IL or missing references) //IL_17a0: Unknown result type (might be due to invalid IL or missing references) //IL_17b2: Unknown result type (might be due to invalid IL or missing references) //IL_17bf: Unknown result type (might be due to invalid IL or missing references) //IL_17c9: Unknown result type (might be due to invalid IL or missing references) //IL_17ce: Unknown result type (might be due to invalid IL or missing references) //IL_164d: Unknown result type (might be due to invalid IL or missing references) //IL_164f: Unknown result type (might be due to invalid IL or missing references) //IL_09b3: Unknown result type (might be due to invalid IL or missing references) //IL_09b8: Unknown result type (might be due to invalid IL or missing references) //IL_09f0: Unknown result type (might be due to invalid IL or missing references) //IL_0cf1: Unknown result type (might be due to invalid IL or missing references) //IL_0a09: Unknown result type (might be due to invalid IL or missing references) //IL_0d0a: Unknown result type (might be due to invalid IL or missing references) //IL_0a32: Unknown result type (might be due to invalid IL or missing references) //IL_0a3c: Unknown result type (might be due to invalid IL or missing references) //IL_0a1d: Unknown result type (might be due to invalid IL or missing references) //IL_1f6a: Unknown result type (might be due to invalid IL or missing references) //IL_1f70: Invalid comparison between Unknown and I4 //IL_0d33: Unknown result type (might be due to invalid IL or missing references) //IL_0a65: Unknown result type (might be due to invalid IL or missing references) //IL_1f73: Unknown result type (might be due to invalid IL or missing references) //IL_1f79: Invalid comparison between Unknown and I4 //IL_0d47: Unknown result type (might be due to invalid IL or missing references) //IL_0d5b: Unknown result type (might be due to invalid IL or missing references) //IL_0a84: Unknown result type (might be due to invalid IL or missing references) //IL_0dff: Unknown result type (might be due to invalid IL or missing references) //IL_0e28: Unknown result type (might be due to invalid IL or missing references) //IL_0738: Unknown result type (might be due to invalid IL or missing references) //IL_0739: Unknown result type (might be due to invalid IL or missing references) //IL_074f: Unknown result type (might be due to invalid IL or missing references) //IL_0750: Unknown result type (might be due to invalid IL or missing references) //IL_0e3c: Unknown result type (might be due to invalid IL or missing references) //IL_0b4e: Unknown result type (might be due to invalid IL or missing references) //IL_0b53: Unknown result type (might be due to invalid IL or missing references) //IL_0b56: Unknown result type (might be due to invalid IL or missing references) //IL_0b57: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_0387: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_039e: Unknown result type (might be due to invalid IL or missing references) //IL_0e65: Unknown result type (might be due to invalid IL or missing references) //IL_0ba6: Unknown result type (might be due to invalid IL or missing references) //IL_0bd0: Unknown result type (might be due to invalid IL or missing references) //IL_0be5: Unknown result type (might be due to invalid IL or missing references) //IL_0eb2: Unknown result type (might be due to invalid IL or missing references) //IL_0c0f: Unknown result type (might be due to invalid IL or missing references) //IL_0ec7: Unknown result type (might be due to invalid IL or missing references) //IL_0c24: Unknown result type (might be due to invalid IL or missing references) //IL_0c4d: Unknown result type (might be due to invalid IL or missing references) //IL_0eea: Unknown result type (might be due to invalid IL or missing references) //IL_0f14: Unknown result type (might be due to invalid IL or missing references) //IL_0f5d: Unknown result type (might be due to invalid IL or missing references) //IL_0f62: Unknown result type (might be due to invalid IL or missing references) //IL_0f65: Unknown result type (might be due to invalid IL or missing references) //IL_0f66: Unknown result type (might be due to invalid IL or missing references) //IL_11c2: Unknown result type (might be due to invalid IL or missing references) //IL_11c3: Unknown result type (might be due to invalid IL or missing references) //IL_11d9: Unknown result type (might be due to invalid IL or missing references) //IL_11db: Unknown result type (might be due to invalid IL or missing references) //IL_11f1: Unknown result type (might be due to invalid IL or missing references) //IL_12d3: Unknown result type (might be due to invalid IL or missing references) //IL_0ff2: Unknown result type (might be due to invalid IL or missing references) //IL_0ff3: Unknown result type (might be due to invalid IL or missing references) //IL_1009: Unknown result type (might be due to invalid IL or missing references) //IL_100b: Unknown result type (might be due to invalid IL or missing references) //IL_1021: Unknown result type (might be due to invalid IL or missing references) //IL_1105: Unknown result type (might be due to invalid IL or missing references) __instance.energy += (int)((float)__instance.energyPerTick * power); __instance.energy -= 300; if (__instance.energy > __instance.energyMax) { __instance.energy = __instance.energyMax; } else if (__instance.energy < 0) { __instance.energy = 0L; } if (__instance.storage == null) { return false; } int entityId = __instance.storage.bottomStorage.entityId; Vector3 pos = entityPool[__instance.entityId].pos; GRID[] grids = __instance.deliveryPackage.grids; int num = (int)(time % 3); if (num < 0) { num += 3; } if (num == __instance.gene) { __instance.playerDeliveryCondition = (EPlayerDeliveryCondition)1; int num2 = (int)_tmp_iter_Field.GetValue(__instance); num2++; _tmp_iter_Field.SetValue(__instance, num2); if (__instance.idleCourierCount > 0) { __instance.playerDeliveryCondition = (EPlayerDeliveryCondition)2; bool flag = false; if (__instance.playerPairCount > 0) { __instance.playerDeliveryCondition = (EPlayerDeliveryCondition)3; double num3 = default(double); bool flag2 = __instance.CheckDeliveryRange(pos, playerPos, deliveryRange, ref num3); long num4 = (long)(num3 * 10000.0 * 2.0 + 100000.0); if (flag2) { __instance.playerDeliveryCondition = (EPlayerDeliveryCondition)4; } if (__instance.energy >= num4 && flag2) { __instance.playerDeliveryCondition = (EPlayerDeliveryCondition)5; int inc = default(int); for (int i = 0; i < __instance.playerPairCount; i++) { ref SupplyDemandPair reference = ref __instance.pairs[i]; reference.runtimeState = 0; if (reference.supplyId == __instance.id) { int demandIndex = reference.demandIndex; if (demandIndex >= 100) { Assert.CannotBeReached(); continue; } Assert.True(-(reference.demandId + 1) == demandIndex); int itemId = grids[demandIndex].itemId; if (!CheckItemId(__instance, factory, itemId)) { continue; } reference.runtimeState = 1; int packageItemCountIncludeHandItem = __instance.packageUtility.GetPackageItemCountIncludeHandItem(itemId); int num5 = ((GRID)(ref grids[demandIndex])).modifiedCount + packageItemCountIncludeHandItem; int num6 = grids[demandIndex].count + packageItemCountIncludeHandItem; int num7 = ((num5 > num6) ? num5 : num6); int num8 = ((GRID)(ref grids[demandIndex])).stackSizeModified - ((GRID)(ref grids[demandIndex])).modifiedCount + __instance.packageUtility.GetPackageItemCapacity(itemId); int clampedRequireCount = ((GRID)(ref grids[demandIndex])).clampedRequireCount; if (num7 >= clampedRequireCount) { continue; } reference.runtimeState = 2; if (num8 <= 0) { continue; } reference.runtimeState = 3; int num9 = clampedRequireCount - num7; num9 = ((num9 > courierCarries) ? courierCarries : num9); num9 = ((num9 > num8) ? num8 : num9); int itemStorageOrdered = GetItemStorageOrdered(__instance, factory, itemId); int num10 = ((itemStorageOrdered <= 0) ? itemStorageOrdered : 0); num9 = __instance.PickFromStoragePrecalc(itemId, num9 - num10); num9 += num10; if (num9 > 0) { int num11 = factory.PickFromStorage(entityId, itemId, num9, ref inc); if (num11 > 0) { reference.runtimeState = 4; __instance.workCourierDatas[__instance.workCourierCount].begin = pos; __instance.workCourierDatas[__instance.workCourierCount].end = pos; __instance.workCourierDatas[__instance.workCourierCount].endId = reference.demandId; __instance.workCourierDatas[__instance.workCourierCount].direction = 1f; __instance.workCourierDatas[__instance.workCourierCount].maxt = 1f; __instance.workCourierDatas[__instance.workCourierCount].t = 0f; __instance.workCourierDatas[__instance.workCourierCount].itemId = itemId; __instance.workCourierDatas[__instance.workCourierCount].itemCount = num11; __instance.workCourierDatas[__instance.workCourierCount].inc = inc; __instance.workCourierDatas[__instance.workCourierCount].gene = num2; __instance.orders[__instance.workCourierCount].itemId = itemId; __instance.orders[__instance.workCourierCount].otherId = reference.demandId; __instance.orders[__instance.workCourierCount].thisOrdered = 0; __instance.orders[__instance.workCourierCount].otherOrdered = num11; __instance.playerOrdered = __instance.playerOrdered; GRID[] array = grids; int num12 = demandIndex; array[num12].ordered = array[num12].ordered + num11; __instance.workCourierCount++; __instance.idleCourierCount--; __instance.energy -= num4; __instance.pulseSignal = 2; flag = true; break; } } } else { if (reference.demandId != __instance.id) { continue; } reference.runtimeState = 1; if (__instance.holdupItemCount >= 6) { continue; } int supplyIndex = reference.supplyIndex; if (supplyIndex >= 100) { Assert.CannotBeReached(); continue; } Assert.True(-(reference.supplyId + 1) == supplyIndex); int itemId2 = grids[supplyIndex].itemId; if (!CheckItemId(__instance, factory, itemId2)) { Assert.CannotBeReached(); } else { if (__instance.holdupItemCount > 0 && (itemId2 == __instance.holdupPackage[0].itemId || itemId2 == __instance.holdupPackage[1].itemId || itemId2 == __instance.holdupPackage[2].itemId || itemId2 == __instance.holdupPackage[3].itemId || itemId2 == __instance.holdupPackage[4].itemId)) { continue; } reference.runtimeState = 2; int packageItemCount = __instance.packageUtility.GetPackageItemCount(itemId2); int num13 = ((GRID)(ref grids[supplyIndex])).modifiedCount + packageItemCount; int num14 = grids[supplyIndex].count + packageItemCount; if (((num13 < num14) ? num13 : num14) > grids[supplyIndex].recycleCount) { reference.runtimeState = 3; int itemStorageOrdered2 = GetItemStorageOrdered(__instance, factory, itemId2); int itemPlayerOrdered = GetItemPlayerOrdered(__instance, factory, itemId2); int num15 = ((itemStorageOrdered2 >= 0) ? itemStorageOrdered2 : 0); int num16 = __instance.InsertIntoStoragePrecalc(itemId2, courierCarries + itemPlayerOrdered + num15, false) - itemPlayerOrdered - num15; if (num16 > 0) { reference.runtimeState = 4; __instance.workCourierDatas[__instance.workCourierCount].begin = pos; __instance.workCourierDatas[__instance.workCourierCount].end = pos; __instance.workCourierDatas[__instance.workCourierCount].endId = reference.supplyId; __instance.workCourierDatas[__instance.workCourierCount].direction = 1f; __instance.workCourierDatas[__instance.workCourierCount].maxt = 1f; __instance.workCourierDatas[__instance.workCourierCount].t = 0f; __instance.workCourierDatas[__instance.workCourierCount].itemId = itemId2; __instance.workCourierDatas[__instance.workCourierCount].itemCount = 0; __instance.workCourierDatas[__instance.workCourierCount].inc = 0; __instance.workCourierDatas[__instance.workCourierCount].gene = num2; __instance.orders[__instance.workCourierCount].itemId = itemId2; __instance.orders[__instance.workCourierCount].otherId = reference.supplyId; __instance.orders[__instance.workCourierCount].thisOrdered = num16; __instance.orders[__instance.workCourierCount].otherOrdered = -num16; AddPlayerOrdered(__instance, factory, itemId2, num16); GRID[] array2 = grids; int num17 = supplyIndex; array2[num17].ordered = array2[num17].ordered - num16; __instance.workCourierCount++; __instance.idleCourierCount--; __instance.energy -= num4; __instance.pulseSignal = 2; flag = true; break; } } } } } } } if (!flag) { if (__instance.pairProcess < __instance.playerPairCount) { __instance.pairProcess = __instance.playerPairCount; } else if (__instance.pairProcess >= __instance.pairCount) { __instance.pairProcess = __instance.playerPairCount; } if ((int)__instance.storageMode != 0 && CheckHasFilter(__instance, factory) && __instance.pairCount > __instance.playerPairCount) { int pairProcess = __instance.pairProcess; int num18 = 10; double num20 = default(double); int inc2 = default(int); double num36 = default(double); do { SupplyDemandPair val = __instance.pairs[__instance.pairProcess]; __instance.pairProcess++; if (__instance.pairProcess == __instance.pairCount) { __instance.pairProcess = __instance.playerPairCount; } num18--; if (val.supplyId == __instance.id) { if (val.demandId <= 0) { Assert.Positive(val.demandId); continue; } DispenserComponent val2 = dispenserPool[val.demandId]; int num19 = ((val.supplyIndex == 0) ? __instance.filter : DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[__instance.id][val.supplyIndex - 1]); if (val2 == null || val2.id != val.demandId) { Assert.CannotBeReached(); } else { if (val2.holdupItemCount >= 6 || (val2.holdupItemCount > 0 && (val2.holdupPackage[0].itemId == num19 || val2.holdupPackage[1].itemId == num19 || val2.holdupPackage[2].itemId == num19 || val2.holdupPackage[3].itemId == num19 || val2.holdupPackage[4].itemId == num19))) { continue; } Vector3 pos2 = entityPool[val2.entityId].pos; if (!__instance.CheckDeliveryRange(pos, pos2, deliveryRange, ref num20)) { continue; } long num21 = (long)(num20 * 10000.0 * 2.0 + 100000.0); if (__instance.energy < num21) { continue; } int num22 = ((val.demandIndex == 0) ? val2.storageOrdered : DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[val2.id][val.demandIndex - 1]); int num23 = ((val.demandIndex == 0) ? val2.playerOrdered : DispenserMutiFilterManager.Instance.GetPlayerOrderdata(factory.planet.id)[val2.id][val.demandIndex - 1]); int num24 = ((val.supplyIndex == 0) ? __instance.storageOrdered : DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[__instance.id][val.supplyIndex - 1]); int num25 = ((num22 >= 0) ? num22 : 0); int num26 = val2.InsertIntoStoragePrecalc(num19, courierCarries + num25 + num23, true); num26 = num26 - num25 - num23; if (num26 <= 0) { continue; } int num27 = ((num24 <= 0) ? num24 : 0); int num28 = __instance.PickFromStoragePrecalc(num19, num26 - num27); num28 += num27; if (num28 > 0) { int num29 = factory.PickFromStorage(entityId, num19, num28, ref inc2); if (num29 > 0) { __instance.workCourierDatas[__instance.workCourierCount].begin = pos; __instance.workCourierDatas[__instance.workCourierCount].end = pos2; __instance.workCourierDatas[__instance.workCourierCount].endId = val.demandId; __instance.workCourierDatas[__instance.workCourierCount].direction = 1f; __instance.workCourierDatas[__instance.workCourierCount].maxt = (float)num20; __instance.workCourierDatas[__instance.workCourierCount].t = 0f; __instance.workCourierDatas[__instance.workCourierCount].itemId = num19; __instance.workCourierDatas[__instance.workCourierCount].itemCount = num29; __instance.workCourierDatas[__instance.workCourierCount].inc = inc2; __instance.workCourierDatas[__instance.workCourierCount].gene = num2; __instance.orders[__instance.workCourierCount].itemId = num19; __instance.orders[__instance.workCourierCount].otherId = val.demandId; __instance.orders[__instance.workCourierCount].thisOrdered = 0; __instance.orders[__instance.workCourierCount].otherOrdered = num29; __instance.storageOrdered = __instance.storageOrdered; AddStorageOrdered(val2, factory, num19, num29); factory.gameData.statistics.traffic.RegisterPlanetInternalStat(factory.planetId, num19, num29); __instance.workCourierCount++; __instance.idleCourierCount--; __instance.energy -= num21; __instance.pulseSignal = 2; break; } } } } else { if (val.demandId != __instance.id) { continue; } int num19 = ((val.demandIndex == 0) ? __instance.filter : DispenserMutiFilterManager.Instance.GetMutiFilterdata(factory.planet.id)[__instance.id][val.demandIndex - 1]); if (val.supplyId <= 0) { Assert.Positive(val.supplyId); } else { if (__instance.holdupItemCount >= 6 || (__instance.holdupItemCount > 0 && (__instance.holdupPackage[0].itemId == num19 || __instance.holdupPackage[1].itemId == num19 || __instance.holdupPackage[2].itemId == num19 || __instance.holdupPackage[3].itemId == num19 || __instance.holdupPackage[4].itemId == num19))) { continue; } int num30 = ((val.demandIndex == 0) ? __instance.storageOrdered : DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[__instance.id][val.demandIndex - 1]); int num31 = ((val.demandIndex == 0) ? __instance.playerOrdered : DispenserMutiFilterManager.Instance.GetPlayerOrderdata(factory.planet.id)[__instance.id][val.demandIndex - 1]); int num32 = ((num30 >= 0) ? num30 : 0); int num33 = __instance.InsertIntoStoragePrecalc(num19, courierCarries + num32 + num31, true); num33 = num33 - num32 - num31; if (num33 <= 0) { continue; } DispenserComponent val3 = dispenserPool[val.supplyId]; if (val3 == null || val3.id != val.supplyId) { Assert.CannotBeReached(); continue; } int num34 = ((val.supplyIndex == 0) ? val3.storageOrdered : DispenserMutiFilterManager.Instance.GetStorageOrderdata(factory.planet.id)[val3.id][val.supplyIndex - 1]); int num35 = ((num34 <= 0) ? num34 : 0); if (val3.PickFromStoragePrecalc(num19, num33 - num35) + num35 <= 0) { continue; } Vector3 pos3 = entityPool[val3.entityId].pos; if (__instance.CheckDeliveryRange(pos, pos3, deliveryRange, ref num36)) { long num37 = (long)(num36 * 10000.0 * 2.0 + 100000.0); if (__instance.energy >= num37) { __instance.workCourierDatas[__instance.workCourierCount].begin = pos; __instance.workCourierDatas[__instance.workCourierCount].end = pos3; __instance.workCourierDatas[__instance.workCourierCount].endId = val.supplyId; __instance.workCourierDatas[__instance.workCourierCount].direction = 1f; __instance.workCourierDatas[__instance.workCourierCount].maxt = (float)num36; __instance.workCourierDatas[__instance.workCourierCount].t = 0f; __instance.workCourierDatas[__instance.workCourierCount].itemId = num19; __instance.workCourierDatas[__instance.workCourierCount].itemCount = 0; __instance.workCourierDatas[__instance.workCourierCount].inc = 0; __instance.workCourierDatas[__instance.workCourierCount].gene = num2; __instance.orders[__instance.workCourierCount].itemId = num19; __instance.orders[__instance.workCourierCount].otherId = val.supplyId; __instance.orders[__instance.workCourierCount].thisOrdered = num33; __instance.orders[__instance.workCourierCount].otherOrdered = -num33; AddStorageOrdered(__instance, factory, num19, num33); AddStorageOrdered(val3, factory, num19, -num33); __instance.workCourierCount++; __instance.idleCourierCount--; __instance.energy -= num37; __instance.pulseSignal = 2; break; } } } } } while (pairProcess != __instance.pairProcess && num18 > 0); } } } } float num38 = 1f / 60f * courierSpeed; Vector3 val4 = default(Vector3); Vector3 val5 = default(Vector3); Vector3 val6 = default(Vector3); int num59 = default(int); int inc3 = default(int); int inc4 = default(int); int inc5 = default(int); int num73 = default(int); for (int j = 0; j < __instance.workCourierCount; j++) { if (!(__instance.workCourierDatas[j].maxt > 0f)) { continue; } if (__instance.workCourierDatas[j].endId < 0 && __instance.workCourierDatas[j].direction > 0f) { Vector3 pos4 = entityPool[__instance.entityId].pos; ref Vector3 end = ref __instance.workCourierDatas[j].end; ((Vector3)(ref val4))..ctor(playerPos.x - end.x, playerPos.y - end.y, playerPos.z - end.z); ((Vector3)(ref val5))..ctor(playerPos.x - pos4.x, playerPos.y - pos4.y, playerPos.z - pos4.z); float num39 = (float)Math.Sqrt(val4.x * val4.x + val4.y * val4.y + val4.z * val4.z); float num40 = (float)Math.Sqrt(val5.x * val5.x + val5.y * val5.y + val5.z * val5.z); float num41 = (float)Math.Sqrt(end.x * end.x + end.y * end.y + end.z * end.z); float num42 = (float)Math.Sqrt(playerPos.x * playerPos.x + playerPos.y * playerPos.y + playerPos.z * playerPos.z); if (num39 < 1.4f) { double num43 = Math.Sqrt(pos4.x * pos4.x + pos4.y * pos4.y + pos4.z * pos4.z); double num44 = Math.Sqrt(playerPos.x * playerPos.x + playerPos.y * playerPos.y + playerPos.z * playerPos.z); double num45 = (double)(pos4.x * playerPos.x + pos4.y * playerPos.y + pos4.z * playerPos.z) / (num43 * num44); if (num45 < -1.0) { num45 = -1.0; } else if (num45 > 1.0) { num45 = 1.0; } __instance.workCourierDatas[j].begin = pos4; __instance.workCourierDatas[j].maxt = (float)(Math.Acos(num45) * ((num43 + num44) * 0.5)); __instance.workCourierDatas[j].maxt = (float)Math.Sqrt((double)(__instance.workCourierDatas[j].maxt * __instance.workCourierDatas[j].maxt) + (num43 - num44) * (num43 - num44)); __instance.workCourierDatas[j].t = __instance.workCourierDatas[j].maxt; } else { __instance.workCourierDatas[j].begin = end; float num46 = courierSpeed * (1f / 60f) / num39; if (num46 > 1f) { num46 = 1f; } ((Vector3)(ref val6))..ctor(val4.x * num46, val4.y * num46, val4.z * num46); float num47 = num39 / courierSpeed; if (num47 < 0.03333333f) { num47 = 0.03333333f; } float num48 = (num42 - num41) / num47 * (1f / 60f); end.x += val6.x; end.y += val6.y; end.z += val6.z; end = ((Vector3)(ref end)).normalized * (num41 + num48); if (num40 > __instance.workCourierDatas[j].maxt) { __instance.workCourierDatas[j].maxt = num40; } __instance.workCourierDatas[j].t = num39; if (__instance.workCourierDatas[j].t >= __instance.workCourierDatas[j].maxt * 0.99f) { __instance.workCourierDatas[j].t = __instance.workCourierDatas[j].maxt * 0.99f; } } } else { CourierData[] workCourierDatas = __instance.workCourierDatas; int num49 = j; workCourierDatas[num49].t = workCourierDatas[num49].t + num38 * __instance.workCourierDatas[j].direction; } if (__instance.workCourierDatas[j].t >= __instance.workCourierDatas[j].maxt) { __instance.workCourierDatas[j].t = __instance.workCourierDatas[j].maxt; int endId = __instance.workCourierDatas[j].endId; if (__instance.workCourierDatas[j].itemCount > 0) { int itemId3 = __instance.workCourierDatas[j].itemId; int itemCount = __instance.workCourierDatas[j].itemCount; if (endId < 0) { int num50 = -(endId + 1); GRID[] array3 = grids; int num51 = num50; array3[num51].ordered = array3[num51].ordered - __instance.orders[j].otherOrdered; __instance.orders[j].otherOrdered = 0; int num52 = ((GRID)(ref grids[num50])).clampedRequireCount - (grids[num50].count + __instance.packageUtility.GetPackageItemCountIncludeHandItem(itemId3)); int num53 = ((GRID)(ref grids[num50])).stackSizeModified - grids[num50].count + __instance.packageUtility.GetPackageItemCapacity(itemId3); if (num52 > 0 && num53 > 0) { num52 = ((num52 > num53) ? num53 : num52); int num54 = 0; int num56; if (num52 < itemCount) { int num55 = split_inc(ref __instance.workCourierDatas[j].itemCount, ref __instance.workCourierDatas[j].inc, num52); num56 = __instance.packageUtility.AddItemToAllPackages(itemId3, num52, num50, num55, ref num54, 0); CourierData[] workCourierDatas2 = __instance.workCourierDatas; int num57 = j; workCourierDatas2[num57].inc = workCourierDatas2[num57].inc + num54; } else { num56 = __instance.packageUtility.AddItemToAllPackages(itemId3, itemCount, num50, __instance.workCourierDatas[j].inc, ref num54, 0); __instance.workCourierDatas[j].inc = num54; } __instance.packageUtility.player.NotifyReplenishPreferred(itemId3, num56); __instance.workCourierDatas[j].itemCount = itemCount - num56; __instance.orders[j].thisOrdered = __instance.workCourierDatas[j].itemCount; AddPlayerOrdered(__instance, factory, __instance.workCourierDatas[j].itemId, __instance.workCourierDatas[j].itemCount); } } else { DispenserComponent val7 = dispenserPool[endId]; AddStorageOrdered(val7, factory, __instance.orders[j].itemId, -__instance.orders[j].otherOrdered); __instance.orders[j].otherOrdered = 0; int num58 = factory.InsertIntoStorage(val7.storage.bottomStorage.entityId, itemId3, itemCount, __instance.workCourierDatas[j].inc, ref num59, true); int num60 = itemCount - num58; if (num60 > 0) { bool flag3 = true; DispenserStore[] holdupPackage = val7.holdupPackage; for (int k = 0; k < val7.holdupItemCount; k++) { if (holdupPackage[k].itemId == itemId3) { DispenserStore[] array4 = holdupPackage; int num61 = k; array4[num61].count = array4[num61].count + num60; DispenserStore[] array5 = holdupPackage; int num62 = k; array5[num62].inc = array5[num62].inc + num59; flag3 = false; break; } } if (flag3) { int holdupItemCount = val7.holdupItemCount; Assert.True(holdupPackage.Length >= holdupItemCount); holdupPackage[holdupItemCount].itemId = itemId3; holdupPackage[holdupItemCount].count = num60; holdupPackage[holdupItemCount].inc = num59; val7.holdupItemCount++; } } factory.gameData.statistics.traffic.RegisterPlanetInternalStat(factory.planetId, __instance.workCourierDatas[j].itemId, __instance.workCourierDatas[j].itemCount); __instance.workCourierDatas[j].itemCount = 0; __instance.workCourierDatas[j].inc = 0; val7.pulseSignal = 2; } __instance.workCourierDatas[j].direction = -1f; continue; } int itemId4 = __instance.orders[j].itemId; int num63 = __instance.orders[j].thisOrdered; if (endId < 0) { int num64 = -(endId + 1); AddPlayerOrdered(__instance, factory, __instance.orders[j].itemId, -__instance.orders[j].thisOrdered); __instance.orders[j].thisOrdered = 0; GRID[] array6 = grids; int num65 = num64; array6[num65].ordered = array6[num65].ordered - __instance.orders[j].otherOrdered; __instance.orders[j].otherOrdered = 0; int num66 = grids[num64].count + __instance.packageUtility.GetPackageItemCount(itemId4); if (num66 > grids[num64].recycleCount && num66 > 0) { int num67 = num66 - grids[num64].recycleCount; if (num67 > 0) { if (num67 < num63) { num63 = num67; } __instance.packageUtility.TakeItemFromAllPackages(num64, ref itemId4, ref num63, ref inc3, false); __instance.workCourierDatas[j].itemId = itemId4; __instance.workCourierDatas[j].itemCount = num63; __instance.workCourierDatas[j].inc = inc3; AddPlayerOrdered(__instance, factory, itemId4, num63); __instance.orders[j].thisOrdered = num63; } } if (__instance.workCourierDatas[j].itemCount == 0 && ((int)__instance.playerMode == 1 || (int)__instance.playerMode == 2) && CheckHasFilter(__instance, factory) && __instance.holdupItemCount < 6) { for (int l = 0; l < __instance.playerPairCount; l++) { if (__instance.pairs[l].supplyId >= 0) { continue; } num64 = __instance.pairs[l].supplyIndex; int itemId5 = grids[num64].itemId; if (!CheckItemId(__instance, factory, itemId5)) { Assert.CannotBeReached(); } else { if (__instance.holdupItemCount > 0 && (itemId5 == __instance.holdupPackage[0].itemId || itemId5 == __instance.holdupPackage[1].itemId || itemId5 == __instance.holdupPackage[2].itemId || itemId5 == __instance.holdupPackage[3].itemId || itemId5 == __instance.holdupPackage[4].itemId)) { continue; } int packageItemCount2 = __instance.packageUtility.GetPackageItemCount(itemId5); int num68 = ((GRID)(ref grids[num64])).modifiedCount + packageItemCount2; num66 = grids[num64].count + packageItemCount2; int num69 = ((num68 < num66) ? num68 : num66); if (num69 <= grids[num64].recycleCount || num69 <= 0) { continue; } int itemPlayerOrdered2 = GetItemPlayerOrdered(__instance, factory, itemId5); int num70 = __instance.InsertIntoStoragePrecalc(itemId5, courierCarries + itemPlayerOrdered2, false) - itemPlayerOrdered2; if (num70 > 0) { __instance.packageUtility.TakeItemFromAllPackages(num64, ref itemId5, ref num70, ref inc4, false); if (num70 > 0) { __instance.workCourierDatas[j].itemId = itemId5; __instance.workCourierDatas[j].itemCount = num70; __instance.workCourierDatas[j].inc = inc4; __instance.workCourierDatas[j].endId = __instance.pairs[l].supplyId; __instance.orders[j].itemId = itemId4; __instance.orders[j].otherId = __instance.pairs[l].supplyId; __instance.orders[j].thisOrdered = num70; AddPlayerOrdered(__instance, factory, itemId5, num70); break; } } } } } } else { DispenserComponent val8 = dispenserPool[endId]; AddStorageOrdered(__instance, factory, __instance.orders[j].itemId, -__instance.orders[j].thisOrdered); __instance.orders[j].thisOrdered = 0; AddStorageOrdered(val8, factory, __instance.orders[j].itemId, -__instance.orders[j].otherOrdered); __instance.orders[j].otherOrdered = 0; int num71 = factory.PickFromStorage(val8.storage.bottomStorage.entityId, itemId4, num63, ref inc5); __instance.workCourierDatas[j].itemId = itemId4; __instance.workCourierDatas[j].itemCount = num71; __instance.workCourierDatas[j].inc = inc5; factory.gameData.statistics.traffic.RegisterPlanetInternalStat(factory.planetId, itemId4, num71); AddStorageOrdered(__instance, factory, itemId4, num71); __instance.orders[j].thisOrdered = num71; val8.pulseSignal = 2; } __instance.workCourierDatas[j].direction = -1f; } else { if (!(__instance.workCourierDatas[j].t <= 0f)) { continue; } int itemId6 = __instance.workCourierDatas[j].itemId; int itemCount2 = __instance.workCourierDatas[j].itemCount; if (itemId6 > 0 && itemCount2 > 0) { factory.gameData.statistics.traffic.RegisterPlanetInternalStat(factory.planetId, itemId6, itemCount2); bool flag4 = __instance.orders[j].otherId >= 0; int num72 = factory.InsertIntoStorage(entityId, itemId6, itemCount2, __instance.workCourierDatas[j].inc, ref num73, flag4); int num74 = itemCount2 - num72; if (num74 > 0) { bool flag5 = true; for (int m = 0; m < __instance.holdupItemCount; m++) { if (__instance.holdupPackage[m].itemId == itemId6) { DispenserStore[] holdupPackage2 = __instance.holdupPackage; int num75 = m; holdupPackage2[num75].count = holdupPackage2[num75].count + num74; DispenserStore[] holdupPackage3 = __instance.holdupPackage; int num76 = m; holdupPackage3[num76].inc = holdupPackage3[num76].inc + num73; flag5 = false; break; } } if (flag5) { __instance.holdupPackage[__instance.holdupItemCount].itemId = itemId6; __instance.holdupPackage[__instance.holdupItemCount].count = num74; __instance.holdupPackage[__instance.holdupItemCount].inc = num73; __instance.holdupItemCount++; } } } if (__instance.orders[j].otherId < 0) { AddPlayerOrdered(__instance, factory, __instance.orders[j].itemId, -__instance.orders[j].thisOrdered); } else if (__instance.orders[j].otherId > 0) { AddStorageOrdered(__instance, factory, __instance.orders[j].itemId, -__instance.orders[j].thisOrdered); } __instance.orders[j].thisOrdered = 0; Array.Copy(__instance.workCourierDatas, j + 1, __instance.workCourierDatas, j, __instance.workCourierDatas.Length - j - 1); Array.Copy(__instance.orders, j + 1, __instance.orders, j, __instance.orders.Length - j - 1); __instance.workCourierCount--; __instance.idleCourierCount++; Array.Clear(__instance.workCourierDatas, __instance.workCourierCount, __instance.workCourierDatas.Length - __instance.workCourierCount); Array.Clear(__instance.orders, __instance.workCourierCount, __instance.orders.Length - __instance.workCourierCount); j--; __instance.pulseSignal = 2; } } int inc7 = default(int); for (int n = 0; n < __instance.holdupItemCount; n++) { int count = __instance.holdupPackage[n].count; int inc6 = __instance.holdupPackage[n].inc; int num77 = factory.InsertIntoStorage(__instance.storage.bottomStorage.entityId, __instance.holdupPackage[n].itemId, count, inc6, ref inc7, true); __instance.holdupPackage[n].count = count - num77; __instance.holdupPackage[n].inc = inc7; if (__instance.holdupPackage[n].count == 0) { Assert.Zero(__instance.holdupPackage[n].inc); __instance.RemoveHoldupItem(n); n--; } } if (__instance.filter > 0) { num = (int)(time % 600); if (num < 0) { num += 600; } if (num == __instance.gene) { if (__instance.storage.bottomStorage.grids[0].itemId == __instance.filter) { __instance.pickStorageSearchStart = __instance.storage.bottomStorage; __instance.pickGridSearchStart = 0; } if (__instance.storage.topStorage.grids[__instance.storage.size - 1].itemId == 0) { __instance.insertStorageSearchStart = __instance.storage; __instance.insertGridSearchStart = __instance.storage.size - 1; if (__instance.insertGridSearchStart < 0) { __instance.insertGridSearchStart = 0; } } } } __instance.pulseSignal--; return false; } public static int split_inc(ref int n, ref int m, int p) { int num = m / n; int num2 = m - num * n; n -= p; num2 -= n; num = ((num2 > 0) ? (num * p + num2) : (num * p)); m -= num; return num; } [HarmonyPatch(typeof(DispenserComponent), "OnRematchPairs")] [HarmonyPrefix] public static bool DispenserComponent_OnRematchPairs_Patch(DispenserComponent __instance, PlanetFactory factory, DispenserComponent[] dispenserPool, int keyId, int courierCarries) { //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Invalid comparison between Unknown and I4 //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Invalid comparison between Unknown and I4 //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Invalid comparison between Unknown and I4 //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Invalid comparison between Unknown and I4 //IL_08bd: Unknown result type (might be due to invalid IL or missing references) //IL_08c3: Invalid comparison between Unknown and I4 //IL_0b19: Unknown result type (might be due to invalid IL or missing references) //IL_0b1f: Invalid comparison between Unknown and I4 //IL_08c7: Unknown result type (might be due to invalid IL or missing references) //IL_08cd: Invalid comparison between Unknown and I4 //IL_0d07: Unknown result type (might be due to invalid IL or missing references) //IL_0d0d: Invalid comparison between Unknown and I4 //IL_0b23: Unknown result type (might be due to invalid IL or missing references) //IL_0b29: Invalid comparison between Unknown and I4 //IL_0d10: Unknown result type (might be due to invalid IL or missing references) //IL_0d16: Invalid comparison between Unknown and I4 if (__instance.pairProcess < __instance.playerPairCount) { __instance.pairProcess = __instance.playerPairCount; } else if (__instance.pairProcess > __instance.pairCount - 1) { __instance.pairProcess = __instance.pairCount - 1; } GRID[] grids = __instance.deliveryPackage.grids; for (int i = 0; i < __instance.workCourierCount; i++) { if (keyId == __instance.id) { if (__instance.workCourierDatas[i].itemCount == 0 && __instance.workCourierDatas[i].direction > 0f) { if (__instance.orders[i].otherId > 0) { DispenserComponent val = dispenserPool[__instance.orders[i].otherId]; if ((int)__instance.storageMode != 2 || (int)val.storageMode != 1) { int itemId = __instance.orders[i].itemId; if (!CheckItemId(__instance, factory, itemId) || !CheckItemId(val, factory, itemId)) { AddStorageOrdered(__instance, factory, itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; AddStorageOrdered(val, factory, itemId, -__instance.orders[i].otherOrdered); __instance.orders[i].otherOrdered = 0; __instance.workCourierDatas[i].endId = 0; __instance.workCourierDatas[i].direction = -1f; } } } else if (__instance.orders[i].otherId < 0 && !CheckItemId(__instance, factory, __instance.orders[i].itemId)) { AddPlayerOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; GRID[] grids2 = __instance.deliveryPackage.grids; int num = -(__instance.orders[i].otherId + 1); grids2[num].ordered = grids2[num].ordered - __instance.orders[i].otherOrdered; __instance.orders[i].otherOrdered = 0; bool flag = true; if (((int)__instance.playerMode == 1 || (int)__instance.playerMode == 2) && CheckHasFilter(__instance, factory) && __instance.holdupItemCount < 6) { for (int j = 0; j < __instance.playerPairCount; j++) { if (__instance.pairs[j].supplyId >= 0) { continue; } int supplyIndex = __instance.pairs[j].supplyIndex; int itemId2 = grids[supplyIndex].itemId; if (!CheckItemId(__instance, factory, itemId2)) { Assert.CannotBeReached(); } else { if (__instance.holdupItemCount > 0 && (itemId2 == __instance.holdupPackage[0].itemId || itemId2 == __instance.holdupPackage[1].itemId || itemId2 == __instance.holdupPackage[2].itemId || itemId2 == __instance.holdupPackage[3].itemId || itemId2 == __instance.holdupPackage[4].itemId)) { continue; } int packageItemCount = __instance.packageUtility.GetPackageItemCount(itemId2); int num2 = ((GRID)(ref grids[supplyIndex])).modifiedCount + packageItemCount; int num3 = grids[supplyIndex].count + packageItemCount; int num4 = ((num2 < num3) ? num2 : num3); if (num4 > grids[supplyIndex].recycleCount && num4 > 0) { int itemPlayerOrdered = GetItemPlayerOrdered(__instance, factory, itemId2); int num5 = __instance.InsertIntoStoragePrecalc(itemId2, courierCarries + itemPlayerOrdered, false) - itemPlayerOrdered; if (num5 > 0) { __instance.workCourierDatas[i].itemId = itemId2; __instance.workCourierDatas[i].direction = 1f; __instance.workCourierDatas[i].endId = __instance.pairs[j].supplyId; __instance.orders[i].itemId = itemId2; __instance.orders[i].otherId = -(supplyIndex + 1); __instance.orders[i].thisOrdered = num5; __instance.orders[i].otherOrdered = -num5; AddPlayerOrdered(__instance, factory, itemId2, num5); GRID[] array = grids; int num6 = supplyIndex; array[num6].ordered = array[num6].ordered - num5; flag = false; break; } } } } } if (flag) { CourierTurnbackFromPlayer(factory, ref __instance.workCourierDatas[i], __instance.entityId); } } } if (__instance.workCourierDatas[i].itemCount != 0 && __instance.workCourierDatas[i].direction < 0f && !CheckItemId(__instance, factory, __instance.orders[i].itemId) && __instance.workCourierDatas[i].itemId > 0) { if (__instance.orders[i].otherId > 0) { AddStorageOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; AddStorageOrdered(dispenserPool[__instance.orders[i].otherId], factory, __instance.orders[i].itemId, -__instance.orders[i].otherOrdered); __instance.orders[i].otherOrdered = 0; } else if (__instance.orders[i].otherId < 0) { AddPlayerOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; GRID[] grids3 = __instance.deliveryPackage.grids; int num7 = -(__instance.orders[i].otherId + 1); grids3[num7].ordered = grids3[num7].ordered - __instance.orders[i].otherOrdered; __instance.orders[i].otherOrdered = 0; } } } else { if ((keyId != __instance.orders[i].otherId && (keyId >= -100 || __instance.orders[i].otherId >= 0)) || !(__instance.workCourierDatas[i].direction > 0f)) { continue; } if (__instance.orders[i].otherId > 0 && (dispenserPool[__instance.orders[i].otherId] == null || dispenserPool[__instance.orders[i].otherId].id == 0)) { AddStorageOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; __instance.orders[i].otherOrdered = 0; __instance.workCourierDatas[i].endId = 0; __instance.workCourierDatas[i].direction = -1f; } else if (__instance.workCourierDatas[i].itemCount > 0) { if (__instance.orders[i].otherId > 0) { DispenserComponent val2 = dispenserPool[__instance.orders[i].otherId]; if ((int)__instance.storageMode != 1 || (int)val2.storageMode != 2) { int itemId3 = __instance.orders[i].itemId; if (!CheckItemId(__instance, factory, itemId3) || !CheckItemId(val2, factory, itemId3)) { AddStorageOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; AddStorageOrdered(val2, factory, __instance.orders[i].itemId, -__instance.orders[i].otherOrdered); __instance.orders[i].otherOrdered = 0; __instance.workCourierDatas[i].endId = 0; __instance.workCourierDatas[i].direction = -1f; } } } else { AddPlayerOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; if (__instance.deliveryPackage.grids[-(__instance.orders[i].otherId + 1)].itemId == __instance.orders[i].itemId) { GRID[] grids4 = __instance.deliveryPackage.grids; int num8 = -(__instance.orders[i].otherId + 1); grids4[num8].ordered = grids4[num8].ordered - __instance.orders[i].otherOrdered; } __instance.orders[i].otherOrdered = 0; CourierTurnbackFromPlayer(factory, ref __instance.workCourierDatas[i], __instance.entityId); } } else { if (__instance.workCourierDatas[i].itemCount != 0) { continue; } if (__instance.orders[i].otherId > 0) { DispenserComponent val3 = dispenserPool[__instance.orders[i].otherId]; if ((int)__instance.storageMode != 2 || (int)val3.storageMode != 1) { int itemId4 = __instance.orders[i].itemId; if (!CheckItemId(__instance, factory, itemId4) || !CheckItemId(val3, factory, itemId4)) { AddStorageOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; AddStorageOrdered(val3, factory, __instance.orders[i].itemId, -__instance.orders[i].otherOrdered); __instance.orders[i].otherOrdered = 0; __instance.workCourierDatas[i].endId = 0; __instance.workCourierDatas[i].direction = -1f; } } continue; } AddPlayerOrdered(__instance, factory, __instance.orders[i].itemId, -__instance.orders[i].thisOrdered); __instance.orders[i].thisOrdered = 0; if (__instance.deliveryPackage.grids[-(__instance.orders[i].otherId + 1)].itemId == __instance.orders[i].itemId) { GRID[] grids5 = __instance.deliveryPackage.grids; int num9 = -(__instance.orders[i].otherId + 1); grids5[num9].ordered = grids5[num9].ordered - __instance.orders[i].otherOrdered; } __instance.orders[i].otherOrdered = 0; bool flag2 = true; if (((int)__instance.playerMode == 1 || (int)__instance.playerMode == 2) && CheckHasFilter(__instance, factory) && __instance.holdupItemCount < 6) { for (int k = 0; k < __instance.playerPairCount; k++) { if (__instance.pairs[k].supplyId >= 0) { continue; } int supplyIndex2 = __instance.pairs[k].supplyIndex; int itemId5 = grids[supplyIndex2].itemId; if (!CheckItemId(__instance, factory, itemId5)) { Assert.CannotBeReached(); } else { if (__instance.holdupItemCount > 0 && (itemId5 == __instance.holdupPackage[0].itemId || itemId5 == __instance.holdupPackage[1].itemId || itemId5 == __instance.holdupPackage[2].itemId || itemId5 == __instance.holdupPackage[3].itemId || itemId5 == __instance.holdupPackage[4].itemId)) { continue; } int packageItemCount2 = __instance.packageUtility.GetPackageItemCount(itemId5); int num10 = ((GRID)(ref grids[supplyIndex2])).modifiedCount + packageItemCount2; int num11 = grids[supplyIndex2].count + packageItemCount2; int num12 = ((num10 < num11) ? num10 : num11); if (num12 > grids[supplyIndex2].recycleCount && num12 > 0) { int itemPlayerOrdered2 = GetItemPlayerOrdered(__instance, factory, itemId5); int num13 = __instance.InsertIntoStoragePrecalc(itemId5, courierCarries + itemPlayerOrdered2, false) - itemPlayerOrdered2; if (num13 > 0) { __instance.workCourierDatas[i].itemId = itemId5; __instance.workCourierDatas[i].direction = 1f; __instance.workCourierDatas[i].endId = __instance.pairs[k].supplyId; __instance.orders[i].itemId = itemId5; __instance.orders[i].otherId = -(supplyIndex2 + 1); __instance.orders[i].thisOrdered = num13; __instance.orders[i].otherOrdered = -num13; AddPlayerOrdered(__instance, factory, itemId5, num13); GRID[] array2 = grids; int num14 = supplyIndex2; array2[num14].ordered = array2[num14].ordered - num13; flag2 = false; break; } } } } } if (flag2) { CourierTurnbackFromPlayer(factory, ref __instance.workCourierDatas[i], __instance.entityId); } } } } return false; } private static void CourierTurnbackFromPlayer(PlanetFactory factory, ref CourierData workCourier, int entityId) { //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) ref Vector3 pos = ref factory.entityPool[entityId].pos; ref Vector3 end = ref workCourier.end; double num = Math.Sqrt(pos.x * pos.x + pos.y * pos.y + pos.z * pos.z); double num2 = Math.Sqrt(end.x * end.x + end.y * end.y + end.z * end.z); double num3 = (double)(pos.x * end.x + pos.y * end.y + pos.z * end.z) / (num * num2); if (num3 < -1.0) { num3 = -1.0; } else if (num3 > 1.0) { num3 = 1.0; } workCourier.begin = pos; workCourier.maxt = (float)(Math.Acos(num3) * ((num + num2) * 0.5)); workCourier.maxt = (float)Math.Sqrt((double)(workCourier.maxt * workCourier.maxt) + (num - num2) * (num - num2)); workCourier.t = workCourier.maxt; workCourier.endId = 0; workCourier.direction = -1f; } } [BepInPlugin("org.ProfessorCat305.MultipleDelivery", "MultipleDelivery", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [CommonAPISubmoduleDependency(new string[] { "ProtoRegistry", "TabSystem", "LocalizationModule" })] [ModSaveSettings(/*Could not decode attribute arguments.*/)] public class MultipleDelivery : BaseUnityPlugin, IModCanSave { public const string MODGUID = "org.ProfessorCat305.MultipleDelivery"; public const string MODNAME = "MultipleDelivery"; public const string VERSION = "1.0.0"; public const string DEBUGVERSION = ""; public static bool LoadCompleted; internal static ManualLogSource logger; internal static ConfigEntry LDBToolCacheEntry; internal static ConfigEntry HideTechModeEntry; internal static ConfigEntry ShowMessageBoxEntry; internal static ConfigEntry ProductOverflowEntry; internal static ConfigEntry QToolsHotkey; private Harmony Harmony; public string Version => "1.0.0"; public void Awake() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown logger = ((BaseUnityPlugin)this).Logger; logger.Log((LogLevel)16, (object)"MultipleDelivery Awake"); Harmony = new Harmony("org.ProfessorCat305.MultipleDelivery"); Assembly executingAssembly = Assembly.GetExecutingAssembly(); Type[] types = executingAssembly.GetTypes(); foreach (Type type in types) { string? text = type.Namespace; if (text != null && text.StartsWith("MultipleDelivery_MOD.src", StringComparison.Ordinal)) { Harmony.PatchAll(type); } } LDBTool.PreAddDataAction = (Action)Delegate.Combine(LDBTool.PreAddDataAction, new Action(PreAddDataAction)); LDBTool.PostAddDataAction = (Action)Delegate.Combine(LDBTool.PostAddDataAction, new Action(PostAddDataAction)); LoadCompleted = true; } public void Export(BinaryWriter w) { DispenserMutiFilterManager.Export(w); } public void Import(BinaryReader r) { DispenserMutiFilterManager.Import(r); } public void IntoOtherSave() { DispenserMutiFilterManager.IntoOtherSave(); } private void PreAddDataAction() { } private void PostAddDataAction() { } internal static void LogInfo(object data) { logger.LogInfo(data); } internal static void LogWarning(object data) { logger.LogWarning(data); } internal static void LogError(object data) { logger.LogError(data); } internal static int VersionNumber() { //IL_0003: Unknown result type (might be due to invalid IL or missing references) Version val = default(Version); ((Version)(ref val)).FromFullString("1.0.0"); return ((Version)(ref val)).sig; } } internal static class UIDispenserWindowPatch { private static GameObject _obj; private static GameObject _iconObj; private static Text _text; private static Text _count; private static Image _icon; private static UIFilter[] _uiFilter = new UIFilter[5]; private static Button _button; private static Sprite _tagNotSelectedSprite; [HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")] [HarmonyPostfix] [HarmonyPriority(0)] public static void VFPreload_InvokeOnLoadWorkEnded_Postfix() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_obj == (Object)null) { GameObject val = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Dispenser Window"); RectTransform component = val.GetComponent(); component.sizeDelta = new Vector2(800f, 430f); Transform transform = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Dispenser Window/panel-mid/warning-tip-box").transform; transform.localPosition = new Vector3(-340f, -87f, 0f); Transform transform2 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Dispenser Window/panel-mid").transform; transform2.localPosition = new Vector3(340f, -56f, 0f); _obj = new GameObject { name = "multiItem" }; _obj.transform.SetParent(transform2, false); _obj.transform.localPosition = new Vector3(-360f, -8f, 0f); Transform transform3 = _obj.transform; GameObject val2 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Dispenser Window/panel-mid/filter-empty"); GameObject val3 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Dispenser Window/panel-mid/filter-icon"); for (int i = 0; i < 5; i++) { GameObject val4 = Object.Instantiate(val2, transform3); GameObject val5 = Object.Instantiate(val3, transform3); val4.transform.localScale = Vector3.one; val4.transform.localPosition = new Vector3(-70f * (float)(i + 1), 0f, 0f); val5.transform.localScale = Vector3.one; val5.transform.localPosition = new Vector3(-70f * (float)(i + 1), 0f, 0f); _uiFilter[i] = new UIFilter(i, val4, val5, val.transform); } } } [HarmonyPostfix] [HarmonyPatch(typeof(UIDispenserWindow), "OnDispenserIdChange")] [HarmonyPatch(typeof(UIDispenserWindow), "_OnUpdate")] public static void UIDispenserWindow_OnDispenserIdChange_Postfix(ref UIDispenserWindow __instance) { if (!((ManualBehaviour)__instance).active) { return; } if (__instance.dispenserId == 0 || __instance.factory == null) { ((ManualBehaviour)__instance)._Close(); return; } DispenserComponent val = __instance.transport.dispenserPool[__instance.dispenserId]; if (val == null || val.id != __instance.dispenserId) { ((ManualBehaviour)__instance)._Close(); return; } ItemProto val2 = ((ProtoSet)(object)LDB.items).Select((int)__instance.factory.entityPool[val.entityId].protoId); if (val2 == null) { ((ManualBehaviour)__instance)._Close(); return; } for (int i = 0; i < 5; i++) { _uiFilter[i].OnUpdate(val, __instance.factory, __instance.dispenserId); } } } public class UIFilter { private int filterIndex; private Transform _baseTransform; private UIButton _uiEmptyButton; private UIButton _uiFilterButton; private Image itemImage; private UIButton _uiTakeBackButton; private Text countText; private Text orderCountText; private Image incImage1; private Image incImage2; private Image incImage3; private int LocalDispenserId; private int LocalPlanetId; public UIFilter(int index, GameObject gameObject1, GameObject gameObject2, Transform baseTransform) { filterIndex = index; _uiEmptyButton = gameObject1.GetComponent(); _uiEmptyButton.onClick += OnSelectItemButtonClick; _uiFilterButton = gameObject2.GetComponent(); itemImage = gameObject2.GetComponent(); _uiTakeBackButton = ((Component)((Component)_uiFilterButton).transform.GetChild(2)).GetComponent(); _uiTakeBackButton.onClick += OnTakeBackButtonClick; countText = ((Component)gameObject2.transform.Find("current-count-text")).GetComponent(); orderCountText = ((Component)gameObject2.transform.Find("ordered-count-text")).GetComponent(); incImage1 = ((Component)((Component)_uiFilterButton).transform.GetChild(3)).GetComponent(); incImage2 = ((Component)((Component)_uiFilterButton).transform.GetChild(4)).GetComponent(); incImage3 = ((Component)((Component)_uiFilterButton).transform.GetChild(5)).GetComponent(); _baseTransform = baseTransform; } public void OnUpdate(DispenserComponent dispenserComponent, PlanetFactory factory, int dispenserId) { LocalDispenserId = dispenserId; LocalPlanetId = factory.planet.id; Dictionary mutiFilterdata = DispenserMutiFilterManager.Instance.GetMutiFilterdata(LocalPlanetId); int[] array = mutiFilterdata[LocalDispenserId]; int num = array[filterIndex]; if (num > 0) { ItemProto val = ((ProtoSet)(object)LDB.items).Select(num); if (val != null) { _uiFilterButton.tips.itemId = num; itemImage.sprite = val.iconSprite; ((Component)_uiEmptyButton).gameObject.SetActive(false); ((Component)_uiFilterButton).gameObject.SetActive(true); } } else { ((Component)_uiEmptyButton).gameObject.SetActive(true); ((Component)_uiFilterButton).gameObject.SetActive(false); } CalculateStorageTotalCount(dispenserComponent, num, out var count, out var inc); countText.text = count.ToString(); int num2 = ((count > 0 && inc > 0) ? (inc / count) : 0); ((Behaviour)incImage1).enabled = num2 >= 1 && num2 < 2; ((Behaviour)incImage2).enabled = num2 >= 2 && num2 < 4; ((Behaviour)incImage3).enabled = num2 >= 4; int itemStorageOrdered = DispenserPatch.GetItemStorageOrdered(dispenserComponent, factory, num); int itemPlayerOrdered = DispenserPatch.GetItemPlayerOrdered(dispenserComponent, factory, num); int num3 = itemPlayerOrdered + itemStorageOrdered; if (num3 == 0) { orderCountText.text = ""; } else if (num3 < 0) { orderCountText.text = num3.ToString(); } else { orderCountText.text = "+" + num3; } } public void OnSelectItemButtonClick(int obj) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (UIItemPicker.isOpened) { UIItemPicker.Close(); return; } Transform baseTransform = _baseTransform; UIItemPicker.Popup(((RectTransform)((baseTransform is RectTransform) ? baseTransform : null)).anchoredPosition + new Vector2(-300f, 0f), (Action)OnItemPickerReturn); } public void OnItemPickerReturn(ItemProto itemProto) { if (itemProto != null && LocalDispenserId != 0 && LocalPlanetId != 0 && GameMain.localPlanet.id == LocalPlanetId) { PlanetTransport transport = GameMain.localPlanet.factory.transport; DispenserComponent val = transport.dispenserPool[LocalDispenserId]; if (val != null && val.id == LocalDispenserId && (val.filter != ((Proto)itemProto).ID || ((Proto)itemProto).ID == 0)) { DispenserMutiFilterManager.Instance.SetDispenserFilter(LocalPlanetId, LocalDispenserId, filterIndex, ((Proto)itemProto).ID); transport.RefreshDispenserTraffic(LocalDispenserId); OnUpdate(val, transport.factory, LocalDispenserId); } } } public void OnTakeBackButtonClick(int obj) { if (LocalDispenserId != 0 && LocalPlanetId != 0) { PlanetTransport transport = GameMain.localPlanet.factory.transport; DispenserComponent val = transport.dispenserPool[LocalDispenserId]; if (val != null && val.id == LocalDispenserId) { DispenserMutiFilterManager.Instance.SetDispenserFilter(LocalPlanetId, LocalDispenserId, filterIndex, 0); transport.RefreshDispenserTraffic(LocalDispenserId); itemImage.sprite = null; ((Component)_uiEmptyButton).gameObject.SetActive(true); ((Component)_uiFilterButton).gameObject.SetActive(false); } } } private void CalculateStorageTotalCount(DispenserComponent dispenserComponent, int itemId, out int count, out int inc) { count = 0; inc = 0; if (dispenserComponent.storage != null && itemId > 0) { StorageComponent val = dispenserComponent.storage; int num = default(int); do { count += val.GetItemCount(itemId, ref num); inc += num; val = val.previousStorage; } while (val != null); } } }