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.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<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;
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<Long, Object>) 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<Long, GuiExPatternTerminal.PatternProviderInfo> infoMap = ((GuiExPatternTerminalAccessor) terminal).getInfoMap();
var mFace = info.getClass().getMethod("face");
mFace.setAccessible(true);
Object infoFace = mFace.invoke(info); // 允许为 null方块形
for (Map.Entry<Long, GuiExPatternTerminal.PatternProviderInfo> entry : infoMap.entrySet()) {
GuiExPatternTerminal.PatternProviderInfo info = entry.getValue();
// 匹配规则pos 必须相等face 允许为 nullnull 仅与 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 允许为 nullnull 仅与 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);
}
}
}
}

View File

@ -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",