diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java index a9f1f7e..bd91cd0 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java @@ -10,6 +10,7 @@ import com.extendedae_plus.init.ModNetwork; import com.extendedae_plus.network.provider.SetPerProviderScalingLimitC2SPacket; import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket; import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket; +import com.extendedae_plus.util.GuiUtil; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Tooltip; @@ -105,32 +106,14 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen { + this.eap$PerProviderScalingLimit = limit; + ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); + }); this.addRenderableWidget(this.eap$PerProviderLimitInput); } - /** 输入框内容变化时调用 */ - @Unique - private void eap$handleLimitChanged(String s) { - try { - // 去除前导0,空字符串视为0 - String sValue = (s == null || s.isBlank()) ? "0" : s.replaceFirst("^0+(?=.)", ""); - if (!sValue.equals(s)) { - this.eap$PerProviderLimitInput.setValue(sValue); - } - int limit = Integer.parseInt(sValue); - // 只有变化时才发送同步包 - if (limit != this.eap$PerProviderScalingLimit) { - this.eap$PerProviderScalingLimit = limit; - ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); - } - } catch (Throwable ignored) {} - } - /* ---------------------------- 注入点 ---------------------------- */ @Inject(method = "", at = @At("RETURN")) private void eap$onInit(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/SmallAdvPatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/SmallAdvPatternProviderScreenMixin.java index 7b945bb..c3ee958 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/SmallAdvPatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/SmallAdvPatternProviderScreenMixin.java @@ -10,6 +10,7 @@ import com.extendedae_plus.init.ModNetwork; import com.extendedae_plus.network.provider.SetPerProviderScalingLimitC2SPacket; import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket; import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket; +import com.extendedae_plus.util.GuiUtil; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Tooltip; @@ -106,32 +107,14 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen { + this.eap$PerProviderScalingLimit = limit; + ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); + }); this.addRenderableWidget(this.eap$PerProviderLimitInput); } - /** 输入框内容变化时调用 */ - @Unique - private void eap$handleLimitChanged(String s) { - try { - // 去除前导0,空字符串视为0 - String sValue = (s == null || s.isBlank()) ? "0" : s.replaceFirst("^0+(?=.)", ""); - if (!sValue.equals(s)) { - this.eap$PerProviderLimitInput.setValue(sValue); - } - int limit = Integer.parseInt(sValue); - // 只有变化时才发送同步包 - if (limit != this.eap$PerProviderScalingLimit) { - this.eap$PerProviderScalingLimit = limit; - ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); - } - } catch (Throwable ignored) {} - } - /* ---------------------------- 注入点 ---------------------------- */ @Inject(method = "", at = @At("RETURN")) private void eap$onInit(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java index 1ab9c66..ade5cc3 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java @@ -13,6 +13,7 @@ import com.extendedae_plus.init.ModNetwork; import com.extendedae_plus.network.provider.SetPerProviderScalingLimitC2SPacket; import com.extendedae_plus.network.provider.ToggleAdvancedBlockingC2SPacket; import com.extendedae_plus.network.provider.ToggleSmartDoublingC2SPacket; +import com.extendedae_plus.util.GuiUtil; import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; @@ -108,32 +109,14 @@ public abstract class PatternProviderScreenMixin this.eap$SmartDoublingToggle.set(eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO); this.addToLeftToolbar(this.eap$SmartDoublingToggle); - // 缩放上限输入框 - this.eap$PerProviderLimitInput = new EditBox(this.font, 0, 0, 28, 12, Component.literal("Limit")); - this.eap$PerProviderLimitInput.setMaxLength(6); - this.eap$PerProviderLimitInput.setValue(String.valueOf(eap$PerProviderScalingLimit)); - this.eap$PerProviderLimitInput.setResponder(this::eap$handleLimitChanged); + // 缩放上限输入框(使用 GuiUtil 抽离) + this.eap$PerProviderLimitInput = GuiUtil.createPerProviderLimitInput(this.font, this.eap$PerProviderScalingLimit, limit -> { + this.eap$PerProviderScalingLimit = limit; + ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); + }); this.addRenderableWidget(this.eap$PerProviderLimitInput); } - /** 输入框内容变化时调用 */ - @Unique - private void eap$handleLimitChanged(String s) { - try { - // 去除前导0,空字符串视为0 - String sValue = (s == null || s.isBlank()) ? "0" : s.replaceFirst("^0+(?=.)", ""); - if (!sValue.equals(s)) { - this.eap$PerProviderLimitInput.setValue(sValue); - } - int limit = Integer.parseInt(sValue); - // 只有变化时才发送同步包 - if (limit != this.eap$PerProviderScalingLimit) { - this.eap$PerProviderScalingLimit = limit; - ModNetwork.CHANNEL.sendToServer(new SetPerProviderScalingLimitC2SPacket(limit)); - } - } catch (Throwable ignored) {} - } - /* ---------------------------- 注入点 ---------------------------- */ @Inject(method = "", at = @At("RETURN")) private void eap$onInit(C menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { diff --git a/src/main/java/com/extendedae_plus/util/GuiUtil.java b/src/main/java/com/extendedae_plus/util/GuiUtil.java index e56393b..4425d64 100644 --- a/src/main/java/com/extendedae_plus/util/GuiUtil.java +++ b/src/main/java/com/extendedae_plus/util/GuiUtil.java @@ -9,6 +9,7 @@ import appeng.client.gui.me.patternaccess.PatternSlot; import appeng.client.gui.widgets.SettingToggleButton; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.Slot; @@ -17,6 +18,7 @@ import net.minecraft.world.item.ItemStack; import java.util.List; import java.util.Set; import java.util.function.Supplier; +import java.util.function.IntConsumer; /** @@ -204,4 +206,27 @@ public class GuiUtil { } }; } + + /** + * 创建用于每个提供者缩放上限的输入框,包含值清洗与回调处理 + * @param font 字体对象 + * @param initialValue 初始数值 + * @param onCommit 当值解析成功后回调(以 int 形式提供) + */ + public static EditBox createPerProviderLimitInput(Font font, int initialValue, IntConsumer onCommit) { + EditBox input = new EditBox(font, 0, 0, 28, 12, Component.literal("Limit")); + input.setMaxLength(6); + input.setValue(String.valueOf(initialValue)); + input.setResponder(s -> { + try { + String sValue = (s == null || s.isBlank()) ? "0" : s.replaceFirst("^0+(?=.)", ""); + if (!sValue.equals(s)) { + input.setValue(sValue); + } + int limit = Integer.parseInt(sValue); + onCommit.accept(limit); + } catch (Throwable ignored) {} + }); + return input; + } } \ No newline at end of file