Отображения пункта в меню

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
76
Реакции
3
Помог
1 раз(а)
Народ подскажите как можно скрыть пункт из меню, если нету прав доступа, Не просто запретить, а чтобы его не было видно в той меню, пока пользователь не получит права.

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

new keys_vip_menu = MENU_KEY_1|MENU_KEY_0

public plugin_init()
{
    register_plugin("Menus VIP", AMXX_VERSION_STR, "Bitter")
    register_menu("vip_menu", keys_vip_menu, "vip_open1CMD")
    register_clcmd("san", "menu_vip_open")
}

public menu_vip_open(id)
{
    static menu[650], iLen = 0;
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1.\w Меню ВИП ^n")
    iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0.\w Выход :)")
    return show_menu(id, keys_vip_menu, menu, -1, "vip_menu")
}

public vip_open1CMD(id, key)
{
    switch(key)
    {
        case 0: client_cmd(id, "VIP")
    }
    return PLUGIN_HANDLED
}
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
SanSannech, пункт из меню воткни в условие проверки на флаг и все дела
 
Сообщения
76
Реакции
3
Помог
1 раз(а)
@maFFyoZZyk,так что ли
Код:
    if(get_user_flags(id) & ADMIN_LEVEL_H) {
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1.\w Меню ВИП ^n")
    }else{
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\d1.\w Меню ВИП ^n")
    }
Или так
Код:
    if(get_user_flags(id) & ADMIN_LEVEL_H) {
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1.\w Меню ВИП ^n")
    }
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
SanSannech, В первом случае будет отображаться пункт но с другим цветом номера в зависимости от наличия флага.
Во втором случае будет отображаться отображаться пункт только при наличии ADMIN_LEVEL_H.
 
Сообщения
775
Реакции
293
Помог
11 раз(а)
Код:
    if(get_user_flags(id) & ADMIN_LEVEL_H) {
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1.\w 1 пункт ^n")
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2.\w 2 пункт ^n")
    }else{
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\d1.\w 2 пункт ^n")
    }
Если тебе нужно к примеру скрыть 1 пункт, если 2 так же по анологии
 
Сообщения
1,031
Реакции
827
Помог
10 раз(а)
Только потом в callback'е у тебя будут смещены клавиши, для каждого игрока должен быть свой массив с меню, вроде как
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, Слишком сложно, проще на необходимый пункт сделать проверку. Если не пройдёт - не будет пункта.
Javekson, Потому проверка должна быть и на клавишу.
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, Это исправляется правильным написанием меню, а не тяп-ляп.
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
maFFyoZZyk, Начнём с того что я никому ничем не обязан, особенно на этом форуме. А закончим тем, что ответ на основной вопрос уже дан. Или ты уже забыл что один вопрос = одна тема?
Более того, примеров меню на этом форуме полно, стоит лишь немного поискать. Если ты знаешь только один способ создания меню, то это печалит.
 
Сообщения
1,031
Реакции
827
Помог
10 раз(а)
Ну, как вариант для размышления, может перегнул

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

#pragma semicolon 1

#define ITEMS_PER_MENU_PAGE 8
#define MAX_ITEM_LENGTH 64

new const MENU_IDENT_STRING[ ] = "test_menu";

enum { KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0 }

enum { PAGE_1, PAGE_2, PAGE_3, PAGE_4, PAGE_5, PAGE_6, PAGE_7, PAGE_8, PAGE_9, PAGE_10 }

enum _: MENU_STRUCT
{
    MENU_ITEM_NAME[ MAX_ITEM_LENGTH ],
    MENU_ITEM_ACCESS
}

new const MENU[ ][ MENU_STRUCT ] =
{
    {    "Админ меню",    ADMIN_BAN,         },
    {    "Вип меню",        ADMIN_LEVEL_A,    },
    {    "Юзер меню",    ADMIN_IMMUNITY  }
};

new g_iMenuPage[ MAX_CLIENTS + 1 ];
new g_aMenuItems[ MAX_CLIENTS + 1 ][ sizeof( MENU ) ];

