我听说org.bukkit.entity.Player对象在某处加载了块,即使播放器已断开连接,因此它们不应用于数据存储。我的问题是:这是真的,如果是的话,我该怎么做呢?
答案 0 :(得分:3)
我听说org.bukkit.entity.Player对象在某处加载了块,即使播放器已断开连接......我的问题是:这是真的
没有。每当玩家退出或意外断开连接时,播放器将从PlayerChunkMap
移除,从而允许移除相关的块,前提是它们不在其他玩家或插件的范围内,故意保持加载块。块保留在内存中,直到服务器可以保存它们。
...所以它们不应该用于数据存储......如果是,我应该做什么呢?
要在播放器会话或服务器重新启动之间保留数据,播放器的数据 - 无论可能是什么 - 应该键入其UUID
,可以通过getUniqueId()
检索。
例如,PlayerQuitEvent
的事件侦听器检索播放器数据及其UUID,将数据保存到YAML文件或数据库表。相应的PlayerJoinEvent
事件处理程序获取播放器的UUID,读取或查询关联数据并根据需要应用。在Mojang切换到UUID之前,使用播放器的名称也是如此,当时该名称是唯一的,无法更改。
Player
对象仅在玩家的会话期间是唯一的。虽然它可以用作映射,查找表或其他数据结构的键,但您应该始终使用播放器的UUID。此外,应该提到的是,getUniqueId()
返回的玩家的UUID与getEntityId()
返回的玩家的实体ID不同。玩家每次加入时都会有不同的实体ID。
答案 1 :(得分:2)
只需存储播放器的UUID:
player.getUniqueId()
然后让玩家:
Bukkit.getPlayer(uuid)