Русское сообщество по скриптингу

Закрытие меню кнопкой открытия  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Закрытие меню кнопкой открытия

Сообщение Samwise » 14 янв 2019, 00:04

Вечер добрый! Возник очень интересный вопрос, который никак не могу реализовать (пробовал различными способами)
Имеется отлов фонаря:
Код: Выделить всё
register_impulse(100, "Main_Menu"

Соответственно, при нажатии забинденной кнопки "фонарь" меню появляется и работает. Но вопрос, можно ли как то как-то закрыть на эту же клавишу меню, если оно открыто. (Чтобы закрывалось и на 0 и на "фонарь")
Пробовал создавать различные проверки и от них уже menu_destroy, но меню не закрывается
Аватара пользователя
Samwise
 
Сообщения: 98
Зарегистрирован: 06 май 2013, 17:14
Благодарил (а): 25 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Закрытие меню кнопкой открытия

Сообщение MrJunior » 14 янв 2019, 00:23

menu_destroy не закрывает меню на стороне клиента, хотя должно вроде как, рекомендуют 'закрывать' меню через
Код: Выделить всё
show_menu(id0"^n"1); 
Аватара пользователя
MrJunior
Скриптер
 
Сообщения: 146
Зарегистрирован: 21 сен 2016, 19:46
Откуда: localhost
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn | Web | Lua

Re: Закрытие меню кнопкой открытия

Сообщение Samwise » 14 янв 2019, 00:32

А не получится так, что будут созданы "несколько типов меню"?
И show_menu можно ли заменить на menu_cancel?
Аватара пользователя
Samwise
 
Сообщения: 98
Зарегистрирован: 06 май 2013, 17:14
Благодарил (а): 25 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Закрытие меню кнопкой открытия

Сообщение gamingEx » 14 янв 2019, 00:57

Проверяешь оффсет m_iMenu (205, вроде) на ноль. Если не ноль – значит у игрока на данный момент открыто какое-то меню, иначе, соответственно, меню не открыто. Исходя из проверки либо показываешь меню, либо закрываешь. Закрываешь методом, которое тебе предоставили выше.
:dance2: :dance2: :dance2:
Аватара пользователя
gamingEx
 
Сообщения: 121
Зарегистрирован: 07 окт 2017, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 19 раз.
Опыт программирования: Больше трех лет
Языки программирования: Swift, C++, PHP, Ruby, JS

Re: Закрытие меню кнопкой открытия

Сообщение Mistrick » 14 янв 2019, 01:07

Код: Выделить всё
#include <amxmodx>
#include <engine>

new g_last_menu[33];

public 
plugin_init(){
    
register_impulse(100"Main_Menu"
}

public 
Main_Menu(id)
{
    new 
menuidnewmenuid;
    
player_menu_info(idmenuidnewmenuid);
    if(
newmenuid == g_last_menu[id]) {
        
show_menu(id0"^n"1);
        return;
    }
    
    new 
menu menu_create("Test""MenuHandler");
    
menu_additem(menu"one");
    
menu_additem(menu"two");
    
    
g_last_menu[id] = menu;
    
    
menu_display(idmenu);
}

public 
MenuHandler(idmenuitem)
{
    
menu_destroy(menu);
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Закрытие меню кнопкой открытия

Сообщение Samwise » 14 янв 2019, 01:12

Так получилось. Или так нельзя?
Код: Выделить всё

new bool
:g_menu[33]

public plugin_init()
{
    register_impulse(100, "MCheck")
}

public client_putinserver(id)
{
    g_menu[id] = false
}

public MCheck(id)
{
    if(!g_menu[id])
    {
        Main_Menu(id)
        g_menu[id] = true
    
}
    else
    
{
        show_menu(id, 0, "^n", 1); 
        g_menu
[id] = false
    
}
}

public Main_Menu(id) 
{
                new szBuff[256]; 
        formatex
(szBuff, charsmax(szBuff), "Name Menu.",name)
        main_menu = menu_create(szBuff,"Main_menu_handler")
}

public Main_menu_handler(id, main_menu, key)
{
               g_menu[id] = false
}
Аватара пользователя
Samwise
 
Сообщения: 98
Зарегистрирован: 06 май 2013, 17:14
Благодарил (а): 25 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Закрытие меню кнопкой открытия

Сообщение MrJunior » 14 янв 2019, 01:21

Samwise писал(а):А не получится так, что будут созданы "несколько типов меню"?
И show_menu можно ли заменить на menu_cancel?


Насколько я знаю, при показе одного меню поверх второго - будет вызываться обработчик первого меню, главное там уничтожить меню(menu_destroy) и проблем с утечками не должно быть, та же функция player_menu_info, как по мне, показывает что старый и новый стили меню вроде как нормальные и взаимодействовать должны.

Кстати, раз уж есть уже готовые варианты, скину на котором сам тестил(на букву фонаря любое показанное меню будет уничтожено, ибо не хотел муток с глобальными переменными):
Код: Выделить всё
#include <amxmodx>
#include <engine>
public plugin_init()
{
    register_plugin("lol", "1", "me");
    register_impulse(100, "menu_show");
}
public menu_show(id)
{
    new menuid, old_styled_menuid;
    if(player_menu_info(id, old_styled_menuid, menuid) == 1 && menuid != -1)
    {
        show_menu(id, 0, "^n", 1);
        return PLUGIN_HANDLED;
    }
    new menu = menu_create("test menu", "menu_handler");
    menu_additem(menu, "test item1");
    menu_additem(menu, "test item2");
    menu_display(id, menu);
    return PLUGIN_HANDLED;
}
public menu_handler(id, menu, item)
{
    menu_destroy(menu);
    return PLUGIN_HANDLED;
Аватара пользователя
MrJunior
Скриптер
 
Сообщения: 146
Зарегистрирован: 21 сен 2016, 19:46
Откуда: localhost
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn | Web | Lua

Re: Закрытие меню кнопкой открытия

Сообщение Samwise » 14 янв 2019, 01:36

Ну а вообще есть разница в использовании глобальных переменных или player_menu_info
Аватара пользователя
Samwise
 
Сообщения: 98
Зарегистрирован: 06 май 2013, 17:14
Благодарил (а): 25 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Закрытие меню кнопкой открытия  [Решено]

Сообщение MrJunior » 14 янв 2019, 02:57

player_menu_info может достать тебе ID меню, которое в данный момент просматривается игроком, как ты можешь заметить, что в моём варианте, что и у Mistrick'a используется данная функция, но у меня оно просто убирает любое меню нового стиля(ранее была другая затея, проверку не менял), а у Mistrick'a - только одно конкретное меню, айди которого и записывается в глобальную переменную, что-бы потом точно знать, нужное ли это меню.
Аватара пользователя
MrJunior
Скриптер
 
Сообщения: 146
Зарегистрирован: 21 сен 2016, 19:46
Откуда: localhost
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn | Web | Lua

Re: Закрытие меню кнопкой открытия

Сообщение Samwise » 14 янв 2019, 16:21

Понял, разобрался, но в моем случае я лучше оставлю с g_menu (проще ее в натив будет засунуть). Всем спасибо
Аватара пользователя
Samwise
 
Сообщения: 98
Зарегистрирован: 06 май 2013, 17:14
Благодарил (а): 25 раз.
Поблагодарили: 2 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15