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";
}