Grab Menu: Weapon

Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Пытался переделать Grab Menu: Kick, чтобы открывалось еще одно меню и можно было выдать оружие тому, кого держишь.
Пункт в меню добавляется,

Срабатывает функция client_print_color(0, iEntity, "%l", "GRAB_MENU_WEAPON_MSG", id, iEntity);

Но меню следующее не открывает. Скорее всего, меню граба переоткрывается и поэтому мое меню не открывает.

Как реализовать правильно данный алгоритм?
Также, вопрос, как передать iEntity в handler меню? Верно ли я его передаю в данном случае?
Или можно не присваивать переменной pTarget значение iEntity и сразу в handler?

Код:
#include <amxmodx>
#include <reapi>
#include <grab_menu>

new const PLUGIN_NAME[] = "Grab Menu: Weapon";
new const PLUGIN_VERSION[] = "1.0.0";
new const PLUGIN_AUTHOR[] = "w0w";

/****************************************************************************************
****************************************************************************************/

new g_iItemId;

enum _:Cvars
{
    CVAR_TARGET_TEAM,
    CVAR_ACCESS
};

new g_pCvar[Cvars];

public plugin_init()
{
    register_plugin(
        .plugin_name = PLUGIN_NAME,
        .version = PLUGIN_VERSION,
        .author = PLUGIN_AUTHOR
    );

    register_dictionary("grab_menu_weapon.txt");

    func_RegisterCvars();
}

func_RegisterCvars()
{
    g_pCvar[CVAR_TARGET_TEAM] = create_cvar("grab_menu_kick_target_team", "a", FCVAR_NONE, fmt("%L", LANG_SERVER, "GRAB_MENU_SKIN_CVAR_TARGET_TEAM"));
    g_pCvar[CVAR_ACCESS] = create_cvar("grab_menu_weapon_access", "s", FCVAR_NONE, fmt("%L", LANG_SERVER, "GRAB_MENU_KICK_CVAR_ACCESS"));

    AutoExecConfig(true, "grab_menu_weapon", "grab_modular/grab_menu");
}

public OnConfigsExecuted()
{
    new szTargetTeam[4];
    get_pcvar_string(g_pCvar[CVAR_TARGET_TEAM], szTargetTeam, charsmax(szTargetTeam));

    new szAccess[32];
    get_pcvar_string(g_pCvar[CVAR_ACCESS], szAccess, charsmax(szAccess));

    g_iItemId = grab_menu_add_item(
        .name = fmt("%L", LANG_SERVER, "GRAB_MENU_WEAPON"),
        .key = "weapon",
        .target_team = GrabItemTeam:read_flags(szTargetTeam),
        .access = read_flags(szAccess)
    );
}

public grab_menu_item_selected(id, iEntity, iItem)
{
    if(iItem != g_iItemId)
        return;
    
    client_print_color(0, iEntity, "%l", "GRAB_MENU_WEAPON_MSG", id, iEntity);
    
    MainMenu2(id, iEntity)
}

public MainMenu2(id, iEntity)
{
    new pTarget = iEntity
    
    new szTitle[512]
    new szItem[512]

    formatex(szTitle, charsmax( szTitle ), "\yКакое оружие выдать?")
    new iMenu = menu_create(szTitle, "MainMenu_handler2" )

    formatex(szItem, charsmax( szItem ), "AK-47")
    menu_additem(iMenu, szItem, "1", 0)

    formatex(szItem, charsmax( szItem ), "M4A1")
    menu_additem(iMenu, szItem, "2", 0)
        
    menu_addblank(iMenu, 1)
    menu_addblank(iMenu, 1)
    menu_addblank(iMenu, 1)
    menu_addblank(iMenu, 1)
    menu_addblank(iMenu, 1)
    menu_addblank(iMenu, 1)
    
    formatex(szItem, charsmax( szItem ), "Назад")
    menu_additem(iMenu, szItem, "9", 0)
    
    formatex(szItem, charsmax( szItem ), "Выход")
    menu_additem(iMenu, szItem, "0", 0)
    
    menu_setprop(iMenu, MPROP_NUMBER_COLOR, "\y")
    
    menu_setprop(iMenu, MEXIT_ALL, 0)
    menu_display(id, iMenu, 0, pTarget)

    return PLUGIN_HANDLED
}

public MainMenu_handler2(id, iMenu, iItem, pTarget)
{
    if(iItem == MENU_EXIT)
    {
        menu_destroy( iMenu )
        return PLUGIN_HANDLED
    }

    new szData[6], szName[64], iAccess, iCallback
    menu_item_getinfo(iMenu, iItem, iAccess, szData, charsmax( szData ), szName, charsmax( szName ), iCallback)

    new iKey = str_to_num( szData )

    switch( iKey )
    {
        case 1:
        {
            //
        }

        case 2:
        {
            //
        }

        case 9:
        {
            //
        }
    }

    menu_destroy( iMenu )
    return PLUGIN_HANDLED
}
3 Авг 2020
: закрывать меню если открыто другое. 0 - выкл; 1 - вкл.
Установлено значение 1
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
fantom, If >=0 menu will timeout after this many seconds

