Map Manager - Помощ за евентуална промяна в кода...

Въпроси и проблеми свързани с AMXModX.
Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 771
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от Siska » 29 Мар 2021, 14:28

Здравейте хора :)
Искам да попитам дали ще е възможна малка промяна в този плъгин. При смяна на карта имаме звуково отброяване от 10 до 1 или както е настроено. Опитвам на мястото на единия "wav" файл да сложа мелодия, но мелодията прекъсва веднага щом започне. Дали може да се промени така , че да се чува цялата мелодия , докато не свърши. Или дали е възможно да се вмъкне такава функция , която да пуска мелодия при излизане на вота ? Тоест , докато гласуваме да се чува мелодията ?

Става въпрос за ред 152 и 153 , където е вписано отброяването :

Код за потвърждение: Избери целия код

#include <amxmodx>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif

#define PLUGIN "Map Manager"
#define VERSION "2.5.61"
#define AUTHOR "Mistrick"

#pragma semicolon 1

///******** Settings ********///

#define FUNCTION_NEXTMAP //replace default nextmap
#define FUNCTION_RTV
#define FUNCTION_NOMINATION
//#define FUNCTION_NIGHTMODE
#define FUNCTION_NIGHTMODE_BLOCK_CMDS
#define FUNCTION_BLOCK_MAPS
#define FUNCTION_SOUND

#define SELECT_MAPS 5
#define PRE_START_TIME 5
#define VOTE_TIME 10

#define NOMINATED_MAPS_IN_VOTE 3
#define NOMINATED_MAPS_PER_PLAYER 3

#define BLOCK_MAP_COUNT 5

#define MIN_DENOMINATE_TIME 3

new const PREFIX[] = "^4[CS:GO Remake]";

///**************************///

#if BLOCK_MAP_COUNT <= 1
	#undef FUNCTION_BLOCK_MAPS
#endif

enum (+=100)
{
	TASK_CHECKTIME = 100,
	TASK_SHOWTIMER,
	TASK_TIMER,
	TASK_VOTEMENU,
	TASK_CHANGETODEFAULT,
	TASK_CHECKNIGHT
};

enum _:MAP_INFO
{
	m_MapName[32],
	m_MinPlayers,
	m_MaxPlayers,
	m_BlockCount
};
enum _:VOTEMENU_INFO
{
	v_MapName[32],
	v_MapIndex,
	v_Votes
};
enum _:NOMINATEDMAP_INFO
{
	n_MapName[32],
	n_Player,
	n_MapIndex
};
enum _:BLOCKEDMAP_INFO
{
	b_MapName[32],
	b_Count
};

new Array: g_aMaps;

enum _:CVARS
{
	CHANGE_TYPE,
	START_VOTE_BEFORE_END,
	SHOW_RESULT_TYPE,
	SHOW_SELECTS,
	START_VOTE_IN_NEW_ROUND,
	FREEZE_IN_VOTE,
	BLACK_SCREEN_IN_VOTE,
	LAST_ROUND,
	CHANGE_TO_DEDAULT,
	DEFAULT_MAP,
	EXTENDED_TYPE,
	EXTENDED_MAX,
	EXTENDED_TIME,
	EXTENDED_ROUNDS,
#if defined FUNCTION_RTV
	ROCK_MODE,
	ROCK_PERCENT,
	ROCK_PLAYERS,
	ROCK_CHANGE_TYPE,
	ROCK_DELAY,
#endif
#if defined FUNCTION_NOMINATION
	NOMINATION_DONT_CLOSE_MENU,
	NOMINATION_DEL_NON_CUR_ONLINE,
#endif
#if defined FUNCTION_NIGHTMODE
	NIGHTMODE_TIME,
#endif
	MAXROUNDS,
	WINLIMIT,
	TIMELIMIT,
	FREEZETIME,
	CHATTIME,
	NEXTMAP,
	ROUNDTIME
};

new const FILE_MAPS[] = "maps.ini";//configdir

#if defined FUNCTION_BLOCK_MAPS
new const FILE_BLOCKEDMAPS[] = "blockedmaps.ini";//datadir
#endif

#if defined FUNCTION_NIGHTMODE
new const FILE_NIGHTMAPS[] = "nightmaps.ini";//configdir
#endif

new g_pCvars[CVARS];
new g_iTeamScore[2];
new g_szCurrentMap[32];
new g_bVoteStarted;
new g_bVoteFinished;
new g_bNotUnlimitTime;

new g_eMenuItems[SELECT_MAPS + 1][VOTEMENU_INFO];
new g_iMenuItemsCount;
new g_iTotalVotes;
new g_iTimer;
new g_bPlayerVoted[33];
new g_iExtendedMax;
new g_bExtendMap;
new g_bStartVote;
new g_bChangedFreezeTime;
new Float:g_fOldTimeLimit;
new g_iForwardPreStartVote;
new g_iForwardStartVote;
new g_iForwardFinishVote;

#if defined FUNCTION_SOUND
new const g_szSound[][] =
{
	"sound/fvox/one.wav", "sound/fvox/two.wav", "sound/fvox/three.wav", "sound/fvox/four.wav", "sound/fvox/five.wav",
	"sound/fvox/six.wav", "sound/fvox/seven.wav", "sound/fvox/eight.wav", "sound/fvox/nine.wav", "sound/fvox/ten.wav"
};
#endif

#if defined FUNCTION_RTV
new g_bRockVoted[33];
new g_iRockVotes;
new g_bRockVote;
#endif

#if defined FUNCTION_NOMINATION
new Array:g_aNominatedMaps;
new g_iNominatedMaps[33];
new g_iLastDenominate[33];
new Array:g_aMapPrefixes;
new g_iMapPrefixesNum;
#endif

#if defined FUNCTION_BLOCK_MAPS
new g_iBlockedSize;
#endif

#if defined FUNCTION_NIGHTMODE
new Array:g_aNightMaps;
new g_bNightMode;
new g_bNightModeOneMap;
new g_bCurMapInNightMode;
new Float:g_fOldNightTimeLimit;

