- Код:
#define MAX_AIM_TICKS 3 // Требуемое кол-во выстрелов, чтобы определить чит
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid){ // Автовызываемая ф-ция, которая отвечает за то, что игрок в своём клиенте пытается дать урон другому игроку
if(damagedid == INVALID_PLAYER_ID || !CheckFireArm(GetPlayerWeapon(playerid)) || GetPlayerTargetPlayer(playerid) != INVALID_PLAYER_ID) return 1; // Если игрок ни в кого не стреляет / стреляет не с огнестрельного оружия / не прицелился в цель
new count = GetPVarInt(playerid, "aimcount"), ticks = GetPVarInt(playerid, "aimtick"), currtick = GetTickCount(); // Переменные для кол-ва выстрелов; время последнего выстрела относительно запуска сервера; текущего время относительно запуска сервера
if(currtick - ticks <= 10000 && count + 1 >= MAX_AIM_TICKS){ // Если интервал между выстрелами меньше или равен 10 секунд и кол-во выстрелов больше или равно требуемому кол-ву выстрелов, чтобы определить чит
new msg[144], name[MAX_PLAYER_NAME]; // Массивы для сообщения и хранения никнейма игрока
GetPlayerName(playerid, name, MAX_PLAYER_NAME); // Узнаём никнейм игрока
format(msg, 144, "%s[%i] кикнут по подозрению на использование Aim / Joypad.", name, playerid); // Форматируем сообщение
SendClientMessageToAll(-1, msg); // Отправляем сообщение всем игрокам
Kick(playerid); // Кикаем читера
// ПРИМЕЧАНИЕ! Если Вы замените кик на другое наказание (к примеру, сообщение) — добавьте сюда удаление PVAR'ов и ануллирование переменной count (как в коде после оператора else if ниже)
}
else if(currtick - ticks > 10000) { // Если условие выше не выполнилось и интервал между выстрелами больше 10 секунд
DeletePVar(playerid, "aimcount"); // Удаляем PVar, который хранит кол-во выстрелов
DeletePVar(playerid, "aimtick"); // Удаляем PVar, который хранит время относительно включения сервера
count = 0; // Ануллируем переменную count
currtick = GetTickCount(); // Обновляем время относительно запуска сервера
}
SetPVarInt(playerid, "aimcount", count + 1); // Записываем кол-во выстрелов
SetPVarInt(playerid, "aimtick", currtick); // Записываем время последнего выстрела относительно запуска сервера (в милисекундах)
return 1;
}
CheckFireArm(weaponid) { // Ф-ция, которая определяет, огнестрельное ли оружие (weaponid)
switch(weaponid) {
case 16..39, 41..43: return 1; // Условие, если ID оружие в указанном диапазоне — ф-ция возвращает 1
default: return 0; // Если оружие вне указанного выше диапазона — ф-ция возвращает 0
}
return 0;
}