Лучший способ - создать новую глобальную переменную new g_iTarget и в grab_menu_item_selected приравнивать g_iTarget = iEntity и уже использовать ее в дальнейшем?! Я к чему, а может быть такое, что индекс потеряется в данном случае или сменится?
4 Авг 2020
Сделал, как написал выше - не помогло. Все также переоткрывается меню с грабом.
После выбора игрока вызываю функцию menu_cancel(id) и пытаюсь открыть свое - открывается меню граба все равно.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Конечно, я мог бы сделать по аналогии без дополнительного меню и добавлять каждое оружие под каждый пункт, но это не самый подходящий вариант. Подскажите, как реализовать мой вариант? Меню граба не дает открыться другому меню.
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA, Потому что в основном меню автоматом вызывает само себя
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BiZaJe, grab_menu_core_close закрывать меню если открыто другое. 0 - выкл; 1 - вкл.
Стоит 1
Меню граба открывается даже если открыто при этом другое.
5 Авг 2020
BiZaJe, я вижу, что оно автоматически открывается и я об этом уже третий раз пишу. Мне как обойти это?
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA, удалить строчку
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA, Окей.

Код:
public func_GrabMenu_Handler(id, iKey)
{
    switch(iKey)
    {
        case 8:
        {
            func_GrabMenu(id, ++g_iMenuPosition[id]);
        }
        case 9:
        {
            func_GrabMenu(id, --g_iMenuPosition[id]);
        }
        default:
        {
            new iSelectedItem = (g_iMenuPosition[id] * ITEMS_PER_PAGE) + iKey;
            new iItemInArray = ArrayGetCell(g_aPlayerMenuItems[id], iSelectedItem);

            new iEntity = is_player_grabbing(id);

            new iResult;
            ExecuteForward(g_iForward[FORWARD_MENU_ITEM_SELECTED], iResult, id, iEntity, iItemInArray);

            if(iResult >= PLUGIN_HANDLED)
                return;

            if(!is_user_alive(iEntity))
                return;

            func_GrabMenu(id, g_iMenuPosition[id]);
        }
    }
}
5 Авг 2020
CLUQA, Ищи сам дальше, и научись разбираться прежде чем браться.
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BiZaJe, а где речь про удаление строки? И что это дало, что вы убрали +1 к iItemInArray? Результат останется таким же и меню переоткроется))

@CLUQA, Ищи сам дальше, и научись разбираться прежде чем браться.
А разве это не сообщество с нужным разделом, где людям помогают разобраться?
И оставьте свой негатив при себе, отвечая в этой или иной теме.
Разве, я прошу, чтобы сделали за меня? Этого нет)
С вашей подачей можете листать дальше)
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA,
func_GrabMenu(id, g_iMenuPosition[id]);
Никакого негатива, наталкиваю на то, чтобы по скинутому научились решать проблему и т.д
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BiZaJe, +1 зачем убрали
ExecuteForward(g_iForward[FORWARD_MENU_ITEM_SELECTED], iResult, id, iEntity, iItemInArray);
?

В вашем варианте тогда меню не будет открываться заново, если я выберу кикнуть игрока.
Мне нужно именно для моего пункта чтобы меню не переоткрывалось.
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA, Где вы увидели инкремент в строке которую я скинул?
 
Сообщения
136
Реакции
-6
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BiZaJe, https://dev-cs.ru/resources/870/

387 строчка. Посмотрите, что там и что у вас.

Код:
ExecuteForward(g_iForward[FORWARD_MENU_ITEM_SELECTED], iResult, id, iEntity, iItemInArray + 1);
P.S. проблему решил путем подобного условия, если кому пригодится, но не уверен, что это самый правильный вариант, но у меня все работает)

Код:
if(iItemInArray != 1) {
    func_GrabMenu(id, g_iMenuPosition[id]);
}
 
Сообщения
1,055
Реакции
212
Предупреждения
9
Помог
6 раз(а)
CLUQA,
Код:
ExecuteForward(g_iForward[FORWARD_MENU_ITEM_SELECTED], iResult, id, iEntity, iItemInArray);
387 строка, исходник не качаю т.к он мне не интересен. Никакого инкремента вовсе и нет и не имеет отношение к функции повторного вызова принудительно.
И ваша строка это вообще вызов форвада.
А так молодец решил свою проблему.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу