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

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

    Сегодня я постараюсь научить вас:
    • Создавать старую систему меню
    • Форматировать какой-либо пункт
    Создание старой системы меню
    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
    ThePhoenix, Phenom5555, HannibaL и 3 другим нравится это.
  2. HannibaL Команда форума

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

    Регистрация:
    06.05.15
    Сообщения:
    848
    Симпатии:
    287
    Пол:
    Мужской
    Еще добавлю, из прочитаного выше, и личного опыта 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)