`
zhuyifeng
  • 浏览: 44016 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

解释一下为什么魔兽没办法改金钱

阅读更多

解释一下为什么魔兽没办法改金钱今日上网看到一篇很好的解释了此问题的文章,转载如下:


关于《魔兽争霸3》的验证机制

最近迷上了玩魔兽3的RPG地图,在学习·揣摩和娱乐之中体验到很多乐趣,不仅感慨连连。

一个游戏。在发布5年之后依然在全球拥有几千万的忠实玩家,有着数以万计的开发者不断的深入研究它的机制和扩展接口,并为它开发第三方的地图,插件,以及模型。诸多的电视,网络以及平面媒体紧追其后,捕捉关于它的点点滴滴。任何一个小小的升级都经过开发团队上万次的平衡性测试以及讨论。一个可以用“伟大” 来形容的游戏

我无力的描述并无法表达我对这款游戏以及开发者由衷的赞美和敬佩。暴雪带给我的是一种精神,让我深有感触。

晚上遇到了iSaiAh.net,向他请教了一下魔兽的验证机制。学到很多东西,记录与此:

我的问题是,魔兽的联网对战并没有通过官方架设服务器,那么它是如何来判断双方数据准确性以及合法性的呢。为什么5年之后这款游戏仍然没有一个可以严重影响平衡性的作弊器出现呢?iSaiAh 的回答中包含了几个关键字,如果你都清楚的明白它的含义,那么我的疑问也就可以解答了。

数据同步结构
操作流
相互验证

魔兽发送的封包不包含任何操作的结果,而发送的是操作的本身,即操作流的概念。比如封包A发送的可能是X玩家制造了一个建筑,封包B发送的是Y玩家选择Z 英雄用普通攻击打了X玩家的某一建筑。那么在这两个封包的内容中,只包含操作的方法,不包含任何计算或结果,比如B封包中不会包含Z英雄有没有打到X玩家,打了多少血等等信息。发送的只是一个操作,单纯的向对方描述我的这一动作。但是问题又出现了,如果封包中不包含结果那么如何确保双方的计算结果相同呢,如果计算中有随机因素的出现,又如何确保双方的随机因素一样呢?这就说到了数据同步结构。iSaiAh.net 说魔兽3的数据同步结构可以保证同时计算,同一时刻,双方的随机因素相同。对于这种描述以及所谓的同步结构我并不理解,数学基础只是淡薄。但似乎也只有这么一种方法才可以解释。最后,如果其中某一结果被单方面恶意篡改,则双方计算结果必然不同。即认为双方结果都无效。这就是所谓的相互验证。

欢迎任何来访的达人指出上面分析中的错误,并补充。 我将万分感激。

iSaiAh.net说:在离散数学中,关于递推的原理有一句描述,大概用在这里正合适:
If we Start out right and if Nothing can go wrong,then we will always be right.

其实生活中的很多东西也都如此。
感谢 iSaiAh.net




就是说魔兽联机的时候,计算是在每一台机器上同时进行的

所以你的金钱数量(包括英雄等级、技能冷却之类等数据)在每一台机器都有,你只修改你自己机器上的数据的话,会造成跟其他人数据不一致,结果就是掉线。

而对于魔兽中存在的一些随机数据,例如是否暴击之类,我以前一直认为是在主机上计算的。但是看了这篇文章之后恍然大悟,所谓的随机其实并不是真正的随机,依旧是通过一系列公式计算出来的,当这一公式中所有的变量都是相同的时候,计算结果也相同。

也就是说,随机数据也是同时在每一台机器计算的,所以这些数据你也没有办法修改。
也许有人会问,maphack怎么会存在呢?

maphack其实正好是利用了魔兽的联机数据机制。
正因为计算是在每一台机器同时进行的,所以每个人的机器上都有其他玩家的数据,例如敌方的金钱数量,建筑,单位等等这些数据,而魔兽在本地经过判断,屏蔽了敌方数据,不让他显示出来。
maphack所做的就是修改本地判断,显示出来那些本不应显示的。
因为maphack并没有修改任何数据,所以并不会造成掉线。
另一方面,上面提到了maphack只是修改本地判断,显示出那些本不应该显示的东西,而从一楼的数据操作流理论可以得知,魔兽联机游戏传送的只是操作,所以maphack所做的修改只是在本地,并不会传送到其他机器,所以maphack是无法检测到的,即你无法知道其他玩家是否使用了maphack。


当然还是有两个例外的,一个是mh里的允许选中视野外单位,这个功能的作用是修改本地判断,使你可以点选黑影中的敌方单位。但是你选中黑影中单位的这一个操作会被发送到其他机器,所以其他玩家之后可以在rep中看到你的这个不合理操作(因为正常情况下是无法选中黑雾之中的单位的),这基本是mh的铁证。
另外一个就是dota中的给钱,同上一个一样,这个操作也会被发送并且记录在rep中,因为dota中本来是不允许给钱的,所以这个也是mh铁证。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics