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

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

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

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

Мануал Admin BOT v1.0

Нужна-ли версия 2.0?

  • Да

    Голосов: 7 70.0%
  • Нет

    Голосов: 3 30.0%

  • Всего проголосовало
    10
  • Опрос закрыт .

xDimasx

Эксперт
Пользователь
Регистрация
1 Фев 2014
Сообщения
1,364
Лучшие ответы
4
Репутация
158
Hello World!
Предоставляю Вашему вниманию столь небольшую но как по мне полезную системку для администрации.

Принцип работы:
Администратор не подходящий по уровню прописывает к примеру команду /mute
Вместо надписи что у него недостаточно прав,добавляет нарушителя в "Список нарушителей"
Список доступен для старшей администрации (/nakaz),которая может одобрить/удалить наказание
В случае одобрения,игрок наказывается и снизу пишет от кого выдано наказание.
Так-же если игрок из списка выходит из игры,то он пропадает с этого списка.
Максимальное количество нарушителей в списке: 15


Скриншоты:

Что нам необходимо для этой системы?
Кроме стандартных команд(/jail,/mute,/warn,/ban) для наказания,плагина DC_CMD и SSCANF ничего.


Приступим к вставке в Ваш мод?
P.S: Для того что-бы новичкам было понятнее,немного действий я закоментил


Шаг 1 | Ко всем new's в начало мода:
PHP:
#define MAX_QUERY_BOT   15 // Максимальное количество одновременных запросов
#define DIALOG_ABOT     9895 // ID диалога

static const abot_type[4][6] = {"JAIL","MUTE","WARN","BAN"}; // Названия для типов
enum admbot_info
{
	bID, // ID того кого добавили
	bWhoAdd[MAX_PLAYER_NAME], // Ник помощника который добавил
	bType, // Тип наказания (0 - JAIL | 1 - MUTE | 2 - WARN | 3 - BAN)
	bAmount, // Для указания срока
	bReason[32] // Причина добавления/наказания
};
new AdminBot[MAX_QUERY_BOT][admbot_info]; // Массив для дальнейшего вытаскивания информации
Шаг 2 | В OnGameModeInit:
PHP:
for(new i; i < MAX_QUERY_BOT; i++) AdminBot[i][bID] = INVALID_PLAYER_ID,AdminBot[i][bType] = -1; // Присваиваем всем слотам INVALID ID и неизвестную причину
Шаг 3 | В OnPlayerDisconnect:
PHP:
    if(IsPlayerLogged[playerid]) // У Вас может быть своя проверка на авторизованность игрока
    {
        new bool:count; // Нужно чтоб не флудило если игрок находится несколько раз в списке
        for(new i; i < MAX_QUERY_BOT; i++) // Создаём цикл на весь список
        {
            if(AdminBot[i][bID] != playerid) continue; // Если игрока который Вышел нет в списке под этим слотом,то пропускаем

            AdminBot[i][bID] = INVALID_PLAYER_ID; // Удаляем ID
            AdminBot[i][bAmount] = 0,AdminBot[i][bType] = -1,AdminBot[i][bReason][0] = AdminBot[i][bWhoAdd][0] = EOS; // Убираем тип,очищаем причину и ник добавляемого
            count = true; // Для будущего оповещения
        }
        if(count) // Если игрок был в списке и удалился,то оповещаем
        {
            static const bot_str[] = "[A-BOT] Игрок %s[%d] вышел из игры и был удалён из списка на наказание"; // Пригодится для подсчёта ниже
            new botmsg[sizeof(bot_str) + (-2 + MAX_PLAYER_NAME) + (-2 + 4)]; // Создаём переменную и подсчитываем массив
            format(botmsg,sizeof(botmsg),bot_str,Name(playerid),playerid); // Форматируем сообщение (функция получения ника у Вас может быть своя. К примеру PlayerInfo[playerid][pName])
            SendAdminsMessage(-1,botmsg); // Тут может быть своя функция для отправки сообщения администрации
        }
    }
Шаг 4 | В OnDialogResponse:
PHP:
        case DIALOG_ABOT: // Диалог для бота
        {
            if(!response) return true; // Если нажата "Отмена",то никаких действий
            if(AdminBot[listitem][bID] == INVALID_PLAYER_ID) return ShowAdminBot(playerid),SendClientMessage(playerid,-1,"Нет наказуемого под этим слотом!"); // Если под слотом нет игрока,то оповещение
            static const fmt_str[] = "Информация о выдаче наказания \"%s\"\n\nПомощник: \t\t%s\nИгрок: \t\t\t%s[%d]\nСрок: \t\t\t%d\nПричина: \t\t%s\n\nВнимательно определитесь с решением исходя из правила проекта!"; // Для дальнейшего формата
            new botmsg[sizeof(fmt_str) + (-2 + MAX_PLAYER_NAME) + (-2 + MAX_PLAYER_NAME) + (-2 + 4) + (-2 + 6) + (-2 + 3) + (-2 + (32+MAX_PLAYER_NAME))]; // Подсчитываем массив для переменной
            format(botmsg,sizeof(botmsg),fmt_str,abot_type[AdminBot[listitem][bType]],AdminBot[listitem][bWhoAdd],Name(AdminBot[listitem][bID]),AdminBot[listitem][bID],AdminBot[listitem][bAmount],AdminBot[listitem][bReason]); // Форматируем переменную
            ShowPlayerDialog(playerid, DIALOG_ABOT+1, DIALOG_STYLE_MSGBOX, "Одобрение наказания",botmsg,"Одобрить","Удалить"); // Показываем диалог
            return SetPVarInt(playerid,"ABOT_SLOT",listitem); // Присваиваем слот
        }
        case DIALOG_ABOT+1:
        {
			new slot = GetPVarInt(playerid,"ABOT_SLOT"); // Достаём слот на который нажал игрок
            if(!response) return DeleteAdminBot(AdminBot[slot][bID],playerid,false,slot); // Если игрок нажал "Удалить",то удаляем из спика
            
            new str[12]; // Массив для форматов далее
            switch(AdminBot[slot][bType]) // Смотрим тип наказания
            {
                case 0: // JAIL
                {
                    format(str,sizeof(str),"%d %d %s",AdminBot[slot][bID],AdminBot[slot][bAmount],AdminBot[slot][bReason]); // Форматируем данные для команды
                    cmd::jail(playerid,str); // For DC_CMD
                }
                case 1: // MUTE
                {
                    format(str,sizeof(str),"%d %d %s",AdminBot[slot][bID],AdminBot[slot][bAmount],AdminBot[slot][bReason]); // Форматируем данные для команды
                    cmd::mute(playerid,str); // For DC_CMD
                }
                case 2: // WARN
                {
                    format(str,sizeof(str),"%d %s",AdminBot[slot][bID],AdminBot[slot][bReason]); // Форматируем данные для команды
                    cmd::warn(playerid,str); // For DC_CMD
                }
                case 3: // BAN
                {
                    format(str,sizeof(str),"%d %d %s",AdminBot[slot][bID],AdminBot[slot][bAmount],AdminBot[slot][bReason]); // Форматируем данные для команды
                    cmd::ban(playerid,str); // For DC_CMD
                }
            }
            
            return DeleteAdminBot(AdminBot[slot][bID],INVALID_PLAYER_ID,true,slot); // Удаляем игрока который уже получил наказание
        }
Шаг 5 | Во все нужные нам команды вместо проверки на админку:
PHP:
if(PlayerInfo[playerid][pAdmin] > 0 && PlayerInfo[playerid][pAdmin] < 3) return AddAdminBot(params[0],playerid,0,params[2],params[1]); // Это для /jail (params[0] - кому выдаём | params[2] - причина | params[1] - время)
if(PlayerInfo[playerid][pAdmin] > 0 && PlayerInfo[playerid][pAdmin] < 3) return AddAdminBot(params[0],playerid,1,params[2],params[1]); // Это для /mute (params[0] - кому выдаём | params[2] - причина | params[1] - время)
if(PlayerInfo[playerid][pAdmin] > 0 && PlayerInfo[playerid][pAdmin] < 3) return AddAdminBot(params[0],playerid,2,params[2]); // Это для /warn (params[0] - кому выдаём | params[2] - причина)
if(PlayerInfo[playerid][pAdmin] > 0 && PlayerInfo[playerid][pAdmin] < 3) return AddAdminBot(params[0],playerid,3,params[2],params[1]); // Это для /ban (params[0] - кому выдаём | params[2] - причина | params[1] - время)
Шаг 6 | Под текстом где идёт оповещение для сервера после выдачи. Пример: (Администратор * посадил игрока *. Причина: Смотрите скриншот) и ниже от кого:
PHP:
    if(GetPVarInt(playerid,"ABOT_SLOT") != -1)
    {
        static const abt_msg[] = " - Наказание поступило от помощника %s";
        new abtmsg[sizeof(abt_msg) + (-2 + MAX_PLAYER_NAME)];
        format(abtmsg, sizeof(abtmsg), abt_msg,AdminBot[GetPVarInt(playerid,"ABOT_SLOT")][bWhoAdd]);
        SendClientMessageToAll(-1, abtmsg);
        SetPVarInt(playerid,"ABOT_SLOT",-1);
    }
