Меню с циклом

Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Проблема такая: для меню хэндлера не получается сделать цикл, то есть для для внешнего вида я сделал (вывод на экран), но если нажимать все кнопки, (1,2,3,0) передается только первое значение массива. (300) На 0 вообще выход хотел сделать.
Как нужно сделать?
Код:
New const BETS[] = {
300, 500, 1000, 1500
}
register_menu("lot_menu", 1023, "func_menu")

public lottery_menu(id)
{
    static menu[650], iLen
    new money = cs_get_user_money(id)
    new sysTime = get_systime()
    new keys = MENU_KEY_0
   
    g_LastTry = g_NowUsed[id]

    new TimeRemaining = TIME_FOR_RETRY - (sysTime - g_LastTry)

    if(TIME_FOR_RETRY > (sysTime - g_LastTry))
    {
        client_print_color(id, print_team_default, "^3[^4%L^3] %L", LANG_PLAYER, "TAG", LANG_PLAYER, "PAUSE", TIME_FOR_RETRY, TimeRemaining)
    }
    #if defined ONLY_ALIVE
    else if(!is_user_alive(id)) client_print_color(id, print_team_default, "^3[^4%L^3] %L",  LANG_PLAYER, "TAG",  LANG_PLAYER, "ONLY_ALIVE")
    #endif
    else
    {
        iLen = 0
        iLen = formatex(menu[iLen], charsmax(menu) - iLen, "%L", LANG_PLAYER, "MENU_HAVE_MONEY", money)
        for (new i = 0, n = min(9, sizeof BETS); i < n; i++)
        {
            if(money < BETS[i])
            {
                iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r%d. \d%d$^n", i+1, BETS[i])
               
            }
            else
            {
                iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r%d. \w%d$^n", i+1, BETS[i])
                keys |= (1 << i)
            }
        }
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "^n\r0. \w%L^n", LANG_PLAYER, "EXIT")
        keys |= MENU_KEY_0

        show_menu(id, keys, menu, -1, "lot_menu")
    }
    return PLUGIN_HANDLED
}
    
public func_menu(id, key, i)
{
    new bet
    new money = cs_get_user_money(id)
    new sysTime = get_systime()
   
    if(BETS[i] <= money)
    {
        bet = BETS[i]
        lottery_main(id, bet)
        g_NowUsed[id] = sysTime
    }
    else lottery_menu(id)
   
    return PLUGIN_HANDLED
}
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
Посмотри что у тебя приходит в функцию хендлера при разных нажатиях .(прологируй аргументы)
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
В старом меню у хендлера всего 2 аргумента.
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
sbelov020, у вас key равен индексу выбранного элемента в массиве. Зачем вам еще один аргумент? Делайте проверку на выход и используйте key место i, которого там и быть не может.
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
sbelov020,
Код:
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "^n\r0. \w%L^n", LANG_PLAYER, "EXIT")
keys |= MENU_KEY_0
keys выхода равен (1 << 9)
Вот и проверяйте на равенство девятке.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Mistrick, спасибо, буду пробовать
21 Окт 2018
Mistrick, все отлично работает, благодарю. за исключением, при нажатии 0, меню закрывается, но в консоли серва ошибка:

L 10/21/2018 - 23:31:47: [AMXX] Displaying debug trace (plugin "advanced_lottery.amxx", version "0.3")
L 10/21/2018 - 23:31:47: [AMXX] Run time error 4: index out of bounds
L 10/21/2018 - 23:31:47: [AMXX] [0] advanced_lottery.sma::func_menu (line 93)


Код:
        iLen += formatex(menu[iLen], charsmax(menu) - iLen, "^n\r0. \w%L^n", LANG_PLAYER, "EXIT")
        keys |= (1 << 9)

.
.
public func_menu(id, key)
{
    new bet
    new money = cs_get_user_money(id)
    new sysTime = get_systime()
   
    if(BETS[key] <= money) // - это 93 строка
    {
        bet = BETS[key]
        lottery_main(id, bet)
        g_NowUsed[id] = sysTime
    }
    else lottery_menu(id)
    if(key == 9) return PLUGIN_HANDLED
   
    return PLUGIN_HANDLED
}
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
w0w, да, все отлично. благодарю

всем спасибо, тему можно закрыть.
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
w0w, думаю стоит пояснить почему так нужно было сделать. Это даст шанс что человек поймет ошибку, а не просто сделает как сказали бездумно.
22 Окт 2018
Давайте помогать начинающим, а не давать просто готовые ответы. Либо наводить на верное решение не давая готовых строк, либо давать готовые решения, но с максимальной расшифровкой, таким образом частная проблема будет иметь общее решение и на нее можно будет сослаться в будущем.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Sonyx, согласен, если посмотреть выше, я у мистрика не код спросил, а где прочесть об этом :)
Касательно сообщения w0w , я в принципе понимаю почему так. Нажатие 9 будет поймано раньше чем значение key = 9 попадет в массив
 
Сообщения
957
Реакции
1,185
Помог
52 раз(а)
sbelov020, эту проверку делать в самом начале так же разумно, потому как, если пользователь нажал выход, нет смысла тратить процессорное время на получение денег, времени, создание новых переменных и т. д. В конкреном случае не особо страшно конечно, но все же моветон.
 

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

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