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

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.2.1][27.05.2014]

Сообщение qpAHToMAS » 11 июн 2014, 19:36

Mistrick писал(а):qpAHToMAS, когда писал релизную 1.0, то начинал с нуля, наверно, тогда и потерял :-D Разве много кто ее использует? Там еще голоса набрать надо постараться.

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

Re: Map Manager by Mistrick[1.2.1][27.05.2014]

Сообщение qpAHToMAS » 13 июн 2014, 01:14

Mistrick, ты случайно не тестировал свой MM вместе с GunGame модом?

ADD:
Работает.
Код: Выделить всё
gg_vote_custom "mm_startvote"
mm_extendedmap_max 0
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Map Manager by Mistrick[1.2.1][27.05.2014]

Сообщение med1k » 18 июн 2014, 01:20

Mistrick,

Спасибо дружище за этот плагин. Отличная работа. Лучший mapmanager из всех что я встречал)) а перепробовал я точно все)

Очень функциональный, не грузит сервер, и легко настраивается под себя. От души. Спасибо :thumbs_up
Аватара пользователя
med1k
 
Сообщения: 6
Зарегистрирован: 31 май 2014, 18:20
Благодарил (а): 3 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Counter-Strike 1.6

Re: Map Manager by Mistrick[1.2.1][27.05.2014]

Сообщение qpAHToMAS » 23 июн 2014, 14:40

Mistrick, добавь пожалуйста:
Код: Выделить всё
mm_rtv_delay_end

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

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение qpAHToMAS » 12 июл 2014, 15:59

Небольшое замечание по поводу:
[pawn]
  1. #define MAP_BLOCK
[/pawn]
Если эта константа ровна 1 (единице), то карты вообще не блокируются, а если 2 (двойке), то блокируется одна предыдущая.
Аватара пользователя
qpAHToMAS
 
Сообщения: 707
Зарегистрирован: 02 ноя 2009, 18:45
Благодарил (а): 79 раз.
Поблагодарили: 204 раз.
Языки программирования: CStrike

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение KaLPa4ek » 17 июл 2014, 18:27

Ребята не могу скомпилировать плагин. Ошибки:
mapmanager_ru1.sma(359) : warning 215: expression has no effect
mapmanager_ru1.sma(359) : warning 215: expression has no effect
mapmanager_ru1.sma(359) : warning 215: expression has no effect
mapmanager_ru1.sma(359) : error 001: expected token: ";", but found ")"
mapmanager_ru1.sma(359) : error 029: invalid expression, assumed zero
mapmanager_ru1.sma(359) : fatal error 107: too many error messages on one line
Моя группа CS:
https://vk.com/loveyou_cs
Присоединяйтесь)
Аватара пользователя
KaLPa4ek
 
Сообщения: 17
Зарегистрирован: 25 янв 2014, 22:46
Откуда: г. Калуш
Благодарил (а): 4 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение Subb98 » 17 июл 2014, 20:11

«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение Subb98 » 17 июл 2014, 22:39

