Русское сообщество по скриптингу

[TUT] Создание меню на М

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[TUT] Создание меню на М

Сообщение Nixon133 » 17 сен 2014, 16:34

Многие задавались вопросом, как сделать меню на М, для игроков, чтобы было удобно.
Т.к. многие не знаю как делать бинды на различные стим\нон стим кс, то способ для вас :-)
Ну приступим :dance2:

Credist:
ConnorMcLeod

Используемые инклюды:

[pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3. #include <cstrike>

  4. #include <fakemeta>
[/pawn]

Для начала зарегистрируем две функции для Show и VGUI меню:

[pawn]
  1.   register_message(get_user_msgid("ShowMenu"), "MessageShowMenu");

  2.  register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu"); 
[/pawn]

Это есть, далее конечно же, сами паблики.
Вот такой код будет иметь паблик MessageShowMenu:

[pawn]
  1.  public MessageShowMenu(iMsgID, iDest, id)       {

  2.         if(!is_user_connected(id))

  3.                 return PLUGIN_HANDLED;

  4.        

  5.         static iMenuCode[21];

  6.         get_msg_arg_string(4, iMenuCode, charsmax(iMenuCode));

  7.  

  8.         switch(iMenuCode[1])    {

  9.                 case 'T':       {

  10.                         set_pdata_int(id, 205, 0);

  11.                         return ClCmd_JoinMenu(id);

  12.                 }

  13.                

  14.                 case 'I':       {

  15.                         set_pdata_int(id, 205, 0);

  16.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  17.                                 return ClCmd_JoinMenu(id);

  18.                         else

  19.                                 return ClCmd_MainMenu(id);

  20.                 }

  21.         }

  22.        

  23.         return PLUGIN_HANDLED;

  24. } 
[/pawn]

Расписывать каждую строчку не буду, объясню вкратце.
При заходе на сервер, вам покажет меню "Выбора команд", т.к. команда ваша будет UNASSIGNED, далее после выбора команды и нажатия на М, вы увидите "Игровое меню", т.к. ваша команде не UNASSIGNED и не SPECTATOR. Если же, вы зайдёте за SPECTATOR, то вы увидите не "Главное меню", а меню "Выбор команды".

Далее следует паблик VGUI меню:

[pawn]
  1.  public MessageVGUIMenu(iMsgID, iDest, id)       {

  2.         if(!is_user_connected(id))

  3.                 return PLUGIN_HANDLED;

  4.        

  5.         switch(get_msg_arg_int(1))      {

  6.                 case 2: {

  7.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  8.                                 return ClCmd_JoinMenu(id);

  9.                         else

  10.                                 return ClCmd_MainMenu(id);

  11.                 }

  12.                

  13.                 default: return PLUGIN_HANDLED;

  14.         }

  15.        

  16.         return PLUGIN_HANDLED;

  17. } 
[/pawn]

Здесь аналогично. Расписывать нет смысла.

Далее идут сами паблики меню "Выбор команд" и "Игровое меню". Их тоже досконально расписывать не буду:

[pawn]
  1.  public ClCmd_JoinMenu(id)       {

  2.         new iMenu[256], iLen;

  3.         new iKeysMenu = MENU_KEY_5|MENU_KEY_0;

  4.  

  5.         iLen = formatex(iMenu, charsmax(iMenu), "\rВыберите команду:^n^n");

  6.        

  7.         if(cs_get_user_team(id) == CS_TEAM_T)

  8.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d1. Террорист [%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  9.         else {

  10.                 iKeysMenu |= MENU_KEY_1;

  11.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wТеррорист \d[%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  12.         }

  13.        

  14.         if(cs_get_user_team(id) == CS_TEAM_CT)

  15.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d2. Контр-Террорист [%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  16.         else {

  17.                 iKeysMenu |= MENU_KEY_2;

  18.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКонтр-Террорист \d[%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  19.         }

  20.        

  21.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wАвто-Выбор^n");

  22.        

  23.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  24.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d6. Спектатор^n^n");

  25.         else {

  26.                 iKeysMenu |= MENU_KEY_6;

  27.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wСпектатор^n^n");

  28.         }

  29.        

  30.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  31.        

  32.         show_menu(id, iKeysMenu, iMenu, -1, "JoinMenu");

  33.        

  34.         return PLUGIN_HANDLED;

  35. } 
[/pawn]

Здесь "Выбор команд". Всё очень просто и понятно, для можористи добавил проверки на команду игрока, чтобы пункт был неактивным, и добавил в пункт меню кол-во игроков, в той или иной команде.

Далее идет паблик handled, обработчик нашего "Выбор команд" меню:

[pawn]
  1.  public handled_JoinMenu(id, iKeys)      {

  2.         static iRestore, iVGUI, iMsgBlock;

  3.        

  4.         iRestore = get_pdata_int(id, 510);

  5.         iVGUI = iRestore & (1<<0);

  6.         if(iVGUI)       set_pdata_int(id, 510, iRestore & ~(1<<0));

  7.        

  8.         switch(iKeys)   {

  9.                 case 0, 1, 4:   {

  10.                         if(iKeys <= 1 && (cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT))

  11.                                 return PLUGIN_HANDLED;

  12.  

  13.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  14.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  15.                         engclient_cmd(id, "jointeam", (iKeys == 4 ? "5" : (iKeys == 0 ? "1" : "2")));

  16.                         engclient_cmd(id, "joinclass", "5");

  17.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  18.                 }

  19.                

  20.                 case 5: {

  21.                         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  22.                                 return PLUGIN_HANDLED;

  23.  

  24.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  25.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  26.                         dllfunc(DLLFunc_ClientPutInServer, id);

  27.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  28.                         set_pdata_int(id, 349, 1);

  29.                         engclient_cmd(id, "jointeam", "6");

  30.                 }

  31.         }

  32.        

  33.         if(iVGUI)       set_pdata_int(id, 510, iRestore);

  34.         set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);

  35.  

  36.         return PLUGIN_HANDLED;

  37. }
[/pawn]

Основная задача, блокировка Show\VGUI меню, добавил еще безлимитный переход между командами, если это не нужно, закоментируйте строку:

[pawn]
  1.  set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);
[/pawn]

Далее идёт "Игровое меню":

[pawn]
  1. public ClCmd_MainMenu(id)       {

  2.         new iMenu[256], iLen;

  3.         static iKeysMenu = MENU_KEY_1|MENU_KEY_2|MENU_KEY_5|MENU_KEY_0;

  4.  

  5.         iLen = formatex(iMenu, charsmax(iMenu), "\rИгровое меню:^n^n");

  6.        

  7.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wОбнулить счёт^n");

  8.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКупить \rадминку^n^n");

  9.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wВыбор команды^n^n");

  10.  

  11.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  12.        

  13.         show_menu(id, iKeysMenu, iMenu, -1, "MainMenu");

  14.        

  15.         return PLUGIN_HANDLED;

  16. }
[/pawn]

И обработчик для него:

[pawn]
  1. public handled_MainMenu(id, iKeys)      {

  2.         switch(iKeys)   {

  3.                 case 0: client_print(id, print_chat, "Вы обнулили счёт");

  4.                 case 1: client_print(id, print_chat, "Админка");

  5.                 case 4: return ClCmd_JoinMenu(id);

  6.         }

  7.        

  8.         return PLUGIN_HANDLED;

  9. }
[/pawn]

Так же не забываем зарегистрировать наши меню в plugin_init()

[pawn]
  1.  register_menu("JoinMenu",       563,            "handled_JoinMenu");

  2.  register_menu("MainMenu",      531,            "handled_MainMenu");
[/pawn]

На счёт битов (563 или 531) читайте Вы должны зарегистрироваться, чтобы видеть ссылки.

Ну и сам сток, подсчёта игроков:

[pawn]
  1. stock fnGetPlayerTeam(CsTeams: iTeam)   {

  2.         static iPlayers[32], iNum;

  3.         get_players(iPlayers, iNum, "e", (iTeam == CS_TEAM_T ? "TERRORIST" : "CT"));

  4.         return iNum;

  5. }
[/pawn]

В принципе всё предельно ясно :-) Код рабочий, только что проверял, на обоих меню, всё ок.

Вот финальный код:

[pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3. #include <cstrike>

  4. #include <fakemeta>

  5.  

  6. #pragma semicolon               1

  7.  

  8. #define PLUGIN_NAME             "[TUT] Server Menu"

  9. #define PLUGIN_VERS             "1.0"

  10. #define PLUGIN_AUTH             "NIXON"

  11.  

  12. public plugin_init()    {

  13.         register_plugin(PLUGIN_NAME, PLUGIN_VERS, PLUGIN_AUTH);

  14.        

  15.         register_message(get_user_msgid("ShowMenu"), "MessageShowMenu");

  16.         register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");

  17.        

  18.         register_menu("JoinMenu",       563,            "handled_JoinMenu");

  19.         register_menu("MainMenu",       531,            "handled_MainMenu");

  20. }

  21.  

  22. public MessageShowMenu(iMsgID, iDest, id)       {

  23.         if(!is_user_connected(id))

  24.                 return PLUGIN_HANDLED;

  25.        

  26.         static iMenuCode[21];

  27.         get_msg_arg_string(4, iMenuCode, charsmax(iMenuCode));

  28.  

  29.         switch(iMenuCode[1])    {

  30.                 case 'T':       {

  31.                         set_pdata_int(id, 205, 0);

  32.                         return ClCmd_JoinMenu(id);

  33.                 }

  34.                

  35.                 case 'I':       {

  36.                         set_pdata_int(id, 205, 0);

  37.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  38.                                 return ClCmd_JoinMenu(id);

  39.                         else

  40.                                 return ClCmd_MainMenu(id);

  41.                 }

  42.         }

  43.        

  44.         return PLUGIN_HANDLED;

  45. }

  46.  

  47. public MessageVGUIMenu(iMsgID, iDest, id)       {

  48.         if(!is_user_connected(id))

  49.                 return PLUGIN_HANDLED;

  50.        

  51.         switch(get_msg_arg_int(1))      {

  52.                 case 2: {

  53.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  54.                                 return ClCmd_JoinMenu(id);

  55.                         else

  56.                                 return ClCmd_MainMenu(id);

  57.                 }

  58.                

  59.                 default: return PLUGIN_HANDLED;

  60.         }

  61.        

  62.         return PLUGIN_HANDLED;

  63. }

  64.  

  65. public ClCmd_JoinMenu(id)       {

  66.         new iMenu[256], iLen;

  67.         new iKeysMenu = MENU_KEY_5|MENU_KEY_0;

  68.  

  69.         iLen = formatex(iMenu, charsmax(iMenu), "\rВыберите команду:^n^n");

  70.        

  71.         if(cs_get_user_team(id) == CS_TEAM_T)

  72.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d1. Террорист [%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  73.         else {

  74.                 iKeysMenu |= MENU_KEY_1;

  75.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wТеррорист \d[%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  76.         }

  77.        

  78.         if(cs_get_user_team(id) == CS_TEAM_CT)

  79.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d2. Контр-Террорист [%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  80.         else {

  81.                 iKeysMenu |= MENU_KEY_2;

  82.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКонтр-Террорист \d[%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  83.         }

  84.        

  85.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wАвто-Выбор^n");

  86.        

  87.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  88.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d6. Спектатор^n^n");

  89.         else {

  90.                 iKeysMenu |= MENU_KEY_6;

  91.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wСпектатор^n^n");

  92.         }

  93.        

  94.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  95.        

  96.         show_menu(id, iKeysMenu, iMenu, -1, "JoinMenu");

  97.        

  98.         return PLUGIN_HANDLED;

  99. }

  100.  

  101. public handled_JoinMenu(id, iKeys)      {

  102.         static iRestore, iVGUI, iMsgBlock;

  103.        

  104.         iRestore = get_pdata_int(id, 510);

  105.         iVGUI = iRestore & (1<<0);

  106.         if(iVGUI)       set_pdata_int(id, 510, iRestore & ~(1<<0));

  107.        

  108.         switch(iKeys)   {

  109.                 case 0, 1, 4:   {

  110.                         if(iKeys <= 1 && (cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT))

  111.                                 return PLUGIN_HANDLED;

  112.  

  113.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  114.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  115.                         engclient_cmd(id, "jointeam", (iKeys == 4 ? "5" : (iKeys == 0 ? "1" : "2")));

  116.                         engclient_cmd(id, "joinclass", "5");

  117.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  118.                 }

  119.                

  120.                 case 5: {

  121.                         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  122.                                 return PLUGIN_HANDLED;

  123.  

  124.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  125.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  126.                         dllfunc(DLLFunc_ClientPutInServer, id);

  127.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  128.                         set_pdata_int(id, 349, 1);

  129.                         engclient_cmd(id, "jointeam", "6");

  130.                 }

  131.         }

  132.        

  133.         if(iVGUI)       set_pdata_int(id, 510, iRestore);

  134.         set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);

  135.  

  136.         return PLUGIN_HANDLED;

  137. }

  138.  

  139. public ClCmd_MainMenu(id)       {

  140.         new iMenu[256], iLen;

  141.         static iKeysMenu = MENU_KEY_1|MENU_KEY_2|MENU_KEY_5|MENU_KEY_0;

  142.  

  143.         iLen = formatex(iMenu, charsmax(iMenu), "\rИгровое меню:^n^n");

  144.        

  145.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wОбнулить счёт^n");

  146.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКупить \rадминку^n^n");

  147.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wВыбор команды^n^n");

  148.  

  149.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  150.        

  151.         show_menu(id, iKeysMenu, iMenu, -1, "MainMenu");

  152.        

  153.         return PLUGIN_HANDLED;

  154. }

  155.  

  156. public handled_MainMenu(id, iKeys)      {

  157.         switch(iKeys)   {

  158.                 case 0: client_print(id, print_chat, "Вы обнулили счёт");

  159.                 case 1: client_print(id, print_chat, "Админка");

  160.                 case 4: return ClCmd_JoinMenu(id);

  161.         }

  162.        

  163.         return PLUGIN_HANDLED;

  164. }

  165.  

  166. stock fnGetPlayerTeam(CsTeams: iTeam)   {

  167.         static iPlayers[32], iNum;

  168.         get_players(iPlayers, iNum, "e", (iTeam == CS_TEAM_T ? "TERRORIST" : "CT"));

  169.         return iNum;

  170. }
[/pawn]

PS. Может кому-то да пригодится, т.к. много таких тем и пр.
Код не гуру, но зато рабочий :)

Картиночки:

[spoiler]http://f-picture.net/lfp/s018.radikal.ru/i513/1409/54/25e72cd767c2.jpg/htm
Вы должны зарегистрироваться, чтобы видеть ссылки. ... bb.jpg/htm[/spoiler]
Последний раз редактировалось Nixon133 17 сен 2014, 23:07, всего редактировалось 1 раз.
скуйп - legaalize
Аватара пользователя
Nixon133
 
Сообщения: 476
Зарегистрирован: 13 ноя 2012, 12:20
Благодарил (а): 107 раз.
Поблагодарили: 56 раз.
Опыт программирования: Больше трех лет
Языки программирования: C, Pawn

Re: [TUT] Создание меню на М

Сообщение Safety1st » 17 сен 2014, 17:00

[pawn]
  1. dllfunc(DLLFunc_ClientPutInServer, id);
[/pawn]
Зачем это?

Хоть в гайде бы обошёлся без магических чисел :-D

И где credits? Основную ценность представляет чужой код, который ты использовал, а не менюшки.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: [TUT] Создание меню на М

Сообщение D34by » 17 сен 2014, 17:11

Научись кэшировать ид мессаг
Work with Zombie Plague ver. 4|5, Biohazard, Zombie Engine, Public, Weapon System
Аватара пользователя
D34by
 
Сообщения: 537
Зарегистрирован: 13 фев 2014, 12:45
Благодарил (а): 15 раз.
Поблагодарили: 192 раз.
Опыт программирования: Больше трех лет
Языки программирования: пешка
сишка

Re: [TUT] Создание меню на М

Сообщение Nixon133 » 17 сен 2014, 19:24

Всю инфу брал из других плагинов, давно уже если честно. И подзабыл где именно брал.
Я не говорю что мой, код, просто составил маленький тут.

На счет кэширования, не умею :(

пс. магические числа, ты это про биты? не ну а че, мне они нравятся, с ними удобно

Добавлено спустя 4 минуты:
На счет ддлки, хз если честно :D
Сам задавался этим вопросом. Почему-то ддлку пишут, для перехода в спекты, хз зачем.

Добавлено спустя 12 минут 58 секунд:
На счет мессаги, как это сделать? Подскажите :-)
скуйп - legaalize
Аватара пользователя
Nixon133
 
Сообщения: 476
Зарегистрирован: 13 ноя 2012, 12:20
Благодарил (а): 107 раз.
Поблагодарили: 56 раз.
Опыт программирования: Больше трех лет
Языки программирования: C, Pawn

Re: [TUT] Создание меню на М

Сообщение D34by » 17 сен 2014, 21:25

На счет кэширования, не умею

Каждый раз получаешь ид мессаг через get_user_msgid()
можно
1) в plugin_init()
gMsg = get_user_msgid()
и использовать gMsg в коде
2) если знаешь реальный ид, использовать его
70 = health
89 = motd
96 = showmenu
110 = sendaudio
114 = vgui
и тд

пс. магические числа, ты это про биты? не ну а че, мне они нравятся, с ними удобно

Речь об оффсетах
Work with Zombie Plague ver. 4|5, Biohazard, Zombie Engine, Public, Weapon System
Аватара пользователя
D34by
 
Сообщения: 537
Зарегистрирован: 13 фев 2014, 12:45
Благодарил (а): 15 раз.
Поблагодарили: 192 раз.
Опыт программирования: Больше трех лет
Языки программирования: пешка
сишка

Re: [TUT] Создание меню на М

Сообщение Safety1st » 17 сен 2014, 23:05

Nixon133 писал(а):Всю инфу брал из других плагинов, давно уже если честно. И подзабыл где именно брал.

Ну, учти на будущее) Сейчас ConnorMcLeod'а можешь смело приписать, у него часть кода встречал.

Nixon133 писал(а):На счет ддлки, хз если честно :D
Сам задавался этим вопросом. Почему-то ддлку пишут, для перехода в спекты, хз зачем.

А без этой строки не работает? ;)
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: [TUT] Создание меню на М

Сообщение Nixon133 » 17 сен 2014, 23:08

Safety1st писал(а):
Nixon133 писал(а):Всю инфу брал из других плагинов, давно уже если честно. И подзабыл где именно брал.

Ну, учти на будущее) Сейчас ConnorMcLeod'а можешь смело приписать, у него часть кода встречал.

