Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 10
    Гостей: 5
    Пользователи: - отсутствуют
    Роботы: Mail Ru, Mail Ru, Mail Ru, Mail Ru, Mail Ru

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 12-02-2012, 12:25 Просмотров: 3252

    get_user_menu Функция проверяет открыто у игрока меню или нет

    Иногда требуется проверить, открыто ли у игрока меню или нет, например что бы не открыть ему меню голосования за следующую карту, когда у него открыто меню с выбором оружия или админское меню.

    Инфо из amxmodx.inc:
    /* Gets what menu the player is watching and what keys for menu he have.
    * When there is no menu the index is 0. If the id is negative then the menu
    * is VGUI in other case the id is from register_menuid() function. */
    native get_user_menu(index,&id,&keys);


    Синтаксис:
    get_user_menu ( index,&id,&keys )

    • index - id игрока
    • &id - вернет menuid
    • &keys - (как с этим аргументом работать не разобрался, и примеров не нашел.)


    Тип функции:
    Native

    Пример:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[amxmodx.inc] get_user_menu"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new mtestmenu // Menu

    public plugin_init() {
        
        register_plugin(PLUGIN, VERSION, AUTHOR)

        register_clcmd("say /menu","f_openmenu")
        register_clcmd("say /tmenu","f_topenmenu")
        
        /* Menu test menu */
        /* Use menu_display(id, mtestmenu, 0) to show the menu to an user. */
        mtestmenu = menu_create("test menu", "mh_testmenu")
        menu_additem(mtestmenu, "Test item", "1")
        menu_additem(mtestmenu, "Test item2", "2")
        /* Menu End */

    }
    public f_openmenu(id){
        menu_display(id, mtestmenu, 0)
        
    }
    public f_topenmenu(id){
        new mid,keys
        get_user_menu(id,mid,keys)
        client_print(0,print_chat,"Menu id:%d",mid)
        
    }
    public mh_testmenu(id, menu, item) {
        item++
        client_print(id,print_chat,"item:%d",item)
        
    }


    Описание:
    Когда не открыто ни какого меню, функция вернет 0. Если вернет отрицательный результат тогда меню - VGUI.

    В примере выше две функции и меню для эксперимента.
    Выполнив команду say /tmenu вам в чат будет выдана информация содержащая id открытого меню.
    Вводите эту команду когда у вас открыты разные меню ( функция работает со всеми меню, а не только с теми которые есть в плагине)

    Кто знает как работать с &keys, пишите в комментарии или мне в ЛС, обязательно дополню и укажу вас как источник.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    maine

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    а возможно после проверки если меню открыто закрыть его?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Возможно. Изучай систему меню.
    --------------------
    Алексей

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    &keys - играется с кол-вом пунктов в меню.
    Mr_ILYAS

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Кейс выдаёт возможные кнопки для нажатия.
    Представим кнопки в двоичном виде 1 0 0 1 1 0 0 1 1 0 (10 цифр)
    Читается их порядок справа налево
    То есть получается в данном примере доступны для нажатия кнопки 2,3,6,7,10
    (10 это обычно кнопка выхода из меню)

    Допустим нам keys выдало число 512
    переведя в двоичную с.ч. мы получим 1000000000
    То есть получается доступна только кнопка выхода

    Или допустим число 1023 даст нам в двоичном представлении все единицы 1111111111
    То есть все кнопки доступны для действий.

    Для тестирования вот вам 2 функции (можете побаловаться):

    Эта ф-ция используя ту, что ниже преобразует число (хоть двоичное, хоть десятичное — без разницы) в строку в двоичном представлении числа num

    И далее (в скобках) это же число будет указано в десятичном представлении (даже если num указали двоичное).
    То есть функция удобна в обоих направлениях одновременно.
    stock GetBin_str(num){
    new str[192];
    num_to_str(num,str,191)
    format(str,charsmax(str),"%s (%d)",DecToBin(str_to_num(str)),str_to_num(str))
    return str;
    }

    //перевод из 10-ной в 2-ную число num
    stock DecToBin(num){
    new i=0,str[100],ii,arr[100];
    while(num>1){
    ii=num%2;
    if(ii>=0)arr[i]=ii;
    num=num/2;
    i++;
    if(num<2){
    arr[i]=num;
    break;
    }
    }
    for(new b=0;i>=0;b++,i--)str[b]=arr[i]+48;
    return str;
    }
    gavrilyuc

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Не ужели и в этом скрипте есть такое понятие как бинарное исчисление.

    Для того что бы понять это, можно почитать про Бинарные числа и откуда они походят.
    str[b]=arr[i]+48;

    Новички наверное будут спрашивать от куда взялось число 48... А всё очень просто :
    Есть таблица ASCII а так как эта таблица это основа Байтов, char, и других типов.
    То код(значение) в таблице 48 - Равен Нулю.

    если я где то ошибся, поправьте.

    Mr_ILYAS,
    Хотел тебя спросить :
    Есть возможность Сериализации / десериализации какого то объекта представления(массив, значение) ?

    Информация

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

Реклама