延迟打开界面

基本信息

属性 值
类 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 打开后又打开了别的界面,本类不会重新介入。

相关条目