#if defined FUNCTION_NIGHTMODE_BLOCK_CMDS
new g_szBlockedCmds[][] = 
{
	"amx_map", "amx_votemap", "amx_mapmenu", "amx_votemapmenu"
};
#endif
#endif

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR);
	
	register_cvar("mapm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
	
	g_pCvars[CHANGE_TYPE] = register_cvar("mapm_change_type", "2");//0 - after end vote, 1 - in round end, 2 - after end map
	g_pCvars[START_VOTE_BEFORE_END] = register_cvar("mapm_start_vote_before_end", "2");//minutes
	g_pCvars[SHOW_RESULT_TYPE] = register_cvar("mapm_show_result_type", "1");//0 - disable, 1 - menu, 2 - hud
	g_pCvars[SHOW_SELECTS] = register_cvar("mapm_show_selects", "1");//0 - disable, 1 - all
	g_pCvars[START_VOTE_IN_NEW_ROUND] = register_cvar("mapm_start_vote_in_new_round", "0");//0 - disable, 1 - enable
	g_pCvars[FREEZE_IN_VOTE] = register_cvar("mapm_freeze_in_vote", "0");//0 - disable, 1 - enable, if mapm_start_vote_in_new_round 1
	g_pCvars[BLACK_SCREEN_IN_VOTE] = register_cvar("mapm_black_screen_in_vote", "0");//0 - disable, 1 - enable
	g_pCvars[LAST_ROUND] = register_cvar("mapm_last_round", "0");//0 - disable, 1 - enable
	
	g_pCvars[CHANGE_TO_DEDAULT] = register_cvar("mapm_change_to_default_map", "0");//minutes, 0 - disable
	g_pCvars[DEFAULT_MAP] = register_cvar("mapm_default_map", "de_dust2");
	
	g_pCvars[EXTENDED_TYPE] = register_cvar("mapm_extended_type", "0");//0 - minutes, 1 - rounds
	g_pCvars[EXTENDED_MAX] = register_cvar("mapm_extended_map_max", "3");
	g_pCvars[EXTENDED_TIME] = register_cvar("mapm_extended_time", "15");//minutes
	g_pCvars[EXTENDED_ROUNDS] = register_cvar("mapm_extended_rounds", "3");//rounds
	
	#if defined FUNCTION_RTV
	g_pCvars[ROCK_MODE] = register_cvar("mapm_rtv_mode", "0");//0 - percents, 1 - players
	g_pCvars[ROCK_PERCENT] = register_cvar("mapm_rtv_percent", "60");
	g_pCvars[ROCK_PLAYERS] = register_cvar("mapm_rtv_players", "5");
	g_pCvars[ROCK_CHANGE_TYPE] = register_cvar("mapm_rtv_change_type", "1");//0 - after vote, 1 - in round end
	g_pCvars[ROCK_DELAY] = register_cvar("mapm_rtv_delay", "0");//minutes
	#endif
	
	#if defined FUNCTION_NOMINATION
	g_pCvars[NOMINATION_DONT_CLOSE_MENU] = register_cvar("mapm_nom_dont_close_menu", "0");//0 - disable, 1 - enable
	g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE] = register_cvar("mapm_nom_del_noncur_online", "0");//0 - disable, 1 - enable
	#endif
	
	#if defined FUNCTION_NIGHTMODE
	g_pCvars[NIGHTMODE_TIME] = register_cvar("mapm_night_time", "00:00 8:00");
	#endif
	
	g_pCvars[MAXROUNDS] = get_cvar_pointer("mp_maxrounds");
	g_pCvars[WINLIMIT] = get_cvar_pointer("mp_winlimit");
	g_pCvars[TIMELIMIT] = get_cvar_pointer("mp_timelimit");
	g_pCvars[FREEZETIME] = get_cvar_pointer("mp_freezetime");
	g_pCvars[ROUNDTIME] = get_cvar_pointer("mp_roundtime");
	
	g_pCvars[NEXTMAP] = register_cvar("amx_nextmap", "", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY);
	
	#if defined FUNCTION_NEXTMAP
	g_pCvars[CHATTIME] = get_cvar_pointer("mp_chattime");
	#endif
	
	register_event("TeamScore", "Event_TeamScore", "a");
	register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
	
	#if defined FUNCTION_NEXTMAP
	register_event("30", "Event_Intermisson", "a");
	#endif
	
	register_concmd("mapm_debug", "Commang_Debug", ADMIN_MAP);
	register_concmd("mapm_startvote", "Command_StartVote", ADMIN_MAP);
	register_concmd("mapm_stopvote", "Command_StopVote", ADMIN_MAP);
	register_clcmd("say timeleft", "Command_Timeleft");
	register_clcmd("say thetime", "Command_TheTime");
	register_clcmd("votemap", "Command_Votemap");
	
	#if defined FUNCTION_NEXTMAP
	register_clcmd("say nextmap", "Command_Nextmap");
	register_clcmd("say currentmap", "Command_CurrentMap");
	#endif
	
	#if defined FUNCTION_RTV
	register_clcmd("say rtv", "Command_RockTheVote");
	register_clcmd("say /rtv", "Command_RockTheVote");
	#endif
	
	#if defined FUNCTION_NOMINATION
	register_clcmd("say", "Command_Say");
	register_clcmd("say_team", "Command_Say");
	register_clcmd("say maps", "Command_MapsList");
	register_clcmd("say /maps", "Command_MapsList");
	#endif
	
	#if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS
	for(new i; i < sizeof(g_szBlockedCmds); i++)
	{
		register_clcmd(g_szBlockedCmds[i], "Command_BlockedCmds");
	}
	#endif
	
	g_iForwardPreStartVote = CreateMultiForward("mapmanager_prestartvote", ET_IGNORE);
	g_iForwardStartVote = CreateMultiForward("mapmanager_startvote", ET_IGNORE);
	g_iForwardFinishVote = CreateMultiForward("mapmanager_finishvote", ET_IGNORE);
	
	register_menucmd(register_menuid("VoteMenu"), 1023, "VoteMenu_Handler");
	
	set_task(10.0, "Task_CheckTime", TASK_CHECKTIME, .flags = "b");
	
	#if defined FUNCTION_NIGHTMODE
	set_task(60.0, "Task_CheckNight", TASK_CHECKNIGHT, .flags = "b");
	#endif
}

#if defined FUNCTION_NIGHTMODE
public plugin_natives()
{
	register_native("is_night_mode", "Native_IsNightMode");
}
public Native_IsNightMode()
{
	return g_bNightMode;
}
#endif

#if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS
public Command_BlockedCmds(id)
{
	if(g_bNightMode)
	{
		console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD");
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
#endif
public Command_Votemap(id)
{
	return PLUGIN_HANDLED;
}
public Commang_Debug(id, flag)
{
	if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
	
	console_print(id, "^nLoaded maps:");	
	new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		console_print(id, "%3d %32s ^t%d^t%d^t%d", i, eMapInfo[m_MapName], eMapInfo[m_MinPlayers], eMapInfo[m_MaxPlayers], eMapInfo[m_BlockCount]);
	}
	
	#if defined FUNCTION_NOMINATION
	new szPrefix[32];
	console_print(id, "^nLoaded prefixes:");
	for(new i; i < g_iMapPrefixesNum; i++)
	{
		ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix));
		console_print(id, "%s", szPrefix);
	}
	#endif
	
	return PLUGIN_HANDLED;
}
public Command_StartVote(id, flag)
{
	if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode && g_bNightModeOneMap)
	{
		console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD");
		return PLUGIN_HANDLED;
	}
	#endif
	
	if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0)
	{
		StartVote(id);
	}
	else
	{
		SetNewRoundVote();
		client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_VOTE_WILL_BEGIN");
	}
	
	return PLUGIN_HANDLED;
}
public Command_StopVote(id, flag)
{
	if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
	
	if(g_bVoteStarted)
	{		
		g_bVoteStarted = false;
		
		#if defined FUNCTION_RTV
		g_bRockVote = false;
		g_iRockVotes = 0;
		arrayset(g_bRockVoted, false, 33);
		#endif
		
		if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
		{
			SetBlackScreenFade(0);
		}
		
		if(g_bChangedFreezeTime)
		{
			set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
			g_bChangedFreezeTime = false;
		}
		
		remove_task(TASK_VOTEMENU);
		remove_task(TASK_SHOWTIMER);
		remove_task(TASK_TIMER);
		
		for(new i = 1; i <= 32; i++)
			remove_task(TASK_VOTEMENU + i);
		
		show_menu(0, 0, "^n", 1);
		new szName[32];
		
		if(id) get_user_name(id, szName, charsmax(szName));
		else szName = "Server";
		
		client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CANCEL_VOTE", szName);
		log_amx("%s canceled vote.", szName);
	}
	
	return PLUGIN_HANDLED;
}
public Command_Timeleft(id)
{
	new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
	new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
	
	if((iWinLimit || iMaxRounds) && get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1)
	{
		new szText[128], len;
		len = formatex(szText, charsmax(szText), "%L ", LANG_PLAYER, "MAPM_TIME_TO_END");
		if(iWinLimit)
		{
			new iLeftWins = iWinLimit - max(g_iTeamScore[0], g_iTeamScore[1]);
			new szWins[16]; get_ending(iLeftWins, "MAPM_WIN1", "MAPM_WIN2", "MAPM_WIN3", szWins, charsmax(szWins));
			len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftWins, LANG_PLAYER, szWins);
		}
		if(iWinLimit && iMaxRounds)
		{
			len += formatex(szText[len], charsmax(szText) - len, " %L ", LANG_PLAYER, "MAPM_TIMELEFT_OR");
		}
		if(iMaxRounds)
		{
			new iLeftRounds = iMaxRounds - g_iTeamScore[0] - g_iTeamScore[1];
			new szRounds[16]; get_ending(iLeftRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds));
			len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftRounds, LANG_PLAYER, szRounds);
		}
		client_print_color(0, print_team_default, "%s^1 %s.", PREFIX, szText);
	}
	else
	{
		if (get_pcvar_num(g_pCvars[TIMELIMIT]))
		{
			new a = get_timeleft();
			client_print_color(0, id, "%s^1 %L:^3 %d:%02d", PREFIX, LANG_PLAYER, "MAPM_TIME_TO_END", (a / 60), (a % 60));
		}
		else
		{
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NO_TIMELIMIT");
		}
	}
}
public Command_TheTime(id)
{
	new szTime[64]; get_time("%Y/%m/%d - %H:%M:%S", szTime, charsmax(szTime));
	client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_THETIME", szTime);
}