public plugin_init( )
{
    register_plugin( "Menu Test", "1.0.0", "Javekson" );
    
    register_menu_ex( MENU_IDENT_STRING, "callback_test_menu" );
    
    register_clcmd( "say /menu", "clcmd_show_test_menu" );
}

public clcmd_show_test_menu( const id )
{
    // Допустим проверки кому открыть меню и так далее
    
    show_test_menu( id );
}

show_test_menu( const id, const page = PAGE_1 )
{
    if( page == NULLENT )
    {
        return PLUGIN_CONTINUE;
    }
    
    new total = get_menu_items( id );
    
    new start = page * ITEMS_PER_MENU_PAGE;
    
    new end = min( start + ITEMS_PER_MENU_PAGE, total );
    
    new pages = max( 1, total / ITEMS_PER_MENU_PAGE + ( total % ITEMS_PER_MENU_PAGE ? 1 : 0 ) );
    
    new menu[ MAX_MENU_LENGTH ];
    new len = formatex( menu, charsmax( menu ), "\yМеню для теста \d( %i/%i )^n", page + 1, pages );
    
    new key, keys, item;
    
    while( start < end )
    {
        keys |= ( 1 << key );
        
        key++;
        
        item = g_aMenuItems[ id ][ start ];
        
        len += formatex( menu[ len ], charsmax( menu ) - len, "\y%d. \w%s^n", key, MENU[ item ][ MENU_ITEM_NAME ] );
        
        start++;
    }
    
    if( !key && !keys )
    {
        if( page != PAGE_1 )
        {
            show_test_menu( id, pages - 1 );
            
            return PLUGIN_CONTINUE;
        }
        
        len += formatex( menu[ len ], charsmax( menu ) - len, "\rНет подходящих данных^n" );
    }
    
    if( end < total )
    {
        keys |= MENU_KEY_0 | MENU_KEY_9;
        
        formatex( menu[ len ], charsmax( menu ) - len, "^n\y9. \wДалее^n\y0. \w%s", page ? "Назад" : "Выход" );
    }
    else
    {
        keys |= MENU_KEY_0;
        
        formatex( menu[ len ], charsmax( menu ) - len, "^n\y0. \w%s", page ? "Назад" : "Выход" );
    }
    
    show_menu_ex( id, keys, menu, page, MENU_IDENT_STRING );
    
    return PLUGIN_CONTINUE;
}

get_menu_items( const id )
{
    new size = sizeof( MENU );
    
    new flags = get_user_flags( id );
    
    new count, itemAccess;
    
    for( new i; i < size; i++ )
    {
        itemAccess = MENU[ i ][ MENU_ITEM_ACCESS ];
        
        if( !( itemAccess & flags ) )
        {
            continue;
        }
        
        g_aMenuItems[ id ][ count ] = i;
        
        count++;
    }
    
    return count;
}

public callback_test_menu( const id, const key )
{
    new page = g_iMenuPage[ id ];
    
    switch( key )
    {
        case KEY_9:
        {
            show_test_menu( id, page + 1 );
        }
        
        case KEY_0:
        {
            show_test_menu( id, page - 1 );
        }
        
        default:
        {
            new target = page * ITEMS_PER_MENU_PAGE + key;
            
            new item = g_aMenuItems[ id ][ target ];
            
            switch( item )
            {
                case KEY_1:
                {
                    client_print_color( 0, 0, "%s", MENU[ item ][ MENU_ITEM_NAME ] );
                }
                case KEY_2:
                {
                    client_print_color( 0, 0, "%s", MENU[ item ][ MENU_ITEM_NAME ] );
                }
                case KEY_3:
                {
                    client_print_color( 0, 0, "%s", MENU[ item ][ MENU_ITEM_NAME ] );
                }
            }
        }
    }
}

stock register_menu_ex( const title[ ], const callback[ ], const keys = 1023, const outside = 0 )
{
    new menuid = register_menuid( title, outside );
    
    register_menucmd( menuid, keys, callback );
    
    return menuid;
}

stock show_menu_ex( const id, const keys, const menu[ ], const page, const title[ ], const time = -1 )
{
    g_iMenuPage[ id ] = page;
    
    show_menu( id, keys, menu, time, title );
}
 
Последнее редактирование:
Сообщения
397
Реакции
221
Помог
13 раз(а)
SanSannech,

"Новый" стиль меню:
Код:
public Show__NewMenu(const id) {

new iMenu = menu_create("Тест меню","NewMenu__Handler");

if(get_user_flags(id) & read_flag("a")) {
     menu_additem(iMenu,"Пункт для админов","1");
}

menu_additem(iMenu,"Пункт","2");

if(is_user_connected(id)
     menu_display(id,iMenu);
else
     menu_destroy(iMenu);

return PLUGIN_HANDLED;
}

public Show__NewMenu(const id,const iMenu,const iItem) {
if(iItem == MENU_EXIT) 
     menu_destroy(iMenu);

new szData[64];
menu_item_getinfo(iMenu,iItem, .info = szData, .infolen = charsmax(szData));
menu_destroy(iMenu);

switch(str_to_num(szData)) {
     case 1: client_print(id,print_chat,"У вас есть флаг 'a'");
     case 2: client_print(id,print_chat,"Пункт");
}

return PLUGIN_HANDLED;
}
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Javekson, код какой-то нечитаемый из-за кучи отступов, не совсем оправдана такая реализация на старой системе. И реапи ради констант подключать такое. И вот это вот тоже страшно:
Код:
if( page == NULLENT )
Что-то вроде в чай добавить соль по ощущениям.
Уж лучше бы оставил магическое число.

b0t., зачем везде "const". Есть опасение об изменении значений переменных в функции?
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
bizon, а разница? Константа, потому что так привык. Сколько не тестил разницы нет
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
b0t., я понимаю, что разницы нет ощутимой.
Просто служебное слово "const" даёт компилятору понять, что память, выделенная под пресловутую переменную, не может быть изменена.
Не понимаю, какой практический смысл ты преследуешь, приписывая им const, только время компиляции увеличиваешь (и пофиг, что время будет совсем мизерным в данном случае). Просто это технически не совсем верно, если так можно выразиться.
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
bizon, ну в этом и суть... Я даю себе так же как и компилятору понять, что память данной переменной неизменна.
С какой-то стороны она и так будет не измена, судя по коду мы её вызываем для конкретного игрока, но я так привык записывать.Переменные где будет изменена память или её содержимое я соответственно не пишу 'const', что помогает мне в каких-то случаях.
А так как раз разницы нет и время компиляции увеличивается в столь малое значение, что человеку и не снилось, то не всё ли равно? :)
Если бы это как-то влияло на работу, то тогда я бы избавился от такой привычки и "CodeStyle", а так изменять своим привычкам я смысла особого не вижу
 
Последнее редактирование:
Сообщения
1,031
Реакции
827
Помог
10 раз(а)
код какой-то нечитаемый из-за кучи отступов
В одну строчку он тоже не читаемый)

не совсем оправдана такая реализация на старой системе.
В новой не пишу, да и не вижу смысла

И реапи ради констант подключать такое.
Реапи сейчас везде подключено, ничего в этом плохого так же не вижу, константа замениться компилятором на циферку, всего то лишь

Уж лучше бы оставил магическое число.
Как раз таки от таких чисел и избавляюсь
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Просто это технически не совсем верно, если так можно выразиться.
Просто технически надо на другом ЯП писать, чтобы применять эти правила, никак не на павне
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
В одну строчку он тоже не читаемый)
Я про отступ в каждой строчке, ужасно нечитаемо.
Как раз таки от таких чисел и избавляюсь
Это понятно. Но не сравнивать же номер страницы с константой NULLENT. Технически неверно, пусть даже её значение совпадает с нужным тебе.

Просто технически надо на другом ЯП писать, чтобы применять эти правила, никак не на павне
Дело привычки, однако.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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