Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 3 из 3 ПерваяПервая 1 2 3
Показано с 21 по 25 из 25

Тема: /ahelp

  1. #21
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    На самом деле это не оптимизация, а скорее всего удобство. Чем копаться в SendClientMessange при добавление новой команды.
    Пожалуй, если бы я писал сейчас мод я так и реализовал бы /ahelp:
    PHP код:
    const MAX_LEN_COMMANDS 32
    const 
    MAX_SERVER_COMMANDS 5
    PHP код:

    enum e_ADMIN_COMMANDS_INFO
    {
        
    e_name_admin_command[MAX_LEN_COMMANDS],
        
    e_lvl_admin
    }
    static const 
    admin_commands[MAX_SERVER_COMMANDS][e_ADMIN_COMMANDS_INFO] =
    {
        { 
    "/ahelp"},
        { 
    "/spec"},
        { 
    "/skick"},
        { 
    "/mute"},
        { 
    "/goto"}
    }; 
    PHP код:
    CMD:ahelp(playerid)
    {
        if(
    == PlayerInfo[playerid][pAdmin]) return 0;
        for(new 
    0MAX_SERVER_COMMANDSi++)
        {
            if(
    admin_commands[i][e_lvl_admin] > PlayerInfo[playerid][pAdmin]) continue;
            
    printf("Название команды: %s | Уровень админки: %d"admin_commands[i][e_name_admin_command], admin_commands[i][e_lvl_admin]);
        }

    Собственно где удобство? Или меняешь команду прямиком в /ahelp, или лезешь в массив и меняешь там. Причем в конкретно этой реализации, в любой более-менее полной админ-системе игроку зафлудит чат, можно конечно скрепить команды в диалог или выводить с помощью SendClientMessange, проверяя длину (ведь команды никак не вместятся в один SendClientMessange)... Но это уже нагромождения ненужного и бесцельная растрата памяти.

    В любом случае, все мои мысли уже передали выше..
    Последний раз редактировалось 123; 03.08.2016 в 07:03.

  2. #22
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Самый нормальный вариант - это использовать плагин Pawn.CMD и его функции CmdArray:PC_GetCommandArray(), PC_GetArraySize(CmdArray:arr), PC_GetCommandName(CmdArray:arr, index, dest[], size = sizeof dest). Только так эту команду можно автоматизировать.

    UPD. Набросал пример:
    PHP код:
    #include <a_samp>
    #include <Pawn.CMD>

    enum (<<=1) {
        
    CMD_USER 1,
        
    CMD_ADMIN_1,
        
    CMD_ADMIN_2,
        
    CMD_ADMIN_3,
        
    CMD_ADMIN_4,
        
    CMD_ADMIN_5,
    };

    public 
    OnPlayerCommandReceived(playeridcmd[], params[], flags)
    {
        if (!
    IsPlayerHasAdminFlag(playeridflags)) {
            
    SendClientMessage(playerid, -1"У вас недостаточно прав для выполнения этой команды.");
            return 
    1;
        }
        return 
    1;
    }

    flags:ban(CMD_ADMIN_5);
    cmd:ban(playeridparams[])
    {
        return 
    1;
    }

    flags:kick(CMD_ADMIN_4);
    cmd:kick(playeridparams[])
    {
        return 
    1;
    }

    flags:ahelp(CMD_ADMIN_1);
    cmd:ahelp(playeridparams[])
    {
        new
            
    CmdArray:cmds,
            
    cmds_count,
            
    cmd_name[32],
            
    flags;

        
    cmds PC_GetCommandArray();
        
    cmds_count PC_GetArraySize(cmds);

        for (new 
    0cmds_counti++) {
            
    PC_GetCommandName(cmdsicmd_name);
            
    flags PC_GetFlags(cmd_name);

            if (
    IsPlayerHasAdminFlag(playeridflags)) {
                
    SendClientMessage(playerid, -1cmd_name);
            }
        }
        return 
    1;
    }

    stock IsPlayerHasAdminFlag(playeridflags)
    {
        if (   (
    flags CMD_ADMIN_5) && PlayerInfo[playerid][pAdmin] < 5
            
    || (flags CMD_ADMIN_4) && PlayerInfo[playerid][pAdmin] < 4
            
    || (flags CMD_ADMIN_3) && PlayerInfo[playerid][pAdmin] < 3
            
    || (flags CMD_ADMIN_2) && PlayerInfo[playerid][pAdmin] < 2
            
    || (flags CMD_ADMIN_1) && PlayerInfo[playerid][pAdmin] < 1
           
    ) {
            return 
    0;
        }
        return 
    1;

    Да, придётся каждую команду пометить флагом, но оно того стоит.
    Последний раз редактировалось ziggi; 03.08.2016 в 12:29.

  3. Пользователь сказал cпасибо:
    Blood (03.08.2016)
  4. #23
    Аватар для iWors
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.03.2016
    Сообщений
    12
    Репутация:
    2 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Самый нормальный вариант - это использовать плагин Pawn.CMD и его функции CmdArray:PC_GetCommandArray(), PC_GetArraySize(CmdArray:arr), PC_GetCommandName(CmdArray:arr, index, dest[], size = sizeof dest). Только так эту команду можно автоматизировать.

    UPD. Набросал пример:
    PHP код:
    #include <a_samp>
    #include <Pawn.CMD>

    enum (<<=1) {
        
    CMD_USER 1,
        
    CMD_ADMIN_1,
        
    CMD_ADMIN_2,
        
    CMD_ADMIN_3,
        
    CMD_ADMIN_4,
        
    CMD_ADMIN_5,
    };

    public 
    OnPlayerCommandReceived(playeridcmd[], params[], flags)
    {
        if (!
    IsPlayerHasAdminFlag(playeridflags)) {
            
    SendClientMessage(playerid, -1"У вас недостаточно прав для выполнения этой команды.");
            return 
    1;
        }
        return 
    1;
    }

    flags:ban(CMD_ADMIN_5);
    cmd:ban(playeridparams[])
    {
        return 
    1;
    }

    flags:kick(CMD_ADMIN_4);
    cmd:kick(playeridparams[])
    {
        return 
    1;
    }

    flags:ahelp(CMD_ADMIN_1);
    cmd:ahelp(playeridparams[])
    {
        new
            
    CmdArray:cmds,
            
    cmds_count,
            
    cmd_name[32],
            
    flags;

        
    cmds PC_GetCommandArray();
        
    cmds_count PC_GetArraySize(cmds);

        for (new 
    0cmds_counti++) {
            
    PC_GetCommandName(cmdsicmd_name);
            
    flags PC_GetFlags(cmd_name);

            if (
    IsPlayerHasAdminFlag(playeridflags)) {
                
    SendClientMessage(playerid, -1cmd_name);
            }
        }
        return 
    1;
    }

    stock IsPlayerHasAdminFlag(playeridflags)
    {
        if (   (
    flags CMD_ADMIN_5) && PlayerInfo[playerid][pAdmin] < 5
            
    || (flags CMD_ADMIN_4) && PlayerInfo[playerid][pAdmin] < 4
            
    || (flags CMD_ADMIN_3) && PlayerInfo[playerid][pAdmin] < 3
            
    || (flags CMD_ADMIN_2) && PlayerInfo[playerid][pAdmin] < 2
            
    || (flags CMD_ADMIN_1) && PlayerInfo[playerid][pAdmin] < 1
           
    ) {
            return 
    0;
        }
        return 
    1;

    Да, придётся каждую команду пометить флагом, но оно того стоит.
    PHP код:
    /* 1 */ public OnPlayerCommandReceived(playeridcmd[], params[], flags)
    /* 2 */ {
        
    /* 3 */ if (!IsPlayerHasAdminFlag(playeridflags)) {
            
    /* 4 */ SendClientMessage(playerid, -1"У вас недостаточно прав для выполнения этой команды.");
            
    /* 5 */ return 1// тут
        /* 6 */ 
    }
        
    /* 7 */ return 1;
    /* 8 */ 

  5. #24
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от iWors Посмотреть сообщение
    PHP код:
    /* 1 */ public OnPlayerCommandReceived(playeridcmd[], params[], flags)
    /* 2 */ {
        
    /* 3 */ if (!IsPlayerHasAdminFlag(playeridflags)) {
            
    /* 4 */ SendClientMessage(playerid, -1"У вас недостаточно прав для выполнения этой команды.");
            
    /* 5 */ return 1// тут
        /* 6 */ 
    }
        
    /* 7 */ return 1;
    /* 8 */ 
    Что тут?

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

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

      Открыть/закрыть
    Цитата Сообщение от DeIMoS
    А теперь я покажу вам немного магии

    Описание команд для каждого уровня в отдельном массиве (ВАЖНО что бы они всегда стояли вместе и в такой же последовательности)
    PHP код:
    new acmd_list__moderator1[] =
    {
        
    "1 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    };

    new 
    acmd_list__moderator2[] =
    {
        
    "2 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    };

    new 
    acmd_list__moderator3[] =
    {
        
    "3 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    };

    new 
    acmd_list__administrator1[] =
    {
        
    "4 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    };

    new 
    acmd_list__administrator2[] =
    {
        
    "5 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    };

    new 
    acmd_list__developer[] =
    {
        
    "6 Уровень:\n\
        команда 1 - описание\n\
        команда 2 - описание\n\
        команда 3 - описание\n\
        команда 4 - описание\n\
        команда 5 - описание\n\
        команда 6 - описание\n\
        команда 7 - описание\n\
        команда 8 - описание\n\
        команда 9 - описание\n\
        команда 10 - описание\n"
    }; 
    Макрос чисто для удобства
    PHP код:
    #define         admin_commands_list         acmd_list__moderator1 
    Превращаем отдельные массивы в один большой (отобразить его можно вызовом первого массива - "acmd_list__moderator1")
    PHP код:
    public OnGameModeInit()
    {
        
    acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\n';// Заменяем нуль-символы массивов на спец.символ переноса строки
        
    acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\n';// Тем самым убирая "границы" между двумя массивами
        
    acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';// И когда сервер начнёт обрабатывать массив, выводя все символы до первого нуль-символа
        
    acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\n';// Он найдёт его только в последнем массиве
        
    acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';//Следовательно, выведет содержимое всех массивов сразу
        
    acmd_list__developer[sizeof(acmd_list__developer)-1] = '\0';
        return 
    1;


    Отображаем данные игроку
    PHP код:
    if(!strcmp(cmd"/ahelp"true) || !strcmp(cmd"/ah"true))
    {
        if (!
    PlayerInfo[playerid][pAdmin]) return 1;
        
    ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"admin_commands_list"Ок""");
        return 
    1;

    Если нужно, например, вывести с 1 по 3 уровень, просто делаем так:
    PHP код:
    if(!strcmp(cmd"/ahelp"true) || !strcmp(cmd"/ah"true))
    {
        if (!
    PlayerInfo[playerid][pAdmin]) return 1;
        
    acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\0';// Вновь возвращаем нуль-символ в конец третьего массива
        
    ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"admin_commands_list"Ок""");// Отображаем все данные с 1 по 3-ий массив
        
    acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';// Вновь возвращаем символ переноса строки
        
    return 1;

    То же самое можно провернуть, например, если нужно отобразить только 5-ий уровень
    PHP код:
    if(!strcmp(cmd"/ahelp"true) || !strcmp(cmd"/ah"true))
    {
        if (!
    PlayerInfo[playerid][pAdmin]) return 1;
        
    acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\0';// Возвращаем нуль-символ для пятого массива (дабы данные из 6-го массива не попали в диалог)
        
    ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__administrator2"Ок""");// Отображаем массив с пятым уровнем
        
    acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';// И опять возвращаем символ переноса строки
        
    return 1;

    И не нужно никакое форматирование использовать.


    - - - Добавлено - - -

    Можно для удобства такой говнокод написать
    PHP код:
    stock ShowAdminList(playeridlower_level 1top_level 6)
    {
        if(!(
    <= lower_level <= 6))
            return 
    0;

        if(!(
    <= top_level <= 6))
            return 
    0;

        switch(
    top_level)
        {
            case 
    1acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\0'
            case 
    2acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\0'
            case 
    3acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\0';
            case 
    4acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\0';
            case 
    5acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\0';
        }

        switch(
    lower_level)
        {
            case 
    1ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__moderator1"Ок""");
            case 
    2ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__moderator2"Ок""");
            case 
    3ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__moderator3"Ок""");
            case 
    4ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__administrator1"Ок""");
            case 
    5ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__administrator2"Ок""");
            case 
    6ShowPlayerDialog(playerid675DIALOG_STYLE_MSGBOX"Админ-Команды"acmd_list__developer"Ок""");
        }
        switch(
    top_level)
        {
            case 
    1acmd_list__moderator1[sizeof(acmd_list__moderator1)-1] = '\n'
            case 
    2acmd_list__moderator2[sizeof(acmd_list__moderator2)-1] = '\n'
            case 
    3acmd_list__moderator3[sizeof(acmd_list__moderator3)-1] = '\n';
            case 
    4acmd_list__administrator1[sizeof(acmd_list__administrator1)-1] = '\n';
            case 
    5acmd_list__administrator2[sizeof(acmd_list__administrator2)-1] = '\n';
        }    
        return 
    1;

    И выводить так:
    PHP код:
    if(!strcmp(cmd"/ahelp"true) || !strcmp(cmd"/ah"true)) 
        return 
    ShowAdminList(playerid1PlayerInfo[playerid][pAdmin]);//Выведет все команды с 1 уровня по тот, который у админа
    // В самой функции уже встроена проверка на уровень, поэтому в команде дополнительные проверки не обязательны 
    То бишь
    PHP код:
    ShowAdminList(playeridс_какого_уровняпо_какой); 
    Последний раз редактировалось DeimoS; 31.10.2016 в 21:31.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 
Страница 3 из 3 ПерваяПервая 1 2 3

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

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

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

Ваши права

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