#if defined FUNCTION_NEXTMAP
public Command_Nextmap(id)
{
	if(g_bVoteFinished)
	{
		new szMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMap, charsmax(szMap));
		client_print_color(0, id, "%s^1 %L ^3%s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMap);
	}
	else
	{
		client_print_color(0, id, "%s^1 %L ^3%L^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", LANG_PLAYER, "MAPM_NOT_SELECTED");
	}
}
public Command_CurrentMap(id)
{
	client_print_color(0, id, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_CURRENT_MAP", g_szCurrentMap);
}
#endif

#if defined FUNCTION_RTV
public Command_RockTheVote(id)
{
	if(g_bVoteFinished || g_bVoteStarted || g_bStartVote) return PLUGIN_HANDLED;
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode && g_bNightModeOneMap)
	{
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE");
		return PLUGIN_HANDLED;
	}
	#endif
	
	new iTime = get_pcvar_num(g_pCvars[ROCK_DELAY]) * 60 - (floatround(get_pcvar_float(g_pCvars[TIMELIMIT]) * 60.0) - get_timeleft());
	if(iTime > 0)
	{
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_DELAY", iTime / 60, iTime % 60);
		return PLUGIN_HANDLED;
	}
	
	if(!g_bRockVoted[id]) g_iRockVotes++;
	
	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;
	
	if(iVotes <= 0)
	{
		g_bRockVote = true;
		if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
		{
			StartVote(0);
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_START_VOTE");
		}
		else
		{
			SetNewRoundVote();
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_START_VOTE_NEW_ROUND");
		}
		return PLUGIN_HANDLED;
	}
	
	new szVote[16];	get_ending(iVotes, "MAPM_VOTE1", "MAPM_VOTE2", "MAPM_VOTE3", szVote, charsmax(szVote));
	
	if(!g_bRockVoted[id])
	{
		g_bRockVoted[id] = true;		
		
		new szName[33];	get_user_name(id, szName, charsmax(szName));
		client_print_color(0, print_team_default, "%s^3 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_VOTED", szName, iVotes, LANG_PLAYER, szVote);
	}
	else
	{
		client_print_color(id, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_ALREADY_VOTED", iVotes, LANG_PLAYER, szVote);
	}
	
	return PLUGIN_HANDLED;
}
#endif

#if defined FUNCTION_NOMINATION
public Command_Say(id)
{
	if(g_bVoteStarted || g_bVoteFinished) return;
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode) return;
	#endif
	
	new szText[32]; read_args(szText, charsmax(szText));
	remove_quotes(szText); trim(szText); strtolower(szText);
	
	if(string_with_space(szText)) return;
	
	new map_index = is_map_in_array(szText);
	
	if(map_index)
	{
		NominateMap(id, szText, map_index - 1);
	}
	else if(strlen(szText) >= 4)
	{
		new szFormat[32], szPrefix[32], Array:aNominateList = ArrayCreate(), iArraySize;
		for(new i; i < g_iMapPrefixesNum; i++)
		{
			ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix));
			formatex(szFormat, charsmax(szFormat), "%s%s", szPrefix, szText);
			map_index = 0;
			while((map_index = find_similar_map(map_index, szFormat)))
			{
				ArrayPushCell(aNominateList, map_index - 1);
				iArraySize++;
			}
		}
		
		if(iArraySize == 1)
		{
			map_index = ArrayGetCell(aNominateList, 0);
			new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo);
			copy(szFormat, charsmax(szFormat), eMapInfo[m_MapName]);
			NominateMap(id, szFormat, map_index);
		}
		else if(iArraySize > 1)
		{
			Show_NominationList(id, aNominateList, iArraySize);
		}
		
		ArrayDestroy(aNominateList);
	}
}
public Show_NominationList(id, Array: array, size)
{
	new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_FAST_NOM");
	new iMenu = menu_create(szText, "NominationList_Handler");
	new eMapInfo[MAP_INFO], szString[64], map_index, nominate_index;
	
	for(new i, szNum[8]; i < size; i++)
	{
		map_index = ArrayGetCell(array, i);
		ArrayGetArray(g_aMaps, map_index, eMapInfo);
		
		num_to_str(map_index, szNum, charsmax(szNum));
		nominate_index = is_map_nominated(map_index);
		
		if(eMapInfo[m_BlockCount])
		{
			formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]);
			menu_additem(iMenu, szString, szNum, (1 << 31));
		}
		else if(nominate_index)
		{
			new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
			if(id == eNomInfo[n_Player])
			{
				formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]);
				menu_additem(iMenu, szString, szNum);
			}
			else
			{
				formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]);
				menu_additem(iMenu, szString, szNum, (1 << 31));
			}
		}
		else
		{
			menu_additem(iMenu, eMapInfo[m_MapName], szNum);
		}
	}
	
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK");
	menu_setprop(iMenu, MPROP_BACKNAME, szText);
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT");
	menu_setprop(iMenu, MPROP_NEXTNAME, szText);
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT");
	menu_setprop(iMenu, MPROP_EXITNAME, szText);
	
	menu_display(id, iMenu);
}
public NominationList_Handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new szData[8], szName[32], iAccess, iCallback;
	menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback);
	
	new map_index = str_to_num(szData);
	trim_bracket(szName);
	new is_map_nominated = NominateMap(id, szName, map_index);
	
	if(is_map_nominated == 2 || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU]))
	{
		if(is_map_nominated == 1)
		{
			new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName);
			menu_item_setname(menu, item, szString);
		}
		else if(is_map_nominated == 2)
		{
			menu_item_setname(menu, item, szName);
		}
		menu_display(id, menu);
	}
	else
	{
		menu_destroy(menu);
	}
	
	return PLUGIN_HANDLED;
}
NominateMap(id, map[32], map_index)
{
	new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo);
	
	#if defined FUNCTION_BLOCK_MAPS
	if(eMapInfo[m_BlockCount])
	{
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_NOT_AVAILABLE_MAP");
		return 0;
	}
	#endif
	
	new eNomInfo[NOMINATEDMAP_INFO];
	new szName[32];	get_user_name(id, szName, charsmax(szName));
	
	new nominate_index = is_map_nominated(map_index);
	if(nominate_index)
	{
		ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
		if(id == eNomInfo[n_Player])
		{
			new iSysTime = get_systime();
			if(g_iLastDenominate[id] + MIN_DENOMINATE_TIME <= iSysTime)
			{
				g_iLastDenominate[id] = iSysTime;
				g_iNominatedMaps[id]--;
				ArrayDeleteItem(g_aNominatedMaps, nominate_index - 1);
				
				client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_REMOVE_NOM", szName, map);
				return 2;
			}
			client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_SPAM");
			return 0;
		}
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_ALREADY_NOM");
		return 0;
	}
	
	if(g_iNominatedMaps[id] >= NOMINATED_MAPS_PER_PLAYER)
	{
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_CANT_NOM");
		return 0;
	}
	
	eNomInfo[n_MapName] = map;
	eNomInfo[n_Player] = id;
	eNomInfo[n_MapIndex] = map_index;
	ArrayPushArray(g_aNominatedMaps, eNomInfo);
	
	g_iNominatedMaps[id]++;
	
	if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE]))
	{
		new iMinPlayers = eMapInfo[m_MinPlayers] == 0 ? 1 : eMapInfo[m_MinPlayers];
		client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP2", szName, map, iMinPlayers, eMapInfo[m_MaxPlayers]);
	}
	else
	{
		client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP", szName, map);
	}
	
	return 1;
}
public Command_MapsList(id)
{
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode)
	{
		client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE");
		return;
	}
	#endif
	Show_MapsListMenu(id);
}
Show_MapsListMenu(id)
{
	new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST");
	new iMenu = menu_create(szText, "MapsListMenu_Handler");
	
	new eMapInfo[MAP_INFO], szString[48], iSize = ArraySize(g_aMaps);
	
	for(new i, nominate_index; i < iSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		nominate_index = is_map_nominated(i);
		
		if(eMapInfo[m_BlockCount])
		{
			formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]);
			menu_additem(iMenu, szString, _, (1 << 31));
		}
		else if(nominate_index)
		{
			new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
			if(id == eNomInfo[n_Player])
			{
				formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]);
				menu_additem(iMenu, szString);
			}
			else
			{
				formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]);
				menu_additem(iMenu, szString, _, (1 << 31));
			}
		}
		else
		{
			menu_additem(iMenu, eMapInfo[m_MapName]);
		}
	}
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK");
	menu_setprop(iMenu, MPROP_BACKNAME, szText);
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT");
	menu_setprop(iMenu, MPROP_NEXTNAME, szText);
	formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT");
	menu_setprop(iMenu, MPROP_EXITNAME, szText);
	
	menu_display(id, iMenu);
}
public MapsListMenu_Handler(id, menu, item)
{
	if(item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	new szData[2], szName[32], iAccess, iCallback;
	menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback);
	
	new map_index = item;
	trim_bracket(szName);
	new is_map_nominated = NominateMap(id, szName, map_index);
	
	if(g_iNominatedMaps[id] < NOMINATED_MAPS_PER_PLAYER || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU]))
	{
		if(is_map_nominated == 1)
		{
			new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName);
			menu_item_setname(menu, item, szString);
		}
		else if(is_map_nominated == 2)
		{
			menu_item_setname(menu, item, szName);
		}
		menu_display(id, menu, map_index / 7);
	}
	else
	{
		menu_destroy(menu);
	}
	
	return PLUGIN_HANDLED;
}
#endif
public client_putinserver(id)
{
	if(!is_user_bot(id) && !is_user_hltv(id))
		remove_task(TASK_CHANGETODEFAULT);
}
public client_disconnect(id)
{
	remove_task(id + TASK_VOTEMENU);
	
	#if defined FUNCTION_RTV
	if(g_bRockVoted[id])
	{
		g_bRockVoted[id] = false;
		g_iRockVotes--;
	}
	#endif
	
	#if defined FUNCTION_NOMINATION
	if(g_iNominatedMaps[id])
	{
		clear_nominated_maps(id);
	}
	#endif
	
	#if defined FUNCTION_NIGHTMODE
	if(!g_bNightMode) set_task(1.0, "Task_DelayedChangeToDelault");
	#else
	set_task(1.0, "Task_DelayedChangeToDelault");
	#endif
}
public Task_DelayedChangeToDelault()
{
	new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]);
	if(fChangeTime > 0.0 && get_players_num() == 0)
	{
		set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT);
	}
}
public Task_ChangeToDefault()
{
	new szMapName[32]; get_pcvar_string(g_pCvars[DEFAULT_MAP], szMapName, charsmax(szMapName));
	if(get_players_num() == 0 && is_map_valid(szMapName) && !equali(szMapName, g_szCurrentMap))
	{
		log_amx("Map changed to default[%s]", szMapName);
		set_pcvar_string(g_pCvars[NEXTMAP], szMapName);
		Intermission();
	}
}
public plugin_end()
{
	#if defined FUNCTION_NIGHTMODE
	if(g_fOldNightTimeLimit > 0.0)
	{
		set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit);
	}
	#endif
	
	if(g_bChangedFreezeTime)
	{
		set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
	}
	if(g_fOldTimeLimit > 0.0)
	{
		set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit);
	}
	if(g_iExtendedMax)
	{
		if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 0)
		{
			set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) - float(g_iExtendedMax * get_pcvar_num(g_pCvars[EXTENDED_TIME])));
		}
		else
		{
			new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
			if(iWinLimit > 0)
			{
				set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax);
			}
			new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
			if(iMaxRounds > 0)
			{
				set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax);
			}
		}
	}
}
public plugin_cfg()
{
	new filepath[256]; get_localinfo("amxx_configsdir", filepath, charsmax(filepath));
	add(filepath, charsmax(filepath), "/mapmanager.cfg");
	
	if(file_exists(filepath))
	{
		server_cmd("exec %s", filepath);
		server_exec();
	}
	
	g_aMaps = ArrayCreate(MAP_INFO);
	
	#if defined FUNCTION_NOMINATION
	g_aNominatedMaps = ArrayCreate(NOMINATEDMAP_INFO);
	g_aMapPrefixes = ArrayCreate(32);
	#endif
	
	if( is_plugin_loaded("Nextmap Chooser") > -1 )
	{
		pause("cd", "mapchooser.amxx");
		log_amx("MapManager: mapchooser.amxx has been stopped.");
	}
	
	#if defined FUNCTION_NEXTMAP
	if( is_plugin_loaded("NextMap") > -1 )
	{
		pause("cd", "nextmap.amxx");
		log_amx("MapManager: nextmap.amxx has been stopped.");
	}	
	#endif
	
	LoadMapsFromFile();
	
	#if defined FUNCTION_NIGHTMODE
	LoadNightMaps();
	#endif
	
	new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]);
	if(fChangeTime > 0.0)
	{
		set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT);
	}
	
	register_dictionary("mapmanager.txt");
}
LoadMapsFromFile()
{
	new szDir[128], szFile[128];	
	get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));
	
	#if defined FUNCTION_BLOCK_MAPS
	get_localinfo("amxx_datadir", szDir, charsmax(szDir));
	formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_BLOCKEDMAPS);
	
	new Array:aBlockedMaps = ArrayCreate(BLOCKEDMAP_INFO);
	new eBlockedInfo[BLOCKEDMAP_INFO];
	
	if(file_exists(szFile))
	{
		new szTemp[128]; formatex(szTemp, charsmax(szTemp), "%s/temp.ini", szDir);
		new iFile = fopen(szFile, "rt");
		new iTemp = fopen(szTemp, "wt");
		
		new szBuffer[42], szMapName[32], szCount[8], iCount;
		
		while(!feof(iFile))
		{
			fgets(iFile, szBuffer, charsmax(szBuffer));
			parse(szBuffer, szMapName, charsmax(szMapName), szCount, charsmax(szCount));
			
			if(!is_map_valid(szMapName) || is_map_blocked(aBlockedMaps, szMapName) || equali(szMapName, g_szCurrentMap)) continue;
			
			iCount = str_to_num(szCount) - 1;
			
			if(iCount <= 0) continue;
			
			if(iCount > BLOCK_MAP_COUNT)
			{
				fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, BLOCK_MAP_COUNT);
				iCount = BLOCK_MAP_COUNT;
			}
			else
			{
				fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, iCount);
			}
			
			formatex(eBlockedInfo[b_MapName], charsmax(eBlockedInfo[b_MapName]), szMapName);
			eBlockedInfo[b_Count] = iCount;
			ArrayPushArray(aBlockedMaps, eBlockedInfo);
		}
		
		fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT);
		
		fclose(iFile);
		fclose(iTemp);
		
		delete_file(szFile);
		rename_file(szTemp, szFile, 1);
	}
	else
	{
		new iFile = fopen(szFile, "wt");
		if(iFile)
		{
			fprintf(iFile, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT);
		}
		fclose(iFile);
	}
	#endif
	
	get_localinfo("amxx_configsdir", szDir, charsmax(szDir));
	formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_MAPS);
	
	if(file_exists(szFile))
	{
		new f = fopen(szFile, "rt");
		
		if(f)
		{
			new eMapInfo[MAP_INFO];
			new szText[48], szMap[32], szMin[3], szMax[3];
			while(!feof(f))
			{
				fgets(f, szText, charsmax(szText));
				parse(szText, szMap, charsmax(szMap), szMin, charsmax(szMin), szMax, charsmax(szMax));
				
				if(!szMap[0] || szMap[0] == ';' || !valid_map(szMap) || is_map_in_array(szMap) || equali(szMap, g_szCurrentMap)) continue;
				
				#if defined FUNCTION_BLOCK_MAPS
				new blocked_index = is_map_blocked(aBlockedMaps, szMap);
				if(blocked_index)
				{
					ArrayGetArray(aBlockedMaps, blocked_index - 1, eBlockedInfo);
					eMapInfo[m_BlockCount] = eBlockedInfo[b_Count];
				}
				else
				{
					eMapInfo[m_BlockCount] = 0;
				}
				#endif
				
				#if defined FUNCTION_NOMINATION
				new szPrefix[32];
				if(get_map_prefix(szMap, szPrefix, charsmax(szPrefix)) && !is_prefix_in_array(szPrefix))
				{
					ArrayPushString(g_aMapPrefixes, szPrefix);
					g_iMapPrefixesNum++;
				}
				#endif
				
				eMapInfo[m_MapName] = szMap;
				eMapInfo[m_MinPlayers] = str_to_num(szMin);
				eMapInfo[m_MaxPlayers] = str_to_num(szMax) == 0 ? 32 : str_to_num(szMax);
				
				ArrayPushArray(g_aMaps, eMapInfo);
				szMin = ""; szMax = "";
			}
			fclose(f);
			
			new iSize = ArraySize(g_aMaps);
			
			if(iSize == 0)
			{
				set_fail_state("Nothing loaded from file.");
			}
			
			#if defined FUNCTION_BLOCK_MAPS
			g_iBlockedSize = ArraySize(aBlockedMaps);
			if(iSize - g_iBlockedSize < SELECT_MAPS)
			{
				log_amx("LoadMaps: warning to little maps without block [%d]", iSize - g_iBlockedSize);
			}
			if(iSize - g_iBlockedSize < 1)
			{
				log_amx("LoadMaps: blocked maps cleared");
				clear_blocked_maps();
			}
			ArrayDestroy(aBlockedMaps);
			#endif
			
			#if defined FUNCTION_NEXTMAP
			new iRandomMap = random_num(0, iSize - 1);
			ArrayGetArray(g_aMaps, iRandomMap, eMapInfo);
			set_pcvar_string(g_pCvars[NEXTMAP], eMapInfo[m_MapName]);
			#endif
		}		
	}
	else
	{
		set_fail_state("Maps file doesn't exist.");
	}
}

