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

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

    Админ-бот 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
    Адрес
    Восточный Мордор
    Сообщений
    4,585
    Репутация:
    1698 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    Хм, а чем тогда твой итератор Connect_Admin отличается от простого Player?
    Тем, что в него попадают только админы? Там же написано, что нужно вставлять код туда, где идёт авторизация и добавление админов. То бишь, проверка на то, является ли игрок админом, уже прошла

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

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

    Steve Pavlina

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

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

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

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

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

    Широко известно, что идеи стоят 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
    Адрес
    Восточный Мордор
    Сообщений
    4,585
    Репутация:
    1698 ±
    Почитай внимательно пост, ссылку на который я скинул
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 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
    Сообщений
    38
    Репутация:
    1 ±
    Цитата Сообщение от 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 123 ... ПоследняяПоследняя

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

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

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

Ваши права

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