Шаг 7 | В конец мода:
PHP:
stock AddAdminBot(playerid,whoadd,type,reason[],amount = 0) // Добавление нарушителя в список
{
	new slot = -1;
	for(new i; i < MAX_QUERY_BOT; i++)
	{
		if(AdminBot[i][bID] != INVALID_PLAYER_ID) continue;
		slot = i;
		break;
	}
	if(slot == -1) return SendClientMessage(whoadd,-1,"Нет свободного места в списке"); // Если нет свободного слота,то оповещаем

    SendClientMessage(whoadd,-1,"Вы добавили игрока в список наказуемых для старшей администрации!");
	SendAdminsMessage(-1,"[A-BOT] Список наказуемых пополнен. Используйте: /nakaz",3);
		
	AdminBot[slot][bID] = playerid,AdminBot[slot][bType] = type,AdminBot[slot][bAmount] = amount; // Присваиваем нужные значения
	if(whoadd != INVALID_PLAYER_ID) format(AdminBot[slot][bWhoAdd],24,"%s",Name(whoadd)); // Если админ добавил,то прописываем ник того кто добавил (Функция получения ника GetName у Вас может быть другая)
	else strmid(AdminBot[slot][bWhoAdd],"System",0,strlen("System"),MAX_PLAYER_NAME); // Если добавила система,то прописываем систему в того кто добавил
	format(AdminBot[slot][bReason],32,"%s",reason); // Присваиваем нужные значения
	return true;
}

stock ShowAdminBot(playerid)
{
	new str[(-2 + MAX_PLAYER_NAME) + (-2 + MAX_PLAYER_NAME) + (-2 + 4) + (-2 + 6) + (-2 + 32)],string[sizeof(str) * MAX_QUERY_BOT]; // (str = 80 | string = 1200)
	strcat(string,"Администратор\tНарушитель\tТип\n"); // Подзаголовок
    for(new i; i < MAX_QUERY_BOT; i++) // Проходим весь список
    {
        if(AdminBot[i][bID] != INVALID_PLAYER_ID) format(str,sizeof(str),"%s \t %s[%d] \t %s\n",AdminBot[i][bWhoAdd],Name(AdminBot[i][bID]),AdminBot[i][bID],abot_type[AdminBot[i][bType]]); // Если под слотом есть игрок на наказание,то заполняем
        else str = "-\t-\t-\n"; // Если нету,то добавляем пустую строку
		strcat(string,str); // Добавляем отформатированную строку в диалог
    }
    ShowPlayerDialog(playerid, DIALOG_ABOT, DIALOG_STYLE_TABLIST_HEADERS, "Игроки на наказание",string,"Далее","Отмена"); // Показываем диалог
    return true;
}

stock DeleteAdminBot(playerid,whoid,bool:type,slot) // Удаление нарушителя из списка
{
    if(IsPlayerLogged[playerid]) // У Вас может быть своя проверка на авторизованность игрока
	{
	    AdminBot[slot][bID] = INVALID_PLAYER_ID; // Удаляем ID
	    AdminBot[slot][bAmount] = 0,AdminBot[slot][bType] = -1,AdminBot[slot][bReason][0] = AdminBot[slot][bWhoAdd][0] = EOS; // Убираем тип,очищаем причину и ник добавляемого

        static const bot_str[] = "[A-BOT] Администратор %s[%d] отклонил наказание для %s[%d]"; // Пригодится для подсчёта ниже
		new botmsg[sizeof(bot_str) + (-2 + MAX_PLAYER_NAME) + (-2 + 4) + (-2 + MAX_PLAYER_NAME) + (-2 + 4)]; // Создаём переменную и подсчитываем массив
		
		if(!type) format(botmsg,sizeof(botmsg),bot_str,Name(whoid),whoid,Name(playerid),playerid); // Форматируем сообщение (функция получения ника у Вас может быть своя. К примеру PlayerInfo[playerid][pName])
	    else format(botmsg,sizeof(botmsg),"[A-BOT] Администратор %s[%d] одобрил наказание для %s[%d]",Name(whoid),whoid,Name(playerid),playerid); // Форматируем сообщение (функция получения ника у Вас может быть своя. К примеру PlayerInfo[playerid][pName])
	    SendAdminsMessage(-1,botmsg); // Тут может быть своя функция для отправки сообщения администрации
	}
	return true;
}
На этом всё.
Если возникнут какие-то проблемы,то сообщайте в тему.
Сразу-же приступлю к исправлению.

Так-же как Вы заметили,то в заголовке темы указана версия 1.0
Если эта система понадобится не только двум людям,то я доделаю её не по ID,а по нику.
Следовательно можно будет выдавать наказание в оффлайне и при выходе игрок не пропадет из списка.
 
Последнее редактирование:
  • Нравится
Реакции: Iwka
Сверху Снизу