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<int, Dictionary<int, int[]>> DispenserMutiFilterdata = new Dictionary<int, Dictionary<int, int[]>>();
private static Dictionary<int, Dictionary<int, int[]>> DispenserPlayerOrderCountdata = new Dictionary<int, Dictionary<int, int[]>>();
private static Dictionary<int, Dictionary<int, int[]>> DispenserStorageOrderCountdata = new Dictionary<int, Dictionary<int, int[]>>();
public static DispenserMutiFilterManager Instance => _instance;
private DispenserMutiFilterManager()
{
}
public Dictionary<int, int[]> GetMutiFilterdata(int planetId)
{
return GeneralExtensions.GetValueSafe<int, Dictionary<int, int[]>>(DispenserMutiFilterdata, planetId);
}
public Dictionary<int, int[]> GetPlayerOrderdata(int planetId)
{
return GeneralExtensions.GetValueSafe<int, Dictionary<int, int[]>>(DispenserPlayerOrderCountdata, planetId);
}
public Dictionary<int, int[]> GetStorageOrderdata(int planetId)
{
return GeneralExtensions.GetValueSafe<int, Dictionary<int, int[]>>(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<int, int[]>();
}
DispenserMutiFilterdata[id][__result] = new int[5];
if (!DispenserPlayerOrderCountdata.ContainsKey(id))
{
DispenserPlayerOrderCountdata[id] = new Dictionary<int, int[]>();
}
DispenserPlayerOrderCountdata[id][__result] = new int[5];
if (!DispenserStorageOrderCountdata.ContainsKey(id))
{
DispenserStorageOrderCountdata[id] = new Dictionary<int, int[]>();
}
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<int, int[]>(GeneralExtensions.GetValueSafe<int, Dictionary<int, int[]>>(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<int, int[]>(GeneralExtensions.GetValueSafe<int, Dictionary<int, int[]>>(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<int, Dictionary<int, int[]>> dispenserMutiFilterdatum in DispenserMutiFilterdata)
{
w.Write(dispenserMutiFilterdatum.Key);
w.Write(dispenserMutiFilterdatum.Value.Count);
foreach (KeyValuePair<int, int[]> 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<int, Dictionary<int, int[]>> dispenserPlayerOrderCountdatum in DispenserPlayerOrderCountdata)
{
w.Write(dispenserPlayerOrderCountdatum.Key);
w.Write(dispenserPlayerOrderCountdatum.Value.Count);
foreach (KeyValuePair<int, int[]> 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<int, Dictionary<int, int[]>> dispenserStorageOrderCountdatum in DispenserStorageOrderCountdata)
{
w.Write(dispenserStorageOrderCountdatum.Key);
w.Write(dispenserStorageOrderCountdatum.Value.Count);
foreach (KeyValuePair<int, int[]> 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<int, int[]>();
}
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<int, int[]>();
}
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<int, int[]>();
}
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<int, int[]>();
}
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<int, int[]>();
}
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<int, int[]>();
}
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<int, int[]> 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<int, int[]> 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<bool> LDBToolCacheEntry;
internal static ConfigEntry<bool> HideTechModeEntry;
internal static ConfigEntry<bool> ShowMessageBoxEntry;
internal static ConfigEntry<int> ProductOverflowEntry;
internal static ConfigEntry<KeyboardShortcut> 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<RectTransform>();
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<GameObject>(val2, transform3);
GameObject val5 = Object.Instantiate<GameObject>(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<ItemProto>)(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<UIButton>();
_uiEmptyButton.onClick += OnSelectItemButtonClick;
_uiFilterButton = gameObject2.GetComponent<UIButton>();
itemImage = gameObject2.GetComponent<Image>();
_uiTakeBackButton = ((Component)((Component)_uiFilterButton).transform.GetChild(2)).GetComponent<UIButton>();
_uiTakeBackButton.onClick += OnTakeBackButtonClick;
countText = ((Component)gameObject2.transform.Find("current-count-text")).GetComponent<Text>();
orderCountText = ((Component)gameObject2.transform.Find("ordered-count-text")).GetComponent<Text>();
incImage1 = ((Component)((Component)_uiFilterButton).transform.GetChild(3)).GetComponent<Image>();
incImage2 = ((Component)((Component)_uiFilterButton).transform.GetChild(4)).GetComponent<Image>();
incImage3 = ((Component)((Component)_uiFilterButton).transform.GetChild(5)).GetComponent<Image>();
_baseTransform = baseTransform;
}
public void OnUpdate(DispenserComponent dispenserComponent, PlanetFactory factory, int dispenserId)
{
LocalDispenserId = dispenserId;
LocalPlanetId = factory.planet.id;
Dictionary<int, int[]> mutiFilterdata = DispenserMutiFilterManager.Instance.GetMutiFilterdata(LocalPlanetId);
int[] array = mutiFilterdata[LocalDispenserId];
int num = array[filterIndex];
if (num > 0)
{
ItemProto val = ((ProtoSet<ItemProto>)(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<ItemProto>)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);
}
}
}