to w3guy(Jaz):其实我觉得多人游戏中每个玩家都存储其他玩家的当前状态是不大可能的;星际中任何一个玩家的每一个兵或者建筑都是由一个线程(我想应该是这样的)来控制的,当某一个玩家的状态改变时,它最多就应该会向其他玩家发送那些状态改变了的新的数据;如果任何一个玩家都存储其他玩家的状态,那么它首先应该会接受其他玩家发送过来的数据,然后更新保存的状态为新状态,然后再更新地图上的显示(比如兵的移动,建筑物的建造状态等),这样一来游戏的同步速度应该会变慢的;但是从该钱而被踢掉的情况来看,一个玩家对于其他玩家来讲不存储任何数据也是不可能的~~~~我机械地通过程序改变我的矿数,但是应该说没有任何消息发送到其他玩家,因为这是我还没有用矿来造兵或者建筑,但是被踢掉了;之所以会这样我想可能存在一个专门的线程来监视玩家的资源(矿或者气)的状态改变,一旦改变了,这个线程就发送消息到其他玩家,由于被改变后的资源数目一般很大(例如我改了1000000),它不如我们以前所说的差额为8的要求,因此被踢掉了!我应该试一下,改钱时把新值改为原来的数值+8.
to gavinyu:的确,做这个需要去测试,但是在测试之前需要有目的,有方法,对嘛?我想大家都遇到过难题,当自己的想法不能得到验证而又没有新的想法时,总想听听大家的意见.通过交流,产生新的假想,又否定这个假想,再产生新的假想,...这个过程可能需要时间,但是这个过程会出现新的火花的吧!
当A玩家的状态发生变化,它肯定会发数据通知其他玩家,假定它是这样实现的,发送A所做的动作以及这个动作的结果给其他所有玩家,那么修改A的数据而不被系统检测到几乎是不可能的。比如:
A 采了一点矿,它会把采了一点矿和采过后的总矿数发给其他玩家,其他玩家接受到数据后,在自己的机器上对A的数据做采一点矿的处理然后把总矿数和发来的总矿数做比较,如何不符合,则A 会被踢出。
to w3guy(Jaz):即使像你所说,就算是星际这个程序本身也不可能在同一时刻把所有局域网中其他玩家的备份内存改变。会不会是这样呢?星际这个程序本身在某一个玩家(比如A玩家)每采取一点矿(8)时,就会向局域网中其他玩家发送一个消息,用来说明A玩家采了一点矿,发送A玩家的当前矿的数目,由于每点矿的大小为8,那么这些玩家在各自的程序中判断A玩家的当前矿数目与本地内存的A玩家的备份矿数目的差额是否等于8.如果相等就是合法的,否则就是不合法,因此会把A玩家踢掉.因为我在修改时只是简单的把本地内存的矿数目改变,而既没有向其他玩家发送消息,也没有满足差额大小为8的要求,因此被踢掉了?
多谢大家的支持!!!
暗黑和星际的确是非常经典的游戏,但是正如yaogreat所说,游戏和作弊是两码事一样,我们只讨论技术,而不会涉及到道德之类的东西。
to kpld8888(kpld) :你的话中有话啊,挺有意思。
to joise:你的话有道理,因为在你回复之前,我已经注意到这个可能性了,而且我试过不同的种族,无论使用哪一个,存钱的虚拟内存地址都是在0x00501370、0x00501374的地方,但是不是唯一的,他们随机地交替出现,而气矿的虚拟内存地址的对应为0x005013A0、0x005013A4.
并且可以肯定的一件事是存钱的数据类型是4个字节大小,这个我试过了。
(测试的星际版本是1.10)
但是如果真的是在多人模式下储存钱的那块内存有备份,怎么样能同时修改这两个内存地址为同一数值呢?我曾试着把网线拔掉,再修改内存钱,数目是对了,但是一旦把网线接上,马上又给踢掉了。