Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Отлов нажатия

Статус пользователя DumoH4uk
сообщение 2.9.2014, 17:26
Сообщение #1


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Здравствуйте, ребята! thank_you2.gif

Помогите пожалуйста, отловить нажатия таких кнопок как "NEXT" и "BACK" в новой системе меню.

Вот, что я пробовал...

Код:
if(item == MENU_BACK) - не работает.
if(item == 8/9) - не работает.


Так же:

Код:
switch(i_Key)
{
case 8: client_print(id, print_chat, "Use Back")
case 9: client_print(id, print_chat, "Use Next")
}


- Не работает.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя admir
сообщение 2.9.2014, 22:53
Сообщение #2
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

либо где-то в другом месте зафейлил, ибо "MENU_MORE", "MENU_BACK" должны работать
либо если кнопка "Далее" создаётся автоматически в новом меню, то при её использовании handler меню не вызывается
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 2.9.2014, 23:01
Сообщение #3
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

menuselect 8,9,10
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 3.9.2014, 14:27
Сообщение #4


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Цитата(admir @ 3.9.2014, 0:53) *
либо где-то в другом месте зафейлил, ибо "MENU_MORE", "MENU_BACK" должны работать
либо если кнопка "Далее" создаётся автоматически в новом меню, то при её использовании handler меню не вызывается


Автоматически создаются, т.к. меню состоит из игроков. Как принудительно создать "Далее" и "Назад" в новой системе меню?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 4.9.2014, 1:07
Сообщение #5
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

Цитата(DumoH4uk @ 3.9.2014, 14:27) *
Автоматически создаются, т.к. меню состоит из игроков. Как принудительно создать "Далее" и "Назад" в новой системе меню?

меню вмещает 9 элементов на 1 странице, создаёте 7-8 вам необходимых, в 8, 9 делаете вызов нового меню.

как в примере с amx-x:
Код:
#include <amxmodx>

public plugin_init()
{
register_clcmd( "my_menu","My_Menu")
}

public My_Menu(id)
{
new i_Menu = menu_create("\rMy menu:", "menu_handler")

menu_additem(i_Menu, "\wFirst option #1", "1", 0)
menu_additem(i_Menu, "\wSub-Menu #2", "2", 0)

menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, i_Menu, 0)
}

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

new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
client_print(id, print_chat, "You selected first option")
}
case 2:
{
// Открыть под-меню
Sub_Menu(id)
}
}

menu_destroy(menu)
return PLUGIN_HANDLED
}

public Sub_Menu(id)
{
// Создаем новое меню, но функция обработки действий будет другая
new i_Menu = menu_create("\rSub-Menu:", "submenu_handler")

menu_additem(i_Menu, "\wSub-option #1", "1", 0)
menu_additem(i_Menu, "\wSub-option #2", "2", 0)

menu_setprop(i_Menu, MPROP_EXIT, MEXIT_ALL)
menu_display(id, i_Menu, 0)
}

public submenu_handler(id, menu, item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu)

// Если игрок на сервере, то показываем главное меню
if (is_user_connected(id))
My_Menu(id)

return PLUGIN_HANDLED
}

new s_Data[6], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)

new i_Key = str_to_num(s_Data)

switch(i_Key)
{
case 1:
{
client_print(id, print_chat, "You selected first sub-option")
}
case 2:
{
client_print(id, print_chat, "You selected second sub-option")
}
}

menu_destroy(menu)

// Если вы хотите показать главное меню потом
My_Menu(id)

return PLUGIN_HANDLED
}


Отредактировал: admir, - 4.9.2014, 1:07
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Orty_Hart
сообщение 4.9.2014, 12:58
Сообщение #6
Стаж: 14 лет

Сообщений: 1399
Благодарностей: 408
Полезность: 725

DumoH4uk,
зачем вам новое меню? Используйте то, которые создала группа AMXX.
Оно самое надежное и простое в использование...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 4.9.2014, 13:02
Сообщение #7


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

DumoH4uk, зачем ловить переходы по страницам?


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 4.9.2014, 14:10
Сообщение #8


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Мне уже помогли на amxx

Код:
new oldmenu, newmenu, page;
player_menu_info(id, oldmenu, newmenu, page);


