HighlightButtonMixin优化

This commit is contained in:
C-H716 2025-10-31 21:33:28 +08:00
parent 66ee90c4be
commit ed4dafd483
4 changed files with 58 additions and 48 deletions

View File

@ -7,9 +7,14 @@ import net.minecraftforge.api.distmarker.OnlyIn;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.HashMap;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Mixin(value = GuiExPatternTerminal.class, remap = false) @Mixin(value = GuiExPatternTerminal.class, remap = false)
public interface GuiExPatternTerminalAccessor { public interface GuiExPatternTerminalAccessor {
@Accessor("searchOutField") @Accessor("searchOutField")
AETextField getSearchOutField(); AETextField getSearchOutField();
@Accessor("infoMap")
HashMap<Long, GuiExPatternTerminal.PatternProviderInfo> getInfoMap();
} }

View File

@ -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();
}

View File

@ -1,72 +1,60 @@
package com.extendedae_plus.mixin.extendedae.client; 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.button.HighlightButton;
import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import org.slf4j.Logger; import net.minecraft.core.BlockPos;
import org.slf4j.LoggerFactory; import net.minecraft.core.Direction;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
@Mixin(value = HighlightButton.class, priority = 1000) @Mixin(value = HighlightButton.class)
public abstract class HighlightButtonMixin { 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) @Inject(method = "highlight", at = @At("TAIL"), remap = false)
private static void onHighlight(Button btn, CallbackInfo ci) { private static void onHighlight(Button btn, CallbackInfo ci) {
if (btn instanceof HighlightButton hb) { if (!(btn instanceof HighlightButton hb)) return;
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;
}
var fFace = HighlightButton.class.getDeclaredField("face"); var minecraft = Minecraft.getInstance();
fFace.setAccessible(true); if (!(minecraft.screen instanceof GuiExPatternTerminal<?> terminal)) return;
Object btnFace = fFace.get(hb); // 允许为 null方块形
var infoMapField = GuiExPatternTerminal.class.getDeclaredField("infoMap"); try {
infoMapField.setAccessible(true); // 使用 Accessor 获取 HighlightButton 的字段
@SuppressWarnings("unchecked") BlockPos btnPos = ((HighlightButtonAccessor) hb).getPos();
var infoMap = (java.util.Map<Long, Object>) infoMapField.get(terminal); Direction btnFace = ((HighlightButtonAccessor) hb).getFace();
if (btnPos == null) return;
for (var entry : infoMap.entrySet()) { // 使用 Accessor 获取 infoMap
var info = entry.getValue(); HashMap<Long, GuiExPatternTerminal.PatternProviderInfo> infoMap = ((GuiExPatternTerminalAccessor) terminal).getInfoMap();
var mPos = info.getClass().getMethod("pos");
mPos.setAccessible(true);
Object infoPos = mPos.invoke(info);
var mFace = info.getClass().getMethod("face"); for (Map.Entry<Long, GuiExPatternTerminal.PatternProviderInfo> entry : infoMap.entrySet()) {
mFace.setAccessible(true); GuiExPatternTerminal.PatternProviderInfo info = entry.getValue();
Object infoFace = mFace.invoke(info); // 允许为 null方块形
// 匹配规则pos 必须相等face 允许为 nullnull 仅与 null 匹配 BlockPos infoPos = info.pos();
boolean posEqual = Objects.equals(btnPos, infoPos); Direction infoFace = info.face();
boolean faceEqual = (btnFace == null && infoFace == null) || Objects.equals(btnFace, infoFace);
if (posEqual && faceEqual) { // 匹配规则pos 必须相等face 允许为 nullnull 仅与 null 匹配
long serverId = entry.getKey(); boolean posEqual = Objects.equals(btnPos, infoPos);
var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class); boolean faceEqual = (btnFace == null && infoFace == null) || Objects.equals(btnFace, infoFace);
setMethod.setAccessible(true); if (posEqual && faceEqual) {
setMethod.invoke(terminal, serverId); long serverId = entry.getKey();
break; var setMethod = terminal.getClass().getMethod("setCurrentlyChoicePatternProvider", long.class);
} setMethod.setAccessible(true);
} setMethod.invoke(terminal, serverId);
} catch (Throwable t) { break;
LOGGER.warn("HighlightButton onHighlight 处理异常", t);
} }
} }
} catch (Throwable t) {
Logger.EAP$LOGGER.warn("HighlightButton onHighlight 处理异常", t);
} }
} }
} }

View File

@ -22,6 +22,7 @@
"ae2.menu.CraftConfirmMenuGoBackMixin", "ae2.menu.CraftConfirmMenuGoBackMixin",
"extendedae.accessor.GuiExPatternTerminalAccessor", "extendedae.accessor.GuiExPatternTerminalAccessor",
"extendedae.accessor.GuiExPatternTerminalGroupHeaderRowAccessor", "extendedae.accessor.GuiExPatternTerminalGroupHeaderRowAccessor",
"extendedae.accessor.HighlightButtonAccessor",
"extendedae.client.HighlightButtonMixin", "extendedae.client.HighlightButtonMixin",
"extendedae.client.gui.GuiExPatternProviderMixin", "extendedae.client.gui.GuiExPatternProviderMixin",
"extendedae.client.gui.GuiExPatternTerminalMixin", "extendedae.client.gui.GuiExPatternTerminalMixin",