aš naudoju mapchooser plugina kuriame yra timeleft nextmap ... bet nera thetime funkcijos todel timeleft.amxx plugina ijungus prarasius timeleft raso pvz iškart dvi žinutes iki map pabaigos liko 05.00
Code: Select all
#include <amxmodx>#include <colorchat> #pragma semicolon 1 #define PLUGIN "Map Manager"#define VERSION "1.8beta"#define AUTHOR "Mistrick" #define SELECT_MAPS 5// MAX 8#define VOTE_TIME 15#define NOMINATE_MAX 3#define NOMINATE_PLAYER_MAX 3#define MAP_BLOCK 10 #define HUD_RESULT_COLOR 0, 55, 255#define TASK_VOTEMENU 100 #define FILE_MAPS "addons/amxmodx/configs/maps.ini"#define FILE_LASTMAPS "addons/amxmodx/configs/mm/lastmaps.ini"#define PREFIX "[MM]" enum _:BLOCKED_DATA{ MAP[33], COUNT}enum _:NOMINATE_DATA{ MAP[33], PLAYER, ID}new Array:MapsArray, Array:NominateArray; new g_pLoadMaps, g_pChangeMap, g_pChangeMapRounds, g_pShowSelects;new g_pShowResultType, g_pTimeLimitMM, g_pTimeStartVote;new g_pTimeStartVoteBeforeEnd, g_pTimeLimit, g_pExendedMax;new g_pExendedTime, g_pRockChange, g_pRockPercent, g_pRockDelay;new g_pRockShow, g_pNextMap; new bool:g_bBeInVote, bool:g_bStartVote, bool:g_bVoteFinished, bool:g_bRockVote;new bool:g_bHasVote[33], bool:g_bRockVoted[33]; new g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA]; new g_iExtendedMax, g_iRound, g_iStartPlugin, g_iLoadMaps;new g_iInMenu[SELECT_MAPS], g_iVote[SELECT_MAPS + 1], g_iTotal, g_iVoteTime, g_iRockVote;new g_iNominatedMaps[33], g_iPage[33]; new g_szInMenuMapName[SELECT_MAPS][33]; new g_szCurrentMap[33];new g_szPrefixes[][] = {"deathrun_", "speedrun_", "de_", "surf_"};new g_szSound[][] ={ "", "fvox/one", "fvox/two", "fvox/three", "fvox/four", "fvox/five", "fvox/six", "fvox/seven", "fvox/eight", "fvox/nine", "fvox/ten", "Gman/Gman_Choose2"}; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_dictionary("map_manager.txt"); register_dictionary_colored("map_manager.txt"); g_pLoadMaps = register_cvar("mm_loadmapstype", "1");//0 - load all maps from maps folder, 1 - load maps from file g_pChangeMap = register_cvar("mm_changemap", "1");//0 - after end vote, 1 - in round end, 2 - after end map g_pChangeMapRounds = register_cvar("mm_changemap_rounds", "0");// 0 - disable g_pTimeLimitMM = register_cvar("mm_timelimit", "30");//duration of map(minutes) g_pTimeStartVoteBeforeEnd = register_cvar("mm_timestartvote_before_end", "2");//minutes g_pTimeStartVote = register_cvar("mm_timestartvote", "20");//if timelimit == 0 g_pShowSelects = register_cvar("mm_showselects", "0");//0 - disable, 1 - all, 2 - self g_pShowResultType = register_cvar("mm_showresulttype", "0");//0 - menu, 1 - hud g_pExendedTime = register_cvar("mm_extendedtime", "15");//minutes g_pExendedMax = register_cvar("mm_extendedmap_max", "3"); g_pNextMap = register_cvar("amx_nextmap", ""); g_pRockPercent = register_cvar("mm_rtv_percent", "60"); g_pRockChange = register_cvar("mm_rtv_change", "0");//0 - after vote, 1 - in round end g_pRockDelay = register_cvar("mm_rtv_delay", "0");//minutes g_pRockShow = register_cvar("mm_rtv_show", "1");//0 - all, 1 - self g_pTimeLimit = get_cvar_pointer("mp_timelimit"); register_concmd("mm_debug", "CmdDebug", ADMIN_MAP); register_clcmd("mm_startvote", "CmdStartVote", ADMIN_MAP); register_clcmd("say maps", "CmdMaps"); register_clcmd("say /maps", "CmdMaps"); register_clcmd("say rtv", "CmdRtv"); register_clcmd("say /rtv", "CmdRtv"); register_clcmd("say rockthevote", "CmdRtv"); register_clcmd("say nextmap", "CmdNextmap"); register_clcmd("say timeleft", "CmdTimeleft"); register_clcmd("say currentmap", "CmdCurrentMap"); register_clcmd("say", "HookSay"); register_clcmd("say_team", "HookSay"); register_clcmd("votemap", "CmdVotemap"); register_event("SendAudio", "EventRoundEnd", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw"); register_event("TextMsg", "EventRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in"); register_event("30", "EventMapEnd", "a"); register_menucmd(register_menuid("Vote_Menu"), 1023, "VoteMenu_Handler"); register_menucmd(register_menuid("Maps_Menu"), 1023, "MapsMenu_Handler"); g_iStartPlugin = get_systime(); MapsArray = ArrayCreate(33); NominateArray = ArrayCreate(NOMINATE_DATA); get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap)); set_task(5.0, "CheckTime", _, _, _, "b"); set_task(5.0, "SetCvar"); LoadBlockedMaps(); LoadMaps();}public plugin_end(){ ArrayDestroy(MapsArray); ArrayDestroy(NominateArray); if(!dir_exists("addons/amxmodx/configs/mm/")) { mkdir("addons/amxmodx/configs/mm/"); } new TEMP_FILE[] = "addons/amxmodx/configs/mm/temp.ini"; new temp = fopen(TEMP_FILE, "wt"); for(new i = 0; i < MAP_BLOCK; i++) { if(g_BlockedMaps[i][COUNT]) { fprintf(temp, "^"%s^" ^"%d^"^n", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]); } } fprintf(temp, "^"%s^" ^"%d^"^n", g_szCurrentMap, MAP_BLOCK); fclose(temp); delete_file(FILE_LASTMAPS); while(!rename_file(TEMP_FILE, FILE_LASTMAPS, 1)) {}}public client_disconnect(id){ if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU); if(g_bRockVoted[id]) { g_bRockVoted[id] = false; g_iRockVote--; } if(g_iNominatedMaps[id]) { ClearNominatedMaps(id); }}public SetCvar(){ set_pcvar_num(g_pTimeLimit, get_pcvar_num(g_pTimeLimitMM)); set_cvar_num("mp_chattime", 10); set_cvar_string("mapcyclefile", FILE_MAPS);}public LoadBlockedMaps(){ if(!file_exists(FILE_LASTMAPS) || !MAP_BLOCK) return PLUGIN_HANDLED; new TEMP_FILE[] = "addons/amxmodx/configs/mm/temp.ini"; new file = fopen(FILE_LASTMAPS, "rt"); new temp = fopen(TEMP_FILE, "wt"); new szBuffer[128], szMap[33], szCount[8], iCount, i = 0; while(!feof(file)) { fgets(file, szBuffer, charsmax(szBuffer)); parse(szBuffer, szMap, charsmax(szMap), szCount, charsmax(szCount)); if(BlockedMapCount(szMap) || !is_map_valid(szMap) || equali(szMap, g_szCurrentMap)) continue; iCount = str_to_num(szCount) - 1; if(!iCount) continue; if(iCount > MAP_BLOCK) { fprintf(temp, "^"%s^" ^"%d^"^n", szMap, MAP_BLOCK); iCount = MAP_BLOCK; } else { fprintf(temp, "^"%s^" ^"%d^"^n", szMap, iCount); } formatex(g_BlockedMaps[i][MAP], charsmax(g_BlockedMaps[][MAP]), szMap); g_BlockedMaps[i][COUNT] = iCount; i++; if(i >= MAP_BLOCK) break; } fclose(file); fclose(temp); delete_file(FILE_LASTMAPS); while(!rename_file(TEMP_FILE, FILE_LASTMAPS, 1)) {} return PLUGIN_HANDLED;}public LoadMaps(){ g_iLoadMaps = 0; if(file_exists(FILE_MAPS) && get_pcvar_num(g_pLoadMaps)) { new szMapName[33]; new f = fopen(FILE_MAPS, "rt"); while(!feof(f)) { fgets(f, szMapName, charsmax(szMapName)); trim(szMapName); remove_quotes(szMapName); if(!szMapName[0] || szMapName[0] == ';' || szMapName[0] == '/' && szMapName[1] == '/' || !ValidMap(szMapName) || InArray(szMapName) || equali(szMapName, g_szCurrentMap)) continue; g_iLoadMaps++; ArrayPushString(MapsArray, szMapName); } } else { new dir, len, szFileName[64]; new DirName[] = "maps"; dir = open_dir(DirName, szFileName, charsmax(szFileName)); if(dir) { while(next_file(dir, szFileName, charsmax(szFileName))) { len = strlen(szFileName) - 4; if(len < 0) continue; if(equali(szFileName[len], ".bsp") && !equali(szFileName, g_szCurrentMap)) { szFileName[len] = '^0'; g_iLoadMaps++; ArrayPushString(MapsArray, szFileName); } } close_dir(dir); } } if(g_iLoadMaps - BlockedCount() <= 0) { ClearBlockedMaps(); } new szMap[33]; do { ArrayGetString(MapsArray, random_num(0, g_iLoadMaps - 1), szMap, charsmax(szMap)); } while(BlockedMapCount(szMap)); set_pcvar_string(g_pNextMap, szMap); }public CheckTime(){ if(!g_iLoadMaps || g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED; static TimeLimit; TimeLimit = get_pcvar_num(g_pTimeLimit); if(TimeLimit > 2) { if(get_systime() - g_iStartPlugin >= (TimeLimit - get_pcvar_num(g_pTimeStartVoteBeforeEnd)) * 60) { StartVote(0); } } else if(TimeLimit == 0) { if(get_systime() - g_iStartPlugin >= get_pcvar_num(g_pTimeStartVote) * 60) { StartVote(0); } } else if(!g_bStartVote) { g_bStartVote = true; set_task(20.0, "StartVote", 0); } return PLUGIN_HANDLED;}public EventRoundEnd(){ g_iRound++; new iCvar = get_pcvar_num(g_pChangeMapRounds); if(iCvar && g_iRound >= iCvar) { StartVote(0); } if(g_bVoteFinished && get_pcvar_num(g_pChangeMap) == 1 || g_bVoteFinished && g_bRockVote && get_pcvar_num(g_pRockChange) == 1) { set_task(5.0, "ChangeLevel"); }}public EventRestart(){ g_iRound = 0;}public EventMapEnd(){ set_task(5.0, "ChangeLevel");}public CmdDebug(id, flag){ if(~get_user_flags(id) & flag) return PLUGIN_HANDLED; new szMapName[64], iMax = ArraySize(NominateArray); console_print(id, "MapList"); for(new i = 0; i < g_iLoadMaps; i++) { ArrayGetString(MapsArray, i, szMapName, charsmax(szMapName)); console_print(id, "%d - %s", i+1, szMapName); } console_print(id, "^nNominatedMaps"); for(new i = 0, Data[NOMINATE_DATA]; i < iMax; i++) { ArrayGetArray(NominateArray, i, Data); console_print(id, "%d - %s", i+1, Data[MAP]); } console_print(id, "^nBlockedMaps"); for(new i = 0; i < MAP_BLOCK; i++) { if(g_BlockedMaps[i][COUNT]) { console_print(id, "%s - %d", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]); } } return PLUGIN_HANDLED;}public CmdVotemap(id){ return PLUGIN_HANDLED;}public CmdStartVote(id, flag){ if(~get_user_flags(id) & flag) return PLUGIN_HANDLED; StartVote(id); return PLUGIN_HANDLED;}public CmdMaps(id){ ShowMapsMenu(id, g_iPage[id] = 0);}public ShowMapsMenu(id, iPage){ if(iPage < 0) return PLUGIN_HANDLED; new iMax = ArraySize(MapsArray); new i = min(iPage * 8, iMax); new iStart = i - (i % 8); new iEnd = min(iStart + 8, iMax); iPage = iStart / 8; g_iPage[id] = iPage; new szMenu[512], iLen = 0, iLen_Max = charsmax(szMenu), szMapName[32]; iLen = formatex(szMenu, iLen_Max, "\y%L \w[%d/%d]^n", id, "MM_LISTMAP", iPage + 1, ((iMax - 1) / 8) + 1); new Keys, Item, iBlock; for (i = iStart; i < iEnd; i++) { ArrayGetString(MapsArray, i, szMapName, charsmax(szMapName)); iBlock = BlockedMapCount(szMapName); if(iBlock) { iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\r%d\d]", ++Item, szMapName, iBlock); } else if(IsNominated(szMapName)) { iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\y%L\d]", ++Item, szMapName, id, "MM_MENU_NOMINATED"); } else { Keys |= (1 << Item); iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s", ++Item, szMapName); } } while(Item <= 8) { Item++; iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n"); } if (iEnd < iMax) { Keys |= (1 << 8)|(1 << 9); formatex(szMenu[iLen], iLen_Max - iLen, "^n\r9.\w %L^n\r0.\w %L", id, "MM_MENU_NEXT", id, iPage ? "MM_MENU_BACK" : "MM_MENU_EXIT"); } else { Keys |= (1 << 9); formatex(szMenu[iLen], iLen_Max - iLen, "^n^n\r0.\w %L", id, iPage ? "MM_MENU_BACK" : "MM_MENU_EXIT"); } show_menu(id, Keys, szMenu, -1, "Maps_Menu"); return PLUGIN_HANDLED;}public MapsMenu_Handler(id, key){ switch (key) { case 8: ShowMapsMenu(id, ++g_iPage[id]); case 9: ShowMapsMenu(id, --g_iPage[id]); default: { new szMapName[33]; ArrayGetString(MapsArray, key + g_iPage[id] * 8, szMapName, charsmax(szMapName)); NominateMap(id, szMapName); } }}public CmdRtv(id){ if(g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED; if(get_systime() - g_iStartPlugin < get_pcvar_num(g_pRockDelay) * 60) { new szMin[16], iMin = 1 + (get_pcvar_num(g_pRockDelay) * 60 - (get_systime() - g_iStartPlugin)) / 60; get_ending(iMin, "MM_MIN1", "MM_MIN2", "MM_MIN3", szMin, charsmax(szMin)); client_print_color(id, DontChange, "^4%s^1 %L %d %L.", PREFIX, id, "MM_RTV_CANT", iMin, id, szMin); return PLUGIN_HANDLED; } if(!g_bRockVoted[id]) { g_bRockVoted[id] = true; g_iRockVote++; new iVote = floatround(get_playersnum() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote; if(iVote > 0) { new szVote[16]; get_ending(iVote, "MM_VOTE1", "MM_VOTE2", "MM_VOTE3", szVote, charsmax(szVote)); switch(get_pcvar_num(g_pRockShow)) { case 0: { new szName[33]; get_user_name(id, szName, charsmax(szName)); client_print_color(0, DontChange, "^4%s^3 %s^1 %L %d %L.", PREFIX, szName, LANG_PLAYER, "MM_RTV_VOTE1", iVote, LANG_PLAYER, szVote); } case 1: client_print_color(id, DontChange, "^4%s^1 %L %d %L.", PREFIX, id, "MM_RTV_VOTE2", iVote, id, szVote); } } else { client_print_color(0, DontChange, "^4%s^1 %L.", PREFIX, LANG_PLAYER, "MM_RTV_START"); } if(floatround(g_iRockVote * 100.0 / get_playersnum()) >= get_pcvar_num(g_pRockPercent)) { g_bRockVote = true; StartVote(0); } } else { new iVote = floatround(get_playersnum() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote; new szVote[16]; get_ending(iVote, "MM_VOTE1", "MM_VOTE2", "MM_VOTE3", szVote, charsmax(szVote)); client_print_color(id, DontChange, "^4%s^1 %L %d %L.", PREFIX, id, "MM_RTV_VOTED", iVote, id, szVote); } return PLUGIN_HANDLED;}public CmdNextmap(id){ new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap)); client_print_color(0, BLUE, "^4%s^1 %L ^3%s^1.", PREFIX, LANG_PLAYER, "MM_NEXTMAP", szMap);}public CmdTimeleft(id){ if (get_pcvar_float(g_pTimeLimit)) { new a = get_timeleft(); client_print_color(0, DontChange, "^4%s^1 %L %d:%02d", PREFIX, LANG_PLAYER, "MM_TIME_LEFT", (a / 60), (a % 60)); } else { client_print_color(0, DontChange, "^4%s^1 %L.", LANG_PLAYER, "MM_NO_T_LIMIT"); }}public CmdCurrentMap(id){ client_print_color(0, BLUE, "^4%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MM_CURRENT_MAP", g_szCurrentMap);}public HookSay(id){ new szText[33]; read_args(szText, charsmax(szText)); remove_quotes(szText); trim(szText); if(InArray(szText)) { NominateMap(id, szText); } else { for(new i = 0; i < sizeof(g_szPrefixes); i++) { format(szText, charsmax(szText), "%s%s", g_szPrefixes[i], szText); if(InArray(szText)) { NominateMap(id, szText); break; } } }}public NominateMap(id, map[33]){ if(g_bVoteFinished || equali(map, g_szCurrentMap)) { return PLUGIN_HANDLED; } if(g_bBeInVote) { client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_NOMINATE_IN_VOTE"); return PLUGIN_HANDLED; } if(g_iNominatedMaps[id] == NOMINATE_PLAYER_MAX) { client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_NOMINATE_CANT"); return PLUGIN_HANDLED; } if(BlockedMapCount(map)) { client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_NOMINATE_MAP_BLOCKED"); return PLUGIN_HANDLED; } if(IsNominated(map)) { client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_NOMINATED"); return PLUGIN_HANDLED; } new szMap[33], i; for(i = 0; i < g_iLoadMaps; i++) { ArrayGetString(MapsArray, i, szMap, charsmax(szMap)); if(equali(map, szMap)) { break; } } new Data[NOMINATE_DATA]; Data[MAP] = map; Data[PLAYER] = id; Data[ID] = i; ArrayPushArray(NominateArray, Data); g_iNominatedMaps[id]++; new szName[33]; get_user_name(id, szName, charsmax(szName)); client_print_color(0, BLUE, "^4%s^3 %s^1 %L^3 %s^1.", PREFIX, szName, id, "MM_NOMINATE_VOTED", map); return PLUGIN_HANDLED;}public StartVote(id){ if(!g_iLoadMaps) { if(id) client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_DONT_HAVE_VALIDMAP"); return PLUGIN_HANDLED; } if(g_bBeInVote) { if(id) client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_IN_VOTE"); return PLUGIN_HANDLED; } g_bBeInVote = true; arrayset(g_iVote, 0, SELECT_MAPS + 1); arrayset(g_iInMenu, -1, SELECT_MAPS); arrayset(g_bHasVote, false, 33); g_iTotal = 0; new Num, NomInMenu = 0, Data[NOMINATE_DATA]; new iMax = 8, Limits[2]; Limits[0] = SELECT_MAPS; Limits[1] = g_iLoadMaps - BlockedCount(); for(new i = 0; i < sizeof(Limits); i++) { if(iMax > Limits[i]) iMax = Limits[i]; } new NomMax, NomNum = ArraySize(NominateArray); NomMax = NomNum > NOMINATE_MAX ? NOMINATE_MAX : NomNum; for(new i = 0; i < iMax; i++) { if(NomInMenu < NomMax) { Num = random_num(0, ArraySize(NominateArray) - 1); ArrayGetArray(NominateArray, Num, Data); formatex(g_szInMenuMapName[i], 32, Data[MAP]); g_iInMenu[i] = Data[ID]; NomInMenu++; ArrayDeleteItem(NominateArray, Num); g_iNominatedMaps[Data[PLAYER]]--; } else { Num = random_num(0, g_iLoadMaps - 1); while(InMenu(Num) || IsBlocked(Num)) { Num = random_num(0, g_iLoadMaps - 1); } g_iInMenu[i] = Num; ArrayGetString(MapsArray, Num, g_szInMenuMapName[i], 32); } } set_task(1.0, "SoundTimer", 1111, _, _, "a", 10); set_task(11.0, "ShowMenu", 1112); return PLUGIN_HANDLED;}public SoundTimer(){ static Timer; if(Timer == 0) Timer = 10; new szSec[16]; get_ending(Timer, "MM_SEC1", "MM_SEC2", "MM_SEC3", szSec, charsmax(szSec)); set_hudmessage(50, 255, 50, -1.0, 0.8, 0, 0.0, 1.0, 0.0, 0.0, 1); show_hudmessage(0, "%L %d %L!", LANG_PLAYER, "MM_VOTE_IN", Timer, LANG_PLAYER, szSec); client_cmd(0, "spk %s", g_szSound[Timer]); Timer--;}public ShowMenu(){ new Players[32], pNum; get_players(Players, pNum, "ch"); g_iVoteTime = VOTE_TIME; set_task(1.0, "Timer", 999, _, _, "a", VOTE_TIME+1); for(new i = 0; i < pNum; i++) { VoteMenu(i + TASK_VOTEMENU); set_task(1.0, "VoteMenu", Players[i] + TASK_VOTEMENU, _, _, "a", VOTE_TIME+1); } client_cmd(0, "spk %s", g_szSound[11]);}public VoteMenu(id){ id -= TASK_VOTEMENU; if(g_iVoteTime == 0) { show_menu(id, 0, "^n", 1); if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU); return PLUGIN_HANDLED; } new szMenu[512], len = 0; len = formatex(szMenu[len], charsmax(szMenu) - len, "\y%L:^n^n", id, "MM_CHOOSE_MAP"); new Key, percent, i, iMax = MapsInMenu(); for(i = 0; i < iMax; i++) { percent = 0; if(g_iTotal) { percent = floatround(g_iVote[i]*100.0/g_iTotal); } if(!g_bHasVote[id]) { len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_szInMenuMapName[i], percent); Key |= (1 << i); } else { len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s[\r%d%%\d]^n", g_szInMenuMapName[i], percent); } } if(!g_bRockVote && get_pcvar_num(g_pTimeLimitMM) != 0 && g_iExtendedMax < get_pcvar_num(g_pExendedMax)) { percent = 0; if(g_iTotal) { percent = floatround(g_iVote[i]*100.0/g_iTotal); } if(!g_bHasVote[id]) { len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d.\w %s\d[\r%d%%\d]\y[%L]^n", i + 1, g_szCurrentMap, percent, id, "MM_EXTEND"); Key |= (1 << i); } else { len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%s[\r%d%%\d]\y[%L]^n", g_szCurrentMap, percent, id, "MM_EXTEND"); } } new szSec[16]; get_ending(g_iVoteTime, "MM_SEC1", "MM_SEC2", "MM_SEC3", szSec, charsmax(szSec)); len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%L \r%d\d %L", id, "MM_REMAINED",g_iVoteTime, id, szSec); if(!Key) Key |= (1 << 9); if(get_pcvar_num(g_pShowResultType) == 1 && g_bHasVote[id]) { while(replace(szMenu, charsmax(szMenu), "\r", "")){} while(replace(szMenu, charsmax(szMenu), "\d", "")){} while(replace(szMenu, charsmax(szMenu), "\w", "")){} while(replace(szMenu, charsmax(szMenu), "\y", "")){} set_hudmessage(HUD_RESULT_COLOR, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4); show_hudmessage(id, szMenu); } else { show_menu(id, Key, szMenu, -1, "Vote_Menu"); } return PLUGIN_HANDLED;}public VoteMenu_Handler(id, key){ if(g_bHasVote[id]) { VoteMenu(id+TASK_VOTEMENU); return PLUGIN_HANDLED; } g_iVote[key]++; g_iTotal++; g_bHasVote[id] = true; new iCvar = get_pcvar_num(g_pShowSelects); if(iCvar) { new szName[32]; get_user_name(id, szName, charsmax(szName)); if(key == MapsInMenu()) { switch(iCvar) { case 1: client_print_color(0, DontChange, "^4%s^1 ^3%s^1 %L.", PREFIX, szName, LANG_PLAYER, "MM_VOTE_EXTENDED1"); case 2: client_print_color(id, DontChange, "^4%s^1 %L.", PREFIX, id, "MM_VOTE_EXTENDED2"); } } else { switch(iCvar) { case 1: client_print_color(0, DontChange, "^4%s^3 %s^1 %L^3 %s^1.", PREFIX, szName, LANG_PLAYER, "MM_VOTED1",g_szInMenuMapName[key]); case 2: client_print_color(id, DontChange, "^4%s^1 %L^3 %s^1.", PREFIX, id, "MM_VOTED2", g_szInMenuMapName[key]); } } } VoteMenu(id+TASK_VOTEMENU); return PLUGIN_HANDLED;} public Timer(){ g_iVoteTime--; if(g_iVoteTime == 0) { show_menu(0, 0, "^n", 1); FinishVote(); if(task_exists(999)) remove_task(999); }}public FinishVote(){ new MaxVote = 0, iInMenu = MapsInMenu(); new iMax = g_bRockVote ? iInMenu : iInMenu + 1; for(new i = 1; i < iMax ; i++) { switch(random_num(0, 1)) { case 0: if(g_iVote[MaxVote] < g_iVote[i]) MaxVote = i; case 1: if(g_iVote[MaxVote] <= g_iVote[i]) MaxVote = i; } } g_bBeInVote = false; g_bVoteFinished = true; g_bStartVote = false; if(!g_iTotal || (MaxVote != iInMenu)) { if(g_iTotal) { client_print_color(0, BLUE, "^4%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MM_NEXTMAP", g_szInMenuMapName[MaxVote]); } else { MaxVote = random_num(0, iInMenu - 1); client_print_color(0, BLUE, "^4%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MM_VOTE_NOBODY", g_szInMenuMapName[MaxVote]); } set_pcvar_string(g_pNextMap, g_szInMenuMapName[MaxVote]); if(g_bRockVote && get_pcvar_num(g_pRockChange) == 0 || get_pcvar_num(g_pChangeMap) == 0) { client_print_color(0, DontChange, "^4%s^1 %L.", PREFIX, LANG_PLAYER, "MM_VOTE_MAPCHANGE1"); set_task(10.0, "ChangeLevel"); } else if(g_bRockVote && get_pcvar_num(g_pRockChange) == 1 || get_pcvar_num(g_pChangeMap) == 1) { client_print_color(0, DontChange, "^4%s^1 %L.", PREFIX, LANG_PLAYER, "MM_VOTE_MAPCHANGE2"); } } else { g_bVoteFinished = false; g_iExtendedMax++; new szMin[16], iMin = get_pcvar_num(g_pExendedTime); get_ending(iMin, "MM_MIN1", "MM_MIN2", "MM_MIN3", szMin, charsmax(szMin)); client_print_color(0, DontChange, "^4%s^1 %L^3 %d^1 %L.", PREFIX, LANG_PLAYER, "MM_VOTE_EXTEND", iMin, LANG_PLAYER, szMin); set_cvar_num("mp_timelimit", get_pcvar_num(g_pTimeLimit) + iMin); }}public ChangeLevel(){ new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap)); server_cmd("changelevel %s", szMap);}stock bool:ValidMap(mapname[]){ if(is_map_valid(mapname)) { return true; } new len = strlen(mapname) - 4; if(len < 0) { return false; } if(equali(mapname[len], ".bsp")) { mapname[len] = '^0'; if(is_map_valid(mapname)) { return true; } } return false;}stock bool:InMenu(Num){ for(new i = 0; i < SELECT_MAPS && i < 8; i++) { if(Num == g_iInMenu[i]) { return true; } } return false;}stock MapsInMenu(){ new map; for(new i = 0; i < SELECT_MAPS; i++) { if(g_iInMenu[i] != -1) { map++; } } return map;}stock bool:IsNominated(map[]){ new Data[NOMINATE_DATA], iMax = ArraySize(NominateArray); for(new i = 0; i < iMax; i++) { ArrayGetArray(NominateArray, i, Data); if(equali(Data[MAP], map)) { return true; } } return false;}stock ClearNominatedMaps(id){ new Data[NOMINATE_DATA]; for(new i = 0; i < ArraySize(NominateArray); i++) { ArrayGetArray(NominateArray, i, Data); if(Data[PLAYER] == id) { ArrayDeleteItem(NominateArray, i); i--; g_iNominatedMaps[id]--; if(!g_iNominatedMaps[id]) break; } }}stock ClearBlockedMaps(){ for(new i = 0; i < MAP_BLOCK; i++) { g_BlockedMaps[i][MAP] = ""; g_BlockedMaps[i][COUNT] = 0; } delete_file(FILE_LASTMAPS);}stock bool:InArray(map[]){ new szMap[33], iMax = ArraySize(MapsArray); for(new i = 0; i < iMax; i++) { ArrayGetString(MapsArray, i, szMap, charsmax(szMap)); if(equali(szMap, map)) { return true; } } return false;}stock BlockedCount(){ new Count = 0; for(new i = 0; i < MAP_BLOCK; i++) { if(g_BlockedMaps[i][COUNT]) Count++; } return Count;}stock BlockedMapCount(szMap[]){ for(new i = 0; i < MAP_BLOCK; i++) { if(equali(g_BlockedMaps[i][MAP], szMap)) return g_BlockedMaps[i][COUNT]; } return 0;}stock bool:IsBlocked(num){ new szMap[33]; ArrayGetString(MapsArray, num, szMap, charsmax(szMap)); for(new i = 0; i < MAP_BLOCK; i++) { if(equali(g_BlockedMaps[i][MAP], szMap)) return true; } return false;}stock get_ending(num, const a[], const b[], const c[], output[], lenght){ new num100 = num % 100, num10 = num % 10; if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) format(output, lenght, "%s", a); else if(num10 == 1) format(output, lenght, "%s", b); else if(num10 >= 2 && num10 <= 4) format(output, lenght, "%s", c);}