Decompiled source of MoreReasonableCargoTraffic v1.2.6

patchers/shisang_makuwa/MoreReasonableCargoTrafficPreloader.dll

Decompiled 5 months ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx.Logging;
using Mono.Cecil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MoreReasonableCargoTrafficPreloader")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("MoreReasonableCargoTrafficPreloader")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ad0a51cf-32f6-4f87-a99b-b010ab6e7dca")]
[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 MoreReasonableCargoTrafficPreloader
{
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "MoreReasonableCargoTrafficPreloader";

		public const string PLUGIN_NAME = "";

		public const string PLUGIN_VERSION = "1.0.0.0";
	}
}
namespace MoreReasonableCargoTraffic
{
	public class Preloader
	{
		public static ManualLogSource logSource;

		public static IEnumerable<string> TargetDLLs { get; } = new string[1] { "Assembly-CSharp.dll" };


		public static void Initialize()
		{
			logSource = Logger.CreateLogSource("DSPOptimizations Preloader");
		}

		private static TypeDefinition GetType(AssemblyDefinition assembly, string type)
		{
			TypeDefinition type2 = assembly.MainModule.GetType(type);
			if (type2 != null)
			{
				return type2;
			}
			logSource.LogError((object)("Preloader patch failed: unable to get type " + type));
			return type2;
		}

		public static void Patch(AssemblyDefinition assembly)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Expected O, but got Unknown
			TypeSystem typeSystem = assembly.MainModule.TypeSystem;
			TypeDefinition type = GetType(assembly, "CargoPath");
			logSource.LogInfo((object)"try to run MoreReasonableCargoTraffic preloader patch");
			if (type != null)
			{
				type.Fields.Add(new FieldDefinition("lastUpdate", (FieldAttributes)6, typeSystem.Boolean));
				TypeDefinition val = type;
				if (val != null)
				{
					val.Fields.Add(new FieldDefinition("outputChunk", (FieldAttributes)6, typeSystem.Int32));
					logSource.LogInfo((object)"Successfully added lastUpdate");
				}
			}
			logSource.LogInfo((object)"Successfully ran MoreReasonableCargoTraffic preloader patch");
		}
	}
}

plugins/shisang_makuwa/MoreReasonableCargoTraffic.dll

Decompiled 5 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace MoreReasonableCargoTraffic;

