GuiOpenHandler

基本信息

属性 值
类名 betterachievements.handler.GuiOpenHandler
源文件 src/main/java/betterachievements/handler/GuiOpenHandler.java
事件总线 MinecraftForge.EVENT_BUS(订阅 GuiOpenEvent)

功能

监听 net.minecraftforge.client.event.GuiOpenEvent,拦截 Minecraft 原版 GuiAchievements 的打开请求,替换为 GuiBetterAchievements,并把原 prevScreen / currentPage 通过反射读出后作为新 GUI 的构造函数参数传入。

GuiAchievementsOld 被豁免(用于 “Old Screen” 按钮直接打开原版界面,避免无限替换)。

反射字段

private static Field prevScreen, currentPage;
static {
    prevScreen = GuiAchievements.class.getDeclaredField("field_146562_a");
    prevScreen.setAccessible(true);
    currentPage = GuiAchievements.class.getDeclaredField("currentPage");
    currentPage.setAccessible(true);
}
字段 来源 含义
field_146562_a GuiAchievements 父 GuiScreen 引用(混淆名)
currentPage GuiAchievements 当前页索引(int)

事件处理逻辑

@SubscribeEvent
public void onGuiOpen(GuiOpenEvent event) {
    if (event.gui instanceof GuiAchievementsOld) return;        // 跳过:旧入口
    if (event.gui instanceof GuiAchievements) {                 // 拦截
        event.setCanceled(true);
        Minecraft.getMinecraft().displayGuiScreen(
            new GuiBetterAchievements(
                (GuiScreen) prevScreen.get(event.gui),
                (Integer) currentPage.get(event.gui) + 1));    // +1 是为了跳过 mcPage
    }
}

+1 的原因:GuiBetterAchievements 收到 page == 0 时会回退到 lastPage(静态字段);GuiAchievements.currentPage = -1 表示无;+1 让 page=0 表示"未指定"。

注册

由 ClientProxy.registerHandlers() 注册:

MinecraftForge.EVENT_BUS.register(new GuiOpenHandler());

相关条目