Хотел сохранять последнюю страницу на которой находился админ, дабы было удобнее для передачи денег админом, а то после передачи одному игроку все время возвращает на первую страницу, не очень удобно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 4.9.2014, 15:40
Сообщение #9
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

Цитата(DumoH4uk @ 4.9.2014, 14:10) *
Мне уже помогли на amxx

Код:
new oldmenu, newmenu, page;
player_menu_info(id, oldmenu, newmenu, page);


Хотел сохранять последнюю страницу на которой находился админ, дабы было удобнее для передачи денег админом, а то после передачи одному игроку все время возвращает на первую страницу, не очень удобно.

стоило так и сказать. как по мне, избегая лишних проверок, лучше тогда при добавлении элемента в меню давать ему id содержащий его номер и страницу на которой он находится. (двухзначное число, первая цифра номер страницы, вторая номер элемента на странице)

Отредактировал: admir, - 4.9.2014, 15:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя mazdan
сообщение 4.9.2014, 15:53
Сообщение #10


Иконка группы

Стаж: 15 лет

Сообщений: 7566
Благодарностей: 5437
Полезность: 1305

DumoH4uk, вот вот xy проблема же =)


Не пишите мне в ЛС. Пишите на почту. В ЛС я пропускаю сообщения.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 4.9.2014, 16:03
Сообщение #11


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Цитата(admir @ 4.9.2014, 17:40) *
стоило так и сказать. как по мне, избегая лишних проверок, лучше тогда при добавлении элемента в меню давать ему id содержащий его номер и страницу на которой он находится. (двухзначное число, первая цифра номер страницы, вторая номер элемента на странице)


Что-то я не очень догоняю как это реализовать smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя admir
сообщение 4.9.2014, 16:05
Сообщение #12
Стаж: 13 лет

Сообщений: 192
Благодарностей: 31
Полезность: 138

Цитата(DumoH4uk @ 4.9.2014, 16:03) *
Что-то я не очень догоняю как это реализовать smile.gif

Код:
native menu_additem(menu, const name[], const info[]="", paccess=0, callback=-1);

const info[]="" - Передача информации от пункта меню к функции обработчику
а номер страницы через цикл определять..

Отредактировал: admir, - 4.9.2014, 16:07
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 25.9.2014, 13:55
Сообщение #13


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Ребят!

Как сделать в старой системе меню кнопки "Выход", "Далее" и "Назад" как в новой системе?

То есть:

Кнопка "выход" есть на любой странице, кнопка "далее", если впереди еще есть страницы и кнопка "назад" если позади есть страницы :-D
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Stimul1
сообщение 25.9.2014, 15:40
Сообщение #14


Стаж: 13 лет

Сообщений: 227
Благодарностей: 262
Полезность: 977

DumoH4uk, в старой системе ты ведь сам форматируешь меню так, как тебе надо.
В первом меню, не указывай кнопку 8 (MENU_KEY_8), и делай пункт серым цветом, во втором меню - не указывай кнопку 9 (MENU_KEY_9) и также делай пункт серым цветом.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 25.9.2014, 15:51
Сообщение #15


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Цитата(Stimul1 @ 25.9.2014, 17:40) *
DumoH4uk, в старой системе ты ведь сам форматируешь меню так, как тебе надо.
В первом меню, не указывай кнопку 8 (MENU_KEY_8), и делай пункт серым цветом, во втором меню - не указывай кнопку 9 (MENU_KEY_9) и также делай пункт серым цветом.


Спасибо. Уже все сделал :D
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 25.9.2014, 19:00
Сообщение #16


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Что за приколы в старой системе?

Убрал себя из списка, нажимаю на первый пункт, а в чат выводится мое имя =D, как исправить?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
voed
сообщение 25.9.2014, 19:07
Сообщение #17
Стаж: 11 лет

Сообщений: 2593
Благодарностей: 1760
Полезность: 405

Цитата(DumoH4uk @ 25.9.2014, 19:00) *
Что за приколы в старой системе?

Убрал себя из списка, нажимаю на первый пункт, а в чат выводится мое имя =D, как исправить?

Может код покажете?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 25.9.2014, 19:09
Сообщение #18


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Цитата(voed @ 25.9.2014, 21:07) *
Может код покажете?


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

new Players[32]
new Num

enum _:DATA
{
NAME[33] = 1,
MENUPAGE,
MENUPLAYERS[32]
};

