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

Map Manager by Mistrick[1.2.2][23.06.2014]

Плагины для AMX Mod X, которые не удовлетворяют правилам оформления.

Модератор: Leonidddd

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

Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение Mistrick » 27 окт 2013, 19:14

Автор: Mistrick
Версия: 1.2.2

Описание:
Расширенный менеджер карт

Возможности:
- Досрочное голосование(rtv)
- Номинация карт
- Продление карты
- Вывод меню со списком карт
- Блокировка прошлых карт

Требования:
- АМХХ 1.8.2 и выше

Квары:
  • mm_loadmapstype(def: 1) - тип загрузки карт, 0 - берет все карты из папки maps, 1 - берет карты из файла(указывается в переменной FILE_MAPS)
  • mm_changemap(def: 1) - когда менять карту после голосования, 0 - сразу после, 1 - в конце раунда, 2 - в конце карты(timeleft == 0)
  • mm_changemap_rounds(def: 0) - через сколько раундов вызвать голосование, 0 - выключить
  • mm_timestartvote_before_end(def: 2) - за сколько минут перед концом карты вызвать голосование
  • mm_timestartvote(def: 20) - через сколько минут вызвать госование, если время карты неограничено(mp_timelimit 0)
  • mm_showselects(def: 0) - вывод в чат информации о голосовании, 0 - выключить, 1 - всем, 2 - только себе
  • mm_show_result_aftervote(def: 1) - продолжать показывать информацию, после того как игрок проголосует, 0 - выключить
  • mm_showresulttype(def: 0) - как выводить информацию, после того как игрок проголосует, 0 - меню, 1 - худ
  • mm_extendedtime(def: 15) - время подления карты в минутах
  • mm_extendedmap_max(def: 3) - максимальное число раз продления карты
  • mm_menustopvote(def: 0) - позволяет админу отменить голосование в меню выбора карты, 0 - выключить, 1 - включить
  • mm_rtv_enable(def: 1) - включить/выключить досрочное голосование
  • mm_rtv_percent(def: 60) - количество игроков, необходимое для досрочного голосования, в процентах
  • mm_rtv_change(def: 0) - когда менять карту после rtv, 0 - сразу после, 1 - в конце раунда
  • mm_rtv_delay(def: 0) - задержка для возможности досрочного голосования в минутах
  • mm_rtv_beforeendblock(def: 0) - блокировка рвт в конце карты за N минут
  • mm_rtv_show(def: 1) - вывод информации о том, кто хочет досрочное госование, 0 - всем, 1 - себе
  • mm_debug(def: 0) - логирование действий плагина, 0 - выключить, 1 - включить

Настраиваемые макросы:
  • #define SELECT_MAPS 5 - число карт в голосовании(максимум: 8)
  • #define VOTE_TIME 15 - время голосования в секундах
  • #define SOUND_TIME 10 - отсчет до голосования в секундах
  • #define NOMINATE_MAX 3 - число номинированных карт в голосовании
  • #define NOMINATE_PLAYER_MAX 3 - максимальное количество карт, которые может номинировать игрок
  • #define MAP_BLOCK 10 - число, на которое блокируется прошлая карта от голосования
  • #define HUD_RESULT_COLOR 0, 55, 255 - цвет худа при mm_showresulttype 1
  • new g_szPrefixes[][] = {"deathrun_", "speedrun_", "de_", "surf_"}; - префиксы для быстрой номинации

Команды:
  • nextmap, currentmap, timeleft, rtv, ff(чат)
  • maps(чат) - вывод меню со списком карт
  • mm_startvote(консоль) - запуск голосования администратором
  • mm_stopvote(консоль) - отмена голосования администратором

История версий:
1.2.2
- Добавлен квар: mm_rtv_beforeendblock
- Фикс таймера после отмены голосования

1.2.1
- Недокументированные правки

1.2.0
- Добавлен макрос: SOUND_TIME(def: 10)
- Добавлен квар: mm_menustopvote(def: 0)

1.1.0 - 1.1.4
- Добавлены форварды для сабплагинов: mapmanager_startvote(), mapmanager_finishvote()
- Добавлен квар: mm_debug(def: 0)
- Убран квар mm_timelimit
- Добавлена команда отмены голосования(mm_stopvote)
- Фикс потенциальных повисаний сервера
- Добавлен квар mm_rtv_enable(def: 1)
- Фикс номинации
- Правка ртв
- Правка отмены голосования
- Правка загрузки карт

1.0.1 - 1.0.3
- Смена расположения файла для блокировки карт
- Добавлена команда ff
- Изменены координаты худа для мертвых игроков

1.0[Выход из беты]
- Добавлен квар "mm_show_result_aftervote" "1"//0 - disable, 1 - enable
Позволяет выключить вывод результатов после голосования
- Добавлена возможность убрать номинацию(опять написав карту в чат или через команду maps)
- Добавлен отсчет перед сменой карты(при mm_changemap 2)
- Совместимость с ColorChat(AMXX 1.8.3)
- Фикс отображения процентов(при mm_showresulttype 1)
- Убран словарь

1.8beta
- Фикс ошибок и оптимизация.

1.7beta
- Добавлен квар
"mm_rtv_show" "1"//0 - all, 1 - self(вывод сообщений при рвт)
- Фикс логических ошибок

1.6beta
- Добавлены квары:
"mm_showresulttype" "0"//Тип вывода информации после голосования 0 - menu, 1 - hud(проценты не показывает, а формировать отдельный текст не хочу)
"amx_nextmap"
- Изменил смену карты, берет из квара "amx_nextmap", а не по индексу массива
- Фиксы и логические правки

1.5beta
- Добавлен квар
"mm_timestartvote_before_end" "2"//minutes
время с конца карты, когда начать голосование(def: за 2 минуты)
- Фикс: номинация текущей карты
- Фикс: зацикливание при числе заблокированных карт > числа загруженных карт
- И другие мелкие фиксы

1.4beta
- Оптимизация и мелкие фиксы

