- 64
- 368
Данный фикс сделан больше для ознакомления, нежели для практического применения. «Фикс ради фикса»
В чём суть: перед открытием списка игроков, стоя на ногах, вы отправляете на сервер нажатие кнопки TAB
Последовательность на обычном клиенте: отправка в onfoot пакете нажатия кнопки TAB, после отправка 155 пакета (UPDATESCORESPINGSIPS)
Последовательности на фейк клиенте просто нет. Каждые 3 секунды бот отправляет на сервер 155 пакет без предварительной отправки нажатия кнопки
Что делает скрипт: перед отправкой 155 пакета бот будет дополнительно отправлять в onfoot синхре кнопку TAB. Обновление пинга и уровня бота будет происходить в случайное время (в диапазоне 10-120 секунд), а не каждые 3 сек
Если бот в качестве водителя, пассажира или в режиме слежки, то отправка обновления будет происходить случайно раз в 3-10 секунд
Минусы: функции getBotScore() и getBotPing() могут некорректно отображать данные. Если всё же будете использовать этот скрипт, то лучше получать уровень хуком диалога статистики персонажа или т.п.
В чём суть: перед открытием списка игроков, стоя на ногах, вы отправляете на сервер нажатие кнопки TAB
Последовательность на обычном клиенте: отправка в onfoot пакете нажатия кнопки TAB, после отправка 155 пакета (UPDATESCORESPINGSIPS)
Последовательности на фейк клиенте просто нет. Каждые 3 секунды бот отправляет на сервер 155 пакет без предварительной отправки нажатия кнопки
Что делает скрипт: перед отправкой 155 пакета бот будет дополнительно отправлять в onfoot синхре кнопку TAB. Обновление пинга и уровня бота будет происходить в случайное время (в диапазоне 10-120 секунд), а не каждые 3 сек
Если бот в качестве водителя, пассажира или в режиме слежки, то отправка обновления будет происходить случайно раз в 3-10 секунд
Минусы: функции getBotScore() и getBotPing() могут некорректно отображать данные. Если всё же будете использовать этот скрипт, то лучше получать уровень хуком диалога статистики персонажа или т.п.
это голый пример кода и он ни на что не претендует и его можно оптимизировать, могут быть ложные срабатывания
C++:
#define FILTERSCRIPT
#include <a_samp>
#include <Pawn.RakNet>
const PLAYER_SYNC = 207;
const RPC_SCOREANDPINGS = 155;
const MAX_WARNINGS = 5;
new I_KEYS_CHECK[MAX_PLAYERS][3];
IPacket:PLAYER_SYNC(playerid, BitStream:bs) {
new onFootData[PR_OnFootSync];
BS_IgnoreBits(bs, 8);
BS_ReadOnFootSync(bs, onFootData);
I_KEYS_CHECK[playerid][0] = onFootData[PR_keys];
return 1;
}
IRPC:RPC_SCOREANDPINGS(playerid, BitStream:bs) {
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT) {
if((I_KEYS_CHECK[playerid][0] & KEY_ACTION == 0) && I_KEYS_CHECK[playerid][1] < gettime()) {
if(I_KEYS_CHECK[playerid][2] < MAX_WARNINGS) {
I_KEYS_CHECK[playerid][2]++;
}
else {
I_KEYS_CHECK[playerid][2] = 0;
printf("---> %d playerId maybe use fake client", playerid);
}
}
else if(I_KEYS_CHECK[playerid][0] & KEY_ACTION != 0) { // игрок отправил TAB key перед отправкой 155 rpc = настоящий игрок
/*
иммунитет 5 минут если игрок открыл tab и не закрывает его, чтобы "минимизировать" ложное срабатывание
ну или можно считать игрока проверенным до конца игровой сессии заменив проверку gettime
*/
I_KEYS_CHECK[playerid][1] = gettime() + 300;
I_KEYS_CHECK[playerid][2] = 0;
}
}
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
for (new i = 0; i < 3; i++) I_KEYS_CHECK[playerid][i] = 0;
}