#if defined FUNCTION_NIGHTMODE
LoadNightMaps()
{
	g_aNightMaps = ArrayCreate(32);
	
	new szDir[128]; get_localinfo("amxx_configsdir", szDir, charsmax(szDir));
	new szFile[128]; formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_NIGHTMAPS);
	new iMapsCount;
	if(file_exists(szFile))
	{
		new szMapName[32], f = fopen(szFile, "rt");
		if(f)
		{
			while(!feof(f))
			{
				fgets(f, szMapName, charsmax(szMapName));
				trim(szMapName); remove_quotes(szMapName);
				
				if(!szMapName[0] || szMapName[0] == ';' || !valid_map(szMapName) || is_map_in_night_array(szMapName))
					continue;
				
				ArrayPushString(g_aNightMaps, szMapName);
				iMapsCount++;
			}
			fclose(f);
		}
	}
	if(iMapsCount < 1)
	{
		log_amx("LoadNightMaps: Need more maps");
		remove_task(TASK_CHECKNIGHT);
	}
	else if(iMapsCount == 1)
	{
		g_bNightModeOneMap = true;
	}
	
	if(is_map_in_night_array(g_szCurrentMap))
	{
		g_bCurMapInNightMode = true;
	}
	if(iMapsCount >= 1)
	{
		set_task(10.0, "Task_CheckNight");
	}
}
#endif

