Авторизация Регистрация Забыли пароль?
Реклама

Статьи
Наш игровой сервер
Наши сервисы
Мониторинг серверов
Информация
Нам интересно знать
Популярные теги
Популярные материалы
    Партнеры
    Счетчики
    Вы находитесь:

    Категория: Статьи

    Новая система меню AMXX

    Автор: [RAMM]STEIN

    Дата: 26 августа 2010

    Просмотров: 2 988

    Комментариев: 1

    Новая система меню AMXX

    Если вы создается меню, опции которого не изменяются (постоянные), то лучше всего создать его, как глобальное. Не нужно его уничтожать и заново создавать по несколько раз.

    Если небходимо выровнять текст в меню по правому краю, то используйте \R.

    Меню не будет показываться, если у него нет опций.

    Для того чтобы убрать отображение меню у игрока на экране, можно использовать код:
    show_menu(id, 0, "^n", 1)

    Список цветов, которые можно использовать при создании меню:

    Белый - \w
    Желтый - \y
    Красный - \r
    Серый - \d
    Функции:

    Создание меню
    menu_create(title[], handler[], ml=0)

    title - заголовок меню, который отображается сверху.
    handler - функция, с которой будет происходить взаимодействие, когда произошло нажатие одной из опций.
    ml - использовать мультиязычность при формировании меню.

    Добавление опции меню
    menu_additem(menu, const name[], const command[], paccess=0, callback=-1)

    menu - меню, с которым мы будем взаимодействовать.
    name - название опции меню (нумерация происходит автоматически).
    command - информация, которую мы посылаем при использовании данной опции.
    paccess - уровень доступа к данной опции (флаг администратора).
    callback - если данная опция установлена (это должен быть результат функции menu_makecallback), то будет вызов функции до вывода опции на экран, что даст возможность изменить опцию в реальном времени.

    Установка свойств меню
    menu_setprop(menu, prop, ...)

    menu - меню, с которым мы будем взаимодействовать.
    prop - свойство меню.

    Отображение меню
    menu_display(id, menu, page)

    id - индекс игрока, которому мы должны показать меню.
    menu - меню, которое необходимо показать.
    page - страница меню, с которой начинается отображение.

    Уничтожение меню
    menu_destroy(menu)

    menu - меню, которое нужно уничтожить. После вызова данной функции необходимо использовать return PLUGIN_HANDLED.

    Получение информации об опции меню
    menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback)

    menu - меню, из которого необходимо получить информацию.
    item - опция, о которой необходимо получить информацию.
    access - уровень доступа для указанной опции.
    command - данные, передаваемые данной опцией.
    cmdlen - длина данных.
    name - название опции меню.
    namelen - длина названия.
    callback - значение callback.

    Добавление пустой опции (пробел)
    menu_addblank(menu, slot=1)

    menu - меню, с которым необходимо произвести действие.
    slot - если значение больше 0, то увеличивает пробелы в данном количестве раз.
    Можно использовать только после menu_additem.

    Отменить меню у игрока
    menu_cancel(player)

    player - игрок, у которого необходимо отменить действие меню, меню останется на экране игрока, но любое действие будет анулировано.

    Количество опций в меню
    menu_items(menu)

    menu - меню, у которого необходимо получить кол-во опций.

    Количество страниц в меню
    menu_pages(menu)

    menu - меню, у которого необходимо получить кол-во страниц.

    Установить callback на опцию меню
    menu_item_setcall(menu, item, callback=-1)

    menu - меню, с которым происходит взаимодействие.
    item - опция меню.
    callback - значение для callback.

    Установить команду на опцию меню
    menu_item_setcmd(menu, item, cmd[])

    menu - меню, с которым происходит взаимодействие.
    item - опция меню.
    cmd - команда опции.

    Установить название опции меню
    menu_item_setname(menu, item, name[])

    menu - меню, с которым происходит взаимодействие.
    item - опция меню.
    name - название опции.

    Создание callback функции
    menu_makecallback(function[])

    function - название функции для callback.
    Данная функция передает аргументы id игрока, id меню и id опции:
    public function(id, menu, item)

    Функция может возвращать следующие значения: ITEM_IGNORE, ITEM_ENABLED или ITEM_DISABLED.

    Создание базисного меню (основной пример)
    #include <amxmodx>

    public plugin_init()
    {
        // Данные вашего плагина

        // Клиентская команда для вызова меню
        register_clcmd("my_menu", "My_Menu")
    }

    // Создадим функцию, которая будет формировать меню
    public My_Menu(id)
    {
        // Сперва необходимо создать переменную для меню, с которой мы будем взаимодействовать в дальнейшем
        new i_Menu = menu_create("\rTitle of my menu:", "menu_handler")

        // Теперь добавим некоторые опции для меню
        menu_additem(i_Menu, "\wFirst option #1", "1", 0)
        menu_additem(i_Menu, "\wSecond option #2", "2", 0)
        menu_additem(i_Menu, "\wAdmin option #3", "3", ADMIN_ADMIN)

        // Устанавливаем свойства меню
        menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL)

        // Отображение меню игроку
        menu_display(id, i_Menu, 0)
    }

    // Создадим теперь функцию обработки действий меню
    public menu_handler(id, menu, item)
    {
        // Если игрок нажал выход из меню
        if (item == MENU_EXIT)
        {
            // Уничтожение меню
            menu_destroy(menu)
            
            return PLUGIN_HANDLED
        }

        // Теперь создадим переменные, необходимые для получения информации о меню и нажатой опции
        new s_Data[6], s_Name[64], i_Access, i_Callback

        // Получаем информацию об опции
        menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

        // Если посмотреть раньше на использовании menu_additem, то можно увидеть, что мы посылали некоторую информацию
        // В данном случае вся информация - целочисленная
        new i_Key = str_to_num(s_Data)

        // Теперь найдем, какая именно опция была использована
        switch(i_Key)
        {
            case 1:
            {
                client_print(id, print_chat, "You selected first option")
                // Уничтожение меню
                menu_destroy(menu)
                return PLUGIN_HANDLED
            }
            case 2:
            {
                client_print(id, print_chat, "You selected second option")
            }
            case 3:
            {
                client_print(id, print_chat, "You selected admin option")
            }
        }

        // Уничтожение меню
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }

    Создание меню, сформированного из игроков на сервере
    #include <amxmodx>
    #include <fun>

    public plugin_init()
    {
        // Клиентская команда для вызова меню
        register_clcmd("my_menu", "My_Menu")
    }

    public My_Menu(id)
    {
        // Сперва необходимо создать переменную для меню, с которой мы будем взаимодействовать в дальнейшем
        new i_Menu = menu_create("\rPlayer menu:", "menu_handler")

        // Необходимые переменные, которые понадобятся нам при выводе меню из игроков
        new s_Players[32], i_Num, i_Player

        // Переменные для хранения информации об игроках
        new s_Name[32], s_Player[10]

        // Получаем массив игроков
        get_players(s_Players, i_Num)

        // Цикл по всем игрокам
        for (new i; i < i_Num; i++)
        {
            // Сохраняем текущего игрока в i_Player
            i_Player = s_Players[i]

            // Получаем имя и ID игрока
            get_user_name(i_Player, s_Name, charsmax(s_Name))
            num_to_str(i_Player, s_Player, charsmax(s_Player))

            // Добавляем опцию по данному игроку
            menu_additem(i_Menu, s_Name, s_Player, 0)

        }

        // Мы сформировали меню из игроков, присутствующих на сервере, теперь выводим его
        menu_display(id, i_Menu, 0)
    }

    public menu_handler(id, menu, item)
    {
        if (item == MENU_EXIT)
        {
            menu_destroy(menu)
            return PLUGIN_HANDLED
        }

        new s_Data[6], s_Name[64], i_Access, i_Callback
        menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

        // Получаем ID игрока, который был выбран в меню
        new i_Player = str_to_num(s_Data)

        // Проверяем, если игрок живой
        if (is_user_alive(i_Player))
            // Устанавливаем его здоровье в 100 HP
            set_user_health(i_Player, 100)

        menu_destroy(menu)
        return PLUGIN_HANDLED
    }

    Создание меню для голосования
    #include <amxmodx>

    // Для хранения меню голсоований
    new g_VoteMenu
    // Для хранения голосов за каждую опцию
    new g_Votes[2]
    // Для проверки, если голосование уже запущено
    new g_Voting

    public plugin_init()
    {
        register_clcmd("start_vote", "StartVote")
    }

    public StartVote(id)
    {
        // Если голосование уже запущено, то выходим
        if (g_Voting)
        {
            client_print(id, print_chat, "There is already a vote going.")
            // Мы возвращаем PLUGIN_HANDLED, чтобы в консоли игрока не было сообщения unknown command
            return PLUGIN_HANDLED
        }

        g_VoteMenu = menu_create("\rVote Menu:", "menu_handler")

        menu_additem(g_VoteMenu, "Vote Option 1", "0", 0)
        menu_additem(g_VoteMenu, "Vote Option 2", "1", 0)
        
        new s_Players[32], i_Num, i_Player
        get_players(s_Players, i_Num)

        for (new i; i < i_Num; i++)
        {
            i_Player = s_Players[i]

            menu_display(i_Player, g_VoteMenu, 0)

            // Увеличиваем, чтобы узнать сколько игроков голосуют
            g_Voting++
        }

        // Останавливаем голосование через 10 секунд
        set_task(10.0, "EndVote")

        return PLUGIN_HANDLED
    }

    public menu_handler(id, menu, item)
    {
        if (item == MENU_EXIT)
            return PLUGIN_HANDLED

        new s_Data[6], s_Name[64], i_Access, i_Callback
        menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

        // Полчаем информацию о том, какая опция была выбрана
        new i_Vote = str_to_num(s_Data)

        // Увеличиваем количество голосов по данной опции
        g_Votes[i_Vote]++

        return PLUGIN_HANDLED
    }

    public EndVote()
    {
         // Если первая опция набрала больше голосов, чем вторая
        if (g_Votes[0] > g_Votes[1])
            client_print(0, print_chat, "First option recieved most votes (%d)", g_Votes[0])
        // Иначе если вторая опция набрала больше голосов, чем первая
        else if (g_Votes[1] > g_Votes[0])
            client_print(0, print_chat, "Second option recieved most votes (%d)", g_Votes[1])
        // Иначе равное кол-во голосов
        else
            client_print(0, print_chat, "The vote tied at %d votes each.", g_Votes[0])

        menu_destroy(g_VoteMenu)

        // Сбрасываем информацию о том, что игроки голосуют
        g_Voting = 0
    }

    Создание меню с использованием под-меню
    #include <amxmodx>

    public plugin_init()
    {
        register_clcmd( "my_menu","My_Menu")
    }

    public My_Menu(id)
    {
        new i_Menu = menu_create("\rMy menu:", "menu_handler")

        menu_additem(i_Menu, "\wFirst option #1", "1", 0)
        menu_additem(i_Menu, "\wSub-Menu #2", "2", 0)

        menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL)
        menu_display(id, i_Menu, 0)
    }

    public menu_handler(id, menu, item)
    {
        if (item == MENU_EXIT)
        {
            menu_destroy(menu)
            return PLUGIN_HANDLED
        }

        new s_Data[6], s_Name[64], i_Access, i_Callback
        menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
        
        new i_Key = str_to_num(s_Data)

        switch(i_Key)
        {
            case 1:
            {
                client_print(id, print_chat, "You selected first option")
            }
            case 2:
            {
                // Открыть под-меню
                Sub_Menu(id)
            }
        }

        menu_destroy(menu)
        return PLUGIN_HANDLED
    }

    public Sub_Menu(id)
    {
        // Создаем новое меню, но функция обработки действий будет другая
        new i_Menu = menu_create("\rSub-Menu:", "submenu_handler")

        menu_additem(i_Menu, "\wSub-option #1", "1", 0)
        menu_additem(i_Menu, "\wSub-option #2", "2", 0)

        menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL)
        menu_display(id, i_Menu, 0)
    }

    public submenu_handler(id, menu, item)
    {
        if (item == MENU_EXIT)
        {
            menu_destroy(menu)

            // Если игрок на сервере, то показываем главное меню
            if (is_user_connected(id))
                My_Menu(id)

            return PLUGIN_HANDLED
        }

        new s_Data[6], s_Name[64], i_Access, i_Callback
        menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

        new i_Key = str_to_num(s_Data)

        switch(i_Key)
        {
            case 1:
            {
                client_print(id, print_chat, "You selected first sub-option")
            }
            case 2:
            {
                client_print(id, print_chat, "You selected second sub-option")
            }
        }

        menu_destroy(menu)

        // Если вы хотите показать главное меню потом
        My_Menu(id)

        return PLUGIN_HANDLED
    }


    Ну вот вроде бы и все.Думаю многим будет полезна даная информация.Сам по ней учился.
    Не забываем говрить Спасибо=)Долго писал и оформял.

    Похожие публикации
    Комментарии на сайте
    nextonazzz

    Написал: nextonazzz 29 октября 2012 12:08 Группа: Юзер
    Автор: Emp`
    Перевод и редактирование: DJ_WEST
    Цитировать
    Новый комментарий

    Информация

    Посетители, находящиеся в группе lamo, не могут оставлять комментарии к данной публикации.