SHARE
TWEET

Untitled

d3m37r4 Apr 12th, 2020 376 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <amxmodx>
  2. #include <map_manager>
  3. #include <map_manager_scheduler>
  4.  
  5. new const ADMIN_MAPLIST[]   = "admin_maps.ini";       // Список карт для формирования меню (в строку указывается только название карты без учета онлайна)
  6. const ACCESS_FLAG           = ADMIN_BAN;              // Флаг для доступа к меню
  7.  
  8. const VOTE_BY_ADMIN_MENU    = 4;
  9. const MAX_ITEMS_MENU        = 6;
  10. const MAX_VOTELIST_SIZE     = 9;
  11.  
  12. enum {
  13.     MenuKeyConfirm = 6,
  14.     MenuKeyBack,
  15.     MenuKeyNext,
  16.     MenuKeyExit
  17. };
  18.  
  19. enum {
  20.     ChangeMapMenu,
  21.     VoteMapMenu
  22. };
  23.  
  24. enum InfoList {
  25.     MenuType,
  26.     MenuPos,
  27.     MenuId,
  28.     MenuUserId
  29. };
  30.  
  31. enum StateType {
  32.     StateNone = -1,
  33.     StateSelect
  34. };
  35.  
  36. new Array:g_MapList, Array:g_VoteList, Array:g_MainMapList;
  37. new g_LoadedMaps, g_VoteItems;
  38.  
  39. new g_MenuInfo[InfoList];
  40. new StateType:g_State = StateNone;
  41. new g_EventNewRound;
  42.  
  43. new g_LastRound;
  44. new g_NextMap[MAPNAME_LENGTH];
  45. new g_Prefix[48];
  46.  
  47. public plugin_init() {
  48.     register_plugin("Admin Mapmenu", "0.3", "d3m37r4");
  49.  
  50.     RegisterCmd();
  51.     RegisterBlockCmd();
  52.  
  53.     register_menucmd(g_MenuInfo[MenuId] = register_menuid("MapMenu"), 1023, "HandleMapMenu");
  54.     disable_event(g_EventNewRound = register_event("HLTV", "EventNewRound", "a", "1=0", "2=0"));
  55. }
  56.  
  57. public plugin_cfg() {
  58.     g_MapList = ArrayCreate(MAPNAME_LENGTH);
  59.     g_VoteList = ArrayCreate(MAPNAME_LENGTH);
  60.  
  61.     new filename[32];
  62.     copy(filename, charsmax(filename), ADMIN_MAPLIST);
  63.  
  64.     if(!mapm_load_maplist_to_array(g_MapList, filename)) {
  65.         ArrayDestroy(g_MapList);
  66.         ArrayDestroy(g_VoteList);
  67.         set_fail_state("nothing loaded from ^"%s^"", filename);
  68.     }
  69.  
  70.     if(g_MapList) {
  71.         g_LoadedMaps = ArraySize(g_MapList);
  72.     }
  73.  
  74.     bind_pcvar_num(get_cvar_pointer("mapm_last_round"), g_LastRound);
  75.     mapm_get_prefix(g_Prefix, charsmax(g_Prefix));
  76. }
  77.  
  78. public CmdSay(const id) {
  79.     if(!is_vote_started() && !is_vote_finished() && !is_vote_will_in_next_round()) {
  80.         return PLUGIN_CONTINUE;
  81.     }
  82.  
  83.     new text[MAPNAME_LENGTH]; read_args(text, charsmax(text));
  84.     remove_quotes(text); trim(text); strtolower(text);
  85.    
  86.     if(is_string_with_space(text)) {
  87.         return PLUGIN_CONTINUE;
  88.     }
  89.  
  90.     new bool:nomination = false;
  91.     new map_index = mapm_get_map_index(text);
  92.     if(map_index != INVALID_MAP_INDEX) {
  93.         nomination = true;
  94.     } else if(strlen(text) >= 4) {
  95.         map_index = __FindSimilarMapByString(text, g_MainMapList);
  96.         if(map_index != INVALID_MAP_INDEX ) {
  97.             nomination = true;
  98.         }
  99.     }
  100.  
  101.     if(nomination) {
  102.         return PLUGIN_HANDLED;
  103.     }
  104.  
  105.     return PLUGIN_CONTINUE;
  106. }
  107.  
  108. public CmdBlock(const id) {
  109.     if(is_vote_started() || is_vote_finished() || is_vote_will_in_next_round()) {
  110.         return PLUGIN_HANDLED;
  111.     }
  112.  
  113.     return PLUGIN_CONTINUE;
  114. }
  115.  
  116. public CmdChangeMap(const id, const flags) {
  117.     if(!CmdEnabled(id, flags, true)) {
  118.         return PLUGIN_HANDLED;
  119.     }
  120.  
  121.     read_argv(1, g_NextMap, charsmax(g_NextMap));
  122.     ChangeMap(id, g_NextMap);
  123.  
  124.     return PLUGIN_HANDLED;  
  125. }
  126.  
  127. public CmdVoteMap(const id, const flags) {
  128.     if(!CmdEnabled(id, flags, true)) {
  129.         return PLUGIN_HANDLED;
  130.     }
  131.  
  132.     return PLUGIN_HANDLED;  
  133. }
  134.  
  135. public CmdChangeMapMenu(const id, const flags) {
  136.     if(!CmdEnabled(id, flags)) {
  137.         return PLUGIN_HANDLED;
  138.     }
  139.  
  140.     OpenMapMenu(id, ChangeMapMenu);
  141.     return PLUGIN_HANDLED;    
  142. }
  143.  
  144. public CmdVoteMapMenu(const id, const flags) {
  145.     if(!CmdEnabled(id, flags)) {
  146.         return PLUGIN_HANDLED;
  147.     }
  148.  
  149.     OpenMapMenu(id, VoteMapMenu);
  150.     return PLUGIN_HANDLED;  
  151. }
  152.  
  153. OpenMapMenu(const id, const menuid) {
  154.     if(g_State == StateNone) {
  155.         g_MenuInfo[MenuPos] = 0;
  156.         g_MenuInfo[MenuType] = menuid;
  157.         g_MenuInfo[MenuUserId] = id;
  158.         g_State = StateSelect;
  159.         ShowMapMenu(id);
  160.     }
  161.  
  162.     if(g_State == StateSelect) {
  163.         new bool:menu_open, menu_index, dummy;
  164.         for(new player = 1; player <= MaxClients; player++) {
  165.             if(!is_user_connected(player)) {
  166.                 continue;
  167.             }
  168.  
  169.             player_menu_info(player, menu_index, dummy);
  170.             if(g_MenuInfo[MenuId] != menu_index) {
  171.                 continue;
  172.             }
  173.  
  174.             menu_open = true;
  175.             break;
  176.         }
  177.  
  178.         if(!menu_open) {
  179.             ClearData();
  180.         }
  181.     }
  182. }
  183.  
  184. ShowMapMenu(const id, const page = 0) {
  185.     new start, end;
  186.     new current = GetMenuPage(page, g_LoadedMaps, MAX_ITEMS_MENU, start, end);
  187.     new pages = GetMenuPagesNum(g_LoadedMaps, MAX_ITEMS_MENU);
  188.     new max_items = g_MenuInfo[MenuType] == VoteMapMenu ? mapm_get_votelist_size() : 1;
  189.  
  190.     new menu[MAX_MENU_LENGTH];
  191.     new len = formatex(menu, charsmax(menu), g_MenuInfo[MenuType] == VoteMapMenu ?
  192.     "\y[\rVoteMap Menu\y] \wСписок карт" : "\y[\rChangeMap Menu\y] \wСписок карт");
  193.  
  194.     len += formatex(menu[len], charsmax(menu) - len, " \y%d/%d^n", current + 1, pages + 1);
  195.     len += formatex(menu[len], charsmax(menu) - len, "\wВыбрано карт: \y%d/%d^n^n", g_VoteItems, max_items);
  196.  
  197.     new keys = MENU_KEY_0;
  198.     for(new i = start, item, map_name[MAPNAME_LENGTH]; i < end; i++) {
  199.         ArrayGetString(g_MapList, i, map_name, charsmax(map_name));
  200.  
  201.         keys |= (1 << item);
  202.         len += formatex(menu[len], charsmax(menu) - len, ArrayFindString(g_VoteList, map_name) != INVALID_MAP_INDEX ?
  203.         "\d%d. %s \y[\r*\y]^n" : "\r%d. \w%s^n", ++item, map_name);
  204.     }
  205.  
  206.     new tmp[15];
  207.     setc(tmp, MAX_ITEMS_MENU - (end - start) + 1, '^n');
  208.     len += copy(menu[len], charsmax(menu) - len, tmp);
  209.  
  210.     if(g_VoteItems) {
  211.         keys |= MENU_KEY_7;
  212.         len += formatex(menu[len], charsmax(menu) - len, g_MenuInfo[MenuType] == VoteMapMenu ?
  213.         "\r7. \wСоздать голосование^n" : "\r7. \wПодтвердить выбор^n");
  214.     } else {
  215.         len += formatex(menu[len], charsmax(menu) - len, g_MenuInfo[MenuType] == VoteMapMenu ?
  216.         "\d7. Создать голосование^n" : "\d7. Подтвердить выбор^n");
  217.     }
  218.  
  219.     if(g_MenuInfo[MenuPos] != 0) {
  220.         keys |= MENU_KEY_8;
  221.         len += formatex(menu[len], charsmax(menu) - len, "^n\r8. \wНазад");
  222.     } else {
  223.         len += formatex(menu[len], charsmax(menu) - len, "^n\d8. Назад");
  224.     }
  225.  
  226.     if(end < g_LoadedMaps) {
  227.         keys |= MENU_KEY_9;
  228.         len += formatex(menu[len], charsmax(menu) - len, "^n\r9. \wДалее");
  229.     } else {
  230.         len += formatex(menu[len], charsmax(menu) - len, "^n\d9. Далее");
  231.     }
  232.  
  233.     formatex(menu[len], charsmax(menu) - len, "^n\r0. \wВыход");
  234.     show_menu(id, keys, menu, -1, "MapMenu");
  235. }
  236.  
  237. public HandleMapMenu(const id, const key) {
  238.     new max_items = g_MenuInfo[MenuType] == VoteMapMenu ? mapm_get_votelist_size() : 1;
  239.     switch(key) {
  240.         case MenuKeyConfirm: {
  241.             if(g_MenuInfo[MenuType] == VoteMapMenu) {
  242.                 client_print_color(0, print_team_default, "%s ^4%n ^1создал голосование за смену карты.", g_Prefix, id);
  243.                 map_scheduler_start_vote(VOTE_BY_ADMIN_MENU);              
  244.             } else {
  245.                 ArrayGetString(g_VoteList, 0, g_NextMap, charsmax(g_NextMap));
  246.                 ChangeMap(id, g_NextMap);
  247.             }
  248.         }
  249.         case MenuKeyBack: {
  250.             ShowMapMenu(id, --g_MenuInfo[MenuPos]);
  251.         }
  252.         case MenuKeyNext: {
  253.             ShowMapMenu(id, ++g_MenuInfo[MenuPos]);
  254.         }
  255.         case MenuKeyExit: {
  256.             ClearData();
  257.         }
  258.         default: {
  259.             new map_name[MAPNAME_LENGTH];
  260.             ArrayGetString(g_MapList, g_MenuInfo[MenuPos] * MAX_ITEMS_MENU + key, map_name, charsmax(map_name));
  261.  
  262.             new map_index = ArrayFindString(g_VoteList, map_name);
  263.             if(map_index == INVALID_MAP_INDEX) {
  264.                 if(g_VoteItems != max_items) {
  265.                     ArrayPushString(g_VoteList, map_name);
  266.                     g_VoteItems++;
  267.                 }
  268.             } else {
  269.                 ArrayDeleteItem(g_VoteList, map_index);
  270.                 g_VoteItems--;
  271.             }
  272.            
  273.             ShowMapMenu(id, g_MenuInfo[MenuPos]);
  274.         }
  275.     }
  276. }
  277.  
  278. public EventNewRound() {
  279.     client_print_color(0, print_team_default, "%s ^1Следующая карта: ^4%s^1.", g_Prefix, g_NextMap);
  280.     intermission();
  281. }
  282.  
  283. public mapm_maplist_loaded(Array:maplist) {
  284.     g_MainMapList = ArrayClone(maplist);
  285. }
  286.  
  287. public mapm_prepare_votelist(type) {
  288.     if(type != VOTE_BY_ADMIN_MENU) {
  289.         return;
  290.     }
  291.  
  292.     for(new i, map_name[MAPNAME_LENGTH]; i < g_VoteItems; i++) {
  293.         ArrayGetString(g_VoteList, i, map_name, charsmax(map_name));
  294.         mapm_push_map_to_votelist(map_name, PUSH_BY_NATIVE, CHECK_IGNORE_MAP_ALLOWED);
  295.     }
  296.  
  297.     mapm_set_votelist_max_items(g_VoteItems);
  298. }
  299.  
  300. bool:CmdEnabled(const id, const flags, bool:console = false) {
  301.     if(~get_user_flags(id) & flags) {
  302.         console_print(id, "* Недостаточно прав для использования команды!");
  303.         return false;
  304.     }
  305.  
  306.     static message[190];
  307.     if(is_vote_started()) {
  308.         formatex(message, charsmax(message), "^1Команда недоступна! Голосование уже запущено!");
  309.         console ? __ConsolePrintEx(id, "* %s", message) : client_print_color(id, print_team_default, "%s %s", g_Prefix, message);
  310.         return false;
  311.     }
  312.  
  313.     if(is_vote_will_in_next_round()) {
  314.         formatex(message, charsmax(message), "^1Команда недоступна! В следующем раунде начнется голосование за смену карты!");
  315.         console ? __ConsolePrintEx(id, "* %s", message) : client_print_color(id, print_team_default, "%s %s", g_Prefix, message);
  316.         return false;
  317.     }
  318.  
  319.     if(is_last_round()) {
  320.         get_cvar_string("amx_nextmap", g_NextMap, charsmax(g_NextMap));
  321.         formatex(message, charsmax(message), "^1Команда недоступна! Cледующая карта уже определена: ^4%s^1.", g_NextMap);
  322.         console ? __ConsolePrintEx(id, "* %s", message) : client_print_color(id, print_team_default, "%s %s", g_Prefix, message);
  323.         return false;        
  324.     }
  325.  
  326.     if(g_State == StateSelect && g_MenuInfo[MenuUserId] != id) {
  327.         formatex(message, charsmax(message), "^1Команда недоступна! ^4%n^1 уже выбирает %s!",
  328.         g_MenuInfo[MenuUserId], g_MenuInfo[MenuType] == VoteMapMenu ? "карты" : "карту");
  329.  
  330.         console ? __ConsolePrintEx(id, "* %s", message) : client_print_color(id, print_team_default, "%s %s", g_Prefix, message);
  331.         return false;
  332.     }
  333.  
  334.     return true;
  335. }
  336.  
  337. RegisterCmd() {
  338.     register_clcmd("amx_changemap_menu", "CmdChangeMapMenu", ACCESS_FLAG);
  339.     register_clcmd("amx_votemap_menu", "CmdVoteMapMenu", ACCESS_FLAG);
  340.  
  341.     register_concmd("amx_changemap", "CmdChangeMap", ACCESS_FLAG);
  342.     register_concmd("amx_votemap", "CmdVoteMap", ACCESS_FLAG);
  343. }
  344.  
  345. RegisterBlockCmd() {
  346.     register_clcmd("say", "CmdSay");
  347.     register_clcmd("say_team", "CmdSay");
  348.  
  349.     register_clcmd("say rtv", "CmdBlock");
  350.     register_clcmd("say /rtv", "CmdBlock");
  351.     register_clcmd("say maps", "CmdBlock");
  352.     register_clcmd("say /maps", "CmdBlock");
  353. }
  354.  
  355. GetMenuPage(cur_page, elements_num, per_page, &start, &end) {
  356.     new max = min(cur_page * per_page, elements_num);
  357.     start = max - (max % MAX_ITEMS_MENU);
  358.     end = min(start + per_page, elements_num);
  359.     return start / per_page;
  360. }
  361.  
  362. GetMenuPagesNum(elements_num, per_page) {
  363.     return (elements_num - 1) / per_page;
  364. }
  365.  
  366. ChangeMap(const id, map[]) {
  367.     set_cvar_string("amx_nextmap", map);
  368.     client_print_color(0, print_team_default, "%s ^4%n ^1сменил текущую карту на ^4%s^1.", g_Prefix, id, map);
  369.  
  370.     if(g_LastRound) {
  371.         enable_event(g_EventNewRound);
  372.         client_print_color(0, print_team_default, "%s ^1Смена карты произойдет в начале следующего раунда.", g_Prefix);
  373.     } else {
  374.         intermission();
  375.     }
  376. }
  377.  
  378. ClearData() {
  379.     g_State = StateNone;
  380.     g_VoteItems = 0;
  381.     g_NextMap[0] = EOS;
  382.     g_MenuInfo[MenuUserId] = 0;
  383.     ArrayClear(g_VoteList);
  384. }
  385.  
  386. __FindSimilarMapByString(string[MAPNAME_LENGTH], Array:maplist) {
  387.     if(maplist == Invalid_Array) {
  388.         return INVALID_MAP_INDEX;
  389.     }
  390.  
  391.     new map_info[MapStruct], end = ArraySize(maplist);
  392.     for(new i; i < end; i++) {
  393.         ArrayGetArray(maplist, i, map_info);
  394.         if(containi(map_info[Map], string) != -1) {
  395.             return i;
  396.         }
  397.     }
  398.  
  399.     return INVALID_MAP_INDEX;
  400. }
  401.  
  402. stock RemoveColorTags(string[], const length) {
  403.     static const color_tags[][] = { "^1", "^3", "^4" };
  404.     for(new i; i < sizeof color_tags; i++) {
  405.         replace_string(string, length, color_tags[i], "", false);
  406.     }
  407. }
  408.  
  409. stock __ConsolePrintEx(const id, const message[], any:...) {
  410.     static _string[126];
  411.     vformat(_string, charsmax(_string), message, 3);
  412.     RemoveColorTags(_string, charsmax(_string));
  413.     console_print(id, _string);
  414. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top