即使玩家断开连接,org.bukkit.entity.Player 对象也会保存已加载的块,这是真的吗?

Is it true that an org.bukkit.entity.Player object holds chunks loaded even if the player is disconnected?

我在某处听说即使玩家断开连接,org.bukkit.entity.Player 对象仍会加载加载的块,因此不应将它们用于数据存储。我的问题是:这是真的吗?如果是,我应该怎么做?

只需存储玩家的 UUID:

player.getUniqueId()

然后让播放器:

Bukkit.getPlayer(uuid)

I heard somewhere that org.bukkit.entity.Player objects hold chunks loaded even if the player is disconnected ... My question is: Is this true

没有。每当玩家退出或意外断开连接时,玩家就会从 PlayerChunkMap 中移除,从而允许移除关联的块,前提是它们不在其他玩家或插件的范围内,故意保持块加载。块保留在内存中,直到服务器可以保存它们。

...so they should not be used for data storage... and if it is, what should I do instead?

要在玩家会话或服务器重启之间保留数据,玩家的数据 - 无论是什么 - 都应该键入他们的 UUID,可以通过 getUniqueId().[=20= 检索]

例如,PlayerQuitEvent 的事件侦听器检索播放器数据及其 UUID,将数据保存到 YAML 文件或数据库 table(s)。相应的 PlayerJoinEvent 事件处理程序获取玩家的 UUID,读取或查询关联数据并根据需要应用。在 Mojang 切换到 UUID 之前,同样是使用玩家的名字实现的,这在当时是唯一的并且无法更改。

Player 对象仅在玩家会话期间是唯一的。虽然它可以用作地图、查找 table 或其他数据结构的键,但您应该始终使用玩家的 UUID。此外,应该提到的是 getUniqueId() 返回的玩家 UUID 与 getEntityId() 返回的玩家实体 ID 不同。玩家每次加入都会有不同的实体id。