From ed4dafd4832b3349c55e3c4f8c856540c7e07dda Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Fri, 31 Oct 2025 21:33:28 +0800 Subject: [PATCH] =?UTF-8?q?HighlightButtonMixin=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GuiExPatternTerminalAccessor.java | 5 ++ .../accessor/HighlightButtonAccessor.java | 16 ++++ .../client/HighlightButtonMixin.java | 84 ++++++++----------- .../resources/extendedae_plus.mixins.json | 1 + 4 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/mixin/extendedae/accessor/HighlightButtonAccessor.java diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/GuiExPatternTerminalAccessor.java b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/GuiExPatternTerminalAccessor.java index 035a9dc..b07d827 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/GuiExPatternTerminalAccessor.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/GuiExPatternTerminalAccessor.java @@ -7,9 +7,14 @@ import net.minecraftforge.api.distmarker.OnlyIn; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import java.util.HashMap; + @OnlyIn(Dist.CLIENT) @Mixin(value = GuiExPatternTerminal.class, remap = false) public interface GuiExPatternTerminalAccessor { @Accessor("searchOutField") AETextField getSearchOutField(); + + @Accessor("infoMap") + HashMap getInfoMap(); } \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/HighlightButtonAccessor.java b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/HighlightButtonAccessor.java new file mode 100644 index 0000000..2d04ad0 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/accessor/HighlightButtonAccessor.java @@ -0,0 +1,16 @@ +package com.extendedae_plus.mixin.extendedae.accessor; + +import com.glodblock.github.extendedae.client.button.HighlightButton; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(HighlightButton.class) +public interface HighlightButtonAccessor { + @Accessor("pos") + BlockPos getPos(); + + @Accessor("face") + Direction getFace(); +} \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java index 6cda455..8134740 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/HighlightButtonMixin.java @@ -1,72 +1,60 @@ package com.extendedae_plus.mixin.extendedae.client; +import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; +import com.extendedae_plus.mixin.extendedae.accessor.HighlightButtonAccessor; +import com.extendedae_plus.util.Logger; import com.glodblock.github.extendedae.client.button.HighlightButton; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; 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.HashMap; +import java.util.Map; import java.util.Objects; -@Mixin(value = HighlightButton.class, priority = 1000) +@Mixin(value = HighlightButton.class) public abstract class HighlightButtonMixin { - @Shadow(remap = false) - private static void highlight(Button btn) {} - - private static final Logger LOGGER = LoggerFactory.getLogger("ExtendedAEPlus"); - @Inject(method = "highlight", at = @At("TAIL"), remap = false) private static void onHighlight(Button btn, CallbackInfo ci) { - if (btn instanceof HighlightButton hb) { - var minecraft = net.minecraft.client.Minecraft.getInstance(); - if (minecraft.screen instanceof GuiExPatternTerminal terminal) { - try { - var fPos = HighlightButton.class.getDeclaredField("pos"); - fPos.setAccessible(true); - Object btnPos = fPos.get(hb); - if (btnPos == null) { - return; - } + if (!(btn instanceof HighlightButton hb)) return; - var fFace = HighlightButton.class.getDeclaredField("face"); - fFace.setAccessible(true); - Object btnFace = fFace.get(hb); // 允许为 null:方块形 + var minecraft = Minecraft.getInstance(); + if (!(minecraft.screen instanceof GuiExPatternTerminal terminal)) return; - var infoMapField = GuiExPatternTerminal.class.getDeclaredField("infoMap"); - infoMapField.setAccessible(true); - @SuppressWarnings("unchecked") - var infoMap = (java.util.Map) infoMapField.get(terminal); + try { + // 使用 Accessor 获取 HighlightButton 的字段 + BlockPos btnPos = ((HighlightButtonAccessor) hb).getPos(); + Direction btnFace = ((HighlightButtonAccessor) hb).getFace(); + if (btnPos == null) return; - for (var entry : infoMap.entrySet()) { - var info = entry.getValue(); - var mPos = info.getClass().getMethod("pos"); - mPos.setAccessible(true); - Object infoPos = mPos.invoke(info); + // 使用 Accessor 获取 infoMap + HashMap infoMap = ((GuiExPatternTerminalAccessor) terminal).getInfoMap(); - var mFace = info.getClass().getMethod("face"); - mFace.setAccessible(true); - Object infoFace = mFace.invoke(info); // 允许为 null:方块形 + for (Map.Entry entry : infoMap.entrySet()) { + GuiExPatternTerminal.PatternProviderInfo info = entry.getValue(); - // 匹配规则:pos 必须相等;face 允许为 null,null 仅与 null 匹配 - boolean posEqual = Objects.equals(btnPos, infoPos); - boolean faceEqual = (btnFace == null && infoFace == null) || Objects.equals(btnFace, infoFace); - if (posEqual && faceEqual) { - long serverId = entry.getKey(); - var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class); - setMethod.setAccessible(true); - setMethod.invoke(terminal, serverId); - break; - } - } - } catch (Throwable t) { - LOGGER.warn("HighlightButton onHighlight 处理异常", t); + BlockPos infoPos = info.pos(); + Direction infoFace = info.face(); + + // 匹配规则:pos 必须相等;face 允许为 null,null 仅与 null 匹配 + boolean posEqual = Objects.equals(btnPos, infoPos); + boolean faceEqual = (btnFace == null && infoFace == null) || Objects.equals(btnFace, infoFace); + if (posEqual && faceEqual) { + long serverId = entry.getKey(); + var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class); + setMethod.setAccessible(true); + setMethod.invoke(terminal, serverId); + break; } } + } catch (Throwable t) { + Logger.EAP$LOGGER.warn("HighlightButton onHighlight 处理异常", t); } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 8b45a31..d3d0ab5 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -22,6 +22,7 @@ "ae2.menu.CraftConfirmMenuGoBackMixin", "extendedae.accessor.GuiExPatternTerminalAccessor", "extendedae.accessor.GuiExPatternTerminalGroupHeaderRowAccessor", + "extendedae.accessor.HighlightButtonAccessor", "extendedae.client.HighlightButtonMixin", "extendedae.client.gui.GuiExPatternProviderMixin", "extendedae.client.gui.GuiExPatternTerminalMixin",