我的世界的网怎么做的?
最近在研究MC的跨服PVP,发现一个很有意思的东西——网。 所谓“网”就是链接两个不同服务器之间的数据链路,使得玩家能够跨服玩生存、极限等游戏模式。那这个网是怎么做到的呢?我研究了一下Mojang的源代码(现在可以下载了哦)发现其实就是在服务器端和客户端分别保存了一个世界列表,然后通过UUID来唯一标识这个世界,当有玩家加入或者离开某个世界的时候就会更新这两个列表,最后实现跨服。
接下来我们来看一段Java代码,这是来自服务器端的worldlist.java类,在这里我们可以通过worlds这个HashMap来获取或设置某个玩家的世界信息 这是来自客户端的worldstate.java类,这里我们能看到有createSession()和getWorldState()方法用来在服务器和客户端之间传递信息,同时还有worlds和playerList这两个变量,分别用于存储所有世界的信息和所有玩家的信息 在测试插件时可以看到当有玩家进入或者退出游戏时都调用了updateTime()方法来更新这两个列表,最终实现了跨服的效果
不过这样就能够实现跨服了吗?当然不可能!因为服务器只会更新它所管理的世界信息,而客户端只能看到它所连接的服务器上对应的世界信息,如果客户端没有更新的信息就会显示为黑屏,这时就需要一种通用的机制让服务器和客户端都能够收到对方的消息,也就是需要有一种同步的功能。而在我的实验中,我发现这种同步功能似乎是由Forge实现的(具体可以看一下我另外一篇关于Forge的文章)。
以上就是我对MC的跨服原理分析,可能不够完整,希望有大神指点~