feat:添加样板供应器轮询配置
This commit is contained in:
parent
7cb9fda3f1
commit
86fa1e47e6
|
|
@ -16,6 +16,7 @@ public class ModConfigScreen extends Screen {
|
|||
private EditBox pageMultiplierBox;
|
||||
private EditBox wirelessMaxRangeBox;
|
||||
private CycleButton<Boolean> crossDimToggle;
|
||||
private CycleButton<Boolean> 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<Boolean> createToggle(int x, int y, int width, int height, boolean initial) {
|
||||
CycleButton<Boolean> 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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ICraftingProvider> providers = craftingService.getProviders(original);
|
||||
|
||||
// 计算 provider 数量;尝试用反射读取内部 providers 列表以避免消费迭代器
|
||||
int size;
|
||||
try {
|
||||
var cls = providers.getClass();
|
||||
var f = cls.getDeclaredField("providers"); // private ArrayList<ICraftingProvider>
|
||||
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<ICraftingProvider> providers = craftingService.getProviders(original);
|
||||
|
||||
// 计算 provider 数量;尝试用反射读取内部 providers 列表以避免消费迭代器
|
||||
int size;
|
||||
try {
|
||||
var cls = providers.getClass();
|
||||
var f = cls.getDeclaredField("providers"); // private ArrayList<ICraftingProvider>
|
||||
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 的分配量来缩放样板
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
|
|
@ -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": "切换阻挡模式",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user