Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Подозрение во взломе админа

Non.Name

Дебютант
Подозрение об взломе админа

Здравствуйте уважаемые пользователи портала!
Сегодня мы сделаем оповещение об взломе старшим админам, и запретим использовать команды взломщику.
Сделаем команду, чтобы выдать доступ на использование команд.
Если у вас есть какие-либо предложения об улучшениях или же ошибки - пишите в теме. ​


Что используется:
DC_CMD


Возможные ошибки:
pinfo[playerid][name] - замените на своё
pinfo[playerid][regip] - замените на своё
pinfo[playerid][admin] - замените на своё
Если же у вас нету Reg-ip, то создаём в вашем enume информации игрока regip[16], далее идём в диалог с регистрацией, и ищем последний этап регистрации ( где аккаунт добавляется в базу данных ) и вставляем туда:
Код:
GetPlayerIp(playerid, pinfo[playerid][regip], 16):
Добавляем в INSERT INTO `regip` и специфекатор '%e', после чего добавляем в аргументы pinfo[playerid][regip]
Добавьте в базу данных поле regip ( тип: varchar, длина: 16 )
SendClientMessageAdmin - добавим сток
Код:
stock SendClientMessageAdmin(color, text[], adm)
{
        foreach(new i: Player) 
        {
                if(pinfo[i][admin] >= adm) SendClientMessage(i, color, text);
        }
}
[HR][/HR]

​