#if defined FUNCTION_NEXTMAP
public Event_Intermisson()
{
	new Float:fChatTime = get_pcvar_float(g_pCvars[CHATTIME]);
	set_pcvar_float(g_pCvars[CHATTIME], fChatTime + 2.0);
	set_task(fChatTime, "DelayedChange");
}
public DelayedChange()
{
	new szNextMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szNextMap, charsmax(szNextMap));
	set_pcvar_float(g_pCvars[CHATTIME], get_pcvar_float(g_pCvars[CHATTIME]) - 2.0);
	server_cmd("changelevel %s", szNextMap);
}
#endif
public Event_NewRound()
{
	new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
	if(!g_bVoteFinished && iMaxRounds && (g_iTeamScore[0] + g_iTeamScore[1]) >= iMaxRounds - 2)
	{
		log_amx("StartVote: maxrounds %d [%d]", iMaxRounds, g_iTeamScore[0] + g_iTeamScore[1]);
		StartVote(0);
	}
	
	new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]) - 2;
	if(!g_bVoteFinished && iWinLimit > 0 && (g_iTeamScore[0] >= iWinLimit || g_iTeamScore[1] >= iWinLimit))
	{
		log_amx("StartVote: winlimit %d [%d/%d]", iWinLimit, g_iTeamScore[0], g_iTeamScore[1]);
		StartVote(0);
	}
	
	if(g_bStartVote)
	{
		log_amx("StartVote: timeleft %d, new round", get_timeleft());
		StartVote(0);
	}
	
	if(!g_bChangedFreezeTime && g_bVoteStarted && get_pcvar_num(g_pCvars[FREEZE_IN_VOTE]) && get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
	{
		g_bChangedFreezeTime = true;
		set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) + float(PRE_START_TIME + VOTE_TIME + 1));
	}
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode && g_bVoteFinished && (g_bNightModeOneMap && get_pcvar_num(g_pCvars[CHANGE_TYPE]) >= 1 || !g_bCurMapInNightMode))
	{
		Intermission();
		new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName));
		client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXTMAP", szMapName);
		return;
	}
	#endif
	
	#if defined FUNCTION_RTV
	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])))
	#else
	if(g_bVoteFinished && (get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[LAST_ROUND])))
	#endif
	{
		Intermission();
		new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName));
		client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMapName);
	}
}
public Event_TeamScore()
{
	new team[2]; read_data(1, team, charsmax(team));
	g_iTeamScore[(team[0]=='C') ? 0 : 1] = read_data(2);
}
public Task_CheckTime()
{
	if(g_bVoteStarted || g_bVoteFinished) return PLUGIN_CONTINUE;
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode && g_bNightModeOneMap) return PLUGIN_CONTINUE;
	#endif
	
	if(get_pcvar_float(g_pCvars[TIMELIMIT]) <= 0.0) return PLUGIN_CONTINUE;
	
	new Float:fTimeToVote = get_pcvar_float(g_pCvars[START_VOTE_BEFORE_END]);
	
	new iTimeLeft = get_timeleft();
	if(iTimeLeft <= floatround(fTimeToVote * 60.0))
	{
		if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
		{
			log_amx("StartVote: timeleft %d", iTimeLeft);
			StartVote(0);
		}
		else
		{
			SetNewRoundVote();
		}
	}
	
	return PLUGIN_CONTINUE;
}