Nixon133 писал(а):На счет ддлки, хз если честно :D
Сам задавался этим вопросом. Почему-то ддлку пишут, для перехода в спекты, хз зачем.

А без этой строки не работает? ;)

Ладно, потом попробуем без этой дллки ;)
скуйп - legaalize
Аватара пользователя
Nixon133
 
Сообщения: 476
Зарегистрирован: 13 ноя 2012, 12:20
Благодарил (а): 107 раз.
Поблагодарили: 56 раз.
Опыт программирования: Больше трех лет
Языки программирования: C, Pawn

Re: [TUT] Создание меню на М

Сообщение BaJIepbI4 » 25 сен 2014, 16:25

Всем привет.

Подредактировал плагин из первого поста под себя. Но есть изначальная проблема - не показывается меню закупки, если на клиенте включен вид менюшек Old style. Если включить VGUI менюшки то все ок.
Помогите подредактировать этот плагин, чтобы работала закупка при включенном режиме менюшек Oldstyle menus.

Еще раз код плагина:
[pawn]
  1.  

  2.  

  3. #include <amxmodx>

  4. #include <amxmisc>

  5. #include <cstrike>

  6. #include <fakemeta>

  7.  

  8. #pragma semicolon               1

  9.  

  10. #define PLUGIN_NAME             "Server Menu"

  11. #define PLUGIN_VERS             "1.0"

  12. #define PLUGIN_AUTH             "ConnorMcLeod"

  13.  

  14. public plugin_init()    {

  15.         register_plugin(PLUGIN_NAME, PLUGIN_VERS, PLUGIN_AUTH);

  16.        

  17.         register_message(get_user_msgid("ShowMenu"), "MessageShowMenu");

  18.         register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");

  19.        

  20.         register_menu("JoinMenu",       563,            "handled_JoinMenu");

  21.         register_menu("MainMenu",       1023,            "handled_MainMenu");

  22. }

  23.  

  24. public MessageShowMenu(iMsgID, iDest, id)       {

  25.         if(!is_user_connected(id))

  26.                 return PLUGIN_HANDLED;

  27.        

  28.         static iMenuCode[21];

  29.         get_msg_arg_string(4, iMenuCode, charsmax(iMenuCode));

  30.  

  31.         switch(iMenuCode[1])    {

  32.                 case 'T':       {

  33.                         set_pdata_int(id, 205, 0);

  34.                         return ClCmd_JoinMenu(id);

  35.                 }

  36.                

  37.                 case 'I':       {

  38.                         set_pdata_int(id, 205, 0);

  39.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  40.                                 return ClCmd_JoinMenu(id);

  41.                         else

  42.                                 return ClCmd_MainMenu(id);

  43.                 }

  44.         }

  45.        

  46.         return PLUGIN_HANDLED;

  47. }

  48.  

  49. public MessageVGUIMenu(iMsgID, iDest, id)       {

  50.         if(!is_user_connected(id))

  51.                 return PLUGIN_HANDLED;

  52.        

  53.         switch(get_msg_arg_int(1))      {

  54.                 case 2: {

  55.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  56.                                 return ClCmd_JoinMenu(id);

  57.                         else

  58.                                 return ClCmd_MainMenu(id);

  59.                 }

  60.                

  61.                 default: return PLUGIN_HANDLED;

  62.         }

  63.        

  64.         return PLUGIN_HANDLED;

  65. }

  66.  

  67. public ClCmd_JoinMenu(id)       {

  68.         new iMenu[256], iLen;

  69.         new iKeysMenu = MENU_KEY_5|MENU_KEY_0;

  70.  

  71.         iLen = formatex(iMenu, charsmax(iMenu), "\rВыберите команду:^n^n");

  72.        

  73.         if(cs_get_user_team(id) == CS_TEAM_T)

  74.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d1. Террористы [%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  75.         else {

  76.                 iKeysMenu |= MENU_KEY_1;

  77.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wТеррористы \d[%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  78.         }

  79.        

  80.         if(cs_get_user_team(id) == CS_TEAM_CT)

  81.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d2. Контр-Террористы [%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  82.         else {

  83.                 iKeysMenu |= MENU_KEY_2;

  84.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКонтр-Террористы \d[%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  85.         }

  86.        

  87.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wАвто-Выбор^n");

  88.        

  89.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  90.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d6. Спектаторы^n^n");

  91.         else {

  92.                 iKeysMenu |= MENU_KEY_6;

  93.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wСпектаторы^n^n");

  94.         }

  95.        

  96.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  97.        

  98.         show_menu(id, iKeysMenu, iMenu, -1, "JoinMenu");

  99.        

  100.         return PLUGIN_HANDLED;

  101. }

  102.  

  103. public handled_JoinMenu(id, iKeys)      {

  104.         static iRestore, iVGUI, iMsgBlock;

  105.        

  106.         iRestore = get_pdata_int(id, 510);

  107.         iVGUI = iRestore & (1<<0);

  108.         if(iVGUI)       set_pdata_int(id, 510, iRestore & ~(1<<0));

  109.        

  110.         switch(iKeys)   {

  111.                 case 0, 1, 4:   {

  112. //                        if(iKeys <= 1 && (cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT))

  113.  //                               return PLUGIN_HANDLED;

  114.  

  115.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  116.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  117.                         engclient_cmd(id, "jointeam", (iKeys == 4 ? "5" : (iKeys == 0 ? "1" : "2")));

  118.                         engclient_cmd(id, "joinclass", "5");

  119.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  120.                 }

  121.                

  122.                 case 5: {

  123.                         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  124.                                 return PLUGIN_HANDLED;

  125.  

  126.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  127.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  128.                         dllfunc(DLLFunc_ClientPutInServer, id);

  129.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  130.                         set_pdata_int(id, 349, 1);

  131.                         engclient_cmd(id, "jointeam", "6");

  132.                 }

  133.         }

  134.        

  135.         if(iVGUI)       set_pdata_int(id, 510, iRestore);

  136.         set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);

  137.  

  138.         return PLUGIN_HANDLED;

  139. }

  140.  

  141. public ClCmd_MainMenu(id)       {

  142.         new iMenu[512], iLen;

  143.         static iKeysMenu = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

  144.  

  145.         iLen = formatex(iMenu, charsmax(iMenu), "\rИгровое меню Бодрый Public 16+:^n^n");

  146.        

  147.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wОбнулить счёт^n");

  148.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wУзнать свой rank^n");

  149.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y3. \wПосмотреть Top15^n");

  150.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y4. \wХочу сменить карту^n");

  151.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wЗаткнуть игрока^n");

  152.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wИнформация о сервере^n^n");

  153.                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  154.                         {

  155.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y7. \rVIP \wменю^n");

  156.                         }

  157.                         else

  158.                         {

  159.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d7. \dVIP \dменю^n");

  160.                         }

  161.                 if(get_user_flags(id) & ADMIN_BAN)

  162.                         {

  163.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y8. \rAdmin \wменю^n^n");

  164.                         }

  165.                         else

  166.                         {

  167.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d8. \dAdmin \dменю^n^n");

  168.                         }

  169.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y9. \yВыбор команды^n^n");

  170.  

  171.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  172.        

  173.         show_menu(id, iKeysMenu, iMenu, -1, "MainMenu");

  174.        

  175.         return PLUGIN_HANDLED;

  176. }

  177.  

  178. public handled_MainMenu(id, iKeys)      {

  179.         switch(iKeys)   {

  180.                 case 0: client_cmd(id,"say /rs");

  181.                 case 1: client_cmd(id,"say /rank");

  182.                                 case 2: client_cmd(id,"say /top15");

  183.                                 case 3: client_cmd(id,"say /rtv");

  184.                                 case 4: client_cmd(id,"say /mute");

  185.                                 case 5: client_cmd(id,"say /motd");

  186.                                 case 6:

  187.                                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  188.                                 {

  189.                                         client_cmd(id,"say /vipmenu");

  190.                                 }

  191.                                 else

  192.                                 {

  193.                                         client_print(id, print_chat, "Нет доступа.");

  194.                                 }

  195.                                 case 7:

  196.                                 if(get_user_flags(id) & ADMIN_BAN)

  197.                                 {

  198.                                         client_cmd(id,"amxmodmenu");

  199.                                 }

  200.                                 else

  201.                                 {

  202.                                         client_print(id, print_chat, "Нет доступа.");

  203.                                 }

  204.                                 case 8: return ClCmd_JoinMenu(id);

  205.         }

  206.        

  207.         return PLUGIN_HANDLED;

  208. }

  209.  

  210. stock fnGetPlayerTeam(CsTeams: iTeam)   {

  211.         static iPlayers[32], iNum;

  212.         get_players(iPlayers, iNum, "e", (iTeam == CS_TEAM_T ? "TERRORIST" : "CT"));

  213.         return iNum;

  214. }

  215.  

  216.  
[/pawn]
Аватара пользователя
BaJIepbI4
 
Сообщения: 2
Зарегистрирован: 21 авг 2014, 10:00
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: [TUT] Создание меню на М

Сообщение BaJIepbI4 » 25 сен 2014, 22:24

BaJIepbI4 писал(а):Всем привет.

Подредактировал плагин из первого поста под себя. Но есть изначальная проблема - не показывается меню закупки, если на клиенте включен вид менюшек Old style. Если включить VGUI менюшки то все ок.
Помогите подредактировать этот плагин, чтобы работала закупка при включенном режиме менюшек Oldstyle menus.

Еще раз код плагина:
[pawn]
  1.  

  2.  

  3. #include <amxmodx>

  4. #include <amxmisc>

  5. #include <cstrike>

  6. #include <fakemeta>

  7.  

  8. #pragma semicolon               1

  9.  

  10. #define PLUGIN_NAME             "Server Menu"

  11. #define PLUGIN_VERS             "1.0"

  12. #define PLUGIN_AUTH             "ConnorMcLeod"

  13.  

  14. public plugin_init()    {

  15.         register_plugin(PLUGIN_NAME, PLUGIN_VERS, PLUGIN_AUTH);

  16.        

  17.         register_message(get_user_msgid("ShowMenu"), "MessageShowMenu");

  18.         register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");

  19.        

  20.         register_menu("JoinMenu",       563,            "handled_JoinMenu");

  21.         register_menu("MainMenu",       1023,            "handled_MainMenu");

  22. }

  23.  

  24. public MessageShowMenu(iMsgID, iDest, id)       {

  25.         if(!is_user_connected(id))

  26.                 return PLUGIN_HANDLED;

  27.        

  28.         static iMenuCode[21];

  29.         get_msg_arg_string(4, iMenuCode, charsmax(iMenuCode));

  30.  

  31.         switch(iMenuCode[1])    {

  32.                 case 'T':       {

  33.                         set_pdata_int(id, 205, 0);

  34.                         return ClCmd_JoinMenu(id);

  35.                 }

  36.                

  37.                 case 'I':       {

  38.                         set_pdata_int(id, 205, 0);

  39.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  40.                                 return ClCmd_JoinMenu(id);

  41.                         else

  42.                                 return ClCmd_MainMenu(id);

  43.                 }

  44.         }

  45.        

  46.         return PLUGIN_HANDLED;

  47. }

  48.  

  49. public MessageVGUIMenu(iMsgID, iDest, id)       {

  50.         if(!is_user_connected(id))

  51.                 return PLUGIN_HANDLED;

  52.        

  53.         switch(get_msg_arg_int(1))      {

  54.                 case 2: {

  55.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  56.                                 return ClCmd_JoinMenu(id);

  57.                         else

  58.                                 return ClCmd_MainMenu(id);

  59.                 }

  60.                

  61.                 default: return PLUGIN_HANDLED;

  62.         }

  63.        

  64.         return PLUGIN_HANDLED;

  65. }

  66.  

  67. public ClCmd_JoinMenu(id)       {

  68.         new iMenu[256], iLen;

  69.         new iKeysMenu = MENU_KEY_5|MENU_KEY_0;

  70.  

  71.         iLen = formatex(iMenu, charsmax(iMenu), "\rВыберите команду:^n^n");

  72.        

  73.         if(cs_get_user_team(id) == CS_TEAM_T)

  74.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d1. Террористы [%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  75.         else {

  76.                 iKeysMenu |= MENU_KEY_1;

  77.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wТеррористы \d[%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  78.         }

  79.        

  80.         if(cs_get_user_team(id) == CS_TEAM_CT)

  81.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d2. Контр-Террористы [%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  82.         else {

  83.                 iKeysMenu |= MENU_KEY_2;

  84.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКонтр-Террористы \d[%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  85.         }

  86.        

  87.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wАвто-Выбор^n");

  88.        

  89.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  90.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d6. Спектаторы^n^n");

  91.         else {

  92.                 iKeysMenu |= MENU_KEY_6;

  93.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wСпектаторы^n^n");

  94.         }

  95.        

  96.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  97.        

  98.         show_menu(id, iKeysMenu, iMenu, -1, "JoinMenu");

  99.        

  100.         return PLUGIN_HANDLED;

  101. }

  102.  

  103. public handled_JoinMenu(id, iKeys)      {

  104.         static iRestore, iVGUI, iMsgBlock;

  105.        

  106.         iRestore = get_pdata_int(id, 510);

  107.         iVGUI = iRestore & (1<<0);

  108.         if(iVGUI)       set_pdata_int(id, 510, iRestore & ~(1<<0));

  109.        

  110.         switch(iKeys)   {

  111.                 case 0, 1, 4:   {

  112. //                        if(iKeys <= 1 && (cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT))

  113.  //                               return PLUGIN_HANDLED;

  114.  

  115.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  116.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  117.                         engclient_cmd(id, "jointeam", (iKeys == 4 ? "5" : (iKeys == 0 ? "1" : "2")));

  118.                         engclient_cmd(id, "joinclass", "5");

  119.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  120.                 }

  121.                

  122.                 case 5: {

  123.                         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  124.                                 return PLUGIN_HANDLED;

  125.  

  126.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  127.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  128.                         dllfunc(DLLFunc_ClientPutInServer, id);

  129.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  130.                         set_pdata_int(id, 349, 1);

  131.                         engclient_cmd(id, "jointeam", "6");

  132.                 }

  133.         }

  134.        

  135.         if(iVGUI)       set_pdata_int(id, 510, iRestore);

  136.         set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);

  137.  

  138.         return PLUGIN_HANDLED;

  139. }

  140.  

  141. public ClCmd_MainMenu(id)       {

  142.         new iMenu[512], iLen;

  143.         static iKeysMenu = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

  144.  

  145.         iLen = formatex(iMenu, charsmax(iMenu), "\rИгровое меню Бодрый Public 16+:^n^n");

  146.        

  147.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wОбнулить счёт^n");

  148.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wУзнать свой rank^n");

  149.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y3. \wПосмотреть Top15^n");

  150.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y4. \wХочу сменить карту^n");

  151.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wЗаткнуть игрока^n");

  152.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wИнформация о сервере^n^n");

  153.                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  154.                         {

  155.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y7. \rVIP \wменю^n");

  156.                         }

  157.                         else

  158.                         {

  159.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d7. \dVIP \dменю^n");

  160.                         }

  161.                 if(get_user_flags(id) & ADMIN_BAN)

  162.                         {

  163.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y8. \rAdmin \wменю^n^n");

  164.                         }

  165.                         else

  166.                         {

  167.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d8. \dAdmin \dменю^n^n");

  168.                         }

  169.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y9. \yВыбор команды^n^n");

  170.  

  171.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  172.        

  173.         show_menu(id, iKeysMenu, iMenu, -1, "MainMenu");

  174.        

  175.         return PLUGIN_HANDLED;

  176. }

  177.  

  178. public handled_MainMenu(id, iKeys)      {

  179.         switch(iKeys)   {

  180.                 case 0: client_cmd(id,"say /rs");

  181.                 case 1: client_cmd(id,"say /rank");

  182.                                 case 2: client_cmd(id,"say /top15");

  183.                                 case 3: client_cmd(id,"say /rtv");

  184.                                 case 4: client_cmd(id,"say /mute");

  185.                                 case 5: client_cmd(id,"say /motd");

  186.                                 case 6:

  187.                                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  188.                                 {

  189.                                         client_cmd(id,"say /vipmenu");

  190.                                 }

  191.                                 else

  192.                                 {

  193.                                         client_print(id, print_chat, "Нет доступа.");

  194.                                 }

  195.                                 case 7:

  196.                                 if(get_user_flags(id) & ADMIN_BAN)

  197.                                 {

  198.                                         client_cmd(id,"amxmodmenu");

  199.                                 }

  200.                                 else

  201.                                 {

  202.                                         client_print(id, print_chat, "Нет доступа.");

  203.                                 }

  204.                                 case 8: return ClCmd_JoinMenu(id);

  205.         }

  206.        

  207.         return PLUGIN_HANDLED;

  208. }

  209.  

  210. stock fnGetPlayerTeam(CsTeams: iTeam)   {

  211.         static iPlayers[32], iNum;

  212.         get_players(iPlayers, iNum, "e", (iTeam == CS_TEAM_T ? "TERRORIST" : "CT"));

  213.         return iNum;

  214. }

  215.  

  216.  
[/pawn]


Ковырял ковырял и в итоге получилось вот что:

[pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3. #include <cstrike>

  4. #include <fakemeta>

  5.  

  6. #pragma semicolon               1

  7.  

  8. #define PLUGIN_NAME             "Server Menu"

  9. #define PLUGIN_VERS             "1.0"

  10. #define PLUGIN_AUTH             "ConnorMcLeod"

  11.  

  12. // Old Style Menus

  13. stock const FIRST_JOIN_MSG[] =      "#Team_Select";

  14. stock const FIRST_JOIN_MSG_SPEC[] =   "#Team_Select_Spect";

  15. stock const INGAME_JOIN_MSG[] =      "#IG_Team_Select";

  16. stock const INGAME_JOIN_MSG_SPEC[] =   "#IG_Team_Select_Spect";

  17. const iMaxLen = sizeof(INGAME_JOIN_MSG_SPEC);

  18.  

  19.  

  20.  

  21. public plugin_init()    {

  22.         register_plugin(PLUGIN_NAME, PLUGIN_VERS, PLUGIN_AUTH);

  23.        

  24.         register_message(get_user_msgid("ShowMenu"), "MessageShowMenu");

  25.         register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");

  26.                 register_clcmd("chooseteam", "ClCmd_MainMenu");

  27.                

  28.        

  29.         register_menu("JoinMenu",       563,            "handled_JoinMenu");

  30.         register_menu("MainMenu",       1023,            "handled_MainMenu");

  31. }

  32.  

  33. public MessageShowMenu(iMsgid, iDest, id) {

  34.    static sMenuCode[iMaxLen];

  35.    get_msg_arg_string(4, sMenuCode, sizeof(sMenuCode) - 1);

  36.    if(equal(sMenuCode, FIRST_JOIN_MSG) || equal(sMenuCode, FIRST_JOIN_MSG_SPEC)) {

  37.       set_autojoin_task(id, iMsgid);

  38.       return PLUGIN_HANDLED;

  39.    }

  40.    return PLUGIN_CONTINUE;

  41. }

  42.  

  43.  

  44.  

  45. public MessageVGUIMenu(iMsgID, iDest, id)       {

  46.         if(!is_user_connected(id))

  47.                 return PLUGIN_HANDLED;

  48.        

  49.         switch(get_msg_arg_int(1))      {

  50.                 case 2: {

  51.                         if(cs_get_user_team(id) == CS_TEAM_UNASSIGNED || cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  52.                                 return ClCmd_JoinMenu(id);

  53.                         else

  54.                                 return ClCmd_MainMenu(id);

  55.                 }

  56.                

  57.                 default: return PLUGIN_HANDLED;

  58.         }

  59.        

  60.         return PLUGIN_HANDLED;

  61. }

  62.  

  63. public ClCmd_JoinMenu(id)       {

  64.         new iMenu[256], iLen;

  65.         new iKeysMenu = MENU_KEY_5|MENU_KEY_0;

  66.  

  67.         iLen = formatex(iMenu, charsmax(iMenu), "\rВыберите команду:^n^n");

  68.        

  69.         if(cs_get_user_team(id) == CS_TEAM_T)

  70.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d1. Террористы [%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  71.         else {

  72.                 iKeysMenu |= MENU_KEY_1;

  73.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wТеррористы \d[%d]^n", fnGetPlayerTeam(CS_TEAM_T));

  74.         }

  75.        

  76.         if(cs_get_user_team(id) == CS_TEAM_CT)

  77.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d2. Контр-Террористы [%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  78.         else {

  79.                 iKeysMenu |= MENU_KEY_2;

  80.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wКонтр-Террористы \d[%d]^n^n", fnGetPlayerTeam(CS_TEAM_CT));

  81.         }

  82.        

  83.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wАвто-Выбор^n");

  84.        

  85.         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  86.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d6. Спектаторы^n^n");

  87.         else {

  88.                 iKeysMenu |= MENU_KEY_6;

  89.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wСпектаторы^n^n");

  90.         }

  91.        

  92.         if(cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT || cs_get_user_team(id) == CS_TEAM_SPECTATOR) {

  93.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  94.                         }

  95.         show_menu(id, iKeysMenu, iMenu, -1, "JoinMenu");

  96.        

  97.         return PLUGIN_HANDLED;

  98. }

  99.  

  100. public handled_JoinMenu(id, iKeys)      {

  101.         static iRestore, iVGUI, iMsgBlock;

  102.        

  103.         iRestore = get_pdata_int(id, 510);

  104.         iVGUI = iRestore & (1<<0);

  105.         if(iVGUI)       set_pdata_int(id, 510, iRestore & ~(1<<0));

  106.        

  107.         switch(iKeys)   {

  108.                 case 0, 1, 4:   {

  109. //                        if(iKeys <= 1 && (cs_get_user_team(id) == CS_TEAM_T || cs_get_user_team(id) == CS_TEAM_CT))

  110. //                               return PLUGIN_HANDLED;

  111.  

  112.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  113.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  114.                         engclient_cmd(id, "jointeam", (iKeys == 4 ? "5" : (iKeys == 0 ? "1" : "2")));

  115.                         engclient_cmd(id, "joinclass", "5");

  116.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  117.                 }

  118.                

  119.                 case 5: {

  120.                         if(cs_get_user_team(id) == CS_TEAM_SPECTATOR)

  121.                                 return PLUGIN_HANDLED;

  122.  

  123.                         iMsgBlock = get_msg_block(get_user_msgid("ShowMenu"));

  124.                         set_msg_block(get_user_msgid("ShowMenu"), BLOCK_ONCE);

  125.                         dllfunc(DLLFunc_ClientPutInServer, id);

  126.                         set_msg_block(get_user_msgid("ShowMenu"), iMsgBlock);

  127.                         set_pdata_int(id, 349, 1);

  128.                         engclient_cmd(id, "jointeam", "6");

  129.                 }

  130.         }

  131.        

  132.         if(iVGUI)       set_pdata_int(id, 510, iRestore);

  133.         set_pdata_int(id, 125, get_pdata_int(id, 125, 5) & ~(1<<8), 5);

  134.  

  135.         return PLUGIN_HANDLED;

  136. }

  137.  

  138. public ClCmd_MainMenu(id)       {

  139.         new iMenu[512], iLen;

  140.         static iKeysMenu = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;

  141.  

  142.         iLen = formatex(iMenu, charsmax(iMenu), "\rИгровое меню Бодрый Public 16+:^n^n");

  143.        

  144.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y1. \wОбнулить счёт^n");

  145.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y2. \wУзнать свой rank^n");

  146.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y3. \wПосмотреть Top15^n");

  147.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y4. \wХочу сменить карту^n");

  148.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y5. \wЗаткнуть игрока^n");

  149.                 iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y6. \wИнформация о сервере^n^n");

  150.                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  151.                         {

  152.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y7. \rVIP \wменю^n");

  153.                         }

  154.                         else

  155.                         {

  156.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d7. \dVIP \dменю^n");

  157.                         }

  158.                 if(get_user_flags(id) & ADMIN_BAN)

  159.                         {

  160.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y8. \rAdmin \wменю^n^n");

  161.                         }

  162.                         else

  163.                         {

  164.                         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\d8. \dAdmin \dменю^n^n");

  165.                         }

  166.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y9. \yВыбор команды^n^n");

  167.  

  168.         iLen += formatex(iMenu[iLen], charsmax(iMenu) - iLen, "\y0. \wВыход");

  169.        

  170.         show_menu(id, iKeysMenu, iMenu, -1, "MainMenu");

  171.        

  172.         return PLUGIN_HANDLED;

  173. }

  174.  

  175. public handled_MainMenu(id, iKeys)      {

  176.         switch(iKeys)   {

  177.                 case 0: client_cmd(id,"say /rs");

  178.                 case 1: client_cmd(id,"say /rank");

  179.                                 case 2: client_cmd(id,"say /top15");

  180.                                 case 3: client_cmd(id,"say /rtv");

  181.                                 case 4: client_cmd(id,"say /mute");

  182.                                 case 5: client_cmd(id,"say /motd");

  183.                                 case 6:

  184.                                 if(get_user_flags(id) & ADMIN_LEVEL_E)

  185.                                 {

  186.                                         client_cmd(id,"say /vipmenu");

  187.                                 }

  188.                                 else

  189.                                 {

  190.                                         client_print(id, print_chat, "Нет доступа.");

  191.                                 }

  192.                                 case 7:

  193.                                 if(get_user_flags(id) & ADMIN_BAN)

  194.                                 {

  195.                                         client_cmd(id,"amxmodmenu");

  196.                                 }

  197.                                 else

  198.                                 {

  199.                                         client_print(id, print_chat, "Нет доступа.");

  200.                                 }

  201.                                 case 8: return ClCmd_JoinMenu(id);

  202.         }

  203.        

  204.         return PLUGIN_HANDLED;

  205. }

  206.  

  207. public task_Autojoin(iParam[], id) {

  208.    new iMsgBlock = get_msg_block(iParam[0]);

  209.    set_msg_block(iParam[0], BLOCK_SET);

  210.    ClCmd_JoinMenu(id);

  211.    set_msg_block(iParam[0], iMsgBlock);

  212. }

  213.  

  214. stock set_autojoin_task(id, iMsgid) {

  215.    new iParam[2];

  216.    iParam[0] = iMsgid;

  217.    set_task(0.1, "task_Autojoin", id, iParam, sizeof(iParam));

  218. }

  219.  

  220.  

  221. stock fnGetPlayerTeam(CsTeams: iTeam)   {

  222.         static iPlayers[32], iNum;

  223.         get_players(iPlayers, iNum, "e", (iTeam == CS_TEAM_T ? "TERRORIST" : "CT"));

  224.         return iNum;

  225. }
[/pawn]

Вроде работает, но если кто сможет проверить код на наличие мусора буду очень благодарен!
Аватара пользователя
BaJIepbI4
 
Сообщения: 2
Зарегистрирован: 21 авг 2014, 10:00
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5