HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. ///////////////////////////////////////////////////////////
  3.   /###///##/////##///###////////////####///////####///####///
  4. /#//#//#/#///#/#//#///////////////////#//////////#//////#//
  5. /#//#//#//#/#//#//#/////////#///#//####/////////#//////#///
  6. /#//#//#///#///#//#//////////#/#//#//////////////#//////#//
  7. /###///#///////#///###////////#///#####//##//####///####///
  8. ///////////////////////////////////////////////////////////
  9.  
  10. Author: DeRoiD
  11. Plugin name: DeRoiD's Mapchooser
  12. Plugin version: 2.33
  13. First relase: 2015/04/08
  14. Last update: 2015/06/25
  15. Reason for update: Rounds fix
  16.   Plugin link: forums.alliedmods.net/showthread.php?t=261412
  17.  
  18. Short description [default cvar]:
  19. - This plugin last 3 minutes or round open the "Vote a map" menu.
  20. - The one for which more people vote it will be the next map.
  21. - If best vote < min. vote percent then re-vote! There is a manner of two kinds.
  22.  
  23. You can [default cvar]:
  24. - rtv "Rock the vote" [players 1:2]
  25. - nom "Nomination" (in menu) [chance 50%]
  26. - see timeleft | nextmap [timeleft, nextmap]
  27. - see played maps and played counts [/playedmaps]
  28. - see current map
  29. - if you admin then can startvote (/startvote) [StartVoteFlag]
  30.  
  31. Changelog:
  32. - v1.00
  33. + First relase (hlmod.hu)
  34. + Map choose (Old method)
  35. + Played maps
  36. + Next map
  37. + Timeleft
  38.  
  39. - v1.20b
  40. + Rounds
  41. + Nomination
  42. + Admin vote
  43. + Rock the vote
  44.  
  45. - v1.30b
  46. + Previous map can not be choose
  47.  
  48. - v1.35b
  49. + Fix bugs
  50. + New chooser method
  51. + More map choices [MAX 9]
  52.  
  53. - v1.49a
  54. + Re-vote if vote percent < min percent
  55. + Removed hard coding paths.
  56.  
  57. - v1.53a
  58. + Fixed extend time [ +- 1 min ]
  59. + Fixed changelevel bug.
  60.  
  61. - v1.62a
  62. + Hud Counter
  63. + Change map only next round. (Cvar)
  64. + Fix bugs
  65.  
  66. - v1.63a
  67. + HudMsg -> SyncHudMsg
  68.  
  69. - v1.77a
  70. + Nobody votes bug fix
  71. + More languages
  72.  
  73. - v1.86a
  74. + Countdown sounds
  75.  
  76. - v2.00
  77. + Fix bugs
  78. + Check maps (valid)
  79. + Ad rounds in game (if rounds mod)
  80.  
  81. - v2.01
  82. + Current map
  83.  
  84. - v2.01.3
  85. + Fix RTV
  86.  
  87. - v2.30
  88. + Multilang toggle server/player
  89. + Start button
  90. + Map infos
  91.  
  92. - v2.33
  93. + Round fix
  94. + amx_dmc_maxrounds
  95.  
  96. Pugin like:
  97.  
  98. Choose the Next Map [All votes: 9]
  99.  
  100. 1. de_dust2 [votes: 1] (9%)
  101. 2. de_dust [votes: 0] (0%)
  102. 3. de_inferno [votes: 1] (9%)
  103. 4. de_train [votes: 5] (54%)
  104. 5. de_nuke [votes: 1] (9%)
  105.  
  106. 6. de_tuscan (current map) [votes: 1] (9%)
  107.  
  108.  
  109. [Next map: de_train]
  110.  
  111. You find bug?
  112. - deroidocska (steam)
  113. - https://forums.alliedmods.net/member.php?u=258497
  114.  
  115. Plugin tested in [32 Real Players]:
  116. - AMX 1.8.2
  117. - AMX 1.8.3-dev+4532
  118. - AMX 1.8.3-dev-git4751
  119.  
  120. Thanks for using this plugin!
  121. DeRoiD
  122.  
  123. ___________[Special thanks]___________
  124.  
  125. - fysiks for help to plugin (tips)
  126. - HamletEagle for help to plugin (tips)
  127. - mforce for idea
  128. - cs.stambeto for idea
  129. - OZH3NN for idea
  130.  
  131. - ACM1PT for translation [es]
  132. - JustVladK & K:O for translation [ro]
  133. - battlefield 3 for translation [ru]
  134. - Perfect Scrash for translation [bp]
  135. - Belo95135 for translation [sk]
  136. - wEight for translation [sr]
  137. - ANTICHRISTUS for translation [fr]
  138. ______________________________________
  139.  
  140.  
  141. Magyar nyelven is leirom!!! Koszonom, hogy ha ezt a plugint hasznalod! :)
  142. */
  143.  
  144. #include <amxmodx>
  145.  
  146. new const PLUGIN[] = "DeRoiD's Mapchooser";
  147. new const VERSION[] = "2.33";
  148. new const AUTHOR[] = "DeRoiD";
  149.  
  150. #define MapID 180912
  151.  
  152. #define R 240
  153. #define G 240
  154. #define B 240
  155.  
  156. #define CHUD 1.5
  157. #define MaxCSpeed 5.0
  158.  
  159. #define Max 200
  160. #define MinRounds 5
  161. #define MaxChoice 9
  162. #define PMPage 6
  163. #define MaxSB 8
  164.  
  165. #define StartVoteFlag ADMIN_LEVEL_A
  166. #define InfoFlag ADMIN_BAN
  167. #define RoundFlag ADMIN_RCON
  168.  
  169. #pragma semicolon 1
  170.  
  171. new MapFile[64], MapCycle[32], MapFile_Lines, MapCycle_Lines;
  172. new Maps[Max][32], MapName[32], MapNames[MaxChoice][32], MapRevote[2][32], NomMaps[Max][32], NomNum, Nom, Nomed[Max];
  173. new MapVote[MaxChoice], RevoteCounts[2], VoteMenu, RevoteMenu, MapCounter, LastMap[32], VotedMap[32], BeginCounter;
  174. new AllVotes, AllRevotes, Next[32], RTV, RTVTime[3], PlayerMap[33], ElapsedTime[3], VoteMod;
  175. new bool:Voted, bool:PlayerVoted[33], bool:ChangeMap, bool:Begined, bool:inProcess, bool:Revoted,
  176. bool:PlayerRTV[33], bool:toRTV, bool:AlreadyNom[33], bool:PlayerRevoted[33], bool:NeedRV;
  177. new SayText, Rounds, MaxRounds, TimeLimit, oRounds, Lang, StartButton, PlayedCount, Started;
  178.  
  179. new Cvar_WaitVoteMenuTime, Cvar_MenuDestroyTime, Cvar_RTVMinute, Cvar_VoteCounter,
  180. Cvar_NomChance, Cvar_VoteSound, Cvar_Extend, Cvar_StartRevoteTime, Cvar_VotePercentMin,
  181. Cvar_Nomination, Cvar_PlayedMaps, Cvar_RTV, Cvar_VoteVariable, Cvar_RTVMin, Cvar_Mod,
  182. Cvar_ChangeSpeed, Cvar_MaxMaps, Cvar_WaitRevoteMenuTime, Cvar_HudMod, Cvar_OnlyNextRound,
  183. Cvar_CountSound, Cvar_ChooseSound, Cvar_Ad, Cvar_StartButton, Cvar_LangMode;
  184.  
  185. new Prefix[32], sHudObj, Off;
  186.  
  187. new const MapMenuCommands[][] =
  188. {
  189. "/playedmaps",
  190. "/pm",
  191. "!playedmaps",
  192. "!pm",
  193. "playedmaps",
  194. "pm"
  195. };
  196. new const TimeLeftCommands[][] =
  197. {
  198. "/timeleft",
  199. "/tl",
  200. "!timeleft",
  201. "!tl",
  202. "timeleft",
  203. "tl"
  204. };
  205. new const NextMapCommands[][] =
  206. {
  207. "/nextmap",
  208. "/nm",
  209. "!nextmap",
  210. "!nm",
  211. "nextmap",
  212. "nm"
  213. };
  214. new const AdminCommands[][] =
  215. {
  216. "/startvote",
  217. "!startvote",
  218. "startvote"
  219. };
  220. new const RTVCommands[][] =
  221. {
  222. "/rtv",
  223. "!rtv",
  224. "/rockthevote",
  225. "!rockthevote",
  226. "rockthevote",
  227. "rtv"
  228. };
  229. new const NomCommands[][] =
  230. {
  231. "/nom",
  232. "!nom",
  233. "/nomination",
  234. "!nomination",
  235. "nom",
  236. "nomination"
  237. };
  238. new const CurrentMapCommands[][] =
  239. {
  240. "/currentmap",
  241. "!currentmap",
  242. "/cm",
  243. "!cm",
  244. "currentmap",
  245. "cm"
  246. };
  247.  
  248. public plugin_init()
  249. {
  250. register_plugin(PLUGIN, VERSION, AUTHOR);
  251. register_cvar(PLUGIN, VERSION, FCVAR_SERVER);
  252. register_dictionary("dmc.txt");
  253. sHudObj = CreateHudSyncObj();
  254.  
  255. static ConfigsDir[64];
  256. get_localinfo("amxx_configsdir", ConfigsDir, 63);
  257. formatex(MapFile, 63, "%s/dmc/mapdatas.dmc", ConfigsDir);
  258. get_localinfo("amxx_configsdir", ConfigsDir, 63);
  259. formatex(MapCycle, 31, "mapcycle.txt");
  260. formatex(Prefix, 31, "!g[DMC]");
  261.  
  262. MapFile_Lines = file_size(MapFile, 1);
  263. MapCycle_Lines = file_size(MapCycle, 1);
  264.  
  265. Cvar_Mod = register_cvar("dmc_mod", "1");
  266. Cvar_HudMod = register_cvar("dmc_hudmod", "1");
  267. Cvar_ChangeSpeed = register_cvar("dmc_changespeed", "5.0");
  268. Cvar_WaitVoteMenuTime = register_cvar("dmc_waitvotemenutime", "10.0");
  269. Cvar_WaitRevoteMenuTime = register_cvar("dmc_waitrevotemenutime", "5.0");
  270. Cvar_MenuDestroyTime = register_cvar("dmc_menudestroyTime", "5.0");
  271. Cvar_RTVMinute = register_cvar("dmc_rtvminute", "10");
  272. Cvar_VoteCounter = register_cvar("dmc_votecounter", "15");
  273. Cvar_VoteVariable = register_cvar("dmc_votevariable", "3");
  274. Cvar_VotePercentMin = register_cvar("dmc_votepercent", "50");
  275. Cvar_MaxMaps = register_cvar("dmc_maxmaps", "5");
  276. Cvar_Nomination = register_cvar("dmc_nomination", "1");
  277. Cvar_PlayedMaps = register_cvar("dmc_playedmaps", "1");
  278. Cvar_RTV = register_cvar("dmc_rtv", "1");
  279. Cvar_VoteSound = register_cvar("dmc_votesound", "1");
  280. Cvar_RTVMin = register_cvar("dmc_rtvmin", "2");
  281. Cvar_NomChance = register_cvar("dmc_nomchance", "50");
  282. Cvar_Extend = register_cvar("dmc_extend", "15");
  283. Cvar_StartRevoteTime = register_cvar("dmc_startrevotetime", "5.0");
  284. Cvar_OnlyNextRound = register_cvar("dmc_onlynextround", "1");
  285. Cvar_CountSound = register_cvar("dmc_countsound", "1");
  286. Cvar_ChooseSound = register_cvar("dmc_choosesound", "1");
  287. Cvar_Ad = register_cvar("dmc_ad", "1");
  288. Cvar_LangMode = register_cvar("dmc_langmode", "0");
  289. Cvar_StartButton = register_cvar("dmc_startbutton", "1");
  290.  
  291. server_cmd("exec %s/dmc/dmc.cfg", ConfigsDir);
  292. server_exec();
  293. set_cvar_float("mp_chattime", 120.0);
  294.  
  295. register_concmd("amx_dmc", "ShowInfo");
  296.  
  297. VoteMenu = register_menuid("VoteMenu");
  298. RevoteMenu = register_menuid("RevoteMenu");
  299. register_menucmd(VoteMenu, 1023, "VoteMenuKeys");
  300. register_menucmd(RevoteMenu, 1023, "RevoteMenuKeys");
  301. SayText = get_user_msgid("SayText");
  302.  
  303. TimeLimit = get_cvar_num("mp_timelimit");
  304. MaxRounds = get_cvar_num("mp_maxrounds");
  305. oRounds = MaxRounds;
  306.  
  307. if(get_pcvar_num(Cvar_LangMode) == 0)
  308. {
  309. Lang = 0;
  310. }
  311. else
  312. {
  313. Lang = -1;
  314. }
  315.  
  316. StartButton = get_pcvar_num(Cvar_StartButton);
  317.  
  318. if(StartButton < 1)
  319. {
  320. set_pcvar_num(Cvar_StartButton, 1);
  321. }
  322.  
  323. if(StartButton > 1 && StartButton <= MaxSB)
  324. {
  325. new Check;
  326. Check = get_pcvar_num(Cvar_MaxMaps) + get_pcvar_num(Cvar_StartButton);
  327.  
  328. if(Check > 9)
  329. {
  330. Check = MaxChoice - get_pcvar_num(Cvar_MaxMaps);
  331. if(0 != Check - StartButton)
  332. {
  333. Check -= StartButton;
  334. Check = -Check;
  335. set_pcvar_num(Cvar_MaxMaps, get_pcvar_num(Cvar_MaxMaps)-Check+1);
  336. }
  337. }
  338. }
  339. else if(StartButton > MaxSB)
  340. {
  341. StartButton = MaxSB;
  342. set_pcvar_num(Cvar_MaxMaps, 2);
  343. }
  344. else
  345. {
  346. StartButton = 1;
  347. }
  348.  
  349. if(get_pcvar_num(Cvar_MaxMaps) > MaxChoice)
  350. {
  351. set_pcvar_num(Cvar_MaxMaps, MaxChoice);
  352. }
  353.  
  354. if(get_pcvar_num(Cvar_MaxMaps) <= 1)
  355. {
  356. set_pcvar_num(Cvar_MaxMaps, 2);
  357. }
  358.  
  359. if(get_pcvar_float(Cvar_ChangeSpeed) > MaxCSpeed)
  360. {
  361. set_pcvar_float(Cvar_ChangeSpeed, MaxCSpeed);
  362. }
  363.  
  364. if(get_pcvar_float(Cvar_ChangeSpeed) < 1.0)
  365. {
  366. set_pcvar_float(Cvar_ChangeSpeed, 1.0);
  367. }
  368.  
  369. if(MapCycle_Lines-get_pcvar_num(Cvar_MaxMaps) < 0)
  370. {
  371. new Error[64];
  372. formatex(Error, charsmax(Error), "Only %d maps in %s file! (Min: %d)", MapCycle_Lines, MapCycle, get_pcvar_num(Cvar_MaxMaps));
  373. log_amx(Error);
  374.  
  375. if(MapCycle_Lines > 1)
  376. {
  377. set_pcvar_num(Cvar_MaxMaps, MapCycle_Lines);
  378. formatex(Error, charsmax(Error), "MaxMaps set %d", MapCycle_Lines);
  379. log_amx(Error);
  380. }
  381. else
  382. {
  383. Off = 1;
  384. }
  385. }
  386.  
  387. if(TimeLimit == 0 && get_pcvar_num(Cvar_Mod) == 1)
  388. {
  389. Off = 1;
  390. }
  391.  
  392. if(Off == 0)
  393. {
  394. register_event("HLTV", "NewRound", "a", "1=0", "2=0");
  395. register_logevent("SavePresentTime", 2, "0=World triggered", "1=Game_Commencing");
  396. register_logevent("RestartRound", 2, "0=World triggered", "1&Restart_Round_");
  397. register_logevent("RestartRound", 2, "0=World triggered", "1=Game_Commencing");
  398.  
  399. if(get_pcvar_num(Cvar_Mod) == 0)
  400. {
  401. register_logevent("RoundEnd", 2, "0=World triggered", "1=Round_End");
  402. }
  403.  
  404. set_task(0.5, "CheckTime", MapID-1, _, _, "b");
  405.  
  406. if(get_pcvar_num(Cvar_Mod) == 0)
  407. {
  408. register_concmd("amx_dmc_maxrounds", "AddRound");
  409.  
  410. if(MaxRounds < MinRounds)
  411. {
  412. server_cmd("mp_maxrounds ^"%d^"", MinRounds);
  413. }
  414.  
  415. server_cmd("mp_timelimit 0");
  416.  
  417. MaxRounds = get_cvar_num("mp_maxrounds");
  418. oRounds = MaxRounds;
  419. }
  420.  
  421. if(get_pcvar_num(Cvar_Mod) == 1)
  422. {
  423. server_cmd("mp_maxrounds 0");
  424. }
  425. }
  426.  
  427. get_mapname(MapName, charsmax(MapName));
  428. get_localinfo("lastMap", LastMap, 31);
  429.  
  430. set_task(random_float(0.1, 0.5), "LoadMaps");
  431. set_task(random_float(0.1, 0.5), "LoadVoteMaps");
  432. set_task(random_float(0.1, 0.5), "SavePresentTime");
  433.  
  434. if(get_pcvar_num(Cvar_Ad) == 1)
  435. {
  436. set_task(random_float(100.0, 200.0), "AdvTime", MapID-10, _, _, "b");
  437. }
  438.  
  439. toRTV = false;
  440.  
  441. new Cmd[32];
  442.  
  443. if(get_pcvar_num(Cvar_PlayedMaps) == 1)
  444. {
  445. for(new Num = 0; Num < sizeof MapMenuCommands; Num++)
  446. {
  447. format(Cmd, charsmax(Cmd), "say %s", MapMenuCommands[Num]);
  448. register_clcmd(Cmd, "ShowMapMenu");
  449. }
  450. }
  451.  
  452. for(new Num = 0; Num < sizeof NextMapCommands; Num++)
  453. {
  454. format(Cmd, charsmax(Cmd), "say %s", NextMapCommands[Num]);
  455. register_clcmd(Cmd, "ShowNextMap");
  456. }
  457.  
  458. for(new Num = 0; Num < sizeof CurrentMapCommands; Num++)
  459. {
  460. format(Cmd, charsmax(Cmd), "say %s", CurrentMapCommands[Num]);
  461. register_clcmd(Cmd, "ShowCurrentMap");
  462. }
  463.  
  464. for(new Num = 0; Num < sizeof TimeLeftCommands; Num++)
  465. {
  466. format(Cmd, charsmax(Cmd), "say %s", TimeLeftCommands[Num]);
  467. register_clcmd(Cmd, "ShowTimeLeft");
  468. }
  469.  
  470. for(new Num = 0; Num < sizeof AdminCommands; Num++)
  471. {
  472. format(Cmd, charsmax(Cmd), "say %s", AdminCommands[Num]);
  473. register_clcmd(Cmd, "StartVote");
  474. }
  475.  
  476. if(get_pcvar_num(Cvar_RTV) == 1)
  477. {
  478. for(new Num = 0; Num < sizeof RTVCommands; Num++)
  479. {
  480. format(Cmd, charsmax(Cmd), "say %s", RTVCommands[Num]);
  481. register_clcmd(Cmd, "RockTheVote");
  482. }
  483. }
  484.  
  485. if(get_pcvar_num(Cvar_Nomination) == 1)
  486. {
  487. for(new Num = 0; Num < sizeof NomCommands; Num++)
  488. {
  489. format(Cmd, charsmax(Cmd), "say %s", NomCommands[Num]);
  490. register_clcmd(Cmd, "ShowNomMenu");
  491. }
  492. }
  493. }
  494. public AddRound(id) {
  495. if(get_user_flags(id) & RoundFlag)
  496. {
  497. new sRound[32], RoundNum;
  498. read_args(sRound, charsmax(sRound));
  499. remove_quotes(sRound);
  500.  
  501. RoundNum = str_to_num(sRound);
  502.  
  503. MaxRounds = RoundNum+Rounds;
  504. set_cvar_num("mp_maxrounds", get_cvar_num("mp_maxrounds")+RoundNum);
  505. }
  506. }
  507. public SavePresentTime()
  508. {
  509. new Hour[32], Minute[32], Second[32];
  510. format_time(Hour, sizeof Hour - 1, "%H");
  511. format_time(Minute, sizeof Minute - 1, "%M");
  512. format_time(Second, sizeof Second - 1, "%S");
  513. ElapsedTime[0] = str_to_num(Second);
  514. ElapsedTime[1] = str_to_num(Minute);
  515. ElapsedTime[2] = str_to_num(Hour);
  516. RTVTime[2] = str_to_num(Hour);
  517. RTVTime[1] = str_to_num(Minute)+get_pcvar_num(Cvar_RTVMinute);
  518. RTVTime[0] = str_to_num(Second);
  519.  
  520. if(RTVTime[1] >= 60)
  521. {
  522. RTVTime[1] -= 60;
  523. RTVTime[2]++;
  524. }
  525. }
  526. public plugin_end()
  527. {
  528. set_localinfo("lastMap", MapName);
  529. }
  530. public AdvTime()
  531. {
  532. print_color(0, "%s %L", Prefix, Lang, "ADV", PLUGIN, VERSION);
  533. }
  534. public RestartRound() {
  535. if(get_pcvar_num(Cvar_Mod) == 1)
  536. server_cmd("mp_timelimit %d", TimeLimit);
  537. else
  538. {
  539. server_cmd("mp_maxrounds %d", get_cvar_num("mp_maxrounds")+oRounds+Rounds);
  540. MaxRounds = oRounds+Rounds;
  541. }
  542.  
  543. remove_task(MapID+8123);
  544. remove_task(MapID+1);
  545. remove_task(MapID+211);
  546. remove_task(MapID+2);
  547. remove_task(MapID+3);
  548. remove_task(MapID+33);
  549. NeedRV = false;
  550. ChangeMap = false;
  551. Begined = false;
  552. BeginCounter = 0;
  553. MapCounter = 0;
  554. Voted = false;
  555. Revoted = false;
  556. inProcess = false;
  557. AllVotes = 0;
  558. AllRevotes = 0;
  559. Started = 0;
  560.  
  561. new Num;
  562.  
  563. for(Num = 0; Num < 32; Num++)
  564. {
  565. if(!is_user_connected(Num))
  566. {
  567. continue;
  568. }
  569.  
  570. AlreadyNom[Num] = false;
  571. PlayerMap[Num] = 0;
  572. PlayerVoted[Num] = false;
  573. PlayerRevoted[Num] = false;
  574. }
  575.  
  576. for(Num = 0; Num < Nom; Num++)
  577. {
  578. NomMaps[Num] = "";
  579. }
  580.  
  581. for(Num = 0; Num < Max; Num++)
  582. {
  583. Nomed[Num] = 0;
  584. }
  585.  
  586. for(Num = 0; Num < get_pcvar_num(Cvar_MaxMaps); Num++)
  587. {
  588. MapNames[Num] = "";
  589. MapVote[Num] = 0;
  590. }
  591.  
  592. RTV = 0;
  593. Nom = 0;
  594. LoadVoteMaps();
  595. LoadNomMaps();
  596. Next = "";
  597. set_task(get_pcvar_float(Cvar_MenuDestroyTime)+1.0, "VotedMapN", MapID+777);
  598. SavePresentTime();
  599. }
  600. public NewRound() {
  601. if(get_pcvar_num(Cvar_Mod) == 1)
  602. {
  603. if(ChangeMap)
  604. {
  605. if(isValidMap(Next))
  606. {
  607. ChangeLevel();
  608. }
  609. }
  610. }
  611. else if(get_pcvar_num(Cvar_Mod) == 0)
  612. {
  613. if(0 >= MaxRounds-Rounds)
  614. {
  615. if(ChangeMap)
  616. {
  617. if(isValidMap(Next))
  618. {
  619. ChangeLevel();
  620. }
  621. }
  622. }
  623. }
  624. }
  625. public RoundEnd()
  626. {
  627. if(MaxRounds-Rounds > 0 && Started == 1)
  628. {
  629. Rounds++;
  630. }
  631. if(Started == 0)
  632. {
  633. Started = 1;
  634. }
  635. }
  636. public StartVote(id)
  637. {
  638. if(get_user_flags(id) & StartVoteFlag)
  639. {
  640. if(!inProcess || !Voted || !Revoted || !ChangeMap || Off == 0 || !Begined)
  641. {
  642. NeedRV = false;
  643. new String[32];
  644. float_to_str(get_pcvar_float(Cvar_WaitVoteMenuTime), String, 2);
  645. replace_all(String, 2, ".", "");
  646. Begined = true;
  647. inProcess = true;
  648.  
  649. if(get_pcvar_num(Cvar_Mod) == 1)
  650. {
  651. server_cmd("mp_timelimit 0");
  652. }
  653. else if(get_pcvar_num(Cvar_Mod) == 0)
  654. {
  655. Rounds = MaxRounds;
  656. }
  657.  
  658. VoteMod = 2;
  659.  
  660. if(get_pcvar_num(Cvar_HudMod) == 1)
  661. {
  662. remove_task(MapID+8123);
  663. BeginCounter = str_to_num(String);
  664. VoteCounter();
  665. }
  666. else if(get_pcvar_num(Cvar_HudMod) == 0)
  667. {
  668. set_task(get_pcvar_float(Cvar_WaitVoteMenuTime), "StartMapChooser", MapID+3);
  669. set_hudmessage(R, G, B, -1.0, 0.20, 0, 6.0, get_pcvar_float(Cvar_WaitVoteMenuTime));
  670. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE2", String);
  671. }
  672. }
  673. }
  674. }
  675. public VoteCounter()
  676. {
  677. if(BeginCounter > 0)
  678. {
  679. new String[32];
  680. num_to_str(BeginCounter, String, 2);
  681.  
  682. if(get_pcvar_num(Cvar_CountSound) == 1)
  683. {
  684. new CountSound[32];
  685. num_to_word(BeginCounter, CountSound, 31);
  686.  
  687. if(get_pcvar_num(Cvar_VoteSound) == 1)
  688. client_cmd(0, "spk ^"fvox/%s^"", CountSound);
  689. }
  690.  
  691. set_hudmessage(R, G, B, -1.0, 0.20, 0, 0.1, CHUD);
  692.  
  693. if(VoteMod == 4)
  694. {
  695. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE4", String);
  696. }
  697. else if(VoteMod == 3)
  698. {
  699. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE3", String);
  700. }
  701. else if(VoteMod == 2)
  702. {
  703. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE2", String);
  704. }
  705. else if(VoteMod == 1)
  706. {
  707. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE1", String);
  708. }
  709.  
  710. BeginCounter--;
  711. set_task(1.0, "VoteCounter", MapID+8123);
  712. }
  713. else
  714. {
  715. if(NeedRV)
  716. {
  717. StartRevote();
  718. }
  719. else
  720. {
  721. StartMapChooser();
  722. }
  723. }
  724. }
  725. public RockTheVote(id)
  726. {
  727. new Hour[32], Minute[32], Time[2];
  728. format_time(Hour, sizeof Hour - 1, "%H");
  729. format_time(Minute, sizeof Minute - 1, "%M");
  730. Time[0] = str_to_num(Hour);
  731. Time[1] = str_to_num(Minute);
  732.  
  733. if(Time[0] > RTVTime[2]
  734. || Time[0] == RTVTime[2] && Time[1] >= RTVTime[1])
  735. toRTV = true;
  736.  
  737. if(PlayerRTV[id] || Voted || inProcess || !toRTV || Off == 1)
  738. {
  739. if(!toRTV)
  740. {
  741. if(RTVTime[2] > Time[0])
  742. {
  743. print_color(id, "%s %L", Prefix, Lang, "RTV2", (RTVTime[1]+60)-Time[1]);
  744. }
  745. else
  746. {
  747. print_color(id, "%s %L", Prefix, Lang, "RTV2", RTVTime[1]-Time[1]);
  748. }
  749. }
  750.  
  751. if(PlayerRTV[id])
  752. {
  753. print_color(id, "%s %L", Prefix, Lang, "RTV1");
  754. }
  755.  
  756. return PLUGIN_HANDLED;
  757. }
  758.  
  759. PlayerRTV[id] = true;
  760. RTV++;
  761.  
  762. new Players[32], Num;
  763. get_players(Players, Num, "c");
  764.  
  765. if(RTV >= Num/get_pcvar_num(Cvar_RTVMin))
  766. {
  767. new String[32];
  768. float_to_str(get_pcvar_float(Cvar_WaitVoteMenuTime), String, 2);
  769. replace_all(String, 2, ".", "");
  770. Begined = true;
  771. inProcess = true;
  772.  
  773. if(get_pcvar_num(Cvar_Mod) == 1)
  774. {
  775. server_cmd("mp_timelimit 0");
  776. }
  777. else if(get_pcvar_num(Cvar_Mod) == 0)
  778. {
  779. Rounds = MaxRounds;
  780. }
  781.  
  782. VoteMod = 1;
  783.  
  784. if(get_pcvar_num(Cvar_HudMod) == 1)
  785. {
  786. remove_task(MapID+8123);
  787. BeginCounter = str_to_num(String);
  788. VoteCounter();
  789. }
  790. else if(get_pcvar_num(Cvar_HudMod) == 0)
  791. {
  792. set_task(get_pcvar_float(Cvar_WaitVoteMenuTime), "StartMapChooser", MapID+3);
  793. set_hudmessage(R, G, B, -1.0, 0.20, 0, 6.0, get_pcvar_float(Cvar_WaitVoteMenuTime));
  794. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE1", String);
  795. }
  796. }
  797. else
  798. {
  799. print_color(0, "%s %L", Prefix, Lang, "RTV3", (Num/get_pcvar_num(Cvar_RTVMin))-RTV);
  800. }
  801.  
  802. return PLUGIN_HANDLED;
  803. }
  804. public Extend()
  805. {
  806. NeedRV = false;
  807. ChangeMap = false;
  808. Begined = false;
  809. Voted = false;
  810. Revoted = false;
  811. inProcess = false;
  812. AllVotes = 0;
  813. AllRevotes = 0;
  814.  
  815. new Num;
  816.  
  817. for(Num = 0; Num < 32; Num++)
  818. {
  819. if(!is_user_connected(Num))
  820. {
  821. continue;
  822. }
  823.  
  824. AlreadyNom[Num] = false;
  825. PlayerMap[Num] = 0;
  826. PlayerVoted[Num] = false;
  827. PlayerRevoted[Num] = false;
  828. }
  829.  
  830. for(Num = 0; Num < Nom; Num++)
  831. {
  832. NomMaps[Num] = "";
  833. }
  834.  
  835. for(Num = 0; Num < Max; Num++)
  836. {
  837. Nomed[Num] = 0;
  838. }
  839.  
  840. for(Num = 0; Num < get_pcvar_num(Cvar_MaxMaps); Num++)
  841. {
  842. MapNames[Num] = "";
  843. MapVote[Num] = 0;
  844. }
  845.  
  846. RTV = 0;
  847. Nom = 0;
  848. LoadVoteMaps();
  849. LoadNomMaps();
  850. Next = "";
  851. set_task(get_pcvar_float(Cvar_MenuDestroyTime)+1.0, "VotedMapN", MapID+777);
  852. }
  853. public VotedMapN()
  854. {
  855. VotedMap = "";
  856. }
  857. public CheckTime()
  858. {
  859. static Time[3];
  860. Time[0] = get_timeleft();
  861. Time[1] = Time[0] / 60;
  862. Time[2] = Time[1] / 60;
  863. Time[0] = Time[0] - Time[1] * 60;
  864. Time[1] = Time[1] - Time[2] * 60;
  865.  
  866. if(get_pcvar_num(Cvar_Mod) == 1)
  867. {
  868. if(Time[1] <= get_pcvar_num(Cvar_VoteVariable) && !Begined && !inProcess)
  869. {
  870. new String[32];
  871. float_to_str(get_pcvar_float(Cvar_WaitVoteMenuTime), String, 2);
  872. replace_all(String, 2, ".", "");
  873.  
  874. VoteMod = 3;
  875.  
  876. if(get_pcvar_num(Cvar_HudMod) == 1)
  877. {
  878. remove_task(MapID+8123);
  879. BeginCounter = str_to_num(String);
  880. VoteCounter();
  881. }
  882. else if(get_pcvar_num(Cvar_HudMod) == 0)
  883. {
  884. set_task(get_pcvar_float(Cvar_WaitVoteMenuTime), "StartMapChooser", MapID+3);
  885. set_hudmessage(R, G, B, -1.0, 0.20, 0, 6.0, get_pcvar_float(Cvar_WaitVoteMenuTime));
  886. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE3", String);
  887. }
  888.  
  889. Begined = true;
  890. inProcess = true;
  891. }
  892.  
  893. if(Time[0] <= 3 && Time[1] == 0 && Time[2] == 0)
  894. {
  895. server_cmd("mp_timelimit 0");
  896. if(!ChangeMap && Voted && !inProcess && !Revoted
  897. || !ChangeMap && Revoted && !inProcess && !Voted)
  898. {
  899. if(get_pcvar_num(Cvar_OnlyNextRound) == 1)
  900. {
  901. print_color(0, "%s %L", Prefix, Lang, "MCAR");
  902. set_cvar_string("amx_nextmap", Next);
  903. ChangeMap = true;
  904. }
  905. else if(get_pcvar_num(Cvar_OnlyNextRound) == 0)
  906. {
  907. ChangeMap = true;
  908. set_cvar_string("amx_nextmap", Next);
  909. ChangeLevel();
  910. }
  911. }
  912. }
  913. }
  914. else if(get_pcvar_num(Cvar_Mod) == 0)
  915. {
  916. if(Rounds == MaxRounds-get_pcvar_num(Cvar_VoteVariable) && !Begined && !inProcess)
  917. {
  918. new String[32];
  919. float_to_str(get_pcvar_float(Cvar_WaitVoteMenuTime), String, 2);
  920. replace_all(String, 2, ".", "");
  921.  
  922. VoteMod = 3;
  923.  
  924. if(get_pcvar_num(Cvar_HudMod) == 1)
  925. {
  926. remove_task(MapID+8123);
  927. BeginCounter = str_to_num(String);
  928. VoteCounter();
  929. }
  930. else if(get_pcvar_num(Cvar_HudMod) == 0)
  931. {
  932. set_task(get_pcvar_float(Cvar_WaitVoteMenuTime), "StartMapChooser", MapID+3);
  933. set_hudmessage(R, G, B, -1.0, 0.20, 0, 6.0, get_pcvar_float(Cvar_WaitVoteMenuTime));
  934. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE3", String);
  935. }
  936.  
  937. Begined = true;
  938. inProcess = true;
  939. }
  940.  
  941. if(Rounds >= MaxRounds && !ChangeMap && Voted
  942. || Rounds >= MaxRounds && !ChangeMap && Revoted)
  943. {
  944. print_color(0, "%s %L", Prefix, Lang, "MCAR");
  945. set_cvar_string("amx_nextmap", Next);
  946. ChangeMap = true;
  947. }
  948. }
  949.  
  950. if(!toRTV)
  951. {
  952. new Hour[32], Minute[32];
  953. format_time(Hour, sizeof Hour - 1, "%H");
  954. format_time(Minute, sizeof Minute - 1, "%M");
  955. Time[2] = str_to_num(Hour);
  956. Time[1] = str_to_num(Minute);
  957.  
  958. if(RTVTime[2] == Time[2] && RTVTime[1]+get_pcvar_num(Cvar_RTVMinute) <= Time[1])
  959. {
  960. toRTV = true;
  961. }
  962. }
  963. }
  964. public StartMapChooser()
  965. {
  966. remove_task(MapID+3);
  967. ChangeMap = false;
  968. Voted = false;
  969. Revoted = false;
  970. MapCounter = get_pcvar_num(Cvar_VoteCounter);
  971. Counter();
  972. VoteMod = 0;
  973. if(get_pcvar_num(Cvar_VoteSound) == 1)
  974. {
  975. client_cmd(0, "spk Gman/Gman_Choose%i", random_num(1, 2));
  976. }
  977. }
  978. public Change()
  979. {
  980. if(ChangeMap)
  981. {
  982. server_cmd("changelevel ^"%s^"", Next);
  983. }
  984. }
  985. public ShowInfo(id)
  986. {
  987. if(get_user_flags(id) & InfoFlag)
  988. {
  989. client_print(id, print_console, "* ------------");
  990. client_print(id, print_console, "* %s - v%s *", PLUGIN, VERSION);
  991. client_print(id, print_console, "* ------------");
  992. client_print(id, print_console, "* Last map: %s", LastMap);
  993. client_print(id, print_console, "* Next map: %s", Next);
  994. client_print(id, print_console, "* Total maps: %d", NomNum);
  995. client_print(id, print_console, "* ------------");
  996. client_print(id, print_console, "* Original timeleft: %d", TimeLimit);
  997. client_print(id, print_console, "* Max Rounds: %d", oRounds);
  998. client_print(id, print_console, "* ------------");
  999. client_print(id, print_console, "* Total played count: %d", PlayedCount);
  1000. client_print(id, print_console, "* ------------");
  1001. }
  1002. }
  1003. public ShowTimeLeft()
  1004. {
  1005. if(get_pcvar_num(Cvar_Mod) == 1)
  1006. {
  1007. static Time[3];
  1008. Time[0] = get_timeleft();
  1009. Time[1] = Time[0] / 60;
  1010. Time[2] = Time[1] / 60;
  1011. Time[0] = Time[0] - Time[1] * 60;
  1012. Time[1] = Time[1] - Time[2] * 60;
  1013. if(ChangeMap && Voted && Begined && !Revoted || ChangeMap && Revoted && Begined && !Voted)
  1014. {
  1015. print_color(0, "%s!y %L!t !t-!y:!t-", Prefix, Lang, "TL");
  1016. }
  1017. else
  1018. {
  1019. if(Time[2] > 0 && Time[1] > 0 && Time[0] > 0)
  1020. print_color(0, "%s!y %L!t %d%!y:!t%02d!y:!t%02d", Prefix, Lang, "TL", Time[2], Time[1], Time[0]);
  1021. else if(Time[1] > 0 && Time[0] > 0)
  1022. print_color(0, "%s!y %L!t %02d!y:!t%02d", Prefix, Lang, "TL", Time[1], Time[0]);
  1023. else
  1024. print_color(0, "%s!y %L!t !t-!y:!t-", Prefix, Lang, "TL");
  1025. }
  1026. }
  1027. else if(get_pcvar_num(Cvar_Mod) == 0)
  1028. {
  1029. print_color(0, "%s!t %L", Prefix, Lang, "RM", MaxRounds-Rounds);
  1030. }
  1031. }
  1032. public ShowNextMap()
  1033. {
  1034. new Status[2][32];
  1035. formatex(Status[0], 31, "%L", Lang, "NYT");
  1036. formatex(Status[1], 31, "%L", Lang, "VIP");
  1037. if(isValidMap(Next))
  1038. print_color(0, "%s!y %L!t %s", Prefix, Lang, "NM", Next);
  1039. else
  1040. {
  1041. if(inProcess)
  1042. {
  1043. print_color(0, "%s!y %L!t %s", Prefix, Lang, "NM", Status[1]);
  1044. }
  1045. else
  1046. {
  1047. print_color(0, "%s!y %L!t %s", Prefix, Lang, "NM", Status[0]);
  1048. }
  1049. }
  1050. }
  1051. public ShowCurrentMap()
  1052. {
  1053. print_color(0, "%s!y %L", Prefix, Lang, "CM", MapName);
  1054. }
  1055. public Counter()
  1056. {
  1057. if(MapCounter < 1)
  1058. {
  1059. Voted = true;
  1060.  
  1061. inProcess = false;
  1062.  
  1063. CheckVotes();
  1064.  
  1065. for(new Num; Num < 32; Num++)
  1066. {
  1067. if(!is_user_connected(Num))
  1068. continue;
  1069.  
  1070. ShowVoteMenu(Num);
  1071. }
  1072. }
  1073. else
  1074. {
  1075. MapCounter--;
  1076.  
  1077. set_task(1.0, "Counter", MapID+1);
  1078.  
  1079. for(new Num; Num < 32; Num++)
  1080. {
  1081. if(!is_user_connected(Num))
  1082. continue;
  1083.  
  1084. ShowVoteMenu(Num);
  1085. }
  1086. }
  1087. }
  1088. public NextMap()
  1089. {
  1090. remove_task(MapID-4);
  1091.  
  1092. if(!NeedRV)
  1093. {
  1094. ShowNextMap();
  1095. }
  1096.  
  1097. set_task(get_pcvar_float(Cvar_MenuDestroyTime), "DestroyVoteMenu", MapID-4);
  1098. }
  1099. public DestroyVoteMenu()
  1100. {
  1101. for(new Num; Num < 32; Num++)
  1102. {
  1103. if(!is_user_connected(Num))
  1104. continue;
  1105.  
  1106. show_menu(Num, 0, "^n", 1);
  1107. }
  1108. }
  1109. public ShowVoteMenu(id)
  1110. {
  1111. if(equal(VotedMap, MapName))
  1112. {
  1113. DestroyVoteMenu();
  1114. return;
  1115. }
  1116.  
  1117. new Menu[512], String[128], Key, MapPercent[MaxChoice];
  1118.  
  1119. AllVotes = 0;
  1120.  
  1121. for(new All; All < get_pcvar_num(Cvar_MaxMaps); All++)
  1122. {
  1123. AllVotes += MapVote[All];
  1124. }
  1125.  
  1126. formatex(String, 127, "%L", Lang, "CHONM", AllVotes);
  1127. add(Menu, 511, String);
  1128.  
  1129. for(new Num; Num < get_pcvar_num(Cvar_MaxMaps); Num++)
  1130. {
  1131. if(MapVote[Num] > 0)
  1132. MapPercent[Num] = ((MapVote[Num]*100)/(AllVotes));
  1133. if(equal(MapName, MapNames[Num]))
  1134. formatex(String, 127, "%L", Lang, "MOP5", Num+StartButton, MapNames[Num], MapVote[Num], MapPercent[Num]);
  1135. else
  1136. formatex(String, 127, "%L", Lang, "MOPD", Num+StartButton, MapNames[Num], MapVote[Num], MapPercent[Num]);
  1137. add(Menu, 511, String);
  1138. }
  1139.  
  1140. if(Voted)
  1141. formatex(String, 127, "%L", Lang, "MNM", Next);
  1142. else if(!Revoted && !Voted && MapCounter <= 0 && NeedRV)
  1143. formatex(String, 127, "%L", Lang, "MNRE");
  1144. else
  1145. formatex(String, 127, "%L", Lang, "MCSL", MapCounter);
  1146.  
  1147. add(Menu, 511, String);
  1148.  
  1149. Key = (-1^(-1<<(get_pcvar_num(Cvar_MaxMaps)+StartButton)));
  1150.  
  1151. show_menu(id, Key, Menu, -1, "VoteMenu");
  1152. }
  1153. public VoteMenuKeys(id, Key)
  1154. {
  1155. if(PlayerVoted[id] || Voted)
  1156. {
  1157. if(PlayerVoted[id])
  1158. {
  1159. print_color(id, "%s %L", Prefix, Lang, "AVO");
  1160. }
  1161. return;
  1162. }
  1163.  
  1164. if(!Begined || NeedRV)
  1165. {
  1166. show_menu(id, 0, "^n", 1);
  1167. return;
  1168. }
  1169.  
  1170. new PlayerName[32];
  1171. get_user_name(id, PlayerName, 31);
  1172.  
  1173. Key -= StartButton-1;
  1174. if(Key < get_pcvar_num(Cvar_MaxMaps) && Key > -1)
  1175. {
  1176. PlayerMap[id] = Key;
  1177. PlayerVoted[id] = true;
  1178. print_color(0, "%s %L", Prefix, Lang, "PCHO", PlayerName, MapNames[Key]);
  1179. MapVote[Key]++;
  1180. if(get_pcvar_num(Cvar_ChooseSound) == 1)
  1181. {
  1182. client_cmd(0, "spk buttons/lightswitch2");
  1183. }
  1184. }
  1185.  
  1186. ShowVoteMenu(id);
  1187. }
  1188. public LoadVoteMaps()
  1189. {
  1190. new Line[128], Map[32], Len, Used[Max], Loaded, File, Found;
  1191.  
  1192. File = fopen(MapCycle, "rt");
  1193.  
  1194. if(File)
  1195. {
  1196.  
  1197. for(new lNum; lNum < Max; lNum++)
  1198. {
  1199. Found = 0;
  1200.  
  1201. new RandomMap = random(MapCycle_Lines);
  1202. read_file(MapCycle, RandomMap, Line, 127, Len);
  1203.  
  1204. parse(Line, Map, 31);
  1205.  
  1206. for(new mc; mc < MaxChoice; mc++)
  1207. {
  1208. if(equali(Map, MapNames[mc]))
  1209. {
  1210. Found = 1;
  1211. }
  1212. }
  1213.  
  1214. if(Found == 1 || equali(Map, MapName))
  1215. {
  1216. continue;
  1217. }
  1218.  
  1219. if(Used[RandomMap] == 0 && Loaded < get_pcvar_num(Cvar_MaxMaps)-1 && isValidMap(Map))
  1220. {
  1221. Used[RandomMap] = 1;
  1222. copy(MapNames[Loaded], sizeof Map - 1, Map);
  1223. Loaded++;
  1224. }
  1225. }
  1226.  
  1227. }
  1228.  
  1229. fclose(File);
  1230.  
  1231. MapNames[get_pcvar_num(Cvar_MaxMaps)-1] = MapName;
  1232. set_task(0.1, "LoadNomMaps", MapID+69);
  1233. }
  1234. public LoadNomMaps()
  1235. {
  1236. new Line[128], Map[32], File, Found;
  1237.  
  1238. File = fopen(MapCycle, "rt");
  1239.  
  1240. while(!feof(File))
  1241. {
  1242. fgets(File, Line, charsmax(Line));
  1243.  
  1244. parse(Line, Map, 31);
  1245.  
  1246. for(new nn; nn < NomNum; nn++)
  1247. {
  1248. if(equali(Map, NomMaps[nn]))
  1249. {
  1250. Found = 1;
  1251. }
  1252. }
  1253.  
  1254. if(Found == 1)
  1255. {
  1256. continue;
  1257. }
  1258.  
  1259. if(NomNum < MapCycle_Lines && isValidMap(Map))
  1260. {
  1261. copy(NomMaps[NomNum], sizeof Map - 1, Map);
  1262. NomNum++;
  1263. }
  1264. }
  1265.  
  1266. fclose(File);
  1267. }
  1268. public ShowMapMenu(id)
  1269. {
  1270. new Menu, MenuLine[128], MapDatas[2][32], String[32];
  1271. formatex(MenuLine, 127, "%L", Lang, "MPNM");
  1272. Menu = menu_create(MenuLine, "MapKey");
  1273.  
  1274. for(new MapNum; MapNum < MapFile_Lines-1; MapNum++)
  1275. {
  1276. parse(Maps[MapNum], MapDatas[0], 31, MapDatas[1], 31);
  1277. formatex(MenuLine, 127, "%L", Lang, "PMPM", MapDatas[0], MapDatas[1]);
  1278. num_to_str(MapNum, String, 2);
  1279. menu_additem(Menu, MenuLine, String);
  1280. }
  1281.  
  1282. formatex(MenuLine, 127, "%L", Lang, "MNEXT");
  1283. menu_setprop(Menu, MPROP_NEXTNAME, MenuLine);
  1284. formatex(MenuLine, 127, "%L", Lang, "MEXIT");
  1285. menu_setprop(Menu, MPROP_EXITNAME, MenuLine);
  1286. formatex(MenuLine, 127, "%L", Lang, "MBACK");
  1287. menu_setprop(Menu, MPROP_BACKNAME, MenuLine);
  1288. menu_setprop(Menu, MPROP_PERPAGE, PMPage);
  1289. menu_display(id, Menu);
  1290. }
  1291. public MapKey(id, Menu, Item)
  1292. {
  1293. new MenuNum[2], Data[2][32], Key;
  1294. menu_item_getinfo(Menu, Item, MenuNum[0], Data[0], charsmax(Data), Data[1], charsmax(Data), MenuNum[1]);
  1295.  
  1296. Key = str_to_num(Data[0]);
  1297.  
  1298. if(Item == MENU_EXIT)
  1299. {
  1300. menu_destroy(Menu);
  1301. return;
  1302. }
  1303.  
  1304. new MapDatas[2][32];
  1305. parse(Maps[Key], MapDatas[0], 31, MapDatas[1], 31);
  1306.  
  1307. print_color(id, "%s %L", Prefix, Lang, "MNP", MapDatas[0], MapDatas[1]);
  1308. }
  1309. public ShowNomMenu(id)
  1310. {
  1311. if(Nom >= get_pcvar_num(Cvar_MaxMaps)-1)
  1312. {
  1313. print_color(id, "%s %L", Prefix, Lang, "NOMT");
  1314. return;
  1315. }
  1316. if(AlreadyNom[id])
  1317. {
  1318. print_color(id, "%s %L", Prefix, Lang, "NOMN");
  1319. return;
  1320. }
  1321. if(inProcess || Voted || Revoted)
  1322. {
  1323. return;
  1324. }
  1325.  
  1326. new Menu, MenuLine[128], Already;
  1327. formatex(MenuLine, 127, "%L", Lang, "NOMM");
  1328. Menu = menu_create(MenuLine, "NomKey");
  1329.  
  1330. for(new MapNum; MapNum < MapCycle_Lines; MapNum++)
  1331. {
  1332. if(Nomed[MapNum] == 1)
  1333. continue;
  1334.  
  1335. Already = 0;
  1336.  
  1337. for(new mc; mc < MaxChoice; mc++)
  1338. {
  1339. if(equali(NomMaps[MapNum], MapNames[mc]))
  1340. {
  1341. Already = 1;
  1342. }
  1343. }
  1344.  
  1345. if(Already == 1)
  1346. continue;
  1347.  
  1348. if(equali(NomMaps[MapNum], MapName))
  1349. continue;
  1350.  
  1351. if(!isValidMap(NomMaps[MapNum]))
  1352. continue;
  1353.  
  1354. formatex(MenuLine, 127, "%L", Lang, "NOM1", NomMaps[MapNum]);
  1355. menu_additem(Menu, MenuLine, NomMaps[MapNum]);
  1356. }
  1357.  
  1358. formatex(MenuLine, 127, "%L", Lang, "MNEXT");
  1359. menu_setprop(Menu, MPROP_NEXTNAME, MenuLine);
  1360. formatex(MenuLine, 127, "%L", Lang, "MEXIT");
  1361. menu_setprop(Menu, MPROP_EXITNAME, MenuLine);
  1362. formatex(MenuLine, 127, "%L", Lang, "MBACK");
  1363. menu_setprop(Menu, MPROP_BACKNAME, MenuLine);
  1364. menu_display(id, Menu);
  1365. }
  1366. public NomKey(id, Menu, Item)
  1367. {
  1368. if(Nom > get_pcvar_num(Cvar_MaxMaps)-1)
  1369. {
  1370. print_color(id, "%s %L", Prefix, Lang, "NOMT");
  1371. return PLUGIN_HANDLED;
  1372. }
  1373. if(AlreadyNom[id])
  1374. {
  1375. print_color(id, "%s %L", Prefix, Lang, "NOMN");
  1376. return PLUGIN_HANDLED;
  1377. }
  1378. if(inProcess || Voted)
  1379. {
  1380. return PLUGIN_HANDLED;
  1381. }
  1382.  
  1383. new MenuNum[2], Data_1[32], Data_2[32], PlayerName[32];
  1384. menu_item_getinfo(Menu, Item, MenuNum[0], Data_1, charsmax(Data_1), Data_2, charsmax(Data_2), MenuNum[1]);
  1385.  
  1386. if(Item == MENU_EXIT)
  1387. {
  1388. menu_destroy(Menu);
  1389. return PLUGIN_HANDLED;
  1390. }
  1391.  
  1392. new Already = 0;
  1393.  
  1394. for(new mc; mc < MaxChoice; mc++)
  1395. {
  1396. if(equali(Data_1, MapNames[mc]))
  1397. {
  1398. Already = 1;
  1399. }
  1400. }
  1401.  
  1402. if(Already == 1 || !isValidMap(Data_1) || Nomed[Nom] == 1)
  1403. return PLUGIN_HANDLED;
  1404.  
  1405. get_user_name(id, PlayerName, charsmax(PlayerName));
  1406.  
  1407. print_color(0, "%s %L", Prefix, Lang, "NOMC", PlayerName, Data_1);
  1408.  
  1409. if(get_pcvar_num(Cvar_NomChance) >= (random_num(1,100)))
  1410. {
  1411. MapNames[Nom] = Data_1;
  1412. }
  1413.  
  1414. MapNames[Nom] = Data_1;
  1415. Nomed[Nom] = 1;
  1416. Nom++;
  1417. AlreadyNom[id] = true;
  1418.  
  1419. return PLUGIN_HANDLED;
  1420. }
  1421. public LoadMapMenu()
  1422. {
  1423. new Line[64], File, Len;
  1424.  
  1425. File = fopen(MapFile, "rt");
  1426.  
  1427. if(File)
  1428. {
  1429. for(new MapNum; MapNum < MapFile_Lines; MapNum++)
  1430. {
  1431. read_file(MapFile, MapNum, Line, 63, Len);
  1432.  
  1433. if(Line[0] == ';' || strlen(Line) < 2)
  1434. continue;
  1435.  
  1436. remove_quotes(Line);
  1437.  
  1438. copy(Maps[MapNum], sizeof Line - 1, Line);
  1439. }
  1440. }
  1441.  
  1442. fclose(File);
  1443. }
  1444. public LoadMaps()
  1445. {
  1446. remove_task(MapID);
  1447.  
  1448. new Line[64], File, MapDatas[2][32], LineNum, MapNum, bool:Found;
  1449. File = fopen(MapFile, "rt");
  1450.  
  1451. while(!feof(File))
  1452. {
  1453. fgets(File, Line, charsmax(Line));
  1454.  
  1455. if(Line[0] == ';' || strlen(Line) < 2)
  1456. continue;
  1457.  
  1458. parse(Line, MapDatas[0], 31, MapDatas[1], 31);
  1459.  
  1460. PlayedCount += str_to_num(MapDatas[1]);
  1461.  
  1462. if(equal(MapDatas[0], MapName))
  1463. {
  1464. MapNum = str_to_num(MapDatas[1])+1;
  1465. format(Line, sizeof Line - 1, "^"%s^" ^"%d^"", MapName, MapNum);
  1466. write_file(MapFile, Line, LineNum);
  1467. Found = true;
  1468. }
  1469.  
  1470. LineNum++;
  1471. }
  1472.  
  1473. fclose(File);
  1474.  
  1475. if(!Found)
  1476. {
  1477. NewMap();
  1478. }
  1479.  
  1480. set_task(0.5, "LoadMapMenu", MapID);
  1481. }
  1482. public NewMap()
  1483. {
  1484. new Line[32], File;
  1485. File = fopen(MapFile, "at+");
  1486. formatex(Line, sizeof Line - 1, "^"%s^" ^"%d^"^n", MapName, 1);
  1487. fprintf(File, Line);
  1488. fclose(File);
  1489. }
  1490. public StartRevoteTime()
  1491. {
  1492. new String[32];
  1493. float_to_str(get_pcvar_float(Cvar_WaitRevoteMenuTime), String, 2);
  1494. replace_all(String, 2, ".", "");
  1495. VoteMod = 4;
  1496. if(get_pcvar_num(Cvar_HudMod) == 1)
  1497. {
  1498. remove_task(MapID+8123);
  1499. BeginCounter = str_to_num(String);
  1500. VoteCounter();
  1501. }
  1502. else if(get_pcvar_num(Cvar_HudMod) == 0)
  1503. {
  1504. set_task(get_pcvar_float(Cvar_StartRevoteTime), "StartRevote", MapID+33);
  1505. set_hudmessage(R, G, B, -1.0, 0.20, 0, 6.0, get_pcvar_float(Cvar_WaitVoteMenuTime));
  1506. ShowSyncHudMsg(0, sHudObj, "%L", Lang, "VOTE4", String);
  1507. }
  1508.  
  1509. inProcess = true;
  1510. }
  1511. public StartRevote()
  1512. {
  1513. Voted = false;
  1514. Begined = true;
  1515. MapCounter = get_pcvar_num(Cvar_VoteCounter);
  1516. ReCounter();
  1517. if(get_pcvar_num(Cvar_VoteSound) == 1)
  1518. client_cmd(0, "spk Gman/Gman_Choose%i", random_num(1, 2));
  1519. }
  1520. public ShowRevoteMenu(id)
  1521. {
  1522. if(equal(VotedMap, MapName))
  1523. {
  1524. DestroyVoteMenu();
  1525. return;
  1526. }
  1527.  
  1528. new Menu[512], String[128], Key, MapPercent[MaxChoice];
  1529.  
  1530. AllRevotes = 0;
  1531.  
  1532. for(new All; All < 2; All++)
  1533. {
  1534. AllRevotes += RevoteCounts[All];
  1535. }
  1536.  
  1537. formatex(String, 127, "%L", Lang, "CHONM", AllRevotes);
  1538. add(Menu, 511, String);
  1539.  
  1540. for(new Num; Num < 2; Num++)
  1541. {
  1542. if(RevoteCounts[Num] > 0)
  1543. MapPercent[Num] = ((RevoteCounts[Num]*100)/(AllRevotes));
  1544. formatex(String, 127, "%L", Lang, "MOPD", Num+StartButton, MapRevote[Num], RevoteCounts[Num], MapPercent[Num]);
  1545. add(Menu, 511, String);
  1546. }
  1547.  
  1548. if(!Revoted)
  1549. formatex(String, 127, "%L", Lang, "MCSL", MapCounter);
  1550. else
  1551. formatex(String, 127, "%L", Lang, "MNM", Next);
  1552.  
  1553. add(Menu, 511, String);
  1554.  
  1555. Key = (-1^(-1<<(1+StartButton)));
  1556.  
  1557. show_menu(id, Key, Menu, -1, "RevoteMenu");
  1558. }
  1559. public RevoteMenuKeys(id, Key)
  1560. {
  1561. if(PlayerRevoted[id] || Revoted)
  1562. {
  1563. if(PlayerVoted[id])
  1564. print_color(id, "%s %L", Prefix, Lang, "AVO");
  1565.  
  1566. ShowRevoteMenu(id);
  1567. return;
  1568. }
  1569.  
  1570. if(!Begined)
  1571. {
  1572. show_menu(id, 0, "^n", 1);
  1573. return;
  1574. }
  1575.  
  1576. new PlayerName[32];
  1577. get_user_name(id, PlayerName, 31);
  1578.  
  1579. Key -= StartButton-1;
  1580.  
  1581. if(Key <= 2 && Key > -1)
  1582. {
  1583. PlayerMap[id] = Key;
  1584. PlayerRevoted[id] = true;
  1585. print_color(0, "%s %L", Prefix, Lang, "PCHO", PlayerName, MapRevote[Key]);
  1586. RevoteCounts[Key]++;
  1587. if(get_pcvar_num(Cvar_ChooseSound) == 1)
  1588. {
  1589. client_cmd(0, "spk buttons/lightswitch2");
  1590. }
  1591. }
  1592.  
  1593. ShowRevoteMenu(id);
  1594. }
  1595. public ReCounter()
  1596. {
  1597. if(MapCounter < 1)
  1598. {
  1599. Revoted = true;
  1600.  
  1601. inProcess = false;
  1602.  
  1603. CheckRevotes();
  1604.  
  1605. for(new Num; Num < 32; Num++)
  1606. {
  1607. if(!is_user_connected(Num))
  1608. continue;
  1609.  
  1610. ShowRevoteMenu(Num);
  1611. }
  1612. }
  1613. else
  1614. {
  1615. MapCounter--;
  1616.  
  1617. set_task(1.0, "ReCounter", MapID+211);
  1618.  
  1619. for(new Num; Num < 32; Num++)
  1620. {
  1621. if(!is_user_connected(Num))
  1622. continue;
  1623.  
  1624. ShowRevoteMenu(Num);
  1625. }
  1626. }
  1627. }
  1628. public client_disconnect(id)
  1629. {
  1630. if(PlayerRTV[id])
  1631. {
  1632. RTV--;
  1633. PlayerRTV[id] = false;
  1634. }
  1635.  
  1636. if(PlayerVoted[id])
  1637. {
  1638. MapVote[PlayerMap[id]]--;
  1639. PlayerVoted[id] = false;
  1640. }
  1641.  
  1642. if(PlayerRevoted[id])
  1643. {
  1644. RevoteCounts[PlayerMap[id]]--;
  1645. PlayerRevoted[id] = false;
  1646. }
  1647.  
  1648. PlayerMap[id] = 0;
  1649.  
  1650. }
  1651. stock ChangeLevel()
  1652. {
  1653. set_task(get_pcvar_float(Cvar_ChangeSpeed), "Change", MapID+2);
  1654. message_begin(MSG_ALL, SVC_INTERMISSION);
  1655. message_end();
  1656. }
  1657. stock print_color(const id, const input[], any:...)
  1658. {
  1659. new Count = 1, Players[32];
  1660. static Msg[191];
  1661. vformat(Msg, 190, input, 3);
  1662.  
  1663. replace_all(Msg, 190, "!g", "^4");
  1664. replace_all(Msg, 190, "!y", "^1");
  1665. replace_all(Msg, 190, "!t", "^3");
  1666.  
  1667. if(id) Players[0] = id; else get_players(Players, Count, "ch");
  1668. {
  1669. for (new i = 0; i < Count; i++)
  1670. {
  1671. if (is_user_connected(Players[i]))
  1672. {
  1673. message_begin(MSG_ONE_UNRELIABLE, SayText, _, Players[i]);
  1674. write_byte(Players[i]);
  1675. write_string(Msg);
  1676. message_end();
  1677. }
  1678. }
  1679. }
  1680. return PLUGIN_HANDLED;
  1681. }
  1682. stock CheckVotes() {
  1683.  
  1684. if(AllVotes == 0)
  1685. {
  1686. Revoted = false;
  1687. Next = MapNames[0];
  1688. set_cvar_string("amx_nextmap", Next);
  1689. NextMap();
  1690. return PLUGIN_HANDLED;
  1691. }
  1692.  
  1693. new VoteNum_1 = 0;
  1694.  
  1695. for(new Num = 0; Num < get_pcvar_num(Cvar_MaxMaps); ++Num)
  1696. {
  1697. if(MapVote[VoteNum_1] < MapVote[Num])
  1698. {
  1699. VoteNum_1 = Num;
  1700. }
  1701. }
  1702.  
  1703. if((MapVote[VoteNum_1]*100/AllVotes) >= get_pcvar_num(Cvar_VotePercentMin))
  1704. {
  1705. Revoted = false;
  1706. Next = MapNames[VoteNum_1];
  1707. VotedMap = Next;
  1708. set_cvar_string("amx_nextmap", Next);
  1709.  
  1710. if(get_pcvar_num(Cvar_Mod) == 1)
  1711. {
  1712. if(equali(Next, MapName))
  1713. {
  1714. new Hour[32], Minute[32], Second[32], pTime[3];
  1715. format_time(Hour, sizeof Hour - 1, "%H");
  1716. format_time(Minute, sizeof Minute - 1, "%M");
  1717. format_time(Second, sizeof Second - 1, "%S");
  1718. pTime[0] = str_to_num(Second);
  1719. pTime[1] = str_to_num(Minute);
  1720. pTime[2] = str_to_num(Hour);
  1721.  
  1722. pTime[1] = pTime[1] - ElapsedTime[1];
  1723.  
  1724. if(pTime[0] >= ElapsedTime[0])
  1725. pTime[0] = pTime[0] - ElapsedTime[0];
  1726. else
  1727. {
  1728. pTime[0] = pTime[0]+60 - ElapsedTime[0];
  1729. pTime[1]--;
  1730. }
  1731.  
  1732. if(pTime[2] == ElapsedTime[2])
  1733. server_cmd("mp_timelimit %d.%02d", get_pcvar_num(Cvar_Extend)+pTime[1], pTime[0]);
  1734. else
  1735. server_cmd("mp_timelimit %d.%02d", (get_pcvar_num(Cvar_Extend)+pTime[1])+(60*(pTime[2]-ElapsedTime[2])), pTime[0]);
  1736.  
  1737. print_color(0, "%s %L", Prefix, Lang, "MEXTEND1", get_pcvar_num(Cvar_Extend));
  1738.  
  1739. Extend();
  1740. }
  1741. }
  1742. else if(get_pcvar_num(Cvar_Mod) == 0)
  1743. {
  1744. if(equali(Next, MapName))
  1745. {
  1746. print_color(0, "%s %L", Prefix, Lang, "MEXTEND2", get_pcvar_num(Cvar_Extend));
  1747. server_cmd("mp_maxrounds ^"%d^"", get_pcvar_num(Cvar_Extend)+oRounds+Rounds);
  1748.  
  1749. MaxRounds = get_pcvar_num(Cvar_Extend)+(MaxRounds-Rounds);
  1750. Rounds = 0;
  1751.  
  1752. Extend();
  1753. }
  1754. }
  1755. }
  1756. else
  1757. {
  1758. NeedRV = true;
  1759. Voted = false;
  1760.  
  1761. MapVote[VoteNum_1] = -MapVote[VoteNum_1];
  1762.  
  1763. new VoteNum_1_1 = 0;
  1764.  
  1765. for(new Num = 0; Num < get_pcvar_num(Cvar_MaxMaps); ++Num)
  1766. {
  1767. if(MapVote[VoteNum_1_1] < MapVote[Num])
  1768. {
  1769. VoteNum_1_1 = Num;
  1770. }
  1771. }
  1772.  
  1773. MapVote[VoteNum_1] = 0-MapVote[VoteNum_1];
  1774.  
  1775. copy(MapRevote[0], 31, MapNames[VoteNum_1]);
  1776. copy(MapRevote[1], 31, MapNames[VoteNum_1_1]);
  1777.  
  1778. RevoteCounts[0] = 0;
  1779. RevoteCounts[1] = 0;
  1780.  
  1781. VoteMod = 0;
  1782. set_task(get_pcvar_float(Cvar_StartRevoteTime), "StartRevoteTime", MapID+3);
  1783. print_color(0, "%s %L", Prefix, Lang, "RER", get_pcvar_num(Cvar_VotePercentMin));
  1784. }
  1785.  
  1786. NextMap();
  1787. return PLUGIN_CONTINUE;
  1788. }
  1789. stock CheckRevotes() {
  1790.  
  1791. if(AllRevotes == 0)
  1792. {
  1793. Next = MapRevote[0];
  1794. set_cvar_string("amx_nextmap", Next);
  1795. NeedRV = false;
  1796. VotedMap = Next;
  1797. NextMap();
  1798. return PLUGIN_HANDLED;
  1799. }
  1800.  
  1801. new VoteNum_1 = 0;
  1802.  
  1803. for(new Num = 0; Num < 2; ++Num)
  1804. {
  1805. if(RevoteCounts[VoteNum_1] < RevoteCounts[Num])
  1806. VoteNum_1 = Num;
  1807. }
  1808.  
  1809. Next = MapRevote[VoteNum_1];
  1810. set_cvar_string("amx_nextmap", Next);
  1811. NeedRV = false;
  1812. VotedMap = Next;
  1813.  
  1814. if(get_pcvar_num(Cvar_Mod) == 1)
  1815. {
  1816. if(equali(Next, MapName))
  1817. {
  1818. new Hour[32], Minute[32], Second[32], pTime[3];
  1819. format_time(Hour, sizeof Hour - 1, "%H");
  1820. format_time(Minute, sizeof Minute - 1, "%M");
  1821. format_time(Second, sizeof Second - 1, "%S");
  1822. pTime[0] = str_to_num(Second);
  1823. pTime[1] = str_to_num(Minute);
  1824. pTime[2] = str_to_num(Hour);
  1825.  
  1826. pTime[1] = pTime[1] - ElapsedTime[1];
  1827.  
  1828. if(pTime[0] >= ElapsedTime[0])
  1829. pTime[0] = pTime[0] - ElapsedTime[0];
  1830. else
  1831. {
  1832. pTime[0] = pTime[0]+60 - ElapsedTime[0];
  1833. pTime[1]--;
  1834. }
  1835.  
  1836. if(pTime[2] == ElapsedTime[2])
  1837. server_cmd("mp_timelimit %d.%02d", get_pcvar_num(Cvar_Extend)+pTime[1], pTime[0]);
  1838. else
  1839. server_cmd("mp_timelimit %d.%02d", (get_pcvar_num(Cvar_Extend)+pTime[1])+(60*(pTime[2]-ElapsedTime[2])), pTime[0]);
  1840.  
  1841. print_color(0, "%s %L", Prefix, Lang, "MEXTEND1", get_pcvar_num(Cvar_Extend));
  1842.  
  1843. Extend();
  1844. }
  1845. }
  1846. else if(get_pcvar_num(Cvar_Mod) == 0)
  1847. {
  1848. if(equali(Next, MapName))
  1849. {
  1850. print_color(0, "%s %L", Prefix, Lang, "MEXTEND2", get_pcvar_num(Cvar_Extend));
  1851. server_cmd("mp_maxrounds ^"%d^"", get_pcvar_num(Cvar_Extend)+oRounds+Rounds);
  1852.  
  1853. MaxRounds = get_pcvar_num(Cvar_Extend)+(MaxRounds-Rounds);
  1854. Rounds = 0;
  1855.  
  1856. Extend();
  1857. }
  1858. }
  1859.  
  1860. NextMap();
  1861. return PLUGIN_CONTINUE;
  1862. }
  1863. stock bool:isValidMap(Map[])
  1864. {
  1865. if(is_map_valid(Map))
  1866. {
  1867. return true;
  1868. }
  1869.  
  1870. new Len = strlen(Map) - 4;
  1871.  
  1872. if(0 > Len)
  1873. {
  1874. return false;
  1875. }
  1876.  
  1877. if(equali(Map[Len], ".bsp"))
  1878. {
  1879. Map[Len] = '^0';
  1880.  
  1881. if(is_map_valid(Map))
  1882. {
  1883. return true;
  1884. }
  1885. }
  1886.  
  1887. return false;
  1888. }
  1889. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  1890. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
  1891. */
  1892.