Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 33
  1. #1
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±

    Админ-бот v.1

    Система предназначена для помощи младшей администрации. Игрок в админ чат посылает запрос и высвечивается старшей администрации, одобрить или нет. Делал под себя, так-что измените, что надо. Нам понадобится foreach, Pawn.CMD

    В начало мода.
    PHP код:
    const
        
    MAX_BOT_REQUEST 3,            // Максимальное кол-во запросов для бота
        
    MAX_BOT_REQUEST_LENGTH 8;        // Максимальная длина запросов

    new
        
    ADMIN_BOT_SUPPORT[MAX_BOT_REQUEST][MAX_BOT_REQUEST_LENGTH] =        // Сами запросы
        
    {  
            
    "/mute"
            
    "/prison"
            
    "/jail"
        
    },
        
    ADMIN_BOT_TEXT[128]; // Массив с хранением полного запроса (причина/ник) 
    Ко всем командам.
    PHP код:
    CMD:admin(playeridparams[])
    {
        if(
    /*проверка на администратора*/)
        {
            if(!(
    strlen(params) < 90))
                return 
    SendClientMessage(playerid, -1, !"Используйте больше 1 символа и меньше 90");

            new
                
    string[128];

            
    format(stringsizeof(string), "[A] %s [%d]: %s"/*Массив с ником админа*/playeridparams);
            
    SendAdminMessage(-1string);

            for(new 
    MAX_BOT_REQUEST-1!= -1k--)                         // Перебираем все существующие запросы
            
    {
                if(
    strfind(paramsADMIN_BOT_SUPPORT[k], true) != -1)                // Смотрим, присутствуют ли в тексте 
                
    {
                    
    strdel(params0strfind(paramsADMIN_BOT_SUPPORT[k], true)); // Если да, то удаляем всё, до найденного запроса
                    
    format(ADMIN_BOT_TEXTsizeof(ADMIN_BOT_TEXT), "%s // %s"params/*Массив с ником админа*/);     // Сохраним запрос в массив 
                    
    format(stringsizeof(string), "%s запросил помощь о выдаче наказания. Одобрить Y, отказать N"/*Массив с ником админа*/);
                    
    SendAdminMessage(-string);                     // Отправим текст администраторам.
                    
    break; // Обрываем цикл, после найденного запроса.
                
    }
            }
        }
        return 
    1;
    }
    alias:admin("a"); 
    В OnPlayerKeyStateChange
    PHP код:
    if(newkeys == KEY_YES// Если нажали Y
    {
        if(
    ADMIN_BOT_TEXT[0] != '\0')
        {
            if(
    /*Проверка на администратора*/)
            {
                
    PC_EmulateCommand(playeridADMIN_BOT_TEXT); // Отправим запрос
                
    ADMIN_BOT_TEXT[0] = EOS// Обнулим массив.
            
    }
        }    
    }

    else if(
    newkeys == KEY_NO// Если нажали N
    {
        if(
    ADMIN_BOT_TEXT[0] != '\0')
        {
            if(
    /*Проверка на администратора*/)
            {
                new 
                    
    string[(48 MAX_PLAYER_NAME 1) - 2];

                
    format(stringsizeof(string), "[A] Администратор %s отказал в запросе о помощи"/*Массив с ником админа*/);
                
    SendAdminMessage(-1string);
                
    ADMIN_BOT_TEXT[0] = EOS;
            }
        }

    В начало мода или ко всем итераторам
    PHP код:
    new 
        
    Iterator:Connect_Admin<MAX_PLAYERS>; // Итератор , где будем хранить всех администраторов 
    При добавлении/заходе администратора
    PHP код:
    if(!Iter_Contains(Connect_Admin/*админ*/)) Iter_Add(Connect_Admin/*админ*/); 
    При выходе/снятии администратора
    PHP код:
    if(Iter_Contains(Connect_Admin/*админ*/)) Iter_Remove(Connect_Admin/*админ*/); 
    Сток для отправки сообщения администраторам
    PHP код:
    stock SendAdminMessage(color, const string[])
    {
        foreach(new 
    Connect_Admin)
        {
            
    SendClientMessage(icolorstring);
        }
        return 
    1;

     Screen


    У кого не грузит: https://imgur.com/3mtcRlO
    Буду рад увидеть конструктивную критику, а так-же идеи для следующей версии.
    Автор: Я
    Последний раз редактировалось execution; 01.04.2018 в 20:30.

  2. #2
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Хм, а чем тогда твой итератор Connect_Admin отличается от простого Player?
    Тем не менее, можно сделать независимую систему от форича, тобишь:

    PHP код:
    stock SendAdminMessage(color, const string[])
    {
        
    #if defined foreach
        
    foreach(new Connect_Admin)
        
    #else
        
    {
            for(new 
    GetPlayerPoolSize(); > -1; --i)
            {
              if(
    IsPlayerConnected(i))
         
    #endif
         
    {
            
    SendClientMessage(icolorstring);
         }
         
    #if !defined foreach
             
    }
         
    #endif
         
    return 1;

    Последний раз редактировалось Long-; 02.04.2018 в 10:07.

  3. #3
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    Хм, а чем тогда твой итератор Connect_Admin отличается от простого Player?
    Тем, что в него попадают только админы? Там же написано, что нужно вставлять код туда, где идёт авторизация и добавление админов. То бишь, проверка на то, является ли игрок админом, уже прошла

    Такой итератор крайне полезен будет, ибо позволяет решить много проблем: например, узнать, есть ли в сети админы, не запуская никаких циклов. Или же, как в случае с кодом в теме, произвести определённое действие лишь для админов, не делая лишних итераций.
    Последний раз редактировалось DeimoS; 02.04.2018 в 10:46.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #4
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Тем, что в него попадают только админы? Там же написано, что нужно вставлять код туда, где идёт авторизация и добавление админов. То бишь, проверка на то, является ли игрок админом, уже прошла

    Такой итератор крайне полезен будет, ибо позволяет решить много проблем: например, узнать, есть ли в сети админы, не запуская никаких циклов. Или же, как в случае с кодом в теме, произвести определённое действие лишь для админов, не делая лишних итераций.
    А, я думал там написано просто в onplayerconnect, и в onPlayerdisconnect, но выделять под этот итератор 500 ячеек, не слишком много?

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    А, я думал там написано просто в onplayerconnect, и в onPlayerdisconnect, но выделять под этот итератор 500 ячеек, не слишком много?
    А ты никак меньше не выделишь, если не создашь второй массив
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А ты никак меньше не выделишь, если не создашь второй массив
    Всм, так же можно:

    PHP код:
    new 
        
    Iterator:Connect_Admin<10>; 
    не?

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Почитай внимательно пост, ссылку на который я скинул
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #8
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    И немного пессимизации:

    PHP код:
    format(stringsizeof(string), "%s запросил помощь о выдаче наказания. Одобрить Y, отказать N"/*Массив с ником админа*/); 
    PHP код:
    strcat(string/*Массив с ником админа*/);
    strcat(string, !" запросил помощь о выдаче наказания. Одобрить Y, отказать N"); 

  9. #9
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    И немного пессимизации:

    PHP код:
    format(stringsizeof(string), "%s запросил помощь о выдаче наказания. Одобрить Y, отказать N"/*Массив с ником админа*/); 
    PHP код:
    strcat(string/*Массив с ником админа*/);
    strcat(string, !" запросил помощь о выдаче наказания. Одобрить Y, отказать N"); 
    Спасибо, учту.

  10. #10
    Аватар для nickmate
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.05.2018
    Сообщений
    0
    Репутация:
    0 ±
    В таком случае, почему бы просто не сделать так (естественно, если не использовать foreach):

    PHP код:
    new bool:adminStatus[MAX_PLAYERS]; 
    (или в enum)

    При выдаче админ прав
    PHP код:
    adminStatus[playerid] = true
    И сам цикл
    PHP код:
        for (new 0GetPlayerPoolSize(); <= ji++)
        {
            if (!
    IsPlayerConnected(i)) continue;
            if(!
    adminStatus[i]) continue;
            
    // doSomething();
        

    -------------------------------------

    PHP код:
    new  string[(48 MAX_PLAYER_NAME 1) - 2]; 
    Неплохо, но зачем каждый раз считать символы в строке, если можно сделать так (способ от DC):

    PHP код:
    static const fmt_str[] = "[A] Администратор %s отказал в запросе о помощи";
    new 
    string[sizeof(fmt_str) + (-MAX_PLAYER_NAME)];
    format(stringsizeof(string), fmt_str/* Имя администратора */); 
    Последний раз редактировалось nickmate; 17.05.2018 в 10:48.

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •