简介

在玩家登入之前,我们将玩家设置为一个我们称之为 Limbo 的阶段。在 limbo 阶段,我们移除了玩家在正确登陆之前的许多权限,包括:

  • OP 状态(移除)
  • 飞行能力(移除)
  • 移动速度*
  • 飞行速度*

* 仅在不允许玩家移动时移除 (settings.restrictions.allowMovement)。

实现

为了只临时的移除未登录的玩家的这些属性,我们需要保证我们存储了玩家登陆时的这些属性的确切的值。我们将这些数据存储在我们称之为 limbo 玩家中。这是一个包含了我们移除的 limbo 属性的对象,比如 op,飞行,移动速度。

一个典型的处理链如下:

  1. 玩家加入服务器
  2. 我们创建了一个 limbo 玩家,移除了特定属性比如 op
  3. 玩家登入
  4. 我们将这些移除的属性重新添加到现在已经登录的玩家

Timing / 覆写隐患

我们这般处理会有一个问题,那就是如果你对未登录的玩家做出了什么更改,这些更改将在玩家登陆后被覆盖,导致更改失效。所以一个设置了可以飞行的玩家可能在登陆后就不能飞行了。

考虑一下这个例子:

  1. 玩家以 5 移动速度加入了服务器
  2. 我们创建了一个 limbo 玩家(将移动速度 5 保存,然后将玩家的移动速度设置为 0)
  3. 一个管理员在玩家没登录的时候将玩家的移动速度设置为 10
  4. 玩家登陆
  5. 我们恢复 limbo 玩家的数据,那么玩家又有了 5 的移动速度

我们允许你配置如何存储这些 limbo 数据来防止这类似的情况发生。你可以在 config.yml 中的 limbo 项里找到这些设置。举个例子,你可能想要保存玩家和 limbo 玩家的最大移动速度,或者你可以设置玩家登陆时的 allow flight 总是为 true。

注意 OP 状态的恢复是不可配置的。因为由于一些安全问题,一个没有注册的玩家是 OP 的话,他将在登陆后失去 op 权限。为了成功设置一个玩家为 op,这名玩家必须登陆。

恢复数据(保存到文件系统中)

如果你的服务器崩溃了,我们可能没有机会来得及恢复我们从玩家身上移除的那些属性。所以当重启一个崩溃的服务器时,有可能有些玩家的移动速度就只有 0.

为了防止这种情况发生,我们将 limbo 玩家存储到文件系统。所以我们实际上是这样处理的:

  1. 玩家加入
  2. 我们创建了一个 limbo 玩家,然后将一些属性从原有玩家身上移除
  3. we create a limbo player and remove the limbo properties from the player
    • 我们将这个 limbo 玩家存储在内存,同时也存入文件系统
  4. 玩家登入
  5. 我们恢复这些属性
    • 将 limbo 玩家从内存移除,删除文件

这份文件是一个备份,这样这份数据就在内存以外的地方存储了一份,以防服务器崩溃。在 config.yml 里,limbo 配置下,你可以配置 limbo 玩家如何被存储。我们推荐用一个单独但是巨大的文件存储,但是你也可以将数据存储在不同多个文件里。

results matching ""

    No results matching ""