package com.extendedae_plus.mixin; import appeng.client.gui.Icon; import appeng.client.gui.AEBaseScreen; import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.widgets.IconButton; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; import com.glodblock.github.extendedae.client.gui.GuiWirelessExPAT; import com.glodblock.github.extendedae.container.ContainerExPatternTerminal; import net.minecraft.client.gui.components.Tooltip; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GuiExPatternTerminal.class) public abstract class GuiExPatternTerminalMixin extends AEBaseScreen { @Unique private IconButton toggleSlotsButton; @Unique private boolean showSlots = true; // 默认显示槽位 public GuiExPatternTerminalMixin(ContainerExPatternTerminal menu, Inventory playerInventory, Component title, ScreenStyle style) { super(menu, playerInventory, title, style); } @Inject(method = "", at = @At("TAIL"), remap = false) private void injectConstructor(ContainerExPatternTerminal menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { // 创建切换槽位显示的按钮 this.toggleSlotsButton = new IconButton((b) -> { System.out.println("ExtendedAE Plus: 按钮被点击,当前showSlots: " + this.showSlots); this.showSlots = !this.showSlots; // 开关状态 System.out.println("ExtendedAE Plus: 切换后showSlots: " + this.showSlots); // 通过反射调用refreshList方法 - 在GuiExPatternTerminal中 try { java.lang.reflect.Method refreshMethod = this.getClass().getDeclaredMethod("refreshList"); refreshMethod.setAccessible(true); refreshMethod.invoke(this); System.out.println("ExtendedAE Plus: refreshList调用成功"); } catch (Exception e) { System.out.println("ExtendedAE Plus: 调用refreshList失败: " + e.getMessage()); e.printStackTrace(); } }) { @Override protected Icon getIcon() { return showSlots ? Icon.PATTERN_ACCESS_HIDE : Icon.PATTERN_ACCESS_SHOW; } }; // 设置按钮提示文本 this.toggleSlotsButton.setTooltip(Tooltip.create(Component.translatable("gui.expatternprovider.toggle_slots"))); // 添加到左侧工具栏 this.addToLeftToolbar(this.toggleSlotsButton); System.out.println("ExtendedAE Plus: 槽位切换按钮已添加到工具栏,默认显示模式: " + this.showSlots); } @Inject(method = "refreshList", at = @At("HEAD"), remap = false) private void onRefreshListStart(CallbackInfo ci) { System.out.println("ExtendedAE Plus: refreshList开始执行 - 显示槽位: " + this.showSlots); // 更新按钮图标 if (this.toggleSlotsButton != null) { this.toggleSlotsButton.setTooltip(Tooltip.create(Component.translatable( this.showSlots ? "gui.expatternprovider.hide_slots" : "gui.expatternprovider.show_slots" ))); } } @Inject(method = "refreshList", at = @At("TAIL"), remap = false) private void onRefreshListEnd(CallbackInfo ci) { System.out.println("ExtendedAE Plus: refreshList结束 - showSlots状态: " + this.showSlots); // 在refreshList结束后,根据showSlots状态过滤SlotsRow if (!this.showSlots) { try { // 通过反射访问rows字段 - 在GuiExPatternTerminal中 java.lang.reflect.Field rowsField = this.getClass().getDeclaredField("rows"); rowsField.setAccessible(true); java.util.ArrayList rows = (java.util.ArrayList) rowsField.get(this); System.out.println("ExtendedAE Plus: 找到rows字段,当前行数: " + rows.size()); // 移除所有SlotsRow,只保留GroupHeaderRow int removedCount = 0; for (int i = rows.size() - 1; i >= 0; i--) { Object row = rows.get(i); String className = row.getClass().getSimpleName(); System.out.println("ExtendedAE Plus: 检查行 " + i + ",类型: " + className); if (className.equals("SlotsRow")) { rows.remove(i); removedCount++; System.out.println("ExtendedAE Plus: 移除行 " + i); } } System.out.println("ExtendedAE Plus: 已隐藏 " + removedCount + " 个槽位行,剩余行数: " + rows.size()); // 强制刷新滚动条 try { java.lang.reflect.Method resetScrollbarMethod = this.getClass().getDeclaredMethod("resetScrollbar"); resetScrollbarMethod.setAccessible(true); resetScrollbarMethod.invoke(this); System.out.println("ExtendedAE Plus: 滚动条已重置"); } catch (Exception e) { System.out.println("ExtendedAE Plus: 重置滚动条失败: " + e.getMessage()); } } catch (Exception e) { System.out.println("ExtendedAE Plus: 访问rows字段失败: " + e.getMessage()); e.printStackTrace(); } } else { System.out.println("ExtendedAE Plus: showSlots为true,不隐藏槽位行"); } } }