1.3beta
- Добавил timeleft, currentmap, nextmap
- Блокировка прошедших карт(#define MAP_BLOCK 10)
- Мелкие фиксы

1.2beta
- Добавлен мультиланг

1.1beta
- Фикс: возможность номинирования текущей карты
- Сменил переключение карты на новый раунд
- Добавил меню карт для номинации
- Мелкие логические фиксы
- Добавлены квары:
- "mm_showselects" "0"//0 - disable, 1 - all, 2 - self
- "mm_changemap_rounds" "0"// 0 - disable

1.0beta
- Первый релиз

Примечание:
Компилировать локально с прикрепленным инклюдом цветного чата, если у вас АМХХ 1.8.3 последних версий, то инклюд не потребуется.
Не забудьте выключить прочие менеджеры карт и пару стандартных плагинов.
Код: Выделить всё
; Map related
;nextmap.amxx; displays next map in mapcycle
;mapchooser.amxx; allows to vote for next map
;timeleft.amxx; displays time left on map

Скрин:
maps1.png

Если вас беспокоит блокировка выбора оружия поставте значения кваров либо mm_show_result_aftervote 0, либо mm_show_result_aftervote 1, mm_showresulttype 1.

mapmanager_ru.sma

Пример использования форвардов основного плагина, замораживает игроков во время голосования, не обязателен.
mapmanager_subplugin.sma

colorchat.inc



Не утверждено. Прекращена поддержка этой версии //Leonidddd
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Mistrick 23 июн 2014, 15:28, всего редактировалось 36 раз(а).
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Map Manager by Mistrick[1.11.2013]

Сообщение Touch Dev1l » 03 ноя 2013, 17:11

LYlink, да напиши ты нормальное описание. Это русское сообщество по скриптингу, а не английское.
Аватара пользователя
Touch Dev1l
 
Сообщения: 1304
Зарегистрирован: 14 апр 2013, 13:50
Забанен
Благодарил (а): 126 раз.
Поблагодарили: 254 раз.

Re: Map Manager by Mistrick[1.11.2013]

Сообщение qpAHToMAS » 04 ноя 2013, 18:22

Кстати, с тех пор как используется "spk" для воспроизведения звуков, их не надо прекешить, они же стандартные...

Еще проскакивает идея для команды-аналога amx_nextmap, не той, которая меняет карту, а которая задает следующую карту (amx_nextmap "de_inferno").
Что-то типа mm_setnextmap?

LYlink, да напиши ты нормальное описание. Это русское сообщество по скриптингу, а не английское.

По-моему это не приоритет сейчас :).
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Map Manager by Mistrick[4.11.2013]

Сообщение Mistrick » 04 ноя 2013, 19:02

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

Обновил плагин.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Map Manager by Mistrick[4.11.2013]

Сообщение Touch Dev1l » 04 ноя 2013, 19:20

От души, отличная голосовалка)
Спасибо, что добавил квар, который я просил :-D
Аватара пользователя
Touch Dev1l
 
Сообщения: 1304
Зарегистрирован: 14 апр 2013, 13:50
Забанен
Благодарил (а): 126 раз.
Поблагодарили: 254 раз.

Re: Map Manager by Mistrick[4.11.2013]

Сообщение qpAHToMAS » 15 ноя 2013, 16:06

Хочу добавить "say /previousmap" команду (типа "say /currentmap"). Как лучше поступить? Подозреваю, что проще как-то использовать существующий FILE_LASTMAPS.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Map Manager by Mistrick[4.11.2013]

Сообщение Mistrick » 15 ноя 2013, 16:14

qpAHToMAS, в этом массиве данные о ластмапс, выводи как хочешь. Только в /maps уже показывает эти данные.
[pawn]
  1. new g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA];
[/pawn]
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Map Manager by Mistrick[4.11.2013]

Сообщение mekkee » 15 ноя 2013, 21:50

