├── .gitignore ├── README.md ├── include └── colorchat.inc ├── mapmanager.cfg ├── mapmanager.sma ├── mapmanager.txt └── mapmanager_subplugin.sma /.gitignore: -------------------------------------------------------------------------------- 1 | include/ 2 | compiled/ 3 | old/ 4 | amxxpc.exe 5 | amxxpc32.dll 6 | compile.dat 7 | compile.exe -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Map Manager 2 | MapManager is an [AMX Mod X](https://github.com/alliedmodders/amxmodx) Plugin to vote for the next map. 3 | 4 | ### What it can: 5 | - Nextmap - Say `nextmap` in chat to see what map goes next. 6 | - Rtv - Say `rtv` or `/rtv` in chat to rock the vote. 7 | - Nomination - you may nominate maps in the next vote 8 | - Night mode 9 | - Block N previously played maps 10 | 11 | ### Defines 12 | You may comment some of these to disable functionality you don't need. Less functionality - better perfomance. 13 | ```c 14 | #define FUNCTION_NEXTMAP // replace default nextmap plugin 15 | #define FUNCTION_RTV // support rtv 16 | #define FUNCTION_NOMINATION // support nomination 17 | #define FUNCTION_NIGHTMODE // support night mode 18 | #define FUNCTION_BLOCK_MAPS // block N previously played maps 19 | #define FUNCTION_SOUND // use sounds 20 | #define SELECT_MAPS 5 // how many maps in vote menu 21 | #define PRE_START_TIME 5 // timer before vote start 22 | #define VOTE_TIME 10 // vote duration 23 | #define NOMINATED_MAPS_IN_MENU 3 24 | #define NOMINATED_MAPS_PER_PLAYER 3 // how many maps single player can nominate 25 | #define BLOCK_MAP_COUNT 10 // how much previous played maps will be blocked 26 | #define MAX_ROUND_TIME 3.5 // max time for increase mp_roundtime 27 | ``` 28 | 29 | ### Cvars: 30 | ```c 31 | mapm_change_type 2 // 0 - after end vote, 1 - in round end, 2 - after end map 32 | mapm_start_vote_before_end 2 // in minutes 33 | mapm_show_result_type 1 // 0 - disable, 1 - menu, 2 - hud 34 | mapm_show_selects 1 // 0 - disable, 1 - all 35 | mapm_start_vote_in_new_round 0 // 0 - disable, 1 - enable 36 | mapm_freeze_in_vote 0 // 0 - disable, 1 - enable, if mm_start_vote_in_new_round 1 37 | mapm_black_screen_in_vote 0 // 0 - disable, 1 - enable 38 | mapm_last_round 0 // 0 - disable, 1 - enable 39 | mapm_change_to_default_map 0 // 0 - disable, 1 - enable 40 | mapm_default_map de_dust2 41 | mapm_extended_type 0 // 0 - time, 1 - rounds 42 | mapm_extended_map_max 3 43 | mapm_extended_time 15 // in minutes 44 | mapm_extended_rounds 3 45 | mapm_rtv_mode 0 // 0 - percents, 1 - players 46 | mapm_rtv_percent 60 47 | mapm_rtv_players 5 48 | mapm_rtv_change_type 1 // 0 - after vote, 1 - in round end 49 | mapm_rtv_delay 0 // minutes 50 | mapm_nomination_dont_close_menu 0 // 0 - disable, 1 - enable 51 | mapm_night_time "00:00 8:00" // time to enable night mode 52 | ``` 53 | -------------------------------------------------------------------------------- /include/colorchat.inc: -------------------------------------------------------------------------------- 1 | #if defined _colorchat_included 2 | #endinput 3 | #endif 4 | #define _colorchat_included 5 | 6 | /* ColorChat Support */ 7 | #define NORMAL DontChange 8 | #define GREEN DontChange 9 | #define RED Red 10 | #define BLUE Blue 11 | #define GREY Grey 12 | #define ColorChat client_print_color 13 | 14 | #define MAX_TRANSLATION_LENGTH 2048 15 | 16 | enum { 17 | DontChange = 0, 18 | Grey = -1, 19 | Red = -2, 20 | Blue = -3 21 | }; 22 | 23 | #define print_team_default DontChange 24 | #define print_team_grey Grey 25 | #define print_team_red Red 26 | #define print_team_blue Blue 27 | 28 | stock client_print_color(id, sender, const fmt[], any:...) 29 | { 30 | // check if id is different from 0 31 | if (id && !is_user_connected(id)) 32 | { 33 | return 0; 34 | } 35 | 36 | if (sender < Blue || sender > 32) 37 | { 38 | sender = DontChange; 39 | } 40 | else if (sender < DontChange) 41 | { 42 | sender = -sender + 32; // align indexes to the TeamInfo ones 43 | } 44 | 45 | static const szTeamName[][] = 46 | { 47 | "", 48 | "TERRORIST", 49 | "CT" 50 | }; 51 | 52 | new szMessage[191]; 53 | 54 | new iParams = numargs(); 55 | 56 | // Specific player code 57 | if (id) 58 | { 59 | if (iParams == 3) 60 | { 61 | copy(szMessage, charsmax(szMessage), fmt); // copy so message length doesn't exceed critical 192 value 62 | } 63 | else 64 | { 65 | vformat(szMessage, charsmax(szMessage), fmt, 4); 66 | } 67 | 68 | if (sender > (32 - Grey)) 69 | { 70 | if (sender > (32 - Blue)) 71 | { 72 | sender = id; 73 | } 74 | else 75 | { 76 | _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]); 77 | } 78 | } 79 | _CC_SayText(id, sender, szMessage); 80 | } 81 | 82 | // Send message to all players 83 | else 84 | { 85 | // Figure out if at least 1 player is connected 86 | // so we don't execute useless useless code if not 87 | new iPlayers[32], iNum; 88 | get_players(iPlayers, iNum, "ch"); 89 | if (!iNum) 90 | { 91 | return 0; 92 | } 93 | 94 | new iMlNumber, i, j; 95 | new Array:aStoreML = ArrayCreate(); 96 | if (iParams >= 5) // ML can be used 97 | { 98 | for (j = 3; j < iParams; j++) 99 | { 100 | // retrieve original param value and check if it's LANG_PLAYER value 101 | if (getarg(j) == LANG_PLAYER) 102 | { 103 | i = 0; 104 | // as LANG_PLAYER == -1, check if next parm string is a registered language translation 105 | while ((szMessage[i] = getarg(j + 1, i++))) {} 106 | if (GetLangTransKey(szMessage) != TransKey_Bad) 107 | { 108 | // Store that arg as LANG_PLAYER so we can alter it later 109 | ArrayPushCell(aStoreML, j++); 110 | 111 | // Update ML array saire so we'll know 1st if ML is used, 112 | // 2nd how many args we have to alterate 113 | iMlNumber++; 114 | } 115 | } 116 | } 117 | } 118 | 119 | // If arraysize == 0, ML is not used 120 | // we can only send 1 MSG_ALL message if sender != 0 121 | if (!iMlNumber) 122 | { 123 | if (iParams == 3) 124 | { 125 | copy(szMessage, charsmax(szMessage), fmt); 126 | } 127 | else 128 | { 129 | vformat(szMessage, charsmax(szMessage), fmt, 4); 130 | } 131 | if (0 < sender < (32 - Blue)) // if 0 is passed, need to loop 132 | { 133 | if (sender > (32 - Grey)) 134 | { 135 | _CC_TeamInfo(0, sender, szTeamName[sender - (32 - Grey)]); 136 | } 137 | _CC_SayText(0, sender, szMessage); 138 | return 1; 139 | } 140 | } 141 | 142 | if (sender > (32 - Blue)) 143 | { 144 | sender = 0; // use receiver index 145 | } 146 | 147 | for (--iNum; iNum >= 0; iNum--) 148 | { 149 | id = iPlayers[iNum]; 150 | 151 | if (iMlNumber) 152 | { 153 | for (j = 0; j < iMlNumber; j++) 154 | { 155 | // Set all LANG_PLAYER args to player index ( = id ) 156 | // so we can format the text for that specific player 157 | setarg(ArrayGetCell(aStoreML, j), _, id); 158 | } 159 | 160 | // format string for specific player 161 | vformat(szMessage, charsmax(szMessage), fmt, 4); 162 | } 163 | 164 | if (sender > (32 - Grey)) 165 | { 166 | _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]); 167 | } 168 | _CC_SayText(id, sender, szMessage); 169 | } 170 | 171 | ArrayDestroy(aStoreML); 172 | } 173 | return 1; 174 | } 175 | 176 | stock _CC_TeamInfo(iReceiver, iSender, szTeam[]) 177 | { 178 | static iTeamInfo = 0; 179 | if (!iTeamInfo) 180 | { 181 | iTeamInfo = get_user_msgid("TeamInfo"); 182 | } 183 | message_begin(iReceiver ? MSG_ONE : MSG_ALL, iTeamInfo, _, iReceiver); 184 | write_byte(iSender); 185 | write_string(szTeam); 186 | message_end(); 187 | } 188 | 189 | stock _CC_SayText(iReceiver, iSender, szMessage[]) 190 | { 191 | static iSayText = 0; 192 | if (!iSayText) 193 | { 194 | iSayText = get_user_msgid("SayText"); 195 | } 196 | 197 | // Prevent sending format and localization strings via chat 198 | for (new i = 0; i < 192; i++) 199 | { 200 | if (szMessage[i] == 0) break; 201 | if (szMessage[i] == '%' || 202 | szMessage[i] == '#') 203 | szMessage[i] = ' '; 204 | } 205 | 206 | message_begin(iReceiver ? MSG_ONE : MSG_ALL, iSayText, _, iReceiver); 207 | write_byte(iSender ? iSender : iReceiver); 208 | if (szMessage[0] > 4) 209 | { 210 | write_byte(1); 211 | szMessage[192 - 2 - 1] = 0; // Two write_byte + string terminator 212 | write_string(szMessage); 213 | } 214 | else 215 | { 216 | szMessage[192 - 1 - 1] = 0; // One write_byte + string terminator 217 | write_string(szMessage); 218 | } 219 | message_end(); 220 | } 221 | 222 | new _translation_szBuffer[MAX_TRANSLATION_LENGTH]; 223 | 224 | stock register_dictionary_colored(const filename[]) 225 | { 226 | if (!register_dictionary(filename)) 227 | { 228 | return 0; 229 | } 230 | 231 | new szFileName[256]; 232 | get_localinfo("amxx_datadir", szFileName, charsmax(szFileName)); 233 | format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename); 234 | new fp = fopen(szFileName, "rt"); 235 | if (!fp) 236 | { 237 | log_amx("Failed to open %s", szFileName); 238 | return 0; 239 | } 240 | 241 | new szLang[3], szKey[64], TransKey:iKey; 242 | 243 | while (!feof(fp)) 244 | { 245 | fgets(fp, _translation_szBuffer, charsmax(_translation_szBuffer)); 246 | trim(_translation_szBuffer); 247 | 248 | if (_translation_szBuffer[0] == '[') 249 | { 250 | strtok(_translation_szBuffer[1], szLang, charsmax(szLang), _translation_szBuffer, 1, ']'); 251 | } 252 | else if (_translation_szBuffer[0]) 253 | { 254 | strbreak(_translation_szBuffer, szKey, charsmax(szKey), _translation_szBuffer, charsmax(_translation_szBuffer)); 255 | iKey = GetLangTransKey(szKey); 256 | if (iKey != TransKey_Bad) 257 | { 258 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!g", "^4"); 259 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!t", "^3"); 260 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!n", "^1"); 261 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^4", "^4"); 262 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^3", "^3"); 263 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^1", "^1"); 264 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^n", "^n"); 265 | replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^t", "^t"); 266 | AddTranslation(szLang, iKey, _translation_szBuffer[2]); 267 | } 268 | } 269 | } 270 | 271 | fclose(fp); 272 | return 1; 273 | } 274 | 275 | /* ML from AMXX 1.8.3 support */ 276 | #define register_dictionary register_dictionary_colored 277 | -------------------------------------------------------------------------------- /mapmanager.cfg: -------------------------------------------------------------------------------- 1 | echo "Map Manager Settings Loaded" 2 | mapm_change_type 2 // 0 - after end vote, 1 - in round end, 2 - after end map 3 | mapm_start_vote_before_end 2 // in minutes 4 | mapm_show_result_type 1 // 0 - disable, 1 - menu, 2 - hud 5 | mapm_show_selects 1 // 0 - disable, 1 - all 6 | mapm_start_vote_in_new_round 0 // 0 - disable, 1 - enable 7 | mapm_freeze_in_vote 0 // 0 - disable, 1 - enable, if mm_start_vote_in_new_round 1 8 | mapm_black_screen_in_vote 0 // 0 - disable, 1 - enable 9 | mapm_last_round 0 // 0 - disable, 1 - enable 10 | mapm_change_to_default_map 0 // 0 - disable, 1 - enable 11 | mapm_default_map "de_dust2" 12 | mapm_extended_type 0 // 0 - time, 1 - rounds 13 | mapm_extended_map_max 3 14 | mapm_extended_time 15 // in minutes 15 | mapm_extended_rounds 3 16 | mapm_rtv_mode 0 // 0 - percents, 1 - players 17 | mapm_rtv_percent 60 18 | mapm_rtv_players 5 19 | mapm_rtv_change_type 1 // 0 - after vote, 1 - in round end 20 | mapm_rtv_delay 0 // minutes 21 | mapm_nom_dont_close_menu 0 // 0 - disable, 1 - enable 22 | mapm_nom_del_noncur_online 0 // 0 - disable, 1 - enable 23 | mapm_night_time "00:00 8:00" // time to enable night mode -------------------------------------------------------------------------------- /mapmanager.sma: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #if AMXX_VERSION_NUM < 183 4 | #include 5 | #endif 6 | 7 | #define PLUGIN "Map Manager" 8 | #define VERSION "2.5.61" 9 | #define AUTHOR "Mistrick" 10 | 11 | #pragma semicolon 1 12 | 13 | ///******** Settings ********/// 14 | 15 | #define FUNCTION_NEXTMAP //replace default nextmap 16 | #define FUNCTION_RTV 17 | #define FUNCTION_NOMINATION 18 | //#define FUNCTION_NIGHTMODE 19 | #define FUNCTION_NIGHTMODE_BLOCK_CMDS 20 | #define FUNCTION_BLOCK_MAPS 21 | #define FUNCTION_SOUND 22 | 23 | #define SELECT_MAPS 5 24 | #define PRE_START_TIME 5 25 | #define VOTE_TIME 10 26 | 27 | #define NOMINATED_MAPS_IN_VOTE 3 28 | #define NOMINATED_MAPS_PER_PLAYER 3 29 | 30 | #define BLOCK_MAP_COUNT 5 31 | 32 | #define MIN_DENOMINATE_TIME 3 33 | 34 | new const PREFIX[] = "^4[MapManager]"; 35 | 36 | ///**************************/// 37 | 38 | #if BLOCK_MAP_COUNT <= 1 39 | #undef FUNCTION_BLOCK_MAPS 40 | #endif 41 | 42 | enum (+=100) 43 | { 44 | TASK_CHECKTIME = 100, 45 | TASK_SHOWTIMER, 46 | TASK_TIMER, 47 | TASK_VOTEMENU, 48 | TASK_CHANGETODEFAULT, 49 | TASK_CHECKNIGHT 50 | }; 51 | 52 | enum _:MAP_INFO 53 | { 54 | m_MapName[32], 55 | m_MinPlayers, 56 | m_MaxPlayers, 57 | m_BlockCount 58 | }; 59 | enum _:VOTEMENU_INFO 60 | { 61 | v_MapName[32], 62 | v_MapIndex, 63 | v_Votes 64 | }; 65 | enum _:NOMINATEDMAP_INFO 66 | { 67 | n_MapName[32], 68 | n_Player, 69 | n_MapIndex 70 | }; 71 | enum _:BLOCKEDMAP_INFO 72 | { 73 | b_MapName[32], 74 | b_Count 75 | }; 76 | 77 | new Array: g_aMaps; 78 | 79 | enum _:CVARS 80 | { 81 | CHANGE_TYPE, 82 | START_VOTE_BEFORE_END, 83 | SHOW_RESULT_TYPE, 84 | SHOW_SELECTS, 85 | START_VOTE_IN_NEW_ROUND, 86 | FREEZE_IN_VOTE, 87 | BLACK_SCREEN_IN_VOTE, 88 | LAST_ROUND, 89 | CHANGE_TO_DEDAULT, 90 | DEFAULT_MAP, 91 | EXTENDED_TYPE, 92 | EXTENDED_MAX, 93 | EXTENDED_TIME, 94 | EXTENDED_ROUNDS, 95 | #if defined FUNCTION_RTV 96 | ROCK_MODE, 97 | ROCK_PERCENT, 98 | ROCK_PLAYERS, 99 | ROCK_CHANGE_TYPE, 100 | ROCK_DELAY, 101 | #endif 102 | #if defined FUNCTION_NOMINATION 103 | NOMINATION_DONT_CLOSE_MENU, 104 | NOMINATION_DEL_NON_CUR_ONLINE, 105 | #endif 106 | #if defined FUNCTION_NIGHTMODE 107 | NIGHTMODE_TIME, 108 | #endif 109 | MAXROUNDS, 110 | WINLIMIT, 111 | TIMELIMIT, 112 | FREEZETIME, 113 | CHATTIME, 114 | NEXTMAP, 115 | ROUNDTIME 116 | }; 117 | 118 | new const FILE_MAPS[] = "maps.ini";//configdir 119 | 120 | #if defined FUNCTION_BLOCK_MAPS 121 | new const FILE_BLOCKEDMAPS[] = "blockedmaps.ini";//datadir 122 | #endif 123 | 124 | #if defined FUNCTION_NIGHTMODE 125 | new const FILE_NIGHTMAPS[] = "nightmaps.ini";//configdir 126 | #endif 127 | 128 | new g_pCvars[CVARS]; 129 | new g_iTeamScore[2]; 130 | new g_szCurrentMap[32]; 131 | new g_bVoteStarted; 132 | new g_bVoteFinished; 133 | new g_bNotUnlimitTime; 134 | 135 | new g_eMenuItems[SELECT_MAPS + 1][VOTEMENU_INFO]; 136 | new g_iMenuItemsCount; 137 | new g_iTotalVotes; 138 | new g_iTimer; 139 | new g_bPlayerVoted[33]; 140 | new g_iExtendedMax; 141 | new g_bExtendMap; 142 | new g_bStartVote; 143 | new g_bChangedFreezeTime; 144 | new Float:g_fOldTimeLimit; 145 | new g_iForwardPreStartVote; 146 | new g_iForwardStartVote; 147 | new g_iForwardFinishVote; 148 | 149 | #if defined FUNCTION_SOUND 150 | new const g_szSound[][] = 151 | { 152 | "sound/fvox/one.wav", "sound/fvox/two.wav", "sound/fvox/three.wav", "sound/fvox/four.wav", "sound/fvox/five.wav", 153 | "sound/fvox/six.wav", "sound/fvox/seven.wav", "sound/fvox/eight.wav", "sound/fvox/nine.wav", "sound/fvox/ten.wav" 154 | }; 155 | #endif 156 | 157 | #if defined FUNCTION_RTV 158 | new g_bRockVoted[33]; 159 | new g_iRockVotes; 160 | new g_bRockVote; 161 | #endif 162 | 163 | #if defined FUNCTION_NOMINATION 164 | new Array:g_aNominatedMaps; 165 | new g_iNominatedMaps[33]; 166 | new g_iLastDenominate[33]; 167 | new Array:g_aMapPrefixes; 168 | new g_iMapPrefixesNum; 169 | #endif 170 | 171 | #if defined FUNCTION_BLOCK_MAPS 172 | new g_iBlockedSize; 173 | #endif 174 | 175 | #if defined FUNCTION_NIGHTMODE 176 | new Array:g_aNightMaps; 177 | new g_bNightMode; 178 | new g_bNightModeOneMap; 179 | new g_bCurMapInNightMode; 180 | new Float:g_fOldNightTimeLimit; 181 | 182 | #if defined FUNCTION_NIGHTMODE_BLOCK_CMDS 183 | new g_szBlockedCmds[][] = 184 | { 185 | "amx_map", "amx_votemap", "amx_mapmenu", "amx_votemapmenu" 186 | }; 187 | #endif 188 | #endif 189 | 190 | public plugin_init() 191 | { 192 | register_plugin(PLUGIN, VERSION, AUTHOR); 193 | 194 | register_cvar("mapm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY); 195 | 196 | g_pCvars[CHANGE_TYPE] = register_cvar("mapm_change_type", "2");//0 - after end vote, 1 - in round end, 2 - after end map 197 | g_pCvars[START_VOTE_BEFORE_END] = register_cvar("mapm_start_vote_before_end", "2");//minutes 198 | g_pCvars[SHOW_RESULT_TYPE] = register_cvar("mapm_show_result_type", "1");//0 - disable, 1 - menu, 2 - hud 199 | g_pCvars[SHOW_SELECTS] = register_cvar("mapm_show_selects", "1");//0 - disable, 1 - all 200 | g_pCvars[START_VOTE_IN_NEW_ROUND] = register_cvar("mapm_start_vote_in_new_round", "0");//0 - disable, 1 - enable 201 | g_pCvars[FREEZE_IN_VOTE] = register_cvar("mapm_freeze_in_vote", "0");//0 - disable, 1 - enable, if mapm_start_vote_in_new_round 1 202 | g_pCvars[BLACK_SCREEN_IN_VOTE] = register_cvar("mapm_black_screen_in_vote", "0");//0 - disable, 1 - enable 203 | g_pCvars[LAST_ROUND] = register_cvar("mapm_last_round", "0");//0 - disable, 1 - enable 204 | 205 | g_pCvars[CHANGE_TO_DEDAULT] = register_cvar("mapm_change_to_default_map", "0");//minutes, 0 - disable 206 | g_pCvars[DEFAULT_MAP] = register_cvar("mapm_default_map", "de_dust2"); 207 | 208 | g_pCvars[EXTENDED_TYPE] = register_cvar("mapm_extended_type", "0");//0 - minutes, 1 - rounds 209 | g_pCvars[EXTENDED_MAX] = register_cvar("mapm_extended_map_max", "3"); 210 | g_pCvars[EXTENDED_TIME] = register_cvar("mapm_extended_time", "15");//minutes 211 | g_pCvars[EXTENDED_ROUNDS] = register_cvar("mapm_extended_rounds", "3");//rounds 212 | 213 | #if defined FUNCTION_RTV 214 | g_pCvars[ROCK_MODE] = register_cvar("mapm_rtv_mode", "0");//0 - percents, 1 - players 215 | g_pCvars[ROCK_PERCENT] = register_cvar("mapm_rtv_percent", "60"); 216 | g_pCvars[ROCK_PLAYERS] = register_cvar("mapm_rtv_players", "5"); 217 | g_pCvars[ROCK_CHANGE_TYPE] = register_cvar("mapm_rtv_change_type", "1");//0 - after vote, 1 - in round end 218 | g_pCvars[ROCK_DELAY] = register_cvar("mapm_rtv_delay", "0");//minutes 219 | #endif 220 | 221 | #if defined FUNCTION_NOMINATION 222 | g_pCvars[NOMINATION_DONT_CLOSE_MENU] = register_cvar("mapm_nom_dont_close_menu", "0");//0 - disable, 1 - enable 223 | g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE] = register_cvar("mapm_nom_del_noncur_online", "0");//0 - disable, 1 - enable 224 | #endif 225 | 226 | #if defined FUNCTION_NIGHTMODE 227 | g_pCvars[NIGHTMODE_TIME] = register_cvar("mapm_night_time", "00:00 8:00"); 228 | #endif 229 | 230 | g_pCvars[MAXROUNDS] = get_cvar_pointer("mp_maxrounds"); 231 | g_pCvars[WINLIMIT] = get_cvar_pointer("mp_winlimit"); 232 | g_pCvars[TIMELIMIT] = get_cvar_pointer("mp_timelimit"); 233 | g_pCvars[FREEZETIME] = get_cvar_pointer("mp_freezetime"); 234 | g_pCvars[ROUNDTIME] = get_cvar_pointer("mp_roundtime"); 235 | 236 | g_pCvars[NEXTMAP] = register_cvar("amx_nextmap", "", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY); 237 | 238 | #if defined FUNCTION_NEXTMAP 239 | g_pCvars[CHATTIME] = get_cvar_pointer("mp_chattime"); 240 | #endif 241 | 242 | register_event("TeamScore", "Event_TeamScore", "a"); 243 | register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0"); 244 | 245 | #if defined FUNCTION_NEXTMAP 246 | register_event("30", "Event_Intermisson", "a"); 247 | #endif 248 | 249 | register_concmd("mapm_debug", "Commang_Debug", ADMIN_MAP); 250 | register_concmd("mapm_startvote", "Command_StartVote", ADMIN_MAP); 251 | register_concmd("mapm_stopvote", "Command_StopVote", ADMIN_MAP); 252 | register_clcmd("say timeleft", "Command_Timeleft"); 253 | register_clcmd("say thetime", "Command_TheTime"); 254 | register_clcmd("votemap", "Command_Votemap"); 255 | 256 | #if defined FUNCTION_NEXTMAP 257 | register_clcmd("say nextmap", "Command_Nextmap"); 258 | register_clcmd("say currentmap", "Command_CurrentMap"); 259 | #endif 260 | 261 | #if defined FUNCTION_RTV 262 | register_clcmd("say rtv", "Command_RockTheVote"); 263 | register_clcmd("say /rtv", "Command_RockTheVote"); 264 | #endif 265 | 266 | #if defined FUNCTION_NOMINATION 267 | register_clcmd("say", "Command_Say"); 268 | register_clcmd("say_team", "Command_Say"); 269 | register_clcmd("say maps", "Command_MapsList"); 270 | register_clcmd("say /maps", "Command_MapsList"); 271 | #endif 272 | 273 | #if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS 274 | for(new i; i < sizeof(g_szBlockedCmds); i++) 275 | { 276 | register_clcmd(g_szBlockedCmds[i], "Command_BlockedCmds"); 277 | } 278 | #endif 279 | 280 | g_iForwardPreStartVote = CreateMultiForward("mapmanager_prestartvote", ET_IGNORE); 281 | g_iForwardStartVote = CreateMultiForward("mapmanager_startvote", ET_IGNORE); 282 | g_iForwardFinishVote = CreateMultiForward("mapmanager_finishvote", ET_IGNORE); 283 | 284 | register_menucmd(register_menuid("VoteMenu"), 1023, "VoteMenu_Handler"); 285 | 286 | set_task(10.0, "Task_CheckTime", TASK_CHECKTIME, .flags = "b"); 287 | 288 | #if defined FUNCTION_NIGHTMODE 289 | set_task(60.0, "Task_CheckNight", TASK_CHECKNIGHT, .flags = "b"); 290 | #endif 291 | } 292 | 293 | #if defined FUNCTION_NIGHTMODE 294 | public plugin_natives() 295 | { 296 | register_native("is_night_mode", "Native_IsNightMode"); 297 | } 298 | public Native_IsNightMode() 299 | { 300 | return g_bNightMode; 301 | } 302 | #endif 303 | 304 | #if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS 305 | public Command_BlockedCmds(id) 306 | { 307 | if(g_bNightMode) 308 | { 309 | console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD"); 310 | return PLUGIN_HANDLED; 311 | } 312 | return PLUGIN_CONTINUE; 313 | } 314 | #endif 315 | public Command_Votemap(id) 316 | { 317 | return PLUGIN_HANDLED; 318 | } 319 | public Commang_Debug(id, flag) 320 | { 321 | if(~get_user_flags(id) & flag) return PLUGIN_HANDLED; 322 | 323 | console_print(id, "^nLoaded maps:"); 324 | new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps); 325 | for(new i; i < iSize; i++) 326 | { 327 | ArrayGetArray(g_aMaps, i, eMapInfo); 328 | console_print(id, "%3d %32s ^t%d^t%d^t%d", i, eMapInfo[m_MapName], eMapInfo[m_MinPlayers], eMapInfo[m_MaxPlayers], eMapInfo[m_BlockCount]); 329 | } 330 | 331 | #if defined FUNCTION_NOMINATION 332 | new szPrefix[32]; 333 | console_print(id, "^nLoaded prefixes:"); 334 | for(new i; i < g_iMapPrefixesNum; i++) 335 | { 336 | ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix)); 337 | console_print(id, "%s", szPrefix); 338 | } 339 | #endif 340 | 341 | return PLUGIN_HANDLED; 342 | } 343 | public Command_StartVote(id, flag) 344 | { 345 | if(~get_user_flags(id) & flag) return PLUGIN_HANDLED; 346 | 347 | #if defined FUNCTION_NIGHTMODE 348 | if(g_bNightMode && g_bNightModeOneMap) 349 | { 350 | console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD"); 351 | return PLUGIN_HANDLED; 352 | } 353 | #endif 354 | 355 | if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0) 356 | { 357 | StartVote(id); 358 | } 359 | else 360 | { 361 | SetNewRoundVote(); 362 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_VOTE_WILL_BEGIN"); 363 | } 364 | 365 | return PLUGIN_HANDLED; 366 | } 367 | public Command_StopVote(id, flag) 368 | { 369 | if(~get_user_flags(id) & flag) return PLUGIN_HANDLED; 370 | 371 | if(g_bVoteStarted) 372 | { 373 | g_bVoteStarted = false; 374 | 375 | #if defined FUNCTION_RTV 376 | g_bRockVote = false; 377 | g_iRockVotes = 0; 378 | arrayset(g_bRockVoted, false, 33); 379 | #endif 380 | 381 | if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE])) 382 | { 383 | SetBlackScreenFade(0); 384 | } 385 | 386 | if(g_bChangedFreezeTime) 387 | { 388 | set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1)); 389 | g_bChangedFreezeTime = false; 390 | } 391 | 392 | remove_task(TASK_VOTEMENU); 393 | remove_task(TASK_SHOWTIMER); 394 | remove_task(TASK_TIMER); 395 | 396 | for(new i = 1; i <= 32; i++) 397 | remove_task(TASK_VOTEMENU + i); 398 | 399 | show_menu(0, 0, "^n", 1); 400 | new szName[32]; 401 | 402 | if(id) get_user_name(id, szName, charsmax(szName)); 403 | else szName = "Server"; 404 | 405 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CANCEL_VOTE", szName); 406 | log_amx("%s canceled vote.", szName); 407 | } 408 | 409 | return PLUGIN_HANDLED; 410 | } 411 | public Command_Timeleft(id) 412 | { 413 | new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]); 414 | new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]); 415 | 416 | if((iWinLimit || iMaxRounds) && get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1) 417 | { 418 | new szText[128], len; 419 | len = formatex(szText, charsmax(szText), "%L ", LANG_PLAYER, "MAPM_TIME_TO_END"); 420 | if(iWinLimit) 421 | { 422 | new iLeftWins = iWinLimit - max(g_iTeamScore[0], g_iTeamScore[1]); 423 | new szWins[16]; get_ending(iLeftWins, "MAPM_WIN1", "MAPM_WIN2", "MAPM_WIN3", szWins, charsmax(szWins)); 424 | len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftWins, LANG_PLAYER, szWins); 425 | } 426 | if(iWinLimit && iMaxRounds) 427 | { 428 | len += formatex(szText[len], charsmax(szText) - len, " %L ", LANG_PLAYER, "MAPM_TIMELEFT_OR"); 429 | } 430 | if(iMaxRounds) 431 | { 432 | new iLeftRounds = iMaxRounds - g_iTeamScore[0] - g_iTeamScore[1]; 433 | new szRounds[16]; get_ending(iLeftRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds)); 434 | len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftRounds, LANG_PLAYER, szRounds); 435 | } 436 | client_print_color(0, print_team_default, "%s^1 %s.", PREFIX, szText); 437 | } 438 | else 439 | { 440 | if (get_pcvar_num(g_pCvars[TIMELIMIT])) 441 | { 442 | new a = get_timeleft(); 443 | client_print_color(0, id, "%s^1 %L:^3 %d:%02d", PREFIX, LANG_PLAYER, "MAPM_TIME_TO_END", (a / 60), (a % 60)); 444 | } 445 | else 446 | { 447 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NO_TIMELIMIT"); 448 | } 449 | } 450 | } 451 | public Command_TheTime(id) 452 | { 453 | new szTime[64]; get_time("%Y/%m/%d - %H:%M:%S", szTime, charsmax(szTime)); 454 | client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_THETIME", szTime); 455 | } 456 | 457 | #if defined FUNCTION_NEXTMAP 458 | public Command_Nextmap(id) 459 | { 460 | if(g_bVoteFinished) 461 | { 462 | new szMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMap, charsmax(szMap)); 463 | client_print_color(0, id, "%s^1 %L ^3%s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMap); 464 | } 465 | else 466 | { 467 | client_print_color(0, id, "%s^1 %L ^3%L^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", LANG_PLAYER, "MAPM_NOT_SELECTED"); 468 | } 469 | } 470 | public Command_CurrentMap(id) 471 | { 472 | client_print_color(0, id, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_CURRENT_MAP", g_szCurrentMap); 473 | } 474 | #endif 475 | 476 | #if defined FUNCTION_RTV 477 | public Command_RockTheVote(id) 478 | { 479 | if(g_bVoteFinished || g_bVoteStarted || g_bStartVote) return PLUGIN_HANDLED; 480 | 481 | #if defined FUNCTION_NIGHTMODE 482 | if(g_bNightMode && g_bNightModeOneMap) 483 | { 484 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE"); 485 | return PLUGIN_HANDLED; 486 | } 487 | #endif 488 | 489 | new iTime = get_pcvar_num(g_pCvars[ROCK_DELAY]) * 60 - (floatround(get_pcvar_float(g_pCvars[TIMELIMIT]) * 60.0) - get_timeleft()); 490 | if(iTime > 0) 491 | { 492 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_DELAY", iTime / 60, iTime % 60); 493 | return PLUGIN_HANDLED; 494 | } 495 | 496 | if(!g_bRockVoted[id]) g_iRockVotes++; 497 | 498 | new iVotes = (get_pcvar_num(g_pCvars[ROCK_MODE])) ? get_pcvar_num(g_pCvars[ROCK_PLAYERS]) - g_iRockVotes : floatround(get_players_num() * get_pcvar_num(g_pCvars[ROCK_PERCENT]) / 100.0, floatround_ceil) - g_iRockVotes; 499 | 500 | if(iVotes <= 0) 501 | { 502 | g_bRockVote = true; 503 | if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND])) 504 | { 505 | StartVote(0); 506 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_START_VOTE"); 507 | } 508 | else 509 | { 510 | SetNewRoundVote(); 511 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_START_VOTE_NEW_ROUND"); 512 | } 513 | return PLUGIN_HANDLED; 514 | } 515 | 516 | new szVote[16]; get_ending(iVotes, "MAPM_VOTE1", "MAPM_VOTE2", "MAPM_VOTE3", szVote, charsmax(szVote)); 517 | 518 | if(!g_bRockVoted[id]) 519 | { 520 | g_bRockVoted[id] = true; 521 | 522 | new szName[33]; get_user_name(id, szName, charsmax(szName)); 523 | client_print_color(0, print_team_default, "%s^3 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_VOTED", szName, iVotes, LANG_PLAYER, szVote); 524 | } 525 | else 526 | { 527 | client_print_color(id, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_ALREADY_VOTED", iVotes, LANG_PLAYER, szVote); 528 | } 529 | 530 | return PLUGIN_HANDLED; 531 | } 532 | #endif 533 | 534 | #if defined FUNCTION_NOMINATION 535 | public Command_Say(id) 536 | { 537 | if(g_bVoteStarted || g_bVoteFinished) return; 538 | 539 | #if defined FUNCTION_NIGHTMODE 540 | if(g_bNightMode) return; 541 | #endif 542 | 543 | new szText[32]; read_args(szText, charsmax(szText)); 544 | remove_quotes(szText); trim(szText); strtolower(szText); 545 | 546 | if(string_with_space(szText)) return; 547 | 548 | new map_index = is_map_in_array(szText); 549 | 550 | if(map_index) 551 | { 552 | NominateMap(id, szText, map_index - 1); 553 | } 554 | else if(strlen(szText) >= 4) 555 | { 556 | new szFormat[32], szPrefix[32], Array:aNominateList = ArrayCreate(), iArraySize; 557 | for(new i; i < g_iMapPrefixesNum; i++) 558 | { 559 | ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix)); 560 | formatex(szFormat, charsmax(szFormat), "%s%s", szPrefix, szText); 561 | map_index = 0; 562 | while((map_index = find_similar_map(map_index, szFormat))) 563 | { 564 | ArrayPushCell(aNominateList, map_index - 1); 565 | iArraySize++; 566 | } 567 | } 568 | 569 | if(iArraySize == 1) 570 | { 571 | map_index = ArrayGetCell(aNominateList, 0); 572 | new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo); 573 | copy(szFormat, charsmax(szFormat), eMapInfo[m_MapName]); 574 | NominateMap(id, szFormat, map_index); 575 | } 576 | else if(iArraySize > 1) 577 | { 578 | Show_NominationList(id, aNominateList, iArraySize); 579 | } 580 | 581 | ArrayDestroy(aNominateList); 582 | } 583 | } 584 | public Show_NominationList(id, Array: array, size) 585 | { 586 | new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_FAST_NOM"); 587 | new iMenu = menu_create(szText, "NominationList_Handler"); 588 | new eMapInfo[MAP_INFO], szString[64], map_index, nominate_index; 589 | 590 | for(new i, szNum[8]; i < size; i++) 591 | { 592 | map_index = ArrayGetCell(array, i); 593 | ArrayGetArray(g_aMaps, map_index, eMapInfo); 594 | 595 | num_to_str(map_index, szNum, charsmax(szNum)); 596 | nominate_index = is_map_nominated(map_index); 597 | 598 | if(eMapInfo[m_BlockCount]) 599 | { 600 | formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]); 601 | menu_additem(iMenu, szString, szNum, (1 << 31)); 602 | } 603 | else if(nominate_index) 604 | { 605 | new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo); 606 | if(id == eNomInfo[n_Player]) 607 | { 608 | formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]); 609 | menu_additem(iMenu, szString, szNum); 610 | } 611 | else 612 | { 613 | formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]); 614 | menu_additem(iMenu, szString, szNum, (1 << 31)); 615 | } 616 | } 617 | else 618 | { 619 | menu_additem(iMenu, eMapInfo[m_MapName], szNum); 620 | } 621 | } 622 | 623 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK"); 624 | menu_setprop(iMenu, MPROP_BACKNAME, szText); 625 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT"); 626 | menu_setprop(iMenu, MPROP_NEXTNAME, szText); 627 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT"); 628 | menu_setprop(iMenu, MPROP_EXITNAME, szText); 629 | 630 | menu_display(id, iMenu); 631 | } 632 | public NominationList_Handler(id, menu, item) 633 | { 634 | if(item == MENU_EXIT) 635 | { 636 | menu_destroy(menu); 637 | return PLUGIN_HANDLED; 638 | } 639 | 640 | new szData[8], szName[32], iAccess, iCallback; 641 | menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback); 642 | 643 | new map_index = str_to_num(szData); 644 | trim_bracket(szName); 645 | new is_map_nominated = NominateMap(id, szName, map_index); 646 | 647 | if(is_map_nominated == 2 || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU])) 648 | { 649 | if(is_map_nominated == 1) 650 | { 651 | new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName); 652 | menu_item_setname(menu, item, szString); 653 | } 654 | else if(is_map_nominated == 2) 655 | { 656 | menu_item_setname(menu, item, szName); 657 | } 658 | menu_display(id, menu); 659 | } 660 | else 661 | { 662 | menu_destroy(menu); 663 | } 664 | 665 | return PLUGIN_HANDLED; 666 | } 667 | NominateMap(id, map[32], map_index) 668 | { 669 | new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo); 670 | 671 | #if defined FUNCTION_BLOCK_MAPS 672 | if(eMapInfo[m_BlockCount]) 673 | { 674 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_NOT_AVAILABLE_MAP"); 675 | return 0; 676 | } 677 | #endif 678 | 679 | new eNomInfo[NOMINATEDMAP_INFO]; 680 | new szName[32]; get_user_name(id, szName, charsmax(szName)); 681 | 682 | new nominate_index = is_map_nominated(map_index); 683 | if(nominate_index) 684 | { 685 | ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo); 686 | if(id == eNomInfo[n_Player]) 687 | { 688 | new iSysTime = get_systime(); 689 | if(g_iLastDenominate[id] + MIN_DENOMINATE_TIME <= iSysTime) 690 | { 691 | g_iLastDenominate[id] = iSysTime; 692 | g_iNominatedMaps[id]--; 693 | ArrayDeleteItem(g_aNominatedMaps, nominate_index - 1); 694 | 695 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_REMOVE_NOM", szName, map); 696 | return 2; 697 | } 698 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_SPAM"); 699 | return 0; 700 | } 701 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_ALREADY_NOM"); 702 | return 0; 703 | } 704 | 705 | if(g_iNominatedMaps[id] >= NOMINATED_MAPS_PER_PLAYER) 706 | { 707 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_CANT_NOM"); 708 | return 0; 709 | } 710 | 711 | eNomInfo[n_MapName] = map; 712 | eNomInfo[n_Player] = id; 713 | eNomInfo[n_MapIndex] = map_index; 714 | ArrayPushArray(g_aNominatedMaps, eNomInfo); 715 | 716 | g_iNominatedMaps[id]++; 717 | 718 | if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE])) 719 | { 720 | new iMinPlayers = eMapInfo[m_MinPlayers] == 0 ? 1 : eMapInfo[m_MinPlayers]; 721 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP2", szName, map, iMinPlayers, eMapInfo[m_MaxPlayers]); 722 | } 723 | else 724 | { 725 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP", szName, map); 726 | } 727 | 728 | return 1; 729 | } 730 | public Command_MapsList(id) 731 | { 732 | #if defined FUNCTION_NIGHTMODE 733 | if(g_bNightMode) 734 | { 735 | client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE"); 736 | return; 737 | } 738 | #endif 739 | Show_MapsListMenu(id); 740 | } 741 | Show_MapsListMenu(id) 742 | { 743 | new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST"); 744 | new iMenu = menu_create(szText, "MapsListMenu_Handler"); 745 | 746 | new eMapInfo[MAP_INFO], szString[48], iSize = ArraySize(g_aMaps); 747 | 748 | for(new i, nominate_index; i < iSize; i++) 749 | { 750 | ArrayGetArray(g_aMaps, i, eMapInfo); 751 | nominate_index = is_map_nominated(i); 752 | 753 | if(eMapInfo[m_BlockCount]) 754 | { 755 | formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]); 756 | menu_additem(iMenu, szString, _, (1 << 31)); 757 | } 758 | else if(nominate_index) 759 | { 760 | new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo); 761 | if(id == eNomInfo[n_Player]) 762 | { 763 | formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]); 764 | menu_additem(iMenu, szString); 765 | } 766 | else 767 | { 768 | formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]); 769 | menu_additem(iMenu, szString, _, (1 << 31)); 770 | } 771 | } 772 | else 773 | { 774 | menu_additem(iMenu, eMapInfo[m_MapName]); 775 | } 776 | } 777 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK"); 778 | menu_setprop(iMenu, MPROP_BACKNAME, szText); 779 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT"); 780 | menu_setprop(iMenu, MPROP_NEXTNAME, szText); 781 | formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT"); 782 | menu_setprop(iMenu, MPROP_EXITNAME, szText); 783 | 784 | menu_display(id, iMenu); 785 | } 786 | public MapsListMenu_Handler(id, menu, item) 787 | { 788 | if(item == MENU_EXIT) 789 | { 790 | menu_destroy(menu); 791 | return PLUGIN_HANDLED; 792 | } 793 | 794 | new szData[2], szName[32], iAccess, iCallback; 795 | menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback); 796 | 797 | new map_index = item; 798 | trim_bracket(szName); 799 | new is_map_nominated = NominateMap(id, szName, map_index); 800 | 801 | if(g_iNominatedMaps[id] < NOMINATED_MAPS_PER_PLAYER || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU])) 802 | { 803 | if(is_map_nominated == 1) 804 | { 805 | new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName); 806 | menu_item_setname(menu, item, szString); 807 | } 808 | else if(is_map_nominated == 2) 809 | { 810 | menu_item_setname(menu, item, szName); 811 | } 812 | menu_display(id, menu, map_index / 7); 813 | } 814 | else 815 | { 816 | menu_destroy(menu); 817 | } 818 | 819 | return PLUGIN_HANDLED; 820 | } 821 | #endif 822 | public client_putinserver(id) 823 | { 824 | if(!is_user_bot(id) && !is_user_hltv(id)) 825 | remove_task(TASK_CHANGETODEFAULT); 826 | } 827 | public client_disconnect(id) 828 | { 829 | remove_task(id + TASK_VOTEMENU); 830 | 831 | #if defined FUNCTION_RTV 832 | if(g_bRockVoted[id]) 833 | { 834 | g_bRockVoted[id] = false; 835 | g_iRockVotes--; 836 | } 837 | #endif 838 | 839 | #if defined FUNCTION_NOMINATION 840 | if(g_iNominatedMaps[id]) 841 | { 842 | clear_nominated_maps(id); 843 | } 844 | #endif 845 | 846 | #if defined FUNCTION_NIGHTMODE 847 | if(!g_bNightMode) set_task(1.0, "Task_DelayedChangeToDelault"); 848 | #else 849 | set_task(1.0, "Task_DelayedChangeToDelault"); 850 | #endif 851 | } 852 | public Task_DelayedChangeToDelault() 853 | { 854 | new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]); 855 | if(fChangeTime > 0.0 && get_players_num() == 0) 856 | { 857 | set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT); 858 | } 859 | } 860 | public Task_ChangeToDefault() 861 | { 862 | new szMapName[32]; get_pcvar_string(g_pCvars[DEFAULT_MAP], szMapName, charsmax(szMapName)); 863 | if(get_players_num() == 0 && is_map_valid(szMapName) && !equali(szMapName, g_szCurrentMap)) 864 | { 865 | log_amx("Map changed to default[%s]", szMapName); 866 | set_pcvar_string(g_pCvars[NEXTMAP], szMapName); 867 | Intermission(); 868 | } 869 | } 870 | public plugin_end() 871 | { 872 | #if defined FUNCTION_NIGHTMODE 873 | if(g_fOldNightTimeLimit > 0.0) 874 | { 875 | set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit); 876 | } 877 | #endif 878 | 879 | if(g_bChangedFreezeTime) 880 | { 881 | set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1)); 882 | } 883 | if(g_fOldTimeLimit > 0.0) 884 | { 885 | set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit); 886 | } 887 | if(g_iExtendedMax) 888 | { 889 | if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 0) 890 | { 891 | set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) - float(g_iExtendedMax * get_pcvar_num(g_pCvars[EXTENDED_TIME]))); 892 | } 893 | else 894 | { 895 | new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]); 896 | if(iWinLimit > 0) 897 | { 898 | set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax); 899 | } 900 | new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]); 901 | if(iMaxRounds > 0) 902 | { 903 | set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax); 904 | } 905 | } 906 | } 907 | } 908 | public plugin_cfg() 909 | { 910 | new filepath[256]; get_localinfo("amxx_configsdir", filepath, charsmax(filepath)); 911 | add(filepath, charsmax(filepath), "/mapmanager.cfg"); 912 | 913 | if(file_exists(filepath)) 914 | { 915 | server_cmd("exec %s", filepath); 916 | server_exec(); 917 | } 918 | 919 | g_aMaps = ArrayCreate(MAP_INFO); 920 | 921 | #if defined FUNCTION_NOMINATION 922 | g_aNominatedMaps = ArrayCreate(NOMINATEDMAP_INFO); 923 | g_aMapPrefixes = ArrayCreate(32); 924 | #endif 925 | 926 | if( is_plugin_loaded("Nextmap Chooser") > -1 ) 927 | { 928 | pause("cd", "mapchooser.amxx"); 929 | log_amx("MapManager: mapchooser.amxx has been stopped."); 930 | } 931 | 932 | #if defined FUNCTION_NEXTMAP 933 | if( is_plugin_loaded("NextMap") > -1 ) 934 | { 935 | pause("cd", "nextmap.amxx"); 936 | log_amx("MapManager: nextmap.amxx has been stopped."); 937 | } 938 | #endif 939 | 940 | LoadMapsFromFile(); 941 | 942 | #if defined FUNCTION_NIGHTMODE 943 | LoadNightMaps(); 944 | #endif 945 | 946 | new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]); 947 | if(fChangeTime > 0.0) 948 | { 949 | set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT); 950 | } 951 | 952 | register_dictionary("mapmanager.txt"); 953 | } 954 | LoadMapsFromFile() 955 | { 956 | new szDir[128], szFile[128]; 957 | get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap)); 958 | 959 | #if defined FUNCTION_BLOCK_MAPS 960 | get_localinfo("amxx_datadir", szDir, charsmax(szDir)); 961 | formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_BLOCKEDMAPS); 962 | 963 | new Array:aBlockedMaps = ArrayCreate(BLOCKEDMAP_INFO); 964 | new eBlockedInfo[BLOCKEDMAP_INFO]; 965 | 966 | if(file_exists(szFile)) 967 | { 968 | new szTemp[128]; formatex(szTemp, charsmax(szTemp), "%s/temp.ini", szDir); 969 | new iFile = fopen(szFile, "rt"); 970 | new iTemp = fopen(szTemp, "wt"); 971 | 972 | new szBuffer[42], szMapName[32], szCount[8], iCount; 973 | 974 | while(!feof(iFile)) 975 | { 976 | fgets(iFile, szBuffer, charsmax(szBuffer)); 977 | parse(szBuffer, szMapName, charsmax(szMapName), szCount, charsmax(szCount)); 978 | 979 | if(!is_map_valid(szMapName) || is_map_blocked(aBlockedMaps, szMapName) || equali(szMapName, g_szCurrentMap)) continue; 980 | 981 | iCount = str_to_num(szCount) - 1; 982 | 983 | if(iCount <= 0) continue; 984 | 985 | if(iCount > BLOCK_MAP_COUNT) 986 | { 987 | fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, BLOCK_MAP_COUNT); 988 | iCount = BLOCK_MAP_COUNT; 989 | } 990 | else 991 | { 992 | fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, iCount); 993 | } 994 | 995 | formatex(eBlockedInfo[b_MapName], charsmax(eBlockedInfo[b_MapName]), szMapName); 996 | eBlockedInfo[b_Count] = iCount; 997 | ArrayPushArray(aBlockedMaps, eBlockedInfo); 998 | } 999 | 1000 | fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT); 1001 | 1002 | fclose(iFile); 1003 | fclose(iTemp); 1004 | 1005 | delete_file(szFile); 1006 | rename_file(szTemp, szFile, 1); 1007 | } 1008 | else 1009 | { 1010 | new iFile = fopen(szFile, "wt"); 1011 | if(iFile) 1012 | { 1013 | fprintf(iFile, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT); 1014 | } 1015 | fclose(iFile); 1016 | } 1017 | #endif 1018 | 1019 | get_localinfo("amxx_configsdir", szDir, charsmax(szDir)); 1020 | formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_MAPS); 1021 | 1022 | if(file_exists(szFile)) 1023 | { 1024 | new f = fopen(szFile, "rt"); 1025 | 1026 | if(f) 1027 | { 1028 | new eMapInfo[MAP_INFO]; 1029 | new szText[48], szMap[32], szMin[3], szMax[3]; 1030 | while(!feof(f)) 1031 | { 1032 | fgets(f, szText, charsmax(szText)); 1033 | parse(szText, szMap, charsmax(szMap), szMin, charsmax(szMin), szMax, charsmax(szMax)); 1034 | 1035 | if(!szMap[0] || szMap[0] == ';' || !valid_map(szMap) || is_map_in_array(szMap) || equali(szMap, g_szCurrentMap)) continue; 1036 | 1037 | #if defined FUNCTION_BLOCK_MAPS 1038 | new blocked_index = is_map_blocked(aBlockedMaps, szMap); 1039 | if(blocked_index) 1040 | { 1041 | ArrayGetArray(aBlockedMaps, blocked_index - 1, eBlockedInfo); 1042 | eMapInfo[m_BlockCount] = eBlockedInfo[b_Count]; 1043 | } 1044 | else 1045 | { 1046 | eMapInfo[m_BlockCount] = 0; 1047 | } 1048 | #endif 1049 | 1050 | #if defined FUNCTION_NOMINATION 1051 | new szPrefix[32]; 1052 | if(get_map_prefix(szMap, szPrefix, charsmax(szPrefix)) && !is_prefix_in_array(szPrefix)) 1053 | { 1054 | ArrayPushString(g_aMapPrefixes, szPrefix); 1055 | g_iMapPrefixesNum++; 1056 | } 1057 | #endif 1058 | 1059 | eMapInfo[m_MapName] = szMap; 1060 | eMapInfo[m_MinPlayers] = str_to_num(szMin); 1061 | eMapInfo[m_MaxPlayers] = str_to_num(szMax) == 0 ? 32 : str_to_num(szMax); 1062 | 1063 | ArrayPushArray(g_aMaps, eMapInfo); 1064 | szMin = ""; szMax = ""; 1065 | } 1066 | fclose(f); 1067 | 1068 | new iSize = ArraySize(g_aMaps); 1069 | 1070 | if(iSize == 0) 1071 | { 1072 | set_fail_state("Nothing loaded from file."); 1073 | } 1074 | 1075 | #if defined FUNCTION_BLOCK_MAPS 1076 | g_iBlockedSize = ArraySize(aBlockedMaps); 1077 | if(iSize - g_iBlockedSize < SELECT_MAPS) 1078 | { 1079 | log_amx("LoadMaps: warning to little maps without block [%d]", iSize - g_iBlockedSize); 1080 | } 1081 | if(iSize - g_iBlockedSize < 1) 1082 | { 1083 | log_amx("LoadMaps: blocked maps cleared"); 1084 | clear_blocked_maps(); 1085 | } 1086 | ArrayDestroy(aBlockedMaps); 1087 | #endif 1088 | 1089 | #if defined FUNCTION_NEXTMAP 1090 | new iRandomMap = random_num(0, iSize - 1); 1091 | ArrayGetArray(g_aMaps, iRandomMap, eMapInfo); 1092 | set_pcvar_string(g_pCvars[NEXTMAP], eMapInfo[m_MapName]); 1093 | #endif 1094 | } 1095 | } 1096 | else 1097 | { 1098 | set_fail_state("Maps file doesn't exist."); 1099 | } 1100 | } 1101 | 1102 | #if defined FUNCTION_NIGHTMODE 1103 | LoadNightMaps() 1104 | { 1105 | g_aNightMaps = ArrayCreate(32); 1106 | 1107 | new szDir[128]; get_localinfo("amxx_configsdir", szDir, charsmax(szDir)); 1108 | new szFile[128]; formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_NIGHTMAPS); 1109 | new iMapsCount; 1110 | if(file_exists(szFile)) 1111 | { 1112 | new szMapName[32], f = fopen(szFile, "rt"); 1113 | if(f) 1114 | { 1115 | while(!feof(f)) 1116 | { 1117 | fgets(f, szMapName, charsmax(szMapName)); 1118 | trim(szMapName); remove_quotes(szMapName); 1119 | 1120 | if(!szMapName[0] || szMapName[0] == ';' || !valid_map(szMapName) || is_map_in_night_array(szMapName)) 1121 | continue; 1122 | 1123 | ArrayPushString(g_aNightMaps, szMapName); 1124 | iMapsCount++; 1125 | } 1126 | fclose(f); 1127 | } 1128 | } 1129 | if(iMapsCount < 1) 1130 | { 1131 | log_amx("LoadNightMaps: Need more maps"); 1132 | remove_task(TASK_CHECKNIGHT); 1133 | } 1134 | else if(iMapsCount == 1) 1135 | { 1136 | g_bNightModeOneMap = true; 1137 | } 1138 | 1139 | if(is_map_in_night_array(g_szCurrentMap)) 1140 | { 1141 | g_bCurMapInNightMode = true; 1142 | } 1143 | if(iMapsCount >= 1) 1144 | { 1145 | set_task(10.0, "Task_CheckNight"); 1146 | } 1147 | } 1148 | #endif 1149 | 1150 | #if defined FUNCTION_NEXTMAP 1151 | public Event_Intermisson() 1152 | { 1153 | new Float:fChatTime = get_pcvar_float(g_pCvars[CHATTIME]); 1154 | set_pcvar_float(g_pCvars[CHATTIME], fChatTime + 2.0); 1155 | set_task(fChatTime, "DelayedChange"); 1156 | } 1157 | public DelayedChange() 1158 | { 1159 | new szNextMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szNextMap, charsmax(szNextMap)); 1160 | set_pcvar_float(g_pCvars[CHATTIME], get_pcvar_float(g_pCvars[CHATTIME]) - 2.0); 1161 | server_cmd("changelevel %s", szNextMap); 1162 | } 1163 | #endif 1164 | public Event_NewRound() 1165 | { 1166 | new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]); 1167 | if(!g_bVoteFinished && iMaxRounds && (g_iTeamScore[0] + g_iTeamScore[1]) >= iMaxRounds - 2) 1168 | { 1169 | log_amx("StartVote: maxrounds %d [%d]", iMaxRounds, g_iTeamScore[0] + g_iTeamScore[1]); 1170 | StartVote(0); 1171 | } 1172 | 1173 | new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]) - 2; 1174 | if(!g_bVoteFinished && iWinLimit > 0 && (g_iTeamScore[0] >= iWinLimit || g_iTeamScore[1] >= iWinLimit)) 1175 | { 1176 | log_amx("StartVote: winlimit %d [%d/%d]", iWinLimit, g_iTeamScore[0], g_iTeamScore[1]); 1177 | StartVote(0); 1178 | } 1179 | 1180 | if(g_bStartVote) 1181 | { 1182 | log_amx("StartVote: timeleft %d, new round", get_timeleft()); 1183 | StartVote(0); 1184 | } 1185 | 1186 | if(!g_bChangedFreezeTime && g_bVoteStarted && get_pcvar_num(g_pCvars[FREEZE_IN_VOTE]) && get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND])) 1187 | { 1188 | g_bChangedFreezeTime = true; 1189 | set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) + float(PRE_START_TIME + VOTE_TIME + 1)); 1190 | } 1191 | 1192 | #if defined FUNCTION_NIGHTMODE 1193 | if(g_bNightMode && g_bVoteFinished && (g_bNightModeOneMap && get_pcvar_num(g_pCvars[CHANGE_TYPE]) >= 1 || !g_bCurMapInNightMode)) 1194 | { 1195 | Intermission(); 1196 | new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName)); 1197 | client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXTMAP", szMapName); 1198 | return; 1199 | } 1200 | #endif 1201 | 1202 | #if defined FUNCTION_RTV 1203 | if(g_bVoteFinished && (g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[LAST_ROUND]))) 1204 | #else 1205 | if(g_bVoteFinished && (get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[LAST_ROUND]))) 1206 | #endif 1207 | { 1208 | Intermission(); 1209 | new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName)); 1210 | client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMapName); 1211 | } 1212 | } 1213 | public Event_TeamScore() 1214 | { 1215 | new team[2]; read_data(1, team, charsmax(team)); 1216 | g_iTeamScore[(team[0]=='C') ? 0 : 1] = read_data(2); 1217 | } 1218 | public Task_CheckTime() 1219 | { 1220 | if(g_bVoteStarted || g_bVoteFinished) return PLUGIN_CONTINUE; 1221 | 1222 | #if defined FUNCTION_NIGHTMODE 1223 | if(g_bNightMode && g_bNightModeOneMap) return PLUGIN_CONTINUE; 1224 | #endif 1225 | 1226 | if(get_pcvar_float(g_pCvars[TIMELIMIT]) <= 0.0) return PLUGIN_CONTINUE; 1227 | 1228 | new Float:fTimeToVote = get_pcvar_float(g_pCvars[START_VOTE_BEFORE_END]); 1229 | 1230 | new iTimeLeft = get_timeleft(); 1231 | if(iTimeLeft <= floatround(fTimeToVote * 60.0)) 1232 | { 1233 | if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND])) 1234 | { 1235 | log_amx("StartVote: timeleft %d", iTimeLeft); 1236 | StartVote(0); 1237 | } 1238 | else 1239 | { 1240 | SetNewRoundVote(); 1241 | } 1242 | } 1243 | 1244 | return PLUGIN_CONTINUE; 1245 | } 1246 | 1247 | #if defined FUNCTION_NIGHTMODE 1248 | public Task_CheckNight() 1249 | { 1250 | new szTime[16]; get_pcvar_string(g_pCvars[NIGHTMODE_TIME], szTime, charsmax(szTime)); 1251 | new szStart[8], szEnd[8]; parse(szTime, szStart, charsmax(szStart), szEnd, charsmax(szEnd)); 1252 | new iStartHour, iStartMinutes, iEndHour, iEndMinutes; 1253 | get_int_time(szStart, iStartHour, iStartMinutes); 1254 | get_int_time(szEnd, iEndHour, iEndMinutes); 1255 | 1256 | new iCurHour, iCurMinutes; time(iCurHour, iCurMinutes); 1257 | 1258 | new bOldNightMode = g_bNightMode; 1259 | 1260 | if(iStartHour != iEndHour && (iStartHour == iCurHour && iCurMinutes >= iStartMinutes || iEndHour == iCurHour && iCurMinutes < iEndMinutes)) 1261 | { 1262 | g_bNightMode = true; 1263 | } 1264 | else if(iStartHour == iEndHour && iStartMinutes <= iCurMinutes < iEndMinutes) 1265 | { 1266 | g_bNightMode = true; 1267 | } 1268 | else if(iStartHour > iEndHour && (iStartHour < iCurHour < 24 || 0 <= iCurHour < iEndHour)) 1269 | { 1270 | g_bNightMode = true; 1271 | } 1272 | else if(iStartHour < iCurHour < iEndHour) 1273 | { 1274 | g_bNightMode = true; 1275 | } 1276 | else 1277 | { 1278 | g_bNightMode = false; 1279 | } 1280 | 1281 | if(g_bNightMode && !bOldNightMode)// NightMode ON 1282 | { 1283 | if(g_bNightModeOneMap) 1284 | { 1285 | if(g_bCurMapInNightMode) 1286 | { 1287 | g_fOldNightTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]); 1288 | set_pcvar_float(g_pCvars[TIMELIMIT], 0.0); 1289 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_ON", iEndHour, iEndMinutes); 1290 | } 1291 | else 1292 | { 1293 | new szMapName[32]; ArrayGetString(g_aNightMaps, 0, szMapName, charsmax(szMapName)); 1294 | set_pcvar_string(g_pCvars[NEXTMAP], szMapName); 1295 | 1296 | if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0) 1297 | { 1298 | Intermission(); 1299 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL", szMapName); 1300 | } 1301 | else 1302 | { 1303 | g_bVoteFinished = true; 1304 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE", szMapName); 1305 | } 1306 | } 1307 | } 1308 | else if(!g_bCurMapInNightMode) 1309 | { 1310 | if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0) 1311 | { 1312 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL2"); 1313 | StartVote(0); 1314 | } 1315 | else 1316 | { 1317 | SetNewRoundVote(); 1318 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE2"); 1319 | } 1320 | } 1321 | } 1322 | else if(!g_bNightMode && bOldNightMode)// NightMode OFF 1323 | { 1324 | if(g_bNightModeOneMap) 1325 | { 1326 | set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit); 1327 | } 1328 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_OFF"); 1329 | } 1330 | } 1331 | #endif 1332 | SetNewRoundVote() 1333 | { 1334 | g_bStartVote = true; 1335 | g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]); 1336 | if(g_fOldTimeLimit > 0.0) 1337 | { 1338 | g_bNotUnlimitTime = true; 1339 | set_pcvar_float(g_pCvars[TIMELIMIT], 0.0); 1340 | } 1341 | } 1342 | public StartVote(id) 1343 | { 1344 | if(g_bVoteStarted) return 0; 1345 | 1346 | #if defined FUNCTION_NIGHTMODE 1347 | if(g_bNightModeOneMap && g_bNightMode) 1348 | { 1349 | return 0; 1350 | } 1351 | #endif 1352 | 1353 | g_bVoteStarted = true; 1354 | g_bStartVote = false; 1355 | 1356 | ResetInfo(); 1357 | CheckAllowExtendMap(); 1358 | 1359 | #if defined FUNCTION_NIGHTMODE 1360 | if(g_bNightMode) 1361 | { 1362 | new iNightSize = ArraySize(g_aNightMaps); 1363 | g_iMenuItemsCount = min(min(g_bCurMapInNightMode ? iNightSize - 1 : iNightSize, SELECT_MAPS), 8); 1364 | 1365 | for(new Item, iRandomMap, szMapName[32]; Item < g_iMenuItemsCount; Item++) 1366 | { 1367 | do 1368 | { 1369 | iRandomMap = random_num(0, iNightSize - 1); 1370 | ArrayGetString(g_aNightMaps, iRandomMap, szMapName, charsmax(szMapName)); 1371 | } 1372 | while(is_map_in_menu_by_string(szMapName) || equali(szMapName, g_szCurrentMap)); 1373 | 1374 | formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), szMapName); 1375 | } 1376 | 1377 | ForwardPreStartVote(); 1378 | return 0; 1379 | } 1380 | #endif 1381 | 1382 | new Array:aMaps = ArrayCreate(VOTEMENU_INFO), iCurrentSize = 0; 1383 | new eMenuInfo[VOTEMENU_INFO], eMapInfo[MAP_INFO], iGlobalSize = ArraySize(g_aMaps); 1384 | new iPlayersNum = get_players_num(); 1385 | 1386 | for(new i = 0; i < iGlobalSize; i++) 1387 | { 1388 | ArrayGetArray(g_aMaps, i, eMapInfo); 1389 | if(eMapInfo[m_MinPlayers] <= iPlayersNum <= eMapInfo[m_MaxPlayers] && !eMapInfo[m_BlockCount]) 1390 | { 1391 | formatex(eMenuInfo[v_MapName], charsmax(eMenuInfo[v_MapName]), eMapInfo[m_MapName]); 1392 | eMenuInfo[v_MapIndex] = i; iCurrentSize++; 1393 | ArrayPushArray(aMaps, eMenuInfo); 1394 | } 1395 | } 1396 | new Item = 0; 1397 | 1398 | #if defined FUNCTION_BLOCK_MAPS 1399 | new iMaxItems = min(min(SELECT_MAPS, iGlobalSize - g_iBlockedSize), 8); 1400 | #else 1401 | new iMaxItems = min(min(SELECT_MAPS, iGlobalSize), 8); 1402 | #endif 1403 | 1404 | #if defined FUNCTION_NOMINATION 1405 | new eNomInfo[NOMINATEDMAP_INFO]; 1406 | 1407 | if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE])) 1408 | { 1409 | for(new i; i < ArraySize(g_aNominatedMaps); i++) 1410 | { 1411 | ArrayGetArray(g_aNominatedMaps, i, eNomInfo); 1412 | ArrayGetArray(g_aMaps, eNomInfo[n_MapIndex], eMapInfo); 1413 | 1414 | if(iPlayersNum > eMapInfo[m_MaxPlayers] || iPlayersNum < eMapInfo[m_MinPlayers]) 1415 | { 1416 | ArrayDeleteItem(g_aNominatedMaps, i--); 1417 | } 1418 | } 1419 | } 1420 | 1421 | new iNomSize = ArraySize(g_aNominatedMaps); 1422 | g_iMenuItemsCount = min(min(iNomSize, NOMINATED_MAPS_IN_VOTE), iMaxItems); 1423 | 1424 | for(new iRandomMap; Item < g_iMenuItemsCount; Item++) 1425 | { 1426 | iRandomMap = random_num(0, ArraySize(g_aNominatedMaps) - 1); 1427 | ArrayGetArray(g_aNominatedMaps, iRandomMap, eNomInfo); 1428 | 1429 | formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eNomInfo[n_MapName]); 1430 | g_eMenuItems[Item][v_MapIndex] = eNomInfo[n_MapIndex]; 1431 | g_iNominatedMaps[eNomInfo[n_Player]]--; 1432 | 1433 | ArrayDeleteItem(g_aNominatedMaps, iRandomMap); 1434 | 1435 | new priority_index = is_map_in_priority(aMaps, eNomInfo[n_MapIndex]); 1436 | if(priority_index) 1437 | { 1438 | ArrayDeleteItem(aMaps, priority_index - 1); 1439 | } 1440 | } 1441 | #endif 1442 | 1443 | if(iCurrentSize && Item < iMaxItems) 1444 | { 1445 | g_iMenuItemsCount = max(min(iCurrentSize, iMaxItems), Item); 1446 | for(new iRandomMap; Item < g_iMenuItemsCount; Item++) 1447 | { 1448 | iRandomMap = random_num(0, ArraySize(aMaps) - 1); 1449 | ArrayGetArray(aMaps, iRandomMap, eMenuInfo); 1450 | 1451 | formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMenuInfo[v_MapName]); 1452 | g_eMenuItems[Item][v_MapIndex] = eMenuInfo[v_MapIndex]; 1453 | 1454 | ArrayDeleteItem(aMaps, iRandomMap); 1455 | } 1456 | } 1457 | 1458 | if(Item < iMaxItems) 1459 | { 1460 | g_iMenuItemsCount = min(iGlobalSize, iMaxItems); 1461 | for(new iRandomMap; Item < g_iMenuItemsCount; Item++) 1462 | { 1463 | do 1464 | { 1465 | iRandomMap = random_num(0, iGlobalSize - 1); 1466 | ArrayGetArray(g_aMaps, iRandomMap, eMapInfo); 1467 | } 1468 | while(is_map_in_menu(iRandomMap) || eMapInfo[m_BlockCount]); 1469 | 1470 | formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMapInfo[v_MapName]); 1471 | g_eMenuItems[Item][v_MapIndex] = iRandomMap; 1472 | } 1473 | } 1474 | 1475 | ArrayDestroy(aMaps); 1476 | 1477 | ForwardPreStartVote(); 1478 | 1479 | return 0; 1480 | } 1481 | CheckAllowExtendMap() 1482 | { 1483 | new bAllow = g_bNotUnlimitTime || get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (get_pcvar_num(g_pCvars[MAXROUNDS]) || get_pcvar_num(g_pCvars[WINLIMIT])); 1484 | 1485 | #if defined FUNCTION_RTV && defined FUNCTION_NIGHTMODE 1486 | if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && !g_bRockVote && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]) && (g_bNightMode && g_bCurMapInNightMode || !g_bNightMode)) 1487 | #else 1488 | #if defined FUNCTION_RTV 1489 | if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && !g_bRockVote && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX])) 1490 | #else 1491 | #if defined FUNCTION_NIGHTMODE 1492 | if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]) && (g_bNightMode && g_bCurMapInNightMode || !g_bNightMode)) 1493 | #else 1494 | if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX])) 1495 | #endif 1496 | #endif 1497 | #endif 1498 | { 1499 | g_bExtendMap = true; 1500 | } 1501 | else 1502 | { 1503 | g_bExtendMap = false; 1504 | } 1505 | 1506 | g_bNotUnlimitTime = false; 1507 | } 1508 | ResetInfo() 1509 | { 1510 | g_iTotalVotes = 0; 1511 | for(new i; i < sizeof(g_eMenuItems); i++) 1512 | { 1513 | g_eMenuItems[i][v_MapName] = ""; 1514 | g_eMenuItems[i][v_MapIndex] = -1; 1515 | g_eMenuItems[i][v_Votes] = 0; 1516 | } 1517 | arrayset(g_bPlayerVoted, false, 33); 1518 | } 1519 | ForwardPreStartVote() 1520 | { 1521 | if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE])) 1522 | { 1523 | SetBlackScreenFade(2); 1524 | set_task(1.0, "SetBlackScreenFade", 1); 1525 | } 1526 | 1527 | #if PRE_START_TIME > 0 1528 | g_iTimer = PRE_START_TIME; 1529 | ShowTimer(); 1530 | #else 1531 | ShowVoteMenu(); 1532 | #endif 1533 | 1534 | new iRet; 1535 | ExecuteForward(g_iForwardPreStartVote, iRet); 1536 | } 1537 | public ShowTimer() 1538 | { 1539 | if(g_iTimer > 0) 1540 | { 1541 | set_task(1.0, "ShowTimer", TASK_SHOWTIMER); 1542 | } 1543 | else 1544 | { 1545 | #if defined FUNCTION_SOUND 1546 | SendAudio(0, "sound/Gman/Gman_Choose2.wav", PITCH_NORM); 1547 | #endif 1548 | ShowVoteMenu(); 1549 | return; 1550 | } 1551 | new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec)); 1552 | new iPlayers[32], pNum; get_players(iPlayers, pNum, "ch"); 1553 | for(new id, i; i < pNum; i++) 1554 | { 1555 | id = iPlayers[i]; 1556 | set_hudmessage(50, 255, 50, -1.0, is_user_alive(id) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 4); 1557 | show_hudmessage(id, "%L %L!", LANG_PLAYER, "MAPM_HUD_TIMER", g_iTimer, LANG_PLAYER, szSec); 1558 | } 1559 | 1560 | #if defined FUNCTION_SOUND 1561 | if(g_iTimer <= 10) 1562 | { 1563 | for(new id, i; i < pNum; i++) 1564 | { 1565 | id = iPlayers[i]; 1566 | SendAudio(id, g_szSound[g_iTimer - 1], PITCH_NORM); 1567 | } 1568 | } 1569 | #endif 1570 | 1571 | g_iTimer--; 1572 | } 1573 | ShowVoteMenu() 1574 | { 1575 | g_iTimer = VOTE_TIME; 1576 | 1577 | set_task(1.0, "Task_Timer", TASK_TIMER, .flags = "a", .repeat = VOTE_TIME); 1578 | 1579 | new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch"); 1580 | for(new i = 0; i < pNum; i++) 1581 | { 1582 | iPlayer = Players[i]; 1583 | VoteMenu(iPlayer + TASK_VOTEMENU); 1584 | set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME); 1585 | } 1586 | new iRet; 1587 | ExecuteForward(g_iForwardStartVote, iRet); 1588 | } 1589 | public Task_Timer() 1590 | { 1591 | if(--g_iTimer == 0) 1592 | { 1593 | FinishVote(); 1594 | show_menu(0, 0, "^n", 1); 1595 | remove_task(TASK_TIMER); 1596 | } 1597 | } 1598 | public VoteMenu(id) 1599 | { 1600 | id -= TASK_VOTEMENU; 1601 | 1602 | if(g_iTimer == 0) 1603 | { 1604 | show_menu(id, 0, "^n", 1); remove_task(id+TASK_VOTEMENU); 1605 | return PLUGIN_HANDLED; 1606 | } 1607 | 1608 | static szMenu[512]; 1609 | new iKeys, iPercent, i, iLen; 1610 | 1611 | iLen = formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L:^n^n", LANG_PLAYER, g_bPlayerVoted[id] ? "MAPM_MENU_VOTE_RESULTS" : "MAPM_MENU_CHOOSE_MAP"); 1612 | 1613 | for(i = 0; i < g_iMenuItemsCount; i++) 1614 | { 1615 | iPercent = 0; 1616 | if(g_iTotalVotes) 1617 | { 1618 | iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes); 1619 | } 1620 | 1621 | if(!g_bPlayerVoted[id]) 1622 | { 1623 | iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_eMenuItems[i][v_MapName], iPercent); 1624 | iKeys |= (1 << i); 1625 | } 1626 | else 1627 | { 1628 | iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%s[\r%d%%\d]^n", g_eMenuItems[i][v_MapName], iPercent); 1629 | } 1630 | } 1631 | 1632 | if(g_bExtendMap) 1633 | { 1634 | iPercent = 0; 1635 | if(g_iTotalVotes) 1636 | { 1637 | iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes); 1638 | } 1639 | 1640 | if(!g_bPlayerVoted[id]) 1641 | { 1642 | iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%d.\w %s\d[\r%d%%\d]\y[%L]^n", i + 1, g_szCurrentMap, iPercent, LANG_PLAYER, "MAPM_MENU_EXTEND"); 1643 | iKeys |= (1 << i); 1644 | } 1645 | else 1646 | { 1647 | iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%s[\r%d%%\d]\y[%L]^n", g_szCurrentMap, iPercent, LANG_PLAYER, "MAPM_MENU_EXTEND"); 1648 | } 1649 | } 1650 | 1651 | new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec)); 1652 | iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%L \r%d\d %L", LANG_PLAYER, "MAPM_MENU_LEFT", g_iTimer, LANG_PLAYER, szSec); 1653 | 1654 | if(!iKeys) iKeys |= (1 << 9); 1655 | 1656 | if(g_bPlayerVoted[id] && get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE]) == 2) 1657 | { 1658 | while(replace(szMenu, charsmax(szMenu), "\r", "")){} 1659 | while(replace(szMenu, charsmax(szMenu), "\d", "")){} 1660 | while(replace(szMenu, charsmax(szMenu), "\w", "")){} 1661 | while(replace(szMenu, charsmax(szMenu), "\y", "")){} 1662 | 1663 | set_hudmessage(0, 55, 255, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4); 1664 | show_hudmessage(id, "%s", szMenu); 1665 | } 1666 | else 1667 | { 1668 | show_menu(id, iKeys, szMenu, -1, "VoteMenu"); 1669 | } 1670 | 1671 | return PLUGIN_HANDLED; 1672 | } 1673 | public VoteMenu_Handler(id, key) 1674 | { 1675 | if(g_bPlayerVoted[id]) 1676 | { 1677 | VoteMenu(id + TASK_VOTEMENU); 1678 | return PLUGIN_HANDLED; 1679 | } 1680 | 1681 | g_eMenuItems[key][v_Votes]++; 1682 | g_iTotalVotes++; 1683 | g_bPlayerVoted[id] = true; 1684 | 1685 | if(get_pcvar_num(g_pCvars[SHOW_SELECTS])) 1686 | { 1687 | new szName[32]; get_user_name(id, szName, charsmax(szName)); 1688 | if(key == g_iMenuItemsCount) 1689 | { 1690 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_EXTEND", szName); 1691 | } 1692 | else 1693 | { 1694 | client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_MAP", szName, g_eMenuItems[key][v_MapName]); 1695 | } 1696 | } 1697 | 1698 | if(get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE])) 1699 | { 1700 | VoteMenu(id + TASK_VOTEMENU); 1701 | } 1702 | else 1703 | { 1704 | remove_task(id + TASK_VOTEMENU); 1705 | } 1706 | 1707 | return PLUGIN_HANDLED; 1708 | } 1709 | FinishVote() 1710 | { 1711 | g_bVoteStarted = false; 1712 | g_bVoteFinished = true; 1713 | 1714 | if(g_bChangedFreezeTime) 1715 | { 1716 | set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1)); 1717 | g_bChangedFreezeTime = false; 1718 | } 1719 | if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE])) 1720 | { 1721 | SetBlackScreenFade(0); 1722 | } 1723 | 1724 | new iMaxVote = 0, iRandom; 1725 | for(new i = 1; i < g_iMenuItemsCount + 1; i++) 1726 | { 1727 | iRandom = random_num(0, 1); 1728 | switch(iRandom) 1729 | { 1730 | case 0: if(g_eMenuItems[iMaxVote][v_Votes] < g_eMenuItems[i][v_Votes]) iMaxVote = i; 1731 | case 1: if(g_eMenuItems[iMaxVote][v_Votes] <= g_eMenuItems[i][v_Votes]) iMaxVote = i; 1732 | } 1733 | } 1734 | 1735 | if(g_fOldTimeLimit > 0.0) 1736 | { 1737 | set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit); 1738 | g_fOldTimeLimit = 0.0; 1739 | } 1740 | 1741 | if(!g_iTotalVotes || (iMaxVote != g_iMenuItemsCount)) 1742 | { 1743 | if(g_iTotalVotes) 1744 | { 1745 | client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", g_eMenuItems[iMaxVote][v_MapName]); 1746 | } 1747 | else 1748 | { 1749 | iMaxVote = random_num(0, g_iMenuItemsCount - 1); 1750 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOBODY_VOTE", g_eMenuItems[iMaxVote][v_MapName]); 1751 | } 1752 | set_pcvar_string(g_pCvars[NEXTMAP], g_eMenuItems[iMaxVote][v_MapName]); 1753 | 1754 | if(get_pcvar_num(g_pCvars[LAST_ROUND])) 1755 | { 1756 | g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]); 1757 | set_pcvar_float(g_pCvars[TIMELIMIT], 0.0); 1758 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_LASTROUND"); 1759 | } 1760 | #if defined FUNCTION_RTV 1761 | else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 0 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0) 1762 | #else 1763 | else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0) 1764 | #endif 1765 | { 1766 | new iSec = get_pcvar_num(g_pCvars[CHATTIME]); 1767 | new szSec[16]; get_ending(iSec, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec)); 1768 | client_print_color(0, print_team_default, "%s^1 %L^1 %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_CHANGE", iSec, LANG_PLAYER, szSec); 1769 | Intermission(); 1770 | } 1771 | #if defined FUNCTION_RTV 1772 | else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1) 1773 | #else 1774 | else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1) 1775 | #endif 1776 | { 1777 | client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER,"MAPM_MAP_CHANGE_NEXTROUND"); 1778 | } 1779 | } 1780 | else 1781 | { 1782 | g_bVoteFinished = false; 1783 | g_iExtendedMax++; 1784 | 1785 | new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]); 1786 | new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]); 1787 | 1788 | #if defined FUNCTION_RTV 1789 | g_iRockVotes = 0; 1790 | g_bRockVote = false; 1791 | arrayset(g_bRockVoted, false, sizeof(g_bRockVoted)); 1792 | #endif 1793 | 1794 | if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (iWinLimit || iMaxRounds)) 1795 | { 1796 | new iRounds = get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]); 1797 | 1798 | if(iWinLimit > 0) 1799 | { 1800 | set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit + iRounds); 1801 | } 1802 | if(iMaxRounds > 0) 1803 | { 1804 | set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds + iRounds); 1805 | } 1806 | 1807 | new szRounds[16]; get_ending(iRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds)); 1808 | client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iRounds, LANG_PLAYER, szRounds); 1809 | } 1810 | else 1811 | { 1812 | new iMin = get_pcvar_num(g_pCvars[EXTENDED_TIME]); 1813 | new szMin[16]; get_ending(iMin, "MAPM_MINUTE1", "MAPM_MINUTE2", "MAPM_MINUTE3", szMin, charsmax(szMin)); 1814 | 1815 | client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iMin, LANG_PLAYER, szMin); 1816 | set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) + float(iMin)); 1817 | } 1818 | } 1819 | 1820 | new iRet; 1821 | ExecuteForward(g_iForwardFinishVote, iRet); 1822 | } 1823 | ///**************************/// 1824 | stock get_players_num() 1825 | { 1826 | new players[32], pnum; get_players(players, pnum, "ch"); 1827 | return pnum; 1828 | } 1829 | stock valid_map(map[]) 1830 | { 1831 | if(is_map_valid(map)) return true; 1832 | 1833 | new len = strlen(map) - 4; 1834 | 1835 | if(len < 0) return false; 1836 | 1837 | if(equali(map[len], ".bsp")) 1838 | { 1839 | map[len] = '^0'; 1840 | if(is_map_valid(map)) return true; 1841 | } 1842 | 1843 | return false; 1844 | } 1845 | is_map_in_array(map[]) 1846 | { 1847 | new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps); 1848 | for(new i; i < iSize; i++) 1849 | { 1850 | ArrayGetArray(g_aMaps, i, eMapInfo); 1851 | if(equali(map, eMapInfo[m_MapName])) 1852 | { 1853 | return i + 1; 1854 | } 1855 | } 1856 | return 0; 1857 | } 1858 | #if defined FUNCTION_BLOCK_MAPS 1859 | is_map_blocked(Array:array, map[]) 1860 | { 1861 | new eBlockedInfo[BLOCKEDMAP_INFO], iSize = ArraySize(array); 1862 | for(new i; i < iSize; i++) 1863 | { 1864 | ArrayGetArray(array, i, eBlockedInfo); 1865 | if(equali(map, eBlockedInfo[b_MapName])) 1866 | { 1867 | return i + 1; 1868 | } 1869 | } 1870 | return 0; 1871 | } 1872 | clear_blocked_maps() 1873 | { 1874 | new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps); 1875 | for(new i; i < iSize; i++) 1876 | { 1877 | ArrayGetArray(g_aMaps, i, eMapInfo); 1878 | if(eMapInfo[m_BlockCount]) 1879 | { 1880 | eMapInfo[m_BlockCount] = 0; 1881 | ArraySetArray(g_aMaps, i, eMapInfo); 1882 | } 1883 | } 1884 | g_iBlockedSize = 0; 1885 | } 1886 | #endif 1887 | is_map_in_menu(index) 1888 | { 1889 | for(new i; i < sizeof(g_eMenuItems); i++) 1890 | { 1891 | if(g_eMenuItems[i][v_MapIndex] == index) return true; 1892 | } 1893 | return false; 1894 | } 1895 | #if defined FUNCTION_NOMINATION 1896 | is_map_nominated(map_index) 1897 | { 1898 | new eNomInfo[NOMINATEDMAP_INFO], iSize = ArraySize(g_aNominatedMaps); 1899 | for(new i; i < iSize; i++) 1900 | { 1901 | ArrayGetArray(g_aNominatedMaps, i, eNomInfo); 1902 | if(map_index == eNomInfo[n_MapIndex]) 1903 | { 1904 | return i + 1; 1905 | } 1906 | } 1907 | return 0; 1908 | } 1909 | is_map_in_priority(Array:array, map_index) 1910 | { 1911 | new ePriorityInfo[VOTEMENU_INFO], iSize = ArraySize(array); 1912 | for(new i; i < iSize; i++) 1913 | { 1914 | ArrayGetArray(array, i, ePriorityInfo); 1915 | if(map_index == ePriorityInfo[v_MapIndex]) 1916 | { 1917 | return i + 1; 1918 | } 1919 | } 1920 | return 0; 1921 | } 1922 | clear_nominated_maps(id) 1923 | { 1924 | new eNomInfo[NOMINATEDMAP_INFO]; 1925 | for(new i = 0; i < ArraySize(g_aNominatedMaps); i++) 1926 | { 1927 | ArrayGetArray(g_aNominatedMaps, i, eNomInfo); 1928 | if(id == eNomInfo[n_Player]) 1929 | { 1930 | ArrayDeleteItem(g_aNominatedMaps, i--); 1931 | if(!--g_iNominatedMaps[id]) break; 1932 | } 1933 | } 1934 | } 1935 | is_prefix_in_array(prefix[]) 1936 | { 1937 | new string[32]; 1938 | for(new i; i < g_iMapPrefixesNum; i++) 1939 | { 1940 | ArrayGetString(g_aMapPrefixes, i, string, charsmax(string)); 1941 | if(equali(prefix, string)) 1942 | { 1943 | return true; 1944 | } 1945 | } 1946 | return false; 1947 | } 1948 | get_map_prefix(map[], prefix[], size) 1949 | { 1950 | new map_copy[32]; copy(map_copy, charsmax(map_copy), map); 1951 | for(new i; map_copy[i]; i++) 1952 | { 1953 | if(map_copy[i] == '_') 1954 | { 1955 | map_copy[i + 1] = 0; 1956 | copy(prefix, size, map_copy); 1957 | return 1; 1958 | } 1959 | } 1960 | return 0; 1961 | } 1962 | find_similar_map(map_index, string[32]) 1963 | { 1964 | new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps); 1965 | for(new i = map_index; i < iSize; i++) 1966 | { 1967 | ArrayGetArray(g_aMaps, i, eMapInfo); 1968 | if(containi(eMapInfo[m_MapName], string) != -1) 1969 | { 1970 | return i + 1; 1971 | } 1972 | } 1973 | return 0; 1974 | } 1975 | trim_bracket(text[]) 1976 | { 1977 | for(new i; text[i]; i++) 1978 | { 1979 | if(text[i] == '[') 1980 | { 1981 | text[i] = 0; 1982 | break; 1983 | } 1984 | } 1985 | } 1986 | string_with_space(string[]) 1987 | { 1988 | for(new i; string[i]; i++) 1989 | { 1990 | if(string[i] == ' ') return 1; 1991 | } 1992 | return 0; 1993 | } 1994 | #endif 1995 | #if defined FUNCTION_NIGHTMODE 1996 | is_map_in_night_array(map[]) 1997 | { 1998 | new szMapName[32], iMax = ArraySize(g_aNightMaps); 1999 | for(new i = 0; i < iMax; i++) 2000 | { 2001 | ArrayGetString(g_aNightMaps, i, szMapName, charsmax(szMapName)); 2002 | if(equali(szMapName, map)) 2003 | { 2004 | return i + 1; 2005 | } 2006 | } 2007 | return 0; 2008 | } 2009 | is_map_in_menu_by_string(map[]) 2010 | { 2011 | for(new i; i < sizeof(g_eMenuItems); i++) 2012 | { 2013 | if(equali(g_eMenuItems[i][v_MapName], map)) return true; 2014 | } 2015 | return false; 2016 | } 2017 | get_int_time(string[], &hour, &minutes) 2018 | { 2019 | new left[4], right[4]; strtok(string, left, charsmax(left), right, charsmax(right), ':'); 2020 | hour = str_to_num(left); 2021 | minutes = str_to_num(right); 2022 | } 2023 | #endif 2024 | stock get_ending(num, const a[], const b[], const c[], output[], lenght) 2025 | { 2026 | new num100 = num % 100, num10 = num % 10; 2027 | if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) formatex(output, lenght, "%s", a); 2028 | else if(num10 == 1) formatex(output, lenght, "%s", b); 2029 | else if(num10 >= 2 && num10 <= 4) formatex(output, lenght, "%s", c); 2030 | } 2031 | stock SendAudio(id, audio[], pitch) 2032 | { 2033 | static iMsgSendAudio; 2034 | if(!iMsgSendAudio) iMsgSendAudio = get_user_msgid("SendAudio"); 2035 | 2036 | message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iMsgSendAudio, _, id); 2037 | write_byte(id); 2038 | write_string(audio); 2039 | write_short(pitch); 2040 | message_end(); 2041 | } 2042 | stock Intermission() 2043 | { 2044 | emessage_begin(MSG_ALL, SVC_INTERMISSION); 2045 | emessage_end(); 2046 | } 2047 | public SetBlackScreenFade(fade) 2048 | { 2049 | new time, hold, flags; 2050 | static iMsgScreenFade; 2051 | if(!iMsgScreenFade) iMsgScreenFade = get_user_msgid("ScreenFade"); 2052 | 2053 | switch (fade) 2054 | { 2055 | case 1: { time = 1; hold = 1; flags = 4; } 2056 | case 2: { time = 4096; hold = 1024; flags = 1; } 2057 | default: { time = 4096; hold = 1024; flags = 2; } 2058 | } 2059 | 2060 | message_begin(MSG_BROADCAST, iMsgScreenFade); 2061 | write_short(time); 2062 | write_short(hold); 2063 | write_short(flags); 2064 | write_byte(0); 2065 | write_byte(0); 2066 | write_byte(0); 2067 | write_byte(255); 2068 | message_end(); 2069 | } 2070 | -------------------------------------------------------------------------------- /mapmanager.txt: -------------------------------------------------------------------------------- 1 | [en] 2 | MAPM_VOTE_WILL_BEGIN = The voting will begin in next round. 3 | MAPM_CANCEL_VOTE = %s^1 canceled voting. 4 | MAPM_TIME_TO_END = Until map end left 5 | MAPM_TIMELEFT_OR = or 6 | MAPM_NO_TIMELIMIT = Map has no time limit. 7 | MAPM_THETIME = Current time^1:^4 %s^1. 8 | MAPM_NEXTMAP = Next map: 9 | MAPM_NOT_SELECTED = not selected 10 | MAPM_CURRENT_MAP = Current map:^3 %s^1. 11 | MAPM_NIGHT_NOT_AVAILABLE = Unavailable during^4 night mode^1. 12 | MAPM_NIGHT_BLOCK_CMD = This command is not available in night mode! 13 | MAPM_RTV_DELAY = You cant vote for rtv. Left:^3 %d:%02d^1. 14 | MAPM_RTV_VOTED = %s^1 has voted to change map. Left:^3 %d^1 15 | MAPM_RTV_START_VOTE = Starting early voting for next map. 16 | MAPM_START_VOTE_NEW_ROUND = Voting will start in next round. 17 | MAPM_RTV_ALREADY_VOTED = You have already rocked the vote. Left:^3 %d^1 18 | MAPM_NOM_NOT_AVAILABLE_MAP = This map is not available for nomination. 19 | MAPM_NOM_REMOVE_NOM = %s^1 has denominated map^3 %s^1. 20 | MAPM_NOM_SPAM = Don't spam with removing a nomination. 21 | MAPM_NOM_ALREADY_NOM = This map is already nominated. 22 | MAPM_NOM_CANT_NOM = You can't nominate any more maps. 23 | MAPM_NOM_MAP = %s^1 nominated^3 %s^1. 24 | MAPM_NOM_MAP2 = %s^1 nominated^3 %s^1 for %d-%d players. 25 | MAPM_MENU_FAST_NOM = Found some maps: 26 | MAPM_MENU_MAP_LIST = Maps list 27 | MAPM_MENU_BACK = Back 28 | MAPM_MENU_NEXT = Next 29 | MAPM_MENU_EXIT = Exit 30 | MAPM_NIGHT_NEXTMAP = Night Mode^1. Next map:^3 %s^1. 31 | MAPM_NIGHT_ON = Night mode is activated until^3 %02d:%02d^1. 32 | MAPM_NIGHT_CHANGELEVEL = Changing level to^4 night map^1:^3 %s. 33 | MAPM_NIGHT_NEXT_ROUND_CHANGE = Changing level to^4 night map^1 in next round^1:^3 %s. 34 | MAPM_NIGHT_CHANGELEVEL2 = Changing level to^4 night maps^1. 35 | MAPM_NIGHT_NEXT_ROUND_CHANGE2 = Starting ^4night maps^1 in next round. 36 | MAPM_NIGHT_OFF = ^4Night mode^1 is deactivated. Night mode is deactivated. 37 | MAPM_HUD_TIMER = Voting will begin in %d 38 | MAPM_MENU_VOTE_RESULTS = Voting result 39 | MAPM_MENU_CHOOSE_MAP = Choose map 40 | MAPM_MENU_EXTEND = Extend 41 | MAPM_MENU_LEFT = Left 42 | MAPM_CHOSE_EXTEND = %s^1 has chosen to extend the current map. 43 | MAPM_CHOSE_MAP = %s^1 has chosen^3 %s^1. 44 | MAPM_NOBODY_VOTE = Nobody voted. Next map is^3 %s^1. 45 | MAPM_LASTROUND = Last round. 46 | MAPM_MAP_CHANGE = Map will change in^3 %d 47 | MAPM_MAP_CHANGE_NEXTROUND = Map change will happen after this round. 48 | MAPM_MAP_EXTEND = Current map has been extended to^3 %d^1 49 | MAPM_VOTE1 = votes 50 | MAPM_VOTE2 = votes 51 | MAPM_VOTE3 = votes 52 | MAPM_SECOND1 = seconds 53 | MAPM_SECOND2 = seconds 54 | MAPM_SECOND3 = seconds 55 | MAPM_MINUTE1 = minutes 56 | MAPM_MINUTE2 = minutes 57 | MAPM_MINUTE3 = minutes 58 | MAPM_ROUND1 = rounds 59 | MAPM_ROUND2 = rounds 60 | MAPM_ROUND3 = rounds 61 | MAPM_WIN1 = wins 62 | MAPM_WIN2 = wins 63 | MAPM_WIN3 = wins 64 | 65 | [ru] 66 | MAPM_VOTE_WILL_BEGIN = Голосование начнется в следующем раунде. 67 | MAPM_CANCEL_VOTE = %s^1 отменил голосование. 68 | MAPM_TIME_TO_END = До конца карты осталось 69 | MAPM_TIMELEFT_OR = либо 70 | MAPM_NO_TIMELIMIT = Карта не ограничена по времени. 71 | MAPM_THETIME = Текущее время^1:^4 %s^1. 72 | MAPM_NEXTMAP = Следующая карта: 73 | MAPM_NOT_SELECTED = ещё не выбрана 74 | MAPM_CURRENT_MAP = Текущая карта:^3 %s^1. 75 | MAPM_NIGHT_NOT_AVAILABLE = Недоступно в^4 ночном режиме^1. 76 | MAPM_NIGHT_BLOCK_CMD = Команда недоступна в ночном режиме! 77 | MAPM_RTV_DELAY = Вы не можете голосовать за досрочную смену карты. Осталось:^3 %d:%02d^1. 78 | MAPM_RTV_VOTED = %s^1 проголосовал за смену карты. Осталось:^3 %d^1 79 | MAPM_RTV_START_VOTE = Начинаем досрочное голосование. 80 | MAPM_START_VOTE_NEW_ROUND = Голосование начнется в следующем раунде. 81 | MAPM_RTV_ALREADY_VOTED = Вы уже голосовали. Осталось:^3 %d^1 82 | MAPM_NOM_NOT_AVAILABLE_MAP = Эта карта недоступна для номинации. 83 | MAPM_NOM_REMOVE_NOM = %s^1 убрал номинацию с карты^3 %s^1. 84 | MAPM_NOM_SPAM = Прекратите злоупотреблять отменой номинации. 85 | MAPM_NOM_ALREADY_NOM = Эта карта уже номинирована. 86 | MAPM_NOM_CANT_NOM = Вы не можете больше номинировать карты. 87 | MAPM_NOM_MAP = %s^1 номинировал на голосование^3 %s^1. 88 | MAPM_NOM_MAP2 = %s^1 номинировал на голосование^3 %s^1 для %d-%d игроков. 89 | MAPM_MENU_FAST_NOM = Найдено несколько карт: 90 | MAPM_MENU_MAP_LIST = Список карт 91 | MAPM_MENU_BACK = Назад 92 | MAPM_MENU_NEXT = Далее 93 | MAPM_MENU_EXIT = Выход 94 | MAPM_NIGHT_NEXTMAP = Ночной режим^1. Следующая карта:^3 %s^1. 95 | MAPM_NIGHT_ON = Включен ночной режим до^3 %02d:%02d^1. 96 | MAPM_NIGHT_CHANGELEVEL = Переход на^4 ночную карту^1:^3 %s. 97 | MAPM_NIGHT_NEXT_ROUND_CHANGE = В следующем раунде переход на^4 ночную карту^1:^3 %s. 98 | MAPM_NIGHT_CHANGELEVEL2 = Переход на^4 ночные карты^1. 99 | MAPM_NIGHT_NEXT_ROUND_CHANGE2 = В следующем раунде переход на^4 ночные карты^1. 100 | MAPM_NIGHT_OFF = Выключен^4 ночной режим^1. 101 | MAPM_HUD_TIMER = До голосования осталось %d 102 | MAPM_MENU_VOTE_RESULTS = Результаты голосования 103 | MAPM_MENU_CHOOSE_MAP = Выберите карту 104 | MAPM_MENU_EXTEND = Продлить 105 | MAPM_MENU_LEFT = Осталось 106 | MAPM_CHOSE_EXTEND = %s^1 выбрал продление карты. 107 | MAPM_CHOSE_MAP = %s^1 выбрал^3 %s^1. 108 | MAPM_NOBODY_VOTE = Никто не голосовал. Следующей будет^3 %s^1. 109 | MAPM_LASTROUND = Это последний раунд. 110 | MAPM_MAP_CHANGE = Карта сменится через^3 %d 111 | MAPM_MAP_CHANGE_NEXTROUND = Карта сменится в следующем раунде. 112 | MAPM_MAP_EXTEND = Текущая карта продлена на^3 %d^1 113 | MAPM_VOTE1 = голосов 114 | MAPM_VOTE2 = голос 115 | MAPM_VOTE3 = голоса 116 | MAPM_SECOND1 = секунд 117 | MAPM_SECOND2 = секунда 118 | MAPM_SECOND3 = секунды 119 | MAPM_MINUTE1 = минут 120 | MAPM_MINUTE2 = минута 121 | MAPM_MINUTE3 = минуты 122 | MAPM_ROUND1 = раундов 123 | MAPM_ROUND2 = раунд 124 | MAPM_ROUND3 = раунда 125 | MAPM_WIN1 = побед 126 | MAPM_WIN2 = победа 127 | MAPM_WIN3 = победы 128 | -------------------------------------------------------------------------------- /mapmanager_subplugin.sma: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #define PLUGIN "Map Manager: Sub Plugin" 6 | #define VERSION "0.1" 7 | #define AUTHOR "Mistrick" 8 | 9 | #pragma semicolon 1 10 | 11 | forward mapmanager_prestartvote(); 12 | forward mapmanager_finishvote(); 13 | 14 | new HamHook:g_iHamSpawn, g_pFreezeInVote, g_pStartVoteInNewRound; 15 | 16 | public plugin_init() 17 | { 18 | register_plugin(PLUGIN, VERSION, AUTHOR); 19 | DisableHamForward(g_iHamSpawn = RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1)); 20 | g_pFreezeInVote = get_cvar_pointer("mapm_freeze_in_vote"); 21 | g_pStartVoteInNewRound = get_cvar_pointer("mapm_start_vote_in_new_round"); 22 | } 23 | public mapmanager_prestartvote() 24 | { 25 | if(get_pcvar_num(g_pFreezeInVote) && !get_pcvar_num(g_pStartVoteInNewRound)) 26 | { 27 | EnableHamForward(g_iHamSpawn); 28 | new players[32], pnum; get_players(players, pnum, "a"); 29 | for(new id, i; i < pnum; i++) 30 | { 31 | id = players[i]; 32 | set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN); 33 | } 34 | } 35 | } 36 | public mapmanager_finishvote() 37 | { 38 | if(get_pcvar_num(g_pFreezeInVote) && !get_pcvar_num(g_pStartVoteInNewRound)) 39 | { 40 | DisableHamForward(g_iHamSpawn); 41 | new players[32], pnum; get_players(players, pnum, "a"); 42 | for(new id, i; i < pnum; i++) 43 | { 44 | id = players[i]; 45 | set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_FROZEN); 46 | } 47 | } 48 | } 49 | public Ham_PlayerSpawn_Post(id) 50 | { 51 | if(is_user_alive(id)) 52 | { 53 | set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN); 54 | } 55 | } --------------------------------------------------------------------------------