我正在爲我的遊戲實施基本(僅針對小子)反作弊。我爲每個移動數據包都包含一個時間戳,並在服務器端對這些數據包之間的時間差異進行完整性檢查。根據處理速度每x秒循環
我還包括一個數據包,它根據處理速度每5秒發送一個時間戳。但是這似乎是個人電腦滯後時的問題。
那麼,我應該使用什麼來檢查由於「速度黑客」而導致處理時間是否更快?在客戶端
我的電流回路速度檢查:
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不落後的,也許是因爲內存或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
}
我用VisualStudio2015 – majidarif
@MikeMB不,我還沒有試過steady_clock – majidarif
您的代碼發送給客戶端PC的'system_clock'時間 - 他們可能不同步其PC到任何引用(即使你有),在這種情況下,有即使沒有任何與負載有關的延遲,也可能是服務器時間和他們的時間之間的增量。你最好把他們的信息當作「心跳」 - 期待每個人都說最後10秒鐘。 –