我出于好奇一直在做一个UDP网络项目,但遇到了一个难以理解的问题。我已经研究并理解了基本原则,例如:
情景1:本地玩家击中另一个玩家,并将其发送到服务器。然后服务器会向被击中的玩家的客户端发送数据包,触发
情景2:本地玩家被另一个玩家击中,并调用
我只能想到两种解决方案:
- 使用权威服务器,让客户端尽可能少地拥有权限。
- 确保每个客户端都通过自己的加密密钥与服务器唯一标识。
- 通过增加响应数据包的大小来防止DDOS攻击。
- 等等。
我对UDP的大部分了解来自这些精彩的文章:https://gafferongames.com/;而且我很幸运地正在使用这个库, 它基于作者自己的UDP协议,并处理了大部分权威保护。
现在,我的问题是:
即使使用完全权威的服务器,玩家似乎仍然可以作弊。
例如: 对于一个格斗游戏,客户端有两个函数。void hit()
和 void hurt()
,这些是允许客户端刺激战斗的基本功能。情景1:本地玩家击中另一个玩家,并将其发送到服务器。然后服务器会向被击中的玩家的客户端发送数据包,触发
hurt()
函数。但是如果玩家编辑了文件并删除了hurt()
函数,则什么也不会发生。删除了hurt()
函数的玩家将变得无敌。情景2:本地玩家被另一个玩家击中,并调用
hurt()
,并将其发送到服务器。然后服务器会向击中本地玩家的玩家的客户端发送数据包,触发hit()
函数。但是如果本地玩家编辑了文件并删除了hurt()
函数,则什么也不会发生。删除了hurt()
函数的玩家将再次变得无敌。我只能想到两种解决方案:
如果游戏遇到错误(因为函数被删除而不存在),则将客户端从服务器断开连接。(不是很好)
我在写这篇文章时刚想到的另一种解决方案:在服务器上为每个玩家存储一个健康变量,如果达到0,则忽略任何数据包,这些数据包在未编辑游戏时是不可能的。
我现在觉得第二种解决方案听起来不错,但我很想知道你们都做了/会做什么,因为我是个新手。非常感谢任何建议!