半条命2多人游戏协议是如何工作的?

23

我想知道《半条命2》多人游戏协议在像《反恐精英:源》或《日珥行动:源》这样的模组中是如何运作的。我相信它们使用某种混淆和专有压缩算法。我想了解不同类型的消息是如何编码到数据包中的。


1
我不认为网络协议是这里正确的术语,因此我删除了标签。 - James McMahon
3
重新添加了标签,因为这似乎正是JtR所要求的。 - John Smith
5个回答

41

我想知道添加链接需要多少声望值。这在常见问题解答中似乎没有提到。 - Copas
我认为这可能与我只在几天前创建帐户有关 :) - user110714
3
我主要关注数据包头的增量压缩和结构,但我找不到相关信息。 - JtR
只需在这里留下注释,而不是答案。 - GManNickG
1
这些链接并没有揭示它如何在数据包中编码不同类型的消息。 - JtR

5

你应该查看Luigi Auriemma的Half-Life论文。你也会在那里找到一个数据包解码器和一些反汇编算法。

由于其与作弊的相关性,逆向工程Half-Life 2的信息可能很难获得。我猜像mpcforum这样的论坛是你最好的选择。


这是目前为止最好的答案,即使它并不包含确切的答案。至少我有一个远程机会从那个论坛找到知道这个问题的人,谢谢! - JtR

3

专注于Quake引擎的分支 - 有些最终建立到与Half-Life兼容的程度。像FTEQuakeWorld或TomazQuake这样的引擎可能是很好的起点。 - Andrew Scagnelli
@A. Scagnelli,Source引擎(《半条命2》的引擎)并非基于Quake引擎。因此,虽然它对学习基本的客户端服务器概念有好处,但它不会给你提供完全相同的代码。 - James McMahon
除了许可引擎之外,没有任何东西能够给你精确的代码。而且Source引擎确实有Quake引擎的根基。 - Aistina
@nemo:HL2应该大部分是新代码,但据我所知,其中仍然存在一些Quake引擎代码。不过网络代码可能是不同的。 - John Smith
Quake引擎非常稳定,我会尽可能地模仿id的做法。 - Sneakyness

2
尽管细节可能有所不同,但总体框架非常古老。以下是一个快速概述:
在早期的FPS游戏中,比如《毁灭战士》和《雷神之锤》,玩家的位置只有在服务器响应移动命令时才会更新。也就是说,你按下向前移动按钮,客户端将其传达给服务器,服务器将您的位置更新到其内存中,然后通过新的游戏状态将您的新位置传递回客户端。这导致了非常卡顿的游戏体验:射击,甚至在狭窄的走廊里移动都需要预测延迟。
较新的游戏让客户端自己处理玩家的射击和移动。虽然这导致了没有延迟的移动和射击,但它打开了更多通过黑客攻击客户端代码进行作弊的可能性。现在每个玩家都在自己的计算机上独立地移动和射击,并向服务器通信他们所做的。这仅在两个玩家互相碰撞或同时捡起一个能力提升时才会失败。
现在,服务器拥有来自每个玩家的客户端状态流,并必须将它们同步并形成一致的游戏。技巧在于测量每个玩家的延迟。最终目标是能够用非常低的延迟武器(如狙击步枪或火车炮)对侧移的敌人进行射击,并使其正确命中。如果知道每个玩家的延迟,假设玩家A(延迟50ms)向B(延迟60ms)开枪。为了命中,枪击必须击中B 60ms 前的位置,从A 50ms 前的位置开始。
这只是一个非常粗略的概述,但应该让您有一个大致的想法。

这并没有解释不同类型的消息如何编码在数据包中。 - JtR
2
现在每个玩家都可以在自己的电脑上独立移动和开火,并向服务器通信他们所做的。但这并非完全准确,至少在半条命1中是如此。客户端只能在本地运行相同的模拟以创造零延迟的错觉,但服务器仍然正常接收控制输入,而不是完整的状态。服务器仍然对正在发生的事情有最终决定权,因此客户端不能利用此功能来“打破游戏规则”。 - John Smith

2

我建议您研究一下Quake 1-3引擎。它们可用于源代码。Half-life的协议可能略有不同,但很可能足够接近。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接