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.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();
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
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 允许为 null,null 仅与 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 允许为 null,null 仅与 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user