[pawn]
  1. #include <amxmodx>

  2.  

  3. #if AMXX_VERSION_NUM < 183

  4.         #include <colorchat>

  5. #else

  6.         #define DontChange print_team_default

  7.         #define Blue print_team_blue

  8.         #define Red print_team_red

  9.         #define Grey print_team_grey

  10. #endif

  11.  

  12. #define PLUGIN "Map Manager RU"

  13. #define VERSION "1.2.2"

  14. #define AUTHOR "Mistrick"

  15.  

  16. #pragma semicolon 1

  17.  

  18. #define SELECT_MAPS 5// MAX 8

  19. #define VOTE_TIME 15

  20. #define SOUND_TIME 10//MAX 10

  21. #define NOMINATE_MAX 3

  22. #define NOMINATE_PLAYER_MAX 3

  23. #define MAP_BLOCK 10

  24. #define HUD_RESULT_COLOR 0, 55, 255

  25.  

  26. #define TASK_CHECKTIMER 978662

  27. #define TASK_CHANGELEVEL 978562

  28. #define TASK_SHOWMENU 978262

  29. #define TASK_SHOWTIMER 978362

  30. #define TASK_TIMER 978462

  31. #define TASK_VOTEMENU 978162

  32.  

  33. enum _:BLOCKED_DATA

  34. {

  35.         MAP[33], COUNT

  36. }

  37. enum _:NOMINATE_DATA

  38. {

  39.         MAP[33], PLAYER, ID

  40. }

  41.  

  42. new const FILE_MAPS[] = "addons/amxmodx/configs/maps.ini";

  43. new const FILE_BLOCKEDMAPS[] = "addons/amxmodx/data/blockedmaps.ini";

  44. new const TEMP_FILE[] = "addons/amxmodx/data/temp.ini";

  45.  

  46. new const PREFIX[] = "[MM]";

  47.  

  48. new Array:g_iMapsArray, Array:g_iNominateArray;

  49.  

  50. new g_pLoadMapsType, g_pChangeMap, g_pChangeMapRounds, g_pShowSelects, g_pShowResultAfterVote, g_pShowResultType;

  51. new g_pDebug, g_pTimeStartVote, g_pTimeStartVoteBeforeEnd, g_pTimeLimit, g_pExendedMax, g_pExendedTime, g_pChatTime;

  52. new g_pRockEnable, g_pRockChange, g_pRockPercent, g_pRockDelay, g_pRockShow, g_pNextMap, g_pFriendlyFire, g_pMenuStopVote;

  53. new g_pRockEndBlock;

  54.  

  55. new bool:g_bBeInVote, bool:g_bVoteFinished, bool:g_bRockVote, bool:g_bHasVoted[33], bool:g_bRockVoted[33];

  56.  

  57. new g_iExtendedMax, g_iRound, g_iStartPlugin, g_iLoadMaps, g_iForwardStartVote, g_iForwardFinishVote;

  58. new g_iInMenu[SELECT_MAPS], g_iVoteItem[SELECT_MAPS + 1], g_iTotal, g_iVoteTime, g_iRockVote;

  59. new g_iNominatedMaps[33], g_iPage[33], g_iTimer;

  60.  

  61. new g_szInMenuMapName[SELECT_MAPS][33], g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA], g_szCurrentMap[33];

  62.  

  63. new const g_szPrefixes[][] = {"deathrun_", "speedrun_", "de_"};

  64. new const g_szSound[][] =

  65. {

  66.         "",     "fvox/one",     "fvox/two",     "fvox/three", "fvox/four", "fvox/five",

  67.         "fvox/six", "fvox/seven", "fvox/eight", "fvox/nine", "fvox/ten"

  68. };

  69.  

  70. public plugin_init()

  71. {

  72.         register_plugin(PLUGIN, VERSION, AUTHOR);

  73.        

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

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

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

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

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

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

  80.         g_pShowResultAfterVote = register_cvar("mm_show_result_aftervote", "1");//0 - disable, 1 - enable

  81.         g_pShowResultType = register_cvar("mm_showresulttype", "0");//0 - menu, 1 - hud

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

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

  84.         g_pMenuStopVote = register_cvar("mm_menustopvote", "0");

  85.        

  86.         g_pNextMap = register_cvar("amx_nextmap", "");

  87.        

  88.         g_pRockEnable = register_cvar("mm_rtv_enable", "1");//0 - disable, 1 - enable

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

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

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

  92.         g_pRockEndBlock = register_cvar("mm_rtv_beforeendblock", "0");//minutes

  93.         g_pRockShow = register_cvar("mm_rtv_show", "1");//0 - all, 1 - self

  94.        

  95.         g_pChatTime = get_cvar_pointer("mp_chattime");

  96.         g_pTimeLimit = get_cvar_pointer("mp_timelimit");

  97.         g_pFriendlyFire = get_cvar_pointer("mp_friendlyfire");

  98.        

  99.         g_pDebug = register_cvar("mm_debug", "0");

  100.        

  101.         register_concmd("mm_startvote", "Command_StartVote", ADMIN_MAP);

  102.         register_concmd("mm_stopvote", "Command_StopVote", ADMIN_MAP);

  103.         register_clcmd("votemap", "Command_Votemap");

  104.         register_clcmd("say ff", "Command_FriendlyFire");

  105.         register_clcmd("say maps", "Command_MapsList");

  106.         register_clcmd("say /maps", "Command_MapsList");

  107.         register_clcmd("say rtv", "Command_RTV");

  108.         register_clcmd("say /rtv", "Command_RTV");

  109.         register_clcmd("say rockthevote", "Command_RTV");

  110.         register_clcmd("say nextmap", "Command_Nextmap");

  111.         register_clcmd("say timeleft", "Command_Timeleft");

  112.         register_clcmd("say currentmap", "Command_CurrentMap");

  113.         register_clcmd("say", "Command_Say");

  114.         register_clcmd("say_team", "Command_Say");

  115.        

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

  117.         register_event("TextMsg", "Event_GameRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");

  118.         register_event("30", "Event_MapEnd", "a");

  119.        

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

  121.         register_menucmd(register_menuid("MapsList_Menu"), 1023, "MapsListMenu_Handler");

  122.        

  123.         g_iNominateArray = ArrayCreate(NOMINATE_DATA);

  124.         g_iStartPlugin = get_systime();

  125.         g_iForwardStartVote = CreateMultiForward("mapmanager_startvote", ET_IGNORE);

  126.         g_iForwardFinishVote = CreateMultiForward("mapmanager_finishvote", ET_IGNORE);

  127.                

  128.         set_task(5.0, "CheckTime", TASK_CHECKTIMER, .flags = "b");

  129.         set_task(11.0, "SoundTimer", .flags = "d");

  130.        

  131.         set_cvar_string("mapcyclefile", FILE_MAPS);

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

  133.        

  134.         if(get_pcvar_num(g_pDebug))

  135.         {

  136.                 log_to_file("mapmanager_debug.log", "PLUGIN_INIT: %s", g_szCurrentMap);

  137.         }

  138.        

  139.         Load_BlockedMaps();

  140.         Load_MapList();

  141. }

  142. public plugin_end()

  143. {

  144.         if(g_iExtendedMax)

  145.         {

  146.                 set_pcvar_num(g_pTimeLimit, get_pcvar_num(g_pTimeLimit) - g_iExtendedMax * get_pcvar_num(g_pExendedTime));

  147.         }

  148.        

  149.         set_pcvar_num(g_pChatTime, get_pcvar_num(g_pChatTime) - 6);

  150.        

  151.         new iVar = MAP_BLOCK;

  152.         if(iVar < 2) return;

  153.        

  154.         new iTemp = fopen(TEMP_FILE, "wt");

  155.        

  156.         if(iTemp)

  157.         {

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

  159.                 {

  160.                         if(g_BlockedMaps[i][COUNT])

  161.                         {

  162.                                 fprintf(iTemp, "^"%s^" ^"%d^"^n", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]);

  163.                         }

  164.                 }      

  165.                

  166.                 fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, MAP_BLOCK);  

  167.                 fclose(iTemp);

  168.                

  169.                 delete_file(FILE_BLOCKEDMAPS);

  170.                 new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);

  171.                 if(get_pcvar_num(g_pDebug))

  172.                 {

  173.                         log_to_file("mapmanager_debug.log", "PLUGIN_END: File Renamed ? %d", iRename);

  174.                 }

  175.         }

  176.         else if(get_pcvar_num(g_pDebug))

  177.         {

  178.                 log_to_file("mapmanager_debug.log", "PLUGIN_END: Can't write file");

  179.         }

  180. }

  181. //*****  *****//

  182. Load_BlockedMaps()

  183. {      

  184.         if(!file_exists(FILE_BLOCKEDMAPS) || MAP_BLOCK < 2) return PLUGIN_CONTINUE;

  185.                

  186.         new iFile = fopen(FILE_BLOCKEDMAPS, "rt");

  187.         new iTemp = fopen(TEMP_FILE, "wt");

  188.        

  189.         new szBuffer[64], szMap[33], szCount[8], iCount, i = 0;

  190.        

  191.         while(!feof(iFile))

  192.         {

  193.                 fgets(iFile, szBuffer, charsmax(szBuffer));

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

  195.                

  196.                 if(get_blocked_map_count(szMap) || !is_map_valid(szMap) || equali(szMap, g_szCurrentMap)) continue;

  197.                

  198.                 iCount = str_to_num(szCount) - 1;

  199.                

  200.                 if(!iCount) continue;

  201.                

  202.                 if(iCount > MAP_BLOCK)

  203.                 {

  204.                         fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, MAP_BLOCK);

  205.                         iCount = MAP_BLOCK;

  206.                 }

  207.                 else

  208.                 {

  209.                         fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, iCount);

  210.                 }

  211.                

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

  213.                 g_BlockedMaps[i++][COUNT] = iCount;

  214.                

  215.                 if(i >= MAP_BLOCK) break;

  216.         }

  217.        

  218.         fclose(iFile);

  219.         fclose(iTemp);

  220.        

  221.         delete_file(FILE_BLOCKEDMAPS);

  222.         new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);

  223.        

  224.         if(get_pcvar_num(g_pDebug))

  225.         {

  226.                 log_to_file("mapmanager_debug.log", "LOAD_BLOCKEDMAPS: File Renamed? %d; Blocked ? %d", iRename, i);

  227.         }

  228.        

  229.         return PLUGIN_CONTINUE;

  230. }

  231. Load_MapList()

  232. {

  233.         g_iLoadMaps = 0;

  234.         g_iMapsArray = ArrayCreate(33);

  235.        

  236.         if(file_exists(FILE_MAPS) && get_pcvar_num(g_pLoadMapsType))

  237.         {              

  238.                 new szMapName[33];

  239.                

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

  241.                

  242.                 if(f)

  243.                 {

  244.                         while(!feof(f))

  245.                         {

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

  247.                                 trim(szMapName);

  248.                                 remove_quotes(szMapName);

  249.                                

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

  251.                                         || !valid_map(szMapName) || in_maps_array(szMapName) || equali(szMapName, g_szCurrentMap))

  252.                                         continue;

  253.                                

  254.                                 g_iLoadMaps++;

  255.                                

  256.                                 ArrayPushString(g_iMapsArray, szMapName);

  257.                         }              

  258.                         fclose(f);

  259.                 }

  260.         }

  261.         else

  262.         {

  263.                 new iDir, iLen, szFileName[64];

  264.                 new DirName[] = "maps";

  265.                 iDir = open_dir(DirName, szFileName, charsmax(szFileName));

  266.                

  267.                 if(iDir)

  268.                 {

  269.                         while(next_file(iDir, szFileName, charsmax(szFileName)))

  270.                         {

  271.                                 iLen = strlen(szFileName) - 4;

  272.                                

  273.                                 if(iLen < 0) continue;

  274.                                

  275.                                 if(equali(szFileName[iLen], ".bsp") && !equali(szFileName, g_szCurrentMap))

  276.                                 {

  277.                                         szFileName[iLen] = '^0';

  278.                                        

  279.                                         g_iLoadMaps++;

  280.                                        

  281.                                         ArrayPushString(g_iMapsArray, szFileName);

  282.                                 }

  283.                         }

  284.                         close_dir(iDir);

  285.                 }

  286.         }

  287.        

  288.         if(!g_iLoadMaps)

  289.         {

  290.                 if(get_pcvar_num(g_pDebug))

  291.                 {

  292.                         log_to_file("mapmanager_debug.log", "LOAD_MAPS: Nothing loaded");

  293.                 }

  294.                 set_fail_state("LOAD_MAPS: Nothing loaded");

  295.                 return;

  296.         }

  297.        

  298.         if(g_iLoadMaps - get_blocked_maps() <= 0)

  299.         {

  300.                 clear_blocked_maps();

  301.         }

  302.        

  303.         new szMap[33]; 

  304.         do

  305.         {

  306.                 ArrayGetString(g_iMapsArray, random_num(0, g_iLoadMaps - 1), szMap, charsmax(szMap));

  307.         } while(get_blocked_map_count(szMap));

  308.        

  309.         set_pcvar_string(g_pNextMap, szMap);

  310.        

  311.         if(get_pcvar_num(g_pDebug))

  312.         {

  313.                 log_to_file("mapmanager_debug.log", "LOAD_MAPS: Loaded Maps ? %d", g_iLoadMaps);

  314.         }

  315. }

  316. //*****  *****//

  317. public client_disconnect(id)

  318. {

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

  320.         if(g_bRockVoted[id])

  321.         {

  322.                 g_bRockVoted[id] = false;

  323.                 g_iRockVote--;

  324.         }

  325.         if(g_iNominatedMaps[id])

  326.         {

  327.                 clear_nominated_maps(id);              

  328.         }

  329. }

  330. //***** Commands *****//

  331. public Command_Votemap(id)

  332. {

  333.         return PLUGIN_HANDLED;

  334. }

  335. public Command_StartVote(id, flag)

  336. {

  337.         return ~get_user_flags(id) & flag ? PLUGIN_HANDLED : StartVote(id);

  338. }

  339. public Command_StopVote(id, flag)

  340. {

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

  342.        

  343.         if(g_bBeInVote)

  344.         {

  345.                 g_bBeInVote = false;

  346.                 g_bRockVote = false;

  347.                 g_iRockVote = 0;

  348.                 arrayset(g_bRockVoted, false, 33);

  349.                

  350.                 if(task_exists(TASK_SHOWMENU)) remove_task(TASK_SHOWMENU);

  351.                 if(task_exists(TASK_SHOWTIMER)) remove_task(TASK_SHOWTIMER);

  352.                 if(task_exists(TASK_TIMER)) remove_task(TASK_TIMER);

  353.                 for(new id = 1; id <= 32; id++)

  354.                 {

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

  356.                 }

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

  358.                 new szName[32]; get_user_name(id, szName, charsmax(szName));

  359.                 #if AMXX_VERSION_NUM < 183

  360.                 ColorChat(0, NORMAL, "^4%s^3 %s^1 отменил голосование.", PREFIX, szName);

  361.                 #else

  362.                 client_print_color(0, DontChange, "^4%s^3 %s^1 отменил голосование.", PREFIX, szName);

  363.                 #endif

  364.         }

  365.        

  366.         return PLUGIN_HANDLED;

  367. }

  368. public Command_FriendlyFire(id)

  369. {

  370.         #if AMXX_VERSION_NUM < 183

  371.         ColorChat(id, NORMAL, "^4%s^1 На сервере^3 %s^1 огонь по своим.", PREFIX, get_pcvar_num(g_pFriendlyFire) ? "разрешен" : "запрещен");

  372.         #else

  373.         client_print_color(0, DontChange, "^4%s^1 На сервере^3 %s^1 огонь по своим.", PREFIX, get_pcvar_num(g_pFriendlyFire) ? "разрешен" : "запрещен");

  374.         #endif

  375. }

  376. public Command_MapsList(id)

  377. {

  378.         Show_MapsListMenu(id, g_iPage[id] = 0);

  379. }

  380. public Show_MapsListMenu(id, iPage)

  381. {

  382.         if(iPage < 0) return PLUGIN_HANDLED;

  383.        

  384.         new iMax = ArraySize(g_iMapsArray);

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

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

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

  388.        

  389.         iPage = iStart / 8;

  390.         g_iPage[id] = iPage;

  391.        

  392.         new szMenu[512], iLen = 0, szMapName[33];

  393.        

  394.         iLen = formatex(szMenu, charsmax(szMenu), "\yСписок карт \w[%d/%d]:^n", iPage + 1, ((iMax - 1) / 8) + 1);

  395.        

  396.         new Keys, Item, iBlock, iNominator;

  397.        

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

  399.         {

  400.                 ArrayGetString(g_iMapsArray, i, szMapName, charsmax(szMapName));

  401.                 iBlock = get_blocked_map_count(szMapName);

  402.                 iNominator = is_map_nominated(szMapName);

  403.                 if(iBlock)

  404.                 {

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

  406.                 }

  407.                 else if(iNominator)

  408.                 {

  409.                         if(iNominator == id)

  410.                         {

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

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

  413.                                

  414.                         }

  415.                         else

  416.                         {

  417.                                 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%d.\d %s[\y*\d]", ++Item, szMapName);

  418.                         }

  419.                 }

  420.                 else

  421.                 {

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

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

  424.                 }

  425.         }

  426.         while(Item <= 8)

  427.         {

  428.                 Item++;

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

  430.         }

  431.         if (iEnd < iMax)

  432.         {

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

  434.                 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9.\w Вперед^n\r0.\w %s", iPage ? "Назад" : "Выход");

  435.         }

  436.         else

  437.         {

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

  439.                 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0.\w %s", iPage ? "Назад" : "Выход");

  440.         }

  441.         show_menu(id, Keys, szMenu, -1, "MapsList_Menu");

  442.         return PLUGIN_HANDLED;

  443. }

  444. public MapsListMenu_Handler(id, key)

  445. {

  446.         switch (key)

  447.         {

  448.                 case 8: Show_MapsListMenu(id, ++g_iPage[id]);

  449.                 case 9: Show_MapsListMenu(id, --g_iPage[id]);

  450.                 default:

  451.                 {                      

  452.                         new szMapName[33]; ArrayGetString(g_iMapsArray, key + g_iPage[id] * 8, szMapName, charsmax(szMapName));

  453.                         if(g_iNominatedMaps[id] && is_map_nominated(szMapName))

  454.                         {

  455.                                 remove_nominated_map(id, szMapName);

  456.                         }

  457.                         else

  458.                         {

  459.                                 NominateMap(id, szMapName);

  460.                         }

  461.                 }

  462.         }

  463.         return PLUGIN_HANDLED;

  464. }

  465. public Command_RTV(id)

  466. {

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

  468.        

  469.         if(!get_pcvar_num(g_pRockEnable)) return PLUGIN_CONTINUE;

  470.        

  471.         if(get_timeleft() / 60 < get_pcvar_num(g_pRockEndBlock))

  472.         {

  473.                 #if AMXX_VERSION_NUM < 183

  474.                 ColorChat(id, NORMAL, "^4%s^1 Слишком поздно для досрочного голосования.", PREFIX);

  475.                 #else

  476.                 client_print_color(id, DontChange, "^4%s^1 Слишком поздно для досрочного голосования.", PREFIX);

  477.                 #endif

  478.                 return PLUGIN_HANDLED;

  479.         }

  480.        

  481.         new iTime = get_systime();

  482.         if(iTime - g_iStartPlugin < get_pcvar_num(g_pRockDelay) * 60)

  483.         {

  484.                 new iMin = 1 + (get_pcvar_num(g_pRockDelay) * 60 - (iTime - g_iStartPlugin)) / 60;

  485.                 new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));

  486.                                

  487.                 #if AMXX_VERSION_NUM < 183

  488.                 ColorChat(id, NORMAL, "^4%s^1 Вы не можете голосовать за досрочную смену карты. Осталось:^3 %d^1 %s.", PREFIX, iMin, szMin);

  489.                 #else

  490.                 client_print_color(id, DontChange, "^4%s^1 Вы не можете голосовать за досрочную смену карты. Осталось:^3 %d^1 %s.", PREFIX, iMin, szMin);

  491.                 #endif

  492.                 return PLUGIN_HANDLED;

  493.         }

  494.        

  495.         if(!g_bRockVoted[id])

  496.         {

  497.                 g_bRockVoted[id] = true;

  498.                 g_iRockVote++;

  499.                

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

  501.                

  502.                 if(iVote > 0)

  503.                 {

  504.                         new szVote[16]; get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));

  505.                        

  506.                         switch(get_pcvar_num(g_pRockShow))

  507.                         {

  508.                                 case 0:

  509.                                 {

  510.                                         new szName[33];

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

  512.                                         #if AMXX_VERSION_NUM < 183

  513.                                         ColorChat(0, NORMAL, "^4%s^3 %s^1 проголосовал за смену карты. Осталось:^3 %d^1 %s.", PREFIX, szName, iVote, szVote);

  514.                                         #else

  515.                                         client_print_color(0, DontChange, "^4%s^3 %s^1 проголосовал за смену карты. Осталось:^3 %d^1 %s.", PREFIX, szName, iVote, szVote);

  516.                                         #endif

  517.                                 }

  518.                                 case 1:

  519.                                 {

  520.                                         #if AMXX_VERSION_NUM < 183

  521.                                         ColorChat(id, NORMAL, "^4%s^1 Ваш голос учтен. Осталось:^3 %d^1 %s.", PREFIX, iVote, szVote);

  522.                                         #else

  523.                                         client_print_color(id, DontChange, "^4%s^1 Ваш голос учтен. Осталось:^3 %d^1 %s.", PREFIX, iVote, szVote);

  524.                                         #endif

  525.                                 }

  526.                         }

  527.                 }

  528.                 else

  529.                 {

  530.                         g_bRockVote = true;

  531.                         StartVote(0);

  532.                         #if AMXX_VERSION_NUM < 183

  533.                         ColorChat(0, NORMAL, "^4%s^1 Начинаем досрочное голосование.", PREFIX);

  534.                         #else

  535.                         client_print_color(0, DontChange, "^4%s^1 Начинаем досрочное голосование.", PREFIX);

  536.                         #endif

  537.                 }

  538.         }

  539.         else

  540.         {

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

  542.                 new szVote[16]; get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));

  543.                 #if AMXX_VERSION_NUM < 183

  544.                 ColorChat(id, NORMAL, "^4%s^1 Вы уже голосовали. Осталось:^3 %d^1 %s.", PREFIX, iVote, szVote);

  545.                 #else

  546.                 client_print_color(id, DontChange, "^4%s^1 Вы уже голосовали. Осталось:^3 %d^1 %s.", PREFIX, iVote, szVote);

  547.                 #endif

  548.         }

  549.        

  550.         return PLUGIN_HANDLED;

  551. }

  552. public Command_Nextmap(id)

  553. {

  554.         new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));

  555.         #if AMXX_VERSION_NUM < 183

  556.         ColorChat(0, BLUE, "^4%s^1 Следующая карта: ^3%s^1.", PREFIX, szMap);

  557.         #else

  558.         client_print_color(0, Blue, "^4%s^1 Следующая карта: ^3%s^1.", PREFIX, szMap);

  559.         #endif

  560. }

  561. public Command_Timeleft(id)

  562. {

  563.         if (get_pcvar_num(g_pTimeLimit))

  564.         {

  565.                 new a = get_timeleft();

  566.                 #if AMXX_VERSION_NUM < 183

  567.                 ColorChat(0, BLUE, "^4%s^1 До конца карты осталось:^3 %d:%02d", PREFIX, (a / 60), (a % 60));

  568.                 #else

  569.                 client_print_color(0, Blue, "^4%s^1 До конца карты осталось:^3 %d:%02d", PREFIX, (a / 60), (a % 60));

  570.                 #endif

  571.         }

  572.         else

  573.         {

  574.                 #if AMXX_VERSION_NUM < 183

  575.                 ColorChat(0, NORMAL, "^4%s^1 Карта не ограничена по времени.", PREFIX);

  576.                 #else

  577.                 client_print_color(0, DontChange, "^4%s^1 Карта не ограничена по времени.", PREFIX);

  578.                 #endif

  579.         }

  580. }

  581. public Command_CurrentMap(id)

  582. {

  583.         #if AMXX_VERSION_NUM < 183

  584.         ColorChat(0, BLUE, "^4%s^1 Текущая карта:^3 %s^1.", PREFIX, g_szCurrentMap);

  585.         #else

  586.         client_print_color(0, Blue, "^4%s^1 Текущая карта:^3 %s^1.", PREFIX, g_szCurrentMap);

  587.         #endif

  588. }

  589. public Command_Say(id)

  590. {

  591.         if(g_bVoteFinished || g_bBeInVote) return;

  592.        

  593.         new szText[33]; read_args(szText, charsmax(szText));

  594.         remove_quotes(szText);

  595.         trim(szText);

  596.         strtolower(szText);

  597.         if(in_maps_array(szText))

  598.         {

  599.                 if(g_iNominatedMaps[id] && is_map_nominated(szText))

  600.                 {

  601.                         remove_nominated_map(id, szText);

  602.                 }

  603.                 else

  604.                 {

  605.                         NominateMap(id, szText);

  606.                 }

  607.         }

  608.         else

  609.         {

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

  611.                 {

  612.                         new szFormat[33]; formatex(szFormat, charsmax(szFormat), "%s%s", g_szPrefixes[i], szText);

  613.                         if(in_maps_array(szFormat))

  614.                         {

  615.                                 if(g_iNominatedMaps[id] && is_map_nominated(szFormat))

  616.                                 {

  617.                                         remove_nominated_map(id, szFormat);

  618.                                 }

  619.                                 else

  620.                                 {

  621.                                         NominateMap(id, szFormat);

  622.                                 }

  623.                                 break;

  624.                         }

  625.                 }

  626.         }

  627. }

  628. NominateMap(id, map[33])

  629. {      

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

  631.         {

  632.                 #if AMXX_VERSION_NUM < 183

  633.                 ColorChat(id, NORMAL, "^4%s^1 Вы не можете больше номинировать карты.", PREFIX);

  634.                 #else

  635.                 client_print_color(id, DontChange, "^4%s^1 Вы не можете больше номинировать карты.", PREFIX);

  636.                 #endif

  637.                 return PLUGIN_HANDLED;

  638.         }

  639.         if(get_blocked_map_count(map))

  640.         {

  641.                 #if AMXX_VERSION_NUM < 183

  642.                 ColorChat(id, NORMAL, "^4%s^1 Эта карта недоступна для номинации.", PREFIX);

  643.                 #else

  644.                 client_print_color(id, DontChange, "^4%s^1 Эта карта недоступна для номинации.", PREFIX);

  645.                 #endif

  646.                 return PLUGIN_HANDLED;

  647.         }

  648.         if(is_map_nominated(map))

  649.         {

  650.                 #if AMXX_VERSION_NUM < 183

  651.                 ColorChat(id, NORMAL, "^4%s^1 Эта карта уже номинирована.", PREFIX);

  652.                 #else

  653.                 client_print_color(id, DontChange, "^4%s^1 Эта карта уже номинирована.", PREFIX);

  654.                 #endif

  655.                 return PLUGIN_HANDLED;

  656.         }      

  657.        

  658.         new szMap[33], i;

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

  660.         {

  661.                 ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));

  662.                 if(equali(map, szMap)) break;

  663.         }

  664.                

  665.         new Data[NOMINATE_DATA];

  666.         Data[MAP] = map;

  667.         Data[PLAYER] = id;

  668.         Data[ID] = i;

  669.         ArrayPushArray(g_iNominateArray, Data);

  670.        

  671.         g_iNominatedMaps[id]++;

  672.         new szName[33]; get_user_name(id, szName, charsmax(szName));

  673.         #if AMXX_VERSION_NUM < 183

  674.         ColorChat(0, NORMAL, "^4%s^3 %s^1 номинировал на голосование^3 %s^1.", PREFIX, szName, map);

  675.         #else

  676.         client_print_color(0, id, "^4%s^3 %s^1 номинировал на голосование^3 %s^1.", PREFIX, szName, map);

  677.         #endif

  678.  

  679.         return PLUGIN_HANDLED;

  680. }

  681. //***** Events *****//

  682. public Event_RoundEnd()

  683. {

  684.         g_iRound++;

  685.         new iCvar = get_pcvar_num(g_pChangeMapRounds);

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

  687.         {

  688.                 StartVote(0);

  689.         }

  690.         if(g_bVoteFinished && (get_pcvar_num(g_pChangeMap) == 1 || g_bRockVote && get_pcvar_num(g_pRockChange) == 1))

  691.         {

  692.                 set_task(5.0, "ChangeLevel", TASK_CHANGELEVEL);

  693.                 if(get_pcvar_num(g_pDebug))

  694.                 {

  695.                         log_to_file("mapmanager_debug.log", "EVENT_ROUNDEND: ChangeLevel");

  696.                 }

  697.         }

  698. }

  699. public Event_GameRestart()

  700. {

  701.         g_iRound = 0;

  702.         g_iStartPlugin = get_systime();

  703. }

  704. public Event_MapEnd()

  705. {

  706.         set_pcvar_num(g_pChatTime, get_pcvar_num(g_pChatTime) + 6);

  707.         set_task(5.0, "ChangeLevel", TASK_CHANGELEVEL);

  708.         if(get_pcvar_num(g_pDebug))

  709.         {

  710.                 log_to_file("mapmanager_debug.log", "EVENT_MAPEND: ChangeLevel");

  711.         }

  712. }

  713. //*****  *****//

  714. public CheckTime()

  715. {

  716.         if(g_bVoteFinished || g_bBeInVote) return PLUGIN_CONTINUE;

  717.        

  718.         static iTimeLimit; iTimeLimit = get_pcvar_num(g_pTimeLimit);

  719.        

  720.         if(iTimeLimit > 2)

  721.         {

  722.                 if(get_systime() - g_iStartPlugin >= (iTimeLimit - get_pcvar_num(g_pTimeStartVoteBeforeEnd)) * 60)

  723.                 {

  724.                         StartVote(0);

  725.                 }

  726.         }

  727.         else if(iTimeLimit == 0)

  728.         {

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

  730.                 {

  731.                         StartVote(0);

  732.                 }

  733.         }

  734.        

  735.         return PLUGIN_CONTINUE;

  736. }

  737. public StartVote(id)

  738. {

  739.         if(g_bBeInVote)

  740.         {

  741.                 if(id)

  742.                 {

  743.                         #if AMXX_VERSION_NUM < 183

  744.                         ColorChat(id, NORMAL, "^4%s^1 Голосование запущено.", PREFIX);

  745.                         #else

  746.                         client_print_color(id, DontChange, "^4%s^1 Голосование запущено.", PREFIX);

  747.                         #endif

  748.                 }

  749.                 return PLUGIN_HANDLED;

  750.         }

  751.        

  752.         g_bBeInVote = true;

  753.         g_iTotal = 0;

  754.        

  755.         arrayset(g_iVoteItem, 0, SELECT_MAPS + 1);

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

  757.         arrayset(g_bHasVoted, false, 33);      

  758.        

  759.         new Num,  NomInMenu = 0, Data[NOMINATE_DATA];

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

  761.        

  762.         Limits[0] = SELECT_MAPS;

  763.         Limits[1] = g_iLoadMaps - get_blocked_maps();

  764.        

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

  766.         {

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

  768.         }

  769.        

  770.         new iNomMax, iNomNum = ArraySize(g_iNominateArray);

  771.         iNomMax = iNomNum > NOMINATE_MAX ? NOMINATE_MAX : iNomNum;

  772.        

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

  774.         {              

  775.                 if(NomInMenu < iNomMax)

  776.                 {

  777.                         Num = random_num(0, ArraySize(g_iNominateArray) - 1);

  778.                        

  779.                         ArrayGetArray(g_iNominateArray, Num, Data);

  780.                        

  781.                         formatex(g_szInMenuMapName[i], 32, Data[MAP]);

  782.                         g_iInMenu[i] = Data[ID];

  783.                         NomInMenu++;

  784.                        

  785.                         ArrayDeleteItem(g_iNominateArray, Num);

  786.                         g_iNominatedMaps[Data[PLAYER]]--;

  787.                 }

  788.                 else

  789.                 {

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

  791.                         while(in_menu(Num) || is_blocked(Num));

  792.                        

  793.                         g_iInMenu[i] = Num;

  794.                         ArrayGetString(g_iMapsArray, Num, g_szInMenuMapName[i], 32);

  795.                 }              

  796.         }

  797.        

  798.         g_iTimer = SOUND_TIME; if(g_iTimer > 10) g_iTimer = 10;

  799.         set_task(1.0, "Show_Timer", TASK_SHOWTIMER, _, _, "a", g_iTimer);

  800.         set_task(float(g_iTimer) + 1.0, "Show_Menu", TASK_SHOWMENU);

  801.        

  802.         new iRet;

  803.         ExecuteForward(g_iForwardStartVote, iRet);

  804.        

  805.         if(get_pcvar_num(g_pDebug))

  806.         {

  807.                 log_to_file("mapmanager_debug.log", "START_VOTE: RTV ? %d", g_bRockVote ? 1 : 0);

  808.         }

  809.        

  810.         return PLUGIN_HANDLED;

  811. }

  812. public Show_Timer()

  813. {

  814.         new szSec[16]; get_ending(g_iTimer, "секунд", "секунда", "секунды", szSec, charsmax(szSec));

  815.        

  816.         for(new i = 1; i <= 32; i++)

  817.         {

  818.                 if(!is_user_connected(i)) continue;

  819.                 set_hudmessage(50, 255, 50, -1.0, is_user_alive(i) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 1);

  820.                 show_hudmessage(i, "До голосования осталось %d %s!", g_iTimer, szSec);

  821.         }

  822.        

  823.         client_cmd(0, "spk %s", g_szSound[g_iTimer--]);

  824. }

  825. public Show_Menu()

  826. {

  827.         new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch");

  828.        

  829.         g_iVoteTime = VOTE_TIME;

  830.                

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

  832.         {

  833.                 iPlayer = Players[i];

  834.                 VoteMenu(iPlayer + TASK_VOTEMENU);

  835.                 set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME);

  836.         }

  837.         set_task(1.0, "Timer", TASK_TIMER, _, _, "a", VOTE_TIME+1);

  838.        

  839.         client_cmd(0, "spk Gman/Gman_Choose2");

  840. }

  841. public VoteMenu(id)

  842. {

  843.         id -= TASK_VOTEMENU;

  844.                

  845.         if(g_iVoteTime == 0)

  846.         {

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

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

  849.                 return PLUGIN_HANDLED;

  850.         }

  851.        

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

  853.        

  854.         len = formatex(szMenu[len], charsmax(szMenu) - len, "\y%s:^n^n", g_bHasVoted[id] ? "Результаты голосования" : "Выберите карту");

  855.        

  856.         new Key, iPercent, i, iMax = maps_in_menu();

  857.        

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

  859.         {              

  860.                 iPercent = 0;

  861.                 if(g_iTotal)

  862.                 {

  863.                         iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);

  864.                 }

  865.                

  866.                 if(!g_bHasVoted[id])

  867.                 {

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

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

  870.                 }

  871.                 else

  872.                 {

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

  874.                 }              

  875.         }

  876.        

  877.         if(!g_bRockVote && get_pcvar_num(g_pTimeLimit) != 0 && g_iExtendedMax < get_pcvar_num(g_pExendedMax))

  878.         {

  879.                 iPercent = 0;

  880.                 if(g_iTotal)

  881.                 {

  882.                         iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);

  883.                 }

  884.                

  885.                 if(!g_bHasVoted[id])

  886.                 {

  887.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d.\w %s\d[\r%d%%\d]\y[Продлить]^n", i + 1, g_szCurrentMap, iPercent);       

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

  889.                 }

  890.                 else

  891.                 {

  892.                         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%s[\r%d%%\d]\y[Продлить]^n", g_szCurrentMap, iPercent);

  893.                 }

  894.         }

  895.        

  896.         if(get_pcvar_num(g_pMenuStopVote) && get_user_flags(id) & ADMIN_MAP)

  897.         {

  898.                 i++;

  899.                 len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d. Отменить голосование^n", i + 1 == 10 ? 0 : i + 1);

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

  901.         }

  902.        

  903.         new szSec[16]; get_ending(g_iVoteTime, "секунд", "секунда", "секунды", szSec, charsmax(szSec));

  904.         len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\dОсталось \r%d\d %s", g_iVoteTime, szSec);

  905.        

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

  907.        

  908.         if(g_bHasVoted[id] && get_pcvar_num(g_pShowResultType) == 1)

  909.         {

  910.                 while(replace(szMenu, charsmax(szMenu), "\r", "")){}

  911.                 while(replace(szMenu, charsmax(szMenu), "\d", "")){}

  912.                 while(replace(szMenu, charsmax(szMenu), "\w", "")){}

  913.                 while(replace(szMenu, charsmax(szMenu), "\y", "")){}

  914.                

  915.                 set_hudmessage(HUD_RESULT_COLOR, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);

  916.                 show_hudmessage(id, "%s", szMenu);

  917.         }

  918.         else

  919.         {

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

  921.         }

  922.        

  923.         return PLUGIN_HANDLED;

  924. }

  925. public VoteMenu_Handler(id, key)

  926. {

  927.         if(g_bHasVoted[id])

  928.         {

  929.                 VoteMenu(id + TASK_VOTEMENU);

  930.                 return PLUGIN_HANDLED;

  931.         }      

  932.         if(get_pcvar_num(g_pMenuStopVote) && key == maps_in_menu() + 1)

  933.         {

  934.                 Command_StopVote(id, ADMIN_MAP);

  935.                 return PLUGIN_HANDLED;

  936.         }

  937.        

  938.         g_iVoteItem[key]++;

  939.         g_iTotal++;

  940.        

  941.         g_bHasVoted[id] = true;

  942.        

  943.         new iCvar = get_pcvar_num(g_pShowSelects);

  944.         if(iCvar)

  945.         {

  946.                 new szName[32];

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

  948.                 if(key == maps_in_menu())

  949.                 {

  950.                         switch(iCvar)

  951.                         {

  952.                                 case 1:

  953.                                 {

  954.                                         #if AMXX_VERSION_NUM < 183

  955.                                         ColorChat(0, NORMAL, "^4%s^1 ^3%s^1 выбрал продление карты.", PREFIX, szName);

  956.                                         #else

  957.                                         client_print_color(0, id, "^4%s^1 ^3%s^1 выбрал продление карты.", PREFIX, szName);

  958.                                         #endif

  959.                                 }

  960.                                 case 2:

  961.                                 {

  962.                                         #if AMXX_VERSION_NUM < 183

  963.                                         ColorChat(id, NORMAL, "^4%s^1 Вы выбрали продление карты.", PREFIX);

  964.                                         #else

  965.                                         client_print_color(id, DontChange, "^4%s^1 Вы выбрали продление карты.", PREFIX);

  966.                                         #endif

  967.                                 }

  968.                         }

  969.                 }

  970.                 else

  971.                 {

  972.                         switch(iCvar)

  973.                         {

  974.                                 case 1:

  975.                                 {

  976.                                         #if AMXX_VERSION_NUM < 183

  977.                                         ColorChat(0, NORMAL, "^4%s^3 %s^1 выбрал^3 %s^1.", PREFIX, szName, g_szInMenuMapName[key]);

  978.                                         #else

  979.                                         client_print_color(0, id, "^4%s^3 %s^1 выбрал^3 %s^1.", PREFIX, szName, g_szInMenuMapName[key]);

  980.                                         #endif

  981.                                 }

  982.                                 case 2:

  983.                                 {

  984.                                         #if AMXX_VERSION_NUM < 183

  985.                                         ColorChat(0, NORMAL, "^4%s^1 Вы выбрали^3 %s^1.", PREFIX, g_szInMenuMapName[key]);

  986.                                         #else

  987.                                         client_print_color(0, DontChange, "^4%s^1 Вы выбрали^3 %s^1.", PREFIX, g_szInMenuMapName[key]);

  988.                                         #endif

  989.                                 }

  990.                         }

  991.                 }

  992.         }

  993.  

  994.         if(get_pcvar_num(g_pShowResultAfterVote))

  995.         {

  996.                 VoteMenu(id + TASK_VOTEMENU);

  997.         }

  998.         else

  999.         {

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

  1001.         }

  1002.  

  1003.         return PLUGIN_HANDLED;

  1004. }

  1005. public Timer()

  1006. {

  1007.         if(--g_iVoteTime == 0)

  1008.         {

  1009.                 FinishVote();

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

  1011.                 if(task_exists(TASK_TIMER)) remove_task(TASK_TIMER);

  1012.         }

  1013. }

  1014. FinishVote()

  1015. {

  1016.         new MaxVote = 0, iInMenu = maps_in_menu(), iRandom;

  1017.         new iMax = g_bRockVote ? iInMenu : iInMenu + 1;

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

  1019.         {

  1020.                 iRandom = random_num(0, 1);

  1021.                 switch(iRandom)

  1022.                 {

  1023.                         case 0: if(g_iVoteItem[MaxVote] < g_iVoteItem[i]) MaxVote = i;

  1024.                         case 1: if(g_iVoteItem[MaxVote] <= g_iVoteItem[i]) MaxVote = i;

  1025.                 }

  1026.         }

  1027.        

  1028.         g_bBeInVote = false;

  1029.         g_bVoteFinished = true;

  1030.        

  1031.         if(!g_iTotal || (MaxVote != iInMenu))

  1032.         {

  1033.                 if(g_iTotal)

  1034.                 {

  1035.                         #if AMXX_VERSION_NUM < 183

  1036.                         ColorChat(0, BLUE, "^4%s^1 Следующая карта:^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);

  1037.                         #else

  1038.                         client_print_color(0, Blue, "^4%s^1 Следующая карта:^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);

  1039.                         #endif

  1040.                 }

  1041.                 else

  1042.                 {

  1043.                         MaxVote = random_num(0, iInMenu - 1);

  1044.                         #if AMXX_VERSION_NUM < 183

  1045.                         ColorChat(0, BLUE, "^4%s^1 Никто не голосовал. Следуйщей будет^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);

  1046.                         #else

  1047.                         client_print_color(0, Blue, "^4%s^1 Никто не голосовал. Следуйщей будет^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);

  1048.                         #endif

  1049.                 }

  1050.        

  1051.                 set_pcvar_string(g_pNextMap, g_szInMenuMapName[MaxVote]);

  1052.                

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

  1054.                 {

  1055.                         #if AMXX_VERSION_NUM < 183

  1056.                         ColorChat(0, NORMAL, "^4%s^1 Карта сменится через^3 10^1 секунд.", PREFIX);

  1057.                         #else

  1058.                         client_print_color(0, DontChange, "^4%s^1 Карта сменится через^3 10^1 секунд.", PREFIX);

  1059.                         #endif

  1060.                         set_task(10.0, "ChangeLevel", TASK_CHANGELEVEL);

  1061.                         if(get_pcvar_num(g_pDebug))

  1062.                         {

  1063.                                 log_to_file("mapmanager_debug.log", "FINISH_VOTE: ChangeLevel");

  1064.                         }

  1065.                 }

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

  1067.                 {

  1068.                         #if AMXX_VERSION_NUM < 183

  1069.                         ColorChat(0, NORMAL, "^4%s^1 Карта сменится в следующем раунде.", PREFIX);

  1070.                         #else

  1071.                         client_print_color(0, DontChange, "^4%s^1 Карта сменится в следующем раунде.", PREFIX);

  1072.                         #endif

  1073.                 }

  1074.         }

  1075.         else

  1076.         {

  1077.                 g_bVoteFinished = false;

  1078.                 g_iExtendedMax++;

  1079.                 new iMin = get_pcvar_num(g_pExendedTime);

  1080.                 new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));

  1081.                

  1082.                 #if AMXX_VERSION_NUM < 183

  1083.                 ColorChat(0, NORMAL, "^4%s^1 Текущая карта продлена на^3 %d^1 %s.", PREFIX, iMin, szMin);

  1084.                 #else

  1085.                 client_print_color(0, DontChange, "^4%s^1 Текущая карта продлена на^3 %d^1 %s.", PREFIX, iMin, szMin);

  1086.                 #endif

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

  1088.         }

  1089.        

  1090.         new iRet;

  1091.         ExecuteForward(g_iForwardFinishVote, iRet);

  1092. }

  1093. public ChangeLevel()

  1094. {

  1095.         new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));

  1096.         server_cmd("changelevel %s", szMap);

  1097. }

  1098. public SoundTimer()

  1099. {

  1100.         set_task(1.0, "Show_Timer2", TASK_SHOWTIMER, _, _, "a", 10);

  1101. }

  1102. public Show_Timer2()

  1103. {

  1104.         static iTimer; if(iTimer == 0) iTimer = 10;

  1105.        

  1106.         new szSec[16]; get_ending(iTimer, "секунд", "секунда", "секунды", szSec, charsmax(szSec));

  1107.        

  1108.         for(new i = 1; i <= 32; i++)

  1109.         {

  1110.                 if(!is_user_connected(i)) continue;

  1111.                 set_hudmessage(50, 255, 50, -1.0, is_user_alive(i) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 1);

  1112.                 show_hudmessage(i, "До смены карты осталось %d %s!", iTimer, szSec);

  1113.         }

  1114.        

  1115.         client_cmd(0, "spk %s", g_szSound[iTimer--]);

  1116. }

  1117. //*****  *****//

  1118. bool:valid_map(map[])

  1119. {

  1120.         if(is_map_valid(map)) return true;

  1121.        

  1122.         new len = strlen(map) - 4;

  1123.        

  1124.         if(len < 0) return false;

  1125.        

  1126.         if(equali(map[len], ".bsp"))

  1127.         {

  1128.                 map[len] = '^0';               

  1129.                 if(is_map_valid(map)) return true;

  1130.         }

  1131.        

  1132.         return false;

  1133. }

  1134. bool:in_maps_array(map[])

  1135. {

  1136.         new szMap[33], iMax = ArraySize(g_iMapsArray);

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

  1138.         {

  1139.                 ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));

  1140.                 if(equali(szMap, map))

  1141.                 {

  1142.                         return true;

  1143.                 }

  1144.         }

  1145.         return false;

  1146. }

  1147. get_blocked_maps()

  1148. {

  1149.         new iCount = 0;

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

  1151.         {

  1152.                 if(g_BlockedMaps[i][COUNT]) iCount++;

  1153.         }

  1154.         return iCount;

  1155. }

  1156. clear_blocked_maps()

  1157. {

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

  1159.         {

  1160.                 g_BlockedMaps[i][MAP] = "";

  1161.                 g_BlockedMaps[i][COUNT] = 0;

  1162.         }

  1163.         delete_file(FILE_BLOCKEDMAPS);

  1164. }

  1165. get_blocked_map_count(map[])

  1166. {

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

  1168.         {

  1169.                 if(equali(g_BlockedMaps[i][MAP], map)) return g_BlockedMaps[i][COUNT];

  1170.         }

  1171.         return 0;

  1172. }

  1173. clear_nominated_maps(id)

  1174. {

  1175.         new Data[NOMINATE_DATA];

  1176.         for(new i = 0; i < ArraySize(g_iNominateArray); i++)

  1177.         {

  1178.                 ArrayGetArray(g_iNominateArray, i, Data);

  1179.                 if(Data[PLAYER] == id)

  1180.                 {

  1181.                         ArrayDeleteItem(g_iNominateArray, i--);

  1182.                         if(!--g_iNominatedMaps[id]) break;

  1183.                 }

  1184.         }

  1185. }

  1186. remove_nominated_map(id, map[])

  1187. {

  1188.         new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);

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

  1190.         {

  1191.                 ArrayGetArray(g_iNominateArray, i, Data);

  1192.                 if(Data[PLAYER] == id && equali(Data[MAP], map))

  1193.                 {

  1194.                         new szName[32]; get_user_name(id, szName, charsmax(szName));

  1195.                         g_iNominatedMaps[id]--;

  1196.                         ArrayDeleteItem(g_iNominateArray, i);

  1197.                         #if AMXX_VERSION_NUM < 183

  1198.                         ColorChat(0, BLUE, "^4%s^3 %s^1 убрал номинацию с карты^3 %s^1.", PREFIX, szName, map);

  1199.                         #else

  1200.                         client_print_color(0, Blue, "^4%s^3 %s^1 убрал номинацию с карты^3 %s^1.", PREFIX, szName, map);

  1201.                         #endif

  1202.                         break;

  1203.                 }

  1204.         }      

  1205. }

  1206. is_map_nominated(map[])

  1207. {

  1208.         new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);

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

  1210.         {

  1211.                 ArrayGetArray(g_iNominateArray, i, Data);

  1212.                 if(equali(Data[MAP], map)) return Data[PLAYER];

  1213.         }                      

  1214.         return 0;

  1215. }

  1216. bool:in_menu(num)

  1217. {

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

  1219.         {

  1220.                 if(num == g_iInMenu[i]) return true;

  1221.         }

  1222.         return false;

  1223. }

  1224. bool:is_blocked(num)

  1225. {

  1226.         new szMap[33]; ArrayGetString(g_iMapsArray, num, szMap, charsmax(szMap));      

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

  1228.         {

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

  1230.         }

  1231.         return false;

  1232. }

  1233. maps_in_menu()

  1234. {

  1235.         new map;

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

  1237.         {

  1238.                 if(g_iInMenu[i] != -1) map++;

  1239.         }

  1240.         return map;

  1241. }

  1242. stock get_players_num()

  1243. {

  1244.         new iPlayers = 0, iMax = get_maxplayers();

  1245.         for(new id = 1; id < iMax; id++)

  1246.         {

  1247.                 if(is_user_connected(id) && !is_user_bot(id) && !is_user_hltv(id)) iPlayers++;

  1248.         }

  1249.         return iPlayers;

  1250. }

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

  1252. {

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

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

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

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

  1257. }
[/pawn]
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение KaLPa4ek » 18 июл 2014, 00:35

спасибо, автору советую пересмотреть исходник и перезалить нормальный.
Моя группа CS:
https://vk.com/loveyou_cs
Присоединяйтесь)
Аватара пользователя
KaLPa4ek
 
Сообщения: 17
Зарегистрирован: 25 янв 2014, 22:46
Откуда: г. Калуш
Благодарил (а): 4 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Map Manager by Mistrick[1.2.2][23.06.2014]

Сообщение Nomexx » 28 июл 2014, 17:28

не компилируется
Аватара пользователя
Nomexx
 
Сообщения: 17
Зарегистрирован: 15 мар 2012, 17:55
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Пред.След.

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

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

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