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());
相关条目
- GuiBetterAchievements - 替换目标
- GuiAchievementsOld - 豁免分支
- ClientProxy - 注册器