#if defined FUNCTION_NIGHTMODE
public Task_CheckNight()
{
	new szTime[16]; get_pcvar_string(g_pCvars[NIGHTMODE_TIME], szTime, charsmax(szTime));
	new szStart[8], szEnd[8]; parse(szTime, szStart, charsmax(szStart), szEnd, charsmax(szEnd));
	new iStartHour, iStartMinutes, iEndHour, iEndMinutes;
	get_int_time(szStart, iStartHour, iStartMinutes);
	get_int_time(szEnd, iEndHour, iEndMinutes);
	
	new iCurHour, iCurMinutes; time(iCurHour, iCurMinutes);
	
	new bOldNightMode = g_bNightMode;
	
	if(iStartHour != iEndHour && (iStartHour == iCurHour && iCurMinutes >= iStartMinutes || iEndHour == iCurHour && iCurMinutes < iEndMinutes))
	{
		g_bNightMode = true;
	}
	else if(iStartHour == iEndHour && iStartMinutes <= iCurMinutes < iEndMinutes)
	{
		g_bNightMode = true;
	}
	else if(iStartHour > iEndHour && (iStartHour < iCurHour < 24 || 0 <= iCurHour < iEndHour))
	{
		g_bNightMode = true;
	}
	else if(iStartHour < iCurHour < iEndHour)
	{
		g_bNightMode = true;
	}
	else
	{
		g_bNightMode = false;
	}
	
	if(g_bNightMode && !bOldNightMode)// NightMode ON
	{
		if(g_bNightModeOneMap)
		{
			if(g_bCurMapInNightMode)
			{
				g_fOldNightTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
				set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
				client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_ON", iEndHour, iEndMinutes);
			}
			else
			{
				new szMapName[32]; ArrayGetString(g_aNightMaps, 0, szMapName, charsmax(szMapName));
				set_pcvar_string(g_pCvars[NEXTMAP], szMapName);
				
				if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
				{
					Intermission();
					client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL", szMapName);
				}
				else
				{
					g_bVoteFinished = true;
					client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE", szMapName);
				}
			}
		}
		else if(!g_bCurMapInNightMode)
		{
			if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0)
			{
				client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL2");
				StartVote(0);
			}
			else
			{
				SetNewRoundVote();
				client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE2");
			}
		}
	}
	else if(!g_bNightMode && bOldNightMode)// NightMode OFF
	{
		if(g_bNightModeOneMap)
		{
			set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit);
		}
		client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_OFF");
	}
}
#endif
SetNewRoundVote()
{
	g_bStartVote = true;
	g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
	if(g_fOldTimeLimit > 0.0)
	{
		g_bNotUnlimitTime = true;
		set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
	}
}
public StartVote(id)
{
	if(g_bVoteStarted) return 0;
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightModeOneMap && g_bNightMode)
	{
		return 0;
	}
	#endif
	
	g_bVoteStarted = true;
	g_bStartVote = false;
	
	ResetInfo();
	CheckAllowExtendMap();
	
	#if defined FUNCTION_NIGHTMODE
	if(g_bNightMode)
	{
		new iNightSize = ArraySize(g_aNightMaps);
		g_iMenuItemsCount = min(min(g_bCurMapInNightMode ? iNightSize - 1 : iNightSize, SELECT_MAPS), 8);
		
		for(new Item, iRandomMap, szMapName[32]; Item < g_iMenuItemsCount; Item++)
		{
			do
			{
				iRandomMap = random_num(0, iNightSize - 1);
				ArrayGetString(g_aNightMaps, iRandomMap, szMapName, charsmax(szMapName));
			}
			while(is_map_in_menu_by_string(szMapName) || equali(szMapName, g_szCurrentMap));
			
			formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), szMapName);
		}
		
		ForwardPreStartVote();
		return 0;
	}
	#endif
	
	new Array:aMaps = ArrayCreate(VOTEMENU_INFO), iCurrentSize = 0;
	new eMenuInfo[VOTEMENU_INFO], eMapInfo[MAP_INFO], iGlobalSize = ArraySize(g_aMaps);
	new iPlayersNum = get_players_num();
	
	for(new i = 0; i < iGlobalSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		if(eMapInfo[m_MinPlayers] <= iPlayersNum <= eMapInfo[m_MaxPlayers] && !eMapInfo[m_BlockCount])
		{
			formatex(eMenuInfo[v_MapName], charsmax(eMenuInfo[v_MapName]), eMapInfo[m_MapName]);
			eMenuInfo[v_MapIndex] = i; iCurrentSize++;
			ArrayPushArray(aMaps, eMenuInfo);
		}
	}
	new Item = 0;
	
	#if defined FUNCTION_BLOCK_MAPS
	new iMaxItems = min(min(SELECT_MAPS, iGlobalSize - g_iBlockedSize), 8);
	#else
	new iMaxItems = min(min(SELECT_MAPS, iGlobalSize), 8);
	#endif
	
	#if defined FUNCTION_NOMINATION
	new eNomInfo[NOMINATEDMAP_INFO];
	
	if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE]))
	{
		for(new i; i < ArraySize(g_aNominatedMaps); i++)
		{
			ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
			ArrayGetArray(g_aMaps, eNomInfo[n_MapIndex], eMapInfo);
			
			if(iPlayersNum > eMapInfo[m_MaxPlayers] || iPlayersNum < eMapInfo[m_MinPlayers])
			{
				ArrayDeleteItem(g_aNominatedMaps, i--);
			}
		}
	}
	
	new iNomSize = ArraySize(g_aNominatedMaps);	
	g_iMenuItemsCount = min(min(iNomSize, NOMINATED_MAPS_IN_VOTE), iMaxItems);
	
	for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
	{
		iRandomMap = random_num(0, ArraySize(g_aNominatedMaps) - 1);
		ArrayGetArray(g_aNominatedMaps, iRandomMap, eNomInfo);
		
		formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eNomInfo[n_MapName]);
		g_eMenuItems[Item][v_MapIndex] = eNomInfo[n_MapIndex];
		g_iNominatedMaps[eNomInfo[n_Player]]--;
		
		ArrayDeleteItem(g_aNominatedMaps, iRandomMap);
		
		new priority_index = is_map_in_priority(aMaps, eNomInfo[n_MapIndex]);
		if(priority_index)
		{
			ArrayDeleteItem(aMaps, priority_index - 1);
		}
	}	
	#endif
	
	if(iCurrentSize && Item < iMaxItems)
	{
		g_iMenuItemsCount = max(min(iCurrentSize, iMaxItems), Item);
		for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
		{
			iRandomMap = random_num(0, ArraySize(aMaps) - 1);
			ArrayGetArray(aMaps, iRandomMap, eMenuInfo);
			
			formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMenuInfo[v_MapName]);
			g_eMenuItems[Item][v_MapIndex] = eMenuInfo[v_MapIndex];
			
			ArrayDeleteItem(aMaps, iRandomMap);
		}
	}
	
	if(Item < iMaxItems)
	{
		g_iMenuItemsCount = min(iGlobalSize, iMaxItems);
		for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
		{
			do
			{
				iRandomMap = random_num(0, iGlobalSize - 1);
				ArrayGetArray(g_aMaps, iRandomMap, eMapInfo);
			}
			while(is_map_in_menu(iRandomMap) || eMapInfo[m_BlockCount]);
			
			formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMapInfo[v_MapName]);
			g_eMenuItems[Item][v_MapIndex] = iRandomMap;
		}
	}
	
	ArrayDestroy(aMaps);
	
	ForwardPreStartVote();
	
	return 0;
}
CheckAllowExtendMap()
{
	new bAllow = g_bNotUnlimitTime || get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (get_pcvar_num(g_pCvars[MAXROUNDS]) || get_pcvar_num(g_pCvars[WINLIMIT]));
	
	#if defined FUNCTION_RTV && defined FUNCTION_NIGHTMODE
	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))
	#else
	#if defined FUNCTION_RTV
	if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0  || bAllow) && !g_bRockVote && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]))
	#else
	#if defined FUNCTION_NIGHTMODE
	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))
	#else
	if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0  || bAllow) && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]))
	#endif
	#endif
	#endif
	{
		g_bExtendMap = true;
	}
	else
	{
		g_bExtendMap = false;
	}
	
	g_bNotUnlimitTime = false;
}
ResetInfo()
{
	g_iTotalVotes = 0;
	for(new i; i < sizeof(g_eMenuItems); i++)
	{
		g_eMenuItems[i][v_MapName] = "";
		g_eMenuItems[i][v_MapIndex] = -1;
		g_eMenuItems[i][v_Votes] = 0;
	}
	arrayset(g_bPlayerVoted, false, 33);
}
ForwardPreStartVote()
{
	if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
	{
		SetBlackScreenFade(2);
		set_task(1.0, "SetBlackScreenFade", 1);
	}
	
	#if PRE_START_TIME > 0
	g_iTimer = PRE_START_TIME;
	ShowTimer();
	#else
	ShowVoteMenu();
	#endif
	
	new iRet;
	ExecuteForward(g_iForwardPreStartVote, iRet);
}
public ShowTimer()
{
	if(g_iTimer > 0)
	{
		set_task(1.0, "ShowTimer", TASK_SHOWTIMER);
	}
	else
	{
		#if defined FUNCTION_SOUND
		SendAudio(0, "sound/Gman/Gman_Choose2.wav", PITCH_NORM);
		#endif
		ShowVoteMenu();
		return;
	}
	new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
	new iPlayers[32], pNum; get_players(iPlayers, pNum, "ch");
	for(new id, i; i < pNum; i++)
	{
		id = iPlayers[i];
		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);
		show_hudmessage(id, "%L %L!", LANG_PLAYER, "MAPM_HUD_TIMER", g_iTimer, LANG_PLAYER, szSec);
	}
	
	#if defined FUNCTION_SOUND
	if(g_iTimer <= 10)
	{
		for(new id, i; i < pNum; i++)
		{
			id = iPlayers[i];
			SendAudio(id, g_szSound[g_iTimer - 1], PITCH_NORM);
		}
	}
	#endif
	
	g_iTimer--;
}
ShowVoteMenu()
{
	g_iTimer = VOTE_TIME;
	
	set_task(1.0, "Task_Timer", TASK_TIMER, .flags = "a", .repeat = VOTE_TIME);
	
	new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch");
	for(new i = 0; i < pNum; i++)
	{
		iPlayer = Players[i];
		VoteMenu(iPlayer + TASK_VOTEMENU);
		set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME);
	}
	new iRet;
	ExecuteForward(g_iForwardStartVote, iRet);
}
public Task_Timer()
{
	if(--g_iTimer == 0)
	{
		FinishVote();
		show_menu(0, 0, "^n", 1);
		remove_task(TASK_TIMER);
	}
}
public VoteMenu(id)
{
	id -= TASK_VOTEMENU;
	
	if(g_iTimer == 0)
	{
		show_menu(id, 0, "^n", 1); remove_task(id+TASK_VOTEMENU);
		return PLUGIN_HANDLED;
	}
	
	static szMenu[512];
	new iKeys, iPercent, i, iLen;
	
	iLen = formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L:^n^n", LANG_PLAYER, g_bPlayerVoted[id] ? "MAPM_MENU_VOTE_RESULTS" : "MAPM_MENU_CHOOSE_MAP");
	
	for(i = 0; i < g_iMenuItemsCount; i++)
	{		
		iPercent = 0;
		if(g_iTotalVotes)
		{
			iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes);
		}
		
		if(!g_bPlayerVoted[id])
		{
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_eMenuItems[i][v_MapName], iPercent);	
			iKeys |= (1 << i);
		}
		else
		{
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%s[\r%d%%\d]^n", g_eMenuItems[i][v_MapName], iPercent);
		}
	}
	
	if(g_bExtendMap)
	{
		iPercent = 0;
		if(g_iTotalVotes)
		{
			iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes);
		}
		
		if(!g_bPlayerVoted[id])
		{
			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");	
			iKeys |= (1 << i);
		}
		else
		{
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%s[\r%d%%\d]\y[%L]^n", g_szCurrentMap, iPercent, LANG_PLAYER, "MAPM_MENU_EXTEND");
		}
	}
	
	new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%L \r%d\d %L", LANG_PLAYER, "MAPM_MENU_LEFT", g_iTimer, LANG_PLAYER, szSec);
	
	if(!iKeys) iKeys |= (1 << 9);
	
	if(g_bPlayerVoted[id] && get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE]) == 2)
	{
		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(0, 55, 255, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);
		show_hudmessage(id, "%s", szMenu);
	}
	else
	{
		show_menu(id, iKeys, szMenu, -1, "VoteMenu");
	}
	
	return PLUGIN_HANDLED;
}
public VoteMenu_Handler(id, key)
{
	if(g_bPlayerVoted[id])
	{
		VoteMenu(id + TASK_VOTEMENU);
		return PLUGIN_HANDLED;
	}
	
	g_eMenuItems[key][v_Votes]++;
	g_iTotalVotes++;
	g_bPlayerVoted[id] = true;
	
	if(get_pcvar_num(g_pCvars[SHOW_SELECTS]))
	{
		new szName[32];	get_user_name(id, szName, charsmax(szName));
		if(key == g_iMenuItemsCount)
		{
			client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_EXTEND", szName);
		}
		else
		{
			client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_MAP", szName, g_eMenuItems[key][v_MapName]);
		}
	}
	
	if(get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE]))
	{
		VoteMenu(id + TASK_VOTEMENU);
	}
	else
	{
		remove_task(id + TASK_VOTEMENU);
	}
	
	return PLUGIN_HANDLED;
}
FinishVote()
{
	g_bVoteStarted = false;
	g_bVoteFinished = true;
	
	if(g_bChangedFreezeTime)
	{
		set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
		g_bChangedFreezeTime = false;
	}
	if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
	{
		SetBlackScreenFade(0);
	}
	
	new iMaxVote = 0, iRandom;
	for(new i = 1; i < g_iMenuItemsCount + 1; i++)
	{
		iRandom = random_num(0, 1);
		switch(iRandom)
		{
			case 0: if(g_eMenuItems[iMaxVote][v_Votes] < g_eMenuItems[i][v_Votes]) iMaxVote = i;
			case 1: if(g_eMenuItems[iMaxVote][v_Votes] <= g_eMenuItems[i][v_Votes]) iMaxVote = i;
		}
	}
	
	if(g_fOldTimeLimit > 0.0)
	{
		set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit);
		g_fOldTimeLimit = 0.0;
	}
	
	if(!g_iTotalVotes || (iMaxVote != g_iMenuItemsCount))
	{
		if(g_iTotalVotes)
		{
			client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", g_eMenuItems[iMaxVote][v_MapName]);
		}
		else
		{
			iMaxVote = random_num(0, g_iMenuItemsCount - 1);
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOBODY_VOTE", g_eMenuItems[iMaxVote][v_MapName]);
		}
		set_pcvar_string(g_pCvars[NEXTMAP], g_eMenuItems[iMaxVote][v_MapName]);
		
		if(get_pcvar_num(g_pCvars[LAST_ROUND]))
		{
			g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
			set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_LASTROUND");
		}
		#if defined FUNCTION_RTV
		else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 0 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
		#else
		else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
		#endif
		{
			new iSec = get_pcvar_num(g_pCvars[CHATTIME]);
			new szSec[16]; get_ending(iSec, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
			client_print_color(0, print_team_default, "%s^1 %L^1 %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_CHANGE", iSec, LANG_PLAYER, szSec);
			Intermission();
		}
		#if defined FUNCTION_RTV
		else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1)
		#else
		else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1)
		#endif
		{
			client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER,"MAPM_MAP_CHANGE_NEXTROUND");
		}
	}
	else
	{
		g_bVoteFinished = false;
		g_iExtendedMax++;
		
		new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
		new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
		
		#if defined FUNCTION_RTV
		g_iRockVotes = 0;
		g_bRockVote = false;
		arrayset(g_bRockVoted, false, sizeof(g_bRockVoted));
		#endif
		
		if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (iWinLimit || iMaxRounds))
		{
			new iRounds = get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]);
			
			if(iWinLimit > 0)
			{
				set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit + iRounds);
			}
			if(iMaxRounds > 0)
			{
				set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds + iRounds);
			}
			
			new szRounds[16]; get_ending(iRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds));
			client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iRounds, LANG_PLAYER, szRounds);
		}
		else
		{
			new iMin = get_pcvar_num(g_pCvars[EXTENDED_TIME]);
			new szMin[16]; get_ending(iMin, "MAPM_MINUTE1", "MAPM_MINUTE2", "MAPM_MINUTE3", szMin, charsmax(szMin));
			
			client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iMin, LANG_PLAYER, szMin);
			set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) + float(iMin));
		}
	}
	
	new iRet;
	ExecuteForward(g_iForwardFinishVote, iRet);
}
///**************************///
stock get_players_num()
{
	new players[32], pnum; get_players(players, pnum, "ch");
	return pnum;
}
stock valid_map(map[])
{
	if(is_map_valid(map)) return true;
	
	new len = strlen(map) - 4;
	
	if(len < 0) return false;
	
	if(equali(map[len], ".bsp"))
	{
		map[len] = '^0';
		if(is_map_valid(map)) return true;
	}
	
	return false;
}
is_map_in_array(map[])
{
	new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		if(equali(map, eMapInfo[m_MapName]))
		{
			return i + 1;
		}
	}
	return 0;
}
#if defined FUNCTION_BLOCK_MAPS
is_map_blocked(Array:array, map[])
{
	new eBlockedInfo[BLOCKEDMAP_INFO], iSize = ArraySize(array);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(array, i, eBlockedInfo);
		if(equali(map, eBlockedInfo[b_MapName]))
		{
			return i + 1;
		}
	}
	return 0;
}
clear_blocked_maps()
{
	new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		if(eMapInfo[m_BlockCount])
		{
			eMapInfo[m_BlockCount] = 0;
			ArraySetArray(g_aMaps, i, eMapInfo);
		}
	}
	g_iBlockedSize = 0;
}
#endif
is_map_in_menu(index)
{
	for(new i; i < sizeof(g_eMenuItems); i++)
	{
		if(g_eMenuItems[i][v_MapIndex] == index) return true;
	}
	return false;
}
#if defined FUNCTION_NOMINATION
is_map_nominated(map_index)
{
	new eNomInfo[NOMINATEDMAP_INFO], iSize = ArraySize(g_aNominatedMaps);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
		if(map_index == eNomInfo[n_MapIndex])
		{
			return i + 1;
		}
	}
	return 0;
}
is_map_in_priority(Array:array, map_index)
{
	new ePriorityInfo[VOTEMENU_INFO], iSize = ArraySize(array);
	for(new i; i < iSize; i++)
	{
		ArrayGetArray(array, i, ePriorityInfo);
		if(map_index == ePriorityInfo[v_MapIndex])
		{
			return i + 1;
		}
	}
	return 0;
}
clear_nominated_maps(id)
{
	new eNomInfo[NOMINATEDMAP_INFO];
	for(new i = 0; i < ArraySize(g_aNominatedMaps); i++)
	{
		ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
		if(id == eNomInfo[n_Player])
		{
			ArrayDeleteItem(g_aNominatedMaps, i--);
			if(!--g_iNominatedMaps[id]) break;
		}
	}
}
is_prefix_in_array(prefix[])
{
	new string[32];
	for(new i; i < g_iMapPrefixesNum; i++)
	{
		ArrayGetString(g_aMapPrefixes, i, string, charsmax(string));
		if(equali(prefix, string))
		{
			return true;
		}
	}
	return false;
}
get_map_prefix(map[], prefix[], size)
{
	new map_copy[32]; copy(map_copy, charsmax(map_copy), map);
	for(new i; map_copy[i]; i++)
	{
		if(map_copy[i] == '_')
		{
			map_copy[i + 1] = 0;
			copy(prefix, size, map_copy);
			return 1;
		}
	}
	return 0;
}
find_similar_map(map_index, string[32])
{
	new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
	for(new i = map_index; i < iSize; i++)
	{
		ArrayGetArray(g_aMaps, i, eMapInfo);
		if(containi(eMapInfo[m_MapName], string) != -1)
		{
			return i + 1;
		}
	}
	return 0;
}
trim_bracket(text[])
{
	for(new i; text[i]; i++)
	{
		if(text[i] == '[')
		{
			text[i] = 0;
			break;
		}
	}
}
string_with_space(string[])
{
	for(new i; string[i]; i++)
	{
		if(string[i] == ' ') return 1;
	}
	return 0;
}
#endif
#if defined FUNCTION_NIGHTMODE
is_map_in_night_array(map[])
{
	new szMapName[32], iMax = ArraySize(g_aNightMaps);
	for(new i = 0; i < iMax; i++)
	{
		ArrayGetString(g_aNightMaps, i, szMapName, charsmax(szMapName));
		if(equali(szMapName, map))
		{
			return i + 1;
		}
	}
	return 0;
}
is_map_in_menu_by_string(map[])
{
	for(new i; i < sizeof(g_eMenuItems); i++)
	{
		if(equali(g_eMenuItems[i][v_MapName], map)) return true;
	}
	return false;
}
get_int_time(string[], &hour, &minutes)
{
	new left[4], right[4]; strtok(string, left, charsmax(left), right, charsmax(right), ':');
	hour = str_to_num(left);
	minutes = str_to_num(right);
}
#endif
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) formatex(output, lenght, "%s", a);
	else if(num10 == 1) formatex(output, lenght, "%s", b);
	else if(num10 >= 2 && num10 <= 4) formatex(output, lenght, "%s", c);
}
stock SendAudio(id, audio[], pitch)
{
	static iMsgSendAudio;
	if(!iMsgSendAudio) iMsgSendAudio = get_user_msgid("SendAudio");

	message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iMsgSendAudio, _, id);
	write_byte(id);
	write_string(audio);
	write_short(pitch);
	message_end();
}
stock Intermission()
{
	emessage_begin(MSG_ALL, SVC_INTERMISSION);
	emessage_end();
}
public SetBlackScreenFade(fade)
{
	new time, hold, flags;
	static iMsgScreenFade; 
	if(!iMsgScreenFade) iMsgScreenFade = get_user_msgid("ScreenFade");
	
	switch (fade)
	{
		case 1: { time = 1; hold = 1; flags = 4; }
		case 2: { time = 4096; hold = 1024; flags = 1; }
		default: { time = 4096; hold = 1024; flags = 2; }
	}

	message_begin(MSG_BROADCAST, iMsgScreenFade);
	write_short(time);
	write_short(hold);
	write_short(flags);
	write_byte(0);
	write_byte(0);
	write_byte(0);
	write_byte(255);
	message_end();
}
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от OciXCrom » 29 Мар 2021, 14:32

