diff --git a/src/main/java/com/extendedae_plus/client/ModConfigScreen.java b/src/main/java/com/extendedae_plus/client/ModConfigScreen.java index 3780f02..62ffe64 100644 --- a/src/main/java/com/extendedae_plus/client/ModConfigScreen.java +++ b/src/main/java/com/extendedae_plus/client/ModConfigScreen.java @@ -16,6 +16,7 @@ public class ModConfigScreen extends Screen { private EditBox pageMultiplierBox; private EditBox wirelessMaxRangeBox; private CycleButton crossDimToggle; + private CycleButton providerRoundRobinToggle; public ModConfigScreen(Screen parent) { super(Component.translatable("screen.extendedae_plus.title")); @@ -48,11 +49,11 @@ public class ModConfigScreen extends Screen { row++; // cross dim toggle - crossDimToggle = this.addRenderableWidget( - CycleButton.onOffBuilder(ModConfigs.WIRELESS_CROSS_DIM_ENABLE.get()) - .create(rightX, y + row * rowHeight, boxWidth, 20, Component.translatable("config.extendedae_plus.wirelessCrossDimEnable"), - (b, v) -> {}) - ); + crossDimToggle = this.addRenderableWidget(createToggle(rightX, y + row * rowHeight, boxWidth, 20, ModConfigs.WIRELESS_CROSS_DIM_ENABLE.get())); + row++; + + // provider round-robin toggle (smart doubling) + providerRoundRobinToggle = this.addRenderableWidget(createToggle(rightX, y + row * rowHeight, boxWidth, 20, ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.get())); row++; // 按钮:保存、返回 @@ -74,16 +75,26 @@ public class ModConfigScreen extends Screen { int pageMul = clamp(parseIntOrDefault(pageMultiplierBox.getValue(), ModConfigs.PAGE_MULTIPLIER.get()), 1, 64); double maxRange = clamp(parseDoubleOrDefault(wirelessMaxRangeBox.getValue(), ModConfigs.WIRELESS_MAX_RANGE.get()), 1.0, 4096.0); boolean crossDim = crossDimToggle.getValue(); + boolean providerRoundRobin = providerRoundRobinToggle.getValue(); // 应用到 Forge 配置值 ModConfigs.PAGE_MULTIPLIER.set(pageMul); ModConfigs.WIRELESS_MAX_RANGE.set(maxRange); ModConfigs.WIRELESS_CROSS_DIM_ENABLE.set(crossDim); + ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.set(providerRoundRobin); // Forge 会在合适的时机写回到配置文件;部分改动可能需要重启游戏或世界才完全生效 onClose(); } + // Helper to create a boolean on/off CycleButton which shows localized on/off text + private CycleButton createToggle(int x, int y, int width, int height, boolean initial) { + CycleButton btn = CycleButton.onOffBuilder(initial) + .create(x, y, width, height, Component.empty(), (b, v) -> b.setMessage(Component.translatable(v ? "config.extendedae_plus.state_on" : "config.extendedae_plus.state_off"))); + btn.setMessage(Component.translatable(initial ? "config.extendedae_plus.state_on" : "config.extendedae_plus.state_off")); + return btn; + } + @Override public void onClose() { Minecraft.getInstance().setScreen(parent); @@ -107,6 +118,7 @@ public class ModConfigScreen extends Screen { g.drawString(this.font, Component.translatable("config.extendedae_plus.pageMultiplier_with_range"), leftX, y + 0 * rowHeight + 6, labelColor, false); g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessMaxRange_with_range"), leftX, y + 1 * rowHeight + 6, labelColor, false); g.drawString(this.font, Component.translatable("config.extendedae_plus.wirelessCrossDimEnable"), leftX, y + 2 * rowHeight + 6, labelColor, false); + g.drawString(this.font, Component.translatable("config.extendedae_plus.providerRoundRobinEnable"), leftX, y + 3 * rowHeight + 6, labelColor, false); } private static int parseIntOrDefault(String s, int def) { diff --git a/src/main/java/com/extendedae_plus/config/ModConfigs.java b/src/main/java/com/extendedae_plus/config/ModConfigs.java index 4a1409b..8689d7e 100644 --- a/src/main/java/com/extendedae_plus/config/ModConfigs.java +++ b/src/main/java/com/extendedae_plus/config/ModConfigs.java @@ -7,6 +7,7 @@ public final class ModConfigs { public static final ForgeConfigSpec.IntValue PAGE_MULTIPLIER; public static final ForgeConfigSpec.DoubleValue WIRELESS_MAX_RANGE; public static final ForgeConfigSpec.BooleanValue WIRELESS_CROSS_DIM_ENABLE; + public static final ForgeConfigSpec.BooleanValue PROVIDER_ROUND_ROBIN_ENABLE; static { ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder(); @@ -32,6 +33,15 @@ public final class ModConfigs { "是否允许无线收发器跨维度建立连接", "开启后,从端可连接到不同维度的主端(忽略距离限制)") .define("wirelessCrossDimEnable", true); + + // 智能倍增后,是否在样板供应器间轮询分配请求量(开启:按 provider 均分;关闭:不拆分) + PROVIDER_ROUND_ROBIN_ENABLE = builder + .comment( + "智能倍增时是否对样板供应器轮询分配", + "仅多个供应器有相同样板时生效,开启后请求会均分到所有可用供应器,关闭则全部分配给单一供应器", + "注意:所有相关供应器需开启智能倍增,否则可能失效", + "默认: true") + .define("providerRoundRobinEnable", true); builder.pop(); COMMON_SPEC = builder.build(); } diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java index 1f25da5..9311e06 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java @@ -12,6 +12,7 @@ import appeng.me.service.CraftingService; import com.extendedae_plus.api.SmartDoublingAwarePattern; import com.extendedae_plus.content.ScaledProcessingPattern; import com.extendedae_plus.util.PatternScaler; +import com.extendedae_plus.config.ModConfigs; import com.extendedae_plus.util.RequestedAmountHolder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -55,26 +56,34 @@ public abstract class CraftingTreeProcessMixin { AEKey parentTarget = parentAcc.eap$getWhat(); long requested = RequestedAmountHolder.get(); - CraftingService craftingService = (CraftingService) cc; - Iterable providers = craftingService.getProviders(original); - - // 计算 provider 数量;尝试用反射读取内部 providers 列表以避免消费迭代器 - int size; - try { - var cls = providers.getClass(); - var f = cls.getDeclaredField("providers"); // private ArrayList - f.setAccessible(true); - List list = (List) f.get(providers); - size = list == null ? 0 : list.size(); - } catch (Exception ex) { - // 反射失败回退为遍历计数(会消费迭代器) - size = (int) StreamSupport.stream(providers.spliterator(), false).count(); - } - // 将 requested 在 providers 间均分,向上取整保证每个 provider 分配整数且总量不少于 requested + // 根据配置决定是否在 provider 间轮询分配请求量(默认开启) long perProvider = 1L; - if (size > 0) { - perProvider = requested / size + ((requested % size) == 0 ? 0 : 1); + if (!ModConfigs.PROVIDER_ROUND_ROBIN_ENABLE.get()) { + // 关闭轮询:直接使用完整请求量,不需要查询 provider 列表 + perProvider = requested; if (perProvider <= 0) perProvider = 1L; + } else { + CraftingService craftingService = (CraftingService) cc; + Iterable providers = craftingService.getProviders(original); + + // 计算 provider 数量;尝试用反射读取内部 providers 列表以避免消费迭代器 + int size; + try { + var cls = providers.getClass(); + var f = cls.getDeclaredField("providers"); // private ArrayList + f.setAccessible(true); + List list = (List) f.get(providers); + size = list == null ? 0 : list.size(); + } catch (Exception ex) { + // 反射失败回退为遍历计数(会消费迭代器) + size = (int) StreamSupport.stream(providers.spliterator(), false).count(); + } + + // 将 requested 在 providers 间均分,向上取整保证每个 provider 分配整数且总量不少于 requested + if (size > 0) { + perProvider = requested / size + ((requested % size) == 0 ? 0 : 1); + if (perProvider <= 0) perProvider = 1L; + } } // 使用每-provider 的分配量来缩放样板 diff --git a/src/main/resources/assets/extendedae_plus/lang/en_us.json b/src/main/resources/assets/extendedae_plus/lang/en_us.json index 5a2adf2..3a7c889 100644 --- a/src/main/resources/assets/extendedae_plus/lang/en_us.json +++ b/src/main/resources/assets/extendedae_plus/lang/en_us.json @@ -25,4 +25,14 @@ "extendedae_plus.tooltip.frequency": "Frequency: %d", "extendedae_plus.tooltip.master_mode": "Mode: %s", "extendedae_plus.tooltip.locked": "Locked: %s" + , + "screen.extendedae_plus.title": "ExtendedAE Plus Config", + "config.extendedae_plus.pageMultiplier": "Pattern Provider Page Multiplier", + "config.extendedae_plus.pageMultiplier_with_range": "Pattern Provider Page Multiplier (1-64)", + "config.extendedae_plus.wirelessMaxRange": "Wireless Max Range", + "config.extendedae_plus.wirelessMaxRange_with_range": "Wireless Max Range (1-4096)", + "config.extendedae_plus.wirelessCrossDimEnable": "Allow Wireless Cross-Dimension", + "config.extendedae_plus.providerRoundRobinEnable": "Enable Provider Round-Robin (Smart Doubling)", + "config.extendedae_plus.state_on": "On", + "config.extendedae_plus.state_off": "Off" } \ No newline at end of file diff --git a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json index e8db96c..8d1a562 100644 --- a/src/main/resources/assets/extendedae_plus/lang/zh_cn.json +++ b/src/main/resources/assets/extendedae_plus/lang/zh_cn.json @@ -44,6 +44,9 @@ "config.extendedae_plus.wirelessMaxRange": "无线最大距离", "config.extendedae_plus.wirelessMaxRange_with_range": "无线最大距离 (1-4096)", "config.extendedae_plus.wirelessCrossDimEnable": "无线收发器允许跨维度连接", + "config.extendedae_plus.providerRoundRobinEnable": "启用样板供应器轮询分配(智能翻倍)", + "config.extendedae_plus.state_on": "开", + "config.extendedae_plus.state_off": "关", "block.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "item.extendedae_plus.network_pattern_controller": "样板供应器状态控制器", "gui.extendedae_plus.global.toggle_blocking": "切换阻挡模式",