[pawn]
  1. #include <amxmodx>

  2. #include <colorchat>

  3.  

  4. #pragma semicolon 1

  5. #define PLUGIN "Map Manager"

  6. #define VERSION "1.5beta"

  7. #define AUTHOR "Mistrick"

  8. #define SELECT_MAPS 5// MAX 8

  9. #define VOTE_TIME 15

  10. #define NOMINATE_MAX 3

  11. #define NOMINATE_PLAYER_MAX 3

  12. #define MAP_BLOCK 5

  13. #define TASK_VOTEMENU 100

  14. #define FILE_MAPS "addons/amxmodx/configs/maps.ini"

  15. #define FILE_LASTMAPS "addons/amxmodx/configs/rtv/lastmaps.ini"

  16. #define PREFIX "[GTS-INFO]"

  17.  

  18. enum _:BLOCKED_DATA

  19. {

  20.         MAP[33],

  21.         COUNT

  22. }

  23. new Array:MapsArray;

  24. new Array:NominateArray;

  25.  

  26. new g_pLoadMaps;

  27. new g_pChangeMap;

  28. new g_pChangeMapRounds;

  29. new g_pShowSelects;

  30. new g_pTimeLimitMM;

  31. new g_pTimeStartVote;

  32. new g_pTimeStartVoteBeforeEnd;

  33. new g_pTimeLimit;

  34. new g_pExendedMax;

  35. new g_pExendedTime;

  36. new g_pRockChange;

  37. new g_pRockPercent;

  38. new g_pRockDelay;

  39.  

  40. new g_iExtendedMax;

  41.  

  42. new bool:g_bBeInVote;

  43. new bool:g_bVoteFinished;

  44.  

  45. new g_iVote[SELECT_MAPS + 1];

  46. new g_iInMenu[SELECT_MAPS];

  47.  

  48. new g_szInMenuMapName[SELECT_MAPS][33];

  49.  

  50. new g_iTotal;

  51. new g_iVoteTime;

  52.  

  53. new bool:g_bHasVote[33];

  54.  

  55. new g_VotedMapId = -1;

  56.  

  57. new g_iStartPlugin;

  58.  

  59. new bool:g_bStartVote;

  60.  

  61. new bool:g_bRockVote;

  62. new bool:g_bRockVoted[33];

  63. new g_iRockVote;

  64.  

  65. new g_iNominatedMaps[33];

  66.  

  67. new g_szCurrentMap[33];

  68. new g_iLoadMaps;

  69.  

  70. new g_iRound;

  71.  

  72. new g_szPrefixes[][] = {"deathrun_", "speedrun_"};

  73.  

  74. new g_szSound[][] =

  75. {

  76.         "",     "fvox/one.wav", "fvox/two.wav", "fvox/three.wav", "fvox/four.wav", "fvox/five.wav",

  77.         "fvox/six.wav", "fvox/seven.wav", "fvox/eight.wav",     "fvox/nine.wav", "fvox/ten.wav",

  78.         "Gman/Gman_Choose2.wav"

  79. };

  80.  

  81. new g_iPage[33];

  82.  

  83. new g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA];

  84.  

  85. public plugin_init()

  86. {

  87.         register_plugin(PLUGIN, VERSION, AUTHOR);

  88.         register_dictionary("map_manager.txt");

  89.        

  90.         g_pLoadMaps = register_cvar("mm_loadmapstype", "1");//0 - load all maps from maps folder, 1 - load maps from file

  91.         g_pChangeMap = register_cvar("mm_changemap", "1");//0 - after end vote, 1 - in round end, 2 - after end map

  92.         g_pChangeMapRounds = register_cvar("mm_changemap_rounds", "0");// 0 - disable

  93.         g_pTimeLimitMM = register_cvar("mm_timelimit", "30");//duration of map(minutes)

  94.         g_pTimeStartVoteBeforeEnd = register_cvar("mm_timestartvote_before_end", "2");//minutes

  95.         g_pTimeStartVote = register_cvar("mm_timestartvote", "20");//if timelimit == 0

  96.         g_pShowSelects = register_cvar("mm_showselects", "0");//0 - disable, 1 - all, 2 - self

  97.         g_pExendedTime = register_cvar("mm_extendedtime", "15");//minutes

  98.         g_pExendedMax = register_cvar("mm_extendedmap_max", "3");

  99.        

  100.         g_pRockPercent = register_cvar("mm_rtv_percent", "60");

  101.         g_pRockChange = register_cvar("mm_rtv_change", "0");//0 - after vote, 1 - in round end

  102.         g_pRockDelay = register_cvar("mm_rtv_delay", "0");//minutes

  103.        

  104.         g_pTimeLimit = get_cvar_pointer("mp_timelimit");

  105.        

  106.         register_concmd("mm_debug", "CmdDebug", ADMIN_MAP);

  107.         register_clcmd("mm_sound", "CmdSound", ADMIN_MAP);

  108.         register_clcmd("mm_startvote", "CmdStartVote", ADMIN_MAP);

  109.         register_clcmd("say maps", "CmdMaps");

  110.         register_clcmd("say /maps", "CmdMaps");

  111.         register_clcmd("say rtv", "CmdRtv");

  112.         register_clcmd("say /rtv", "CmdRtv");

  113.         register_clcmd("say rockthevote", "CmdRtv");

  114.         register_clcmd("say nextmap", "CmdNextmap");

  115.         register_clcmd("say timeleft", "CmdTimeleft");

  116.         register_clcmd("say currentmap", "CmdCurrentMap");

  117.        

  118.         register_clcmd("say", "HookSay");

  119.         register_clcmd("say_team", "HookSay");

  120.        

  121.         register_clcmd("votemap", "CmdVotemap");

  122.        

  123.         register_event("SendAudio", "EventRoundEnd", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw");

  124.         register_event("TextMsg", "EventRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");

  125.         register_event("30", "EventMapEnd", "a");

  126.        

  127.         register_menucmd(register_menuid("Vote_Menu"), 1023, "VoteMenu_Handler");

  128.         register_menucmd(register_menuid("Maps_Menu"), 1023, "MapsMenu_Handler");

  129.        

  130.         g_iStartPlugin = get_systime();

  131.         NominateArray = ArrayCreate(64);

  132.        

  133.         set_task(5.0, "CheckTime", _, _, _, "b");

  134.         set_task(5.0, "SetCvar");

  135.  

  136.         LoadMaps();

  137. }

  138. public plugin_cfg()

  139. {

  140.         if(!file_exists(FILE_LASTMAPS) || !MAP_BLOCK) return PLUGIN_HANDLED;

  141.        

  142.         new TEMP_FILE[] = "addons/amxmodx/configs/rtv/temp.ini";

  143.        

  144.         new file = fopen(FILE_LASTMAPS, "rt");

  145.         new temp = fopen(TEMP_FILE, "wt");

  146.        

  147.         new szBuffer[128], szMap[33], szCount[8], iCount, i = 0;

  148.        

  149.         while(!feof(file))

  150.         {

  151.                 fgets(file, szBuffer, charsmax(szBuffer));

  152.                 parse(szBuffer, szMap, charsmax(szMap), szCount, charsmax(szCount));

  153.                

  154.                 if(Blocked(szMap) || !is_map_valid(szMap)) continue;

  155.                

  156.                 iCount = str_to_num(szCount) - 1;

  157.                

  158.                 if(!iCount) continue;

  159.                

  160.                 if(iCount > MAP_BLOCK)

  161.                 {

  162.                         fprintf(temp, "^"%s^" ^"%d^"^n", szMap, MAP_BLOCK);

  163.                         iCount = MAP_BLOCK;

  164.                 }

  165.                 else

  166.                 {

  167.                         fprintf(temp, "^"%s^" ^"%d^"^n", szMap, iCount);

  168.                 }

  169.                

  170.                 formatex(g_BlockedMaps[i][MAP], charsmax(g_BlockedMaps[][MAP]), szMap);

  171.                 g_BlockedMaps[i][COUNT] = iCount;

  172.                 i++;

  173.                

  174.                 if(i >= MAP_BLOCK) break;

  175.         }

  176.        

  177.         fclose(file);

  178.         fclose(temp);

  179.        

  180.         delete_file(FILE_LASTMAPS);

  181.         while(!rename_file(TEMP_FILE, FILE_LASTMAPS, 1)) {}

  182.        

  183.         return PLUGIN_HANDLED;

  184. }

  185. public plugin_end()

  186. {

  187.         if(get_pcvar_num(g_pLoadMaps) == 1 && !InFile(g_szCurrentMap))

  188.         {

  189.                 return PLUGIN_HANDLED;

  190.         }      

  191.         if(!dir_exists("addons/amxmodx/configs/rtv/"))

  192.         {

  193.                 mkdir("addons/amxmodx/configs/rtv/");

  194.         }

  195.        

  196.         new TEMP_FILE[] = "addons/amxmodx/configs/rtv/temp.ini";

  197.        

  198.         new file = fopen(FILE_LASTMAPS, "rt");

  199.         new temp = fopen(TEMP_FILE, "wt");

  200.        

  201.         new data[128], key[64];

  202.        

  203.         while(!feof(file))

  204.         {

  205.                 fgets(file, data, charsmax(data));

  206.                 parse(data, key, charsmax(key));

  207.                

  208.                 if(equal(key, g_szCurrentMap))

  209.                 {

  210.                         continue;

  211.                 }

  212.                 else

  213.                 {

  214.                         fputs(temp, data);

  215.                 }

  216.         }

  217.        

  218.         fprintf(temp, "^"%s^" ^"%d^"^n", g_szCurrentMap, MAP_BLOCK);

  219.        

  220.         fclose(file);

  221.         fclose(temp);

  222.        

  223.         delete_file(FILE_LASTMAPS);

  224.         while(!rename_file(TEMP_FILE, FILE_LASTMAPS, 1)) {}

  225.        

  226.         return PLUGIN_HANDLED;

  227. }

  228. public client_disconnect(id)

  229. {

  230.         if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU);

  231.         if(g_bRockVoted[id])

  232.         {

  233.                 g_bRockVoted[id] = false;

  234.                 g_iRockVote--;

  235.         }

  236.         if(g_iNominatedMaps[id])

  237.         {

  238.                 ClearNominatedMaps(id);        

  239.         }

  240. }

  241. public SetCvar()

  242. {

  243.         set_pcvar_num(g_pTimeLimit, get_pcvar_num(g_pTimeLimitMM));

  244.         set_cvar_string("mapcyclefile", "");

  245. }

  246. public LoadMaps()

  247. {

  248.         MapsArray = ArrayCreate(33);

  249.         g_iLoadMaps = 0;

  250.        

  251.         get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));

  252.        

  253.         if(file_exists(FILE_MAPS) && get_pcvar_num(g_pLoadMaps))

  254.         {              

  255.                 new szMapName[33];

  256.                                

  257.                 new f = fopen(FILE_MAPS, "rt");

  258.                

  259.                 while(!feof(f))

  260.                 {

  261.                         fgets(f, szMapName, charsmax(szMapName));

  262.                         trim(szMapName);

  263.                         remove_quotes(szMapName);

  264.                        

  265.                         if(!szMapName[0] || szMapName[0] == ';' || szMapName[0] == '/' && szMapName[1] == '/'

  266.                                 || !ValidMap(szMapName) || InArray(szMapName) || equali(szMapName, g_szCurrentMap))

  267.                                 continue;

  268.                                

  269.                         g_iLoadMaps++;

  270.                        

  271.                         ArrayPushString(MapsArray, szMapName);

  272.                 }

  273.         }

  274.         else

  275.         {

  276.                 new dir, len, szFileName[64];

  277.                 new DirName[] = "maps";

  278.                 dir = open_dir(DirName, szFileName, charsmax(szFileName));

  279.  

  280.                 if(dir)

  281.                 {

  282.                         while(next_file(dir, szFileName, charsmax(szFileName)))

  283.                         {

  284.                                 len = strlen(szFileName) - 4;

  285.                                

  286.                                 if(len < 0) continue;

  287.                                

  288.                                 if(equali(szFileName[len], ".bsp") && !equali(szFileName, g_szCurrentMap))

  289.                                 {

  290.                                         szFileName[len] = '^0';

  291.                                        

  292.                                         g_iLoadMaps++;

  293.                                        

  294.                                         ArrayPushString(MapsArray, szFileName);

  295.                                 }

  296.                         }

  297.                         close_dir(dir);

  298.                 }

  299.         }

  300. }

  301. public CheckTime()

  302. {

  303.         if(!g_iLoadMaps || g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED;

  304.        

  305.         static TimeLimit;

  306.         TimeLimit = get_pcvar_num(g_pTimeLimit);

  307.         if(TimeLimit > 2)

  308.         {

  309.                 if(get_systime() - g_iStartPlugin >= (TimeLimit - get_pcvar_num(g_pTimeStartVoteBeforeEnd)) * 60)

  310.                 {

  311.                         StartVote(0);

  312.                 }

  313.         }

  314.         else if(TimeLimit == 0)

  315.         {

  316.                 if(get_systime() - g_iStartPlugin >= get_pcvar_num(g_pTimeStartVote) * 60)

  317.                 {

  318.                         StartVote(0);

  319.                 }

  320.         }

  321.         else if(!g_bStartVote)

  322.         {

  323.                 g_bStartVote = true;

  324.                 set_task(20.0, "StartVote", 0);

  325.         }

  326.        

  327.         return PLUGIN_HANDLED;

  328. }

  329. public EventRoundEnd()

  330. {

  331.         g_iRound++;

  332.         new iCvar = get_pcvar_num(g_pChangeMapRounds);

  333.         if(iCvar && g_iRound >= iCvar)

  334.         {

  335.                 StartVote(0);

  336.         }

  337.         if(g_bVoteFinished && get_pcvar_num(g_pChangeMap) == 1

  338.                 || g_bVoteFinished && g_bRockVote && get_pcvar_num(g_pRockChange) == 1)

  339.         {

  340.                 set_task(5.0, "ChangeLevel");

  341.         }

  342. }

  343. public EventRestart()

  344. {

  345.         g_iRound = 0;

  346. }

  347. public EventMapEnd()

  348. {

  349.         if(g_bVoteFinished)

  350.         {

  351.                 set_task(5.0, "ChangeLevel");

  352.         }

  353. }

  354. public CmdDebug(id, flag)

  355. {

  356.         if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;

  357.        

  358.         new szMapName[64], iMax = ArraySize(NominateArray);

  359.         console_print(id, "MapList");

  360.         for(new i = 0; i < g_iLoadMaps; i++)

  361.         {

  362.                 ArrayGetString(MapsArray, i, szMapName, charsmax(szMapName));

  363.                 console_print(id, "%d - %s", i+1, szMapName);

  364.         }

  365.         console_print(id, "^nNominatedMaps");

  366.         for(new i = 0; i < iMax; i++)

  367.         {

  368.                 ArrayGetString(NominateArray, i, szMapName, charsmax(szMapName));

  369.                 console_print(id, "%d - %s", i+1, szMapName);

  370.         }

  371.         console_print(id, "^nBlockedMaps");

  372.         for(new i = 0; i < MAP_BLOCK; i++)

  373.         {

  374.                 console_print(id, "%s - %d", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]);

  375.         }

  376.         return PLUGIN_HANDLED;

  377. }

  378. public CmdSound(id, flag)

  379. {

  380.         if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;

  381.        

  382.         set_task(1.0, "SoundTimer", _, _, _, "a", 10);

  383.        

  384.         return PLUGIN_HANDLED;

  385. }

  386. public CmdVotemap(id)

  387. {

  388.         return PLUGIN_HANDLED;

  389. }

  390. public CmdStartVote(id, flag)

  391. {

  392.         if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;

  393.        

  394.         StartVote(id);

  395.        

  396.         return PLUGIN_HANDLED;

  397. }

  398. public CmdMaps(id)

  399. {

  400.         ShowMapsMenu(id, g_iPage[id] = 0);

  401. }

  402. public ShowMapsMenu(id, iPage)

  403. {

  404.         if(iPage < 0) return PLUGIN_HANDLED;

  405.        

  406.         new iMax = ArraySize(MapsArray);

  407.         new i = min(iPage * 8, iMax);  

  408.         new iStart = i - (i % 8);      

  409.         new iEnd = min(iStart + 8, iMax);

  410.        

  411.         iPage = iStart / 8;

  412.         g_iPage[id] = iPage;

  413.        

  414.         new szMenu[512], iLen = 0, iLen_Max = charsmax(szMenu), szMapName[32];

  415.        

  416.         iLen = formatex(szMenu, iLen_Max, "\y%L \w[%d/%d]^n", id, "MM_LISTMAP", iPage + 1, ((iMax - 1) / 8) + 1);

  417.        

  418.         new Keys, Item, iBlock;

  419.        

  420.         for (i = iStart; i < iEnd; i++)

  421.         {              

  422.                 ArrayGetString(MapsArray, i, szMapName, charsmax(szMapName));

  423.                 iBlock = Blocked(szMapName);

  424.                

  425.                 if(iBlock)

  426.                 {

  427.                         iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\r%d\d]", ++Item, szMapName, iBlock);

  428.                 }

  429.                 else if(IsNominated(szMapName))

  430.                 {

  431.                         iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\y%L\d]", ++Item, szMapName, id, "MM_MENU_NOMINATED");

  432.                 }

  433.                 else

  434.                 {

  435.                         Keys |= (1 << Item);

  436.                         iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s", ++Item, szMapName);

  437.                 }              

  438.         }

  439.         while(Item <= 8)

  440.         {

  441.                 Item++;

  442.                 iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n");

  443.         }

  444.         if (iEnd < iMax)

  445.         {

  446.                 Keys |= (1 << 8)|(1 << 9);             

  447.                 formatex(szMenu[iLen], iLen_Max - iLen, "^n\r9.\w %L^n\r0.\w %L", id, "MM_MENU_NEXT", id, iPage ? "MM_MENU_BACK" : "MM_MENU_EXIT");

  448.         }

  449.         else

  450.         {

  451.                 Keys |= (1 << 9);

  452.                 formatex(szMenu[iLen], iLen_Max - iLen, "^n^n\r0.\w %L", id, iPage ? "MM_MENU_BACK" : "MM_MENU_EXIT");

  453.         }

  454.         show_menu(id, Keys, szMenu, -1, "Maps_Menu");

  455.         return PLUGIN_HANDLED; 

  456. }

  457. public MapsMenu_Handler(id, key)

  458. {

  459.         switch (key)

  460.         {

  461.                 case 8: ShowMapsMenu(id, ++g_iPage[id]);

  462.                 case 9: ShowMapsMenu(id, --g_iPage[id]);

  463.                 default:

  464.                 {                      

  465.                         new szMapName[33];

  466.                         ArrayGetString(MapsArray, key + g_iPage[id] * 8, szMapName, charsmax(szMapName));

  467.                         NominateMap(id, szMapName);

  468.                 }

  469.         }

  470. }

  471. public CmdRtv(id)

  472. {

  473.         if(g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED;

  474.        

  475.         if(get_systime() - g_iStartPlugin < get_pcvar_num(g_pRockDelay) * 60)

  476.         {

  477.                 new szMin[16], iMin = 1 + (get_pcvar_num(g_pRockDelay) * 60 - (get_systime() - g_iStartPlugin)) / 60;

  478.                 get_ending(iMin, "MM_MIN1", "MM_MIN2", "MM_MIN3", szMin, charsmax(szMin));

  479.                 ColorChat(id, GREEN, "%s^1 %L %d %L.", PREFIX, id, "MM_RTV_CANT", iMin, id, szMin);

  480.                 return PLUGIN_HANDLED;

  481.         }

  482.        

  483.         if(!g_bRockVoted[id])

  484.         {

  485.                 g_bRockVoted[id] = true;

  486.                 g_iRockVote++;

  487.                

  488.                 new iVote = floatround(get_playersnum() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;

  489.                

  490.                 if(iVote)

  491.                 {

  492.                         new szVote[16];

  493.                         get_ending(iVote, "MM_VOTE1", "MM_VOTE2", "MM_VOTE3", szVote, charsmax(szVote));

  494.                         ColorChat(id, GREEN, "%s^1 %L %d %L.", PREFIX, id, "MM_RTV_VOTE", iVote, id, szVote);

  495.                 }

  496.                 else

  497.                 {

  498.                         ColorChat(0, GREEN, "%s^1 %L.", PREFIX, LANG_PLAYER, "MM_RTV_START");

  499.                 }

  500.                

  501.                 if(floatround(g_iRockVote * 100.0 / get_playersnum()) >= get_pcvar_num(g_pRockPercent))

  502.                 {

  503.                         g_bRockVote = true;

  504.                         StartVote(0);

  505.                 }

  506.         }

  507.         else

  508.         {

  509.                 new iVote = floatround(get_playersnum() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;

  510.                 new szVote[16];

  511.                 get_ending(iVote, "MM_VOTE1", "MM_VOTE2", "MM_VOTE3", szVote, charsmax(szVote));

  512.                 ColorChat(id, GREEN, "%s^1 %L %d %L.", PREFIX, id, "MM_RTV_VOTED", iVote, id, szVote);

  513.         }

  514.        

  515.         return PLUGIN_HANDLED;

  516. }

  517. public CmdNextmap(id)

  518. {

  519.         if(g_VotedMapId == -1)

  520.         {

  521.                 ColorChat(0, BLUE, "^4%s^1 %L.", PREFIX, LANG_PLAYER, "MM_NEXTMAP_NONE");

  522.         }

  523.         else

  524.         {

  525.                 ColorChat(0, BLUE, "^4%s^1 %L ^3%s^1.", PREFIX, LANG_PLAYER, "MM_NEXTMAP", g_szInMenuMapName[g_VotedMapId]);

  526.         }

  527. }

  528. public CmdTimeleft(id)

  529. {

  530.         if (get_pcvar_float(g_pTimeLimit))

  531.         {

  532.                 new a = get_timeleft();

  533.  

  534.                 ColorChat(0, GREEN, "%s^1 %L %d:%02d", PREFIX, LANG_PLAYER, "MM_TIME_LEFT", (a / 60), (a % 60));

  535.         }

  536.         else

  537.         {

  538.                 ColorChat(0, GREEN, "%s^1 %L.", LANG_PLAYER, "MM_NO_T_LIMIT");

  539.         }

  540. }

  541. public CmdCurrentMap(id)

  542. {

  543.         ColorChat(0, BLUE, "^4%s^1 %L^3 %s", PREFIX, LANG_PLAYER, "MM_CURRENT_MAP", g_szCurrentMap);

  544. }

  545. public HookSay(id)

  546. {

  547.         new szText[128];

  548.         read_args(szText, charsmax(szText));

  549.         remove_quotes(szText);

  550.         trim(szText);

  551.         if(InArray(szText))

  552.         {

  553.                 NominateMap(id, szText);

  554.         }

  555.         else

  556.         {

  557.                 for(new i = 0; i < sizeof(g_szPrefixes); i++)

  558.                 {

  559.                         format(szText, charsmax(szText), "%s%s", g_szPrefixes[i], szText);

  560.                         if(InArray(szText))

  561.                         {

  562.                                 NominateMap(id, szText);

  563.                                 break;

  564.                         }

  565.                 }

  566.         }

  567. }

  568. public NominateMap(id, map[])

  569. {

  570.         if(g_bVoteFinished || equali(map, g_szCurrentMap))

  571.         {

  572.                 return PLUGIN_HANDLED;

  573.         }

  574.         if(g_bBeInVote)

  575.         {

  576.                 ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_NOMINATE_IN_VOTE");

  577.                 return PLUGIN_HANDLED;

  578.         }

  579.         if(g_iNominatedMaps[id] == NOMINATE_PLAYER_MAX)

  580.         {

  581.                 ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_NOMINATE_CANT");

  582.                 return PLUGIN_HANDLED;

  583.         }

  584.         if(Blocked(map))

  585.         {

  586.                 ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_NOMINATE_MAP_BLOCKED");

  587.                 return PLUGIN_HANDLED;

  588.         }

  589.         if(IsNominated(map))

  590.         {

  591.                 ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_NOMINATED");

  592.                 return PLUGIN_HANDLED;

  593.         }      

  594.        

  595.         new szMap[33], i;

  596.         for(i = 0; i < g_iLoadMaps; i++)

  597.         {

  598.                 ArrayGetString(MapsArray, i, szMap, charsmax(szMap));

  599.                 if(equali(map, szMap))

  600.                 {

  601.                         break;

  602.                 }

  603.         }

  604.                

  605.         new szText[64];

  606.         formatex(szText, charsmax(szText), "^"%d^" ^"%d^" ^"%s^"", id, i, map);

  607.         ArrayPushString(NominateArray, szText);

  608.        

  609.         g_iNominatedMaps[id]++;

  610.         new szName[33];

  611.         get_user_name(id, szName, charsmax(szName));

  612.         ColorChat(0, BLUE, "^4%s^3 %s^1 %L^3 %s^1.", PREFIX, szName, id, "MM_NOMINATE_VOTED", map);

  613.        

  614.         return PLUGIN_HANDLED;

  615. }

  616. public StartVote(id)

  617. {

  618.         if(!g_iLoadMaps)

  619.         {

  620.                 if(id) ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_DONT_HAVE_VALIDMAP");

  621.                 return PLUGIN_HANDLED;

  622.         }

  623.         if(g_bBeInVote)

  624.         {

  625.                 if(id) ColorChat(id, GREEN, "%s^1 %L.", PREFIX, id, "MM_IN_VOTE");

  626.                 return PLUGIN_HANDLED;

  627.         }

  628.        

  629.         g_bBeInVote = true;

  630.        

  631.         arrayset(g_iVote, 0, SELECT_MAPS + 1);

  632.         arrayset(g_iInMenu, -1, SELECT_MAPS);

  633.         arrayset(g_bHasVote, false, 33);

  634.         g_iTotal = 0;

  635.        

  636.        

  637.         new Num,  NomInMenu = 0, szNom[64], szID[3], szIX[6];

  638.         new iMax = 8, Limits[2];

  639.        

  640.         Limits[0] = SELECT_MAPS;

  641.         Limits[1] = g_iLoadMaps - BlockedCount();

  642.        

  643.         if(Limits[1] <= 0)

  644.         {

  645.                 Limits[1] = 8;

  646.                 ClearNomList();

  647.         }

  648.        

  649.         for(new i = 0; i < sizeof(Limits); i++)

  650.         {

  651.                 if(iMax > Limits[i]) iMax = Limits[i];

  652.         }

  653.        

  654.         new NomMax, NomNum = ArraySize(NominateArray);

  655.         NomMax = NomNum > NOMINATE_MAX ? NOMINATE_MAX : NomNum;

  656.        

  657.        

  658.         for(new i = 0; i < iMax; i++)

  659.         {

  660.                

  661.                 if(NomInMenu < NomMax)

  662.                 {

  663.                         Num = random_num(0, NomNum - 1);

  664.                        

  665.                         while(InMenu(Num, 1))

  666.                         {

  667.                                 Num = random_num(0, NomNum - 1);

  668.                         }              

  669.                        

  670.                         ArrayGetString(NominateArray, Num, szNom, charsmax(szNom));

  671.                         parse(szNom, szID, charsmax(szID), szIX, charsmax(szIX), g_szInMenuMapName[i], charsmax(g_szInMenuMapName[]));

  672.                         g_iInMenu[i] = str_to_num(szIX);

  673.                         NomInMenu++;

  674.                 }

  675.                 else

  676.                 {

  677.                         Num = random_num(0, g_iLoadMaps - 1);

  678.                        

  679.                         while(InMenu(Num) || IsBlocked(Num))

  680.                         {

  681.                                 Num = random_num(0, g_iLoadMaps - 1);

  682.                         }

  683.                        

  684.                         g_iInMenu[i] = Num;

  685.                         ArrayGetString(MapsArray, Num, g_szInMenuMapName[i], 32);

  686.                 }              

  687.         }

  688.                

  689.         set_task(1.0, "SoundTimer", 1111, _, _, "a", 10);

  690.         set_task(11.0, "ShowMenu", 1112);

  691.        

  692.         return PLUGIN_HANDLED;

  693. }

  694. public SoundTimer()

  695. {

  696.         static Timer;

  697.         if(Timer == 0) Timer = 10;

  698.        

  699.         new szSec[16];

  700.         get_ending(Timer, "MM_SEC1", "MM_SEC2", "MM_SEC3", szSec, charsmax(szSec));

  701.        

  702.         set_hudmessage(50, 255, 50, -1.0, 0.8, 0, 0.0, 1.0, 0.0, 0.0, 1);

  703.         show_hudmessage(0, "%L %d %L!", LANG_PLAYER, "MM_VOTE_IN", Timer, LANG_PLAYER, szSec);

  704.        

  705.         client_cmd(0, "spk %s", g_szSound[Timer]);

  706.         Timer--;

  707. }

  708. public ShowMenu()

  709. {

  710.         new Players[32], pNum;

  711.         get_players(Players, pNum, "ch");

  712.        

  713.         g_iVoteTime = VOTE_TIME;

  714.        

  715.         set_task(1.0, "Timer", 999, _, _, "a", VOTE_TIME+1);

  716.        

  717.         for(new i = 0; i < pNum; i++)

  718.         {

  719.                 VoteMenu(i + TASK_VOTEMENU);

  720.                 set_task(1.0, "VoteMenu", Players[i] + TASK_VOTEMENU, _, _, "a", VOTE_TIME+1);

  721.         }

  722.        

  723.         client_cmd(0, "spk %s", g_szSound[11]);

  724. }

  725. public VoteMenu(id)

  726. {

  727.         id -= TASK_VOTEMENU;

  728.                

  729.         if(g_iVoteTime == 0)

  730.         {

  731.                 show_menu(id, 0, "^n", 1);

  732.                

  733.                 if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU);

  734.                 return PLUGIN_HANDLED;

  735.         }

  736.        

  737.         new szMenu[512], len = 0;

  738.        

  739.         len = formatex(szMenu[len], charsmax(szMenu) - len, "\y%L:^n^n", id, "MM_CHOOSE_MAP");

  740.        

  741.         new Key, percent, i, iMax = MapsInMenu();

  742.        

  743.         for(i = 0; i < iMax; i++)

  744.         {              

  745.                 percent = 0;

  746.                 if(g_iTotal)

  747.                 {

  748.                         percent = floatround(g_iVote[i]*100.0/g_iTotal);

  749.                 }

  750.                

  751.                 if(!g_bHasVote[id])

  752.                 {

  753.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_szInMenuMapName[i], percent);

  754.                         Key |= (1 << i);               

  755.                 }

  756.                 else

  757.                 {

  758.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s[\r%d%%\d]^n", g_szInMenuMapName[i], percent);

  759.                 }              

  760.         }

  761.         if(!g_bRockVote && get_pcvar_num(g_pTimeLimitMM) != 0 && g_iExtendedMax < get_pcvar_num(g_pExendedMax))

  762.         {

  763.                 percent = 0;

  764.                 if(g_iTotal)

  765.                 {

  766.                         percent = floatround(g_iVote[i]*100.0/g_iTotal);

  767.                 }

  768.                

  769.                 if(!g_bHasVote[id])

  770.                 {

  771.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d.\w %s\d[\r%d%%\d]\y[%L]^n", i + 1, g_szCurrentMap, percent, id, "MM_EXTEND");     

  772.                         Key |= (1 << i);               

  773.                 }

  774.                 else

  775.                 {

  776.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%s[\r%d%%\d]\y[%L]^n", g_szCurrentMap, percent, id, "MM_EXTEND");

  777.                 }

  778.         }

  779.        

  780.         new szSec[16];

  781.         get_ending(g_iVoteTime, "MM_SEC1", "MM_SEC2", "MM_SEC3", szSec, charsmax(szSec));

  782.         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%L \r%d\d %L", id, "MM_REMAINED",g_iVoteTime, id, szSec);

  783.        

  784.         if(!Key) Key |= (1 << 9);

  785.        

  786.         show_menu(id, Key, szMenu, -1, "Vote_Menu");

  787.        

  788.         return PLUGIN_HANDLED;

  789. }

  790. public VoteMenu_Handler(id, key)

  791. {

  792.         if(g_bHasVote[id])

  793.         {

  794.                 VoteMenu(id+TASK_VOTEMENU);

  795.                 return PLUGIN_HANDLED;

  796.         }

  797.        

  798.         g_iVote[key]++;

  799.         g_iTotal++;

  800.        

  801.         g_bHasVote[id] = true;

  802.        

  803.         new iCvar = get_pcvar_num(g_pShowSelects);

  804.         if(iCvar)

  805.         {

  806.                 new szName[32];

  807.                 get_user_name(id, szName, charsmax(szName));

  808.                 if(key == SELECT_MAPS)

  809.                 {

  810.                         switch(iCvar)

  811.                         {

  812.                                 case 1: ColorChat(0, NORMAL, "^4%s^1 ^3%s^1 %L.", PREFIX, szName, LANG_PLAYER, "MM_VOTE_EXTENDED1");

  813.                                 case 2: ColorChat(id, NORMAL, "^4%s^1 %L.", PREFIX, id, "MM_VOTE_EXTENDED2");

  814.                         }

  815.                 }

  816.                 else

  817.                 {

  818.                         switch(iCvar)

  819.                         {

  820.                                 case 1: ColorChat(0, NORMAL, "^4%s^1 ^3%s^1 %L ^3%s^1.", PREFIX, szName, LANG_PLAYER, "MM_VOTED1",g_szInMenuMapName[key]);

  821.                                 case 2: ColorChat(id, NORMAL, "^4%s^1 %L ^3%s^1.", PREFIX, id, "MM_VOTED2", g_szInMenuMapName[key]);

  822.                         }

  823.                 }

  824.         }

  825.        

  826.         VoteMenu(id+TASK_VOTEMENU);

  827.         return PLUGIN_HANDLED;

  828. }              

  829. public Timer()

  830. {

  831.         g_iVoteTime--;

  832.        

  833.         if(g_iVoteTime == 0)

  834.         {

  835.                 show_menu(0, 0, "^n", 1);

  836.                 FinishVote();

  837.                 if(task_exists(999)) remove_task(999);

  838.         }

  839. }

  840. public FinishVote()

  841. {

  842.         new MaxVote = 0, iMax = g_bRockVote ? MapsInMenu() : MapsInMenu() + 1;

  843.         for(new i = 1; i < iMax ; i++)

  844.         {

  845.                 if(g_iVote[MaxVote] < g_iVote[i])

  846.                 {

  847.                         MaxVote = i;

  848.                 }

  849.         }

  850.        

  851.         g_bBeInVote = false;

  852.         g_bVoteFinished = true;

  853.         g_bStartVote = false;

  854.                

  855.         if(MaxVote != SELECT_MAPS)

  856.         {

  857.                 if(g_iTotal)

  858.                 {

  859.                         ColorChat(0, BLUE, "^4%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MM_NEXTMAP", g_szInMenuMapName[MaxVote]);

  860.                 }

  861.                 else

  862.                 {

  863.                         MaxVote = random_num(0, MapsInMenu() - 1);

  864.                         ColorChat(0, BLUE, "^4%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MM_VOTE_NOBODY", g_szInMenuMapName[MaxVote]);

  865.                 }

  866.        

  867.                 g_VotedMapId = MaxVote;

  868.                

  869.                 if(g_bRockVote && get_pcvar_num(g_pRockChange) == 0 || get_pcvar_num(g_pChangeMap) == 0)

  870.                 {

  871.                         ColorChat(0, GREEN, "%s^1 %L.", PREFIX, LANG_PLAYER, "MM_VOTE_MAPCHANGE1");

  872.                         set_task(10.0, "ChangeLevel");

  873.                 }

  874.                 else if(g_bRockVote && get_pcvar_num(g_pRockChange) == 1 || get_pcvar_num(g_pChangeMap) == 1)

  875.                 {

  876.                         ColorChat(0, GREEN, "%s^1 %L.", PREFIX, LANG_PLAYER, "MM_VOTE_MAPCHANGE2");

  877.                 }

  878.         }

  879.         else

  880.         {

  881.                 g_bVoteFinished = false;

  882.                 g_iExtendedMax++;

  883.                 new szMin[16], iMin = get_pcvar_num(g_pExendedTime);

  884.                 get_ending(iMin, "MM_MIN1", "MM_MIN2", "MM_MIN3", szMin, charsmax(szMin));

  885.                 ColorChat(0, GREEN, "%s^1 %L %d %s.", PREFIX, LANG_PLAYER, "MM_VOTE_EXTEND", iMin, LANG_PLAYER, szMin);

  886.                 set_cvar_num("mp_timelimit", get_pcvar_num(g_pTimeLimit) + iMin);

  887.         }

  888. }

  889. public ChangeLevel()

  890. {

  891.         server_cmd("changelevel %s", g_szInMenuMapName[g_VotedMapId]);

  892. }

  893. stock bool:ValidMap(mapname[])

  894. {

  895.         if(is_map_valid(mapname))

  896.         {

  897.                 return true;

  898.         }

  899.        

  900.         new len = strlen(mapname) - 4;

  901.        

  902.         if(len < 0)

  903.         {

  904.                 return false;

  905.         }

  906.         if(equali(mapname[len], ".bsp"))

  907.         {

  908.                 mapname[len] = '^0';

  909.                

  910.                 if(is_map_valid(mapname))

  911.                 {

  912.                         return true;

  913.                 }

  914.         }

  915.        

  916.         return false;

  917. }

  918. stock bool:InMenu(Num, nom = 0)

  919. {

  920.         if(nom)

  921.         {

  922.                 new szText[48], szID[3], szIX[6], szMap[33];

  923.                 ArrayGetString(NominateArray, Num, szText, charsmax(szText));

  924.                 parse(szText, szID, charsmax(szID), szIX, charsmax(szIX), szMap, charsmax(szMap));

  925.                

  926.                 for(new i = 0; i < SELECT_MAPS && i < 8; i++)

  927.                 {

  928.                         if(equali(g_szInMenuMapName[i], szMap))

  929.                         {

  930.                                 return true;

  931.                         }

  932.                 }

  933.         }

  934.         else

  935.         {

  936.                 for(new i = 0; i < SELECT_MAPS && i < 8; i++)

  937.                 {

  938.                         if(Num == g_iInMenu[i])

  939.                         {

  940.                                 return true;

  941.                         }

  942.                 }

  943.         }

  944.         return false;

  945. }

  946. stock MapsInMenu()

  947. {

  948.         new map;

  949.         for(new i = 0; i < SELECT_MAPS; i++)

  950.         {

  951.                 if(g_iInMenu[i] != -1)

  952.                 {

  953.                         map++;

  954.                 }

  955.         }

  956.         return map;

  957. }

  958. stock bool:IsNominated(map[])

  959. {

  960.         new szText[48], szMap[33], szID[3], szIX[6], iMax = ArraySize(NominateArray);

  961.         for(new i = 0; i < iMax; i++)

  962.         {

  963.                 ArrayGetString(NominateArray, i, szText, charsmax(szText));

  964.                 parse(szText, szID, charsmax(szID), szIX, charsmax(szIX), szMap, charsmax(szMap));

  965.                 if(equali(szMap, map))

  966.                 {

  967.                         return true;

  968.                 }

  969.         }                      

  970.         return false;

  971. }

  972. stock ClearNominatedMaps(id)

  973. {

  974.         new szText[48], iID, szID[3];

  975.         for(new i = 0; i < ArraySize(NominateArray); i++)

  976.         {

  977.                 ArrayGetString(NominateArray, i, szText, charsmax(szText));

  978.                 parse(szText, szID, charsmax(szID));

  979.                 iID = str_to_num(szID);

  980.                 if(iID == id)

  981.                 {

  982.                         ArrayDeleteItem(NominateArray, i);     

  983.                         i--;

  984.                         g_iNominatedMaps[id]--;                                

  985.                        

  986.                         if(!g_iNominatedMaps[id]) break;

  987.                 }

  988.         }

  989. }

  990. stock ClearNomList()

  991. {

  992.         delete_file(FILE_LASTMAPS);

  993. }

  994. stock bool:InArray(map[])

  995. {

  996.         new szMap[33], iMax = ArraySize(MapsArray);

  997.         for(new i = 0; i < iMax; i++)

  998.         {

  999.                 ArrayGetString(MapsArray, i, szMap, charsmax(szMap));

  1000.                 if(equali(szMap, map))

  1001.                 {

  1002.                         return true;

  1003.                 }

  1004.         }

  1005.         return false;

  1006. }

  1007. stock bool:InFile(map[])

  1008. {

  1009.         if(!file_exists(FILE_MAPS)) return false;

  1010.        

  1011.         new szMapName[33], bool:found = false; 

  1012.         get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));

  1013.        

  1014.         new f = fopen(FILE_MAPS, "rt");

  1015.        

  1016.         while(!feof(f))

  1017.         {

  1018.                 fgets(f, szMapName, charsmax(szMapName));

  1019.                 trim(szMapName);

  1020.                 remove_quotes(szMapName);

  1021.                

  1022.                 if(!szMapName[0] || szMapName[0] == ';' || szMapName[0] == '/' && szMapName[1] == '/')

  1023.                         continue;

  1024.                

  1025.                 if(equali(map, szMapName))

  1026.                 {

  1027.                         found = true;

  1028.                         break;

  1029.                 }

  1030.         }

  1031.         fclose(f);

  1032.        

  1033.         return found;

  1034. }

  1035. stock BlockedCount()

  1036. {

  1037.         new Count = 0;

  1038.         for(new i = 0; i < MAP_BLOCK; i++)

  1039.         {

  1040.                 if(g_BlockedMaps[i][COUNT]) Count++;

  1041.         }

  1042.         return Count;

  1043. }

  1044. stock Blocked(szMap[])

  1045. {

  1046.         for(new i = 0; i < MAP_BLOCK; i++)

  1047.         {

  1048.                 if(equali(g_BlockedMaps[i][MAP], szMap)) return g_BlockedMaps[i][COUNT];

  1049.         }

  1050.         return 0;

  1051. }

  1052. stock bool:IsBlocked(num)

  1053. {

  1054.         new szMap[33];

  1055.         ArrayGetString(MapsArray, num, szMap, charsmax(szMap));

  1056.        

  1057.         for(new i = 0; i < MAP_BLOCK; i++)

  1058.         {

  1059.                 if(equali(g_BlockedMaps[i][MAP], szMap)) return true;

  1060.         }

  1061.         return false;

  1062. }

  1063. stock get_ending(num, const a[], const b[], const c[], output[], lenght)

  1064. {

  1065.         new num100 = num % 100, num10 = num % 10;

  1066.         if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) format(output, lenght, "%s", a);

  1067.         else if(num10 == 1) format(output, lenght, "%s", b);

  1068.         else if(num10 >= 2 && num10 <= 4) format(output, lenght, "%s", c);

  1069. }
