我正在为我的游戏实现基本的(仅供 child 使用)反作弊。我在我的每个移动数据包中都包含了一个时间戳,并在服务器端检查这些数据包之间的时间差。
我还包含了一个数据包,它根据处理速度每 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
如果客户端 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
}
最佳答案
你的系统有一个严重的缺陷,很容易被作弊者绕过:它依赖于客户端提供的时间戳。您从客户端收到的任何数据都可能被作弊者操纵,因此一定不能信任。
如果你想检查服务器上的速度黑客:
- 不定期记录玩家头像的当前位置。 根据服务器时间存储每个日志的时间戳。
- 通过计算距离并将其除以时间戳差来测量两个此类日志条目之间的速度。
当速度大于玩家的速度限制时,那么你可能有作弊者。但请记住,滞后会导致突然的峰值,因此最好采用多个样本的平均速度测量值来检测玩家是否在超速。这可能会降低 speedhack 检测的可靠性,但这实际上可能是一件好事,因为它使黑客更难知道他们使用的任何规避方法的可靠性。
为避免误报,请记住跟踪任何不遵守速度限制的人为移动玩家的方式(例如在被杀死后传送到重生点)。当这样的事件发生时,当前的速度测量是没有意义的,应该被丢弃。
关于c++ - 根据处理速度每 x 秒循环一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36258755/