maj*_*rif 6 c++ performance loops infinite-loop
我正在为我的游戏实施一个基本的(仅适用于小孩)反作弊.我在每个移动数据包中都包含了一个时间戳,并在服务器端对这些数据包之间的时间差进行了健全性检查.
我还包括一个数据包,它根据进程速度每5秒发送一次时间戳.但是,当PC滞后时,这似乎是一个问题.
那么我应该用什么来检查由于"速度黑客"而导致的处理时间是否更快?
我在客户端的当前循环速度检查:
this_time = clock();
time_counter += (double)(this_time - last_time);
last_time = this_time;
if (time_counter > (double)(5 * CLOCKS_PER_SEC))
{
time_counter -= (double)(5 * CLOCKS_PER_SEC);
milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
uint64_t curtime = ms.count();
if (state == WALK) {
// send the CURTIME to server
}
}
// other game loop function
Run Code Online (Sandbox Code Playgroud)
如果客户端PC因RAM或CPU问题而没有延迟,则上面的代码可以正常工作.他们可能运行了太多的应用程序.
服务器端代码供参考:(GoLang)
// pktData[3:] packet containing the CURTIME from client
var speed = pickUint64(pktData, 3)
var speedDiff = speed - lastSpeed
if lastSpeed == 0 {
speedDiff = 5000
}
lastSpeed = speed
if speedDiff < 5000 /* 5000 millisec or 5 sec */ {
c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client
}
Run Code Online (Sandbox Code Playgroud)
您的系统有一个严重缺陷,很容易让作弊者规避:它依赖于客户端提供的时间戳。您从客户端收到的任何数据都可能被作弊者操纵,因此不得信任它。
如果您想检查服务器上的速度黑客攻击:
当速度大于玩家的速度限制时,那么你可能有作弊者。但请记住,滞后可能会导致突然的峰值,因此最好采用多个样本的平均速度测量来检测玩家是否超速。这可能会降低 speedhack 检测的可靠性,但这实际上可能是一件好事,因为它使黑客更难知道他们使用的任何规避方法的可靠性。
为了避免误报,请记住跟踪任何不遵守速度限制的人为移动玩家的方式(例如被杀死后传送到重生点)。当这种事件发生时,当前的速度测量没有意义,应该被丢弃。
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |