using System;
using System.Collections.Concurrent;
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 System.Security;
using System.Security.Permissions;
using BepInEx;
using CommonAPI;
using CommonAPI.Systems.ModLocalization;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using crecheng.DSPModSave;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MixCargoController")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("微软中国")]
[assembly: AssemblyProduct("MixCargoController")]
[assembly: AssemblyCopyright("Copyright © 微软中国 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("000df25a-ab66-4007-b419-9b9af0acaea3")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace MixCargoController;
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.GniMaerd.MixCargoControllerPlugin", "MixCargoControllerPlugin", "1.0.1")]
[CommonAPISubmoduleDependency(new string[] { "LocalizationModule" })]
public class MixCargoControllerPlugin : BaseUnityPlugin, IModCanSave
{
public const string NAME = "MixCargoControllerPlugin";
public const string GUID = "com.GniMaerd.MixCargoControllerPlugin";
public const string VERSION = "1.0.1";
public const int VERSIONINT = 100;
public static int versionWhenLoading = 100;
public void Awake()
{
Harmony.CreateAndPatchAll(typeof(UIBeltWindowPatcher), (string)null);
Harmony.CreateAndPatchAll(typeof(BeltCargoCountLogic), (string)null);
Harmony.CreateAndPatchAll(typeof(PathChangePatcher), (string)null);
Harmony.CreateAndPatchAll(typeof(ParametersPatcher), (string)null);
Localizations.AddLocalizations();
}
public void Export(BinaryWriter w)
{
RuntimeData.Export(w);
}
public void Import(BinaryReader r)
{
UIBeltWindowPatcher.Init();
RuntimeData.Import(r);
}
public void IntoOtherSave()
{
UIBeltWindowPatcher.Init();
RuntimeData.IntoOtherSave();
}
}
public class BeltCargoInfo
{
public bool enabled;
public Dictionary<int, int> cargoLimit;
public Dictionary<int, int> cargoCount;
public BeltCargoInfo()
{
enabled = false;
cargoLimit = new Dictionary<int, int>();
cargoCount = new Dictionary<int, int>();
}
public void AddOrUpdateLimit(int itemId, int limit)
{
lock (cargoLimit)
{
cargoLimit[itemId] = limit;
}
lock (cargoCount)
{
cargoCount[itemId] = 0;
}
RefreshItemLimit();
}
public void RemoveLimit(int itemId)
{
lock (cargoLimit)
{
if (cargoLimit.ContainsKey(itemId))
{
cargoLimit.Remove(itemId);
}
}
lock (cargoCount)
{
if (cargoCount.ContainsKey(itemId))
{
cargoCount.Remove(itemId);
}
}
RefreshItemLimit();
}
public void RefreshItemLimit()
{
enabled = false;
foreach (KeyValuePair<int, int> item in cargoLimit)
{
if (item.Value > 0)
{
enabled = true;
break;
}
}
}
public bool CanInsert(int itemId)
{
if (!enabled)
{
return true;
}
return cargoLimit.ContainsKey(itemId) && cargoCount.ContainsKey(itemId) && cargoCount[itemId] < cargoLimit[itemId];
}
public void Export(BinaryWriter w)
{
w.Write(cargoLimit.Count);
foreach (KeyValuePair<int, int> item in cargoLimit)
{
w.Write(item.Key);
w.Write(item.Value);
}
w.Write(cargoCount.Count);
foreach (KeyValuePair<int, int> item2 in cargoCount)
{
w.Write(item2.Key);
w.Write(item2.Value);
}
}
public void Import(BinaryReader r)
{
int num = r.ReadInt32();
for (int i = 0; i < num; i++)
{
cargoLimit[r.ReadInt32()] = r.ReadInt32();
}
int num2 = r.ReadInt32();
for (int j = 0; j < num2; j++)
{
cargoCount[r.ReadInt32()] = r.ReadInt32();
}
RefreshItemLimit();
}
}
public static class BeltCargoCountLogic
{
[HarmonyPostfix]
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
public static void PickFromPostfix(ref CargoTraffic __instance, int beltId, int __result)
{
if (__result <= 0 || !RuntimeData.infos.ContainsKey(__instance.factory.planetId))
{
return;
}
int segPathId = __instance.beltPool[beltId].segPathId;
if (RuntimeData.infos[__instance.factory.planetId].ContainsKey(segPathId) && RuntimeData.infos[__instance.factory.planetId][segPathId].enabled && RuntimeData.infos[__instance.factory.planetId][segPathId].cargoCount.ContainsKey(__result))
{
BeltCargoInfo beltCargoInfo = RuntimeData.infos[__instance.factory.planetId][segPathId];
lock (beltCargoInfo)
{
RuntimeData.infos[__instance.factory.planetId][segPathId].cargoCount[__result]--;
}
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CargoTraffic), "TryInsertItem")]
public static bool TryInsertSimplePrefix(ref CargoTraffic __instance, int beltId, int offset, int itemId, byte itemCount, byte itemInc, ref bool __result)
{
if (RuntimeData.infos.ContainsKey(__instance.factory.planetId))
{
int segPathId = __instance.beltPool[beltId].segPathId;
if (RuntimeData.infos[__instance.factory.planetId].ContainsKey(segPathId))
{
if (!RuntimeData.infos[__instance.factory.planetId][segPathId].enabled)
{
return true;
}
if (RuntimeData.infos[__instance.factory.planetId][segPathId].CanInsert(itemId))
{
__result = __instance.pathPool[__instance.beltPool[beltId].segPathId].TryInsertItem(((BeltComponent)(ref __instance.beltPool[beltId])).pivotOnPath + offset, itemId, itemCount, itemInc);
if (__result)
{
BeltCargoInfo beltCargoInfo = RuntimeData.infos[__instance.factory.planetId][segPathId];
lock (beltCargoInfo)
{
RuntimeData.infos[__instance.factory.planetId][segPathId].cargoCount[itemId]++;
}
}
return false;
}
__result = false;
return false;
}
}
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CargoTraffic), "TryInsertItemToBeltWithStackIncreasement")]
public static bool TryInsertCanStackPrefix(ref CargoTraffic __instance, int beltId, int offset, int itemId, int maxStack, ref int itemCount, ref int itemInc)
{
if (RuntimeData.infos.ContainsKey(__instance.factory.planetId))
{
int segPathId = __instance.beltPool[beltId].segPathId;
int planetId = __instance.factory.planetId;
if (RuntimeData.infos[planetId].ContainsKey(segPathId))
{
if (!RuntimeData.infos[planetId][segPathId].enabled)
{
return true;
}
bool canAddNewCargo = RuntimeData.infos[planetId][segPathId].CanInsert(itemId);
__instance.pathPool[__instance.beltPool[beltId].segPathId].CargoPathTryInsertStackPatch(((BeltComponent)(ref __instance.beltPool[beltId])).pivotOnPath + offset, itemId, maxStack, ref itemCount, ref itemInc, planetId, segPathId, canAddNewCargo);
return false;
}
}
return true;
}
public static void CargoPathTryInsertStackPatch(this CargoPath _this, int index, int itemId, int maxStack, ref int count, ref int inc, int planetId, int segPathId, bool canAddNewCargo)
{
byte[] buffer = _this.buffer;
lock (buffer)
{
int num = index + 5;
if (num >= 0 && num < _this.bufferLength)
{
int num2 = _this.buffer[num];
if (num2 > 0)
{
int num3 = num;
num3 = ((num2 < 246) ? (num3 + (246 - _this.buffer[num - 4])) : (num3 + (250 - num2)));
int num4 = _this.buffer[num3 + 1] - 1 + (_this.buffer[num3 + 2] - 1) * 100 + (_this.buffer[num3 + 3] - 1) * 10000 + (_this.buffer[num3 + 4] - 1) * 1000000;
_this.cargoContainer.AddItemStackToCargo(num4, itemId, maxStack, ref count, ref inc);
}
}
if (count == 0)
{
return;
}
int num5 = index - 4;
if (num5 >= 0 && num5 < _this.bufferLength)
{
int num6 = _this.buffer[num5];
if (num6 > 0)
{
int num7 = num5;
num7 = ((num6 < 246) ? (num7 + (246 - _this.buffer[num5 - 4])) : (num7 + (250 - num6)));
int num8 = _this.buffer[num7 + 1] - 1 + (_this.buffer[num7 + 2] - 1) * 100 + (_this.buffer[num7 + 3] - 1) * 10000 + (_this.buffer[num7 + 4] - 1) * 1000000;
_this.cargoContainer.AddItemStackToCargo(num8, itemId, maxStack, ref count, ref inc);
}
}
if (count == 0 || !canAddNewCargo)
{
return;
}
int num9 = index - 5;
if (index < 4 || num >= _this.bufferLength)
{
return;
}
bool flag = false;
while (index > num9)
{
if (_this.buffer[num] == 0)
{
flag = true;
break;
}
index--;
num--;
}
if (!flag)
{
return;
}
if (num + 6 < _this.bufferLength)
{
if (_this.buffer[++num] != 0)
{
index = num - 1 - 5;
}
else if (_this.buffer[++num] != 0)
{
index = num - 1 - 5;
}
else if (_this.buffer[++num] != 0)
{
index = num - 1 - 5;
}
else if (_this.buffer[++num] != 0)
{
index = num - 1 - 5;
}
else if (_this.buffer[++num] != 0)
{
index = num - 1 - 5;
}
}
if (index < 4)
{
return;
}
int num10 = index + 5;
int num11 = index - 4;
if (_this.buffer[num11] == 0 && (!_this.closed || num11 >= 10))
{
int num12 = count;
int num13 = inc;
if (count > maxStack)
{
num12 = maxStack;
num13 = inc / count;
int num14 = inc - num13 * count;
count -= num12;
num14 -= count;
num13 = ((num14 > 0) ? (num13 * num12 + num14) : (num13 * num12));
inc -= num13;
}
else
{
count = 0;
inc = 0;
}
_this.InsertItemDirect(index, itemId, (byte)num12, (byte)num13);
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][segPathId];
lock (beltCargoInfo)
{
RuntimeData.infos[planetId][segPathId].cargoCount[itemId]++;
return;
}
}
int num15 = num10 - 2880;
if (num15 < 0)
{
num15 = 0;
}
int num16 = 0;
int num17 = 0;
bool flag2 = false;
bool flag3 = false;
for (int num18 = num10; num18 >= num15; num18--)
{
if (_this.buffer[num18] == 0)
{
num17++;
if (!flag2)
{
num16++;
}
if (num16 == 10 && (!_this.closed || num18 >= 10))
{
int num19 = count;
int num20 = inc;
if (count > maxStack)
{
num19 = maxStack;
num20 = inc / count;
int num21 = inc - num20 * count;
count -= num19;
num21 -= count;
num20 = ((num21 > 0) ? (num20 * num19 + num21) : (num20 * num19));
inc -= num20;
}
else
{
count = 0;
inc = 0;
}
_this.InsertItemDirect(index, itemId, (byte)num19, (byte)num20);
BeltCargoInfo beltCargoInfo2 = RuntimeData.infos[planetId][segPathId];
lock (beltCargoInfo2)
{
RuntimeData.infos[planetId][segPathId].cargoCount[itemId]++;
return;
}
}
if (num17 == 10 && (!_this.closed || num18 >= 10))
{
flag3 = true;
break;
}
}
else
{
flag2 = true;
if (num16 < 1)
{
return;
}
if (_this.buffer[num18] == byte.MaxValue)
{
num18 -= 9;
}
}
}
if (_this.closed && !flag3 && num17 >= 10 && num17 < 20 && num10 < 2880)
{
num17 -= 10;
if (num16 > 10)
{
num16 = 10;
}
int num22 = _this.bufferLength - 1;
while (num22 > num10 && num22 > _this.bufferLength + num10 - 2880)
{
if (_this.buffer[num22] == 0)
{
num17++;
}
else if (_this.buffer[num22] == byte.MaxValue)
{
num22 -= 9;
}
if (num17 >= 10)
{
if (num16 == 10)
{
int num23 = count;
int num24 = inc;
if (count > maxStack)
{
num23 = maxStack;
num24 = inc / count;
int num25 = inc - num24 * count;
count -= num23;
num25 -= count;
num24 = ((num25 > 0) ? (num24 * num23 + num25) : (num24 * num23));
inc -= num24;
}
else
{
count = 0;
inc = 0;
}
_this.InsertItemDirect(index, itemId, (byte)num23, (byte)num24);
BeltCargoInfo beltCargoInfo3 = RuntimeData.infos[planetId][segPathId];
lock (beltCargoInfo3)
{
RuntimeData.infos[planetId][segPathId].cargoCount[itemId]++;
return;
}
}
flag3 = true;
break;
}
num22--;
}
}
if (!flag3)
{
return;
}
int num26 = 10 - num16;
int num27 = num10 - num16 + 1;
for (int num28 = num11; num28 >= num15; num28--)
{
if (_this.buffer[num28] == 246)
{
int num29 = 0;
int num30 = num28 - 1;
while (num30 >= num15 && num29 < num26 && _this.buffer[num30] == 0)
{
num29++;
num30--;
}
if (num29 > 0)
{
Array.Copy(_this.buffer, num28, _this.buffer, num28 - num29, num27 - num28);
num26 -= num29;
num27 -= num29;
num28 -= num29;
}
}
}
if (num26 == 0)
{
int num31 = count;
int num32 = inc;
if (count > maxStack)
{
num31 = maxStack;
num32 = inc / count;
int num33 = inc - num32 * count;
count -= num31;
num33 -= count;
num32 = ((num33 > 0) ? (num32 * num31 + num33) : (num32 * num31));
inc -= num32;
}
else
{
count = 0;
inc = 0;
}
_this.InsertItemDirect(index, itemId, (byte)num31, (byte)num32);
BeltCargoInfo beltCargoInfo4 = RuntimeData.infos[planetId][segPathId];
lock (beltCargoInfo4)
{
RuntimeData.infos[planetId][segPathId].cargoCount[itemId]++;
return;
}
}
Assert.CannotBeReached("断言失败:插入货物逻辑有误");
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CargoTraffic), "CargoPathsGameTickSync")]
public static bool CargoPathsGameTickSyncPrefix(ref CargoTraffic __instance)
{
PerformanceMonitor.BeginSample((ECpuWorkEntry)10);
for (int i = 1; i < __instance.pathCursor; i++)
{
if (__instance.pathPool[i] != null && __instance.pathPool[i].id == i)
{
if (__instance.pathPool[i].outputPath == null || __instance.pathPool[i].outputPath.id == i)
{
__instance.pathPool[i].Update();
}
else
{
__instance.pathPool[i].CargoPathUpdateMCC(__instance.planet.id);
}
}
}
PerformanceMonitor.EndSample((ECpuWorkEntry)10);
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CargoTraffic), "CargoPathsGameTickAsync")]
public static bool CargoPathsGameTickAsyncPrefix(ref CargoTraffic __instance, int _usedThreadCnt, int _curThreadIdx, int _minimumMissionCnt)
{
int num = default(int);
int num2 = default(int);
if (WorkerThreadExecutor.CalculateMissionIndex(1, __instance.pathCursor - 1, _usedThreadCnt, _curThreadIdx, _minimumMissionCnt, ref num, ref num2))
{
for (int i = num; i < num2; i++)
{
if (__instance.pathPool[i] != null && __instance.pathPool[i].id == i)
{
if (__instance.pathPool[i].outputPath == null || __instance.pathPool[i].outputPath.id == i)
{
__instance.pathPool[i].Update();
}
else
{
__instance.pathPool[i].CargoPathUpdateMCC(__instance.planet.id);
}
}
}
}
return false;
}
public static void CargoPathUpdateMCC(this CargoPath __instance, int planetId)
{
byte[] array2;
if (__instance.outputPath != null)
{
int id = __instance.outputPath.id;
int num;
if (__instance.outputPath.chunkCount == 1)
{
num = __instance.outputPath.chunks[2];
__instance.outputChunk = 0;
}
else
{
int num2 = __instance.outputPath.chunkCount - 1;
if (__instance.outputChunk > num2)
{
__instance.outputChunk = num2;
}
int num3 = 0;
while (true)
{
if (__instance.outputIndex < __instance.outputPath.chunks[__instance.outputChunk * 3])
{
num2 = __instance.outputChunk - 1;
__instance.outputChunk = (num3 + num2) / 2;
continue;
}
if (__instance.outputIndex < __instance.outputPath.chunks[__instance.outputChunk * 3] + __instance.outputPath.chunks[__instance.outputChunk * 3 + 1])
{
break;
}
num3 = __instance.outputChunk + 1;
__instance.outputChunk = (num3 + num2) / 2;
}
num = __instance.outputPath.chunks[__instance.outputChunk * 3 + 2];
}
byte[] array = ((__instance.id > __instance.outputPath.id) ? __instance.buffer : __instance.outputPath.buffer);
array2 = ((__instance.id < __instance.outputPath.id) ? __instance.buffer : __instance.outputPath.buffer);
lock (array2)
{
byte[] array3 = array;
lock (array3)
{
int num4 = __instance.bufferLength - 5 - 1;
if (__instance.buffer[num4] == 250)
{
int num5 = __instance.buffer[num4 + 1] - 1 + (__instance.buffer[num4 + 2] - 1) * 100 + (__instance.buffer[num4 + 3] - 1) * 10000 + (__instance.buffer[num4 + 4] - 1) * 1000000;
int item = __instance.cargoContainer.cargoPool[num5].item;
bool flag = RuntimeData.HasRules(planetId, id);
bool flag2 = RuntimeData.HasRules(planetId, __instance.id);
bool flag3 = !flag || RuntimeData.infos[planetId][id].CanInsert(item);
if (__instance.closed)
{
if (flag3 && __instance.outputPath.TryInsertCargoNoSqueeze(__instance.outputIndex, num5))
{
Array.Clear(__instance.buffer, num4 - 4, 10);
__instance.updateLen = __instance.bufferLength;
if (flag)
{
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][id];
lock (beltCargoInfo)
{
RuntimeData.infos[planetId][id].cargoCount[item]++;
}
}
if (flag2 && RuntimeData.infos[planetId][__instance.id].cargoLimit.ContainsKey(item))
{
BeltCargoInfo beltCargoInfo2 = RuntimeData.infos[planetId][__instance.id];
lock (beltCargoInfo2)
{
RuntimeData.infos[planetId][__instance.id].cargoCount[item]--;
}
}
}
}
else if (flag3 && __instance.outputPath.TryInsertCargo((__instance.lastUpdateFrameOdd == __instance.outputPath.lastUpdateFrameOdd) ? __instance.outputIndex : ((__instance.outputIndex + num > __instance.outputPath.bufferLength - 6) ? (__instance.outputPath.bufferLength - 6) : (__instance.outputIndex + num)), num5))
{
Array.Clear(__instance.buffer, num4 - 4, 10);
__instance.updateLen = __instance.bufferLength;
if (flag)
{
BeltCargoInfo beltCargoInfo3 = RuntimeData.infos[planetId][id];
lock (beltCargoInfo3)
{
RuntimeData.infos[planetId][id].cargoCount[item]++;
}
}
if (flag2 && RuntimeData.infos[planetId][__instance.id].cargoLimit.ContainsKey(item))
{
BeltCargoInfo beltCargoInfo4 = RuntimeData.infos[planetId][__instance.id];
lock (beltCargoInfo4)
{
RuntimeData.infos[planetId][__instance.id].cargoCount[item]--;
}
}
}
}
}
}
}
else if (__instance.bufferLength <= 10)
{
return;
}
array2 = __instance.buffer;
lock (array2)
{
__instance.lastUpdateFrameOdd = (GameMain.gameTick & 1) == 1;
int num6 = __instance.updateLen - 1;
while (num6 >= 0 && __instance.buffer[num6] != 0)
{
__instance.updateLen--;
num6--;
}
if (__instance.updateLen == 0)
{
return;
}
int num7 = __instance.updateLen;
for (int num8 = __instance.chunkCount - 1; num8 >= 0; num8--)
{
int num9 = __instance.chunks[num8 * 3];
int num10 = __instance.chunks[num8 * 3 + 2];
if (num9 < num7)
{
if (__instance.buffer[num9] != 0)
{
for (int i = num9 - 5; i < num9 + 4; i++)
{
if (i >= 0 && __instance.buffer[i] == 250)
{
num9 = ((i >= num9) ? (i - 4) : (i + 5 + 1));
break;
}
}
}
int num11 = 0;
while (num11 < num10)
{
int num12 = num7 - num9;
if (num12 < 10)
{
num11 = ((num10 < num12) ? num10 : num12);
break;
}
int num13 = 0;
for (int j = 0; j < num10 - num11; j++)
{
int num14 = num7 - 1 - j;
if (__instance.buffer[num14] != 0)
{
break;
}
num13++;
}
if (num13 > 0)
{
Array.Copy(__instance.buffer, num9, __instance.buffer, num9 + num13, num12 - num13);
Array.Clear(__instance.buffer, num9, num13);
num11 += num13;
}
int num15 = num7 - 1;
while (num15 >= 0 && __instance.buffer[num15] != 0)
{
num7--;
num15--;
}
}
int num16 = num9 + ((num11 == 0) ? 1 : num11);
if (num7 > num16)
{
num7 = num16;
}
}
}
}
}
}
public static class ParametersPatcher
{
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "CopyFromFactoryObject")]
public static void CopyFromFactoryObjectPostfix(ref BuildingParameters __instance, int objectId, PlanetFactory factory, bool copyInserters, bool copyAllSettings, ref bool __result)
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
if (objectId <= 0)
{
return;
}
EntityData[] entityPool = factory.entityPool;
int beltId = entityPool[objectId].beltId;
if (beltId <= 0)
{
return;
}
BeltComponent val = factory.cargoTraffic.beltPool[beltId];
if (val.id != beltId)
{
return;
}
int segPathId = val.segPathId;
if (!RuntimeData.HasRules(factory.planetId, segPathId))
{
return;
}
int[] parameters = __instance.parameters;
__instance.parameters = new int[2 + 2 * RuntimeData.infos[factory.planetId][segPathId].cargoLimit.Count];
if (parameters != null)
{
Array.Copy(parameters, __instance.parameters, parameters.Length);
}
else
{
__instance.parameters[0] = 0;
__instance.parameters[1] = 0;
}
int num = 1;
foreach (KeyValuePair<int, int> item in RuntimeData.infos[factory.planetId][segPathId].cargoLimit)
{
__instance.parameters[2 * num] = item.Key;
__instance.parameters[2 * num + 1] = item.Value;
num++;
}
__result = true;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "PasteToFactoryObject")]
public static void PasteToFactoryObjectPostfix(ref BuildingParameters __instance, int objectId, PlanetFactory factory, ref bool __result)
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
EntityData[] entityPool = factory.entityPool;
if (objectId <= 0 || entityPool[objectId].id != objectId)
{
return;
}
int beltId = entityPool[objectId].beltId;
if (beltId == 0 || (int)__instance.type != 14)
{
return;
}
int planetId = factory.planetId;
BeltComponent val = factory.cargoTraffic.beltPool[beltId];
if (val.id != beltId)
{
return;
}
int segPathId = factory.cargoTraffic.beltPool[beltId].segPathId;
if (__instance.parameters != null && __instance.parameters.Length > 2)
{
if (!RuntimeData.infos.ContainsKey(planetId))
{
RuntimeData.infos[planetId] = new ConcurrentDictionary<int, BeltCargoInfo>();
}
RuntimeData.infos[planetId][segPathId] = new BeltCargoInfo();
for (int i = 2; i + 1 < __instance.parameters.Length; i += 2)
{
RuntimeData.infos[planetId][segPathId].AddOrUpdateLimit(__instance.parameters[i], __instance.parameters[i + 1]);
}
RecalcCargoCurCount(factory, segPathId);
}
else if (RuntimeData.infos.ContainsKey(planetId))
{
RuntimeData.infos[planetId][segPathId] = new BeltCargoInfo();
}
__result = true;
UIBeltWindowPatcher.RefreshAll();
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "ApplyPrebuildParametersToEntity")]
public static void ApplyPrebuildParametersToEntity(int entityId, int[] parameters, PlanetFactory factory)
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
EntityData[] entityPool = factory.entityPool;
if (entityId <= 0 || entityPool[entityId].id != entityId)
{
return;
}
int beltId = entityPool[entityId].beltId;
if (beltId == 0 || parameters == null || parameters.Length <= 2)
{
return;
}
int planetId = factory.planetId;
BeltComponent val = factory.cargoTraffic.beltPool[beltId];
if (val.id == beltId)
{
int segPathId = factory.cargoTraffic.beltPool[beltId].segPathId;
if (!RuntimeData.infos.ContainsKey(planetId))
{
RuntimeData.infos[planetId] = new ConcurrentDictionary<int, BeltCargoInfo>();
}
RuntimeData.infos[planetId][segPathId] = new BeltCargoInfo();
for (int i = 2; i + 1 < parameters.Length; i += 2)
{
RuntimeData.infos[planetId][segPathId].AddOrUpdateLimit(parameters[i], parameters[i + 1]);
}
RecalcCargoCurCount(factory, segPathId);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "ToParamsArray")]
public static void ToParamsArrayPostfix(ref BuildingParameters __instance, ref int[] _parameters, ref int _paramCount)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)__instance.type == 14 && __instance.parameters != null && __instance.parameters.Length > 2)
{
_paramCount = __instance.parameters.Length;
_parameters = new int[_paramCount];
Array.Copy(__instance.parameters, _parameters, _paramCount);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "FromParamsArray")]
public static void FromParamsArrayPostfix(ref BuildingParameters __instance, ref int[] _parameters)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)__instance.type == 14 && _parameters != null && _parameters.Length > 2)
{
__instance.parameters = new int[_parameters.Length];
Array.Copy(_parameters, __instance.parameters, _parameters.Length);
}
}
public static void RecalcCargoCurCount(PlanetFactory factory, int pathId)
{
int planetId = factory.planetId;
if (!RuntimeData.HasRules(planetId, pathId))
{
return;
}
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][pathId];
lock (beltCargoInfo)
{
foreach (int key in RuntimeData.infos[planetId][pathId].cargoLimit.Keys)
{
RuntimeData.infos[planetId][pathId].cargoCount[key] = 0;
}
int bufferLength = factory.cargoTraffic.pathPool[pathId].bufferLength;
if (bufferLength <= 5)
{
return;
}
byte[] buffer = factory.cargoTraffic.pathPool[pathId].buffer;
lock (buffer)
{
for (int i = 0; i < bufferLength; i++)
{
int num = i + 5;
if (num < 0 || num >= bufferLength)
{
continue;
}
int num2 = buffer[num];
if (num2 <= 0)
{
continue;
}
int num3 = num;
if (num2 == 246)
{
num3 += 250 - num2;
int num4 = buffer[num3 + 1] - 1 + (buffer[num3 + 2] - 1) * 100 + (buffer[num3 + 3] - 1) * 10000 + (buffer[num3 + 4] - 1) * 1000000;
int item = factory.cargoTraffic.container.cargoPool[num4].item;
if (RuntimeData.infos[planetId][pathId].cargoCount.ContainsKey(item))
{
RuntimeData.infos[planetId][pathId].cargoCount[item]++;
}
i += 9;
}
}
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "CopiedTipText")]
public static void CopiedTipTextPostfix(ref BuildingParameters __instance, ref string __result)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)__instance.type == 14 && __instance.parameters != null && __instance.parameters.Length > 2)
{
__result = Localization.Translate("设置已复制");
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BuildingParameters), "PastedTipText")]
public static void PastedTipTextPostfix(ref BuildingParameters __instance, ref string __result)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
if ((int)__instance.type == 14 && __instance.parameters != null && __instance.parameters.Length > 2)
{
__result = Localization.Translate("设置已粘贴");
}
}
}
public class PathChangePatcher
{
[HarmonyPostfix]
[HarmonyPatch(typeof(CargoTraffic), "NewCargoPath")]
public static void OnNewCargoPathCreated(ref CargoTraffic __instance, ref CargoPath __result)
{
int id = __result.id;
int planetId = __instance.factory.planetId;
if (RuntimeData.infos.ContainsKey(planetId))
{
RuntimeData.infos[planetId].TryRemove(id, out var _);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(CargoTraffic), "RemoveCargoPath")]
public static void OnNewCargoPathCreated(ref CargoTraffic __instance, int id)
{
int planetId = __instance.factory.planetId;
if (RuntimeData.infos.ContainsKey(planetId))
{
RuntimeData.infos[planetId].TryRemove(id, out var _);
}
}
}
public class RuntimeData
{
public static ConcurrentDictionary<int, ConcurrentDictionary<int, BeltCargoInfo>> infos;
public static void Init()
{
infos = new ConcurrentDictionary<int, ConcurrentDictionary<int, BeltCargoInfo>>();
}
public static bool HasRules(int planetId, int segPathId)
{
if (!infos.ContainsKey(planetId))
{
return false;
}
if (!infos[planetId].ContainsKey(segPathId))
{
return false;
}
if (!infos[planetId][segPathId].enabled)
{
return false;
}
return true;
}
public static void Import(BinaryReader r)
{
Init();
int num = r.ReadInt32();
for (int i = 0; i < num; i++)
{
int key = r.ReadInt32();
int num2 = r.ReadInt32();
infos[key] = new ConcurrentDictionary<int, BeltCargoInfo>();
for (int j = 0; j < num2; j++)
{
int key2 = r.ReadInt32();
BeltCargoInfo beltCargoInfo = new BeltCargoInfo();
infos[key][key2] = beltCargoInfo;
beltCargoInfo.Import(r);
}
}
}
public static void Export(BinaryWriter w)
{
w.Write(infos.Count);
foreach (KeyValuePair<int, ConcurrentDictionary<int, BeltCargoInfo>> info in infos)
{
w.Write(info.Key);
w.Write(info.Value.Count);
foreach (KeyValuePair<int, BeltCargoInfo> item in info.Value)
{
w.Write(item.Key);
item.Value.Export(w);
}
}
}
public static void IntoOtherSave()
{
Init();
}
}
public static class UIBeltWindowPatcher
{
public static List<UICargoSetting> settings;
public static GameObject settingContentsObj;
public static void Init()
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: 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_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
//IL_0235: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
//IL_0287: Unknown result type (might be due to invalid IL or missing references)
//IL_028e: Unknown result type (might be due to invalid IL or missing references)
//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
//IL_030a: Unknown result type (might be due to invalid IL or missing references)
//IL_0326: Unknown result type (might be due to invalid IL or missing references)
//IL_0342: Unknown result type (might be due to invalid IL or missing references)
//IL_0347: Unknown result type (might be due to invalid IL or missing references)
//IL_03f5: Unknown result type (might be due to invalid IL or missing references)
//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
//IL_041e: Unknown result type (might be due to invalid IL or missing references)
//IL_0424: Expected O, but got Unknown
//IL_04f0: Unknown result type (might be due to invalid IL or missing references)
//IL_04f5: Unknown result type (might be due to invalid IL or missing references)
//IL_051c: Unknown result type (might be due to invalid IL or missing references)
//IL_0521: Unknown result type (might be due to invalid IL or missing references)
//IL_0548: Unknown result type (might be due to invalid IL or missing references)
//IL_054d: Unknown result type (might be due to invalid IL or missing references)
//IL_0574: Unknown result type (might be due to invalid IL or missing references)
//IL_0579: Unknown result type (might be due to invalid IL or missing references)
//IL_05a0: Unknown result type (might be due to invalid IL or missing references)
//IL_05a5: Unknown result type (might be due to invalid IL or missing references)
//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
//IL_05bd: Expected O, but got Unknown
//IL_0684: Unknown result type (might be due to invalid IL or missing references)
//IL_0689: Unknown result type (might be due to invalid IL or missing references)
//IL_069c: Unknown result type (might be due to invalid IL or missing references)
//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
//IL_06b4: Unknown result type (might be due to invalid IL or missing references)
//IL_06b9: Unknown result type (might be due to invalid IL or missing references)
//IL_06e0: Unknown result type (might be due to invalid IL or missing references)
//IL_06e5: Unknown result type (might be due to invalid IL or missing references)
//IL_070c: Unknown result type (might be due to invalid IL or missing references)
//IL_0711: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)settingContentsObj == (Object)null)
{
GameObject val = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Belt Window");
val.GetComponent<RectTransform>().sizeDelta = new Vector2(470f, 284f);
GameObject val2 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Belt Window/item-sign/icon-tag-label");
GameObject val3 = Object.Instantiate<GameObject>(val2, val.transform);
((Object)val3).name = "setting-title";
val3.GetComponent<RectTransform>().anchorMax = new Vector2(0f, 1f);
val3.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 1f);
val3.GetComponent<RectTransform>().pivot = new Vector2(0f, 0.5f);
val3.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(186f, -71f, 0f);
val3.GetComponent<Localizer>().stringKey = "MCC混带设置";
val3.GetComponent<Text>().alignment = (TextAnchor)3;
GameObject val4 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Blueprint Browser/view-group");
GameObject val5 = Object.Instantiate<GameObject>(val4, val.transform);
((Object)val5).name = "settings-view-group";
((Graphic)val5.GetComponent<Image>()).color = new Color(0.038f, 0.049f, 0.066f, 0.285f);
val5.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(185f, -83f);
val5.GetComponent<RectTransform>().sizeDelta = new Vector2(150f, 170f);
settingContentsObj = ((Component)val5.transform.Find("Scroll View/Viewport/Content")).gameObject;
while (settingContentsObj.transform.childCount > 0)
{
Object.DestroyImmediate((Object)(object)((Component)settingContentsObj.transform.GetChild(settingContentsObj.transform.childCount - 1)).gameObject);
}
GridLayoutGroup val6 = settingContentsObj.AddComponent<GridLayoutGroup>();
ContentSizeFitter val7 = settingContentsObj.AddComponent<ContentSizeFitter>();
val6.cellSize = new Vector2(UICargoSetting.width, UICargoSetting.height);
val7.horizontalFit = (FitMode)0;
val7.verticalFit = (FitMode)2;
((Component)val5.transform.Find("Scroll View/Viewport")).GetComponent<RectTransform>().sizeDelta = new Vector2(0f, -2f);
Vector3 localPosition = ((Component)val5.transform.Find("Scroll View/Viewport")).transform.localPosition;
((Component)val5.transform.Find("Scroll View/Viewport")).transform.localPosition = new Vector3(localPosition.x, localPosition.y - 2f, localPosition.z);
settings = new List<UICargoSetting>();
GameObject val8 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Belt Window/state/reverse-button");
GameObject val9 = Object.Instantiate<GameObject>(val8, val.transform);
((Object)val9).name = "fill-button";
val9.transform.localScale = Vector3.one;
val9.GetComponent<RectTransform>().anchorMax = new Vector2(0f, 1f);
val9.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 1f);
val9.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(274f, -71f);
val9.GetComponent<RectTransform>().sizeDelta = Vector2.op_Implicit(new Vector3(60f, 20f));
Object.DestroyImmediate((Object)(object)val9.GetComponent<UIButton>());
val9.AddComponent<UIButton>();
val9.GetComponent<UIButton>().onClick += delegate
{
FillTheBeltPath();
};
val9.GetComponent<UIButton>().tips.corner = 3;
val9.GetComponent<UIButton>().tips.width = 225;
val9.GetComponent<UIButton>().tips.tipTitle = "MCC填满传送带线路";
val9.GetComponent<UIButton>().tips.tipText = "MCC填满传送带线路说明";
val9.GetComponent<UIButton>().audios = val8.GetComponent<UIButton>().audios;
val9.GetComponent<UIButton>().transitions = (Transition[])(object)new Transition[2];
val9.GetComponent<UIButton>().transitions[0] = new Transition();
val9.GetComponent<UIButton>().transitions[0].target = (Graphic)(object)val9.GetComponent<Image>();
val9.GetComponent<UIButton>().transitions[0].damp = 1f;
val9.GetComponent<UIButton>().transitions[0].mouseoverSize = 1f;
val9.GetComponent<UIButton>().transitions[0].pressedSize = 1f;
val9.GetComponent<UIButton>().transitions[0].highlightSizeMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[0].highlightColorMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[0].highlightAlphaMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[0].mouseoverColor = new Color(0.2093f, 0.7724f, 0.9057f, 1f);
val9.GetComponent<UIButton>().transitions[0].normalColor = new Color(0.2199f, 0.6281f, 0.7642f, 0.7451f);
val9.GetComponent<UIButton>().transitions[0].pressedColor = new Color(0.1149f, 0.6604f, 0.8396f, 1f);
val9.GetComponent<UIButton>().transitions[0].highlightColorOverride = new Color(0f, 0f, 0f, 0f);
val9.GetComponent<UIButton>().transitions[0].disabledColor = new Color(1f, 1f, 1f, 0.0431f);
val9.GetComponent<UIButton>().transitions[1] = new Transition();
val9.GetComponent<UIButton>().transitions[1].target = (Graphic)(object)((Component)val9.transform.Find("text")).GetComponent<Text>();
val9.GetComponent<UIButton>().transitions[1].damp = 1f;
val9.GetComponent<UIButton>().transitions[1].mouseoverSize = 1f;
val9.GetComponent<UIButton>().transitions[1].pressedSize = 1f;
val9.GetComponent<UIButton>().transitions[1].highlightSizeMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[1].highlightColorMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[1].highlightAlphaMultiplier = 1f;
val9.GetComponent<UIButton>().transitions[1].mouseoverColor = Color.white;
val9.GetComponent<UIButton>().transitions[1].normalColor = Color.white;
val9.GetComponent<UIButton>().transitions[1].pressedColor = Color.white;
val9.GetComponent<UIButton>().transitions[1].highlightColorOverride = new Color(0f, 0f, 0f, 0f);
val9.GetComponent<UIButton>().transitions[1].disabledColor = new Color(1f, 1f, 1f, 0.1353f);
((Component)val9.transform.Find("text")).GetComponent<Localizer>().stringKey = "MCC填满传送带线路";
((Component)val9.transform.Find("text")).GetComponent<Text>().text = Localization.Translate("MCC填满传送带线路");
}
}
public static void RefreshAll(UIBeltWindow window = null)
{
if ((Object)(object)window == (Object)null)
{
window = UIRoot.instance?.uiGame?.beltWindow;
}
if (window?.traffic?.planet == null)
{
return;
}
int planetId = window.traffic.factory.planetId;
int curCargoPathId = GetCurCargoPathId(window);
if (curCargoPathId != -1 && planetId > 0)
{
if (RuntimeData.infos.ContainsKey(planetId) && RuntimeData.infos[planetId].ContainsKey(curCargoPathId))
{
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][curCargoPathId];
int num = 0;
foreach (KeyValuePair<int, int> item in beltCargoInfo.cargoLimit)
{
if (num >= settings.Count)
{
settings.Add(new UICargoSetting(num, settingContentsObj));
}
int key = item.Key;
int value = item.Value;
settings[num].obj.SetActive(true);
settings[num].SetItem(key, value);
num++;
}
if (num >= settings.Count)
{
settings.Add(new UICargoSetting(num, settingContentsObj));
}
settings[num].SetItem(0, 0);
settings[num].obj.SetActive(true);
for (int i = num + 1; i < settings.Count; i++)
{
settings[i].SetItem(0, 0);
settings[i].obj.SetActive(false);
}
}
else
{
if (settings.Count == 0)
{
settings.Add(new UICargoSetting(0, settingContentsObj));
}
settings[0].SetItem(0, 0);
settings[0].obj.SetActive(true);
for (int j = 1; j < settings.Count; j++)
{
settings[j].SetItem(0, 0);
settings[j].obj.SetActive(true);
settings[j].obj.SetActive(false);
}
}
}
RecalcCargoCurCount(window);
}
[HarmonyPostfix]
[HarmonyPatch(typeof(UIBeltWindow), "_OnUpdate")]
public static void UpdatePostfix(ref UIBeltWindow __instance)
{
int planetId = __instance.traffic.factory.planetId;
int curCargoPathId = GetCurCargoPathId(__instance);
if (curCargoPathId == -1 || planetId <= 0 || !RuntimeData.infos.ContainsKey(planetId) || !RuntimeData.infos[planetId].ContainsKey(curCargoPathId))
{
return;
}
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][curCargoPathId];
foreach (KeyValuePair<int, int> item in beltCargoInfo.cargoCount)
{
int key = item.Key;
int value = item.Value;
for (int i = 0; i < settings.Count; i++)
{
if (settings[i].itemId == key)
{
settings[i].SetCurCount(value);
break;
}
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(UIBeltWindow), "_OnOpen")]
public static void OnOpenPostfix(ref UIBeltWindow __instance)
{
RefreshAll(__instance);
}
[HarmonyPostfix]
[HarmonyPatch(typeof(UIBeltWindow), "OnTakeBackPointerUp")]
public static void RecalcCargoCountAfterPlayerTakePutBeltItems(ref UIBeltWindow __instance)
{
RecalcCargoCurCount(__instance);
}
[HarmonyPostfix]
[HarmonyPatch(typeof(UIBeltWindow), "OnBeltIdChange")]
[HarmonyPatch(typeof(UIBeltWindow), "OnReverseButtonClick")]
public static void OnBeltIdChangePostfix(ref UIBeltWindow __instance)
{
RefreshAll(__instance);
}
public static int GetCurCargoPathId(UIBeltWindow window = null)
{
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)window == (Object)null)
{
window = UIRoot.instance?.uiGame?.beltWindow;
}
if ((Object)(object)window != (Object)null && window.beltId != 0 && window.factory != null)
{
BeltComponent val = window.traffic.beltPool[window.beltId];
if (val.id == window.beltId)
{
return val.segPathId;
}
}
return -1;
}
public static UIBeltWindow GetCurWindow()
{
return UIRoot.instance?.uiGame?.beltWindow;
}
public static void RecalcCargoCurCount(UIBeltWindow window = null)
{
if ((Object)(object)window == (Object)null)
{
window = UIRoot.instance?.uiGame?.beltWindow;
}
if (window?.traffic?.factory == null)
{
return;
}
int planetId = window.traffic.factory.planetId;
int curCargoPathId = GetCurCargoPathId(window);
if (!RuntimeData.infos.ContainsKey(planetId) || !RuntimeData.infos[planetId].ContainsKey(curCargoPathId))
{
return;
}
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][curCargoPathId];
lock (beltCargoInfo)
{
foreach (int key in RuntimeData.infos[planetId][curCargoPathId].cargoLimit.Keys)
{
RuntimeData.infos[planetId][curCargoPathId].cargoCount[key] = 0;
}
int bufferLength = window.traffic.pathPool[curCargoPathId].bufferLength;
if (bufferLength <= 5)
{
return;
}
byte[] buffer = window.traffic.pathPool[curCargoPathId].buffer;
lock (buffer)
{
for (int i = 0; i < bufferLength; i++)
{
int num = i + 5;
if (num < 0 || num >= bufferLength)
{
continue;
}
int num2 = buffer[num];
if (num2 <= 0)
{
continue;
}
int num3 = num;
if (num2 == 246)
{
num3 += 250 - num2;
int num4 = buffer[num3 + 1] - 1 + (buffer[num3 + 2] - 1) * 100 + (buffer[num3 + 3] - 1) * 10000 + (buffer[num3 + 4] - 1) * 1000000;
int item = window.traffic.container.cargoPool[num4].item;
if (RuntimeData.infos[planetId][curCargoPathId].cargoCount.ContainsKey(item))
{
RuntimeData.infos[planetId][curCargoPathId].cargoCount[item]++;
}
i += 9;
}
}
}
}
}
public static void FillTheBeltPath()
{
UIBeltWindow curWindow = GetCurWindow();
if (curWindow?.traffic?.factory == null)
{
return;
}
int planetId = curWindow.traffic.factory.planetId;
int curCargoPathId = GetCurCargoPathId(curWindow);
int cargoCapacity = curWindow.traffic.pathPool[curCargoPathId].cargoCapacity;
int num = cargoCapacity / 10;
if (!RuntimeData.HasRules(planetId, curCargoPathId))
{
return;
}
int num2 = 0;
BeltCargoInfo beltCargoInfo = RuntimeData.infos[planetId][curCargoPathId];
List<int> list = new List<int>();
foreach (KeyValuePair<int, int> item in beltCargoInfo.cargoLimit)
{
list.Add(item.Key);
num2 += item.Value;
}
if (num2 == 0)
{
return;
}
foreach (int item2 in list)
{
beltCargoInfo.cargoLimit[item2] = (int)((double)beltCargoInfo.cargoLimit[item2] * 1.0 / (double)num2 * (double)num);
}
RefreshAll(curWindow);
}
}
public class UICargoSetting
{
public int index;
public int itemId;
public GameObject obj;
public InputField valueInput;
public Text infoText;
public Image icon;
public static Sprite oriEmptySprite = null;
public static float width = 150f;
public static float height = 36f;
public UICargoSetting(int index, GameObject parentObj)
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Expected O, but got Unknown
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_028c: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
//IL_031f: Unknown result type (might be due to invalid IL or missing references)
//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
//IL_03e6: Unknown result type (might be due to invalid IL or missing references)
//IL_0402: Unknown result type (might be due to invalid IL or missing references)
//IL_0423: Unknown result type (might be due to invalid IL or missing references)
//IL_0465: Unknown result type (might be due to invalid IL or missing references)
//IL_0486: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)oriEmptySprite == (Object)null)
{
oriEmptySprite = Resources.Load<Sprite>("ui/textures/sprites/icons/icon-unselected");
}
obj = new GameObject("setting");
obj.transform.localScale = Vector3.one;
RectTransform val = obj.AddComponent<RectTransform>();
val.sizeDelta = new Vector2(width, height);
obj.transform.SetParent(parentObj.transform, false);
obj.SetActive(false);
obj.SetActive(true);
this.index = index;
GameObject val2 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Belt Window/item-sign");
GameObject val3 = Object.Instantiate<GameObject>(val2);
((Object)val3).name = "icon";
val3.transform.SetParent(obj.transform);
val3.transform.localScale = Vector3.one;
val3.GetComponent<RectTransform>().sizeDelta = new Vector2(36f, 36f);
val3.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(30f, 0f, 0f);
val3.GetComponent<RectTransform>().anchorMax = new Vector2(0f, 0.5f);
val3.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0.5f);
if ((Object)(object)UIRoot.instance?.uiGame?.beltWindow != (Object)null)
{
val3.GetComponent<UIButton>().onClick -= UIRoot.instance.uiGame.beltWindow.OnTagSelectButtonClick;
val3.GetComponent<UIButton>().onRightClick -= UIRoot.instance.uiGame.beltWindow.OnTagSelectButtonRightClick;
val3.GetComponent<UIButton>().onClick += OnIconClick;
val3.GetComponent<UIButton>().onRightClick += OnIconRightClick;
}
else
{
Debug.LogError((object)"null");
}
val3.GetComponent<UIButton>().tips.tipTitle = "MCC设置物品标题";
val3.GetComponent<UIButton>().tips.tipText = "MCC设置物品说明";
val3.GetComponent<UIButton>().tips.width = 226;
icon = val3.GetComponent<Image>();
GameObject gameObject = ((Component)val3.transform.Find("icon-tag-label")).gameObject;
gameObject.GetComponent<RectTransform>().anchorMax = new Vector2(0f, 0.5f);
gameObject.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0.5f);
gameObject.GetComponent<RectTransform>().pivot = new Vector2(0f, 0.5f);
gameObject.transform.SetParent(obj.transform, true);
Object.Destroy((Object)(object)gameObject.GetComponent<Localizer>());
infoText = gameObject.GetComponent<Text>();
infoText.alignment = (TextAnchor)3;
gameObject.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(115f, 0f, 0f);
infoText.text = "";
GameObject val4 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Blueprint Browser/inspector-group/Scroll View/Viewport/Content/group-1/input-short-text");
if ((Object)(object)val4 == (Object)null)
{
val4 = GameObject.Find("UI Root/Overlay Canvas/In Game/Windows/Blueprint Browser/inspector-group/BP-panel-scroll(Clone)/Viewport/pane/group-1/input-short-text");
}
if ((Object)(object)val4 == (Object)null)
{
Debug.LogError((object)"Error when init oriInputField because some other mods has changed the Blueprint Browser UI. Please contant jinxOAO.");
}
GameObject val5 = Object.Instantiate<GameObject>(val4, obj.transform);
((Object)val5).name = "input";
val5.GetComponent<RectTransform>().sizeDelta = new Vector2(45f, 30f);
val5.GetComponent<RectTransform>().anchorMin = new Vector2(0f, 0.5f);
val5.GetComponent<RectTransform>().anchorMax = new Vector2(0f, 0.5f);
val5.GetComponent<RectTransform>().pivot = new Vector2(0f, 0.5f);
val5.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(60f, 0f, 0f);
val5.GetComponent<InputField>().characterLimit = 5;
((Selectable)val5.GetComponent<InputField>()).transition = (Transition)0;
((Graphic)val5.GetComponent<Image>()).color = new Color(0f, 0f, 0f, 0.5f);
((Graphic)((Component)val5.transform.Find("value-text")).GetComponent<Text>()).color = Color.white;
((Component)val5.transform.Find("value-text")).GetComponent<Text>().fontSize = 14;
((UnityEventBase)val5.GetComponent<InputField>().onEndEdit).RemoveAllListeners();
((UnityEvent<string>)(object)val5.GetComponent<InputField>().onEndEdit).AddListener((UnityAction<string>)delegate
{
SaveThisSetting();
});
val5.SetActive(false);
val5.SetActive(true);
valueInput = val5.GetComponent<InputField>();
SetItem(0, 0);
}
public void OnIconClick(int i)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: 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)
UIBeltWindow curWindow = UIBeltWindowPatcher.GetCurWindow();
if ((Object)(object)curWindow != (Object)null)
{
UIItemPicker.Popup(curWindow.windowTrans.anchoredPosition + new Vector2(-300f, 235f), (Action<ItemProto>)OnItemSelectedReturn);
}
}
public void OnIconRightClick(int i)
{
RemoveThisSetting();
}
public void OnItemSelectedReturn(ItemProto itemProto)
{
if (itemProto != null)
{
int iD = ((Proto)itemProto).ID;
if (iD != itemId)
{
UIBeltWindow curWindow = UIBeltWindowPatcher.GetCurWindow();
if (curWindow?.traffic != null)
{
int planetId = curWindow.traffic.factory.planetId;
int curCargoPathId = UIBeltWindowPatcher.GetCurCargoPathId(curWindow);
if (RuntimeData.infos.ContainsKey(planetId) && RuntimeData.infos[planetId].ContainsKey(curCargoPathId) && RuntimeData.infos[planetId][curCargoPathId].cargoLimit.ContainsKey(iD))
{
UIRealtimeTip.Popup(Localization.Translate("MCC重复物品提示"), true, 0);
return;
}
}
}
if (itemId != 0 && itemId != iD)
{
RemoveThisSetting();
}
SetItem(((Proto)itemProto).ID, -1);
SaveThisSetting();
}
else
{
RemoveThisSetting();
}
}
public void SetItem(int itemId, int limitInput)
{
if (itemId != 0 && ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId) != null)
{
this.itemId = itemId;
icon.sprite = ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId).iconSprite;
if (limitInput >= 0)
{
valueInput.text = limitInput.ToString();
}
}
else
{
this.itemId = 0;
icon.sprite = oriEmptySprite;
valueInput.text = "0";
infoText.text = "";
}
}
public void RemoveThisSetting()
{
UIBeltWindow curWindow = UIBeltWindowPatcher.GetCurWindow();
if (curWindow?.traffic?.factory != null)
{
int planetId = curWindow.traffic.factory.planetId;
int curCargoPathId = UIBeltWindowPatcher.GetCurCargoPathId(curWindow);
if (RuntimeData.infos.ContainsKey(planetId) && RuntimeData.infos[planetId].ContainsKey(curCargoPathId))
{
RuntimeData.infos[planetId][curCargoPathId].RemoveLimit(itemId);
}
}
itemId = 0;
icon.sprite = oriEmptySprite;
valueInput.text = "0";
infoText.text = "";
UIBeltWindowPatcher.RefreshAll();
}
public void SaveThisSetting()
{
if (itemId == 0)
{
return;
}
int num = 0;
try
{
num = Convert.ToInt32(valueInput.text);
if (num < 0)
{
num = 0;
}
}
catch (Exception)
{
num = 0;
}
valueInput.text = num.ToString();
UIBeltWindow curWindow = UIBeltWindowPatcher.GetCurWindow();
if (curWindow?.traffic?.factory == null)
{
return;
}
int planetId = curWindow.traffic.factory.planetId;
int curCargoPathId = UIBeltWindowPatcher.GetCurCargoPathId(curWindow);
if (!RuntimeData.infos.ContainsKey(planetId))
{
ConcurrentDictionary<int, ConcurrentDictionary<int, BeltCargoInfo>> infos = RuntimeData.infos;
RuntimeData.infos.AddOrUpdate(planetId, new ConcurrentDictionary<int, BeltCargoInfo>(), (int x, ConcurrentDictionary<int, BeltCargoInfo> y) => new ConcurrentDictionary<int, BeltCargoInfo>());
}
if (!RuntimeData.infos[planetId].ContainsKey(curCargoPathId))
{
RuntimeData.infos[planetId].AddOrUpdate(curCargoPathId, new BeltCargoInfo(), (int x, BeltCargoInfo y) => new BeltCargoInfo());
}
RuntimeData.infos[planetId][curCargoPathId].AddOrUpdateLimit(itemId, num);
UIBeltWindowPatcher.RefreshAll();
}
public void SetCurCount(int curCount)
{
infoText.text = curCount.ToString();
}
}
public class Localizations
{
public static void AddLocalizations()
{
LocalizationModule.RegisterTranslation("MCC设置物品标题", "Select item", "选择物品", "Select item");
LocalizationModule.RegisterTranslation("MCC设置物品说明", "After selecting at least one item, only the selected items can be placed on this conveyor belt path, and their <color=#FD965EC0>maximum cargo quantity on this belt path will be limited</color> below the value you entered. When an item's cargo quantity reaches the upper limit, the sorter will no longer be able to place that kind of item on this conveyor belt.\n1-4 piled items will always be counted as one cargo.", "选则至少一个物品后,只有所选物品才可以被放置在这条传送带上,且它们在传送带上的<color=#FD965EC0>货物数量上限将被限制</color>在玩家输入的数值以下。当某种货物达到设定的上限时,分拣器将无法继续向这条传送带上放置该物品。\n堆叠起来的货物算1个。\n\n当前,只有分拣器放入和取出的货物、以及并带插入和流出的货物会被计算。若其他手段对传送带的货物产生了影响,可以通过点击传送带打开UI来手动纠正传送带上的货物数", "After selecting at least one item, only the selected items can be placed on this conveyor belt path, and their <color=#FD965EC0>maximum cargo quantity on this belt path will be limited</color> below the value you entered. When an item's cargo quantity reaches the upper limit, the sorter will no longer be able to place that kind of item on this conveyor belt.\n1-4 piled items will always be counted as one cargo.");
LocalizationModule.RegisterTranslation("MCC重复物品提示", "Cannot select duplicate items", "不能选择重复的物品", "Cannot select duplicate items");
LocalizationModule.RegisterTranslation("MCC混带设置", "Mix-Cargo Setting", "混带控制", "Mix-Cargo Setting");
LocalizationModule.RegisterTranslation("MCC填满传送带线路", "Fill path", "填满线路", "Fill path");
LocalizationModule.RegisterTranslation("MCC填满传送带线路说明", "Click this button, all cargos' limit will be scaled according to the current ratio, so that the total limit of all cargos will fill the capacity of the entire belt path as much as possible.\nIf you modified the path length or cargo settings, you may need to click the button again to reclaculate the settings.", "点击此按钮,所有货物数量限制将按照当前比例缩放,使得所有货物限制的总和尽可能填满整条线路的容量。\n若你修改了线路长度或货物设置,可能需要点击按钮来重新计算数值。", "Click this button, all cargos' limit will be scaled according to the current ratio, so that the total limit of all cargos will fill the capacity of the entire belt path as much as possible.\nIf you modified the path length or cargo settings, you may need to click the button again to reclaculate the settings.");
}
}
public static class Utils
{
}