基本完成
This commit is contained in:
parent
65db30c1a2
commit
a4ee7651d3
|
|
@ -71,10 +71,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
|
||||
@Unique
|
||||
private boolean eap$debugLoggedOnce = false;
|
||||
@Shadow(remap = false) private AETextField searchOutField;
|
||||
@Shadow(remap = false) private AETextField searchInField;
|
||||
@Shadow(remap = false) private Set<ItemStack> matchedStack;
|
||||
@Shadow(remap = false) private Set<PatternContainerRecord> matchedProvider;
|
||||
|
||||
|
||||
public GuiExPatternTerminalMixin(AEBaseMenu menu, Inventory playerInventory, Component title, ScreenStyle style) {
|
||||
super(menu, playerInventory, title, style);
|
||||
|
|
@ -262,7 +259,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
this.eap$currentlyChoicePatterProvider = -1;
|
||||
}
|
||||
|
||||
@Inject(method = "<init>(Lcom/glodblock/github/extendedae/container/ContainerExPatternTerminal;Lnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/network/chat/Component;Lappeng/client/gui/style/ScreenStyle;)V", at = @At("TAIL"), remap = false)
|
||||
@Inject(method = "<init>(Lcom/glodblock/github/extendedae/container/ContainerExPatternTerminal;Lnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/network/chat/Component;Lappeng/client/gui/style/ScreenStyle;)V", at = @At("TAIL"), remap = false, require = 0)
|
||||
private void injectConstructor(com.glodblock.github.extendedae.container.ContainerExPatternTerminal menu,
|
||||
Inventory playerInventory,
|
||||
Component title,
|
||||
|
|
@ -374,7 +371,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
this.eap$openUIButtons.clear();
|
||||
}
|
||||
|
||||
@Inject(method = "refreshList", at = @At("HEAD"), remap = false)
|
||||
@Inject(method = "refreshList", at = @At("HEAD"), remap = false, require = 0)
|
||||
private void onRefreshListStart(CallbackInfo ci) {
|
||||
// 更新按钮图标
|
||||
if (this.eap$toggleSlotsButton != null) {
|
||||
|
|
@ -387,7 +384,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
this.eap$openUIButtons.clear();
|
||||
}
|
||||
|
||||
@Inject(method = "refreshList", at = @At("TAIL"), remap = false)
|
||||
@Inject(method = "refreshList", at = @At("TAIL"), remap = false, require = 0)
|
||||
private void onRefreshListEnd(CallbackInfo ci) {
|
||||
|
||||
// 在refreshList结束后,根据showSlots状态过滤SlotsRow
|
||||
|
|
@ -489,7 +486,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
}
|
||||
}
|
||||
|
||||
@Inject(method = "drawFG", at = @At("TAIL"), remap = false)
|
||||
@Inject(method = "drawFG", at = @At("TAIL"), remap = false, require = 0)
|
||||
private void eap$afterDrawFG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, int mouseY, CallbackInfo ci) {
|
||||
// 动态放置/创建每个组标题后的“打开UI”按钮
|
||||
try {
|
||||
|
|
@ -498,13 +495,21 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
java.util.ArrayList<?> rows = acc.getRows();
|
||||
int currentScroll = acc.getScrollbar().getCurrentScroll();
|
||||
|
||||
// 直接引用目标类以获取其静态常量
|
||||
Class<?> cls = GuiExPatternTerminal.class;
|
||||
int GUI_PADDING_X = getIntConst(cls, "GUI_PADDING_X", 22);
|
||||
int GUI_PADDING_Y = getIntConst(cls, "GUI_PADDING_Y", 6);
|
||||
int GUI_HEADER_HEIGHT = getIntConst(cls, "GUI_HEADER_HEIGHT", 51);
|
||||
int ROW_HEIGHT = getIntConst(cls, "ROW_HEIGHT", 18);
|
||||
int TEXT_MAX_WIDTH = getIntConst(cls, "TEXT_MAX_WIDTH", 155);
|
||||
// 通过反射获取目标类静态常量,避免直接依赖可选模组类
|
||||
int GUI_PADDING_X = 22;
|
||||
int GUI_PADDING_Y = 6;
|
||||
int GUI_HEADER_HEIGHT = 51;
|
||||
int ROW_HEIGHT = 18;
|
||||
int TEXT_MAX_WIDTH = 155;
|
||||
try {
|
||||
Class<?> cls = Class.forName("com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal");
|
||||
GUI_PADDING_X = getIntConst(cls, "GUI_PADDING_X", GUI_PADDING_X);
|
||||
GUI_PADDING_Y = getIntConst(cls, "GUI_PADDING_Y", GUI_PADDING_Y);
|
||||
GUI_HEADER_HEIGHT = getIntConst(cls, "GUI_HEADER_HEIGHT", GUI_HEADER_HEIGHT);
|
||||
ROW_HEIGHT = getIntConst(cls, "ROW_HEIGHT", ROW_HEIGHT);
|
||||
TEXT_MAX_WIDTH = getIntConst(cls, "TEXT_MAX_WIDTH", TEXT_MAX_WIDTH);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
|
||||
int visibleRows = acc.getVisibleRows();
|
||||
|
||||
|
|
@ -547,16 +552,78 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen<AEBaseMenu>
|
|||
} catch (Throwable ignored) {
|
||||
}
|
||||
|
||||
// 原有的搜索高亮逻辑
|
||||
// 仅当任一搜索框非空时绘制叠加层(与原版行为保持一致)
|
||||
boolean searchActive = (this.searchOutField != null && !this.searchOutField.getValue().isEmpty())
|
||||
|| (this.searchInField != null && !this.searchInField.getValue().isEmpty());
|
||||
if (!searchActive) {
|
||||
return;
|
||||
}
|
||||
// 原有的搜索高亮逻辑(使用反射以兼容不同版本的 ExtendedAE GUI)
|
||||
try {
|
||||
// 仅当任一搜索框非空时绘制叠加层
|
||||
boolean searchActive = false;
|
||||
try {
|
||||
var fOut = this.getClass().getDeclaredField("searchOutField");
|
||||
fOut.setAccessible(true);
|
||||
Object outField = fOut.get(this);
|
||||
if (outField != null) {
|
||||
var mGetVal = outField.getClass().getMethod("getValue");
|
||||
Object val = mGetVal.invoke(outField);
|
||||
if (val instanceof String s && !s.isEmpty()) {
|
||||
searchActive = true;
|
||||
}
|
||||
}
|
||||
} catch (NoSuchFieldException ignored) {
|
||||
}
|
||||
if (!searchActive) {
|
||||
try {
|
||||
var fIn = this.getClass().getDeclaredField("searchInField");
|
||||
fIn.setAccessible(true);
|
||||
Object inField = fIn.get(this);
|
||||
if (inField != null) {
|
||||
var mGetVal = inField.getClass().getMethod("getValue");
|
||||
Object val = mGetVal.invoke(inField);
|
||||
if (val instanceof String s && !s.isEmpty()) {
|
||||
searchActive = true;
|
||||
}
|
||||
}
|
||||
} catch (NoSuchFieldException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
// 使用 GuiUtil 的通用绘制方法绘制槽位高亮(包含彩虹流转效果)
|
||||
GuiUtil.drawPatternSlotHighlights(guiGraphics, this.menu.slots, this.matchedStack, this.matchedProvider);
|
||||
if (!searchActive) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 读取 matchedStack 与 matchedProvider
|
||||
Set<ItemStack> matchedStack = null;
|
||||
Set<PatternContainerRecord> matchedProvider = null;
|
||||
try {
|
||||
var fMs = this.getClass().getDeclaredField("matchedStack");
|
||||
fMs.setAccessible(true);
|
||||
Object ms = fMs.get(this);
|
||||
if (ms instanceof Set<?> s) {
|
||||
// 原始是 Set<ItemStack>
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<ItemStack> cast = (Set<ItemStack>) (Set<?>) s;
|
||||
matchedStack = cast;
|
||||
}
|
||||
} catch (NoSuchFieldException ignored) {
|
||||
}
|
||||
try {
|
||||
var fMp = this.getClass().getDeclaredField("matchedProvider");
|
||||
fMp.setAccessible(true);
|
||||
Object mp = fMp.get(this);
|
||||
if (mp instanceof Set<?> s) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<PatternContainerRecord> cast = (Set<PatternContainerRecord>) (Set<?>) s;
|
||||
matchedProvider = cast;
|
||||
}
|
||||
} catch (NoSuchFieldException ignored) {
|
||||
}
|
||||
|
||||
if (matchedStack == null || matchedProvider == null) {
|
||||
return; // 缺少必要数据则不绘制
|
||||
}
|
||||
|
||||
// 使用 GuiUtil 的通用绘制方法绘制槽位高亮(包含彩虹流转效果)
|
||||
GuiUtil.drawPatternSlotHighlights(guiGraphics, this.menu.slots, matchedStack, matchedProvider);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,58 +3,59 @@
|
|||
"package": "com.extendedae_plus.mixin",
|
||||
"compatibilityLevel": "JAVA_21",
|
||||
"mixins": [
|
||||
"ae2.AEProcessingPatternMixin",
|
||||
"ae2.CraftingCPUClusterMixin",
|
||||
"ae2.EncodedPatternItemMixin",
|
||||
"ae2.QuartzCuttingKnifeItemMixin",
|
||||
"ae2.accessor.MEStorageMenuAccessor",
|
||||
"ae2.accessor.PatternEncodingTermMenuAccessor",
|
||||
"ae2.accessor.PatternProviderLogicAccessor",
|
||||
"ae2.accessor.PatternProviderLogicPatternInputsAccessor",
|
||||
"ae2.accessor.PatternProviderLogicPatternsAccessor",
|
||||
"ae2.accessor.PatternProviderMenuAdvancedAccessor",
|
||||
"ae2.menu.PatternProviderMenuAdvancedMixin",
|
||||
"ae2.menu.PatternProviderMenuDoublingMixin",
|
||||
"ae2.autopattern.CraftingServiceGetProvidersMixin",
|
||||
"ae2.autopattern.CraftingTreeNodeAccessor",
|
||||
"ae2.autopattern.CraftingTreeNodeMixin",
|
||||
"ae2.autopattern.CraftingTreeProcessMixin",
|
||||
"ae2.autopattern.PatternProviderLogicContainsRedirectMixin",
|
||||
"ae2.helpers.PatternProviderLogicAdvancedMixin",
|
||||
"ae2.helpers.PatternProviderLogicDoublingMixin",
|
||||
"ae2.AEProcessingPatternMixin",
|
||||
"ae2.autopattern.CraftingTreeNodeAccessor",
|
||||
"ae2.autopattern.CraftingTreeProcessMixin",
|
||||
"ae2.autopattern.CraftingTreeNodeMixin",
|
||||
"ae2.autopattern.CraftingServiceGetProvidersMixin",
|
||||
"ae2.autopattern.PatternProviderLogicContainsRedirectMixin",
|
||||
"ae2.accessor.PatternProviderLogicPatternInputsAccessor",
|
||||
"ae2.menu.ContainerPatternEncodingTermMenuMixin",
|
||||
"ae2.menu.MEStorageMenuMixin",
|
||||
"ae2.menu.PatternEncodingTermMenuMixin",
|
||||
"ae2.menu.PatternProviderMenuAdvancedMixin",
|
||||
"ae2.menu.PatternProviderMenuDoublingMixin",
|
||||
"ae2WTlib.ContainerUWirelessExPatternTerminalMixin",
|
||||
"extendedae.common.PartExPatternProviderMixin",
|
||||
"extendedae.common.TileExPatternProviderMixin",
|
||||
"extendedae.container.ContainerExPatternProviderMixin",
|
||||
"extendedae.container.ContainerExPatternTerminalMixin",
|
||||
"extendedae.container.ContainerWirelessExPatternTerminalMixin",
|
||||
"ae2.menu.PatternEncodingTermMenuMixin",
|
||||
"ae2.menu.ContainerPatternEncodingTermMenuMixin",
|
||||
"ae2.menu.MEStorageMenuMixin",
|
||||
"ae2.accessor.MEStorageMenuAccessor",
|
||||
"ae2.accessor.PatternEncodingTermMenuAccessor",
|
||||
"ae2.CraftingCPUClusterMixin",
|
||||
"ae2.EncodedPatternItemMixin",
|
||||
"ae2.QuartzCuttingKnifeItemMixin",
|
||||
"ae2WTlib.ContainerUWirelessExPatternTerminalMixin"
|
||||
"extendedae.container.ContainerWirelessExPatternTerminalMixin"
|
||||
],
|
||||
"client": [
|
||||
"ae2.client.gui.AEBaseScreenMixin",
|
||||
"ae2.client.gui.PatternEncodingTermScreenMixin",
|
||||
"ae2.client.gui.PatternProviderScreenMixin",
|
||||
"ae2.client.gui.SlotGridLayoutMixin",
|
||||
"jei.EncodePatternTransferHandlerMixin",
|
||||
"jei.AE2JeiEncodePatternTransferHandlerMixin",
|
||||
"jei.EncodingHelperMixin",
|
||||
"jei.accessor.BookmarkOverlayAccessor",
|
||||
"ae2.accessor.AEBaseScreenAccessor",
|
||||
"ae2.accessor.MEStorageScreenAccessor",
|
||||
"PickFromWirelessMixin",
|
||||
"accessor.AbstractContainerScreenAccessor",
|
||||
"accessor.ScreenAccessor",
|
||||
"ae2.accessor.AEBaseScreenAccessor",
|
||||
"ae2.accessor.AEBaseScreenInvoker",
|
||||
"ae2.accessor.MEStorageScreenAccessor",
|
||||
"ae2.accessor.PatternAccessTermScreenAccessor",
|
||||
"ae2.accessor.PatternAccessTermScreenSlotsRowAccessor",
|
||||
"extendedae.accessor.GuiExPatternTerminalAccessor",
|
||||
"extendedae.client.gui.GuiExPatternProviderMixin",
|
||||
"ae2.client.gui.AEBaseScreenMixin",
|
||||
"ae2.client.gui.PatternEncodingTermScreenMixin",
|
||||
"ae2.client.gui.PatternProviderCloseMixin",
|
||||
"hooks.ModelBakeryMixin",
|
||||
"ae2.accessor.AEBaseScreenInvoker",
|
||||
"ae2.client.gui.PatternProviderScreenMixin",
|
||||
"ae2.client.gui.SlotGridLayoutMixin",
|
||||
"extendedae.accessor.GuiExPatternTerminalAccessor",
|
||||
"extendedae.accessor.GuiExPatternTerminalSlotsRowAccessor",
|
||||
"extendedae.client.HighlightButtonMixin",
|
||||
"PickFromWirelessMixin"
|
||||
"extendedae.client.gui.GuiExPatternProviderMixin",
|
||||
"extendedae.client.gui.GuiExPatternTerminalMixin",
|
||||
"hooks.ModelBakeryMixin",
|
||||
"jei.AE2JeiEncodePatternTransferHandlerMixin",
|
||||
"jei.EncodePatternTransferHandlerMixin",
|
||||
"jei.EncodingHelperMixin",
|
||||
"jei.accessor.BookmarkOverlayAccessor"
|
||||
],
|
||||
"injectors": {
|
||||
"defaultRequire": 1
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user