简介
在玩家登入之前,我们将玩家设置为一个我们称之为 Limbo 的阶段。在 limbo 阶段,我们移除了玩家在正确登陆之前的许多权限,包括:
- OP 状态(移除)
- 飞行能力(移除)
- 移动速度*
- 飞行速度*
* 仅在不允许玩家移动时移除 (settings.restrictions.allowMovement
)。
实现
为了只临时的移除未登录的玩家的这些属性,我们需要保证我们存储了玩家登陆时的这些属性的确切的值。我们将这些数据存储在我们称之为 limbo 玩家中。这是一个包含了我们移除的 limbo 属性的对象,比如 op,飞行,移动速度。
一个典型的处理链如下:
- 玩家加入服务器
- 我们创建了一个 limbo 玩家,移除了特定属性比如 op
- 玩家登入
- 我们将这些移除的属性重新添加到现在已经登录的玩家
Timing / 覆写隐患
我们这般处理会有一个问题,那就是如果你对未登录的玩家做出了什么更改,这些更改将在玩家登陆后被覆盖,导致更改失效。所以一个设置了可以飞行的玩家可能在登陆后就不能飞行了。
考虑一下这个例子:
- 玩家以 5 移动速度加入了服务器
- 我们创建了一个 limbo 玩家(将移动速度 5 保存,然后将玩家的移动速度设置为 0)
- 一个管理员在玩家没登录的时候将玩家的移动速度设置为 10
- 玩家登陆
- 我们恢复 limbo 玩家的数据,那么玩家又有了 5 的移动速度
我们允许你配置如何存储这些 limbo 数据来防止这类似的情况发生。你可以在 config.yml 中的 limbo 项里找到这些设置。举个例子,你可能想要保存玩家和 limbo 玩家的最大移动速度,或者你可以设置玩家登陆时的 allow flight
总是为 true。
注意 OP 状态的恢复是不可配置的。因为由于一些安全问题,一个没有注册的玩家是 OP 的话,他将在登陆后失去 op 权限。为了成功设置一个玩家为 op,这名玩家必须登陆。
恢复数据(保存到文件系统中)
如果你的服务器崩溃了,我们可能没有机会来得及恢复我们从玩家身上移除的那些属性。所以当重启一个崩溃的服务器时,有可能有些玩家的移动速度就只有 0.
为了防止这种情况发生,我们将 limbo 玩家存储到文件系统。所以我们实际上是这样处理的:
- 玩家加入
- 我们创建了一个 limbo 玩家,然后将一些属性从原有玩家身上移除
- we create a limbo player and remove the limbo properties from the player
- 我们将这个 limbo 玩家存储在内存,同时也存入文件系统
- 玩家登入
- 我们恢复这些属性
- 将 limbo 玩家从内存移除,删除文件
这份文件是一个备份,这样这份数据就在内存以外的地方存储了一份,以防服务器崩溃。在 config.yml 里,limbo
配置下,你可以配置 limbo 玩家如何被存储。我们推荐用一个单独但是巨大的文件存储,但是你也可以将数据存储在不同多个文件里。