[BepInPlugin("shisang_MoreReasonableCargoTraffic", "MoreReasonableCargoTraffic", "1.2.6")]
public class MoreReasonableCargoTraffic : BaseUnityPlugin
{
	private void Awake()
	{
		Harmony.CreateAndPatchAll(typeof(MoreReasonableCargoTraffic), (string)null);
		Debug.Log((object)"Add MoreReasonableCargoTraffic");
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(CargoPath), "Update")]
	public static bool CargoPath_UpDate_Prefix(CargoPath __instance)
	{
		if (__instance.outputPath != null)
		{
			int num = __instance.outputChunk;
			if (num > __instance.outputPath.chunkCount - 1)
			{
				num = __instance.outputPath.chunkCount - 1;
			}
			int num2 = 0;
			int num3 = __instance.outputPath.chunkCount;
			while (true)
			{
				if (__instance.outputPath.chunks[num * 3] > __instance.outputIndex)
				{
					num3 = num;
					num = (num2 + num) / 2;
					continue;
				}
				if (__instance.outputPath.chunks[num * 3] + __instance.outputPath.chunks[num * 3 + 1] >= __instance.outputIndex)
				{
					break;
				}
				num2 = num + 1;
				num = (num3 + num) / 2;
			}
			__instance.outputChunk = num;
			int num4 = __instance.outputPath.chunks[num * 3 + 2];
			byte[] array = ((__instance.id > __instance.outputPath.id) ? __instance.buffer : __instance.outputPath.buffer);
			lock ((__instance.id < __instance.outputPath.id) ? __instance.buffer : __instance.outputPath.buffer)
			{
				lock (array)
				{
					int num5 = __instance.bufferLength - 5 - 1;
					if (__instance.buffer[num5] == 250)
					{
						int num6 = __instance.buffer[num5 + 1] - 1 + (__instance.buffer[num5 + 2] - 1) * 100 + (__instance.buffer[num5 + 3] - 1) * 10000 + (__instance.buffer[num5 + 4] - 1) * 1000000;
						if (__instance.closed)
						{
							if (__instance.outputPath.TryInsertCargoNoSqueeze(__instance.outputIndex, num6))
							{
								Array.Clear(__instance.buffer, num5 - 4, 10);
								__instance.updateLen = __instance.bufferLength;
							}
						}
						else if (__instance.outputPath.TryInsertCargo((__instance.lastUpdate == __instance.outputPath.lastUpdate) ? __instance.outputIndex : ((__instance.outputIndex + num4 > __instance.outputPath.bufferLength - 6) ? (__instance.outputPath.bufferLength - 6) : (__instance.outputIndex + num4)), num6))
						{
							Array.Clear(__instance.buffer, num5 - 4, 10);
							__instance.updateLen = __instance.bufferLength;
						}
					}
				}
			}
		}
		else if (__instance.bufferLength <= 10)
		{
			return false;
		}
		lock (__instance.buffer)
		{
			__instance.lastUpdate = !__instance.lastUpdate;
			int num7 = __instance.updateLen - 1;
			while (num7 >= 0 && __instance.buffer[num7] != 0)
			{
				__instance.updateLen--;
				num7--;
			}
			if (__instance.updateLen == 0)
			{
				return false;
			}
			int num8 = __instance.updateLen;
			for (int num9 = __instance.chunkCount - 1; num9 >= 0; num9--)
			{
				int num10 = __instance.chunks[num9 * 3];
				int num11 = __instance.chunks[num9 * 3 + 2];
				if (num10 < num8)
				{
					if (__instance.buffer[num10] != 0)
					{
						for (int i = num10 - 5; i < num10 + 4; i++)
						{
							if (i >= 0 && __instance.buffer[i] == 250)
							{
								num10 = ((i >= num10) ? (i - 4) : (i + 5 + 1));
								break;
							}
						}
					}
					int num12 = 0;
					while (num12 < num11)
					{
						int num13 = num8 - num10;
						if (num13 >= 10)
						{
							int num14 = 0;
							for (int j = 0; j < num11 - num12 && __instance.buffer[num8 - 1 - j] == 0; j++)
							{
								num14++;
							}
							if (num14 > 0)
							{
								Array.Copy(__instance.buffer, num10, __instance.buffer, num10 + num14, num13 - num14);
								Array.Clear(__instance.buffer, num10, num14);
								num12 += num14;
							}
							int num15 = num8 - 1;
							while (num15 >= 0 && __instance.buffer[num15] != 0)
							{
								num8--;
								num15--;
							}
							continue;
						}
						break;
					}
					int num16 = num10 + ((num12 == 0) ? 1 : num12);
					if (num8 > num16)
					{
						num8 = num16;
					}
				}
			}
		}
		return false;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(CargoPath), "TryInsertCargo")]
	public static bool CargoPath_TryInsertCargo_Prefix(CargoPath __instance, ref bool __result, int index, int cargoId)
	{
		int num = index + 5;
		int num2 = index - 5;
		if (index < 4 || num >= __instance.bufferLength)
		{
			__result = false;
			return false;
		}
		bool flag = false;
		while (index > num2)
		{
			if (__instance.buffer[num] != 0)
			{
				index--;
				num--;
				continue;
			}
			flag = true;
			break;
		}
		if (!flag)
		{
			__result = false;
			return false;
		}
		if (num + 6 < __instance.bufferLength)
		{
			int num3;
			int num4;
			int num5;
			int num6;
			int num7;
			if (__instance.buffer[num3 = num + 1] != 0)
			{
				index = num3 - 1 - 5;
			}
			else if (__instance.buffer[num4 = num3 + 1] != 0)
			{
				index = num4 - 1 - 5;
			}
			else if (__instance.buffer[num5 = num4 + 1] != 0)
			{
				index = num5 - 1 - 5;
			}
			else if (__instance.buffer[num6 = num5 + 1] != 0)
			{
				index = num6 - 1 - 5;
			}
			else if (__instance.buffer[num7 = num6 + 1] != 0)
			{
				index = num7 - 1 - 5;
			}
		}
		if (index < 4)
		{
			__result = false;
			return false;
		}
		int num8 = index + 5;
		int num9 = 0;
		int num10 = 0;
		int num11 = 0;
		bool flag2 = false;
		bool flag3 = false;
		int num12 = 0;
		if (__instance.closed)
		{
			for (int i = 1; i <= __instance.bufferLength && i <= 10; i++)
			{
				if (__instance.buffer[__instance.bufferLength - i] != 0)
				{
					num12++;
				}
			}
			if (num8 > __instance.bufferLength - 11)
			{
				num12 += num8 - __instance.bufferLength + 11;
			}
		}
		int num13 = num8;
		while (num13 >= num8 - 2880 && num13 >= 0)
		{
			if (__instance.buffer[num13] == 0)
			{
				num10++;
				if (!flag2)
				{
					num9++;
				}
			}
			else
			{
				flag2 = true;
				if (num9 < 1)
				{
					__result = false;
					return false;
				}
			}
			if (num10 == 10)
			{
				num11 = num9;
			}
			if (num10 == 10 + num12)
			{
				num9 = num11;
				num10 = 10;
				if (num9 >= 10)
				{
					__instance.InsertCargoDirect(index, cargoId);
					__result = true;
					return false;
				}
				flag3 = true;
				break;
			}
			if (__instance.closed && num13 == 0 && num8 > 9 && num8 < __instance.bufferLength - 11)
			{
				num13 = __instance.bufferLength - 11;
				while (__instance.bufferLength - num13 >= 2890 - num8 && num13 > num8)
				{
					if (__instance.buffer[num13] == 0)
					{
						num10++;
					}
					if (num10 == 10)
					{
						num11 = num9;
					}
					if (num10 == 10 + num12)
					{
						num9 = num11;
						num10 = 10;
						if (num9 >= 10)
						{
							__instance.InsertCargoDirect(index, cargoId);
							__result = true;
							return false;
						}
						flag3 = true;
						break;
					}
					num13--;
				}
				break;
			}
			num13--;
		}
		if (flag3)
		{
			int num14 = num10 - num9;
			int num15 = num8 - num9 + 1;
			int num16 = index - 4;
			while (num16 >= num8 - 2880 && num16 >= 0)
			{
				if (__instance.buffer[num16] == 246)
				{
					int num17 = 0;
					int num18 = num16 - 1;
					while (num18 >= num8 - 2880 && num18 >= 0 && num17 < num14 && __instance.buffer[num18] == 0)
					{
						num17++;
						num18--;
					}
					if (num17 > 0)
					{
						Array.Copy(__instance.buffer, num16, __instance.buffer, num16 - num17, num15 - num16);
						num14 -= num17;
						num15 -= num17;
						num16 -= num17;
					}
				}
				num16--;
			}
			if (num14 == 0)
			{
				__instance.InsertCargoDirect(index, cargoId);
				__result = true;
				return false;
			}
			Assert.CannotBeReached("断言失败:插入货物逻辑有误");
		}
		__result = false;
		return false;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(CargoPath), "TryInsertItem")]
	public static bool CargoPath_TryInsertItem_Prefix(CargoPath __instance, ref bool __result, int index, int itemId, byte stack, byte inc)
	{
		lock (__instance.buffer)
		{
			int num = index + 5;
			int num2 = index - 5;
			if (index < 4 || num >= __instance.bufferLength)
			{
				__result = false;
				return false;
			}
			bool flag = false;
			while (index > num2)
			{
				if (__instance.buffer[num] != 0)
				{
					index--;
					num--;
					continue;
				}
				flag = true;
				break;
			}
			if (!flag)
			{
				__result = false;
				return false;
			}
			if (num + 6 < __instance.bufferLength)
			{
				int num3;
				int num4;
				int num5;
				int num6;
				int num7;
				if (__instance.buffer[num3 = num + 1] != 0)
				{
					index = num3 - 1 - 5;
				}
				else if (__instance.buffer[num4 = num3 + 1] != 0)
				{
					index = num4 - 1 - 5;
				}
				else if (__instance.buffer[num5 = num4 + 1] != 0)
				{
					index = num5 - 1 - 5;
				}
				else if (__instance.buffer[num6 = num5 + 1] != 0)
				{
					index = num6 - 1 - 5;
				}
				else if (__instance.buffer[num7 = num6 + 1] != 0)
				{
					index = num7 - 1 - 5;
				}
			}
			if (index < 4)
			{
				__result = false;
				return false;
			}
			int num8 = index + 5;
			int num9 = index - 4;
			int num10 = 0;
			if (__instance.closed)
			{
				for (int i = 1; i <= __instance.bufferLength && i <= 10; i++)
				{
					if (__instance.buffer[__instance.bufferLength - i] != 0)
					{
						num10++;
					}
				}
				if (num8 > __instance.bufferLength - 11)
				{
					num10 += num8 - __instance.bufferLength + 11;
				}
			}
			if (num9 - num10 < 0)
			{
				__result = false;
				return false;
			}
			if (__instance.buffer[num9] == 0 && __instance.buffer[num9 - num10] == 0)
			{
				__instance.InsertItemDirect(index, itemId, stack, inc);
				__result = true;
				return false;
			}
			int num11 = num8 - 2880;
			if (num11 < 0)
			{
				num11 = 0;
			}
			int num12 = 0;
			int num13 = 0;
			int num14 = 0;
			bool flag2 = false;
			bool flag3 = false;
			for (int num15 = num8; num15 >= num11; num15--)
			{
				if (__instance.buffer[num15] == 0)
				{
					num14++;
					if (!flag2)
					{
						num12++;
					}
					if (num14 == 10)
					{
						num13 = num12;
					}
					if (num14 == 10 + num10)
					{
						if (num13 == 10)
						{
							__instance.InsertItemDirect(index, itemId, stack, inc);
							__result = true;
							return false;
						}
						num14 = 10;
						num12 = num13;
						flag3 = true;
						break;
					}
					if (__instance.closed && num15 == 0 && num8 > 9 && num8 < __instance.bufferLength - 11)
					{
						num15 = __instance.bufferLength - 10;
						while (__instance.bufferLength - num15 >= 2890 - num8 && num15 > num8)
						{
							if (__instance.buffer[num15] == 0)
							{
								num14++;
							}
							if (num14 == 10)
							{
								num13 = num12;
							}
							if (num14 == 10 + num10)
							{
								num12 = num13;
								num14 = 10;
								if (num12 >= 10)
								{
									__instance.InsertItemDirect(index, itemId, stack, inc);
									__result = true;
									return false;
								}
								flag3 = true;
								break;
							}
							num15--;
						}
						break;
					}
				}
				else
				{
					flag2 = true;
					if (num12 < 1)
					{
						__result = false;
						return false;
					}
					if (__instance.buffer[num15] == byte.MaxValue)
					{
						num15 -= 9;
					}
				}
			}
			if (flag3)
			{
				int num16 = num14 - num12;
				int num17 = num8 - num12 + 1;
				for (int num18 = num9; num18 >= num11; num18--)
				{
					if (__instance.buffer[num18] == 246)
					{
						int num19 = 0;
						int num20 = num18 - 1;
						while (num20 >= num11 && num19 < num16 && __instance.buffer[num20] == 0)
						{
							num19++;
							num20--;
						}
						if (num19 > 0)
						{
							Array.Copy(__instance.buffer, num18, __instance.buffer, num18 - num19, num17 - num18);
							num16 -= num19;
							num17 -= num19;
							num18 -= num19;
						}
					}
				}
				if (num16 == 0)
				{
					__instance.InsertItemDirect(index, itemId, stack, inc);
					__result = true;
					return false;
				}
				Assert.CannotBeReached("断言失败:插入货物逻辑有误");
			}
		}
		__result = false;
		return false;
	}
}
public static class PluginInfo
{
	public const string PLUGIN_GUID = "MoreReasonableCargoTraffic";

	public const string PLUGIN_NAME = "";

	public const string PLUGIN_VERSION = "1.0.0.0";
}