[/pawn]

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

Дебаг:
Код: Выделить всё
L 11/15/2013 - 00:00:28: Start of error session.
L 11/15/2013 - 00:00:28: Info (map "aim_ak-colt") (file "addons/amxmodx/logs/error_20131115.log")
L 11/15/2013 - 00:00:28: [AMXX] Displaying debug trace (plugin "gtsrtv.amxx")
L 11/15/2013 - 00:00:28: [AMXX] Run time error 4: index out of bounds
L 11/15/2013 - 00:00:28: [AMXX]    [0] colorchat.inc::ColorChat (line 74)
L 11/15/2013 - 00:00:28: [AMXX]    [1] gtsrtv.sma::FinishVote (line 864)
L 11/15/2013 - 00:00:28: [AMXX]    [2] gtsrtv.sma::Timer (line 836)
L 11/15/2013 - 00:02:16: [AMXX] Displaying debug trace (plugin "gtsrtv.amxx")
L 11/15/2013 - 00:02:16: [AMXX] Run time error 4: index out of bounds
L 11/15/2013 - 00:02:16: [AMXX]    [0] gtsrtv.sma::ChangeLevel (line 891)
Аватара пользователя
mekkee
 
Сообщения: 39
Зарегистрирован: 10 ноя 2011, 22:32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Map Manager by Mistrick[4.11.2013]

Сообщение Mistrick » 15 ноя 2013, 23:39

mekkee, напиши хоть что менял. Не пойму как там может выйти за массив.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Map Manager by Mistrick[4.11.2013]

Сообщение mekkee » 16 ноя 2013, 00:53

LYlink писал(а):mekkee, напиши хоть что менял. Не пойму как там может выйти за массив.

Да вот что и удивительно, особо ничего не менял, префикс изменил и название ланг файла.
Аватара пользователя
mekkee
 
Сообщения: 39
Зарегистрирован: 10 ноя 2011, 22:32
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6

Re: Map Manager by Mistrick[4.11.2013]

Сообщение a.excellent » 16 ноя 2013, 23:45

Скрин, что входит в этот плагин
MapManager.png

Вы должны зарегистрироваться, чтобы видеть ссылки. ... b8e0d8c0a4
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- a.excellent
Аватара пользователя
a.excellent
 
Сообщения: 265
Зарегистрирован: 07 май 2013, 23:15
Благодарил (а): 35 раз.
Поблагодарили: 15 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Пред.След.

Вернуться в Неутвержденные плагины

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

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