using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UXAssist.Common; using UXAssist.UI; using UnityEngine; using UnityEngine.UI; [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("InterstellarLogisticsOpt")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Phase-disperses interstellar logistics scheduling to flatten CPU spikes / 相位分散星际物流调度以削平卡顿")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+64d7bfc247046795d471f498ffb90a266d243cdc")] [assembly: AssemblyProduct("InterstellarLogisticsOpt")] [assembly: AssemblyTitle("InterstellarLogisticsOpt")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace InterstellarLogisticsOpt { [BepInPlugin("org.fyyy.interstellarlogisticsopt", "InterstellarLogisticsOpt", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class InterstellarLogisticsOptPlugin : BaseUnityPlugin { private static class GalacticTransportPatch { [HarmonyPrefix] [HarmonyPatch(typeof(GalacticTransport), "GameTick")] private static bool GameTick_Prefix(GalacticTransport __instance, long time) { //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Invalid comparison between Unknown and I4 //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Invalid comparison between Unknown and I4 //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Invalid comparison between Unknown and I4 //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Invalid comparison between Unknown and I4 //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Invalid comparison between Unknown and I4 if (!ModEnabled.Value) { return true; } int value = AmortizeFactor.Value; if (value <= 1) { return true; } GameData gameData = __instance.gameData; GalaxyData galaxy = gameData.galaxy; GameHistoryData history = gameData.history; PlanetFactory[] factories = gameData.factories; FactoryProductionStat[] factoryStatPool = gameData.statistics.production.factoryStatPool; TrafficStatistics traffic = gameData.statistics.traffic; float logisticShipSailSpeedModified = history.logisticShipSailSpeedModified; float num = (history.logisticShipWarpDrive ? history.logisticShipWarpSpeedModified : logisticShipSailSpeedModified); int logisticShipCarries = history.logisticShipCarries; StationComponent[] stationPool = __instance.stationPool; int stationCursor = __instance.stationCursor; for (int i = 1; i < 7; i++) { int num2 = i % 6; int num3; switch (i) { default: num3 = 60; break; case 2: case 3: num3 = 30; break; case 1: num3 = 10; break; } int num4 = num3 * value; int num5 = (int)(time % num4); for (int j = 1 + num5; j < stationCursor; j += num4) { StationComponent val = stationPool[j]; if (val != null && val.id > 0 && val.gid == j) { if (num2 >= 1 && num2 <= 4 && ((int)val.routePriority == 2 || (int)val.routePriority == 3 || (int)val.routePriority == 4)) { val.DetermineDispatch(logisticShipSailSpeedModified, num, logisticShipCarries, num2, stationPool, factoryStatPool, factories, galaxy, traffic); } else if (num2 == 5 && (int)val.routePriority == 2) { val.DetermineDispatch(logisticShipSailSpeedModified, num, logisticShipCarries, num2, stationPool, factoryStatPool, factories, galaxy, traffic); } else if (num2 == 0 && (int)val.routePriority == 1) { val.DetermineDispatch(logisticShipSailSpeedModified, num, logisticShipCarries, num2, stationPool, factoryStatPool, factories, galaxy, traffic); } } } } return false; } } private static class DispatchPatch { [HarmonyPrefix] [HarmonyPatch(typeof(StationComponent), "DetermineDispatch")] private static bool DetermineDispatch_Prefix(StationComponent __instance) { if (!ModEnabled.Value) { return true; } if (__instance.idleShipCount == 0 || __instance.energy <= 6000000) { return false; } return true; } } private static class UIConfig { public static void Init() { I18N.Add("InterstellarLogisticsOpt", "InterstellarLogisticsOpt", "星际物流优化"); I18N.Add("Phase-disperse interstellar logistics scheduling", "Phase-disperse interstellar logistics scheduling", "相位分散星际物流调度以削平卡顿"); I18N.Add("Amortize factor (simulated frames)", "Amortize factor (simulated frames)", "调度间隔系数(模拟帧)"); I18N.Apply(); MyConfigWindow.OnUICreated = (Action)Delegate.Combine(MyConfigWindow.OnUICreated, new Action(CreateUI)); } private static void CreateUI(MyConfigWindow wnd, RectTransform trans) { ((MyWindowWithTabs)wnd).AddSplitter(trans, 10f); ((MyWindowWithTabs)wnd).AddTabGroup(trans, "InterstellarLogisticsOpt", "tab-group-interstellarlogisticsopt"); RectTransform val = ((MyWindowWithTabs)wnd).AddTab(trans, "InterstellarLogisticsOpt"); float num = 10f; ((MyWindow)wnd).AddCheckBox(0f, num, val, ModEnabled, "Phase-disperse interstellar logistics scheduling", 15); num += 36f; Text val2 = ((MyWindow)wnd).AddText2(0f, num + 5f, val, "Amortize factor (simulated frames)", 14, "label"); ((MyWindow)wnd).AddSlider(0f + val2.preferredWidth + 10f, num, val, AmortizeFactor, (ValueMapper)(object)new RangeValueMapper(1, 30), "0", 200f).WithSmallerHandle(10f, 0f); } } public static readonly ManualLogSource Logger = Logger.CreateLogSource("InterstellarLogisticsOpt"); public static ConfigEntry ModEnabled; public static ConfigEntry AmortizeFactor; private Harmony _harmony; private void Awake() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown ModEnabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Phase-disperse interstellar logistics scheduling to flatten CPU spikes / 相位分散星际物流调度以削平卡顿"); AmortizeFactor = ((BaseUnityPlugin)this).Config.Bind("General", "AmortizeFactor", 1, new ConfigDescription("Scheduling amortization (\"simulated frames\"). 1 = off: runs the vanilla scheduler unchanged (recommended baseline). 2+ enables phase-dispersed amortization — each tower is scheduled every period*factor ticks (e.g. 5 = every 50/150/300 instead of 10/30/60), cutting total CPU at the cost of logistics responsiveness; load stays evenly spread across ticks (no spikes). Requires Enabled = true. / 调度平摊系数(\"模拟帧\")。1=关闭:原版调度逻辑不变(推荐基线)。2 及以上启用相位分散平摊——每塔改为每 period*factor tick 调度一次(如 5 = 每 50/150/300 而非 10/30/60),用调度响应速度换取更低的总 CPU,且负载仍逐帧平摊不产生尖峰。需 Enabled=true。", (AcceptableValueBase)(object)new AcceptableValueRange(1, 30), Array.Empty())); _harmony = new Harmony("org.fyyy.interstellarlogisticsopt"); _harmony.PatchAll(typeof(GalacticTransportPatch)); _harmony.PatchAll(typeof(DispatchPatch)); UIConfig.Init(); Logger.LogInfo((object)"InterstellarLogisticsOpt loaded."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } public static class PluginInfo { public const string PLUGIN_GUID = "org.fyyy.interstellarlogisticsopt"; public const string PLUGIN_NAME = "InterstellarLogisticsOpt"; public const string PLUGIN_VERSION = "1.1.0"; } }