Автор: Alekkkk
Хотели бы вы сделать более 10 пунктов в меню на 1 странице, с возможностью выбора пункта без всяких биндов дополнительных клавиш?
Мы создадим меню с 9 пунктами, которые добавим с помощью menu_additem, а остальные пункты с помощью menu_addtext.
Для отлова нажатия 10+ пункта мы создадим задержку в 0.2 сек. (Cvar) в течение которой будем ожидать ещё нажатия.
Например, если сначала нажмём 2, затем 1, то это будет считаться как 21 пункт меню.
А если за 0.2 секунды не будет нажата ещё какая-то клавиша (1 в нашем примере), то будет выбран пункт меню 2.
Вот пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
#include <amxmodx> new g_fButton[ 33 ] new g_sButton[ 33 ] new g_Task[ 33 ] new Float:g_fTime[ 33 ] new g_pWait, Float:WAIT public plugin_init() { register_plugin( "How to make more options in one page", "1.0", "eMinEm" ) register_clcmd( "say /menu", "catch_buttons" ) g_pWait = register_cvar( "menu_waittime", "0.2" ) WAIT = get_pcvar_float( g_pWait ) } public client_putinserver( id ) null_all( id ); public catch_buttons( id ) { if( g_Task[ id ] ) { if( g_fButton[ id ] != 0 ) set_buttons( id, get_gametime( ) ); else null_all( id ); show_menu( id, 0, "^n" ) return PLUGIN_HANDLED } new menu = menu_create( "Menu", "catch_buttons_handler" ) /* First type of formatting the menu */ /* menu_additem( menu, "Option1 \r10. \wOption 10 \r19. \wOption 19", "1", 0 ); menu_additem( menu, "Option2 \r11. \wOption 11 \r20. \wOption 20", "2", 0 ); menu_additem( menu, "Option3 \r12. \wOption 12 \r21. \wOption 21", "3", 0 ); menu_additem( menu, "Option4 \r13. \wOption 13 \r22. \wOption 22", "4", 0 ); menu_additem( menu, "Option5 \r14. \wOption 14 \r23. \wOption 23", "5", 0 ); menu_additem( menu, "Option6 \r15. \wOption 15 \r24. \wOption 24", "6", 0 ); menu_additem( menu, "Option7 \r16. \wOption 16", "7", 0 ); menu_additem( menu, "Option8 \r17. \wOption 17", "8", 0 ); menu_additem( menu, "Option9 \r18. \wOption 18", "9", 0 ); */ /* Second type of formatting the menu */ menu_additem( menu, "Option1", "1" ); menu_additem( menu, "Option1", "2" ); menu_additem( menu, "Option1", "3" ); menu_additem( menu, "Option1", "4" ); menu_additem( menu, "Option1", "5" ); menu_additem( menu, "Option1", "6" ); menu_additem( menu, "Option1", "7" ); menu_additem( menu, "Option1", "8" ); menu_additem( menu, "Option1", "9" ); menu_addtext( menu, "\r10. \wOption10", 0 ); menu_addtext( menu, "\r11. \wOption11", 0 ); menu_addtext( menu, "\r12. \wOption12", 0 ); menu_addtext( menu, "\r13. \wOption13", 0 ); menu_addtext( menu, "\r14. \wOption14", 0 ); menu_addtext( menu, "\r15. \wOption15", 0 ); menu_addtext( menu, "\r16. \wOption16", 0 ); menu_addtext( menu, "\r17. \wOption17", 0 ); menu_addtext( menu, "\r18. \wOption18", 0 ); menu_addtext( menu, "\r19. \wOption19", 0 ); menu_addtext( menu, "\r20. \wOption20", 0 ); menu_addtext( menu, "\r21. \wOption21", 0 ); menu_addtext( menu, "\r22. \wOption22", 0 ); menu_addtext( menu, "\r23. \wOption23", 0 ); menu_addtext( menu, "\r24. \wOption24", 0 ); menu_addblank( menu, 0 ) menu_additem( menu, "Exit", "0" ); menu_setprop( menu, MPROP_PERPAGE, 0 ); menu_display( id, menu, 0 ); return PLUGIN_HANDLED } public catch_buttons_handler( id, menu, item ) { new data[ 6 ], szName[ 64 ] new access, callback; menu_item_getinfo( menu, item, access, data,charsmax( data ), szName,charsmax( szName ), callback ); new key = str_to_num( data ); new Float:iTime = get_gametime( ) if( task_exists( id ) ) remove_task( id ); g_fButton[ id ] < 0 ? ( g_fButton[ id ] = key ) : ( g_sButton[ id ] = key ); g_fTime[ id ] = iTime set_buttons( id, iTime ) menu_destroy( menu ) return PLUGIN_HANDLED } set_buttons( id, Float:iTime ) { if( g_sButton[ id ] < 0 ) { if( iTime - g_fTime[ id ] <= WAIT ) { catch_buttons( id ); g_Task[ id ] = 1 set_task( WAIT, "catch_buttons", id ) } else { exec_selected( id, g_fButton[ id ], -1 ) null_all( id ) } } else { exec_selected( id, g_fButton[ id ], g_sButton[ id ] ) null_all( id ) } } null_all( id ) { g_fButton[ id ] = -1 g_sButton[ id ] = -1 g_fTime[ id ] = 0.0 g_Task[ id ] = 0 } exec_selected( id, fslot, sslot ) { new szChoice[ 3 ], iChoice sslot < 0 ? formatex( szChoice, charsmax( szChoice ), "%d", fslot ) : formatex( szChoice, charsmax( szChoice ), "%d%d", fslot, sslot ); iChoice = str_to_num( szChoice ) switch( iChoice ) { case 1: client_print( id, print_chat, "Selected item : %d", iChoice ); case 2: client_print( id, print_chat, "Selected item : %d", iChoice ); case 3: client_print( id, print_chat, "Selected item : %d", iChoice ); case 4: client_print( id, print_chat, "Selected item : %d", iChoice ); case 5: client_print( id, print_chat, "Selected item : %d", iChoice ); case 6: client_print( id, print_chat, "Selected item : %d", iChoice ); case 7: client_print( id, print_chat, "Selected item : %d", iChoice ); case 8: client_print( id, print_chat, "Selected item : %d", iChoice ); case 9: client_print( id, print_chat, "Selected item : %d", iChoice ); case 10: client_print( id, print_chat, "Selected item : %d", iChoice ); case 11: client_print( id, print_chat, "Selected item : %d", iChoice ); case 12: client_print( id, print_chat, "Selected item : %d", iChoice ); case 13: client_print( id, print_chat, "Selected item : %d", iChoice ); case 14: client_print( id, print_chat, "Selected item : %d", iChoice ); case 15: client_print( id, print_chat, "Selected item : %d", iChoice ); case 16: client_print( id, print_chat, "Selected item : %d", iChoice ); case 17: client_print( id, print_chat, "Selected item : %d", iChoice ); case 18: client_print( id, print_chat, "Selected item : %d", iChoice ); case 19: client_print( id, print_chat, "Selected item : %d", iChoice ); case 20: client_print( id, print_chat, "Selected item : %d", iChoice ); case 21: client_print( id, print_chat, "Selected item : %d", iChoice ); case 22: client_print( id, print_chat, "Selected item : %d", iChoice ); case 23: client_print( id, print_chat, "Selected item : %d", iChoice ); case 24: client_print( id, print_chat, "Selected item : %d", iChoice ); default: client_print( id, print_center, "Item : %d does not exist", iChoice ); } } |
Прим. перевод: Мне очень не хотелось переводить комментарии, если очень хотите, то напишите об этом в комментах, я добавлю комментарии в код (тавтология 80 lvl)
Перевод: Polarhigh
Источник: https://forums.alliedmods.net/showthread.php?t=210686