Авто открытие меню в начале раунда

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
120
Реакции
1
Здравствуйте, Подскажите как сделать авто открытие меню в начале раунда начиная со 2 раунда, пытался сделать не получилось
 

Вложения

Сообщения
1,082
Реакции
58
Помог
11 раз(а)
iaws,
Код:
#include <amxmodx>
#include <hamsandwich>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "deprkid"

new gl_round;

public plugin_init()  {
       register_plugin(PLUGIN, VERSION, AUTHOR);
       register_event("HLTV", "EventStartRound", "a", "1=0", "2=0");
       register_event("TextMsg", "EventRestartRound", "a", "2=#Game_will_restart_in","2=#Game_Commencing");
       register_clcmd("sraundeweap", "cmdMenu", ADMIN_ALL);

       RegisterHam(Ham_Spawn,"player","player_respawn")
}

public EventRestartRound()
       gl_round = 0;

public EventStartRound()
       ++gl_round;

public player_respawn(id) {
       if(gl_round >= 2)
             client_cmd(id, "vipmenu");
}

public cmdMenu(id) {
       new i_Menu = menu_create("Оружия", "menu_handler");
       menu_additem(i_Menu, "L-VIP", "1", 0);
       menu_setprop(i_Menu, MPROP_NEXTNAME, "Далее");
       menu_setprop(i_Menu, MPROP_BACKNAME, "Назад");
       menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");

       menu_display(id, i_Menu, 0)
}

public menu_handler(id, menu, item) {
       menu_destroy(menu);

       if( item < 0 )  return PLUGIN_CONTINUE;

       new cmd[3], access, callback;
       menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
       new Choise = str_to_num(cmd)
       switch (Choise) {
             case 1: {
             }
       }

       return PLUGIN_HANDLED;
}
И не забывайте уничтожать меню в обработчике с помощью функции menu_destroy(index), а то будет утечка памяти
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
iaws, и пора уже с reapi начинать работать
Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "deprkid"

new gl_round;

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

    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound");
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", 1);
    register_clcmd("sraundeweap", "cmdMenu", ADMIN_ALL);
}

public CSGameRules_RestartRound()
    gl_round = get_member_game(m_bCompleteReset) ? 0 : gl_round +1;

public CBasePlayer_Spawn(id) {
    if(gl_round >= 2)
        client_cmd(id, "vipmenu");
}

public cmdMenu(id) {
    if(!is_user_alive(id))
        return;

    new i_Menu = menu_create("Оружия", "menu_handler");

    menu_additem(i_Menu, "L-VIP", "1", 0);
    menu_setprop(i_Menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(i_Menu, MPROP_BACKNAME, "Назад");
    menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");

    menu_display(id, i_Menu, 0)
}

public menu_handler(id, menu, item) {
    menu_destroy(menu);

    if(is_user_connected(id) && item != MENU_EXIT) {
        switch(item) {
            case 0: {

            }
        }
    }
}
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Code_0xABC, раз уж используешь реапи, то используй мембер m_iTotalRoundsPlayed, и не нужно будет каждый раз раунд плюсовать.

И толк указывать ADMIN_ALL?

Плюс, если не ошибаюсь, в menu_additem 3 параметр не нужен тут, ты указал "1", в таком случае, тебе бв пришлось получать дату через menu_item_getinfo, и потом уже получать нажатую кнопку.

C++:
#include <amxmodx>
#include <reapi>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "deprkid"

#define GetRoundNum() (get_member_game(m_iTotalRoundsPlayed) + 1)

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", 1);
    register_clcmd("sraundeweap", "cmdMenu");
}

public CBasePlayer_Spawn(id) {
    if(GetRoundNum() >= 2)
        cmdMenu(id);
}

