diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/AdvPatternProviderLogicContainsRedirectMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/AdvPatternProviderLogicContainsRedirectMixin.java new file mode 100644 index 0000000..0773388 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/AdvPatternProviderLogicContainsRedirectMixin.java @@ -0,0 +1,38 @@ +package com.extendedae_plus.mixin.advancedae; + +import appeng.api.crafting.IPatternDetails; +import com.extendedae_plus.content.ScaledProcessingPattern; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; + +/**适配 + * Redirect PatternProviderLogic.pushPattern 中对 List.contains 的调用, + * 在遇到缩放样板时回退匹配到原始样板实例。 + */ +@Mixin(value = AdvPatternProviderLogic.class, remap = false) +public class AdvPatternProviderLogicContainsRedirectMixin { + + @Redirect(method = "pushPattern", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;contains(Ljava/lang/Object;)Z") + ) + private boolean eap$patternsContains(List list, Object o) { + try { + if (o instanceof ScaledProcessingPattern scaled) { + IPatternDetails base = scaled.getOriginal(); + if (base != null && list.indexOf(base) != -1) { + return true; + } + } + // 使用 indexOf 避免再次触发对 List.contains 的 redirect(防止递归) + return list.indexOf(o) != -1; + } catch (Throwable t) { + return list.indexOf(o) != -1; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderLogicPatternsAccessor.java b/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderLogicPatternsAccessor.java new file mode 100644 index 0000000..a75643c --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderLogicPatternsAccessor.java @@ -0,0 +1,14 @@ +package com.extendedae_plus.mixin.advancedae.accessor; + +import appeng.api.crafting.IPatternDetails; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(value = AdvPatternProviderLogic.class, remap = false) +public interface AdvPatternProviderLogicPatternsAccessor { + @Accessor("patterns") + List eap$patterns(); +} diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderMenuAdvancedAccessor.java b/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderMenuAdvancedAccessor.java new file mode 100644 index 0000000..bf6987e --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/accessor/AdvPatternProviderMenuAdvancedAccessor.java @@ -0,0 +1,12 @@ +package com.extendedae_plus.mixin.advancedae.accessor; + +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AdvPatternProviderMenu.class) +public interface AdvPatternProviderMenuAdvancedAccessor { + @Accessor("logic") + AdvPatternProviderLogic eap$logic(); +} 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 new file mode 100644 index 0000000..5cd6c30 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java @@ -0,0 +1,147 @@ +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.ExPatternButtonsAccessor; +import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; +import com.extendedae_plus.api.PatternProviderMenuDoublingSync; +import com.extendedae_plus.init.ModNetwork; +import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; +import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; +import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; +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.checkerframework.checker.units.qual.C; +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(C menu, Inventory playerInventory, Component title, ScreenStyle style) { + super((AdvPatternProviderMenu) 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 PatternProviderMenuAdvancedSync 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回传 + ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket()); + } + ) { + @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 PatternProviderMenuDoublingSync 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) -> { + ModNetwork.CHANNEL.sendToServer(new ToggleSmartDoublingC2SPacket()); + } + ) { + @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 PatternProviderMenuAdvancedSync 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 PatternProviderMenuDoublingSync sync2) { + desired2 = sync2.eap$getSmartDoublingSynced(); + } + this.eap$SmartDoublingEnabled = desired2; + this.eap$SmartDoublingToggle.set(desired2 ? YesNo.YES : YesNo.NO); + } + + if ((Object) this instanceof GuiExPatternProvider) { + try { + ((ExPatternButtonsAccessor) this).eap$updateButtonsLayout(); + } catch (Throwable t) { + LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString()); + } + } + } +} 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 new file mode 100644 index 0000000..106207f --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/SmallAdvPatternProviderScreenMixin.java @@ -0,0 +1,147 @@ +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.ExPatternButtonsAccessor; +import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; +import com.extendedae_plus.api.PatternProviderMenuDoublingSync; +import com.extendedae_plus.init.ModNetwork; +import com.extendedae_plus.network.ToggleAdvancedBlockingC2SPacket; +import com.extendedae_plus.network.ToggleSmartDoublingC2SPacket; +import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.pedroksl.advanced_ae.client.gui.SmallAdvPatternProviderScreen; +import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderMenu; +import org.checkerframework.checker.units.qual.C; +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(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; + + public SmallAdvPatternProviderScreenMixin(C menu, Inventory playerInventory, Component title, ScreenStyle style) { + super((SmallAdvPatternProviderMenu) menu, playerInventory, title, style); + } + + @Inject(method = "", at = @At("RETURN")) + private void eap$initAdvancedBlocking(SmallAdvPatternProviderMenu menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { + // 使用 @GuiSync 初始化 + try { + if (menu instanceof PatternProviderMenuAdvancedSync 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回传 + ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket()); + } + ) { + @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 PatternProviderMenuDoublingSync 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) -> { + ModNetwork.CHANNEL.sendToServer(new ToggleSmartDoublingC2SPacket()); + } + ) { + @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 PatternProviderMenuAdvancedSync 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 PatternProviderMenuDoublingSync sync2) { + desired2 = sync2.eap$getSmartDoublingSynced(); + } + this.eap$SmartDoublingEnabled = desired2; + this.eap$SmartDoublingToggle.set(desired2 ? YesNo.YES : YesNo.NO); + } + + if ((Object) this instanceof GuiExPatternProvider) { + try { + ((ExPatternButtonsAccessor) this).eap$updateButtonsLayout(); + } catch (Throwable t) { + LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString()); + } + } + } +} 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 new file mode 100644 index 0000000..8df0927 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicAdvancedMixin.java @@ -0,0 +1,109 @@ +package com.extendedae_plus.mixin.advancedae.helpers; + +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.IPatternDetails.IInput; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.helpers.patternprovider.PatternProviderTarget; +import com.extendedae_plus.api.AdvancedBlockingHolder; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Collections; + +@Mixin(value = AdvPatternProviderLogic.class, remap = false) +public class AdvPatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder { + @Unique + private static final String EAP_ADV_BLOCKING_KEY = "eap_advanced_blocking"; + + @Unique + private boolean eap$advancedBlocking = false; + + @Override + public boolean eap$getAdvancedBlocking() { + return eap$advancedBlocking; + } + + @Override + public void eap$setAdvancedBlocking(boolean value) { + this.eap$advancedBlocking = value; + } + + @Inject(method = "writeToNBT", at = @At("TAIL")) + private void eap$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) { + tag.putBoolean(EAP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); + } + + @Inject(method = "readFromNBT", at = @At("TAIL")) + private void eap$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) { + if (tag.contains(EAP_ADV_BLOCKING_KEY)) { + this.eap$advancedBlocking = tag.getBoolean(EAP_ADV_BLOCKING_KEY); + } + } + + // 在 pushPattern 中,重定向对 adapter.containsPatternInput(...) 的调用 + @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, + IPatternDetails patternDetails, + appeng.api.stacks.KeyCounter[] inputHolder) { + // 原版是否打开阻挡 + boolean vanillaBlocking = ((AdvPatternProviderLogic)(Object)this).isBlocking(); + if (!vanillaBlocking) { + return adapter.containsPatternInput(patternInputs); + } + + // 仅当高级阻挡启用时启用“匹配则不阻挡” + if (this.eap$advancedBlocking) { + if (eap$targetFullyMatchesPatternInputs(adapter, patternDetails)) { + // 返回 false 表示“不包含阻挡关键物”,从而不触发 continue,允许发配 + return false; + } + } + // 否则使用原判定 + return adapter.containsPatternInput(patternInputs); + } + + @Unique + private boolean eap$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) { + for (IInput in : patternDetails.getInputs()) { + boolean slotMatched = false; + for (GenericStack candidate : in.getPossibleInputs()) { + AEKey key = candidate.what().dropSecondary(); + if (adapter.containsPatternInput(Collections.singleton(key))) { + slotMatched = true; + break; + } + } + if (!slotMatched) { + return false; // 任一输入槽未匹配则失败 + } + } + return true; // 每个输入槽都至少匹配了一个候选输入 + } + + @Shadow public void saveChanges() {} + + @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) + private void onExportSettings(CompoundTag output, CallbackInfo ci) { + System.out.println(this.eap$advancedBlocking); + output.putBoolean(EAP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); + } + + @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) + private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { + if (input.contains(EAP_ADV_BLOCKING_KEY)) { + this.eap$advancedBlocking = input.getBoolean(EAP_ADV_BLOCKING_KEY); + // 持久化到 world + this.saveChanges(); + } + } +} 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 new file mode 100644 index 0000000..85f7041 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java @@ -0,0 +1,91 @@ +package com.extendedae_plus.mixin.advancedae.helpers; + +import appeng.api.crafting.IPatternDetails; +import appeng.crafting.pattern.AEProcessingPattern; +import com.extendedae_plus.api.SmartDoublingAwarePattern; +import com.extendedae_plus.api.SmartDoublingHolder; +import com.extendedae_plus.mixin.advancedae.accessor.AdvPatternProviderLogicPatternsAccessor; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +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; + +@Mixin(value = AdvPatternProviderLogic.class, remap = false) +public class AdvPatternProviderLogicDoublingMixin implements SmartDoublingHolder { + @Unique + private static final String EAP_SMART_DOUBLING_KEY = "eap_smart_doubling"; + + @Unique + private boolean eap$smartDoubling = false; + + @Override + public boolean eap$getSmartDoubling() { + return eap$smartDoubling; + } + + @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 AEProcessingPattern proc && proc instanceof SmartDoublingAwarePattern aware) { + aware.eap$setAllowScaling(value); + } + } + // 触发一次刷新,让网络及时拿到最新状态(也会触发 ICraftingProvider.requestUpdate(mainNode)) + ((AdvPatternProviderLogic) (Object) this).updatePatterns(); + } catch (Throwable ignored) { + } + } + + @Inject(method = "writeToNBT", at = @At("TAIL")) + private void eap$writeSmartDoublingToNbt(CompoundTag tag, CallbackInfo ci) { + tag.putBoolean(EAP_SMART_DOUBLING_KEY, this.eap$smartDoubling); + } + + @Inject(method = "readFromNBT", at = @At("TAIL")) + private void eap$readSmartDoublingFromNbt(CompoundTag tag, CallbackInfo ci) { + if (tag.contains(EAP_SMART_DOUBLING_KEY)) { + this.eap$smartDoubling = tag.getBoolean(EAP_SMART_DOUBLING_KEY); + } + } + + @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 AEProcessingPattern proc && proc instanceof SmartDoublingAwarePattern aware) { + aware.eap$setAllowScaling(allow); + } + } + } catch (Throwable ignored) { + } + } + + @Shadow + public void saveChanges() {} + + @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) + private void onExportSettings(CompoundTag output, CallbackInfo ci) { + System.out.println(this.eap$smartDoubling); + output.putBoolean(EAP_SMART_DOUBLING_KEY, this.eap$smartDoubling); + } + + @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) + private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { + if (input.contains(EAP_SMART_DOUBLING_KEY)) { + this.eap$smartDoubling = input.getBoolean(EAP_SMART_DOUBLING_KEY); + // 持久化到 world + this.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 new file mode 100644 index 0000000..db4ae90 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuAdvancedMixin.java @@ -0,0 +1,66 @@ +package com.extendedae_plus.mixin.advancedae.menu; + +import appeng.menu.AEBaseMenu; +import appeng.menu.guisync.GuiSync; +import com.extendedae_plus.api.AdvancedBlockingHolder; +import com.extendedae_plus.api.PatternProviderMenuAdvancedSync; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; +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; + +@Mixin(AdvPatternProviderMenu.class) +public abstract class AdvPatternProviderMenuAdvancedMixin implements PatternProviderMenuAdvancedSync { + @Shadow + protected AdvPatternProviderLogic logic; + + // 选择一个未占用的 GUI 同步 id(AE2 已用到 7),这里使用 21 以避冲突 + @Unique + @GuiSync(22) + public boolean eap$AdvancedBlocking = false; + + @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 AdvancedBlockingHolder holder) { + this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); + } + } + } + + // 构造器尾注入(public ctor) + @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", at = @At("TAIL")) + private void eap$initAdvancedSync_Public(int id, Inventory playerInventory, AdvPatternProviderLogicHost host, CallbackInfo ci) { + try { + var l = this.logic; + if (l instanceof AdvancedBlockingHolder holder) { + this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); + } + } catch (Throwable ignored) {} + } + + // 构造器尾注入(protected ctor with MenuType) + @Inject(method = "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", at = @At("TAIL")) + private void eap$initAdvancedSync_Protected(MenuType menuType, int id, Inventory playerInventory, AdvPatternProviderLogicHost host, CallbackInfo ci) { + try { + var l = this.logic; + if (l instanceof AdvancedBlockingHolder holder) { + this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); + } + } catch (Throwable ignored) {} + } + + @Override + public boolean 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 new file mode 100644 index 0000000..7e63986 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/menu/AdvPatternProviderMenuDoublingMixin.java @@ -0,0 +1,62 @@ +package com.extendedae_plus.mixin.advancedae.menu; + +import appeng.menu.AEBaseMenu; +import appeng.menu.guisync.GuiSync; +import com.extendedae_plus.api.PatternProviderMenuDoublingSync; +import com.extendedae_plus.api.SmartDoublingHolder; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; +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; + +@Mixin(AdvPatternProviderMenu.class) +public abstract class AdvPatternProviderMenuDoublingMixin implements PatternProviderMenuDoublingSync { + @Shadow + protected AdvPatternProviderLogic logic; + + @Unique + @GuiSync(23) + public boolean eap$SmartDoubling = false; + + @Inject(method = "broadcastChanges", at = @At("HEAD")) + private void eap$syncSmartDoubling(CallbackInfo ci) { + if (!((AEBaseMenu) (Object) this).isClientSide()) { + var l = this.logic; + if (l instanceof SmartDoublingHolder holder) { + this.eap$SmartDoubling = holder.eap$getSmartDoubling(); + } + } + } + + @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", at = @At("TAIL")) + private void eap$initSmartSync_Public(int id, Inventory playerInventory, AdvPatternProviderLogicHost host, CallbackInfo ci) { + try { + var l = this.logic; + if (l instanceof SmartDoublingHolder holder) { + this.eap$SmartDoubling = holder.eap$getSmartDoubling(); + } + } catch (Throwable ignored) {} + } + + @Inject(method = "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", at = @At("TAIL")) + private void eap$initSmartSync_Protected(MenuType menuType, int id, Inventory playerInventory, AdvPatternProviderLogicHost host, CallbackInfo ci) { + try { + var l = this.logic; + if (l instanceof SmartDoublingHolder holder) { + this.eap$SmartDoubling = holder.eap$getSmartDoubling(); + } + } catch (Throwable ignored) {} + } + + @Override + public boolean eap$getSmartDoublingSynced() { + return this.eap$SmartDoubling; + } +} 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 2fb5edd..863fab3 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 @@ -65,7 +65,6 @@ public abstract class PatternProviderScreenMixin this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO, (btn, backwards) -> { // 不做本地切换,点击仅发送自定义C2S,显示由@GuiSync回传 - LOGGER.debug("[EAP] Click advanced blocking toggle: send C2S"); ModNetwork.CHANNEL.sendToServer(new ToggleAdvancedBlockingC2SPacket()); } ) { @@ -80,7 +79,6 @@ public abstract class PatternProviderScreenMixin } }; // 初始化后立刻对齐当前@GuiSync状态,避免首帧显示不一致 - LOGGER.debug("[EAP] Screen init: initial synced={} -> set button", this.eap$AdvancedBlockingEnabled); this.eap$AdvancedBlockingToggle.set(this.eap$AdvancedBlockingEnabled ? YesNo.YES : YesNo.NO); this.addToLeftToolbar(this.eap$AdvancedBlockingToggle); @@ -98,7 +96,6 @@ public abstract class PatternProviderScreenMixin Settings.BLOCKING_MODE, this.eap$SmartDoublingEnabled ? YesNo.YES : YesNo.NO, (btn, backwards) -> { - LOGGER.debug("[EAP] Click smart doubling toggle: send C2S"); ModNetwork.CHANNEL.sendToServer(new ToggleSmartDoublingC2SPacket()); } ) { @@ -125,7 +122,6 @@ public abstract class PatternProviderScreenMixin if (this.menu instanceof PatternProviderMenuAdvancedSync sync) { desired = sync.eap$getAdvancedBlockingSynced(); } - LOGGER.debug("[EAP] updateBeforeRender tick (adv): desired={}", desired); this.eap$AdvancedBlockingEnabled = desired; this.eap$AdvancedBlockingToggle.set(desired ? YesNo.YES : YesNo.NO); } @@ -135,7 +131,6 @@ public abstract class PatternProviderScreenMixin if (this.menu instanceof PatternProviderMenuDoublingSync sync2) { desired2 = sync2.eap$getSmartDoublingSynced(); } - LOGGER.debug("[EAP] updateBeforeRender tick (dbl): desired={}", desired2); this.eap$SmartDoublingEnabled = desired2; this.eap$SmartDoublingToggle.set(desired2 ? YesNo.YES : YesNo.NO); } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java index 5cff7ca..18e5a4e 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicAdvancedMixin.java @@ -22,7 +22,7 @@ import java.util.Collections; @Mixin(value = PatternProviderLogic.class, remap = false) public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder { @Unique - private static final String EPP_ADV_BLOCKING_KEY = "epp_advanced_blocking"; + private static final String EAP_ADV_BLOCKING_KEY = "eap_advanced_blocking"; @Unique private boolean eap$advancedBlocking = false; @@ -39,13 +39,13 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder @Inject(method = "writeToNBT", at = @At("TAIL")) private void eap$writeAdvancedToNbt(CompoundTag tag, CallbackInfo ci) { - tag.putBoolean(EPP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); + tag.putBoolean(EAP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); } @Inject(method = "readFromNBT", at = @At("TAIL")) private void eap$readAdvancedFromNbt(CompoundTag tag, CallbackInfo ci) { - if (tag.contains(EPP_ADV_BLOCKING_KEY)) { - this.eap$advancedBlocking = tag.getBoolean(EPP_ADV_BLOCKING_KEY); + if (tag.contains(EAP_ADV_BLOCKING_KEY)) { + this.eap$advancedBlocking = tag.getBoolean(EAP_ADV_BLOCKING_KEY); } } @@ -95,13 +95,13 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) private void onExportSettings(CompoundTag output, CallbackInfo ci) { System.out.println(this.eap$advancedBlocking); - output.putBoolean("eap_advanced_blocking", this.eap$advancedBlocking); + output.putBoolean(EAP_ADV_BLOCKING_KEY, this.eap$advancedBlocking); } @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { - if (input.contains("eap_advanced_blocking")) { - this.eap$advancedBlocking = input.getBoolean("eap_advanced_blocking"); + if (input.contains(EAP_ADV_BLOCKING_KEY)) { + this.eap$advancedBlocking = input.getBoolean(EAP_ADV_BLOCKING_KEY); // 持久化到 world this.saveChanges(); } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java index 462506f..ff3152d 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = PatternProviderLogic.class, remap = false) public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { @Unique - private static final String EPP_SMART_DOUBLING_KEY = "epp_smart_doubling"; + private static final String EAP_SMART_DOUBLING_KEY = "eap_smart_doubling"; @Unique private boolean eap$smartDoubling = false; @@ -47,13 +47,13 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { @Inject(method = "writeToNBT", at = @At("TAIL")) private void eap$writeSmartDoublingToNbt(CompoundTag tag, CallbackInfo ci) { - tag.putBoolean(EPP_SMART_DOUBLING_KEY, this.eap$smartDoubling); + tag.putBoolean(EAP_SMART_DOUBLING_KEY, this.eap$smartDoubling); } @Inject(method = "readFromNBT", at = @At("TAIL")) private void eap$readSmartDoublingFromNbt(CompoundTag tag, CallbackInfo ci) { - if (tag.contains(EPP_SMART_DOUBLING_KEY)) { - this.eap$smartDoubling = tag.getBoolean(EPP_SMART_DOUBLING_KEY); + if (tag.contains(EAP_SMART_DOUBLING_KEY)) { + this.eap$smartDoubling = tag.getBoolean(EAP_SMART_DOUBLING_KEY); } } @@ -77,13 +77,13 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { @Inject(method = "exportSettings(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("TAIL")) private void onExportSettings(CompoundTag output, CallbackInfo ci) { System.out.println(this.eap$smartDoubling); - output.putBoolean("eap_smart_doubling", this.eap$smartDoubling); + output.putBoolean(EAP_SMART_DOUBLING_KEY, this.eap$smartDoubling); } @Inject(method = "importSettings(Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/entity/player/Player;)V", at = @At("TAIL")) private void onImportSettings(CompoundTag input, Player player, CallbackInfo ci) { - if (input.contains("eap_smart_doubling")) { - this.eap$smartDoubling = input.getBoolean("eap_smart_doubling"); + if (input.contains(EAP_SMART_DOUBLING_KEY)) { + this.eap$smartDoubling = input.getBoolean(EAP_SMART_DOUBLING_KEY); // 持久化到 world this.saveChanges(); } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java index 5e8fade..8a1fb05 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuAdvancedMixin.java @@ -15,7 +15,6 @@ 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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; @@ -36,7 +35,6 @@ public abstract class PatternProviderMenuAdvancedMixin implements PatternProvide var l = this.logic; if (l instanceof AdvancedBlockingHolder holder) { this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); - LOGGER.debug("[EAP] Menu broadcastChanges HEAD: eap$AdvancedBlocking={}", this.eap$AdvancedBlocking); } } } @@ -49,9 +47,7 @@ public abstract class PatternProviderMenuAdvancedMixin implements PatternProvide if (l instanceof AdvancedBlockingHolder holder) { this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking(); } - } catch (Throwable t) { - LOGGER.error("Error initializing advanced sync", t); - } + } catch (Throwable ignored) {} } // 构造器尾注入(protected ctor with MenuType) @@ -71,13 +67,4 @@ public abstract class PatternProviderMenuAdvancedMixin implements PatternProvide public boolean eap$getAdvancedBlockingSynced() { return this.eap$AdvancedBlocking; } - - // 调试:当 Screen 每帧读取这些 getter 时打印,验证 Mixin 是否生效 - @Inject(method = "getBlockingMode", at = @At("HEAD"), remap = false) - private void eap$debug_getBlockingMode(CallbackInfoReturnable cir) { - } - - @Inject(method = "getShowInAccessTerminal", at = @At("HEAD"), remap = false) - private void eap$debug_getShowInAccessTerminal(CallbackInfoReturnable cir) { - } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java index 0e184f4..822c22f 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternProviderMenuDoublingMixin.java @@ -33,7 +33,6 @@ public abstract class PatternProviderMenuDoublingMixin implements PatternProvide var l = this.logic; if (l instanceof SmartDoublingHolder holder) { this.eap$SmartDoubling = holder.eap$getSmartDoubling(); - LOGGER.debug("[EAP] Menu broadcastChanges HEAD: eap$SmartDoubling={}", this.eap$SmartDoubling); } } } diff --git a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java index f58f500..2711206 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleAdvancedBlockingC2SPacket.java @@ -4,10 +4,12 @@ import appeng.api.config.Settings; import appeng.api.config.YesNo; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.AdvancedBlockingHolder; +import com.extendedae_plus.mixin.advancedae.accessor.AdvPatternProviderMenuAdvancedAccessor; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; import java.util.function.Supplier; @@ -29,19 +31,32 @@ public class ToggleAdvancedBlockingC2SPacket { ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); if (player == null) return; - if (!(player.containerMenu instanceof PatternProviderMenu menu)) return; - // 通过 accessor 获取逻辑与当前状态 - var accessor = (PatternProviderMenuAdvancedAccessor) menu; - var logic = accessor.eap$logic(); - if (logic instanceof AdvancedBlockingHolder holder) { - boolean current = holder.eap$getAdvancedBlocking(); - boolean next = !current; - holder.eap$setAdvancedBlocking(next); - // 自动开启原版阻挡 - logic.getConfigManager().putSetting(Settings.BLOCKING_MODE, YesNo.YES); - // 保存并触发 AE2 的菜单 @GuiSync 广播到所有观看该菜单的玩家 - logic.saveChanges(); + var containerMenu = player.containerMenu; + if (containerMenu instanceof PatternProviderMenu menu) { + var accessor = (PatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof AdvancedBlockingHolder holder) { + boolean current = holder.eap$getAdvancedBlocking(); + boolean next = !current; + holder.eap$setAdvancedBlocking(next); + // 自动开启原版阻挡 + logic.getConfigManager().putSetting(Settings.BLOCKING_MODE, YesNo.YES); + // 保存并触发 AE2 的菜单 @GuiSync 广播到所有观看该菜单的玩家 + logic.saveChanges(); + } + }else if (containerMenu instanceof AdvPatternProviderMenu menu){ + var accessor = (AdvPatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof AdvancedBlockingHolder holder) { + boolean current = holder.eap$getAdvancedBlocking(); + boolean next = !current; + holder.eap$setAdvancedBlocking(next); + // 自动开启原版阻挡 + logic.getConfigManager().putSetting(Settings.BLOCKING_MODE, YesNo.YES); + // 保存并触发 AE2 的菜单 @GuiSync 广播到所有观看该菜单的玩家 + logic.saveChanges(); + } } }); ctx.setPacketHandled(true); diff --git a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java index 3ad6405..88d832a 100644 --- a/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/ToggleSmartDoublingC2SPacket.java @@ -2,10 +2,12 @@ package com.extendedae_plus.network; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.api.SmartDoublingHolder; +import com.extendedae_plus.mixin.advancedae.accessor.AdvPatternProviderMenuAdvancedAccessor; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderMenuAdvancedAccessor; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; import java.util.function.Supplier; @@ -27,15 +29,25 @@ public class ToggleSmartDoublingC2SPacket { ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); if (player == null) return; - if (!(player.containerMenu instanceof PatternProviderMenu menu)) return; - - var accessor = (PatternProviderMenuAdvancedAccessor) menu; - var logic = accessor.eap$logic(); - if (logic instanceof SmartDoublingHolder holder) { - boolean current = holder.eap$getSmartDoubling(); - boolean next = !current; - holder.eap$setSmartDoubling(next); - logic.saveChanges(); + var containerMenu = player.containerMenu; + if (containerMenu instanceof PatternProviderMenu menu) { + var accessor = (PatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof SmartDoublingHolder holder) { + boolean current = holder.eap$getSmartDoubling(); + boolean next = !current; + holder.eap$setSmartDoubling(next); + logic.saveChanges(); + } + }else if (containerMenu instanceof AdvPatternProviderMenu menu){ + var accessor = (AdvPatternProviderMenuAdvancedAccessor) menu; + var logic = accessor.eap$logic(); + if (logic instanceof SmartDoublingHolder holder) { + boolean current = holder.eap$getSmartDoubling(); + boolean next = !current; + holder.eap$setSmartDoubling(next); + logic.saveChanges(); + } } }); ctx.setPacketHandled(true); diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index af79b32..edc5469 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -7,6 +7,8 @@ "PickFromWirelessMixin", "accessor.AbstractContainerScreenAccessor", "accessor.ScreenAccessor", + "advancedae.client.gui.AdvPatternProviderScreenMixin", + "advancedae.client.gui.SmallAdvPatternProviderScreenMixin", "ae2.QuartzCuttingKnifeItemMixin", "ae2.accessor.AEBaseScreenAccessor", "ae2.accessor.AEBaseScreenInvoker", @@ -29,6 +31,13 @@ "jei.accessor.BookmarkOverlayAccessor" ], "mixins": [ + "advancedae.AdvPatternProviderLogicContainsRedirectMixin", + "advancedae.accessor.AdvPatternProviderLogicPatternsAccessor", + "advancedae.accessor.AdvPatternProviderMenuAdvancedAccessor", + "advancedae.helpers.AdvPatternProviderLogicAdvancedMixin", + "advancedae.helpers.AdvPatternProviderLogicDoublingMixin", + "advancedae.menu.AdvPatternProviderMenuAdvancedMixin", + "advancedae.menu.AdvPatternProviderMenuDoublingMixin", "ae2.AEProcessingPatternMixin", "ae2.CraftingCalculationMixin", "ae2.CraftingCPUClusterMixin",