new g_Data[33][DATA]

public plugin_init()
{
register_clcmd("say /test", "gkm_slay_main")

register_menu("gkm_slay", 1023, "gkm_slay_hand")
}

// Показываем меню игроку
public gkm_slay_main(id, Page)
{
if (Page < 0)
return PLUGIN_HANDLED;

new gkm_slay[512], i_Key, item

get_players(Players, Num)

new i = min(Page * 7, Num);
new Start = i - (i % 7);
new End = min(Start + 7, Num);

Page = Start / 7;

g_Data[id][MENUPLAYERS] = Players;
g_Data[id][MENUPAGE] = Page;

new Len = formatex(gkm_slay, 511, "\r%L\R%d/%d^n^n", id, "#KickPlayerMenu_Title", Page + 1, ((Num - 1) / 7) + 1);

for(i = Start; i < End; i++)
{
if(is_user_alive(Players[i]) && id != Players[i])
{
get_user_name(Players[i], g_Data[Players[i]][NAME], 32);

i_Key |= (1 << item);
Len += formatex(gkm_slay[Len], 511 - Len, "\r%i. \w%s^n", ++item, g_Data[Players[i]][NAME]);
}
}


if(Page + 1 >= ((Num - 1) / 7) + 1)
{
i_Key |= MENU_KEY_8;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r8.\w Back");
}else Len += formatex(gkm_slay[Len], 511 - Len, "^n\r8.\d Back");

if(Page + 1 < ((Num - 1) / 7) + 1)
{
i_Key |= MENU_KEY_9;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r9.\w Next");
}else Len += formatex(gkm_slay[Len], 511 - Len, "^n\r9.\d Next");

i_Key |= MENU_KEY_0;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r0.\w Exit");

return show_menu(id, i_Key, gkm_slay, -1, "gkm_slay");
}

public gkm_slay_hand(id, i_Key)
{
switch(i_Key)
{
case 7: gkm_slay_main(id, --g_Data[id][MENUPAGE]);
case 8: gkm_slay_main(id, ++g_Data[id][MENUPAGE]);

default:
{
new test = g_Data[id][MENUPLAYERS][(g_Data[id][MENUPAGE] * 7) + i_Key];

if(is_user_connected(test))
{
new Nem[32]
get_user_name(test, Nem, charsmax(Nem))
client_print(id, print_chat, "You use %s", Nem);
gkm_slay_main(id, g_Data[id][MENUPAGE]);

return PLUGIN_HANDLED;
}
}
}
return PLUGIN_HANDLED;
}


ps. первый раз этой системой пользуюсь, так, что не ругайте, пытаюсь подогнать под себя.

Сделал так:

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

new Players[32]
new Num

enum _:DATA
{
NAME[33] = 1,
MENUPAGE,
MENUPLAYERS[32]
};

new g_Data[33][DATA]

public plugin_init()
{
register_clcmd("say /test", "gkm_slay_main")

register_menu("gkm_slay", 1023, "gkm_slay_hand")
}

// Показываем меню игроку
public gkm_slay_main(id, Page)
{
if (Page < 0)
return PLUGIN_HANDLED;

new gkm_slay[512], i_Key, item
new Player[32], PlayerNum

get_players(Players, Num)

for(new i; i < Num; i++)
{
if(is_user_connected(Players[i]) && id != Players[i])
{
Player[i] = Players[i]
PlayerNum++
}
}

new i = min(Page * 7, PlayerNum);
new Start = i - (i % 7);
new End = min(Start + 7, PlayerNum);

Page = Start / 7;

g_Data[id][MENUPLAYERS] = Player;
g_Data[id][MENUPAGE] = Page;

new Len = formatex(gkm_slay, 511, "\r%L\R%d/%d^n^n", id, "#KickPlayerMenu_Title", Page + 1, ((PlayerNum - 1) / 7) + 1);

for(i = Start; i < End; i++)
{
get_user_name(Player[i], g_Data[Player[i]][NAME], 32);

i_Key |= (1 << item);
Len += formatex(gkm_slay[Len], 511 - Len, "\r%i. \w%s^n", ++item, g_Data[Player[i]][NAME]);
}


if(Page + 1 >= ((PlayerNum - 1) / 7) + 1)
{
i_Key |= MENU_KEY_8;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r8.\w Back");
}else Len += formatex(gkm_slay[Len], 511 - Len, "^n\r8.\d Back");

if(Page + 1 < ((PlayerNum - 1) / 7) + 1)
{
i_Key |= MENU_KEY_9;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r9.\w Next");
}else Len += formatex(gkm_slay[Len], 511 - Len, "^n\r9.\d Next");

i_Key |= MENU_KEY_0;
Len += formatex(gkm_slay[Len], 511 - Len, "^n\r0.\w Exit");

return show_menu(id, i_Key, gkm_slay, -1, "gkm_slay");
}

