即使玩家断开连接,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。
我在某处听说即使玩家断开连接,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。