Доброго времени суток, господа.
Cегодня мы разберем проверку на пользовательский модпак у игрока средствами сервера.
Как писал на форумах самп.ком DimonML, существуют несколько специальных команд, отсылаемых сервером клиенту. Одна из них позволяет получить хэш установленного модпака.
Для того, чтобы отослать эту команду, необходимо использовать следующее выражение:
SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");
В принципе, отослать его можно где угодно (естественно, в том коллбэке, где используется playerid), но я рекомендую отправлять непосредственно в OnPlayerConnect. Однако возможны случаи, когда клиент, уже будучи кикнутым, считает, что подключения не произошло, и отправляет запрос на переподключение - в таком случае команду можно отослать в другом месте. К примеру, при вызове первого диалогового окна авторизации/регистрации.
Далее, от клиента в коллбэк OnPlayerCommandText должен поступить ответ следующего вида:
$response get_custom_hash ХэшМодпака
Его мы проверять и будем. В шапке OnPlayerCommandText используем функцию strfind.
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
return 1;
}
Далее все необходимые действия мы будем проводить уже после получения хэша в packhash.
К примеру, если нужно кикнуть игрока в случае, если хэш модпака не соответствует эталонному:
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
if (strcmp(packhash, "ЗначениеЭталонногоХэша", false)) //Если строки различны
{
SendClientMessage (playerid, 0xFFFFFFFF, "У Вас не установлен или установлен неверный пакет модификаций."); //Выведем игроку сообщение о несоответствии
Kick (playerid); //и кикнем его с сервера.
}
return 1;
}
Как видите, ничего сложного.
Что делать с игроком при несоответствии - решать уже программисту. Основную логику проверки и скрипт-пример я привел.
Надеюсь, урок окажется полезным. Если возникнут вопросы - задавайте, постараюсь ответить.
Cегодня мы разберем проверку на пользовательский модпак у игрока средствами сервера.
Как писал на форумах самп.ком DimonML, существуют несколько специальных команд, отсылаемых сервером клиенту. Одна из них позволяет получить хэш установленного модпака.
Для того, чтобы отослать эту команду, необходимо использовать следующее выражение:
SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");
В принципе, отослать его можно где угодно (естественно, в том коллбэке, где используется playerid), но я рекомендую отправлять непосредственно в OnPlayerConnect. Однако возможны случаи, когда клиент, уже будучи кикнутым, считает, что подключения не произошло, и отправляет запрос на переподключение - в таком случае команду можно отослать в другом месте. К примеру, при вызове первого диалогового окна авторизации/регистрации.
Далее, от клиента в коллбэк OnPlayerCommandText должен поступить ответ следующего вида:
$response get_custom_hash ХэшМодпака
Его мы проверять и будем. В шапке OnPlayerCommandText используем функцию strfind.
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
return 1;
}
Далее все необходимые действия мы будем проводить уже после получения хэша в packhash.
К примеру, если нужно кикнуть игрока в случае, если хэш модпака не соответствует эталонному:
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
if (strcmp(packhash, "ЗначениеЭталонногоХэша", false)) //Если строки различны
{
SendClientMessage (playerid, 0xFFFFFFFF, "У Вас не установлен или установлен неверный пакет модификаций."); //Выведем игроку сообщение о несоответствии
Kick (playerid); //и кикнем его с сервера.
}
return 1;
}
Как видите, ничего сложного.
Что делать с игроком при несоответствии - решать уже программисту. Основную логику проверки и скрипт-пример я привел.
Надеюсь, урок окажется полезным. Если возникнут вопросы - задавайте, постараюсь ответить.