我想知道半条命 2 多人游戏协议如何在反恐精英:来源或失败之日:来源等模组中发挥作用。我相信他们使用了某种混淆和专有压缩算法。我想知道不同类型的消息是如何编码在一个数据包中的。
5 回答
半条命 2、反恐精英:来源等都使用 Valves Source 引擎。Valve 有一个开发者 wiki,它涵盖了很多东西(它很酷,看看吧!)...
这些文章可能会让您感兴趣:
你应该查看关于半条命的Luigi Auriemmas 论文。你也会在那里找到一个数据包解码器和一些反汇编的算法。
半条命 2 的逆向工程信息可能很难获得,因为它与作弊有关。我猜像mpcforum这样的板是你最好的选择。
这是一个非常复杂的问题,我的建议是看一些开源网络游戏引擎:
- http://www.hawksoft.com/hawknl/
- http://www.zoidcom.com/
- http://sourceforge.net/projects/opentnl
- http://www.gillius.org/gne/
您还可以查看原始半衰期引擎所基于的地震系列的源代码。
尽管细节可能有所不同,但总体框架已经很老了。这是一个快速概述:
在诸如毁灭战士和雷神之锤等早期 fps 游戏中,玩家的位置仅在服务器对您的移动命令的响应时更新。也就是说,您按下前进按钮,客户端将其传达给服务器,服务器更新您在其内存中的位置,然后使用您的新位置将新的游戏状态传递给您的客户端。这导致了非常滞后的比赛:射击,甚至在狭窄的走廊中移动都是预测滞后的游戏。
较新的游戏让客户端自己处理玩家的射击和移动。尽管这导致了无延迟的移动和火灾,但它通过破解客户端代码打开了更多作弊的可能性。现在每个玩家都在自己的计算机上独立移动和射击,并将他们所做的事情传达给服务器。只有当两名玩家相互碰撞或试图同时获得能量时,这才会失效。
现在服务器拥有来自每个玩家的客户端状态流,并且必须同步它们并用它们制作一个连贯的游戏。诀窍是测量每个玩家的延迟。最终目标是能够向侧向移动的敌人发射非常低延迟的武器(例如狙击步枪或轨道炮)并使其正确命中。如果知道每个玩家的延迟,假设玩家 A(延迟 50 毫秒)向 B 开枪(延迟 60 毫秒)。要命中,必须击中 B,B 是 60 毫秒前的位置,而 A 是 50 毫秒前的位置。
这是一个非常粗略的概述,但应该给你一个大致的想法。
我建议您查看 Quake 1-3 引擎。它们与源代码一起提供。半条命的协议可能有点不同,但很可能足够接近。