public gkm_slay_hand(id, i_Key)
{
switch(i_Key)
{
case 7: gkm_slay_main(id, --g_Data[id][MENUPAGE]);
case 8: gkm_slay_main(id, ++g_Data[id][MENUPAGE]);

default:
{
new test = g_Data[id][MENUPLAYERS][(g_Data[id][MENUPAGE] * 7) + i_Key];

if(is_user_connected(test))
{
new Nem[32]
get_user_name(test, Nem, charsmax(Nem))
client_print(id, print_chat, "You use %s", Nem);
gkm_slay_main(id, g_Data[id][MENUPAGE]);

return PLUGIN_HANDLED;
}
}
}
return PLUGIN_HANDLED;
}


Теперь часто появляется в меню сервер =\ wtf?

Отредактировал: DumoH4uk, - 25.9.2014, 19:28
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя DumoH4uk
сообщение 27.9.2014, 22:20
Сообщение #19


Стаж: 14 лет

Сообщений: 188
Благодарностей: 81
Полезность: 122

Ребята, помогите, что только уже не пробовал, чтобы убрать ненужных игроков из списка... В меню все замечательно, но вот при выборе игрока не того выбирает =\
p.s. не предлагать флаги для get_players т.к. в дальнейшем я хочу убрать из списка себя, пока пытаюсь хоть живых игроков убрать через is_user_alive.

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

enum _:DATA
{
NAME[33] = 1,
MENUPAGE
};

new g_Data[33][DATA]

new g_MenuPlayers[33][32]
new g_MenuNum[33]

public plugin_init()
{
register_clcmd("say /test", "gkm_slay_main")

register_menu("gkm_slay", 1023, "gkm_slay_hand")
}

public gkm_slay_main(id, Page)
{
if (Page < 0)
return PLUGIN_HANDLED;

new gkm_slay[512], item

get_players(g_MenuPlayers[id], g_MenuNum[id])

new Start = Page * 7

if(Start >= g_MenuNum[id])
Start = Page = g_Data[id][MENUPAGE] = 0

new End = Start + 7

if(End > g_MenuNum[id])
End = g_MenuNum[id]

new Len = formatex(gkm_slay, 511, "\r%L\R%d/%d^n^n", id, "#KickPlayerMenu_Title", Page + 1, (g_MenuNum[id] / 7 + ((g_MenuNum[id] % 7) ? 1 : 0)));

new i_Key

for(new j = Start; j < End; j++)
{
if(!is_user_alive(g_MenuPlayers[id][j]))
{
get_user_name(g_MenuPlayers[id][j], g_Data[g_MenuPlayers[id][j]][NAME], 32);

i_Key |= (1 << item);
Len += formatex(gkm_slay[Len], 511 - Len, "\r%i. \w%s^n", ++item, g_Data[g_MenuPlayers[id][j]][NAME]);
}
}

return show_menu(id, i_Key, gkm_slay, -1, "gkm_slay");
}

public gkm_slay_hand(id, i_Key)
{
switch(i_Key)
{
default:
{
new test = g_MenuPlayers[id][(g_Data[id][MENUPAGE] * 7) + i_Key];

if(is_user_connected(test))
{
new Nem[32]
get_user_name(test, Nem, charsmax(Nem))
client_print(id, print_chat, "You use %s", Nem);
gkm_slay_main(id, g_Data[id][MENUPAGE]);

return PLUGIN_HANDLED;
}
}
}
return PLUGIN_HANDLED;
}


p.s. когда почти все игроки мертвы, то начинает нормально работать и в редких случаях когда один игрок мертв и его имя в чате совпадает с именем в меню.

Отредактировал: DumoH4uk, - 27.9.2014, 22:21
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: