From 46781d485f2763e1f9e900d049c2a2e390927957 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Tue, 25 Nov 2025 17:13:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Daae=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E6=99=BA=E8=83=BD=E5=80=8D=E5=A2=9E=E6=8C=89=E9=92=AE=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=88=87=E6=8D=A2=E6=97=A0=E6=95=88=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=88=E4=BB=85=E6=98=BE=E7=A4=BA=EF=BC=89;=20?= =?UTF-8?q?=E5=85=A8=E9=9D=A2=E6=9B=BF=E6=8D=A2aae=E4=BE=9B=E5=BA=94?= =?UTF-8?q?=E5=99=A8=E6=99=BA=E8=83=BD=E5=8A=9F=E8=83=BD=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E4=B8=BA=E5=86=85=E7=BD=AE=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/AdvPatternProviderScreenMixin.java | 138 ------------------ .../AdvPatternProviderSmartFeaturesMixin.java | 52 +++++++ .../SmallAdvPatternProviderScreenMixin.java | 108 ++------------ .../AdvPatternProviderLogicAdvancedMixin.java | 88 +++++++---- .../AdvPatternProviderLogicDoublingMixin.java | 84 ++++++----- .../AdvPatternProviderMenuAdvancedMixin.java | 27 ++-- .../AdvPatternProviderMenuDoublingMixin.java | 23 +-- .../resources/extendedae_plus.mixins.json | 2 +- 8 files changed, 178 insertions(+), 344 deletions(-) delete mode 100644 src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderSmartFeaturesMixin.java 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 deleted file mode 100644 index dc5f39a..0000000 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.extendedae_plus.mixin.advancedae.client.gui; - -import appeng.api.config.Settings; -import appeng.api.config.YesNo; -import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.SettingToggleButton; -import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync; -import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync; -import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; -import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.pedroksl.advanced_ae.client.gui.AdvPatternProviderScreen; -import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; - -/** - * 为高级ae样板供应器界面添加“高级阻挡模式”按钮。 - * - 位于左侧工具栏 - * - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定 - */ -@Mixin(AdvPatternProviderScreen.class) -public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen { - - @Unique - private SettingToggleButton eap$AdvancedBlockingToggle; - - @Unique - private boolean eap$AdvancedBlockingEnabled = false; - - @Unique - private SettingToggleButton eap$SmartDoublingToggle; - - @Unique - private boolean eap$SmartDoublingEnabled = false; - - public AdvPatternProviderScreenMixin(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) { - super(menu, playerInventory, title, style); - } - - @Inject(method = "", at = @At("RETURN")) - private void eap$initAdvancedBlocking(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { - // 使用 @GuiSync 初始化 - try { - if (menu instanceof IPatternProviderMenuAdvancedSync sync) { - this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced(); - } - } catch (Throwable t) { - LOGGER.error("Error initializing advanced sync", t); - } - - // 使用 SettingToggleButton 的外观(原版图标),但自定义悬停描述为“智能阻挡” - this.eap$AdvancedBlockingToggle = new SettingToggleButton<>( - Settings.BLOCKING_MODE, - this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO, - (btn, backwards) -> { - // 不做本地切换,点击仅发送自定义C2S,显示由@GuiSync回传 - var conn = Minecraft.getInstance().getConnection(); - if (conn != null) conn.send(ToggleAdvancedBlockingC2SPacket.INSTANCE); - } - ) { - @Override - public java.util.List getTooltipMessage() { - boolean enabled = eap$AdvancedBlockingEnabled; - var title = Component.literal("智能阻挡"); - var line = enabled - ? Component.literal("已启用:对于同一种配方将不再阻挡(需要开启原版的阻挡模式)") - : Component.literal("已禁用:这么好的功能为什么不打开呢"); - return java.util.List.of(title, line); - } - }; - // 初始化后立刻对齐当前@GuiSync状态,避免首帧显示不一致 - this.eap$AdvancedBlockingToggle.set(this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO); - - this.addToLeftToolbar(this.eap$AdvancedBlockingToggle); - - // 智能翻倍按钮:与高级阻挡同款样式,点击仅发送C2S,状态由@GuiSync驱动 - try { - if (menu instanceof IPatternProviderMenuDoublingSync sync2) { - this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced(); - } - } catch (Throwable t) { - LOGGER.error("Error initializing smart doubling sync", t); - } - - this.eap$SmartDoublingToggle = new SettingToggleButton<>( - Settings.BLOCKING_MODE, - this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO, - (btn, backwards) -> { - var conn = Minecraft.getInstance().getConnection(); - if (conn != null) conn.send(ToggleSmartDoublingC2SPacket.INSTANCE); - } - ) { - @Override - public java.util.List getTooltipMessage() { - boolean enabled = eap$SmartDoublingEnabled; - var title = Component.literal("智能翻倍"); - var line = enabled - ? Component.literal("已启用:根据请求量对处理样板进行智能缩放") - : Component.literal("已禁用:按原始样板数量进行发配"); - return java.util.List.of(title, line); - } - }; - - this.eap$SmartDoublingToggle.set(this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO); - this.addToLeftToolbar(this.eap$SmartDoublingToggle); - } - - // 每帧刷新:仅从菜单(@GuiSync)同步布尔值,保持按钮状态一致 - @Inject(method = "updateBeforeRender", at = @At("HEAD"), remap = false) - private void eap$updateAdvancedBlocking(CallbackInfo ci) { - if (this.eap$AdvancedBlockingToggle != null) { - boolean desired = this.eap$AdvancedBlockingEnabled; - if (this.menu instanceof IPatternProviderMenuAdvancedSync sync) { - desired = sync.eap$getAdvancedBlockingSynced(); - } - this.eap$AdvancedBlockingEnabled = desired; - this.eap$AdvancedBlockingToggle.set(desired ? YesNo.YES : YesNo.NO); - } - - if (this.eap$SmartDoublingToggle != null) { - boolean desired2 = this.eap$SmartDoublingEnabled; - if (this.menu instanceof IPatternProviderMenuDoublingSync sync2) { - desired2 = sync2.eap$getSmartDoublingSynced(); - } - this.eap$SmartDoublingEnabled = desired2; - this.eap$SmartDoublingToggle.set(desired2 ? YesNo.YES : YesNo.NO); - } - } -} diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderSmartFeaturesMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderSmartFeaturesMixin.java new file mode 100644 index 0000000..28060ae --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderSmartFeaturesMixin.java @@ -0,0 +1,52 @@ +package com.extendedae_plus.mixin.advancedae.client.gui; + +import appeng.api.config.YesNo; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync; +import com.extendedae_plus.api.config.EAPSettings; +import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync; +import com.extendedae_plus.client.gui.widgets.EAPServerSettingToggleButton; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.pedroksl.advanced_ae.client.gui.AdvPatternProviderScreen; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * 为高级ae样板供应器界面添加“高级阻挡模式”按钮。 + * - 位于左侧工具栏 + * - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定 + */ +@Mixin(AdvPatternProviderScreen.class) +public abstract class AdvPatternProviderSmartFeaturesMixin extends AEBaseScreen { + @Unique private EAPServerSettingToggleButton eap$AdvancedBlockingToggle; + @Unique private EAPServerSettingToggleButton eap$SmartDoublingToggle; + + public AdvPatternProviderSmartFeaturesMixin(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + } + + @Inject(method = "", at = @At("RETURN"), remap = false) + private void eap$initAdvancedBlocking(AdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { + this.eap$AdvancedBlockingToggle = new EAPServerSettingToggleButton<>(EAPSettings.ADVANCED_BLOCKING, YesNo.YES); + this.addToLeftToolbar(this.eap$AdvancedBlockingToggle); + this.eap$SmartDoublingToggle = new EAPServerSettingToggleButton<>(EAPSettings.SMART_DOUBLING, YesNo.YES); + this.addToLeftToolbar(this.eap$SmartDoublingToggle); + } + + // 每帧刷新:仅从菜单(@GuiSync)同步布尔值,保持按钮状态一致 + @Inject(method = "updateBeforeRender", at = @At("HEAD"), remap = false) + private void eap$updateAdvancedBlocking(CallbackInfo ci) { + if (this.menu instanceof IPatternProviderMenuDoublingSync sync) { + this.eap$SmartDoublingToggle.set(sync.eap$getSmartDoublingSynced()); + } + if (this.menu instanceof IPatternProviderMenuAdvancedSync sync) { + this.eap$AdvancedBlockingToggle.set(sync.eap$getAdvancedBlockingSynced()); + } + } +} 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 2517584..91a853c 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 @@ -1,15 +1,12 @@ package com.extendedae_plus.mixin.advancedae.client.gui; -import appeng.api.config.Settings; import appeng.api.config.YesNo; import appeng.client.gui.AEBaseScreen; import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.SettingToggleButton; import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync; +import com.extendedae_plus.api.config.EAPSettings; import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync; -import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; -import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; -import net.minecraft.client.Minecraft; +import com.extendedae_plus.client.gui.widgets.EAPServerSettingToggleButton; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.pedroksl.advanced_ae.client.gui.SmallAdvPatternProviderScreen; @@ -20,8 +17,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; - /** * 为高级ae样板供应器界面添加“高级阻挡模式”按钮。 * - 位于左侧工具栏 @@ -29,110 +24,29 @@ import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; */ @Mixin(SmallAdvPatternProviderScreen.class) public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen { - - @Unique - private SettingToggleButton eap$AdvancedBlockingToggle; - - @Unique - private boolean eap$AdvancedBlockingEnabled = false; - - @Unique - private SettingToggleButton eap$SmartDoublingToggle; - - @Unique - private boolean eap$SmartDoublingEnabled = false; + @Unique private EAPServerSettingToggleButton eap$AdvancedBlockingToggle; + @Unique private EAPServerSettingToggleButton eap$SmartDoublingToggle; public SmallAdvPatternProviderScreenMixin(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style) { super(menu, playerInventory, title, style); } - @Inject(method = "", at = @At("RETURN")) + @Inject(method = "", at = @At("RETURN"), remap = false) private void eap$initAdvancedBlocking(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { - // 使用 @GuiSync 初始化 - try { - if (menu instanceof IPatternProviderMenuAdvancedSync sync) { - this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced(); - } - } catch (Throwable t) { - LOGGER.error("Error initializing advanced sync", t); - } - - // 使用 SettingToggleButton 的外观(原版图标),但自定义悬停描述为“智能阻挡” - this.eap$AdvancedBlockingToggle = new SettingToggleButton<>( - Settings.BLOCKING_MODE, - this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO, - (btn, backwards) -> { - // 不做本地切换,点击仅发送自定义C2S,显示由@GuiSync回传 - var conn = Minecraft.getInstance().getConnection(); - if (conn != null) conn.send(ToggleAdvancedBlockingC2SPacket.INSTANCE); - } - ) { - @Override - public java.util.List getTooltipMessage() { - boolean enabled = SmallAdvPatternProviderScreenMixin.this.eap$AdvancedBlockingEnabled; - var title = Component.literal("智能阻挡"); - var line = enabled - ? Component.literal("已启用:对于同一种配方将不再阻挡(需要开启原版的阻挡模式)") - : Component.literal("已禁用:这么好的功能为什么不打开呢"); - return java.util.List.of(title, line); - } - }; - // 初始化后立刻对齐当前@GuiSync状态,避免首帧显示不一致 - this.eap$AdvancedBlockingToggle.set(this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO); - + this.eap$AdvancedBlockingToggle = new EAPServerSettingToggleButton<>(EAPSettings.ADVANCED_BLOCKING, YesNo.YES); this.addToLeftToolbar(this.eap$AdvancedBlockingToggle); - - // 智能翻倍按钮:与高级阻挡同款样式,点击仅发送C2S,状态由@GuiSync驱动 - try { - if (menu instanceof IPatternProviderMenuDoublingSync sync2) { - this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced(); - } - } catch (Throwable t) { - LOGGER.error("Error initializing smart doubling sync", t); - } - - this.eap$SmartDoublingToggle = new SettingToggleButton<>( - Settings.BLOCKING_MODE, - this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO, - (btn, backwards) -> { - var conn = Minecraft.getInstance().getConnection(); - if (conn != null) conn.send(ToggleSmartDoublingC2SPacket.INSTANCE); - } - ) { - @Override - public java.util.List getTooltipMessage() { - boolean enabled = SmallAdvPatternProviderScreenMixin.this.eap$SmartDoublingEnabled; - var title = Component.literal("智能翻倍"); - var line = enabled - ? Component.literal("已启用:根据请求量对处理样板进行智能缩放") - : Component.literal("已禁用:按原始样板数量进行发配"); - return java.util.List.of(title, line); - } - }; - - this.eap$SmartDoublingToggle.set(this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO); + this.eap$SmartDoublingToggle = new EAPServerSettingToggleButton<>(EAPSettings.SMART_DOUBLING, YesNo.YES); this.addToLeftToolbar(this.eap$SmartDoublingToggle); } // 每帧刷新:仅从菜单(@GuiSync)同步布尔值,保持按钮状态一致 @Inject(method = "updateBeforeRender", at = @At("HEAD"), remap = false) private void eap$updateAdvancedBlocking(CallbackInfo ci) { - if (this.eap$AdvancedBlockingToggle != null) { - boolean desired = this.eap$AdvancedBlockingEnabled; - if (this.menu instanceof IPatternProviderMenuAdvancedSync sync) { - desired = sync.eap$getAdvancedBlockingSynced(); - } - this.eap$AdvancedBlockingEnabled = desired; - this.eap$AdvancedBlockingToggle.set(desired ? YesNo.YES : YesNo.NO); + if (this.menu instanceof IPatternProviderMenuDoublingSync sync) { + this.eap$SmartDoublingToggle.set(sync.eap$getSmartDoublingSynced()); } - - if (this.eap$SmartDoublingToggle != null) { - boolean desired2 = this.eap$SmartDoublingEnabled; - if (this.menu instanceof IPatternProviderMenuDoublingSync sync2) { - desired2 = sync2.eap$getSmartDoublingSynced(); - } - this.eap$SmartDoublingEnabled = desired2; - this.eap$SmartDoublingToggle.set(desired2 ? YesNo.YES : YesNo.NO); + if (this.menu instanceof IPatternProviderMenuAdvancedSync sync) { + this.eap$AdvancedBlockingToggle.set(sync.eap$getAdvancedBlockingSynced()); } } } diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicAdvancedMixin.java index c889a0c..6ed7425 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicAdvancedMixin.java @@ -1,14 +1,23 @@ package com.extendedae_plus.mixin.advancedae.helpers; +import appeng.api.config.Setting; +import appeng.api.config.Settings; +import appeng.api.config.YesNo; import appeng.api.crafting.IPatternDetails; import appeng.api.crafting.IPatternDetails.IInput; +import appeng.api.networking.IManagedGridNode; import appeng.api.stacks.AEKey; import appeng.api.stacks.GenericStack; +import appeng.api.stacks.KeyCounter; +import appeng.api.util.IConfigManager; import appeng.helpers.patternprovider.PatternProviderTarget; -import com.extendedae_plus.api.advancedBlocking.IAdvancedBlocking; +import appeng.util.ConfigManager; +import com.extendedae_plus.api.config.EAPSettings; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -18,51 +27,45 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Collections; +import java.util.Set; @Mixin(value = AdvPatternProviderLogic.class, remap = false) -public class AdvPatternProviderLogicAdvancedMixin implements IAdvancedBlocking { - @Unique - private static final String EAP_ADV_BLOCKING_KEY = "eap_advanced_blocking"; +public class AdvPatternProviderLogicAdvancedMixin { + @Shadow @Final private IConfigManager configManager; - @Unique - private boolean eap$advancedBlocking = false; + @Shadow public IConfigManager getConfigManager() {throw new AssertionError();} - @Override - public boolean eap$getAdvancedBlocking() { - return this.eap$advancedBlocking; - } + @Shadow public boolean isBlocking() {throw new AssertionError();} - @Override - public void eap$setAdvancedBlocking(boolean value) { - this.eap$advancedBlocking = value; - } - - @Inject(method = "writeToNBT", at = @At("TAIL")) - private void eap$writeAdvancedToNbt(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - tag.putBoolean(EAP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); - } - - @Inject(method = "readFromNBT", at = @At("TAIL")) - private void eap$readAdvancedFromNbt(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - if (tag.contains(EAP_ADV_BLOCKING_KEY)) { - this.eap$advancedBlocking = tag.getBoolean(EAP_ADV_BLOCKING_KEY); - } + @Inject( + method = "(Lappeng/api/networking/IManagedGridNode;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;I)V", + at = @At("TAIL") + ) + private void onInitTail(IManagedGridNode mainNode, AdvPatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { + // 直接往构建后的 configManager 里加 setting + ConfigManager configManager = (ConfigManager) this.getConfigManager(); + configManager.registerSetting(EAPSettings.ADVANCED_BLOCKING, YesNo.NO); } // 在 pushPattern 中,重定向对 adapter.containsPatternInput(...) 的调用 - @Redirect(method = "pushPattern", at = @At(value = "INVOKE", target = "Lappeng/helpers/patternprovider/PatternProviderTarget;containsPatternInput(Ljava/util/Set;)Z")) + @Redirect( + method = "pushPattern", + at = @At( + value = "INVOKE", + target = "Lappeng/helpers/patternprovider/PatternProviderTarget;containsPatternInput(Ljava/util/Set;)Z" + ) + ) private boolean eap$redirectBlockingContains(PatternProviderTarget adapter, - java.util.Set patternInputs, + Set patternInputs, IPatternDetails patternDetails, - appeng.api.stacks.KeyCounter[] inputHolder) { + KeyCounter[] inputHolder) { // 原版是否打开阻挡 - boolean vanillaBlocking = ((AdvPatternProviderLogic)(Object)this).isBlocking(); - if (!vanillaBlocking) { + if (!this.isBlocking()) { return adapter.containsPatternInput(patternInputs); } // 仅当高级阻挡启用时启用“匹配则不阻挡” - if (this.eap$advancedBlocking) { + if (this.configManager.getSetting(EAPSettings.ADVANCED_BLOCKING) == YesNo.YES) { if (this.eap$targetFullyMatchesPatternInputs(adapter, patternDetails)) { // 返回 false 表示“不包含阻挡关键物”,从而不触发 continue,允许发配 return false; @@ -90,5 +93,26 @@ public class AdvPatternProviderLogicAdvancedMixin implements IAdvancedBlocking { return true; // 每个输入槽都至少匹配了一个候选输入 } - @Shadow public void saveChanges() {} + @Inject(method = "configChanged", at = @At("HEAD")) + private void eap$onConfigChanged(IConfigManager manager, Setting setting, CallbackInfo ci) { + // 开启智能阻挡联动开启原版阻挡 + if (setting == EAPSettings.ADVANCED_BLOCKING && manager.getSetting(EAPSettings.ADVANCED_BLOCKING) == YesNo.YES) { + manager.putSetting(Settings.BLOCKING_MODE, YesNo.YES); + } + // 关闭原版阻挡联动关闭智能阻挡 + if (setting == Settings.BLOCKING_MODE && manager.getSetting(Settings.BLOCKING_MODE) == YesNo.NO) { + manager.putSetting(EAPSettings.ADVANCED_BLOCKING, YesNo.NO); + } + } + + @Inject(method = "readFromNBT", at = @At("TAIL")) + private void eap$readSmartDoublingFromNbt(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { + // TODO + // 适配旧版本中的数据,后续版本删除 + if (tag.contains("eap_advanced_blocking")) { + this.configManager.putSetting(EAPSettings.ADVANCED_BLOCKING, + tag.getBoolean("eap_advanced_blocking") ? YesNo.YES : YesNo.NO); + tag.remove("eap_advanced_blocking"); + } + } } diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java index b985f76..dcd83ba 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java @@ -1,75 +1,73 @@ package com.extendedae_plus.mixin.advancedae.helpers; +import appeng.api.config.Setting; +import appeng.api.config.YesNo; import appeng.api.crafting.IPatternDetails; -import com.extendedae_plus.api.smartDoubling.ISmartDoubling; +import appeng.api.networking.IManagedGridNode; +import appeng.api.util.IConfigManager; +import appeng.util.ConfigManager; +import com.extendedae_plus.api.config.EAPSettings; import com.extendedae_plus.api.smartDoubling.ISmartDoublingAwarePattern; -import com.extendedae_plus.mixin.advancedae.accessor.AdvPatternProviderLogicPatternsAccessor; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.List; + @Mixin(value = AdvPatternProviderLogic.class, remap = false) -public class AdvPatternProviderLogicDoublingMixin implements ISmartDoubling { - @Unique - private static final String EAP_SMART_DOUBLING_KEY = "eap_smart_doubling"; +public class AdvPatternProviderLogicDoublingMixin { + @Shadow @Final private List patterns; + @Shadow @Final private IConfigManager configManager; - @Unique - private boolean eap$smartDoubling = false; + @Shadow + public IConfigManager getConfigManager() {return null;} - @Override - public boolean eap$getSmartDoubling() { - return this.eap$smartDoubling; + @Shadow + public void updatePatterns() {} + + @Inject( + method = "(Lappeng/api/networking/IManagedGridNode;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;I)V", + at = @At("TAIL") + ) + private void onInitTail(IManagedGridNode mainNode, AdvPatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { + // 直接往构建后的 configManager 里加 setting + ConfigManager configManager = (ConfigManager) this.getConfigManager(); + configManager.registerSetting(EAPSettings.SMART_DOUBLING, YesNo.NO); } - @Override - public void eap$setSmartDoubling(boolean value) { - this.eap$smartDoubling = value; - // 立即将开关状态应用到当前 Provider 的样板上,避免等待下一次 updatePatterns - try { - var list = ((AdvPatternProviderLogicPatternsAccessor) this).eap$patterns(); - for (IPatternDetails details : list) { - if (details instanceof ISmartDoublingAwarePattern aware) { - aware.eap$setAllowScaling(value); - } - } - // 触发一次刷新,让网络及时拿到最新状态(也会触发 ICraftingProvider.requestUpdate(mainNode)) - ((AdvPatternProviderLogic) (Object) this).updatePatterns(); - } catch (Throwable ignored) { + @Inject(method = "configChanged", at = @At("HEAD")) + private void eap$onConfigChanged(IConfigManager manager, Setting setting, CallbackInfo ci) { + if (setting == EAPSettings.SMART_DOUBLING) { + this.updatePatterns(); } } - @Inject(method = "writeToNBT", at = @At("TAIL")) - private void eap$writeSmartDoublingToNbt(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - tag.putBoolean(EAP_SMART_DOUBLING_KEY, this.eap$smartDoubling); - } - @Inject(method = "readFromNBT", at = @At("TAIL")) private void eap$readSmartDoublingFromNbt(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - if (tag.contains(EAP_SMART_DOUBLING_KEY)) { - this.eap$smartDoubling = tag.getBoolean(EAP_SMART_DOUBLING_KEY); + // TODO + // 适配旧版本中的数据,后续版本删除 + if (tag.contains("eap_smart_doubling")) { + this.configManager.putSetting(EAPSettings.SMART_DOUBLING, + tag.getBoolean("eap_smart_doubling") ? YesNo.YES : YesNo.NO); + tag.remove("eap_smart_doubling"); } } @Inject(method = "updatePatterns", at = @At("TAIL")) private void eap$applySmartDoublingToPatterns(CallbackInfo ci) { - try { - var list = ((AdvPatternProviderLogicPatternsAccessor) this).eap$patterns(); - boolean allow = this.eap$smartDoubling; - for (IPatternDetails details : list) { - if (details instanceof ISmartDoublingAwarePattern aware) { - aware.eap$setAllowScaling(allow); - } + IConfigManager configManager = this.getConfigManager(); + boolean allowScaling = configManager.getSetting(EAPSettings.SMART_DOUBLING) == YesNo.YES; + for (IPatternDetails details : this.patterns) { + if (details instanceof ISmartDoublingAwarePattern aware) { + aware.eap$setAllowScaling(allowScaling); } - } catch (Throwable ignored) { } } - - @Shadow - public void saveChanges() {} } diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuAdvancedMixin.java index 956c132..6466621 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuAdvancedMixin.java @@ -1,9 +1,9 @@ package com.extendedae_plus.mixin.advancedae.menu; -import appeng.menu.AEBaseMenu; +import appeng.api.config.YesNo; import appeng.menu.guisync.GuiSync; -import com.extendedae_plus.api.advancedBlocking.IAdvancedBlocking; import com.extendedae_plus.api.advancedBlocking.IPatternProviderMenuAdvancedSync; +import com.extendedae_plus.api.config.EAPSettings; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; import org.spongepowered.asm.mixin.Final; @@ -14,29 +14,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(AdvPatternProviderMenu.class) +@Mixin(value = AdvPatternProviderMenu.class, remap = false) public abstract class AdvPatternProviderMenuAdvancedMixin implements IPatternProviderMenuAdvancedSync { - @Final - @Shadow(remap = false) - protected AdvPatternProviderLogic logic; - - // 选择一个未占用的 GUI 同步 id(AE2 已用到 7),这里使用 21 以避冲突 - @Unique - @GuiSync(22) private boolean eap$AdvancedBlocking = false; + @Shadow @Final protected AdvPatternProviderLogic logic; + @Unique @GuiSync(20) private YesNo eap$AdvancedBlocking; @Inject(method = "broadcastChanges", at = @At("HEAD")) - private void eap$syncAdvancedBlocking(CallbackInfo ci) { - // 避免@Shadow父类方法,改用公共API:AEBaseMenu#isClientSide() - if (!((AEBaseMenu) (Object) this).isClientSide()) { - var l = this.logic; - if (l instanceof IAdvancedBlocking holder) { - this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); - } + private void eap$syncSmartDoubling(CallbackInfo ci) { + if (!((AdvPatternProviderMenu) (Object) this).isClientSide()) { + this.eap$AdvancedBlocking = this.logic.getConfigManager().getSetting(EAPSettings.ADVANCED_BLOCKING); } } @Override - public boolean eap$getAdvancedBlockingSynced() { + public YesNo eap$getAdvancedBlockingSynced() { return this.eap$AdvancedBlocking; } } diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuDoublingMixin.java index 2dd1f8c..86b4a08 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuDoublingMixin.java @@ -1,9 +1,9 @@ package com.extendedae_plus.mixin.advancedae.menu; -import appeng.menu.AEBaseMenu; +import appeng.api.config.YesNo; import appeng.menu.guisync.GuiSync; +import com.extendedae_plus.api.config.EAPSettings; import com.extendedae_plus.api.smartDoubling.IPatternProviderMenuDoublingSync; -import com.extendedae_plus.api.smartDoubling.ISmartDoubling; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; import org.spongepowered.asm.mixin.Final; @@ -14,27 +14,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(AdvPatternProviderMenu.class) +@Mixin(value = AdvPatternProviderMenu.class, remap = false) public abstract class AdvPatternProviderMenuDoublingMixin implements IPatternProviderMenuDoublingSync { - @Final - @Shadow(remap = false) - protected AdvPatternProviderLogic logic; - - @Unique - @GuiSync(23) private boolean eap$SmartDoubling = false; + @Shadow @Final protected AdvPatternProviderLogic logic; + @Unique @GuiSync(21) private YesNo eap$SmartDoubling; @Inject(method = "broadcastChanges", at = @At("HEAD")) private void eap$syncSmartDoubling(CallbackInfo ci) { - if (!((AEBaseMenu) (Object) this).isClientSide()) { - var l = this.logic; - if (l instanceof ISmartDoubling holder) { - this.eap$SmartDoubling = holder.eap$getSmartDoubling(); - } + if (!((AdvPatternProviderMenu) (Object) this).isClientSide()) { + this.eap$SmartDoubling = this.logic.getConfigManager().getSetting(EAPSettings.SMART_DOUBLING); } } @Override - public boolean eap$getSmartDoublingSynced() { + public YesNo eap$getSmartDoublingSynced() { return this.eap$SmartDoubling; } } diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 7fad7f3..11de5c0 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -62,7 +62,7 @@ "PickFromWirelessMixin", "accessor.AbstractContainerScreenAccessor", "accessor.ScreenAccessor", - "advancedae.client.gui.AdvPatternProviderScreenMixin", + "advancedae.client.gui.AdvPatternProviderSmartFeaturesMixin", "advancedae.client.gui.SmallAdvPatternProviderScreenMixin", "ae2.QuartzCuttingKnifeItemMixin", "ae2.accessor.AEBaseScreenAccessor",