你看过什么样的新手错误,有什么治疗方法?
一次又一次发生的是客户端没有以任何方式对服务器进行检查.
例如:
用户反编译Flash游戏源或收听网络流量并查看高分数据的去向,并发送虚假的高分甚至没有玩游戏.
用户使用教练并获得甚至可能不会出现在当前级别的项目.这发送到服务器像"客户端X得到项目Y",服务器只接受.
简单的治疗方法当然只是将游戏客户端作为服务器的API来处理.然后用户可以尽可能多地使用训练器和其他内存操作,但服务器只是说你不能这样做.将服务器视为一个数据库,您可以在其中使用游戏规则查询事物.
例如
客户:开始游戏
客户端:连接到服务器
客户:查询服务器的可用资金数量
用户:使培训师能够将资金设置为无限
客户端:server.buyItem('非常昂贵')
服务器:检查游戏状态(用户现在可以买东西).检查玩家[0] .money - >没有奖金.
客户端:server.buyItem('可以得到这个')
服务器:检查游戏状态(用户现在可以买东西).检查玩家[0] .money,好的.player [0] .items.add('可以得到这个')这将降低玩家[0] .money的成本.然后通知客户端发送(播放器[0],'项目','可以得到这个'); 发送(播放器[0],'钱',播放器[0] .money).
另一种方法是记录客户端的移动并将其发送到服务器播放它的高分服务器.当然,这可能导致该记录非常大.
毫无疑问,盲目信任客户.在我正在开发的游戏中,我们现在将所有"业务逻辑"保留在服务器端,并让客户端机器只向我们发送他们正在制作的命令; 例如"玩家B想要向右移动" - 但是服务器会计算他们移动到右边的距离.这有性能开销(当然还有可以更好地处理滞后的问题),所以可能的中间地点可能是在客户端进行繁重的计算,并且仍然在服务器上进行检查; 例如,检查客户端的播放器是否在更新之间的时间内移动超过了所谓的可能性; 即如果最大播放器速度为200单位/秒,如果您在0.5秒后获得更新,表示他们移动了150个单位,则启动它们.
当然,这并不一定会阻止某人编写机器人来发送这些按键,因此还有其他方法可以防止这种情况发生.尽管如此,根本没有任何验证是一个新手的错误(当我采取捷径时,我当然感到内疚)
Valve采取的方法(至少在某一点上)是让客户和服务器独立地模拟游戏.然后,服务器执行权威模拟并将状态更新发送到所有客户端以更正其错误/黑客尝试.
例如,如果按左箭头,你的角色将立即向左移动; 没有等待服务器说'OK'.但如果事实证明你已经通过墙壁自我攻击,那么下一次服务器更新将使您出现在墙旁边,因为服务器认为它是坚固的.
类似地,如果客户端看到一个字符向前移动,它将假定它将继续向前移动,直到服务器返回权威响应.
当服务器做出主要决策(并在模拟过程中执行健全性检查)时,这种方法会破坏黑客攻击,并且在客户端从服务器获取消息之前进行预测时也会处理延迟.
与"信任客户"相关的另一个重大错误是认为您的网络协议不能伪造.人们倾向于假设如果他们将二进制块发送到服务器,那么这些二进制块将永远不会被逆向工程,并且没有人会试图弄乱数据以查看发生了什么.这导致了各种各样的问题.