Создаём сток для получения подсети игрока:
Код:
stock GetPlayerSubnet(buffer[])
{// by Daniel_Cortez
    for(new i=0,dots=0; ; ++i)
        switch(buffer[i])
        {
            case '\0':
                break;
            case '.':
                if(++dots == 2)
                {
                    buffer[i] = '\0';
                    break;
                }
        }
}
Создаём сток для проверки данных об подсети игрока:
Код:
stock CheckSubnet(playerid)
{
        new nowip[16], oldip[16];
	GetPlayerIp(playerid, nowip, sizeof(nowip));//Узнаём нынешний IP.
	GetPlayerSubnet(nowip);//Получаем подсеть игрока.
	strmid(oldip, pinfo[playerid][regip], 0, 16, 16);//Берём данные с REG-IP и записываем их в массив oldip. Изменить pinfo[playerid][regip] - на свои
	GetPlayerSubnet(oldip);//Получаем подсеть игрока.
	if(strcmp(nowip, oldip, true) == 0) return 1;//Данные об IP совпадают.
	else return 0;//Данный об IP не совпадают.
}
Можно поместить в OnPlayerSpawn, либо же в загрузку аккаунта:
Код:
if(pinfo[playerid][admin] > 0)//Проверка на админку. Замените на своё!
{
	if(CheckSubnet(playerid) != 1)//Если нынешний IP не совпадает с REG-IP
	{
		//Происходят какие-то действия. Допустим: (Отправим игроку сообщения о том, что он подозревается во взломе и отправим сообщения админам о подозрения во взломе)
		SendClientMessage(playerid, -1, !"Вы подозреваетесь во взломе. Информация отправлена старшей администрации. Ожидайте проверки!");//Отправляем сообщение подозреваемому.

		static const 
			msg_admins[] = "У админа %s[%d] не совпадает нынешний IP с REG-IP. Введите /checkadmin";

		new str[sizeof(msg_admins)+(-2+MAX_PLAYER_NAME)+(-2+4)];
		format(str, sizeof(str), msg_admins, pinfo[playerid][name], playerid);//Изменить pinfo[playerid][name] - на свои
		SendClientMessageAdmin(-1, str, 5);//Измените на своё. Отправляем сообщение администратором выше 5 уровня админки о возможном взломе.
                SetPVarInt(playerid, "SuspicionsHacking", 1);
	}
}
Сделаем так, чтобы подозреваемый игрок не мог использовать команды и сделаем команду, чтобы можно было выдать доступ к командам. Поместить в OnPlayerCommandReceived:
Код:
if(GetPVarInt(playerid, "SuspicionsHacking") == 1)//Если данный админ подозревается во взломе
{
	//Происходят какие-то действия. Допустим: ( Запретим использовать команды, и отправим старшим админам о том, что данный игрок возможно взломан)
	static const
		msg_admins[] = "Администратор %s[%d] возможно взломан. Введите /checkadmin для проверка";
	new str[sizeof(msg_admins[])+(-2+MAX_PLAYER_NAME)+(-2+4)];
	format(str, sizeof(str), msg_admins, pinfo[playerid][name], playerid);//Изменить pinfo[playerid][name] - на своё
        SendClientMessageAdmin(-1, str, 5);//Измените на своё. Отправляем сообщение администратором выше 5 уровня админки о возможном взломе.
	return SendClientMessage(playerid, -1, !"У вас нету доступа к отправки команд."), 0;//Отправим сообщения подозреваемому и вернём 0, чтобы команда не отправилась.
}
Поместить в команды, либо же в конец мода:
Код:
CMD:checkadmin(playerid, params[])
{
	if(pinfo[playerid][admin] < 5) return 1;//Проверка на админку. Замените на своё!
	if(sscanf(params, "d", params[0])) return SendClientMessage(playerid, -1, !"Используйте /checkadmin [id]");//Если администратор неправильно ввёл команду, исправляем его.
	if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, -1, !"Данный игрок не в сети");//Проверяем онлайн ли указанный ID.
	if(params[0] == playerid) return SendClientMessage(playerid, -1, !"Вы указали свой id");//Если администратор указал свой ID, то выводим ему текст об ошибки.
	if(GetPVarInt(params[0], "SuspicionsHacking") == 0) return SendClientMessage(playerid, -1, !"Данный администратор не подозревается во взломе");//Если же указанный ID не подозревается во взломе, то выводим текст об ошибке.

	static const
			dialog[] = "{FFFFFF}IP администратора: %s\nREG-IP администратора: %s\n\n\tНик: %s";
	new strdialog[sizeof(dialog)+(-2+16)*2+(-2+MAX_PLAYER_NAME)], ip[16];
        GetPlayerIp(params[0], ip, 16);//Узнаём нынешний IP администратора, после чего записуем полученные данные в массив ip.
        format(strdialog, sizeof(strdialog), dialog, ip, pinfo[params[0]][regip], pinfo[params[0]][name]);//Изменить pinfo[params[0]][regip], pinfo[params[0]][name] - на своё.
	ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, !" ", strdialog, !"Подтвердить", !"Отказать");//Показываем диалог с информацией. Изменить ID диалога на свой. У меня это 1.
	SetPVarInt(playerid, "IDsuspect", params[0]);//Ставим PVar, для передачи подозреваемого ID.
	return 1;
}
Покажим диалог с информацией. Вставить в OnDialogResponse
Код:
switch(dialogid)
{
	case 1:
	{
		if(response)//Если нажата левая кнопка
		{
			//Происходят какие-то действия. Допустим: ( Дадим игроку использовать команды )
			SendClientMessage(playerid, -1, !"Вы выдали доступ к командам");//Выводим текст игроку о том, что он выдал доступ администратору к использованию команд.
			SendClientMessage(GetPVarInt(playerid, "IDsuspect"), -1, !"Вам был выдан доступ к командам");//Выводим текст подозреваемому о том, что ему дали доступ к использованию команд.
			DeletePVar(GetPVarInt(playerid, "IDsuspect"), "SuspicionsHacking");//Удаляем PVar у подозреваемого.
			DeletePVar(playerid, "IDsuspect");//Удаляем PVar у игрока о ID подозреваемого.
		}
		else//Если же мы нажали правую кнопку
		{
			//Происходят какие-то действия. Допустим: ( Кикним игрока )
                        Kick(GetPVarInt(playerid, "IDsuspect"));//Кикаем подозреваемого.
			SendClientMessage(playerid, -1, !"Вы отказали в доступе к командам");//Выводим текст игроку о том, что он отказал в доступе к использованию команд.
                        DeletePVar(playerid, "IDsuspect");//Удаляем PVar у игрока о ID подозреваемого.
		}
	}
}
 
Последнее редактирование:
Сверху Снизу