Къде точно си вписал тази мелодия?
Звуците са направени по начин да се спира предишния.
Можеш да пуснеш отделен звук по този начин:

Код за потвърждение: Избери целия код

client_cmd(id, "spk ^"%s^"", ZVUKA_TUK)

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 771
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от Siska » 29 Мар 2021, 15:11

OciXCrom написа: 29 Мар 2021, 14:32 Къде точно си вписал тази мелодия?
Звуците са направени по начин да се спира предишния.
Можеш да пуснеш отделен звук по този начин:

Код за потвърждение: Избери целия код

client_cmd(id, "spk ^"%s^"", ZVUKA_TUK)
Сега, първо мелодията я вписвам там на редовете , които посочих. Примерно на "one.wav" или на "ten.wav". Пробвах и на първия и на последния , като на последния "wav" е най-добре ,за да може хем да има отброяване , хем пък да има и мелодия после, но така или иначе спира , докато се чуе и веднага спира. Желанието ми е да се чува мелодия , докато вотваме за карта. Пробвах с един "мап енд саунд" плъгин, но не проработи. Той "map manager"-a определя края на картата и може би затова не проработи другия плъгин.
А този начин , който ти ми показваш не зная как да го използвам. Трябва да го напиша това някъде в плъгина ли ?
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от OciXCrom » 29 Мар 2021, 15:50

