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

Сообщения
143
Реакции
68
Помог
1 раз(а)
Всем доброго времени суток.
Кто может подсказать, как правильно сделать сохранение выбора пункта меню, чтобы не надо было постоянно выбирать его.

Код:
#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;
}
 
Сообщения
3,585
Реакции
1,573
Помог
138 раз(а)
roten, добавить массив для игроков [33], записывать в него индивидуально выбранный пункт меню, потом сверять.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Nordic Warrior, и зайдет какой-то другой игрок с таким же uid и будет наследовать сохраненные данные.
18 Май 2020
roten, array, trie, nvault. Вариантов хватает.
 
Сообщения
3,585
Реакции
1,573
Помог
138 раз(а)
Minni, каким образом?) очистку массива в disconnected никто не отменял.
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Nordic Warrior, так а где тогда "сохранение на карту"? В чем тогда смысл юзать массивчик?)
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Можно взять на примере с плагина Ideal VIP.
Выглядеть будет так

Код:
#include <amxmodx>

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

#define vip_flag ADMIN_LEVEL_H

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

public plugin_init() {

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

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

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

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_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;
}
Вопрос как дальше... Какая то проверка на спавне мб...
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
и зайдет какой-то другой игрок с таким же uid и будет наследовать сохраненные данные
Это такая невыполнимая задача? Обнуляй массив с айдишником при дисконнекте. В принципе, можно и array c trie потянуть, согласен
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
roten, без понимания конечной цели споры будут продолжиться. Вы озвучьте что хотите сделать в итоге
 

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Minni, ого какой внимательный. roten, ты сначала объясни, что с собой этот плагин будет представлять и для чего тебе нужно сохранение пункта меню? Ты через это меню выдавать випам, я так понимаю, что-то будешь? А то тут концепт какой-то вижу
 
Сообщения
3,585
Реакции
1,573
Помог
138 раз(а)
Nordic Warrior, так а где тогда "сохранение на карту"? В чем тогда смысл юзать массивчик?)
Не вижу "сохранение на карту"
Всем доброго времени суток.
Кто может подсказать, как правильно сделать сохранение выбора пункта меню, чтобы не надо было постоянно выбирать его.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Nordic Warrior, в заголовке.

Trie хватит, по auth id, тем более там хэш таблица с O(1), если кого-то волнует скорость.
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Все просто. Будет меню оружия.
Вот накинул на быструю руку простенький пример cmd выдачи оружий

Код:
case 1:
            {
                if(money < 500)
                    {
                        client_print_color(id, print_team_default, "^1[^4Info^1] У тебе недостатньо грошей");
                        return PLUGIN_CONTINUE
                    }else{
                        rg_add_account(id, get_member(id, m_iAccount) - 500, AS_SET)
                        rg_give_item(id, "weapon_m4a1", GT_REPLACE);
                        rg_set_user_bpammo(id, WEAPON_M4A1, 90);
                    }
                }
            case 2:
            {
                if(money < 450)
                    {
                        client_print_color(id, print_team_default, "^1[^4Info^1] У тебе недостатньо грошей");
                        return PLUGIN_CONTINUE
                    }else{
                        rg_add_account(id, get_member(id, m_iAccount) - 450, AS_SET)
                        rg_give_item(id, "weapon_ak47", GT_REPLACE);
                        rg_set_user_bpammo(id, WEAPON_AK47, 90);
                }
            }
            case 3:
            {
                if(money < 650)
                    {
                        client_print_color(id, print_team_default, "^1[^4Info^1] У тебе недостатньо грошей");
                        return PLUGIN_CONTINUE
                    }else{
                        rg_add_account(id, get_member(id, m_iAccount) - 650, AS_SET)
                        rg_give_item(id, "weapon_deagle", GT_REPLACE);
                        rg_set_user_bpammo(id, WEAPON_DEAGLE, 35);
                }
            }
Грубо говоря. Человек раз выбрал пункт, пункт автоматически запомнился, и на респавне выполняется команда которая отвечает етому пункту. Пока снова не будет другой выбор. Вот для чего.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Код:
#pragma semicolon 1

#include <amxmodx>

new Trie:g_tDataAtMap;

new g_iChoose[MAX_PLAYERS + 1];

public plugin_init()
{
    g_tDataAtMap = TrieCreate();
}

public plugin_end()
{
    TrieDestroy(g_tDataAtMap);
}

public client_authorized(id, const authId[])
{
    new value;
    TrieGetCell(g_tDataAtMap, authId, value);

    g_iChoose[id] = value;
}

public client_disconnected(id)
{
    new authId[MAX_AUTHID_LENGTH];
    get_user_authid(id, authId, charsmax(authId));

    TrieSetCell(g_tDataAtMap, authId, g_iChoose[id]);
}
Чекни.
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
fl0wer,
Код:
#include <amxmodx>

#pragma semicolon 1

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

#define vip_flag ADMIN_LEVEL_H

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

new Trie:g_tDataAtMap;

new g_iChoose[MAX_PLAYERS + 1];

public plugin_init() {

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

public plugin_end()
{
    TrieDestroy(g_tDataAtMap);
}

public client_authorized(id, const authId[])
{
    new value;
    TrieGetCell(g_tDataAtMap, authId, value);

    g_iChoose[id] = value;
}

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

public client_disconnected(id){
    new authId[MAX_AUTHID_LENGTH];
    get_user_authid(id, authId, charsmax(authId));

    TrieSetCell(g_tDataAtMap, authId, g_iChoose[id])
    g_iWeapon[id] = 0;
    g_Chosen[id] = false;
}

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_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;
}
Если так то не работает. Может я допустил ошибку.
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Всё ясно, играем с нубами.

Полагаю g_iWeapon и есть мой g_iChoose.

client_putinserver не нужен.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Грубо говоря. Человек раз выбрал пункт, пункт автоматически запомнился, и на респавне выполняется команда которая отвечает етому пункту. Пока снова не будет другой выбор. Вот для чего.
Любое из ксдм меню имеет подобный функционал
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Вот как я сделал. Я взял часть кода с плагина 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;
}
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
roten, у тебя на карту не сохраняется.
 

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

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