Anticheat
Mendeteksi speed hack, teleport, dan gerakan mustahil di gamemode.
Core Knight melaporkan posisi mentah dan tidak menilainya. Anticheat adalah kebijakan gamemode yang dibangun di atas player::update dan player::enter_vehicle.
Cek kecepatan dan teleport
knight
let MAX_SPEED = 60.0; // unit per detik
let TELEPORT_JUMP = 300.0; // lompatan satu sampel
let lastX = {};
let lastY = {};
let lastZ = {};
let lastT = {};
let strikes = {};
player::update(int playerid, float x, float y, float z) {
let px = lastX[playerid];
if (px == null) {
lastX[playerid] = x; lastY[playerid] = y; lastZ[playerid] = z;
lastT[playerid] = GetTickCount();
return;
}
let dt = (GetTickCount() - lastT[playerid]) / 1000.0;
if (dt <= 0.0) { return; }
let dx = x - lastX[playerid];
let dy = y - lastY[playerid];
let dz = z - lastZ[playerid];
let dist = sqrt(dx * dx + dy * dy); // horizontal saja
lastX[playerid] = x; lastY[playerid] = y; lastZ[playerid] = z;
lastT[playerid] = GetTickCount();
if (dz > 100.0) { return; } // lompat/jatuh
if (dist > TELEPORT_JUMP) {
strikes[playerid] = strikes[playerid] + 1;
if (strikes[playerid] >= 3) {
KickPlayer(playerid, "teleport terdeteksi");
}
return;
}
if (dist / dt > MAX_SPEED) {
SendClientMessage(playerid, "Pelan-pelan!");
}
};
Warning
Jangan pernah kick berdasarkan satu sampel. Jitter jaringan, respawn, dan keluar kendaraan menghasilkan lompatan sah. Gunakan jendela strike dan reset baseline saat spawn dan event kendaraan.
Reset baseline saat respawn dan ganti kendaraan
knight
function resetBaseline(int playerid) {
lastX[playerid] = null;
lastY[playerid] = null;
lastZ[playerid] = null;
lastT[playerid] = null;
}
player::spawn(int playerid) { resetBaseline(playerid); };
player::enter_vehicle(int playerid, int vehicleid, bool passenger) { resetBaseline(playerid); };
player::exit_vehicle(int playerid, int vehicleid) { resetBaseline(playerid); };
Sinyal lain
player::weapon_shot— id senjata dan koordinat hit, berguna untuk validasi damage.player::unoccupied_sync— perubahan health kendaraan mentah untuk eksploit damage kendaraan.player::aim— data kamera/aim untuk heuristik silent-aim.GetPlayerPingdanGetPlayerVersion— mengidentifikasi klien mencurigakan.