Много ясно. Намираш отброяването в кода:

Код за потвърждение: Избери целия код

#if defined FUNCTION_SOUND
if(g_iTimer <= 10)
{
	for(new id, i; i < pNum; i++)
	{
		id = iPlayers[i];
		SendAudio(id, g_szSound[g_iTimer - 1], PITCH_NORM);
	}
}
#endif
Тук, след #if вкарваш проверка дали е 10-тата секунда и тогава да почне мелодията:

Код за потвърждение: Избери целия код

if(g_iTimer == 10)
{
	client_cmd(id, "spk ^"%s^"", ZVUKA_TUK)
}
Не забравяй да precache-неш звука.

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 771
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от Siska » 29 Мар 2021, 17:04

Не можах... Дава ми четири грешки и не мога да компилирам. Не разбирам от плъгини и мога само да ги компилирам и елементарни неща да променям вътре. Но пък сложих мелодията на друго място. На мястото на "It's time to choose" и там стана много добре.
А иначе , ако не те притеснявам можеш ли да го напишеш това , което ми показа и да си го имам готово за всеки случай. Ако не те затруднява , а иначе аз си го направих много хубаво и така става...
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Map Manager - Помощ за евентуална промяна в кода...

Мнение от OciXCrom » 29 Мар 2021, 21:19

Покажи кода за да видя какво си направил и какво трябва да се направи.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта