• 0
Sign in to follow this  
Followers 0
Guest stibs

Использование проверки на мод пак

Question

Доброго времени суток, уважаемый читатель темы!

Cегодня мы разберем проверку на пользовательский модпак у игрока средствами сервера.

Для начала нам необходимо получить хэш мод пака. 

В OnPlayerConnect вставляем:
 

SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");

Потом в OnPlayerCommandText вставляем следующий код:

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;
}

Если у вас используется не стандартный командный процессор, то OnPlayerCommandText не сработает, добавьте этот код (который скинул выше) в OnPlayerCommandReceived, или же если и такого нет. то в тот паблик который обрабатывает команды. 

Далее зайдите на сервер с подключенным модпаком, листочком и ручкой. При входе выдаст цифры, и буквы, они нам и нужны. Если выводит нули, значит мод пак не подключен. Записывайте цифры в блокнотик, либо доставайте их из логов. После этого команду заменяем в соответствующем паблике. 

if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
    new packhash[64]; //Создадим массив, в котором будет находится этот хэш
    strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
    if (strcmp(packhash, "ЗначениеЭталонногоХэша", false)) //Если строки различны
    {
        SetTimerEx("KickPack", 1000, false, "i", playerid); // кикаем игрока с таймером, дабы не было переподключения
    }
    return 1;
}

И в конец мода:

forward KickPack(playerid);
public KickPack(playerid)
{
    SendClientMessage(playerid, -1, "У вас установлена старая версия модпака, или не установлена вовсе. Установите ее из наших официальных источников!");
    Kick(playerid);
    return true;
}

На этом все!

 

АВТОРЫ - СОСТАВИТЕЛИ: Amfy, SHOROOP, @stibs

Share this post


Link to post
Share on other sites

28 answers to this question

  • 0

@Daniil Roslyakov набор цифарок и букафок мод пака

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov тему внимательно почитай, первый код, который вставляется в OnPlayerCommandText и есть для его получения. 

Share this post


Link to post
Share on other sites
  • 0

Почему он показывает только 2 строчки при не подключенном мод-паке? По скольку я хочу поместить информацию на 3 или 4 при кике игрока не имеющего к пример Нашего мод-пака.

Если выводить более 3-ёх строк, то кикать он кикает но сообщение не выводит.  

 

Edited by Andrey_Akkerman

Share this post


Link to post
Share on other sites
  • 0

@Andrey_Akkerman это особенности функции Kick. Тоже самое с функцией Ban. Если хотите выводить сообщение и кикать, значит, необходимо кикать с задержкой, через таймер. Функцию Kick замените на KickEx, предположим: 
 

SendClientMessage(...); 
SendClientMessage(...); // выводим свои сообщения
SendClientMessage(...);
SendClientMessage(...);
SetTimerEx("KickEx", 2000, false, "i", playerid); // через 2 секунды кикнем. При необходимости 2 секунды можете заменить

И в конец мода: 

forward KickEx(playerid); 
public KickEx(playerid)
	return Kick(playerid); 

 

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov командный процессор стандартный или dc_cmd / zcmd / Pawn.CMD ? 

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov значит, нужно не в OnPlayerCommandText вставлять, а в OnPlayerCommandReceived

 

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov вы вставляли в OnPlayerCommandReceived или в OnPlayerCommandPerfomed? Если в первый, попробуйте кинуть во второй, если во второй, попробуйте в первый. 

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov значит создайте его: 
 

public OnPlayerCommandReceived(playerid, cmdtext[])
{
	//code
	return true; 
}

 

Share this post


Link to post
Share on other sites
  • 0

@Daniil Roslyakov  покажите как вставили. 

Share this post


Link to post
Share on other sites
  • 0

@DEST 

Спойлер

public OnPlayerCommandReceived(playerid, cmdtext[])
{
	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;
	}
	return true;
}

 

 

Share this post


Link to post
Share on other sites
  • 0

вот так попробуйте: 


public OnPlayerCommandReceived(playerid, cmdtext[])
{
	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;
	}
}

 

Share this post


Link to post
Share on other sites
  • 0
В 03.11.2017 в 20:03, DEST сказал:

вот так попробуйте: 



public OnPlayerCommandReceived(playerid, cmdtext[])
{
	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;
	}
}

 

у меня вообще выдало 2 ошибки в чем может быть проблемма

D:\ÌÎÉ ÑÅÐÂÅÐ\ëîêàëüíûé ñåðâåð\gamemodes\mrpv1.pwn(17003) : error 017: undefined symbol "cmdtext"
D:\ÌÎÉ ÑÅÐÂÅÐ\ëîêàëüíûé ñåðâåð\gamemodes\mrpv1.pwn(17006) : error 017: undefined symbol "cmdtext"
Pawn compiler 3.10.8	 	 	Copyright (c) 1997-2006, ITB CompuPhase


2 Errors.

 

Share this post


Link to post
Share on other sites
  • 0

@Андрей Лазарев, cmdtext на cmd попробуйте поменять.

Share this post


Link to post
Share on other sites
  • 0
20 минут назад, odosenok сказал:

@Андрей Лазарев, cmdtext на cmd попробуйте поменять.

Прописал вот таким образом и не чего не отображает

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(strfind(cmd, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
	{
	    new packhash[64]; //Создадим массив, в котором будет находится этот хэш
	    strmid(packhash, cmd, 26, strlen(cmd)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
	    SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
	    return 1;
	}
	//if(!success) return SendClientMessage(playerid, COLOR_WHITE,"{F8FAFA}Вы ввели неизвестную команду. {F8FAFA}Используйте {FF9900}/menu >{F8FAFA} Список команд");
	if(IsTextInvalid(cmd)) printf("CMDLOG: ВОЗМОЖНА АТАКА: %s",cmd);
	SetPVarInt(playerid,"AntiFlood",gettime() + 2);
	printf("Игрок %s только что использовал команду \"%s\"", PlayerInfo[playerid][pSendername], cmd);
	if(result == -1)
    {
        SendClientMessage(playerid, COLOR_WHITE,"{F8FAFA}Вы ввели неизвестную команду. {F8FAFA}Используйте {FF9900}/menu >{F8FAFA} Список команд");
        return 0;
    }
	return 1;
}

 

Share this post


Link to post
Share on other sites
  • 0

Сделал всё в точности так же, в чате ничего не пишет! Пробовал во все паблики OnPlayerCommandText,OnPlayerCommandPerformed,OnPlayerCommandReceived.

Edited by Aleksandr_Kanaev

Share this post


Link to post
Share on other sites
  • 0

Ну так как кто нибудь решил данную проблемму с выводом хэш или нет

Share this post


Link to post
Share on other sites
  • 0
5 минут назад, Андрей Лазарев сказал:

кто нибудь решил данную проблемму с выводом хэш или нет

Подробнее пожалуйста.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.