HighlightButtonMixin优化
This commit is contained in:
parent
66ee90c4be
commit
ed4dafd483
|
|
@ -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();
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
@ -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 允许为 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user