插件的生命周期

在任何使插件可见的状态之前,插件加载程序首先确定所有可用的插件的依赖关系,并按依赖关系对插件进行拓扑排序。接着,每个生命周期事件按照刚刚得到的排序依次提供给插件。例如,包含 [required-]after:B 的插件 A 将在插件 B 完成给定状态的工作之后获取每个事件。此外,生命周期状态是全局的,也就是说,所有彼此可见的插件会同时从一个生命周期跳到另一个生命周期。

警告

Sponge 服务器的 Server 实例不是什么时候都可以使用的。可以通过 Sponge.isServerAvailable() 或者 Game.isServerAvailable() 这两个方法来检查是否可用。

状态事件

状态事件的三个类别︰

  1. 初始化(Initilaization): 在实际游戏开始之前 Sponge 和插件加载时的状态。初始化状态只发生一次。
  2. 运行(Running): 当游戏和世界加载时的状态。运行状态可能出现多次。
  3. 停止(Stopping): 当游戏停止时的状态。和初始化状态类似,停止状态只出现一次。

初始化状态

初始化状态只会出现一次。

CONSTRUCTION

触发 GameConstructionEvent 时,游戏会构造带有 @Plugin 注解的类实例。

PRE_INITIALIZATION

触发 GamePreInitializationEvent 时,插件准备进行初始化,这时默认的 Logger 已经准备好被调用,同时你也可以开始引用配置文件中的内容。

INITIALIZATION

触发 GameInitializationEvent 时,插件应该完成他所需功能的所有应该完成的准备工作,你应该在这个事件发生时注册监听事件。

POST_INITIALIZATION

触发 GamePostInitializationEvent 时,你应该准备好不同插件之间的交互信息,有的插件也提供了一些基础 API 来接受交互请求。

LOAD_COMPLETE

触发 GameLoadCompleteEvent 时,所有插件都已准备就绪。

运行状态

有些状态可能会出现多次,在 SERVER_ABOUT_TO_START 阶段后可能紧接着会出现 SERVER_STOPPED ,同时任何时刻服务器均可能进入 SERVER_STOPPED 阶段,因为需要停下来处理发生的错误。

SERVER_ABOUT_TO_START

触发 GameAboutToStartServerEvent 时,服务器实例已经可用,但世界仍未被载入。

SERVER_STARTING

触发 GameStartingServerEvent 时,服务器初始化和世界载入都已经完成,你应该在这时注册插件命令。

SERVER_STARTED

触发 GameStartedServerEvent 时,服务器实例已经可用,世界也已被载入。

SERVER_STOPPING

触发 GameStoppingServerEvent 时,服务器会进入最后一个 Tick,紧接着就会开始保存世界。

SERVER_STOPPED

触发 GameStoppedServerEvent 时,任何玩家都无法连接至服务器,对世界所做的任何更改也不会被保存。

停止状态

服务器停止中只会有一次。当游戏正常退出的时候就会变成此状态,例如你点下命令提示符的关闭按钮,或者是输入 /stop 命令,或是按下退出游戏按钮。

警告

Sponge 不能保证一定会在关闭前变成即将关闭的状态,因为 有时 服务器会被强制关闭:服务器崩溃、任务管理器、Ctrl-C、或其他类似情况等。

GAME_STOPPING

触发 GameStoppingServerEvent 时,阶段 GAME_STOPPED 已经发生了。提供 API 的插件仍然可以接受基本调用。

GAME_STOPPED

触发 GameStoppedServerEvent 时,Minecraft 将会立即关闭,插件无法跟游戏进行任何交互。