Decompiled source of MultipleDelivery v1.0.0

plugins/MultipleDelivery-MOD.dll

Decompiled a week ago
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);
		}
	}
}