Исходник [RakSamp Lite] SendPing Fix

Ulong

Диванный критик
Автор темы
Проверенный
61
350
Данный фикс сделан больше для ознакомления, нежели для практического применения. «Фикс ради фикса»

В чём суть: перед открытием списка игроков, стоя на ногах, вы отправляете на сервер нажатие кнопки 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;
}
 

Вложения

  • send_ping_fix.lua
    1.2 KB · Просмотры: 78

kickflip

Потрачен
96
15
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
это поможет от этого?