延迟打开界面
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.github.lunatrius.core.handler.DelayedGuiDisplayTicker |
| 唯一入口 | public static void create(GuiScreen guiScreen, int delay) |
| 注册总线 | FML 总线(FMLCommonHandler.instance().bus()) |
| 订阅事件 | cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent |
该类用于「等若干 tick 之后再打开界面」,典型用途是避免在事件回调栈内直接调用 displayGuiScreen 导致的界面崩溃。
成员
| 成员 | 类型 | 说明 |
|---|---|---|
guiScreen |
private final GuiScreen |
待打开的目标界面 |
ticks |
private int |
剩余 tick 计数 |
| 构造函数 | private DelayedGuiDisplayTicker(GuiScreen guiScreen, int delay) |
私有,外部只能通过 create 创建 |
方法
| 签名 | 行为 |
|---|---|
@SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) |
this.ticks--;当 this.ticks < 0 时 Minecraft.getMinecraft().displayGuiScreen(this.guiScreen) 并 FMLCommonHandler.instance().bus().unregister(this) |
public static void create(GuiScreen guiScreen, int delay) |
FMLCommonHandler.instance().bus().register(new DelayedGuiDisplayTicker(guiScreen, delay)) |
计数语义
判断条件是 ticks < 0 而非 ticks <= 0,所以实际延迟为 delay + 1 个客户端 tick:
delay 入参 |
触发时机 |
|---|---|
0 |
第 2 次 ClientTickEvent |
1 |
第 3 次 ClientTickEvent |
20 |
第 22 次 ClientTickEvent |
[!IMPORTANT] 本 mod 内部从不调用
create()。grep -rn "DelayedGuiDisplayTicker"在src/main/java/下只命中它自己的文件(第 10、15、36 行),ClientProxy.registerTickers()也没有注册它。因此这是一个纯粹供外部 mod 使用的公共 API,在整合包里默认处于休眠状态。
[!NOTE] 触发后调用
unregister(this)自注销,因此每个实例只会打开一次界面。若目标GuiScreen打开后又打开了别的界面,本类不会重新介入。