• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь Как сохранить выбор из меню на карту

pollfank

Участник
Сообщения
167
Решения
1
Реакции
32
Баллы
28
Всем доброго времени суток.
Кто может подсказать, как правильно сделать сохранение выбора пункта меню, чтобы не надо было постоянно выбирать его.

Код:
#include <amxmodx>

#define PLUGIN "Menu"
#define VERSION "1.0"
#define AUTHOR "Teams"

#define vip_flag ADMIN_LEVEL_H

public plugin_init() {

       register_clcmd("say /test", "cmdMenu");
       register_plugin(PLUGIN, VERSION, AUTHOR);
}

public cmdMenu(id) {
       new i_Menu = menu_create("\rТЕСТ МЕНЮ", "menu_handler");

       menu_additem(i_Menu, "\yПункт-1", "1", 0);
      
       if( get_user_flags(id) & vip_flag ){
           menu_additem(i_Menu, "\yПункт-2", "2", 0);
           menu_additem(i_Menu, "\yПункт-3", "3", 0);
           menu_additem(i_Menu, "\yПункт-4", "4", 0);
           menu_additem(i_Menu, "\yПункт-5", "5", 0);
           }else{
           menu_addblank(i_Menu, 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)
      
       return PLUGIN_HANDLED;
}

public menu_handler(id, menu, item) {
       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: {client_cmd(id, "say test_cmd1")
       }
       case 2: {client_cmd(id, "say test_cmd2")
       }
       case 3: {client_cmd(id, "say test_cmd3")
       }
       case 4: {client_cmd(id, "say test_cmd4")
       }
       case 5: {client_cmd(id, "say test_cmd5")
       }
       }
       return PLUGIN_HANDLED;
}
 
pollfank, Создать переменную
C++:
new g_player_choose[33]
. После выбора пункта записать его
C++:
g_player_choose[id] = Choise
 
pollfank, Создать переменную
C++:
new g_player_choose[33]
. После выбора пункта записать его
C++:
g_player_choose[id] = Choise

Вы имеете ввиду так
Код:
public menu_handler(id, menu, item) {
       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: {client_cmd(id, "say test_cmd1")
       g_player_choose[id] = Choise;
       }
       case 2: {client_cmd(id, "say test_cmd2")
       g_player_choose[id] = Choise;
       }
       case 3: {client_cmd(id, "say test_cmd3")
       }
       case 4: {client_cmd(id, "say test_cmd4")
       }
       case 5: {client_cmd(id, "say test_cmd5")
       }
       }
       return PLUGIN_HANDLED;
}
 
C++:
 new Choise = str_to_num(cmd)
 g_player_choose[id] = Choise;
 
 switch (Choise) {
pollfank,
 
zhorzh78, хорошо, получилось так
Код:
#include <amxmodx>

#define PLUGIN "Menu"
#define VERSION "1.0"
#define AUTHOR "Teams"

#define vip_flag ADMIN_LEVEL_H

new g_player_choose[33];

public plugin_init() {

       register_clcmd("say /test", "cmdMenu");
       register_plugin(PLUGIN, VERSION, AUTHOR);
}

public cmdMenu(id) {
       new i_Menu = menu_create("\rТЕСТ МЕНЮ", "menu_handler");

       menu_additem(i_Menu, "\yПункт-1", "1", 0);
      
       if( get_user_flags(id) & vip_flag ){
           menu_additem(i_Menu, "\yПункт-2", "2", 0);
           menu_additem(i_Menu, "\yПункт-3", "3", 0);
           menu_additem(i_Menu, "\yПункт-4", "4", 0);
           menu_additem(i_Menu, "\yПункт-5", "5", 0);
           }else{
           menu_addblank(i_Menu, 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)
      
       return PLUGIN_HANDLED;
}

public menu_handler(id, menu, item) {
       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)
       g_player_choose[id] = Choise;
       switch (Choise) {
       case 1: {client_cmd(id, "say test_cmd1")
       }
       case 2: {client_cmd(id, "say test_cmd2")
       }
       case 3: {client_cmd(id, "say test_cmd3")
       }
       case 4: {client_cmd(id, "say test_cmd4")
       }
       case 5: {client_cmd(id, "say test_cmd5")
       }
       }
       return PLUGIN_HANDLED;
}

Но мне кажется что переменную g_player_choose[id] надо еще где то записать, например при спавне или нет. Так как так не работает.
 
pollfank, Не сразу вник в название темы) На карту такое сохранение не пойдет. Используйте TrieSetCell / TrieGetCell


Добавлено:

pollfank, И в вашем коде не вижу применения сохраненного варианта.
 
Как поступил я. Взял часть кода с Ideal VIP. Все работет.
Вопрос что здесь лишнее и как упростить.

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

#define PLUGIN "Menu"
#define VERSION "1.0"
#define AUTHOR "Teams"

#define vip_flag ADMIN_LEVEL_H

new g_iWeapon[33];
new bool: g_Chosen[33] = false;

public plugin_init() {

       register_clcmd("say /test", "cmdMenu");
       register_plugin(PLUGIN, VERSION, AUTHOR);
       RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);
}

public cmdMenu(id) {
       new i_Menu = menu_create("\rТЕСТ МЕНЮ", "menu_handler");

       menu_additem(i_Menu, "\yПункт-1", "1", 0);
      
       if( get_user_flags(id) & vip_flag ){
           menu_additem(i_Menu, "\yПункт-2", "2", 0);
           menu_additem(i_Menu, "\yПункт-3", "3", 0);
           menu_additem(i_Menu, "\yПункт-4", "4", 0);
           menu_additem(i_Menu, "\yПункт-5", "5", 0);
           }else{
           menu_addblank(i_Menu, 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)
      
       return PLUGIN_HANDLED;
}

public client_putinserver(id){
    g_iWeapon[id] = 0;
}

public client_disconnected(id){
    g_iWeapon[id] = 0;
    g_Chosen[id] = false;
}

public CBasePlayer_Spawn(const id){
    task_funk(id);
}

public task_funk(id){
    GiveDefaultItems( id, g_iWeapon[id], .itask = 0);
}

GiveDefaultItems( id, primary_weapon, itask = 1 ) {
    if( itask ) task_funk(id);
    switch( primary_weapon ) {
        case 0: {
            cmdMenu(id);
        }
        case 1: {client_cmd(id, "say test_cmd1")
        }
        case 2: {client_cmd(id, "say test_cmd1")
        }
        case 3: {client_cmd(id, "say test_cmd2")
        }
        case 4: {client_cmd(id, "say test_cmd3")
        }
        case 5: {client_cmd(id, "say test_cmd4")
        }
    }
}

public menu_handler(id, menu, item) {
       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)
       g_Chosen[id] = true;
       g_iWeapon[id] = Choise;
       switch (Choise) {
       case 1: {client_cmd(id, "say test_cmd1")
       }
       case 2: {client_cmd(id, "say test_cmd2")
       }
       case 3: {client_cmd(id, "say test_cmd3")
       }
       case 4: {client_cmd(id, "say test_cmd4")
       }
       case 5: {client_cmd(id, "say test_cmd5")
       }
       }
       return PLUGIN_HANDLED;
}
 
pollfank, это сохранения до выхода с сервера, а не на карту.
 
zhorzh78, если при заходе на сервер меню автоматически будет открываться первый раз, тогда уже не важно на карту или до выхода с сервера.
Не учел этот момент).
 
Назад
Сверху