पर आधारित हर एक्स सेकंड लूप मैं अपने खेल के लिए एक मूल (केवल kiddies) विरोधी धोखाधड़ी लागू कर रहा हूँ। मैंने अपने प्रत्येक आंदोलन पैकेट में एक टाइमस्टैम्प शामिल किया है और उन पैकेटों के बीच के समय के अंतर के लिए सर्वर पक्ष पर सैनिटी चेक करता है।प्रक्रिया गति
मैंने एक पैकेट भी शामिल किया है जो प्रक्रिया गति के आधार पर हर 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
कोड ऊपर ठीक काम करता है, तो ग्राहकों को पीसी राम या 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
आपका कोड ग्राहक पीसी 'system_clock' समय भेजता उपयोग कर रहा हूँ - वे किसी भी संदर्भ के लिए अपने पीसी को सिंक्रनाइज़ नहीं किया जा सकता है (भले आप) है, जो वहाँ के मामले में आपके सर्वर के समय और उनके बीच किसी भी लोड-संबंधित अंतराल के बिना भी एक डेल्टा हो सकता है। आप अपने संदेशों को "दिल की धड़कन" के रूप में मानने से बेहतर होंगे - प्रत्येक के भीतर अंतिम के 10 सेकंड कहें। –