public cmdMenu(id) {
    if(!is_user_alive(id))
        return PLUGIN_HANDLED;

    new i_Menu = menu_create("Оружия", "menu_handler");

    menu_additem(i_Menu, "L-VIP");

    menu_setprop(i_Menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(i_Menu, MPROP_BACKNAME, "Назад");
    menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");

    menu_display(id, i_Menu, 0);
    return PLUGIN_HANDLED;
}

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

    switch(item) {
        case 0: {

        }
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}
 
Последнее редактирование:
Сообщения
893
Реакции
149
Помог
25 раз(а)
Nordic Warrior, а разве достаточно просто указать? Не нужно ли использовать тот-же cmd_access из amxmisc? Или банальную проверку на флаг в таком случае? У него этого нету, да и ADMIN_ALL даёт всем доступ, что по умолчанию стоит. Или я путаю?
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
@ImmortalAmxx, про раунд согласен, так правильнее, на счет остального:
1.В menu_additem 3 параметр передовал автор тз (вопрос не по адресу), может он в дальнейшем что-то с ним еще сделает!
2.return PLUGIN_HANDLED вместо teturn, для чего эти исправления?
3. ADMIN_ALL - дали ссылку1
4.В обработчике меню достаточно в начале написать menu_destroy(menu); и не забывай про проверку на connected, всякое бывает!!!
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Code_0xABC, 1. В таком случае, твой код не работал бы. Так как 3 параметр это дата, и если он указан, то его нужно получать через menu_item_getinfo, как это сделано в исходном коде, который приложил автор.
2. Избавляет от сообщения об неизвестной команде в консоль.
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
1. Обрати внимание на синтаксис menu_additem, ставь не ставь, в любом случае передаст info[]="", код сработает
2. Если он все сделает в обработчике, тогда есть смысл от return PLUGIN_HANDLED, а если он захочет воспользоваться плагином ниже, ну например открыть иное меню. То в итоге его пункт не сработает, что бы поставить правильно решение, надо ждать финальной версии
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Code_0xABC, По поводу 3, мои догадки были верны.
Если просто указать флаг - ничего не будет, нужно проверку делать. Да и опять же, ADMIN_ALL - доступ всем, он и так будет по умолчанию. Это не придирка к тебе или еще чего, просто как факт.

C++:
#define NeedFlag ADMIN_ALL

register_clcmd("sraundeweap", "cmdMenu", NeedFlags);

public cmdMenu(id, Flag) {
    if(!is_user_alive(id))
        return PLUGIN_HANDLED;

    if(~get_user_flags(id) & Flag)
        return PLUGIN_HANDLED;
       
    // выполняем код

    return PLUGIN_HANDLED;
}
В таком случае, это уже имеет место быть, и в дальнейшем автор сам может указать нужный ему флаг.

И вопрос к автору поста. Тебе нужно, что бы меню само открывалось со 2 раунда, или по открытии через команду тоже нужна проверка на раунд?
9 Ноя 2023
Code_0xABC, По поводу 1, да, действительно, тут ошибся.
По поводу 2 тоже мой косяк, не совсем правильно сделал.
Логичнее было бы так:
C++:
#include <amxmodx>
#include <reapi>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "deprkid"

#define GetRoundNum() (get_member_game(m_iTotalRoundsPlayed) + 1)

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", 1);
    register_clcmd("sraundeweap", "cmdMenu");
}

public CBasePlayer_Spawn(id) {
    if(GetRoundNum() >= 2)
        ShowUserMenu(id);
}

public cmdMenu(id) {
    if(!is_user_alive(id))
        return PLUGIN_HANDLED;

    ShowUserMenu(id);
    return PLUGIN_HANDLED;
}

public ShowUserMenu(Id) {
    new i_Menu = menu_create("Оружия", "menu_handler");

    menu_additem(i_Menu, "L-VIP");

    menu_setprop(i_Menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(i_Menu, MPROP_BACKNAME, "Назад");
    menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");

    menu_display(id, i_Menu, 0);
}

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

    switch(item) {
        case 0: {

        }
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
3. А чем плохо указать в register_clcmd флаг единажды, чем какждый спавне проверять на флаг, один вариант если на карте будет менять флаг
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Code_0xABC, В данном случае я привел пример, не обзятельно эту часть кода в спавн выводить. Я продемонстрировал, как работает 3 аргумент (флаг) в register_clcmd, и то, что если просто его указать - никакого результата не будет. Можешь сам зарегистрировать команду с флагом, не проверяя при этом на флаг, и посмотришь, что результата не даст.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Nordic Warrior, а разве достаточно просто указать? Не нужно ли использовать тот-же cmd_access из amxmisc? Или банальную проверку на флаг в таком случае? У него этого нету, да и ADMIN_ALL даёт всем доступ, что по умолчанию стоит. Или я путаю?
Дело совсем не в этом. Команды с доступом -1 не могут быть найдены из другого плагина через get_clcmd.
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Code_0xABC, нордик уже объяснил мне выше, я изначально думал, что автор хочет использовать это в дальнейшем как проверку на доступ, по этому и написал всё сказаное мною выше.
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
ImmortalAmxx, по его коду, я бы еще сделал меню глобальным. Смысл его создавать, если ничего не меняется
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Код:
#include <amxmodx>
#include <reapi>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "deprkid"

#define GetRoundNum() (get_member_game(m_iTotalRoundsPlayed) + 1)

new gl_menu;

const round = 2; //с какого раунда
#define FLAGS ADMIN_LEVEL_H // флаг доступа к меню

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);
 
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", 1);
    register_clcmd("sraundeweap", "cmdMenu", FLAGS);
 
    create_menu();
}

public CBasePlayer_Spawn(id) {
    if(GetRoundNum() >= round)
        cmdMenu(id);
}

public cmdMenu(id) {
    if(is_user_alive(id))
        menu_display(id, gl_menu);
}

create_menu() {
    gl_menu = menu_create("Оружия", "menu_handler");

    menu_additem(gl_menu, "Оружие 1");

    menu_setprop(gl_menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(gl_menu, MPROP_BACKNAME, "Назад");
    menu_setprop(gl_menu, MPROP_EXITNAME, "Выход");
}

public menu_handler(id, menu, item) {
    if(!is_user_alive(id) || item == MENU_EXIT)
        return PLUGIN_HANDLED;

    switch(item) {
        case 0: {

        }
    }

    return PLUGIN_HANDLED;
}
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.

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

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