1. MakapoH. Команда форума

    Регистрация:
    06.02.16
    Сообщения:
    709
    Симпатии:
    271
    Пол:
    Мужской
    Доброго времени суток, форумчане!

    Сегодня я постараюсь научить вас:
    • Создавать старую систему меню
    • Форматировать какой-либо пункт
    Создание старой системы меню
    PHP:
    new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
    Регистрация наших кнопок меню.
    Их может быть не больше 9! Если вам необходимо меньше кнопок в меню, например 5, то делаем так:
    PHP:
    new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)
    Это делать не обязательно, но желательно =)

    Далее:
    PHP:
    public plugin_init()
    {
        
    // Регистрация команды вызывающую наше меню
        
    register_clcmd("say /menu""Menu_Function")
        
    register_clcmd("say_team /menu""Menu_Function")
        
    // Регистрация самого меню
        // "айди меню", кнопки, "обработчик"
        
    register_menu("Menu"KEYS_MENU"Menu_Handler")
    }
    Немного подробнее о:
    Стоит отметить, что register_menu можно заменить на:
    PHP:
    register_menucmd(register_menuid("Menu"), KEYS_MENU"Menu_Handler")
    Данный вид записи не повлияет на работу кода. Он будет полезен тем, кому не нужна лишняя библиотека amxmisc.
    register_menu уже содержит в себе register_menucmd(register_menuid(name[]))

    Идём далее:
    PHP:
    public Menu_Function(id// та самая функция меню
    {
        static 
    menu[1024// здесь у нас будет храниться весь текст
        
    new len // длина текста

        
    len formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^n^n")

        
    len += formatex(menu[len], charsmax(menu) - len"\w1. Первый пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"\d2. Второй пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"\r3. Третий пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"\w4. Четвёртый пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"5. Пятый пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"6. Шестой пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"7. Седьмой пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"8. Восьмой пункт^n")
        
    len += formatex(menu[len], charsmax(menu) - len"9. Девятый пункт^n^n")
        
    len += formatex(menu[len], charsmax(menu) - len"\r0. Выход")

        
    // показываем меню
        // кому, кнопки меню, наш готовый текст, сколько секунд показывать (-1 бесконечно), "айди меню"
        
    show_menu(idKEYS_MENUmenu, -1"Menu")
    }
    Немного подробнее о:
    Данная операция объединяет текст к уже существующему тексту.
    По другому говоря, можете просто себе представить что весь этот текст лишь в одной строке: "\yЭто меню сервера^n^n1. Первый пункт^n2. Второй пункт^n" и т.д

    С помощью данных операций, мы можем этот текст перевести на более разборчивый для человека. Но так же можно и использовать следующую запись:
    PHP:
    len formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^n^n\w1. Первый пункт^n\d2. Второй пункт^n")
    Но разве это читабельно? Тут уж решать вам =)

    Завершающая часть:
    PHP:
    public Menu_Handler(idkey// обработчик меню
    {
        switch(
    key)
        {
            case 
    0:client_print(idprint_chat"Вы выбрали первый пункт.")
            case 
    1:client_print(idprint_chat"Вы выбрали второй пункт.")
            case 
    2:client_print(idprint_chat"Вы выбрали третий пункт.")
            case 
    3:client_print(idprint_chat"Вы выбрали четвёртый пункт.")
            case 
    4:client_print(idprint_chat"Вы выбрали пятый пункт.")
            case 
    5:client_print(idprint_chat"Вы выбрали шестой пункт.")
            case 
    6:client_print(idprint_chat"Вы выбрали седьмой пункт.")
            case 
    7:client_print(idprint_chat"Вы выбрали восьмой пункт.")
            case 
    8:client_print(idprint_chat"Вы выбрали девятый пункт.")
            case 
    9:client_print(idprint_chat"Вы вышли из меню.")
        }
    }
    Почему не if(key == 1) ... и т.д, а switch?
    Работает быстрее и рекомендуется использовать, если это возможно =)

    PHP:
    new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)

    public 
    plugin_init()
    {
       
    register_clcmd("say /menu""Menu_Function")
       
    register_clcmd("say_team /menu""Menu_Function")

       
    register_menu("Menu"KEYS_MENU"Menu_Handler")
    }

    public 
    Menu_Function(id)
    {
       static 
    menu[1024]
       new 
    len

       len 
    formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^n^n")

       
    len += formatex(menu[len], charsmax(menu) - len"\w1. Первый пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"\d2. Второй пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"\r3. Третий пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"\w4. Четвёртый пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"5. Пятый пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"6. Шестой пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"7. Седьмой пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"8. Восьмой пункт^n")
       
    len += formatex(menu[len], charsmax(menu) - len"9. Девятый пункт^n^n")
       
    len += formatex(menu[len], charsmax(menu) - len"\r0. Выход")

       
    show_menu(idKEYS_MENUmenu, -1"Menu")
    }


    public 
    Menu_Handler(idkey)
    {
        switch(
    key)
        {
            case 
    0:client_print(idprint_chat"Вы выбрали первый пункт.")
            case 
    1:client_print(idprint_chat"Вы выбрали второй пункт.")
            case 
    2:client_print(idprint_chat"Вы выбрали третий пункт.")
            case 
    3:client_print(idprint_chat"Вы выбрали четвёртый пункт.")
            case 
    4:client_print(idprint_chat"Вы выбрали пятый пункт.")
            case 
    5:client_print(idprint_chat"Вы выбрали шестой пункт.")
            case 
    6:client_print(idprint_chat"Вы выбрали седьмой пункт.")
            case 
    7:client_print(idprint_chat"Вы выбрали восьмой пункт.")
            case 
    8:client_print(idprint_chat"Вы выбрали девятый пункт.")
            case 
    9:client_print(idprint_chat"Вы вышли из меню.")
        }
    }
    Форматирование пунктов

    Ну здесь всё предельно просто.

    Например, я хочу выводить ник игрока в заголовке. Как это сделать?
    PHP:
    new name[32// хранение ника
    get_user_name(idnamecharsmax(name)) // получение ника

    len formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^nПривет: %s^n^n"name)
    Тоже самое и с хранением каких-либо значений.
    PHP:
    new weapons // указываем что у нас 3 оружия

    len formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^nОружий: %d^n^n"weapons)
    Всё это так же можно сочетать.
    PHP:
    new name[32// хранение ника
    get_user_name(idnamecharsmax(name)) // получение ника

    new weapons // указываем что у нас 3 оружия

    len formatex(menu[len], charsmax(menu) - len"\yЭто меню сервера^nПривет: %s^nУ тебя: %d оружий^n^n"nameweapons)
    Что такое %d, %s?
    [​IMG]

    Есть вопросы? Спрашивайте :)
     
    Последнее редактирование: 05.08.16
    KoPa6JIuK, NinTenDo, ThePhoenix и 5 другим нравится это.
  2. HannibaL Команда форума

    Регистрация:
    28.02.15
    Сообщения:
    1.059
    Симпатии:
    224
    Пол:
    Мужской
  3. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    877
    Симпатии:
    298
    Пол:
    Мужской
    Еще добавлю, из прочитаного выше, и личного опыта static menu[1024] в меню есть лимит 512 байт 1024 тут не уместно.
    Плюс поправлю на счет KEYS_MENU,
    PHP:
    new const KEYS_MENU = (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)
    Если использовать бит суммы и у нас пять пунктов то в конце всегда надо указывать (1<<9) иначе пункт \r0. Выход не будет работать.
    Если открыть сорцы можно понять почему :)
    PHP:
    #define MENU_KEY_1      (1<<0)
    #define MENU_KEY_2      (1<<1)
    #define MENU_KEY_3      (1<<2)
    #define MENU_KEY_4      (1<<3)
    #define MENU_KEY_5      (1<<4)
    #define MENU_KEY_6      (1<<5)
    #define MENU_KEY_7      (1<<6)
    #define MENU_KEY_8      (1<<7)
    #define MENU_KEY_9      (1<<8)
    #define MENU_KEY_0      (1<<9)
     
  4. NinTenDo Пользователь

    Регистрация:
    20.09.15
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    VKcom:
    nintendo_cs
    Skype:
    nintendo-cs
    ICQ:
    212663371
    Расскажи о том, как добавить две команды на один пункт. Нажал один раз - первая команда, нажал еще раз - вторая. Думаю, будет полезно.
     
  5. MakapoH. Команда форума

    Регистрация:
    06.02.16
    Сообщения:
    709
    Симпатии:
    271
    Пол:
    Мужской
    @NinTenDo,
    PHP:
    case 0:
    {
        
    client_print(idprint_chat"Вы выбрали первый пункт.")
        
    client_cmd(id"amxmodmenu");
        
    client_cmd(id"say i am noob");
    }
     
  6. NinTenDo Пользователь

    Регистрация:
    20.09.15
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    VKcom:
    nintendo_cs
    Skype:
    nintendo-cs
    ICQ:
    212663371
    @MakapoH., вы меня не поняли. Я имел ввиду это: "1. Музыка: [Вкл] / 1. Музыка: [Выкл]".
     
  7. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    877
    Симпатии:
    298
    Пол:
    Мужской
    @NinTenDo, Ну по порядку, допустим наше меню выглядит таким образом
    Код:
    #include < amxmodx >
    
    new const KEYS_MENU = (1<<0)|(1<<9);
    
    public plugin_init()
    {
        register_clcmd("say /menu", "Menu_Function");
        register_clcmd("say_team /menu", "Menu_Function");
    
        register_menu("Menu", KEYS_MENU, "Menu_Handler");
    }
    
    public Menu_Function(id)
    {
        new szMenu[512], len;
    
        len = formatex(szMenu[len], charsmax(szMenu) - len, "\yЭто меню сервера^n^n");
    
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\w1. Музыка: \yВкл/Выкл^n");
        len += formatex(szMenu[len], charsmax(szMenu) - len, "\r0. Выход");
    
        show_menu(id, KEYS_MENU, szMenu, -1, "Menu");
    }
    
    public Menu_Handler(id, key)
    {
        switch(key)
        {
            case 0:
            {
                //  ваша команда
            }
        }
        return PLUGIN_HANDLED;
    }
     
  8. pUzzlik Пользователь

    Регистрация:
    06.05.15
    Сообщения:
    877
    Симпатии:
    298
    Пол:
    Мужской
    Делаем следующее, создаем глобальную перименную
    PHP:
    new bool:g_bMusic[MAX_CLIENTS+1];
    Дальше в меню форматируем строчку на
    PHP:
    len += formatex(szMenu[len], charsmax(szMenu) - len"\w1. Музыка: \y[%s]^n"g_bMusic[id] ? "Вкл" "Выкл");
    и в Menu_Handler делаем следующее
    PHP:
    case 0:
    {
        
    g_bMusic[id] = !g_bMusic[id];
       
        if(
    g_bMusic[id])
        {
            
    //  ваша команда №1
        
    }
        else
        {
            
    //  ваша команда №2
        
    }
        
    // ну либо через switch и "true" or "false"
    }
     
  9. NinTenDo Пользователь

    Регистрация:
    20.09.15
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    VKcom:
    nintendo_cs
    Skype:
    nintendo-cs
    ICQ:
    212663371