From dc246170ac2b59e1497adb56d035e3dba34b9a23 Mon Sep 17 00:00:00 2001 From: Soar Qin Date: Thu, 29 May 2025 04:33:37 +0800 Subject: [PATCH] UXAssist: buffer tweaks for ejector and silo --- UXAssist/CHANGELOG.md | 6 ++++ UXAssist/Patches/FactoryPatch.cs | 50 ++++++++++++++++++++++++++++++++ UXAssist/README.md | 4 +++ UXAssist/UI/MyWindow.cs | 16 ++++++++++ UXAssist/UIConfigWindow.cs | 28 +++++++++++++----- UXAssist/UXAssist.cs | 2 ++ 6 files changed, 98 insertions(+), 8 deletions(-) diff --git a/UXAssist/CHANGELOG.md b/UXAssist/CHANGELOG.md index cd3dd5f..65f4bdc 100644 --- a/UXAssist/CHANGELOG.md +++ b/UXAssist/CHANGELOG.md @@ -8,6 +8,9 @@ - Fix a crash on dismantling preview buildings. - Rename to `Shortcut keys for Blueprint Copy mode`, while adding a shortcut key to select all buildings (Ctrl+A by default). + `Allow overflow for Logistic Stations and Advanced Mining Machines`: Working for Logistics Control Panel now. + + `Tweak building buffer`: add buffer tweaking for 2 new buildings + - `Ejector Solar Sails buffer count`: Range 5-400 (step by 5), default is 20 (same as game) + - `Silo Rockets buffer count`: Range 1-20, default is 20 (same as game) * 1.3.5 + `Mod manager profile based save folder`: Fix crash on game startup * 1.3.4 @@ -323,6 +326,9 @@ - 修复了拆除虚影建筑时崩溃的问题 - 重命名为`蓝图复制模式快捷键`,同时添加了选择所有建筑的快捷键(默认为Ctrl+A) + `允许物流站和大型采矿机物品溢出`:现在也适用于物流控制面板 + + `调整建筑缓冲区`:为2个新建筑添加缓冲区调整 + - `弹射太阳帆缓冲区数量`:范围5-400(步进值为5),默认值为20(与游戏相同) + - `发射井火箭缓冲区数量`:范围1-20,默认值为20(与游戏相同) * 1.3.5 + `基于mod管理器配置档案的存档文件夹`:修复游戏启动时崩溃的问题 * 1.3.4 diff --git a/UXAssist/Patches/FactoryPatch.cs b/UXAssist/Patches/FactoryPatch.cs index e2b0d3d..6ebca3b 100644 --- a/UXAssist/Patches/FactoryPatch.cs +++ b/UXAssist/Patches/FactoryPatch.cs @@ -41,6 +41,8 @@ public class FactoryPatch : PatchImpl public static ConfigEntry LabBufferExtraCountForAdvancedAssemble; public static ConfigEntry LabBufferMaxCountForResearch; public static ConfigEntry ReceiverBufferCount; + public static ConfigEntry EjectorBufferCount; + public static ConfigEntry SiloBufferCount; public static ConfigEntry ShortcutKeysForBlueprintCopyEnabled; private static PressKeyBind _doNotRenderEntitiesKey; @@ -126,6 +128,8 @@ public class FactoryPatch : PatchImpl LabBufferExtraCountForAdvancedAssemble.SettingChanged += (_, _) => TweakBuildingBuffer.RefreshLabBufferMaxCountForAssemble(); LabBufferMaxCountForResearch.SettingChanged += (_, _) => TweakBuildingBuffer.RefreshLabBufferMaxCountForResearch(); ReceiverBufferCount.SettingChanged += (_, _) => TweakBuildingBuffer.RefreshReceiverBufferCount(); + EjectorBufferCount.SettingChanged += (_, _) => TweakBuildingBuffer.RefreshEjectorBufferCount(); + SiloBufferCount.SettingChanged += (_, _) => TweakBuildingBuffer.RefreshSiloBufferCount(); } public static void Start() @@ -2053,6 +2057,24 @@ public class FactoryPatch : PatchImpl patch.Patch(AccessTools.Method(typeof(PowerGeneratorComponent), nameof(PowerGeneratorComponent.GameTick_Gamma)), null, null, new HarmonyMethod(typeof(TweakBuildingBuffer), nameof(PowerGeneratorComponent_GameTick_Gamma_Transpiler))); } + public static void RefreshEjectorBufferCount() + { + if (!TweakBuildingBufferEnabled.Value) return; + /* re-patch to use new value */ + var patch = Instance._patch; + patch.Unpatch(AccessTools.Method(typeof(EjectorComponent), nameof(EjectorComponent.InternalUpdate)), AccessTools.Method(typeof(TweakBuildingBuffer), nameof(EjectorComponent_InternalUpdate_Transpiler))); + patch.Patch(AccessTools.Method(typeof(EjectorComponent), nameof(EjectorComponent.InternalUpdate)), null, null, new HarmonyMethod(typeof(TweakBuildingBuffer), nameof(EjectorComponent_InternalUpdate_Transpiler))); + } + + public static void RefreshSiloBufferCount() + { + if (!TweakBuildingBufferEnabled.Value) return; + /* re-patch to use new value */ + var patch = Instance._patch; + patch.Unpatch(AccessTools.Method(typeof(SiloComponent), nameof(SiloComponent.InternalUpdate)), AccessTools.Method(typeof(TweakBuildingBuffer), nameof(SiloComponent_InternalUpdate_Transpiler))); + patch.Patch(AccessTools.Method(typeof(SiloComponent), nameof(SiloComponent.InternalUpdate)), null, null, new HarmonyMethod(typeof(TweakBuildingBuffer), nameof(SiloComponent_InternalUpdate_Transpiler))); + } + [HarmonyTranspiler] [HarmonyPatch(typeof(PowerGeneratorComponent), nameof(PowerGeneratorComponent.GameTick_Gamma))] private static IEnumerable PowerGeneratorComponent_GameTick_Gamma_Transpiler(IEnumerable instructions, ILGenerator generator) @@ -2175,5 +2197,33 @@ public class FactoryPatch : PatchImpl matcher.Repeat(m => m.SetAndAdvance(OpCodes.Ldc_I4, LabBufferMaxCountForResearch.Value * 3600)); return matcher.InstructionEnumeration(); } + + [HarmonyTranspiler] + [HarmonyPatch(typeof(EjectorComponent), nameof(EjectorComponent.InternalUpdate))] + private static IEnumerable EjectorComponent_InternalUpdate_Transpiler(IEnumerable instructions, ILGenerator generator) + { + var matcher = new CodeMatcher(instructions, generator); + matcher.MatchForward(false, + new CodeMatch(OpCodes.Ldarg_0), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(EjectorComponent), nameof(EjectorComponent.bulletCount))), + new CodeMatch(ci => (ci.opcode == OpCodes.Ldc_I4 || ci.opcode == OpCodes.Ldc_I4_S) && ci.OperandIs(20)) + ); + matcher.Advance(2).Set(OpCodes.Ldc_I4, EjectorBufferCount.Value); + return matcher.InstructionEnumeration(); + } + + [HarmonyTranspiler] + [HarmonyPatch(typeof(SiloComponent), nameof(SiloComponent.InternalUpdate))] + private static IEnumerable SiloComponent_InternalUpdate_Transpiler(IEnumerable instructions, ILGenerator generator) + { + var matcher = new CodeMatcher(instructions, generator); + matcher.MatchForward(false, + new CodeMatch(OpCodes.Ldarg_0), + new CodeMatch(OpCodes.Ldfld, AccessTools.Field(typeof(SiloComponent), nameof(SiloComponent.bulletCount))), + new CodeMatch(ci => (ci.opcode == OpCodes.Ldc_I4 || ci.opcode == OpCodes.Ldc_I4_S) && ci.OperandIs(20)) + ); + matcher.Advance(2).Operand = SiloBufferCount.Value; + return matcher.InstructionEnumeration(); + } } } diff --git a/UXAssist/README.md b/UXAssist/README.md index 4b1d33f..2401122 100644 --- a/UXAssist/README.md +++ b/UXAssist/README.md @@ -91,6 +91,8 @@ - `Extra buffer count for Self-evolution Labs`: Range 1-10, default is 3 (same as game) - `Buffer count for researching in labs`: Range 2-20, default is 10 (same as game) - `Ray Receiver Graviton Lens buffer count`: Range 1-20, default is 1 (game default is 20) + - `Ejector Solar Sails buffer count`: Range 5-400 (step by 5), default is 20 (same as game) + - `Silo Rockets buffer count`: Range 1-20, default is 20 (same as game) + Logistics - Enhanced control for logistic storage capacities - Logistic storage capacities are not scaled on upgrading `Logistics Carrier Capacity`, if they are not set to maximum capacity or already greater than maximum capacity. @@ -244,6 +246,8 @@ - `自演化研究站矩阵额外缓冲数量`:范围1-10,默认为3(同游戏) - `研究站科研模式缓存数量`:范围2-20,默认为10(同游戏) - `射线接收器透镜缓冲数量`:范围1-20,默认为1(游戏默认为20) + - `弹射太阳帆缓冲区数量`:范围5-400(步进值为5),默认值为20(与游戏相同) + - `发射井火箭缓冲区数量`:范围1-20,默认值为20(与游戏相同) + 物流 - 物流塔存储数量限制控制改进 - 当升级`运输机舱扩容`时,不会对各种物流塔的存储限制按比例提升,除非设置为最大允许容量或者已经超过升级后的最大容量。 diff --git a/UXAssist/UI/MyWindow.cs b/UXAssist/UI/MyWindow.cs index 2cf4302..c734711 100644 --- a/UXAssist/UI/MyWindow.cs +++ b/UXAssist/UI/MyWindow.cs @@ -248,6 +248,22 @@ public class MyWindow : ManualBehaviour public override int Max => max; } + public class RangeValueWithMultiplierMapper(int min, int max, T multiplier) : ValueMapper + { + public override int Min => min; + public override int Max => max; + + public override T IndexToValue(int index) + { + return (T)Convert.ChangeType((float)index * (float)Convert.ChangeType(multiplier, typeof(float)), typeof(T)); + } + + public override int ValueToIndex(T value) + { + return Mathf.RoundToInt((float)Convert.ChangeType(value, typeof(float)) / (float)Convert.ChangeType(multiplier, typeof(float))); + } + } + private class ArrayMapper : ValueMapper { private readonly T[] _values; diff --git a/UXAssist/UIConfigWindow.cs b/UXAssist/UIConfigWindow.cs index 3dd2994..cb90ff2 100644 --- a/UXAssist/UIConfigWindow.cs +++ b/UXAssist/UIConfigWindow.cs @@ -121,6 +121,8 @@ public static class UIConfigWindow I18N.Add("Extra buffer count for Self-evolution Labs", "Extra buffer count for Self-evolution Labs", "自演化研究站矩阵额外缓冲数量"); I18N.Add("Buffer count for researching in labs", "Buffer count for researching in labs", "研究站科研模式缓存数量"); I18N.Add("Ray Receiver Graviton Lens buffer count", "Ray Receiver Graviton Lens buffer count", "射线接收器透镜缓冲数量"); + I18N.Add("Ejector Solar Sails buffer count", "Ejector Solar Sails buffer count", "弹射器太阳能帆缓冲数量"); + I18N.Add("Silo Rockets buffer count", "Silo Rockets buffer count", "发射井火箭缓冲数量"); I18N.Add("Shortcut keys for Blueprint Copy mode", "Shortcut keys for Blueprint Copy mode", "蓝图复制模式快捷键"); I18N.Add("Shortcut keys for Blueprint Copy mode tips", "You can set 2 shortcut keys in Settings panel:\n 1. Select all buildings\n 2. Dismantle selected buildings", "你可以在设置面板中设置2个快捷键:\n 1. 选择所有建筑\n 2. 拆除选中的建筑"); I18N.Add("Shortcut keys for showing stars' name", "Shortcut keys for showing stars' name", "启用显示所有星系名称的快捷键"); @@ -470,19 +472,29 @@ public static class UIConfigWindow y += 27f; txt = wnd.AddText2(x + 20f, y, tab2, "Ray Receiver Graviton Lens buffer count", 13); var nx6 = txt.preferredWidth + 5f; - y -= 135f; - var mx = Mathf.Max(nx1, nx2, nx3, nx4, nx5, nx6) + 20f; - var assemblerBufferTimeMultiplierSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.AssemblerBufferTimeMultiplier, new MyWindow.RangeValueMapper(2, 10), "0", 80f).WithSmallerHandle(); y += 27f; - var assemblerBufferMininumMultiplierSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.AssemblerBufferMininumMultiplier, new MyWindow.RangeValueMapper(2, 10), "0", 80f).WithSmallerHandle(); + txt = wnd.AddText2(x + 20f, y, tab2, "Ejector Solar Sails buffer count", 13); + var nx7 = txt.preferredWidth + 5f; y += 27f; - var labBufferMaxCountForAssembleSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferMaxCountForAssemble, new MyWindow.RangeValueMapper(2, 20), "0", 80f).WithSmallerHandle(); + txt = wnd.AddText2(x + 20f, y, tab2, "Silo Rockets buffer count", 13); + var nx8 = txt.preferredWidth + 5f; + y -= 189f; + var mx = Mathf.Max(nx1, nx2, nx3, nx4, nx5, nx6, nx7, nx8) + 20f; + var assemblerBufferTimeMultiplierSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.AssemblerBufferTimeMultiplier, new MyWindow.RangeValueMapper(2, 10), "0", 120f).WithSmallerHandle(); y += 27f; - var labBufferExtraCountForAdvancedAssembleSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferExtraCountForAdvancedAssemble, new MyWindow.RangeValueMapper(1, 10), "0", 80f).WithSmallerHandle(); + var assemblerBufferMininumMultiplierSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.AssemblerBufferMininumMultiplier, new MyWindow.RangeValueMapper(2, 10), "0", 120f).WithSmallerHandle(); y += 27f; - var labBufferMaxCountForResearchSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferMaxCountForResearch, new MyWindow.RangeValueMapper(2, 20), "0", 80f).WithSmallerHandle(); + var labBufferMaxCountForAssembleSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferMaxCountForAssemble, new MyWindow.RangeValueMapper(2, 20), "0", 120f).WithSmallerHandle(); y += 27f; - var receiverBufferCountSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.ReceiverBufferCount, new MyWindow.RangeValueMapper(1, 20), "0", 80f).WithSmallerHandle(); + var labBufferExtraCountForAdvancedAssembleSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferExtraCountForAdvancedAssemble, new MyWindow.RangeValueMapper(1, 10), "0", 120f).WithSmallerHandle(); + y += 27f; + var labBufferMaxCountForResearchSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.LabBufferMaxCountForResearch, new MyWindow.RangeValueMapper(2, 20), "0", 120f).WithSmallerHandle(); + y += 27f; + var receiverBufferCountSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.ReceiverBufferCount, new MyWindow.RangeValueMapper(1, 20), "0", 120f).WithSmallerHandle(); + y += 27f; + var ejectorBufferCountSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.EjectorBufferCount, new MyWindow.RangeValueWithMultiplierMapper(1, 80, 5), "0", 120f).WithSmallerHandle(); + y += 27f; + var siloBufferCountSlider = wnd.AddSlider(x + mx, y + 5f, tab2, FactoryPatch.SiloBufferCount, new MyWindow.RangeValueMapper(1, 40), "0", 120f).WithSmallerHandle(); FactoryPatch.TweakBuildingBufferEnabled.SettingChanged += TweakBuildingBufferChanged; wnd.OnFree += () => { FactoryPatch.TweakBuildingBufferEnabled.SettingChanged -= TweakBuildingBufferChanged; }; TweakBuildingBufferChanged(null, null); diff --git a/UXAssist/UXAssist.cs b/UXAssist/UXAssist.cs index 0591df7..d2a54ff 100644 --- a/UXAssist/UXAssist.cs +++ b/UXAssist/UXAssist.cs @@ -134,6 +134,8 @@ public class UXAssist : BaseUnityPlugin, IModCanSave FactoryPatch.LabBufferExtraCountForAdvancedAssemble = Config.Bind("Factory", "LabBufferExtraCountForAdvancedAssemble", 3, new ConfigDescription("Extra buffer count for Self-evolution Labs", new AcceptableValueRange(1, 10))); FactoryPatch.LabBufferMaxCountForResearch = Config.Bind("Factory", "LabBufferMaxCountForResearch", 10, new ConfigDescription("Buffer count for researching in labs", new AcceptableValueRange(2, 20))); FactoryPatch.ReceiverBufferCount = Config.Bind("Factory", "ReceiverBufferCount", 1, new ConfigDescription("Ray Receiver Graviton Lens buffer count", new AcceptableValueRange(1, 20))); + FactoryPatch.EjectorBufferCount = Config.Bind("Factory", "EjectorBufferCount", 1, new ConfigDescription("Ejector buffer count", new AcceptableValueRange(5, 400))); + FactoryPatch.SiloBufferCount = Config.Bind("Factory", "SiloBufferCount", 1, new ConfigDescription("Silo buffer count", new AcceptableValueRange(1, 40))); FactoryPatch.ShortcutKeysForBlueprintCopyEnabled = Config.Bind("Factory", "DismantleBlueprintSelection", false, "Dismantle blueprint selected buildings"); LogisticsPatch.AutoConfigLogisticsEnabled = Config.Bind("Factory", "AutoConfigLogistics", false,