Decompiled source of BattlefieldAnalysisBaseDeliver v4.0.2
BattlefieldAnalysisBaseDeliver.dll
Decompiled 3 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BattlefieldAnalysisBaseDeliver.Patches; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("YourName")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("允许配送无人机从战场分析基站直接取物品")] [assembly: AssemblyFileVersion("4.0.2.0")] [assembly: AssemblyInformationalVersion("4.0.2+6aafb5d134cccf8cfa5c5ad10eca6d3f16fd6aa7")] [assembly: AssemblyProduct("BattlefieldAnalysisBaseDeliver")] [assembly: AssemblyTitle("BattlefieldAnalysisBaseDeliver")] [assembly: AssemblyVersion("4.0.2.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BattlefieldAnalysisBaseDeliver { [BepInPlugin("un1eagle.battlefieldanalysisbasedeliver", "战场分析基站配送支持", "4.0.2")] public class Plugin : BaseUnityPlugin { public static ManualLogSource? Log; public static ConfigEntry<bool> EnableDebugLog; public static ConfigEntry<int> BattleBaseCourierCount; public static ConfigEntry<float> BattleBaseCourierSpeedMultiplier; public static ConfigEntry<int> BattleBaseCourierCarryCapacity; public static ConfigEntry<int> BattleBasePickupPartitionStackSize; public static bool DebugLog() { return EnableDebugLog?.Value ?? false; } public static int GetBattleBaseCourierCount() { int num = BattleBaseCourierCount?.Value ?? 20; if (num < 1) { return 1; } if (num > 200) { return 200; } return num; } public static float GetBattleBaseCourierSpeedMultiplier() { float num = BattleBaseCourierSpeedMultiplier?.Value ?? 2f; if (num < 0.1f) { return 0.1f; } if (num > 10f) { return 10f; } return num; } public static int GetBattleBaseCourierCarryCapacity() { int num = BattleBaseCourierCarryCapacity?.Value ?? 100; if (num < 1) { return 1; } if (num > 5000) { return 5000; } return num; } public static int GetBattleBasePickupPartitionStackSize() { int num = BattleBasePickupPartitionStackSize?.Value ?? 2000; if (num <= 0) { return 0; } if (num > 10000) { return 10000; } return num; } private void Awake() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Expected O, but got Unknown //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Expected O, but got Unknown //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Expected O, but got Unknown //IL_02db: Expected O, but got Unknown //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Expected O, but got Unknown //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03bb: Expected O, but got Unknown //IL_041e: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"[战场分析基站配送支持] 正在加载... (GUID: un1eagle.battlefieldanalysisbasedeliver)"); EnableDebugLog = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableDebugLog", false, "为 true 时在日志中输出详细的调试信息,用于排查问题。正常使用时建议设置为 false。"); BattleBaseCourierCount = ((BaseUnityPlugin)this).Config.Bind<int>("General", "BattleBaseCourierCount", 20, new ConfigDescription("每个战场基站的无人机总数(1~200,默认 20)。修改后需重新进入存档或重新加载星球后生效。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 200), Array.Empty<object>())); BattleBaseCourierSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("General", "BattleBaseCourierSpeedMultiplier", 2f, new ConfigDescription("基站无人机速度倍率(在游戏物流速度基础上的倍数,0.1~10,默认 2.0)。", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>())); BattleBaseCourierCarryCapacity = ((BaseUnityPlugin)this).Config.Bind<int>("General", "BattleBaseCourierCarryCapacity", 100, new ConfigDescription("基站无人机单次运载量(1~5000,默认 100)。", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 5000), Array.Empty<object>())); BattleBasePickupPartitionStackSize = ((BaseUnityPlugin)this).Config.Bind<int>("General", "BattleBasePickupPartitionStackSize", 2000, "基站拾取分区槽位堆叠上限(0=不修改,>0 时统一设置该值,默认 2000)。"); Harmony val = new Harmony("un1eagle.battlefieldanalysisbasedeliver"); MethodInfo methodInfo = AccessTools.Method(typeof(PlanetFactory), "Init", (Type[])null, (Type[])null); if (methodInfo != null) { val.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(typeof(PlanetFactory_Init_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log = Log; if (log != null) { log.LogInfo((object)"[战场分析基站配送支持] ✓ PlanetFactory.Init 补丁已应用"); } } MethodInfo methodInfo2 = AccessTools.Method(typeof(PlanetFactory), "Import", (Type[])null, (Type[])null); if (methodInfo2 != null) { val.Patch((MethodBase)methodInfo2, (HarmonyMethod)null, new HarmonyMethod(typeof(PlanetFactory_Import_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log2 = Log; if (log2 != null) { log2.LogInfo((object)"[战场分析基站配送支持] ✓ PlanetFactory.Import 补丁已应用(清理旧虚拟配送器)"); } } MethodInfo methodInfo3 = AccessTools.Method(typeof(PlanetFactory), "Free", (Type[])null, (Type[])null); if (methodInfo3 != null) { val.Patch((MethodBase)methodInfo3, new HarmonyMethod(typeof(PlanetFactory_Free_Patch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log3 = Log; if (log3 != null) { log3.LogInfo((object)"[战场分析基站配送支持] ✓ PlanetFactory.Free 补丁已应用"); } } MethodInfo methodInfo4 = AccessTools.Method(typeof(BattleBaseComponent), "InternalUpdate", (Type[])null, (Type[])null); if (methodInfo4 != null) { val.Patch((MethodBase)methodInfo4, (HarmonyMethod)null, new HarmonyMethod(typeof(BattleBaseComponent_InternalUpdate_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log4 = Log; if (log4 != null) { log4.LogInfo((object)"[战场分析基站配送支持] ✓ BattleBaseComponent.InternalUpdate 补丁已应用(核心逻辑)"); } } else { ManualLogSource? log5 = Log; if (log5 != null) { log5.LogWarning((object)"[战场分析基站配送支持] ⚠ 未找到 BattleBaseComponent.InternalUpdate 方法!"); } } MethodInfo methodInfo5 = AccessTools.Method(typeof(BattleBaseComponent), "AutoPickTrash", (Type[])null, (Type[])null); if (methodInfo5 != null) { val.Patch((MethodBase)methodInfo5, new HarmonyMethod(typeof(BattleBaseComponent_AutoPickTrashLifeExtend_Patch), "Prefix", (Type[])null), new HarmonyMethod(typeof(BattleBaseComponent_AutoPickTrashLifeExtend_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log6 = Log; if (log6 != null) { log6.LogInfo((object)"[战场分析基站配送支持] ✓ BattleBaseComponent.AutoPickTrash 补丁已应用(部分拾取+30秒寿命)"); } } else { ManualLogSource? log7 = Log; if (log7 != null) { log7.LogWarning((object)"[战场分析基站配送支持] ⚠ 未找到 BattleBaseComponent.AutoPickTrash 方法!"); } } MethodInfo methodInfo6 = AccessTools.Method(typeof(LogisticCourierRenderer), "Update", (Type[])null, (Type[])null); if (methodInfo6 != null) { val.Patch((MethodBase)methodInfo6, (HarmonyMethod)null, new HarmonyMethod(typeof(LogisticCourierRenderer_Update_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log8 = Log; if (log8 != null) { log8.LogInfo((object)"[战场分析基站配送支持] ✓ LogisticCourierRenderer.Update 补丁已应用(无人机可见)"); } } else { ManualLogSource? log9 = Log; if (log9 != null) { log9.LogWarning((object)"[战场分析基站配送支持] ⚠ 未找到 LogisticCourierRenderer.Update 方法!"); } } MethodInfo methodInfo7 = AccessTools.Method(typeof(GameData), "Export", (Type[])null, (Type[])null); if (methodInfo7 != null) { val.Patch((MethodBase)methodInfo7, new HarmonyMethod(typeof(GameData_Export_Patch), "Prefix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log10 = Log; if (log10 != null) { log10.LogInfo((object)"[战场分析基站配送支持] ✓ GameData.Export 补丁已应用(存档安全)"); } } else { ManualLogSource? log11 = Log; if (log11 != null) { log11.LogWarning((object)"[战场分析基站配送支持] ⚠ 未找到 GameData.Export 方法!"); } } MethodInfo methodInfo8 = AccessTools.Method(typeof(GameData), "Import", (Type[])null, (Type[])null); if (methodInfo8 != null) { val.Patch((MethodBase)methodInfo8, (HarmonyMethod)null, new HarmonyMethod(typeof(GameData_Import_Patch), "Postfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ManualLogSource? log12 = Log; if (log12 != null) { log12.LogInfo((object)"[战场分析基站配送支持] ✓ GameData.Import 补丁已应用(自动重新派遣)"); } } else { ManualLogSource? log13 = Log; if (log13 != null) { log13.LogWarning((object)"[战场分析基站配送支持] ⚠ 未找到 GameData.Import 方法!"); } } ManualLogSource? log14 = Log; if (log14 != null) { log14.LogInfo((object)"[战场分析基站配送支持] ========================================"); } ManualLogSource? log15 = Log; if (log15 != null) { log15.LogInfo((object)"[战场分析基站配送支持] ✅ 加载完成!基站直接派遣方案"); } ManualLogSource? log16 = Log; if (log16 != null) { log16.LogInfo((object)string.Format("[{0}] \ud83d\udce6 战场基站无人机数量: {1},速度倍率: {2},单次运载量: {3}(可在配置中修改)", "战场分析基站配送支持", GetBattleBaseCourierCount(), GetBattleBaseCourierSpeedMultiplier(), GetBattleBaseCourierCarryCapacity())); } ManualLogSource? log17 = Log; if (log17 != null) { log17.LogInfo((object)string.Format("[{0}] \ud83d\udce5 拾取分区 stackSize 配置: {1}(0 表示不修改)", "战场分析基站配送支持", GetBattleBasePickupPartitionStackSize())); } ManualLogSource? log18 = Log; if (log18 != null) { log18.LogInfo((object)"[战场分析基站配送支持] \ud83d\ude80 无需虚拟配送器,性能优化"); } ManualLogSource? log19 = Log; if (log19 != null) { log19.LogInfo((object)"[战场分析基站配送支持] \ud83d\udcbe 存档安全,自动兼容旧方案"); } ManualLogSource? log20 = Log; if (log20 != null) { log20.LogInfo((object)"[战场分析基站配送支持] ========================================"); } } } public static class PluginInfo { public const string PLUGIN_GUID = "un1eagle.battlefieldanalysisbasedeliver"; public const string PLUGIN_NAME = "战场分析基站配送支持"; public const string PLUGIN_VERSION = "4.0.2"; } } namespace BattlefieldAnalysisBaseDeliver.Patches { [HarmonyPatch(typeof(BattleBaseComponent), "AutoPickTrash")] public static class BattleBaseComponent_AutoPickTrashLifeExtend_Patch { public struct WatchState { public List<WatchEntry> Entries; } public struct WatchEntry { public int Index; public int ItemId; public int OldCount; } private const int START_SEED_MULTIPLIER = 4; private const int MAX_ATTEMPTS_PER_CALL = 4; private const int LIFE_EXTEND_FRAMES = 1800; private const int LIFE_MAX_FRAMES = 3600; [HarmonyPrefix] public static void Prefix(BattleBaseComponent __instance, PlanetFactory factory, TrashSystem trashSystem, long time, ref WatchState __state) { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: 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) __state = default(WatchState); try { if (__instance == null || factory == null || trashSystem?.container == null) { return; } EnsurePickupPartitionStackSize(__instance); ref EntityData reference = ref factory.entityPool[__instance.entityId]; if (reference.id != __instance.entityId) { return; } TrashContainer container = trashSystem.container; int trashCursor = container.trashCursor; if (trashCursor <= 0) { return; } TrashObject[] trashObjPool = container.trashObjPool; TrashData[] trashDataPool = container.trashDataPool; int astroId = factory.planet.astroId; Vector3 pos = reference.pos; float x = pos.x; float y = pos.y; float z = pos.z; float num = __instance.pickRange * __instance.pickRange; int num2 = (int)((time * 4 + __instance.id) % 1000000000); List<WatchEntry> list = new List<WatchEntry>(4); for (int i = num2; i < num2 + trashCursor; i++) { int num3 = i % trashCursor; if (trashObjPool[num3].item <= 0 || trashObjPool[num3].expire >= 0 || trashDataPool[num3].nearPlanetId != astroId) { continue; } float num4 = trashDataPool[num3].lPos.x - x; float num5 = num4 * num4; if (num5 >= num) { continue; } float num6 = trashDataPool[num3].lPos.y - y; float num7 = num6 * num6; if (num7 >= num) { continue; } float num8 = trashDataPool[num3].lPos.z - z; float num9 = num8 * num8; if (!(num9 >= num) && !(num5 + num7 + num9 >= num)) { list.Add(new WatchEntry { Index = num3, ItemId = trashObjPool[num3].item, OldCount = trashObjPool[num3].count }); if (list.Count >= 4) { break; } } } __state = new WatchState { Entries = list }; } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] AutoPickTrashLifeExtend Prefix 异常: " + ex.Message)); } } } private static void EnsurePickupPartitionStackSize(BattleBaseComponent battleBase) { try { int battleBasePickupPartitionStackSize = Plugin.GetBattleBasePickupPartitionStackSize(); if (battleBasePickupPartitionStackSize <= 0) { return; } StorageComponent storage = battleBase.storage; if (storage == null || storage.grids == null || storage.size <= 0) { return; } int num = storage.size - storage.bans; if (num <= 0) { return; } if (num > storage.grids.Length) { num = storage.grids.Length; } bool flag = false; for (int i = 0; i < num; i++) { if (storage.grids[i].stackSize != battleBasePickupPartitionStackSize) { storage.grids[i].stackSize = battleBasePickupPartitionStackSize; flag = true; } } if (flag) { storage.NotifyStorageChange(); } } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] EnsurePickupPartitionStackSize 异常: " + ex.Message)); } } } [HarmonyPostfix] public static void Postfix(TrashSystem trashSystem, WatchState __state) { try { if (trashSystem?.container == null || __state.Entries == null || __state.Entries.Count == 0) { return; } TrashContainer container = trashSystem.container; TrashObject[] trashObjPool = container.trashObjPool; TrashData[] trashDataPool = container.trashDataPool; int trashCursor = container.trashCursor; foreach (WatchEntry entry in __state.Entries) { int index = entry.Index; if (index < 0 || index >= trashCursor) { continue; } int item = trashObjPool[index].item; int count = trashObjPool[index].count; if (item == entry.ItemId && count > 0 && count < entry.OldCount) { int life = trashDataPool[index].life; if (life > 0 && life < 3600) { int num = life + 1800; trashDataPool[index].life = ((num > 3600) ? 3600 : num); } } } } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] AutoPickTrashLifeExtend Postfix 异常: " + ex.Message)); } } } } [HarmonyPatch(typeof(BattleBaseComponent), "InternalUpdate")] public static class BattleBaseComponent_InternalUpdate_Patch { private const int STATION_ENDID_OFFSET = 20000; private const int STATION_WARPER_STORAGE_ENDID_OFFSET = 30000; private const int SUPPLY_FETCH_ENDID_OFFSET = 40000; [HarmonyPostfix] private static void Postfix(BattleBaseComponent __instance, PlanetFactory factory) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) try { if (__instance == null || factory == null || __instance.id <= 0 || __instance.entityId <= 0) { return; } int id = __instance.id; BaseLogisticSystem orCreate = BattleBaseLogisticsManager.GetOrCreate(factory.planetId, id); UpdateCouriers(orCreate, __instance, factory); DispatchContext dispatchContext = BattleBaseLogisticsManager.TryGetDispatchContext(orCreate, __instance, factory, __instance.entityId); if (dispatchContext == null) { return; } int num = 0; foreach (DispenserDemand demand in dispatchContext.Demands) { if (orCreate.idleCount > 0) { if (DispatchCourier(orCreate, __instance, factory, demand, dispatchContext.BasePosition, dispatchContext.CurrentInventory)) { num++; } continue; } break; } if (num > 0 && Plugin.DebugLog()) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)string.Format("[{0}] \ud83d\udce6 基站[{1}] 共派遣 {2} 个无人机,剩余空闲={3}", "战场分析基站配送支持", id, num, orCreate.idleCount)); } } } catch (Exception ex) { ManualLogSource? log2 = Plugin.Log; if (log2 != null) { log2.LogError((object)("[战场分析基站配送支持] BattleBaseComponent.InternalUpdate 异常: " + ex.Message + "\n" + ex.StackTrace)); } } } private static bool DispatchCourier(BaseLogisticSystem logistics, BattleBaseComponent battleBase, PlanetFactory factory, DispenserDemand demand, Vector3 basePosition, Dictionary<int, int> currentInventory) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_012d: 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_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Unknown result type (might be due to invalid IL or missing references) //IL_03ec: Unknown result type (might be due to invalid IL or missing references) //IL_03ee: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_0403: Unknown result type (might be due to invalid IL or missing references) //IL_042b: Unknown result type (might be due to invalid IL or missing references) //IL_043b: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_045b: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_047b: Unknown result type (might be due to invalid IL or missing references) //IL_048b: Unknown result type (might be due to invalid IL or missing references) try { if (demand.IsSupplyFetch) { return DispatchSupplyFetchCourier(logistics, battleBase, factory, demand, basePosition); } int itemId = demand.itemId; int num = Plugin.GetBattleBaseCourierCarryCapacity(); if (demand.needCount > 0 && demand.needCount < num) { num = demand.needCount; } int num2 = (currentInventory.ContainsKey(itemId) ? currentInventory[itemId] : 0); int actualCount = 0; int inc = 0; if (!TakeItemFromBase(battleBase, itemId, num, out actualCount, out inc)) { return false; } if (actualCount <= 0) { return false; } int num3 = num2 - actualCount; Vector3 position = demand.position; float num4 = Vector3.Distance(basePosition, position); int num5 = -1; for (int i = 0; i < logistics.couriers.Length; i++) { if (logistics.couriers[i].maxt <= 0f) { num5 = i; break; } } if (num5 < 0) { ReturnItemToBase(battleBase, itemId, actualCount, inc); return false; } int endId = (demand.IsMechaSlot ? (-(demand.slotIndex + 1)) : (demand.IsStationTower ? ((demand.IsWarperStorageDemand ? 30000 : 20000) + demand.stationId) : demand.dispenserId)); float maxt = num4; Vector3 begin = basePosition; Vector3 end = position; if (demand.IsMechaSlot) { begin = basePosition; end = basePosition; maxt = 1f; } logistics.couriers[num5] = new CourierData { begin = begin, end = end, endId = endId, direction = 1f, maxt = maxt, t = 0f, itemId = itemId, itemCount = actualCount, inc = inc, gene = num5 }; logistics.idleCount--; logistics.workingCount++; if (demand.IsMechaSlot) { Player mainPlayer = GameMain.mainPlayer; DeliveryPackage val = ((mainPlayer != null) ? mainPlayer.deliveryPackage : null); if (val?.grids != null && demand.slotIndex >= 0 && demand.slotIndex < val.grids.Length) { val.grids[demand.slotIndex].ordered += actualCount; } } else if (!demand.IsStationTower && demand.dispenserId > 0) { DispenserComponent dispenser = BattleBaseLogisticsManager.GetDispenser(factory, demand.dispenserId); if (dispenser != null) { dispenser.storageOrdered += actualCount; } } else if (demand.IsStationTower && !demand.IsWarperStorageDemand) { StationComponent stationComponent = factory.transport.GetStationComponent(demand.stationId); if (stationComponent?.storage != null && demand.StationStorageIndex >= 0 && demand.StationStorageIndex < stationComponent.storage.Length) { stationComponent.storage[demand.StationStorageIndex].localOrder += actualCount; } } if (Plugin.DebugLog()) { EntityData val2 = factory.entityPool[battleBase.entityId]; Quaternion rot = val2.rot; Vector3 eulerAngles = ((Quaternion)(ref rot)).eulerAngles; string itemName = GetItemName(itemId); string text = (demand.IsMechaSlot ? $"机甲槽位[{demand.slotIndex}]" : (demand.IsStationTower ? $"物流塔[{demand.stationId}]" : $"配送器[{demand.dispenserId}]")); ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)string.Format("[{0}] \ud83d\ude80 派遣: 基站[{1}] → {2} 物品={3}(ID:{4}) 派遣={5} 剩余={6} 紧急度={7:F2} | 基站pos=({8:F2},{9:F2},{10:F2}) mag={11:F2} rot=({12:F4},{13:F4},{14:F4},{15:F4}) 欧拉=({16:F1},{17:F1},{18:F1})°", "战场分析基站配送支持", battleBase.id, text, itemName, itemId, actualCount, num3, demand.urgency, val2.pos.x, val2.pos.y, val2.pos.z, ((Vector3)(ref val2.pos)).magnitude, rot.x, rot.y, rot.z, rot.w, eulerAngles.x, eulerAngles.y, eulerAngles.z)); } } return true; } catch (Exception ex) { ManualLogSource? log2 = Plugin.Log; if (log2 != null) { log2.LogError((object)("[战场分析基站配送支持] DispatchCourier 异常: " + ex.Message)); } return false; } } private static bool DispatchSupplyFetchCourier(BaseLogisticSystem logistics, BattleBaseComponent battleBase, PlanetFactory factory, DispenserDemand demand, Vector3 basePosition) { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_013a: 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) int battleBaseCourierCarryCapacity = Plugin.GetBattleBaseCourierCarryCapacity(); int num = Math.Min(demand.needCount, battleBaseCourierCarryCapacity); if (num <= 0) { return false; } DispenserComponent dispenser = BattleBaseLogisticsManager.GetDispenser(factory, demand.dispenserId); if (dispenser == null) { return false; } int dispenserStockPublic = BattleBaseLogisticsManager.GetDispenserStockPublic(dispenser, demand.itemId); if (dispenserStockPublic <= 0) { return false; } num = Math.Min(num, dispenserStockPublic); int num2 = -1; for (int i = 0; i < logistics.couriers.Length; i++) { if (logistics.couriers[i].maxt <= 0f) { num2 = i; break; } } if (num2 < 0) { return false; } dispenser.storageOrdered -= num; BattleBaseLogisticsManager.AddBaseFetchInFlight(factory.planetId, battleBase.id, demand.itemId, num); float maxt = Vector3.Distance(basePosition, demand.position); logistics.couriers[num2] = new CourierData { begin = basePosition, end = demand.position, endId = 40000 + demand.dispenserId, direction = 1f, maxt = maxt, t = 0f, itemId = demand.itemId, itemCount = 0, inc = 0, gene = num }; logistics.idleCount--; logistics.workingCount++; if (Plugin.DebugLog()) { string itemName = GetItemName(demand.itemId); ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)string.Format("[{0}] \ud83d\ude80 拉货派遣: 基站[{1}] → 供应配送器[{2}] 物品={3}(ID:{4}) 预留={5}", "战场分析基站配送支持", battleBase.id, demand.dispenserId, itemName, demand.itemId, num)); } } return true; } private static void UpdateCouriers(BaseLogisticSystem logistics, BattleBaseComponent battleBase, PlanetFactory factory) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: 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_0068: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0821: Unknown result type (might be due to invalid IL or missing references) //IL_0826: Unknown result type (might be due to invalid IL or missing references) //IL_082d: Unknown result type (might be due to invalid IL or missing references) //IL_0832: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_09d4: Unknown result type (might be due to invalid IL or missing references) //IL_09d9: Unknown result type (might be due to invalid IL or missing references) //IL_09e0: Unknown result type (might be due to invalid IL or missing references) //IL_09e5: Unknown result type (might be due to invalid IL or missing references) try { if (logistics.workingCount <= 0) { return; } float logisticCourierSpeedModified = GameMain.history.logisticCourierSpeedModified; logisticCourierSpeedModified *= Plugin.GetBattleBaseCourierSpeedMultiplier(); float num = logisticCourierSpeedModified * (1f / 60f); EntityData val = factory.entityPool[battleBase.entityId]; Vector3 val2 = ((((Vector3)(ref val.pos)).sqrMagnitude < 1E-06f) ? Vector3.up : ((Vector3)(ref val.pos)).normalized); Vector3 basePos = val.pos + val2 * 7.5f; Vector3? val3 = ((GameMain.mainPlayer != null) ? new Vector3?(GameMain.mainPlayer.position) : null); for (int i = 0; i < logistics.couriers.Length; i++) { ref CourierData reference = ref logistics.couriers[i]; if (reference.maxt <= 0f) { continue; } if (reference.endId < 0 && reference.direction > 0f && val3.HasValue) { UpdateCourierToMecha(ref reference, basePos, val3.Value, logisticCourierSpeedModified); } else { reference.t += num * reference.direction; } if (reference.direction > 0f && reference.t >= reference.maxt) { reference.t = reference.maxt; if (reference.endId >= 40000) { int dispenserId = reference.endId - 40000; int gene = reference.gene; int battleBaseCourierCarryCapacity = Plugin.GetBattleBaseCourierCarryCapacity(); TakeItemFromDispenser(factory, dispenserId, reference.itemId, Math.Min(gene, battleBaseCourierCarryCapacity), out var actualCount, out var inc); DispenserComponent dispenser = BattleBaseLogisticsManager.GetDispenser(factory, dispenserId); if (actualCount > 0) { if (actualCount < gene && dispenser != null) { dispenser.storageOrdered += gene - actualCount; } reference.itemCount = actualCount; reference.inc = inc; reference.direction = -1f; continue; } if (dispenser != null) { dispenser.storageOrdered += gene; } BattleBaseLogisticsManager.AddBaseFetchInFlight(factory.planetId, battleBase.id, reference.itemId, -gene); reference.maxt = 0f; reference.begin = Vector3.zero; reference.end = Vector3.zero; reference.endId = 0; reference.direction = 0f; reference.itemId = 0; reference.itemCount = 0; reference.inc = 0; reference.gene = 0; logistics.workingCount--; logistics.idleCount++; continue; } bool flag; if (reference.endId < 0) { int num2 = -(reference.endId + 1); flag = DeliverToMecha(num2, reference.itemId, reference.itemCount, reference.inc); Player mainPlayer = GameMain.mainPlayer; DeliveryPackage val4 = ((mainPlayer != null) ? mainPlayer.deliveryPackage : null); if (val4?.grids != null && num2 >= 0 && num2 < val4.grids.Length) { val4.grids[num2].ordered -= reference.itemCount; } if (Plugin.DebugLog() && flag) { string itemName = GetItemName(reference.itemId); ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)string.Format("[{0}] \ud83d\udcec 送货成功: 机甲槽位[{1}] 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", num2, itemName, reference.itemId, reference.itemCount)); } } } else if (reference.endId >= 20000) { bool num3 = reference.endId >= 30000; int num4 = (num3 ? (reference.endId - 30000) : (reference.endId - 20000)); int itemCount = reference.itemCount; int num5 = DeliverToStation(factory, num4, reference.itemId, reference.itemCount, reference.inc); flag = num5 >= reference.itemCount; if (!num3) { BattleBaseLogisticsManager.DecrementStationSlotLocalOrder(factory, num4, reference.itemId, itemCount); } if (num5 > 0) { if (Plugin.DebugLog()) { string itemName2 = GetItemName(reference.itemId); ManualLogSource? log2 = Plugin.Log; if (log2 != null) { log2.LogInfo((object)(string.Format("[{0}] \ud83d\udcec 送货成功: 物流塔[{1}] 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", num4, itemName2, reference.itemId, num5) + ((num5 < reference.itemCount) ? $" 剩余{reference.itemCount - num5}返还" : ""))); } } if (num5 >= reference.itemCount) { reference.itemId = 0; reference.itemCount = 0; reference.inc = 0; } else { reference.itemCount -= num5; reference.inc = 0; } } } else { flag = DeliverToDispenser(factory, reference.endId, reference.itemId, reference.itemCount, reference.inc); DispenserComponent dispenser2 = BattleBaseLogisticsManager.GetDispenser(factory, reference.endId); if (dispenser2 != null) { dispenser2.storageOrdered -= reference.itemCount; } if (Plugin.DebugLog() && flag) { string itemName3 = GetItemName(reference.itemId); ManualLogSource? log3 = Plugin.Log; if (log3 != null) { log3.LogInfo((object)string.Format("[{0}] \ud83d\udcec 送货成功: 配送器[{1}] 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", reference.endId, itemName3, reference.itemId, reference.itemCount)); } } } if (flag) { reference.itemId = 0; reference.itemCount = 0; reference.inc = 0; } else if (Plugin.DebugLog()) { string itemName4 = GetItemName(reference.itemId); string text = ((reference.endId < 0) ? $"机甲槽位[{-reference.endId - 1}]" : ((reference.endId >= 30000) ? $"物流塔[{reference.endId - 30000}]翘曲器小格" : ((reference.endId >= 20000) ? $"物流塔[{reference.endId - 20000}]" : $"配送器[{reference.endId}]"))); ManualLogSource? log4 = Plugin.Log; if (log4 != null) { log4.LogWarning((object)string.Format("[{0}] ⚠\ufe0f 送货失败: {1} 物品={2}(ID:{3})x{4},将返还到基站", "战场分析基站配送支持", text, itemName4, reference.itemId, reference.itemCount)); } } reference.direction = -1f; } else { if (!(reference.direction < 0f) || !(reference.t <= 0f)) { continue; } reference.t = 0f; if (reference.endId >= 40000) { if (reference.itemId > 0 && reference.itemCount > 0) { DeliverToBaseInputPartition(battleBase, factory, reference.itemId, reference.itemCount, reference.inc); BattleBaseLogisticsManager.AddBaseFetchInFlight(factory.planetId, battleBase.id, reference.itemId, -reference.itemCount); DispenserComponent dispenser3 = BattleBaseLogisticsManager.GetDispenser(factory, reference.endId - 40000); if (dispenser3 != null) { dispenser3.storageOrdered += reference.itemCount; } if (Plugin.DebugLog()) { string itemName5 = GetItemName(reference.itemId); ManualLogSource? log5 = Plugin.Log; if (log5 != null) { log5.LogInfo((object)string.Format("[{0}] \ud83d\udce5 拉货送达: 基站[{1}] 输入区 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", battleBase.id, itemName5, reference.itemId, reference.itemCount)); } } } reference.maxt = 0f; reference.begin = Vector3.zero; reference.end = Vector3.zero; reference.endId = 0; reference.direction = 0f; reference.itemId = 0; reference.itemCount = 0; reference.inc = 0; reference.gene = 0; logistics.workingCount--; logistics.idleCount++; if (Plugin.DebugLog()) { ManualLogSource? log6 = Plugin.Log; if (log6 != null) { log6.LogInfo((object)string.Format("[{0}] \ud83c\udfe0 无人机返回: 基站[{1}] 空闲={2}", "战场分析基站配送支持", battleBase.id, logistics.idleCount)); } } continue; } if (reference.endId >= 20000 && reference.endId < 30000 && reference.itemId > 0 && reference.itemCount > 0) { int stationId = reference.endId - 20000; BattleBaseLogisticsManager.DecrementStationSlotLocalOrder(factory, stationId, reference.itemId, reference.itemCount); } if (reference.itemId > 0 && reference.itemCount > 0) { ReturnItemToBase(battleBase, reference.itemId, reference.itemCount, reference.inc); if (Plugin.DebugLog()) { string itemName6 = GetItemName(reference.itemId); ManualLogSource? log7 = Plugin.Log; if (log7 != null) { log7.LogInfo((object)string.Format("[{0}] \ud83d\udce6 返还物品: 基站[{1}] 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", battleBase.id, itemName6, reference.itemId, reference.itemCount)); } } } reference.maxt = 0f; reference.begin = Vector3.zero; reference.end = Vector3.zero; reference.endId = 0; reference.direction = 0f; reference.itemId = 0; reference.itemCount = 0; reference.inc = 0; logistics.workingCount--; logistics.idleCount++; if (Plugin.DebugLog()) { ManualLogSource? log8 = Plugin.Log; if (log8 != null) { log8.LogInfo((object)string.Format("[{0}] \ud83c\udfe0 无人机返回: 基站[{1}] 空闲={2}", "战场分析基站配送支持", battleBase.id, logistics.idleCount)); } } } } } catch (Exception ex) { ManualLogSource? log9 = Plugin.Log; if (log9 != null) { log9.LogError((object)("[战场分析基站配送支持] UpdateCouriers 异常: " + ex.Message)); } } } private static void UpdateCourierToMecha(ref CourierData courier, Vector3 basePos, Vector3 playerPos, float courierSpeed) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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) //IL_0082: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: 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_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_031e: 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) Vector3 end = courier.end; float num = playerPos.x - end.x; float num2 = playerPos.y - end.y; float num3 = playerPos.z - end.z; float num4 = (float)Math.Sqrt(num * num + num2 * num2 + num3 * num3); float num5 = (float)Math.Sqrt((playerPos.x - basePos.x) * (playerPos.x - basePos.x) + (playerPos.y - basePos.y) * (playerPos.y - basePos.y) + (playerPos.z - basePos.z) * (playerPos.z - basePos.z)); float num6 = (float)Math.Sqrt(end.x * end.x + end.y * end.y + end.z * end.z); float num7 = (float)Math.Sqrt(playerPos.x * playerPos.x + playerPos.y * playerPos.y + playerPos.z * playerPos.z); if (num4 < 1.4f) { double num8 = Math.Sqrt(basePos.x * basePos.x + basePos.y * basePos.y + basePos.z * basePos.z); double num9 = Math.Sqrt(playerPos.x * playerPos.x + playerPos.y * playerPos.y + playerPos.z * playerPos.z); double num10 = (double)(basePos.x * playerPos.x + basePos.y * playerPos.y + basePos.z * playerPos.z) / (num8 * num9); if (num10 < -1.0) { num10 = -1.0; } else if (num10 > 1.0) { num10 = 1.0; } courier.begin = basePos; courier.maxt = (float)(Math.Acos(num10) * ((num8 + num9) * 0.5)); courier.maxt = (float)Math.Sqrt((double)(courier.maxt * courier.maxt) + (num8 - num9) * (num8 - num9)); courier.t = courier.maxt; return; } courier.begin = end; float num11 = courierSpeed * (1f / 60f) / num4; if (num11 > 1f) { num11 = 1f; } float num12 = num * num11; float num13 = num2 * num11; float num14 = num3 * num11; float num15 = num4 / courierSpeed; if (num15 < 0.03333333f) { num15 = 0.03333333f; } float num16 = (num7 - num6) / num15 * (1f / 60f); end.x += num12; end.y += num13; end.z += num14; float num17 = (float)Math.Sqrt(end.x * end.x + end.y * end.y + end.z * end.z); if (num17 > 1E-05f) { float num18 = (num6 + num16) / num17; end.x *= num18; end.y *= num18; end.z *= num18; } courier.end = end; if (num5 > courier.maxt) { courier.maxt = num5; } courier.t = num4; if (courier.t >= courier.maxt * 0.99f) { courier.t = courier.maxt * 0.99f; } } private static bool TakeItemFromBase(BattleBaseComponent battleBase, int itemId, int maxCount, out int actualCount, out int inc) { actualCount = 0; inc = 0; try { if (battleBase.storage == null) { return false; } MethodInfo method = ((object)battleBase.storage).GetType().GetMethod("TakeItem", BindingFlags.Instance | BindingFlags.Public); if (method == null) { return false; } object[] array = new object[3] { itemId, maxCount, 0 }; object obj = method.Invoke(battleBase.storage, array); if (obj == null) { return false; } actualCount = (int)obj; inc = (int)array[2]; return actualCount > 0; } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] TakeItemFromBase 异常: " + ex.Message)); } return false; } } private static void ReturnItemToBase(BattleBaseComponent battleBase, int itemId, int count, int inc) { try { if (battleBase.storage != null) { MethodInfo method = ((object)battleBase.storage).GetType().GetMethod("AddItem", BindingFlags.Instance | BindingFlags.Public, null, new Type[5] { typeof(int), typeof(int), typeof(int), typeof(int).MakeByRefType(), typeof(bool) }, null); if (!(method == null)) { object[] parameters = new object[5] { itemId, count, inc, 0, false }; method.Invoke(battleBase.storage, parameters); } } } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ReturnItemToBase 异常: " + ex.Message)); } } } private static bool DeliverToMecha(int slotIndex, int itemId, int count, int inc) { try { Player mainPlayer = GameMain.mainPlayer; if (((mainPlayer != null) ? mainPlayer.packageUtility : null) == null) { return false; } if (itemId <= 0 || count <= 0 || itemId == 1099) { return false; } int num = default(int); int num2 = mainPlayer.packageUtility.AddItemToAllPackages(itemId, count, slotIndex, inc, ref num, 0); if (num2 > 0) { mainPlayer.NotifyReplenishPreferred(itemId, num2); return true; } return false; } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] DeliverToMecha 异常: " + ex.Message + "\n" + ex.StackTrace)); } return false; } } private static int DeliverToStation(PlanetFactory factory, int stationId, int itemId, int count, int inc) { try { if (factory?.transport == null) { return 0; } if (stationId <= 0) { return 0; } StationComponent stationComponent = factory.transport.GetStationComponent(stationId); if (stationComponent == null || stationComponent.id != stationId) { return 0; } if (itemId == 1210) { if (!stationComponent.isStellar || stationComponent.warperMaxCount <= 0) { return 0; } int num = Math.Min(count, Math.Max(0, stationComponent.warperMaxCount - stationComponent.warperCount)); stationComponent.warperCount += num; int num2 = count - num; if (num2 <= 0) { return num; } int num3 = stationComponent.AddItem(1210, num2, inc); return num + num3; } return stationComponent.AddItem(itemId, count, inc); } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] DeliverToStation 异常: " + ex.Message + "\n" + ex.StackTrace)); } return 0; } } private static bool DeliverToDispenser(PlanetFactory factory, int dispenserId, int itemId, int count, int inc) { try { if (factory?.transport == null) { if (Plugin.DebugLog()) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogWarning((object)"[战场分析基站配送支持] 送货失败: factory.transport 为 null"); } } return false; } FieldInfo field = ((object)factory.transport).GetType().GetField("dispenserPool", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { if (Plugin.DebugLog()) { ManualLogSource? log2 = Plugin.Log; if (log2 != null) { log2.LogWarning((object)"[战场分析基站配送支持] 送货失败: dispenserPoolField 为 null"); } } return false; } Array array = field.GetValue(factory.transport) as Array; if (array == null || dispenserId <= 0 || dispenserId >= array.Length) { if (Plugin.DebugLog()) { ManualLogSource? log3 = Plugin.Log; if (log3 != null) { log3.LogWarning((object)string.Format("[{0}] 送货失败: dispenserId={1} 无效(范围: 1-{2})", "战场分析基站配送支持", dispenserId, array?.Length ?? 0)); } } return false; } object? value = array.GetValue(dispenserId); DispenserComponent val = (DispenserComponent)((value is DispenserComponent) ? value : null); if (val == null || val.id != dispenserId) { if (Plugin.DebugLog()) { ManualLogSource? log4 = Plugin.Log; if (log4 != null) { log4.LogWarning((object)string.Format("[{0}] 送货失败: dispenser[{1}] 为 null 或 id 不匹配", "战场分析基站配送支持", dispenserId)); } } return false; } if (val.storage?.bottomStorage == null) { if (Plugin.DebugLog()) { ManualLogSource? log5 = Plugin.Log; if (log5 != null) { log5.LogWarning((object)string.Format("[{0}] 送货失败: dispenser[{1}].storage.bottomStorage 为 null", "战场分析基站配送支持", dispenserId)); } } return false; } FieldInfo field2 = ((object)val.storage.bottomStorage).GetType().GetField("entityId", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 == null) { if (Plugin.DebugLog()) { ManualLogSource? log6 = Plugin.Log; if (log6 != null) { log6.LogWarning((object)"[战场分析基站配送支持] 送货失败: entityIdField 为 null"); } } return false; } int num = (int)field2.GetValue(val.storage.bottomStorage); if (num <= 0) { if (Plugin.DebugLog()) { ManualLogSource? log7 = Plugin.Log; if (log7 != null) { log7.LogWarning((object)"[战场分析基站配送支持] 送货失败: bottomStorage.entityId 无效"); } } return false; } int num2 = default(int); int num3 = factory.InsertIntoStorage(num, itemId, count, inc, ref num2, true); int num4 = count - num3; if (num4 > 0) { FieldInfo field3 = ((object)val).GetType().GetField("holdupPackage", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field4 = ((object)val).GetType().GetField("holdupItemCount", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field3 != null && field4 != null) { Array array2 = field3.GetValue(val) as Array; int num5 = (int)field4.GetValue(val); if (array2 != null && num5 < array2.Length) { bool flag = false; for (int i = 0; i < num5; i++) { object value2 = array2.GetValue(i); if (value2 == null) { continue; } FieldInfo field5 = value2.GetType().GetField("itemId"); if (!(field5 != null) || (int)field5.GetValue(value2) != itemId) { continue; } FieldInfo field6 = value2.GetType().GetField("count"); FieldInfo field7 = value2.GetType().GetField("inc"); if (!(field6 != null) || !(field7 != null)) { continue; } int num6 = (int)field6.GetValue(value2); int num7 = (int)field7.GetValue(value2); field6.SetValue(value2, num6 + num4); field7.SetValue(value2, num7 + num2); array2.SetValue(value2, i); flag = true; if (Plugin.DebugLog()) { string itemName = GetItemName(itemId); ManualLogSource? log8 = Plugin.Log; if (log8 != null) { log8.LogInfo((object)string.Format("[{0}] \ud83d\udce6 送货到缓存区: 配送器[{1}] 物品={2}(ID:{3}) 直接插入={4} 缓存={5}", "战场分析基站配送支持", dispenserId, itemName, itemId, num3, num4)); } } break; } if (!flag) { Type elementType = array2.GetType().GetElementType(); if (elementType != null) { object obj = Activator.CreateInstance(elementType); FieldInfo field8 = obj.GetType().GetField("itemId"); FieldInfo field9 = obj.GetType().GetField("count"); FieldInfo field10 = obj.GetType().GetField("inc"); if (field8 != null && field9 != null && field10 != null) { field8.SetValue(obj, itemId); field9.SetValue(obj, num4); field10.SetValue(obj, num2); array2.SetValue(obj, num5); field4.SetValue(val, num5 + 1); if (Plugin.DebugLog()) { string itemName2 = GetItemName(itemId); ManualLogSource? log9 = Plugin.Log; if (log9 != null) { log9.LogInfo((object)string.Format("[{0}] \ud83d\udce6 送货到缓存区(新增): 配送器[{1}] 物品={2}(ID:{3}) 直接插入={4} 缓存={5}", "战场分析基站配送支持", dispenserId, itemName2, itemId, num3, num4)); } } } } } } } } else if (Plugin.DebugLog()) { string itemName3 = GetItemName(itemId); ManualLogSource? log10 = Plugin.Log; if (log10 != null) { log10.LogInfo((object)string.Format("[{0}] \ud83d\udcec 送货成功(直接插入): 配送器[{1}] 物品={2}(ID:{3})x{4}", "战场分析基站配送支持", dispenserId, itemName3, itemId, count)); } } val.pulseSignal = 2; return true; } catch (Exception ex) { ManualLogSource? log11 = Plugin.Log; if (log11 != null) { log11.LogError((object)("[战场分析基站配送支持] DeliverToDispenser 异常: " + ex.Message + "\n" + ex.StackTrace)); } return false; } } private static void TakeItemFromDispenser(PlanetFactory factory, int dispenserId, int itemId, int maxCount, out int actualCount, out int inc) { actualCount = 0; inc = 0; try { DispenserComponent dispenser = BattleBaseLogisticsManager.GetDispenser(factory, dispenserId); if (dispenser?.storage?.bottomStorage == null) { return; } Type type = ((object)dispenser.storage.bottomStorage).GetType(); MethodInfo method = type.GetMethod("TakeItem", BindingFlags.Instance | BindingFlags.Public); FieldInfo field = type.GetField("nextStorage", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method == null) { return; } object obj = dispenser.storage.bottomStorage; int num = maxCount; int num2 = 0; while (obj != null && num > 0) { object[] array = new object[3] { itemId, num, 0 }; if (method.Invoke(obj, array) is int num3 && num3 > 0) { actualCount += num3; num -= num3; num2 = (int)array[2]; } obj = field?.GetValue(obj); } inc = num2; } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] TakeItemFromDispenser 异常: " + ex.Message)); } } } private static void DeliverToBaseInputPartition(BattleBaseComponent battleBase, PlanetFactory factory, int itemId, int count, int inc) { try { if (battleBase != null && factory != null && itemId > 0 && count > 0) { int num = default(int); factory.InsertIntoStorage(battleBase.entityId, itemId, count, inc, ref num, true); } } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] DeliverToBaseInputPartition 异常: " + ex.Message)); } } } private static string GetItemName(int itemId) { try { ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId); if (val != null && !string.IsNullOrEmpty(((Proto)val).name)) { return Localization.Translate(((Proto)val).name); } } catch { } return $"item_{itemId}"; } } public class BaseLogisticSystem { public int battleBaseId; public int planetId; public CourierData[] couriers = (CourierData[])(object)new CourierData[20]; public int idleCount = 20; public int workingCount; public Dictionary<int, int> lastInventory = new Dictionary<int, int>(); public int cooldownCounter; public const int DISPATCH_INTERVAL = 60; public const float DRONE_AT_BASE_HEIGHT_OFFSET = 7.5f; public int CourierCapacity { get { CourierData[] array = couriers; if (array == null) { return 0; } return array.Length; } } } public class DispenserDemand { public int dispenserId; public int entityId; public int storageId; public int itemId; public int currentStock; public int maxStock; public float urgency; public Vector3 position; public float distance; public bool IsMechaSlot; public int slotIndex; public int needCount; public bool IsStationTower; public int stationId; public bool IsWarperStorageDemand; public int StationStorageIndex; public bool IsSupplyFetch; } public class DispatchContext { public List<DispenserDemand> Demands; public Dictionary<int, int> CurrentInventory; public Vector3 BasePosition; public DispatchContext(List<DispenserDemand> demands, Dictionary<int, int> currentInventory, Vector3 basePosition) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) Demands = demands; CurrentInventory = currentInventory; BasePosition = basePosition; } } public static class BattleBaseLogisticsManager { private static Dictionary<int, Dictionary<int, BaseLogisticSystem>> _systems = new Dictionary<int, Dictionary<int, BaseLogisticSystem>>(); private static Dictionary<(int planetId, int battleBaseId, int itemId), int> _baseFetchInFlight = new Dictionary<(int, int, int), int>(); private static object _inFlightLock = new object(); private static object _lock = new object(); private const int STATION_ENDID_OFFSET = 20000; private const int STATION_WARPER_STORAGE_ENDID_OFFSET = 30000; private const int ITEMID_WARPER = 1210; public static BaseLogisticSystem GetOrCreate(int planetId, int battleBaseId) { lock (_lock) { if (!_systems.ContainsKey(planetId)) { _systems[planetId] = new Dictionary<int, BaseLogisticSystem>(); } if (!_systems[planetId].ContainsKey(battleBaseId)) { int battleBaseCourierCount = Plugin.GetBattleBaseCourierCount(); _systems[planetId][battleBaseId] = new BaseLogisticSystem { battleBaseId = battleBaseId, planetId = planetId, couriers = (CourierData[])(object)new CourierData[battleBaseCourierCount], idleCount = battleBaseCourierCount, workingCount = 0 }; } return _systems[planetId][battleBaseId]; } } public static IEnumerable<BaseLogisticSystem> GetAllForPlanet(int planetId) { lock (_lock) { if (_systems.TryGetValue(planetId, out Dictionary<int, BaseLogisticSystem> value)) { return value.Values.ToList(); } return Enumerable.Empty<BaseLogisticSystem>(); } } public static bool HasWarperCourierInTransitToStation(int planetId, int stationId) { int num = 20000 + stationId; int num2 = 30000 + stationId; foreach (BaseLogisticSystem item in GetAllForPlanet(planetId)) { if (item.couriers == null) { continue; } for (int i = 0; i < item.couriers.Length; i++) { ref CourierData reference = ref item.couriers[i]; if (!(reference.maxt <= 0f) && !(reference.direction <= 0f) && reference.itemId == 1210 && (reference.endId == num || reference.endId == num2)) { return true; } } } return false; } public static int GetIncomingToDispenser(int planetId, int dispenserId, int itemId) { if (dispenserId <= 0 || itemId <= 0) { return 0; } int num = 0; foreach (BaseLogisticSystem item in GetAllForPlanet(planetId)) { if (item.couriers == null) { continue; } for (int i = 0; i < item.couriers.Length; i++) { ref CourierData reference = ref item.couriers[i]; if (!(reference.maxt <= 0f) && !(reference.direction <= 0f) && reference.endId == dispenserId && reference.itemId == itemId) { num += reference.itemCount; } } } return num; } public static DispenserComponent? GetDispenser(PlanetFactory factory, int dispenserId) { if (factory?.transport == null || dispenserId <= 0) { return null; } PlanetTransport transport = factory.transport; FieldInfo field = ((object)transport).GetType().GetField("dispenserPool", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { return null; } if (!(field.GetValue(transport) is Array array) || dispenserId >= array.Length) { return null; } object? value = array.GetValue(dispenserId); DispenserComponent val = (DispenserComponent)((value is DispenserComponent) ? value : null); if (val == null || val.id != dispenserId) { return null; } return val; } public static void DecrementStationSlotLocalOrder(PlanetFactory factory, int stationId, int itemId, int amount) { if (factory?.transport == null || stationId <= 0 || itemId <= 0 || amount <= 0) { return; } StationComponent stationComponent = factory.transport.GetStationComponent(stationId); if (stationComponent?.storage == null) { return; } for (int i = 0; i < stationComponent.storage.Length; i++) { if (stationComponent.storage[i].itemId == itemId) { stationComponent.storage[i].localOrder -= amount; break; } } } public static int GetBaseFetchInFlight(int planetId, int battleBaseId, int itemId) { lock (_inFlightLock) { int value; return _baseFetchInFlight.TryGetValue((planetId, battleBaseId, itemId), out value) ? value : 0; } } public static void AddBaseFetchInFlight(int planetId, int battleBaseId, int itemId, int delta) { if (delta == 0) { return; } lock (_inFlightLock) { (int, int, int) key = (planetId, battleBaseId, itemId); int num = (_baseFetchInFlight.TryGetValue(key, out var value) ? value : 0); num += delta; if (num <= 0) { _baseFetchInFlight.Remove(key); } else { _baseFetchInFlight[key] = num; } } } public static void Clear(int planetId) { lock (_lock) { _systems.Remove(planetId); lock (_inFlightLock) { foreach (var item in (from kv in _baseFetchInFlight where kv.Key.planetId == planetId select kv.Key).ToList()) { _baseFetchInFlight.Remove(item); } } if (Plugin.DebugLog()) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)string.Format("[{0}] 清理基站物流系统:行星[{1}]", "战场分析基站配送支持", planetId)); } } } } public static void ClearAll() { lock (_lock) { _systems.Clear(); lock (_inFlightLock) { _baseFetchInFlight.Clear(); } if (Plugin.DebugLog()) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogInfo((object)"[战场分析基站配送支持] 清理所有基站物流系统"); } } } } public static bool HasInventoryChanged(BaseLogisticSystem logistics, Dictionary<int, int> currentInventory) { if (logistics.lastInventory.Count != currentInventory.Count) { return true; } foreach (KeyValuePair<int, int> item in currentInventory) { if (!logistics.lastInventory.TryGetValue(item.Key, out var value) || value != item.Value) { return true; } } return false; } public static List<(int itemId, int needCount)> ScanBaseInputDemands(object battleBase, int planetId, int battleBaseId) { List<(int, int)> list = new List<(int, int)>(); try { object obj = (battleBase?.GetType().GetField("storage", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))?.GetValue(battleBase); if (obj == null) { return list; } FieldInfo field = obj.GetType().GetField("size", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = obj.GetType().GetField("bans", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field3 = obj.GetType().GetField("grids", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null || field2 == null || field3 == null) { return list; } int num2 = ((field.GetValue(obj) is int num) ? num : 0); int num4 = ((field2.GetValue(obj) is int num3) ? num3 : 0); int num5 = num2 - num4; if (num5 >= num2 || num4 <= 0) { return list; } if (!(field3.GetValue(obj) is Array array)) { return list; } Dictionary<int, int> dictionary = new Dictionary<int, int>(); for (int i = num5; i < num2; i++) { object value = array.GetValue(i); if (value == null) { continue; } FieldInfo field4 = value.GetType().GetField("filter"); FieldInfo field5 = value.GetType().GetField("itemId"); FieldInfo field6 = value.GetType().GetField("count"); FieldInfo field7 = value.GetType().GetField("stackSize"); if (field4 == null || field6 == null || field7 == null) { continue; } int num7 = ((field4.GetValue(value) is int num6) ? num6 : 0); int num9 = ((field5 != null && field5.GetValue(value) is int num8) ? num8 : num7); if (num9 <= 0) { num9 = num7; } if (num9 <= 0) { continue; } int num11 = ((field6.GetValue(value) is int num10) ? num10 : 0); int num13 = ((field7.GetValue(value) is int num12) ? num12 : 1000); if (num11 < num13) { int num14 = num13 - num11; if (!dictionary.ContainsKey(num9)) { dictionary[num9] = 0; } dictionary[num9] += num14; } } foreach (KeyValuePair<int, int> item in dictionary) { int key = item.Key; int value2 = item.Value; int baseFetchInFlight = GetBaseFetchInFlight(planetId, battleBaseId, key); int num15 = Math.Max(0, value2 - baseFetchInFlight); if (num15 > 0) { list.Add((key, num15)); } } } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ScanBaseInputDemands 异常: " + ex.Message)); } } return list; } public static List<DispenserDemand> ScanSupplyDispensers(PlanetFactory factory, Vector3 basePosition, HashSet<int> neededItemIds) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Invalid comparison between Unknown and I4 //IL_0151: 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_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) List<DispenserDemand> list = new List<DispenserDemand>(); if (neededItemIds == null || neededItemIds.Count == 0) { return list; } try { PlanetTransport val = factory?.transport; if (val == null) { return list; } FieldInfo field = ((object)val).GetType().GetField("dispenserPool", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = ((object)val).GetType().GetField("dispenserCursor", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null || field2 == null) { return list; } Array array = field.GetValue(val) as Array; object value = field2.GetValue(val); if (array == null || value == null) { return list; } int num = Convert.ToInt32(value); EntityData[] entityPool = factory.entityPool; if (entityPool == null) { return list; } for (int i = 1; i < num && i < array.Length; i++) { object value2 = array.GetValue(i); if (value2 == null) { continue; } DispenserComponent val2 = (DispenserComponent)((value2 is DispenserComponent) ? value2 : null); if (val2 == null || val2.id != i || (int)val2.storageMode != 1 || val2.filter <= 0 || !neededItemIds.Contains(val2.filter)) { continue; } int dispenserStock = GetDispenserStock(val2, val2.filter); if (dispenserStock <= 0) { continue; } int num2 = Math.Max(0, -val2.storageOrdered); int num3 = Math.Max(0, dispenserStock - num2); if (num3 <= 0) { continue; } Vector3 val3 = Vector3.zero; if (val2.entityId > 0 && val2.entityId < entityPool.Length) { EntityData val4 = entityPool[val2.entityId]; if (val4.id > 0) { val3 = val4.pos; } } float distance = Vector3.Distance(basePosition, val3); list.Add(new DispenserDemand { IsSupplyFetch = true, dispenserId = val2.id, entityId = val2.entityId, storageId = 0, itemId = val2.filter, currentStock = num3, maxStock = 0, needCount = 0, urgency = 0f, position = val3, distance = distance }); } list.Sort((DispenserDemand a, DispenserDemand b) => a.distance.CompareTo(b.distance)); } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ScanSupplyDispensers 异常: " + ex.Message)); } } return list; } public static List<DispenserDemand> ScanDispenserDemands(PlanetFactory factory, Vector3 basePosition, Dictionary<int, int> baseInventory) { //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Invalid comparison between Unknown and I4 //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) List<DispenserDemand> list = new List<DispenserDemand>(); try { if (factory == null) { return list; } PlanetTransport transport = factory.transport; if (transport == null) { return list; } FieldInfo field = ((object)transport).GetType().GetField("dispenserPool", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = ((object)transport).GetType().GetField("dispenserCursor", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null || field2 == null) { return list; } Array array = field.GetValue(transport) as Array; object value = field2.GetValue(transport); if (array == null || value == null) { return list; } int num = Convert.ToInt32(value); for (int i = 1; i < num && i < array.Length; i++) { object value2 = array.GetValue(i); if (value2 == null) { continue; } DispenserComponent val = (DispenserComponent)((value2 is DispenserComponent) ? value2 : null); if (val == null || val.id != i || (int)val.storageMode != 2 || val.filter <= 0 || val.holdupItemCount > 0 || !baseInventory.ContainsKey(val.filter) || baseInventory[val.filter] <= 0) { continue; } int dispenserStock = GetDispenserStock(val, val.filter); int dispenserMaxStock = GetDispenserMaxStock(val); int num2 = Math.Max(0, val.storageOrdered); if (dispenserMaxStock > 0 && dispenserStock + num2 >= dispenserMaxStock) { continue; } Vector3 val2 = Vector3.zero; EntityData[] entityPool = factory.entityPool; if (val.entityId > 0 && entityPool != null && val.entityId < entityPool.Length) { EntityData val3 = entityPool[val.entityId]; if (val3.id > 0) { val2 = val3.pos; } } float distance = Vector3.Distance(basePosition, val2); float urgency = ((dispenserMaxStock > 0) ? ((float)(dispenserStock + num2) / (float)dispenserMaxStock) : 1f); int storageId = 0; if (val.storage?.bottomStorage != null) { FieldInfo field3 = ((object)val.storage.bottomStorage).GetType().GetField("id"); if (field3 != null) { storageId = (int)field3.GetValue(val.storage.bottomStorage); } } list.Add(new DispenserDemand { dispenserId = val.id, entityId = val.entityId, storageId = storageId, itemId = val.filter, currentStock = dispenserStock, maxStock = dispenserMaxStock, urgency = urgency, position = val2, distance = distance }); } list.Sort(delegate(DispenserDemand a, DispenserDemand b) { int num3 = a.urgency.CompareTo(b.urgency); return (num3 != 0) ? num3 : a.distance.CompareTo(b.distance); }); } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ScanDispenserDemands 异常: " + ex.Message)); } } return list; } public static List<DispenserDemand> ScanStationDemands(PlanetFactory factory, Vector3 basePosition, Dictionary<int, int> baseInventory) { //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0097: 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_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Invalid comparison between Unknown and I4 //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: 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) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_0274: 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_0150: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0352: 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_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) List<DispenserDemand> list = new List<DispenserDemand>(); try { if (factory == null) { return list; } PlanetTransport transport = factory.transport; if (transport == null) { return list; } StationComponent[] stationPool = transport.stationPool; if (stationPool == null) { return list; } int stationCursor = transport.stationCursor; EntityData[] entityPool = factory.entityPool; if (entityPool == null) { return list; } for (int i = 1; i < stationCursor && i < stationPool.Length; i++) { StationComponent val = stationPool[i]; if (val == null || val.id != i || val.storage == null) { continue; } for (int j = 0; j < val.storage.Length; j++) { StationStore val2 = val.storage[j]; if (val2.itemId <= 0 || (int)val2.localLogic != 2) { continue; } int num = val2.count + val2.localOrder; if (num >= val2.max || val2.max - num <= 0 || !baseInventory.ContainsKey(val2.itemId) || baseInventory[val2.itemId] <= 0) { continue; } Vector3 val3 = Vector3.zero; if (val.entityId > 0 && val.entityId < entityPool.Length) { EntityData val4 = entityPool[val.entityId]; if (val4.id > 0) { val3 = val4.pos; } } float distance = Vector3.Distance(basePosition, val3); float urgency = ((val2.max > 0) ? ((float)num / (float)val2.max) : 1f); list.Add(new DispenserDemand { IsStationTower = true, stationId = val.id, StationStorageIndex = j, dispenserId = 0, entityId = val.entityId, storageId = 0, itemId = val2.itemId, currentStock = num, maxStock = val2.max, urgency = urgency, position = val3, distance = distance }); } if (!val.isStellar || val.warperMaxCount <= 0 || val.warperCount >= val.warperMaxCount || !baseInventory.TryGetValue(1210, out var value) || value <= 0 || HasWarperCourierInTransitToStation(factory.planetId, val.id)) { continue; } int needCount = val.warperMaxCount - val.warperCount; Vector3 val5 = Vector3.zero; if (val.entityId > 0 && val.entityId < entityPool.Length) { EntityData val6 = entityPool[val.entityId]; if (val6.id > 0) { val5 = val6.pos; } } float distance2 = Vector3.Distance(basePosition, val5); float urgency2 = ((val.warperMaxCount > 0) ? ((float)val.warperCount / (float)val.warperMaxCount) : 1f); list.Add(new DispenserDemand { IsStationTower = true, stationId = val.id, IsWarperStorageDemand = true, dispenserId = 0, entityId = val.entityId, storageId = 0, itemId = 1210, currentStock = val.warperCount, maxStock = val.warperMaxCount, needCount = needCount, urgency = urgency2, position = val5, distance = distance2 }); } list.Sort(delegate(DispenserDemand a, DispenserDemand b) { int num2 = a.urgency.CompareTo(b.urgency); return (num2 != 0) ? num2 : a.distance.CompareTo(b.distance); }); } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ScanStationDemands 异常: " + ex.Message)); } } return list; } public static List<DispenserDemand> ScanMechaDemands(PlanetFactory factory, Vector3 basePosition, Dictionary<int, int> baseInventory) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) List<DispenserDemand> list = new List<DispenserDemand>(); try { if (factory == null) { return list; } Player mainPlayer = GameMain.mainPlayer; if (mainPlayer == null || !mainPlayer.isAlive || mainPlayer.sailing) { return list; } DeliveryPackage deliveryPackage = mainPlayer.deliveryPackage; PlayerPackageUtility packageUtility = mainPlayer.packageUtility; if (deliveryPackage == null || packageUtility == null) { return list; } if (!deliveryPackage.unlockedAndEnabled) { return list; } PlanetData planet = factory.planet; if (planet == null || GameMain.localPlanet != planet || !planet.loaded || !planet.factoryLoaded) { return list; } GRID[] grids = deliveryPackage.grids; if (grids == null) { return list; } Vector3 position = mainPlayer.position; if (((Vector3)(ref position)).sqrMagnitude < 0.01f) { return list; } float distance = Vector3.Distance(basePosition, position); for (int i = 0; i < deliveryPackage.gridLength; i++) { if (!deliveryPackage.IsGridActive(i) || grids[i].itemId <= 0) { continue; } int itemId = grids[i].itemId; if (itemId == 1099 || !baseInventory.ContainsKey(itemId) || baseInventory[itemId] <= 0) { continue; } int num = grids[i].count + packageUtility.GetPackageItemCountIncludeHandItem(itemId); int clampedRequireCount = ((GRID)(ref grids[i])).clampedRequireCount; if (num < clampedRequireCount && ((GRID)(ref grids[i])).stackSizeModified - grids[i].count + packageUtility.GetPackageItemCapacity(itemId) > 0) { int num2 = clampedRequireCount - num; if (num2 > 0) { float urgency = ((clampedRequireCount > 0) ? ((float)num / (float)clampedRequireCount) : 1f); list.Add(new DispenserDemand { IsMechaSlot = true, slotIndex = i, needCount = num2, dispenserId = 0, entityId = 0, storageId = 0, itemId = itemId, currentStock = num, maxStock = clampedRequireCount, urgency = urgency, position = position, distance = distance }); } } } list.Sort(delegate(DispenserDemand a, DispenserDemand b) { int num3 = a.urgency.CompareTo(b.urgency); return (num3 != 0) ? num3 : a.distance.CompareTo(b.distance); }); } catch (Exception ex) { ManualLogSource? log = Plugin.Log; if (log != null) { log.LogError((object)("[战场分析基站配送支持] ScanMechaDemands 异常: " + ex.Message)); } } return list; } public static DispatchContext? TryGetDispatchContext(BaseLogisticSystem logistics, object battleBase, PlanetFactory factory, int entityId) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) if (logistics == null || battleBase == null || factory == null) { return null; } logistics.cooldownCounter++; if (logistics.cooldownCounter < 60) { return null; } logistics.cooldownCounter = 0; Dictionary<int, int> baseInventory = GetBaseInventory(battleBase); if (!HasInventoryChanged(logistics, baseInventory) && (logistics.idleCount <= 0 || baseInventory.Count == 0)) { return null; } if (logistics.idleCount <= 0) { return null; } Vector3 basePosition = Vector3.zero; if (entityId >= 0 && factory.entityPool != null && entityId < factory.entityPool.Length) { EntityData val = factory.entityPool[entityId]; Vector3 val2 = ((((Vector3)(ref val.pos)).sqrMagnitude < 1E-06f) ? Vector3.up : ((Vector3)(ref val.pos)).normalized); basePosition = val.pos + val2 * 7.5f; } List<DispenserDemand> list = ScanMechaDemands(factory, basePosition, baseInventory); List<DispenserDemand> list2 = ScanStationDemands(factory, basePosition, baseInventory); List<DispenserDemand> list3 = ScanDispenserDemands(factory, basePosition, baseInventory); int planetId = factory.planetId; int battleBaseId = logistics.battleBaseId; List<(int itemId, int needCount)> list4 = ScanBaseInputDemands(battleBase, planetId, battleBaseId); HashSet<int> neededItemIds = new HashSet<int>(list4.Select(((int itemId, int needCount) x) => x.itemId)); List<DispenserDemand> list5 = ScanSupplyDispensers(factory, basePosition, neededItemIds); List<DispenserDemand> list6 = new List<DispenserDemand>(); int battleBaseCourierCarryCapacity = Plugin.GetBattleBaseCourierCarryCapacity(); foreach (var (num, num2) in list4) { if (num2 <= 0) { continue; } foreach (DispenserDemand item in list5) { if (item.itemId == num) { int num3 = Math.Min(num2, Math.Min(battleBaseCourierCarryCapacity, item.currentStock)); if (num3 > 0) { list6.Add(new DispenserDemand { IsSupplyFetch = true, dispenserId = item.dispenserId, entityId = item.entityId, storageId = 0, itemId = num, currentStock = item.currentStock, maxStock = 0, needCount = num3, urgency = 1f, position = item.position, distance = item.distance }); break; } } } } List<DispenserDemand> list7 = new List<DispenserDemand>(list.Count + list2.Count + list3.Count + list6.Count); list7.AddRange(list); list7.AddRange(list2); list7.AddRange(list3); list7.AddRange(list6); list7.Sort(delegate(DispenserDemand a, DispenserDemand b) { int num4 = ((!a.IsMechaSlot) ? (a.IsStationTower ? 2 : ((!a.IsSupplyFetch) ? 1 : 3)) : 0); int value = ((!b.IsMechaSlot) ? (b.IsStationTower ? 2 : ((!b.IsSupplyFetch) ? 1 : 3)) : 0); int num5 = num4.CompareTo(value); if (num5 != 0) { return num5; } if (a.IsStationTower && b.IsStationTower && a.stationId == b.stationId && a.itemId == 1210 && b.itemId == 1210 && a.IsWarperStorageDemand != b.IsWarperStorageDemand) { if (!a.IsWarperStorageDemand) { return 1; } return -1; } int num6 = a.urgency.CompareTo(b.urgency); return (num6 != 0) ? num6 : a.distance.CompareTo(b.distance); }); if (list7.Count == 0) { logistics.lastInventory = new Dictionary<int, int>(baseInventory); return null; } return new DispatchContext(list7, baseInventory, basePosition); } public static int GetDispenserStockPublic(DispenserComponent dispenser, int itemId) { return GetDispenserStock(dispenser, itemId); } private static int GetDispenserStock(DispenserComponent dispenser, int itemId) { try { if (dispenser.storage?.bottomStorage == null) { return 0; } Type type = ((object)dispenser.storage.bottomStorage).GetType(); FieldInfo field = type.GetField("grids", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = type.GetField("nextStorage", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null) { return 0; } int num = 0; for (object obj = dispenser.storage.bottomStorage; obj != null; obj = field2?.GetValue(obj)) { if (field.GetValue(obj) is Array array) { for (int i = 0; i < array.Length; i++) { object value = array.GetValue(i); if (value != null) { FieldInfo field3 = value.GetType().GetField("itemId"); FieldInfo field4 = value.GetType().GetField("count"); int num2 = ((field3 != null) ? ((int)field3.GetValue(value)) : 0); int num3 = ((field4 != null) ? ((int)field4.GetValue(value)) : 0); if (num2 == itemId) { num += num3; } } } } } return num; } catch { return 0; } } private static int GetDispenserMaxStock(DispenserComponent dispenser) { try { if (dispenser.storage?.bottomStorage == null) { return 0; } Type type = ((object)dispenser.storage.bottomStorage).GetType(); FieldInfo field = type.GetField("size", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field2 = type.GetField("bans", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo field3 = type.GetField("nextStorage", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field == null || field2 == null) { return 0; } int num = 0; for (object obj = dispenser.storage.bottomStorage; obj != null; obj = field3?.GetValue(obj)) { int num3 = ((field.GetValue(obj) is int num2) ? num2 : 0); int num5 = ((field2.GetValue(obj) is int num4) ? num4 : 0); num += Math.Max(0, num3 - num5); } if (num == 0) { return 0; } int num6 = 1000; ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(dispenser.filter); if (val != null) { num6 = val.StackSize; } return num * num6; } catch { return 0; } } public static Dictionary<int, int