2009-05-27 36 views
20

我想知道Half-Life 2多人协议如何在类似Counter-Strike:Source或Day Of Defeat:Source的mod中工作。我相信他们使用某种混淆和专有压缩算法。我想知道在一个数据包中不同种类的消息是如何编码的。Half-Life 2多人协议如何工作?

+1

我不相信网络协议在这里是正确的术语,所以我删除了标签。 – 2009-07-29 11:47:14

+1

阅读标签,因为这正是JtR似乎要问的。 – 2009-08-03 11:58:11

回答

3

这是一个非常复杂的问题,我的建议是看一些开源的网络游戏引擎:

你也可以看看源代码用于原始半衰期引擎所基于的地震系列的代码。

+0

专注于地震引擎的分支机构 - 有些结束了与Half-Life的兼容性。像FTEQuakeWorld或TomazQuake等发动机可能是很好的起飞点。 – 2009-07-27 20:57:53

+0

@A。 Scagnelli,The Source引擎(Half-Life 2的引擎)不是基于Quake引擎。所以虽然这对学习基本的客户端服务器概念很有用,但它不会给你确切的代码。 – 2009-07-29 12:00:20

+0

没有什么会给你确切的代码,除了授权发动机。源引擎确实在Quake Engine中有根。 – Aistina 2009-08-03 12:00:43

2

尽管细节可能会有所不同,总体框架非常古老。下面是一个快速概览:

在早期的fps游戏中,例如Doom和Quake,玩家的位置仅在服务器对您的移动命令的响应中更新。也就是说,您按下了前进按钮,客户端将其传达给服务器,服务器将您的位置放在内存上,然后用您的新位置向客户端传递新的游戏状态。这导致了非常迟缓的表现:射击,甚至在狭窄的走廊中移动都是一个预测滞后的游戏。

较新的游戏让客户自己处理玩家的拍摄和动作。尽管这导致了无滞后的移动和火灾,但通过黑客入侵客户端代码开启了更多的作弊可能性。现在每个玩家都可以在自己的计算机上独立移动和触发,并与服务器通信他们所做的事情。这只会在两名球员互相碰撞或试图同时上电时崩溃。

现在服务器拥有来自每个玩家的这个客户端状态流,并且必须同步它们并使它们连贯一致。诀窍是衡量每个玩家的延迟。最终目标是能够向侧身移动的敌人发射非常低等待时间的武器(例如狙击步枪或轨道枪)并使其正确击中。如果知道每个玩家的等待时间,假设玩家A(等待时间50ms)在B上发射枪(等待时间60ms)。为了击中目标,必须击中B在60ms前的B,从A在50ms前。

这是一个非常粗略的概述,但应该给你的总体思路。

5

你应该检查出半条命Luigi Auriemmas papers。你会发现一个数据包解码器和一些反汇编算法。

关于半条命2的逆向工程信息可能很难实现,因为它与作弊有关。我猜想像mpcforum这样的棋盘是你最好的选择。

1

我建议你看看雷神发动机1-3。它们可用于源代码。半条命的协议可能有点不同,但最有可能接近。