Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 25 из 25

Тема: /ahelp

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

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    63
    Репутация:
    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,021
    Репутация:
    694 ±
    Самый нормальный вариант - это использовать плагин 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
    Сообщений
    10
    Репутация:
    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,021
    Репутация:
    694 ±
    Цитата Сообщение от 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
    Адрес
    Восточный Мордор
    Сообщений
    3,909
    Репутация:
    1497 ±
    На другом форуме ради фана показывал вариант с скреплением массивов. На деле же, как мне кажется, это будет самый адекватный вариант в случае, когда команды для /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.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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