2017-07-24 38 views
0

我有几个Spigot在bungeecord服务器上运行的实例。我有一个插件可以在每台服务器上进行自定义配置文件管理。这个配置文件管理插件读取和写入Mongo数据库。所有的代码工作得很好,我不在这里代码。Mongo数据库配置文件在bungeecord播放器传输上同步

但是,我的问题是这样的。当玩家从一台服务器转移到另一台服务器时,在配置文件再次加载到目标服务器上导致加载旧数据之前,数据不会同步(写入数据库)。由于这些人的统计和经济没有被正确地反映出来。现在,如果他们登录,切换到迷你游戏服务器,玩游戏,然后赚取硬币,然后他们退出服务器(注销),然后统计数据将在下次登录时正确反映。

配置文件管理器加载配置文件内容PlayerJoinEvent和数据写入(保存)在PlayerQuitEventPlayerKickEvent

解决此问题的最佳方法是什么?有人可以请指点我正确的方向吗?

EDIT:electroniccat在官方Spigot IRC上表示,播放器在与之前的服务器断开连接之前开始连接到目标服务器。既然这确实有道理,那么解决这个问题的最好方法是什么?

+0

向我们显示您的代码。 –

+0

根据您的编辑,我认为您可以在玩家登录时更新统计数据,然后在进行所需更新时将其锁定到位(不应超过几ms) – Kerooker

回答

1

我会建议在MongoDB中为您的播放器配置文件添加一个状态变量。

然后,使用bungee插件或类似物来检测玩家何时开始交换服务器;将状态设置为saving

而当您正在保存您的播放器数据on PlayerQuitEvent时,请将状态设置为saved

然后,当玩家登录时,PlayerJoin确保状态为saved。如果不是,请添加一个等待几秒钟的计时器(我建议实际上在AsyncPlayerPreLoginEvent上进行加载,这样登录就会延迟,并且不会用空闲配置文件四处走动),并确保计时器继续尝试(可能最多3次)直到状态saved。如果3次尝试通过并且仍未保存,请踢球员/阻止登录(尽管这不应该发生)。确保尝试之间有足够的延迟。

我不确定你为什么遇到这个问题,因为我以前曾经使用过Mongo服务器作为bungee服务器,并且从未遇到过与玩家配置文件有关的问题。

另一种选择是通过redis进行配置文件缓存,通过保存间隔和休假保持更新。 或发布/订阅或插件消息,将配置文件数据发送到bungee实例,并让它处理保存配置文件。

请确保您设置您的状态saving在玩家登录后立即与他们的个人资料被载入。否则,这些数据将不会被及时读取,因为在蹦极之前退出连接事件。(也许使用布尔而不是“节约” /“保存”会更好,以及)

时间轴:

(状态1 =保存状态0 =等待保存)

初始连接到蹦极:负载简档,简档之后被加载设置status: 0

切换服务器: AsyncPlayerPreLoginEvent上目标服务器火灾:检查是否轮廓加载(如果状态= 1),如果是这样设置status: 0。这可能不会是第一次尝试的情况下,所以有一个计时器每个〜20-40滴答重新尝试

原始服务器上的PlayerQuitEvent触发:更新status: 1,将配置文件保存到mongo具有相同的更新。这将允许目标服务器上的AsyncPlayerPreLoginEvent加载配置文件。

我会建议通过redis使用缓存,因为它与mongo一起工作良好,并且会使这种情况更容易处理,特别是在加载时间方面。