Raised This Month: $51 Target: $400
 12% 

MapManager: instead of extending the map, restart the current map


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Vaim
Member
Join Date: Feb 2019
Old 02-16-2019 , 07:46   MapManager: instead of extending the map, restart the current map
Reply With Quote #1

Hello dear community members, please tell me how in this mapmanager
instead of extending the card,
do I restart the current card?

Code:
#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 1

#define BLOCK_MAP_COUNT 5

#define MIN_DENOMINATE_TIME 3

new const PREFIX[] = "^4[MapManager]";

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

#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_disconnected(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();
}
Vaim is offline
Vaim
Member
Join Date: Feb 2019
Old 02-16-2019 , 15:02   Vote for restart card (Please help me...)
Reply With Quote #2

Maybe with this mapchooser get something done?
I'm already losing my mind ...
Can you please tell me how to remove the card extension function and instead restart the card?
To players voted to restart the card.

Code:
#include <amxmodx>

#define SELECTMAPS		6	// Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS		1	// Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND		2	// Максимальное число продлений
#define STEP_EXTEND		12	// Время продления [В минутах]
#define VOTETIME		10	// Время голосования.
#define RTV_FUNC			// Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
	#define RTV_DELAY	180	// Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
	#define RTV_PERCENT	60	// Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC			// Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
	#define MAX_NOMINATE	3	// Максимум карт для номинации
	#define MAX_NOMINATE_PL	1	// Максимум карт для номинации ОДНИМ игроком
	#define MAPSMENU		// Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND			// Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV			// Включает команду amx_rtv
#define SCREENFADE			// Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS			// Показывать карты в зависимости от онлайна						

#define MAX_MAPS 1024			// Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS + 2];
new g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap = 1;
new g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNum, g_iMapCount;
new g_NextMap[32], g_sCurMap[32];
new bool:g_bVoteStarted, bool:g_bBeInVote, bool:g_bBlockExtended;
new g_pTimeLimit, g_oldTimeLimit, g_iTempTimelimit;
new g_pMaxSpeed, g_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTime, g_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][] 	= { "",	"fvox/one",	"fvox/two",	"fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
	
public plugin_init()
{
#define VERSION "2.6"
	register_plugin("Lite MapChooser", VERSION, "neygomon");
	register_cvar("lite_chooser", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
	register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND	
	register_event("HLTV", "eRoundStart", "a", "1=0", "2=0");
#endif	
#if defined RTV_FUNC
	register_clcmd("say rtv", "clcmd_RockVote");
	register_clcmd("say /rtv", "clcmd_RockVote");
#endif
#if defined MAPSMENU
	register_clcmd("say /maps", "clcmd_Maps");
	register_clcmd("say_team /maps", "clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
	register_clcmd("say", "clcmd_Say");
#endif
#if defined AMXRTV
	register_concmd("amx_rtv", "concmd_StartVote", ADMIN_VOTE);
#endif	
	register_clcmd("say ff", "clcmd_FF");
	register_clcmd("say nextmap", "clcmd_NextMap");
	register_clcmd("say timeleft", "clcmd_TimeLeft");
	register_clcmd("say thetime", "clcmd_TheTime");
	
	g_pTimeLimit 	 = get_cvar_pointer("mp_timelimit");
	g_pMaxSpeed	 = get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND	
	g_pRoundTime 	 = get_cvar_pointer("mp_roundtime");
	g_pC4Timer	 = get_cvar_pointer("mp_c4timer");
#endif	
	g_iStartMap = get_systime();
}

public plugin_end()
{
	if(g_oldTimeLimit)
		set_pcvar_num(g_pTimeLimit, g_oldTimeLimit);
}

public plugin_cfg()
{
#if defined MAPSMENU	
	g_iMapsMenu = menu_create("\d[\rNominate\d] \yВыберите карту\w", "mapsmenu_handler");
	menu_setprop(g_iMapsMenu, MPROP_EXITNAME, "Выход");
	menu_setprop(g_iMapsMenu, MPROP_NEXTNAME, "Далее");
	menu_setprop(g_iMapsMenu, MPROP_BACKNAME, "Назад");
#endif
	get_mapname(g_sCurMap, charsmax(g_sCurMap));
	LoadBlockMaps(); LoadMaps();	// грузим мапы.
	set_task(15.0, "CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
	if(!g_bRockVoted[id]) return;
	
	g_bRockVoted[id] = false;
	g_iRockVote--;
}			
#endif
#if defined AMXRTV
public concmd_StartVote(id, flag)
{
	if(id)
	{
		if(!IsValidRtv(id))
			return PLUGIN_HANDLED;
		if(~get_user_flags(id) & flag) 
			return console_print(id, "У вас недостаточно прав для использования этой команды!");
	}		
	if(g_bVoteStarted) 
		return console_print(id, "[BestSkill] VoteMap has already started");
	
	console_print(id, "[BestSkill] VoteMap started in new round!");
	new name[32]; get_user_name(id, name, charsmax(name));
	ChatColor(0, "^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!", name);
	log_amx("Администратор %s запустил досрочное голосование", name); 
#if defined NOROUND
	StartVoteMap(); g_bBlockExtended = true;
#else			
	g_bVoteStarted = g_bBlockExtended = true; hud_lastround();
#endif	
	return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
	ChatColor(id, "^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим.", get_cvar_num("mp_friendlyfire") ? "разрешен" : "запрещен");
	return PLUGIN_HANDLED;
}	

public clcmd_TheTime(id)
{
	static time[64]; get_time ("%Y/%m/%d - %H:%M:%S", time, charsmax(time));
	ChatColor(id, "^1[^4BestSkill^1] ^4Текущее время: ^3 %s", time);
	return PLUGIN_HANDLED;
}

public clcmd_NextMap(id)
{
	ChatColor(id, "^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
	return PLUGIN_HANDLED;
}	

public clcmd_TimeLeft(id)
{
	static a; a = get_timeleft();
	if(a > 0) ChatColor(id, "^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (a / 60), (a % 60));	
	else ChatColor(id, "^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
	return PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
	if(g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
	
	static iVote;
	if(!g_bRockVoted[id])
	{
		g_bRockVoted[id] = true;
		if((iVote = floatround(get_playersnum() * RTV_PERCENT / 100.0, floatround_round) - ++g_iRockVote) > 0)
		{
			static szName[32]; get_user_name(id, szName, charsmax(szName));
			ChatColor(0, "^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d", szName, iVote);
			log_amx("%s проголосовал за смену карты. Осталось: %d голосов.", szName, iVote);
		}
		else 
		{
#if defined NOROUND
			StartVoteMap(); g_bBlockExtended = true;
#else			
			g_bVoteStarted = g_bBlockExtended = true; hud_lastround();
#endif			
			ChatColor(0, "^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
		}	
	}
	else ChatColor(id, "^1[^4BestSkill^1] ^4Вы уже голосовали!");
	return PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
	if(g_bVoteStarted || g_bBeInVote) 
		return PLUGIN_CONTINUE;

	static szMessage[36]; 
	read_args(szMessage, charsmax(szMessage)); 
	remove_quotes(szMessage);
	return CheckValidMap(id, szMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
	if(!g_bVoteStarted && !g_bBeInVote) 
		menu_display(id, g_iMapsMenu, 0);
	return PLUGIN_HANDLED;
}

public mapsmenu_handler(id, menu, item)
{
	if(item == MENU_EXIT)
		return PLUGIN_HANDLED;
	
	new _access, item_data[1], item_name[32], callback;
	menu_item_getinfo(menu, item, _access, item_data, charsmax(item_data), item_name, charsmax(item_name), callback);
	CheckValidMap(id, item_name);
	return PLUGIN_HANDLED;
}
#endif
CheckValidMap(id, map[])
{
	static i;
	if(_is_map_blocked(map))
		return ChatColor(id, "^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
	else if(_is_map_nominated(map))
		return ChatColor(id, "^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
	else if((i = _is_map_loaded(map)) != -1)
	{
		if(g_iNomMap[id] == MAX_NOMINATE_PL)
			return ChatColor(id, "^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
		else if(g_iCountNom == MAX_NOMINATE)
			return ChatColor(id, "^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS			
		else if(!IsMapValidOnPlayers(i, get_playersnum()))
			return ChatColor(id, "^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif			
		else
		{
			g_iIdMapNom[g_iCountNom] = i;
			copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
			g_iNomMap[id]++; g_iCountNom++;
	
			static szName[32]; get_user_name(id, szName, charsmax(szName));
			return ChatColor(0, "^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1.", szName, map);
		}
	}
	return PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
	if(!g_bVoteStarted) return;
	g_bVoteStarted = false;
	StartVoteMap();
}
#endif

StartVoteMap()
{
	if(!g_oldMaxSpeed) g_oldMaxSpeed = get_pcvar_num(g_pMaxSpeed);
	set_pcvar_num(g_pMaxSpeed, 0);
#if defined SCREENFADE
	ScreenFade(1);
#endif
	set_task(1.0, "ShowTimer", _, _ , _, "a", 3);
	set_task(4.0, "voteNextMap");
}

public CheckTime()
{
	if(g_bVoteStarted || g_bBeInVote) return;
	static iTimeLeft, iTimeLimit; 
	iTimeLeft = get_timeleft();
	iTimeLimit = get_pcvar_num(g_pTimeLimit);
	if(iTimeLeft < 30 && iTimeLimit)
	{
		g_iTempTimelimit = iTimeLimit;
#if defined NOROUND	
		StartVoteMap();
#else		
		g_bVoteStarted = true;
		if(!g_oldTimeLimit) g_oldTimeLimit = iTimeLimit;
		set_pcvar_num(g_pTimeLimit, iTimeLimit + get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
		hud_lastround();
#endif	
	}
}
	
public ShowTimer()
{
	static iTimer; if(!iTimer) iTimer = 3;
	set_hudmessage(255, 245, 0, -1.0, 0.6, 2, 0.0, 1.0, 0.1, 0.0, 1);
	show_hudmessage(0, "vk.com/bestskill", iTimer);
	client_cmd(0, "spk %s", g_szSound[iTimer--]);
}

public voteNextMap()
{
	g_bBeInVote = true;
	static szMenu[256], iLen, iKeys, a, iMaxMaps, iTempMapTime; 
	if(!iTempMapTime) iTempMapTime = g_iTempTimelimit + MAX_NUMEXTEND * STEP_EXTEND;
	if(!iMaxMaps) iMaxMaps = (g_iMapCount - 1 < SELECTMAPS) ? g_iMapCount - 1 : SELECTMAPS;

	iLen = formatex(szMenu, charsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS	
	new x, players = get_playersnum();
#endif	
	g_iVoteMapNum = iKeys = 0;
	while(g_iVoteMapNum < iMaxMaps)
	{
#if defined NOMINATE_FUNC	
		if(g_iVoteMapNum < g_iCountNom)
		{
			g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
			copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", g_iVoteMapNum+1, g_sVoteMap[g_iVoteMapNum]);
			iKeys |= (1<<g_iVoteMapNum++);
			continue;
		}
#endif
		do a = random(g_iMapCount - 1);
		while(_is_map_in_menu(a));
		g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
		if(!IsMapValidOnPlayers(a, players))
		{
			if(++x < g_iMapCount) continue;
			else break;
		}	
#endif		
		copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", g_iVoteMapNum+1, g_sVoteMap[g_iVoteMapNum]);
		iKeys |= (1<<g_iVoteMapNum++);
	}
	if(g_iTempTimelimit < iTempMapTime && !g_bBlockExtended)
	{
		formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%d. \w%s \d[\rПродлить\d]", g_iVoteMapNum+1, g_sCurMap);
		iKeys |= (1<<g_iVoteMapNum);
	}
	show_menu(0, iKeys, szMenu, VOTETIME, "MapChoose");
	set_task(float(VOTETIME), "checkVotes");
	client_cmd(0, "spk Gman/Gman_Choose2");
	log_amx("Vote: Voting for the nextmap started");
	return PLUGIN_HANDLED;
}

public votemenu_handler(id, iKey)
{
	static szName[32]; get_user_name(id, szName, charsmax(szName));

	if(iKey == g_iVoteMapNum) 	ChatColor(0, "^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты", szName);
	else 				ChatColor(0, "^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s", szName, g_sVoteMap[iKey]);
	
	return g_iVoteCount[iKey]++;
}

public checkVotes()
{
	new b;
	for(new a; a < SELECTMAPS+1; a++)
		if(g_iVoteCount[b] < g_iVoteCount[a])		
			b = a;		
	
	if(!g_iVoteCount[b])
	{
		new map = random(g_iVoteMapNum-1);
		ChatColor(0, "^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s", g_sVoteMap[map]);
		log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s", g_sVoteMap[map]);
		copy(g_NextMap, charsmax(g_NextMap), g_sVoteMap[map]); ChangeLevel();
	}
	else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
	{
		set_pcvar_num(g_pTimeLimit, g_iTempTimelimit + STEP_EXTEND);
		ChatColor(0, "^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Карта продлена на ^3%d ^4минут.", STEP_EXTEND);
		log_amx("[End VoteMap] Voting for the nextmap finished. Map %s extended by %d minutes", g_sCurMap, STEP_EXTEND);
		g_bBeInVote = false; 
		arrayset(g_iVoteCount, 0, SELECTMAPS + 2);
#if defined NOMINATE_FUNC
		g_iCountNom = 0;
		arrayset(g_iNomMap, 0, 33); 
		arrayset(g_iIdMapNom, 0, MAX_NOMINATE+1); 
		for(new i; i < MAX_NOMINATE+1; i++)
			g_sNomMap[i][0] = 0;
#endif
#if defined SCREENFADE
		ScreenFade(0);
#endif
	}
	else
	{		
		ChatColor(0, "^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s", g_sVoteMap[b]);
		log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s", g_sVoteMap[b]);
		copy(g_NextMap, charsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();		
	}
	set_pcvar_num(g_pMaxSpeed, g_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
	copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
	if(file_exists(FILE_BLOCKEDMAPS))
	{
		new buff[256], fp = fopen(FILE_BLOCKEDMAPS, "rt");
		while(g_iLastMap < BLOCK_MAPS && !feof(fp))
		{
			fgets(fp, buff, charsmax(buff));
			if(buff[0] != ';' && parse(buff, g_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
				g_iLastMap++;
		}
		fclose(fp);
		unlink(FILE_BLOCKEDMAPS);
	}
	if(write_file(FILE_BLOCKEDMAPS, "; File generated by Lite Mapchooser. Do not modify!"))
		for(new i; i < g_iLastMap; i++)
			write_file(FILE_BLOCKEDMAPS, g_sLastMap[i]);
}

LoadMaps()
{
	new buff[256], fp = fopen("addons/amxmodx/configs/maps.ini", "rt");
	if(!fp) set_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS	
	new minpl[3], maxpl[3];
#endif
	while(!feof(fp) && g_iMapCount < MAX_MAPS)
	{
		fgets(fp, buff, charsmax(buff));
		trim(buff); remove_quotes(buff);
		if(!buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS		
		if(parse(buff, g_sMap[g_iMapCount], charsmax(g_sMap[]), minpl, charsmax(minpl), maxpl, charsmax(maxpl)))
#else
		if(parse(buff, g_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif		
		{
			if(!is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
			g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
			g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
			menu_additem(g_iMapsMenu, g_sMap[g_iMapCount]);
#endif	
			g_iMapCount++;			
		}
	}
	fclose(fp); 
	
	if(!g_iMapCount) 
		set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
	else if(g_iMapCount == 1)
		set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");	
	else if(g_iMapCount < SELECTMAPS)
		log_to_file("lite_mapchooser.log", "[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]", g_iMapCount, SELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
	for(new i; i < g_iVoteMapNum; i++)
		if(g_iMapInMenu[i] == MapId)
			return true;
	return false;
}

bool:_is_map_blocked(map[])
{
	for(new i; i < g_iLastMap; i++)
		if(!strcmp(g_sLastMap[i], map))
			return true;
	return false;	
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
	for(new i; i < g_iCountNom; i++)
		if(!strcmp(g_sNomMap[i], map))
			return true;
	return false;
}

_is_map_loaded(map[])
{
	for(new i; i < g_iMapCount; i++)
		if(!strcmp(g_sMap[i], map)) 
			return i;	
	return -1;	
}
#endif
ChangeLevel()
{
	message_begin(MSG_ALL, SVC_INTERMISSION);
	message_end();
	set_task(3.0, "NextMap");
}

public NextMap()
	server_cmd("changelevel %s", g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
	static time, hold, flags, mScreenFade;
	if(!mScreenFade) mScreenFade = get_user_msgid("ScreenFade");
	
	time = (0 <= fade <= 1) ? 4096 : 1;
	hold = (0 <= fade <= 1) ? 1024 : 1;
	
	switch(fade)
	{
		case 0:
		{
			flags = 2;
			set_msg_block(mScreenFade, BLOCK_NOT);
		}	
		case 1:
		{
			flags = 1;
			set_task(1.0, "ScreenFade", 2);
		}
		case 2: 
		{
			flags = 4;
			set_msg_block(mScreenFade, BLOCK_SET);
		}	
	}
	message_begin(MSG_BROADCAST, mScreenFade);
	write_short(time);
	write_short(hold);
	write_short(flags);
	write_byte(0);
	write_byte(0);
	write_byte(0);
	write_byte(255);
	message_end();
}
#endif
stock hud_lastround()
{
	set_hudmessage(127, 127, 127, 0.02, 0.21, 0, 30.0, 30.0, 0.0, 0.5, 3);
	show_hudmessage(0, "Последний раунд");
}

stock IsValidRtv(const id)
{
	static estimated_time; estimated_time = (get_systime() - g_iStartMap);
	if(RTV_DELAY > estimated_time)
	{
		static frmt[129], temp, _time; 
		_time = (temp = ((RTV_DELAY - estimated_time) / 60)) < 1 ? 0 : temp;
		
		if(!_time) formatex(frmt, charsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
		else formatex(frmt, charsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!", _time);
		
		ChatColor(id, "^1[^4BestSkill^1] %s", frmt);
		return 0;
	}
	return 1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
	static pnum, players[32], szMsg[190], IdMsg; 
	vformat(szMsg, charsmax(szMsg), szMessage, 3);
	
	if(!IdMsg) IdMsg = get_user_msgid("SayText");
	
	if(id) 
	{
		if(!is_user_connected(id)) return 0;
		players[0] = id;
		pnum = 1; 
	} 
	else get_players(players, pnum, "ch");
	
	for(new i; i < pnum; i++)
	{
		message_begin(MSG_ONE, IdMsg, .player = players[i]);
		write_byte(players[i]);
		write_string(szMsg);
		message_end();
	}
	return 1;
}
Vaim is offline
imindfreak
Senior Member
Join Date: Oct 2007
Location: 127.0.0.1
Old 02-16-2019 , 16:45   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #3

If by card you mean map, here's what you can do.
Replace the extend function to be the "voted" function.
I have not tested this so give it a try.


PHP Code:
#include <amxmodx>

#define SELECTMAPS        6    // Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS        1    // Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND        2    // Максимальное число продлений
#define STEP_EXTEND        12    // Время продления [В минутах]
#define VOTETIME        10    // Время голосования.
#define RTV_FUNC            // Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
    #define RTV_DELAY    180    // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
    #define RTV_PERCENT    60    // Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC            // Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
    #define MAX_NOMINATE    3    // Максимум карт для номинации
    #define MAX_NOMINATE_PL    1    // Максимум карт для номинации ОДНИМ игроком
    #define MAPSMENU        // Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND            // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV            // Включает команду amx_rtv
#define SCREENFADE            // Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS            // Показывать карты в зависимости от онлайна                        

#define MAX_MAPS 1024            // Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new 
g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS 2];
new 
g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap 1;
new 
g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNumg_iMapCount;
new 
g_NextMap[32], g_sCurMap[32];
new 
bool:g_bVoteStartedbool:g_bBeInVotebool:g_bBlockExtended;
new 
g_pTimeLimitg_oldTimeLimitg_iTempTimelimit;
new 
g_pMaxSpeedg_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTimeg_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][]     = { "",    "fvox/one",    "fvox/two",    "fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
    
public plugin_init()
{
#define VERSION "2.6"
    
register_plugin("Lite MapChooser"VERSION"neygomon");
    
register_cvar("lite_chooser"VERSIONFCVAR_SERVER FCVAR_SPONLY);
    
register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND    
    
register_event("HLTV""eRoundStart""a""1=0""2=0");
#endif    
#if defined RTV_FUNC
    
register_clcmd("say rtv""clcmd_RockVote");
    
register_clcmd("say /rtv""clcmd_RockVote");
#endif
#if defined MAPSMENU
    
register_clcmd("say /maps""clcmd_Maps");
    
register_clcmd("say_team /maps""clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
    
register_clcmd("say""clcmd_Say");
#endif
#if defined AMXRTV
    
register_concmd("amx_rtv""concmd_StartVote"ADMIN_VOTE);
#endif    
    
register_clcmd("say ff""clcmd_FF");
    
register_clcmd("say nextmap""clcmd_NextMap");
    
register_clcmd("say timeleft""clcmd_TimeLeft");
    
register_clcmd("say thetime""clcmd_TheTime");
    
    
g_pTimeLimit      get_cvar_pointer("mp_timelimit");
    
g_pMaxSpeed     get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND    
    
g_pRoundTime      get_cvar_pointer("mp_roundtime");
    
g_pC4Timer     get_cvar_pointer("mp_c4timer");
#endif    
    
g_iStartMap get_systime();
}

public 
plugin_end()
{
    if(
g_oldTimeLimit)
        
set_pcvar_num(g_pTimeLimitg_oldTimeLimit);
}

public 
plugin_cfg()
{
#if defined MAPSMENU    
    
g_iMapsMenu menu_create("\d[\rNominate\d] \yВыберите карту\w""mapsmenu_handler");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Далее");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
get_mapname(g_sCurMapcharsmax(g_sCurMap));
    
LoadBlockMaps(); LoadMaps();    // грузим мапы.
    
set_task(15.0"CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
    if(!
g_bRockVoted[id]) return;
    
    
g_bRockVoted[id] = false;
    
g_iRockVote--;
}            
#endif
#if defined AMXRTV
public concmd_StartVote(idflag)
{
    if(
id)
    {
        if(!
IsValidRtv(id))
            return 
PLUGIN_HANDLED;
        if(~
get_user_flags(id) & flag
            return 
console_print(id"У вас недостаточно прав для использования этой команды!");
    }        
    if(
g_bVoteStarted
        return 
console_print(id"[BestSkill] VoteMap has already started");
    
    
console_print(id"[BestSkill] VoteMap started in new round!");
    new 
name[32]; get_user_name(idnamecharsmax(name));
    
ChatColor(0"^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!"name);
    
log_amx("Администратор %s запустил досрочное голосование"name); 
#if defined NOROUND
    
StartVoteMap(); g_bBlockExtended true;
#else            
    
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif    
    
return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим."get_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TheTime(id)
{
    static 
time[64]; get_time ("%Y/%m/%d - %H:%M:%S"timecharsmax(time));
    
ChatColor(id"^1[^4BestSkill^1] ^4Текущее время: ^3 %s"time);
    return 
PLUGIN_HANDLED;
}

public 
clcmd_NextMap(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TimeLeft(id)
{
    static 
aget_timeleft();
    if(
0ChatColor(id"^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (60), (60));    
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
    return 
PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
    if(
g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
    
    static 
iVote;
    if(!
g_bRockVoted[id])
    {
        
g_bRockVoted[id] = true;
        if((
iVote floatround(get_playersnum() * RTV_PERCENT 100.0floatround_round) - ++g_iRockVote) > 0)
        {
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d"szNameiVote);
            
log_amx("%s проголосовал за смену карты. Осталось: %d голосов."szNameiVote);
        }
        else 
        {
#if defined NOROUND
            
StartVoteMap(); g_bBlockExtended true;
#else            
            
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif            
            
ChatColor(0"^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
        }    
    }
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Вы уже голосовали!");
    return 
PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
    if(
g_bVoteStarted || g_bBeInVote
        return 
PLUGIN_CONTINUE;

    static 
szMessage[36]; 
    
read_args(szMessagecharsmax(szMessage)); 
    
remove_quotes(szMessage);
    return 
CheckValidMap(idszMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
    if(!
g_bVoteStarted && !g_bBeInVote
        
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}

public 
mapsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
        return 
PLUGIN_HANDLED;
    
    new 
_accessitem_data[1], item_name[32], callback;
    
menu_item_getinfo(menuitem_accessitem_datacharsmax(item_data), item_namecharsmax(item_name), callback);
    
CheckValidMap(iditem_name);
    return 
PLUGIN_HANDLED;
}
#endif
CheckValidMap(idmap[])
{
    static 
i;
    if(
_is_map_blocked(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
    else if(
_is_map_nominated(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
    else if((
_is_map_loaded(map)) != -1)
    {
        if(
g_iNomMap[id] == MAX_NOMINATE_PL)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
        else if(
g_iCountNom == MAX_NOMINATE)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS            
        
else if(!IsMapValidOnPlayers(iget_playersnum()))
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif            
        
else
        {
            
g_iIdMapNom[g_iCountNom] = i;
            
copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
            
g_iNomMap[id]++; g_iCountNom++;
    
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            return 
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1."szNamemap);
        }
    }
    return 
PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
    if(!
g_bVoteStarted) return;
    
g_bVoteStarted false;
    
StartVoteMap();
}
#endif

StartVoteMap()
{
    if(!
g_oldMaxSpeedg_oldMaxSpeed get_pcvar_num(g_pMaxSpeed);
    
set_pcvar_num(g_pMaxSpeed0);
#if defined SCREENFADE
    
ScreenFade(1);
#endif
    
set_task(1.0"ShowTimer"__"a"3);
    
set_task(4.0"voteNextMap");
}

public 
CheckTime()
{
    if(
g_bVoteStarted || g_bBeInVote) return;
    static 
iTimeLeftiTimeLimit
    
iTimeLeft get_timeleft();
    
iTimeLimit get_pcvar_num(g_pTimeLimit);
    if(
iTimeLeft 30 && iTimeLimit)
    {
        
g_iTempTimelimit iTimeLimit;
#if defined NOROUND    
        
StartVoteMap();
#else        
        
g_bVoteStarted true;
        if(!
g_oldTimeLimitg_oldTimeLimit iTimeLimit;
        
set_pcvar_num(g_pTimeLimitiTimeLimit get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
        
hud_lastround();
#endif    
    
}
}
    
public 
ShowTimer()
{
    static 
iTimer; if(!iTimeriTimer 3;
    
set_hudmessage(2552450, -1.00.620.01.00.10.01);
    
show_hudmessage(0"vk.com/bestskill"iTimer);
    
client_cmd(0"spk %s"g_szSound[iTimer--]);
}

public 
voteNextMap()
{
    
g_bBeInVote true;
    static 
szMenu[256], iLeniKeysaiMaxMapsiTempMapTime
    if(!
iTempMapTimeiTempMapTime g_iTempTimelimit MAX_NUMEXTEND STEP_EXTEND;
    if(!
iMaxMapsiMaxMaps = (g_iMapCount SELECTMAPS) ? g_iMapCount SELECTMAPS;

    
iLen formatex(szMenucharsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS    
    
new xplayers get_playersnum();
#endif    
    
g_iVoteMapNum iKeys 0;
    while(
g_iVoteMapNum iMaxMaps)
    {
#if defined NOMINATE_FUNC    
        
if(g_iVoteMapNum g_iCountNom)
        {
            
g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
            
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
            
iKeys |= (1<<g_iVoteMapNum++);
            continue;
        }
#endif
        
do random(g_iMapCount 1);
        while(
_is_map_in_menu(a));
        
g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
        
if(!IsMapValidOnPlayers(aplayers))
        {
            if(++
g_iMapCount) continue;
            else break;
        }    
#endif        
        
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
        
iKeys |= (1<<g_iVoteMapNum++);
    }
    if(
g_iTempTimelimit iTempMapTime && !g_bBlockExtended)
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteMapNum+1g_sCurMap);
        
iKeys |= (1<<g_iVoteMapNum);
    }
    
show_menu(0iKeysszMenuVOTETIME"MapChoose");
    
set_task(float(VOTETIME), "checkVotes");
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("Vote: Voting for the nextmap started");
    return 
PLUGIN_HANDLED;
}

public 
votemenu_handler(idiKey)
{
    static 
szName[32]; get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteMapNum)     ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"szName);
    else                 
ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"szNameg_sVoteMap[iKey]);
    
    return 
g_iVoteCount[iKey]++;
}

public 
checkVotes()
{
    new 
b;
    for(new 
aSELECTMAPS+1a++)
        if(
g_iVoteCount[b] < g_iVoteCount[a])        
            
a;        
    
    if(!
g_iVoteCount[b])
    {
        new 
map random(g_iVoteMapNum-1);
        
ChatColor(0"^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"g_sVoteMap[map]);
        
log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s"g_sVoteMap[map]);
        
copy(g_NextMapcharsmax(g_NextMap),g_sCurMap); ChangeLevel();
    }
        
//Copied the nominated function into here which was originally the extend function
    
else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
    {
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Следующая карта будет перезапущена: ^3%s"g_sCurMap);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sCurMap);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();    
    }
    else
    {        
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s"g_sVoteMap[b]);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sVoteMap[b]);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();        
    }
    
set_pcvar_num(g_pMaxSpeedg_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
    
copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
    if(
file_exists(FILE_BLOCKEDMAPS))
    {
        new 
buff[256], fp fopen(FILE_BLOCKEDMAPS"rt");
        while(
g_iLastMap BLOCK_MAPS && !feof(fp))
        {
            
fgets(fpbuffcharsmax(buff));
            if(
buff[0] != ';' && parse(buffg_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
                
g_iLastMap++;
        }
        
fclose(fp);
        
unlink(FILE_BLOCKEDMAPS);
    }
    if(
write_file(FILE_BLOCKEDMAPS"; File generated by Lite Mapchooser. Do not modify!"))
        for(new 
ig_iLastMapi++)
            
write_file(FILE_BLOCKEDMAPSg_sLastMap[i]);
}

LoadMaps()
{
    new 
buff[256], fp fopen("addons/amxmodx/configs/maps.ini""rt");
    if(!
fpset_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS    
    
new minpl[3], maxpl[3];
#endif
    
while(!feof(fp) && g_iMapCount MAX_MAPS)
    {
        
fgets(fpbuffcharsmax(buff));
        
trim(buff); remove_quotes(buff);
        if(!
buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS        
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[]), minplcharsmax(minpl), maxplcharsmax(maxpl)))
#else
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif        
        
{
            if(!
is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
            
g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
            
g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
            
menu_additem(g_iMapsMenug_sMap[g_iMapCount]);
#endif    
            
g_iMapCount++;            
        }
    }
    
fclose(fp); 
    
    if(!
g_iMapCount
        
set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
    else if(
g_iMapCount == 1)
        
set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");    
    else if(
g_iMapCount SELECTMAPS)
        
log_to_file("lite_mapchooser.log""[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]"g_iMapCountSELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
    for(new 
ig_iVoteMapNumi++)
        if(
g_iMapInMenu[i] == MapId)
            return 
true;
    return 
false;
}

bool:_is_map_blocked(map[])
{
    for(new 
ig_iLastMapi++)
        if(!
strcmp(g_sLastMap[i], map))
            return 
true;
    return 
false;    
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
    for(new 
ig_iCountNomi++)
        if(!
strcmp(g_sNomMap[i], map))
            return 
true;
    return 
false;
}

_is_map_loaded(map[])
{
    for(new 
ig_iMapCounti++)
        if(!
strcmp(g_sMap[i], map)) 
            return 
i;    
    return -
1;    
}
#endif
ChangeLevel()
{
    
message_begin(MSG_ALLSVC_INTERMISSION);
    
message_end();
    
set_task(3.0"NextMap");
}

public 
NextMap()
    
server_cmd("changelevel %s"g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
    static 
timeholdflagsmScreenFade;
    if(!
mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    
time = (<= fade <= 1) ? 4096 1;
    
hold = (<= fade <= 1) ? 1024 1;
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }    
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }    
    }
    
message_begin(MSG_BROADCASTmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}
#endif
stock hud_lastround()
{
    
set_hudmessage(1271271270.020.21030.030.00.00.53);
    
show_hudmessage(0"Последний раунд");
}

stock IsValidRtv(const id)
{
    static 
estimated_timeestimated_time = (get_systime() - g_iStartMap);
    if(
RTV_DELAY estimated_time)
    {
        static 
frmt[129], temp_time
        
_time = (temp = ((RTV_DELAY estimated_time) / 60)) < temp;
        
        if(!
_timeformatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
        else 
formatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!"_time);
        
        
ChatColor(id"^1[^4BestSkill^1] %s"frmt);
        return 
0;
    }
    return 
1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage3);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    if(
id
    {
        if(!
is_user_connected(id)) return 0;
        
players[0] = id;
        
pnum 1
    } 
    else 
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
    return 
1;

__________________
BeastGaming Community - Map Maker & Coder.

Last edited by imindfreak; 02-16-2019 at 17:02.
imindfreak is offline
Vaim
Member
Join Date: Feb 2019
Old 02-16-2019 , 18:34   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #4

Quote:
Originally Posted by imindfreak View Post
If by card you mean map, here's what you can do.
Replace the extend function to be the "voted" function.
I have not tested this so give it a try.


PHP Code:
#include <amxmodx>

#define SELECTMAPS        6    // Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS        1    // Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND        2    // Максимальное число продлений
#define STEP_EXTEND        12    // Время продления [В минутах]
#define VOTETIME        10    // Время голосования.
#define RTV_FUNC            // Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
    #define RTV_DELAY    180    // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
    #define RTV_PERCENT    60    // Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC            // Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
    #define MAX_NOMINATE    3    // Максимум карт для номинации
    #define MAX_NOMINATE_PL    1    // Максимум карт для номинации ОДНИМ игроком
    #define MAPSMENU        // Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND            // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV            // Включает команду amx_rtv
#define SCREENFADE            // Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS            // Показывать карты в зависимости от онлайна                        

#define MAX_MAPS 1024            // Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new 
g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS 2];
new 
g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap 1;
new 
g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNumg_iMapCount;
new 
g_NextMap[32], g_sCurMap[32];
new 
bool:g_bVoteStartedbool:g_bBeInVotebool:g_bBlockExtended;
new 
g_pTimeLimitg_oldTimeLimitg_iTempTimelimit;
new 
g_pMaxSpeedg_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTimeg_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][]     = { "",    "fvox/one",    "fvox/two",    "fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
    
public plugin_init()
{
#define VERSION "2.6"
    
register_plugin("Lite MapChooser"VERSION"neygomon");
    
register_cvar("lite_chooser"VERSIONFCVAR_SERVER FCVAR_SPONLY);
    
register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND    
    
register_event("HLTV""eRoundStart""a""1=0""2=0");
#endif    
#if defined RTV_FUNC
    
register_clcmd("say rtv""clcmd_RockVote");
    
register_clcmd("say /rtv""clcmd_RockVote");
#endif
#if defined MAPSMENU
    
register_clcmd("say /maps""clcmd_Maps");
    
register_clcmd("say_team /maps""clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
    
register_clcmd("say""clcmd_Say");
#endif
#if defined AMXRTV
    
register_concmd("amx_rtv""concmd_StartVote"ADMIN_VOTE);
#endif    
    
register_clcmd("say ff""clcmd_FF");
    
register_clcmd("say nextmap""clcmd_NextMap");
    
register_clcmd("say timeleft""clcmd_TimeLeft");
    
register_clcmd("say thetime""clcmd_TheTime");
    
    
g_pTimeLimit      get_cvar_pointer("mp_timelimit");
    
g_pMaxSpeed     get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND    
    
g_pRoundTime      get_cvar_pointer("mp_roundtime");
    
g_pC4Timer     get_cvar_pointer("mp_c4timer");
#endif    
    
g_iStartMap get_systime();
}

public 
plugin_end()
{
    if(
g_oldTimeLimit)
        
set_pcvar_num(g_pTimeLimitg_oldTimeLimit);
}

public 
plugin_cfg()
{
#if defined MAPSMENU    
    
g_iMapsMenu menu_create("\d[\rNominate\d] \yВыберите карту\w""mapsmenu_handler");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Далее");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
get_mapname(g_sCurMapcharsmax(g_sCurMap));
    
LoadBlockMaps(); LoadMaps();    // грузим мапы.
    
set_task(15.0"CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
    if(!
g_bRockVoted[id]) return;
    
    
g_bRockVoted[id] = false;
    
g_iRockVote--;
}            
#endif
#if defined AMXRTV
public concmd_StartVote(idflag)
{
    if(
id)
    {
        if(!
IsValidRtv(id))
            return 
PLUGIN_HANDLED;
        if(~
get_user_flags(id) & flag
            return 
console_print(id"У вас недостаточно прав для использования этой команды!");
    }        
    if(
g_bVoteStarted
        return 
console_print(id"[BestSkill] VoteMap has already started");
    
    
console_print(id"[BestSkill] VoteMap started in new round!");
    new 
name[32]; get_user_name(idnamecharsmax(name));
    
ChatColor(0"^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!"name);
    
log_amx("Администратор %s запустил досрочное голосование"name); 
#if defined NOROUND
    
StartVoteMap(); g_bBlockExtended true;
#else            
    
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif    
    
return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим."get_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TheTime(id)
{
    static 
time[64]; get_time ("%Y/%m/%d - %H:%M:%S"timecharsmax(time));
    
ChatColor(id"^1[^4BestSkill^1] ^4Текущее время: ^3 %s"time);
    return 
PLUGIN_HANDLED;
}

public 
clcmd_NextMap(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TimeLeft(id)
{
    static 
aget_timeleft();
    if(
0ChatColor(id"^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (60), (60));    
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
    return 
PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
    if(
g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
    
    static 
iVote;
    if(!
g_bRockVoted[id])
    {
        
g_bRockVoted[id] = true;
        if((
iVote floatround(get_playersnum() * RTV_PERCENT 100.0floatround_round) - ++g_iRockVote) > 0)
        {
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d"szNameiVote);
            
log_amx("%s проголосовал за смену карты. Осталось: %d голосов."szNameiVote);
        }
        else 
        {
#if defined NOROUND
            
StartVoteMap(); g_bBlockExtended true;
#else            
            
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif            
            
ChatColor(0"^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
        }    
    }
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Вы уже голосовали!");
    return 
PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
    if(
g_bVoteStarted || g_bBeInVote
        return 
PLUGIN_CONTINUE;

    static 
szMessage[36]; 
    
read_args(szMessagecharsmax(szMessage)); 
    
remove_quotes(szMessage);
    return 
CheckValidMap(idszMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
    if(!
g_bVoteStarted && !g_bBeInVote
        
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}

public 
mapsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
        return 
PLUGIN_HANDLED;
    
    new 
_accessitem_data[1], item_name[32], callback;
    
menu_item_getinfo(menuitem_accessitem_datacharsmax(item_data), item_namecharsmax(item_name), callback);
    
CheckValidMap(iditem_name);
    return 
PLUGIN_HANDLED;
}
#endif
CheckValidMap(idmap[])
{
    static 
i;
    if(
_is_map_blocked(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
    else if(
_is_map_nominated(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
    else if((
_is_map_loaded(map)) != -1)
    {
        if(
g_iNomMap[id] == MAX_NOMINATE_PL)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
        else if(
g_iCountNom == MAX_NOMINATE)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS            
        
else if(!IsMapValidOnPlayers(iget_playersnum()))
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif            
        
else
        {
            
g_iIdMapNom[g_iCountNom] = i;
            
copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
            
g_iNomMap[id]++; g_iCountNom++;
    
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            return 
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1."szNamemap);
        }
    }
    return 
PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
    if(!
g_bVoteStarted) return;
    
g_bVoteStarted false;
    
StartVoteMap();
}
#endif

StartVoteMap()
{
    if(!
g_oldMaxSpeedg_oldMaxSpeed get_pcvar_num(g_pMaxSpeed);
    
set_pcvar_num(g_pMaxSpeed0);
#if defined SCREENFADE
    
ScreenFade(1);
#endif
    
set_task(1.0"ShowTimer"__"a"3);
    
set_task(4.0"voteNextMap");
}

public 
CheckTime()
{
    if(
g_bVoteStarted || g_bBeInVote) return;
    static 
iTimeLeftiTimeLimit
    
iTimeLeft get_timeleft();
    
iTimeLimit get_pcvar_num(g_pTimeLimit);
    if(
iTimeLeft 30 && iTimeLimit)
    {
        
g_iTempTimelimit iTimeLimit;
#if defined NOROUND    
        
StartVoteMap();
#else        
        
g_bVoteStarted true;
        if(!
g_oldTimeLimitg_oldTimeLimit iTimeLimit;
        
set_pcvar_num(g_pTimeLimitiTimeLimit get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
        
hud_lastround();
#endif    
    
}
}
    
public 
ShowTimer()
{
    static 
iTimer; if(!iTimeriTimer 3;
    
set_hudmessage(2552450, -1.00.620.01.00.10.01);
    
show_hudmessage(0"vk.com/bestskill"iTimer);
    
client_cmd(0"spk %s"g_szSound[iTimer--]);
}

public 
voteNextMap()
{
    
g_bBeInVote true;
    static 
szMenu[256], iLeniKeysaiMaxMapsiTempMapTime
    if(!
iTempMapTimeiTempMapTime g_iTempTimelimit MAX_NUMEXTEND STEP_EXTEND;
    if(!
iMaxMapsiMaxMaps = (g_iMapCount SELECTMAPS) ? g_iMapCount SELECTMAPS;

    
iLen formatex(szMenucharsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS    
    
new xplayers get_playersnum();
#endif    
    
g_iVoteMapNum iKeys 0;
    while(
g_iVoteMapNum iMaxMaps)
    {
#if defined NOMINATE_FUNC    
        
if(g_iVoteMapNum g_iCountNom)
        {
            
g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
            
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
            
iKeys |= (1<<g_iVoteMapNum++);
            continue;
        }
#endif
        
do random(g_iMapCount 1);
        while(
_is_map_in_menu(a));
        
g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
        
if(!IsMapValidOnPlayers(aplayers))
        {
            if(++
g_iMapCount) continue;
            else break;
        }    
#endif        
        
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
        
iKeys |= (1<<g_iVoteMapNum++);
    }
    if(
g_iTempTimelimit iTempMapTime && !g_bBlockExtended)
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteMapNum+1g_sCurMap);
        
iKeys |= (1<<g_iVoteMapNum);
    }
    
show_menu(0iKeysszMenuVOTETIME"MapChoose");
    
set_task(float(VOTETIME), "checkVotes");
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("Vote: Voting for the nextmap started");
    return 
PLUGIN_HANDLED;
}

public 
votemenu_handler(idiKey)
{
    static 
szName[32]; get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteMapNum)     ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"szName);
    else                 
ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"szNameg_sVoteMap[iKey]);
    
    return 
g_iVoteCount[iKey]++;
}

public 
checkVotes()
{
    new 
b;
    for(new 
aSELECTMAPS+1a++)
        if(
g_iVoteCount[b] < g_iVoteCount[a])        
            
a;        
    
    if(!
g_iVoteCount[b])
    {
        new 
map random(g_iVoteMapNum-1);
        
ChatColor(0"^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"g_sVoteMap[map]);
        
log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s"g_sVoteMap[map]);
        
copy(g_NextMapcharsmax(g_NextMap),g_sCurMap); ChangeLevel();
    }
        
//Copied the nominated function into here which was originally the extend function
    
else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
    {
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Следующая карта будет перезапущена: ^3%s"g_sCurMap);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sCurMap);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();    
    }
    else
    {        
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s"g_sVoteMap[b]);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sVoteMap[b]);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();        
    }
    
set_pcvar_num(g_pMaxSpeedg_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
    
copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
    if(
file_exists(FILE_BLOCKEDMAPS))
    {
        new 
buff[256], fp fopen(FILE_BLOCKEDMAPS"rt");
        while(
g_iLastMap BLOCK_MAPS && !feof(fp))
        {
            
fgets(fpbuffcharsmax(buff));
            if(
buff[0] != ';' && parse(buffg_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
                
g_iLastMap++;
        }
        
fclose(fp);
        
unlink(FILE_BLOCKEDMAPS);
    }
    if(
write_file(FILE_BLOCKEDMAPS"; File generated by Lite Mapchooser. Do not modify!"))
        for(new 
ig_iLastMapi++)
            
write_file(FILE_BLOCKEDMAPSg_sLastMap[i]);
}

LoadMaps()
{
    new 
buff[256], fp fopen("addons/amxmodx/configs/maps.ini""rt");
    if(!
fpset_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS    
    
new minpl[3], maxpl[3];
#endif
    
while(!feof(fp) && g_iMapCount MAX_MAPS)
    {
        
fgets(fpbuffcharsmax(buff));
        
trim(buff); remove_quotes(buff);
        if(!
buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS        
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[]), minplcharsmax(minpl), maxplcharsmax(maxpl)))
#else
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif        
        
{
            if(!
is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
            
g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
            
g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
            
menu_additem(g_iMapsMenug_sMap[g_iMapCount]);
#endif    
            
g_iMapCount++;            
        }
    }
    
fclose(fp); 
    
    if(!
g_iMapCount
        
set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
    else if(
g_iMapCount == 1)
        
set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");    
    else if(
g_iMapCount SELECTMAPS)
        
log_to_file("lite_mapchooser.log""[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]"g_iMapCountSELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
    for(new 
ig_iVoteMapNumi++)
        if(
g_iMapInMenu[i] == MapId)
            return 
true;
    return 
false;
}

bool:_is_map_blocked(map[])
{
    for(new 
ig_iLastMapi++)
        if(!
strcmp(g_sLastMap[i], map))
            return 
true;
    return 
false;    
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
    for(new 
ig_iCountNomi++)
        if(!
strcmp(g_sNomMap[i], map))
            return 
true;
    return 
false;
}

_is_map_loaded(map[])
{
    for(new 
ig_iMapCounti++)
        if(!
strcmp(g_sMap[i], map)) 
            return 
i;    
    return -
1;    
}
#endif
ChangeLevel()
{
    
message_begin(MSG_ALLSVC_INTERMISSION);
    
message_end();
    
set_task(3.0"NextMap");
}

public 
NextMap()
    
server_cmd("changelevel %s"g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
    static 
timeholdflagsmScreenFade;
    if(!
mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    
time = (<= fade <= 1) ? 4096 1;
    
hold = (<= fade <= 1) ? 1024 1;
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }    
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }    
    }
    
message_begin(MSG_BROADCASTmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}
#endif
stock hud_lastround()
{
    
set_hudmessage(1271271270.020.21030.030.00.00.53);
    
show_hudmessage(0"Последний раунд");
}

stock IsValidRtv(const id)
{
    static 
estimated_timeestimated_time = (get_systime() - g_iStartMap);
    if(
RTV_DELAY estimated_time)
    {
        static 
frmt[129], temp_time
        
_time = (temp = ((RTV_DELAY estimated_time) / 60)) < temp;
        
        if(!
_timeformatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
        else 
formatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!"_time);
        
        
ChatColor(id"^1[^4BestSkill^1] %s"frmt);
        return 
0;
    }
    return 
1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage3);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    if(
id
    {
        if(!
is_user_connected(id)) return 0;
        
players[0] = id;
        
pnum 1
    } 
    else 
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
    return 
1;


Hello dear Imindfreak, you understood me correctly, I have a bad English I tried your code and it turns out the following:
At the beginning of the voting, I choose to restart, the chat message that the card will be restarted, but the card changes to the next one.
And when I select the "restart" item the variable "mp_chattime" increases 5=>10 sec
Vaim is offline
imindfreak
Senior Member
Join Date: Oct 2007
Location: 127.0.0.1
Old 02-17-2019 , 01:37   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #5

Okay, I think I found the error. Try this instead.

PHP Code:
#include <amxmodx>

#define SELECTMAPS        6    // Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS        1    // Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND        2    // Максимальное число продлений
#define STEP_EXTEND        12    // Время продления [В минутах]
#define VOTETIME        10    // Время голосования.
#define RTV_FUNC            // Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
    #define RTV_DELAY    180    // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
    #define RTV_PERCENT    60    // Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC            // Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
    #define MAX_NOMINATE    3    // Максимум карт для номинации
    #define MAX_NOMINATE_PL    1    // Максимум карт для номинации ОДНИМ игроком
    #define MAPSMENU        // Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND            // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV            // Включает команду amx_rtv
#define SCREENFADE            // Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS            // Показывать карты в зависимости от онлайна                        

#define MAX_MAPS 1024            // Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new 
g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS 2];
new 
g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap 1;
new 
g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNumg_iMapCount;
new 
g_NextMap[32], g_sCurMap[32];
new 
bool:g_bVoteStartedbool:g_bBeInVotebool:g_bBlockExtended;
new 
g_pTimeLimitg_oldTimeLimitg_iTempTimelimit;
new 
g_pMaxSpeedg_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTimeg_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][]     = { "",    "fvox/one",    "fvox/two",    "fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
    
public plugin_init()
{
#define VERSION "2.6"
    
register_plugin("Lite MapChooser"VERSION"neygomon");
    
register_cvar("lite_chooser"VERSIONFCVAR_SERVER FCVAR_SPONLY);
    
register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND    
    
register_event("HLTV""eRoundStart""a""1=0""2=0");
#endif    
#if defined RTV_FUNC
    
register_clcmd("say rtv""clcmd_RockVote");
    
register_clcmd("say /rtv""clcmd_RockVote");
#endif
#if defined MAPSMENU
    
register_clcmd("say /maps""clcmd_Maps");
    
register_clcmd("say_team /maps""clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
    
register_clcmd("say""clcmd_Say");
#endif
#if defined AMXRTV
    
register_concmd("amx_rtv""concmd_StartVote"ADMIN_VOTE);
#endif    
    
register_clcmd("say ff""clcmd_FF");
    
register_clcmd("say nextmap""clcmd_NextMap");
    
register_clcmd("say timeleft""clcmd_TimeLeft");
    
register_clcmd("say thetime""clcmd_TheTime");
    
    
g_pTimeLimit      get_cvar_pointer("mp_timelimit");
    
g_pMaxSpeed     get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND    
    
g_pRoundTime      get_cvar_pointer("mp_roundtime");
    
g_pC4Timer     get_cvar_pointer("mp_c4timer");
#endif    
    
g_iStartMap get_systime();
}

public 
plugin_end()
{
    if(
g_oldTimeLimit)
        
set_pcvar_num(g_pTimeLimitg_oldTimeLimit);
}

public 
plugin_cfg()
{
#if defined MAPSMENU    
    
g_iMapsMenu menu_create("\d[\rNominate\d] \yВыберите карту\w""mapsmenu_handler");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Далее");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
get_mapname(g_sCurMapcharsmax(g_sCurMap));
    
LoadBlockMaps(); LoadMaps();    // грузим мапы.
    
set_task(15.0"CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
    if(!
g_bRockVoted[id]) return;
    
    
g_bRockVoted[id] = false;
    
g_iRockVote--;
}            
#endif
#if defined AMXRTV
public concmd_StartVote(idflag)
{
    if(
id)
    {
        if(!
IsValidRtv(id))
            return 
PLUGIN_HANDLED;
        if(~
get_user_flags(id) & flag
            return 
console_print(id"У вас недостаточно прав для использования этой команды!");
    }        
    if(
g_bVoteStarted
        return 
console_print(id"[BestSkill] VoteMap has already started");
    
    
console_print(id"[BestSkill] VoteMap started in new round!");
    new 
name[32]; get_user_name(idnamecharsmax(name));
    
ChatColor(0"^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!"name);
    
log_amx("Администратор %s запустил досрочное голосование"name); 
#if defined NOROUND
    
StartVoteMap(); g_bBlockExtended true;
#else            
    
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif    
    
return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим."get_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TheTime(id)
{
    static 
time[64]; get_time ("%Y/%m/%d - %H:%M:%S"timecharsmax(time));
    
ChatColor(id"^1[^4BestSkill^1] ^4Текущее время: ^3 %s"time);
    return 
PLUGIN_HANDLED;
}

public 
clcmd_NextMap(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TimeLeft(id)
{
    static 
aget_timeleft();
    if(
0ChatColor(id"^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (60), (60));    
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
    return 
PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
    if(
g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
    
    static 
iVote;
    if(!
g_bRockVoted[id])
    {
        
g_bRockVoted[id] = true;
        if((
iVote floatround(get_playersnum() * RTV_PERCENT 100.0floatround_round) - ++g_iRockVote) > 0)
        {
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d"szNameiVote);
            
log_amx("%s проголосовал за смену карты. Осталось: %d голосов."szNameiVote);
        }
        else 
        {
#if defined NOROUND
            
StartVoteMap(); g_bBlockExtended true;
#else            
            
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif            
            
ChatColor(0"^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
        }    
    }
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Вы уже голосовали!");
    return 
PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
    if(
g_bVoteStarted || g_bBeInVote
        return 
PLUGIN_CONTINUE;

    static 
szMessage[36]; 
    
read_args(szMessagecharsmax(szMessage)); 
    
remove_quotes(szMessage);
    return 
CheckValidMap(idszMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
    if(!
g_bVoteStarted && !g_bBeInVote
        
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}

public 
mapsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
        return 
PLUGIN_HANDLED;
    
    new 
_accessitem_data[1], item_name[32], callback;
    
menu_item_getinfo(menuitem_accessitem_datacharsmax(item_data), item_namecharsmax(item_name), callback);
    
CheckValidMap(iditem_name);
    return 
PLUGIN_HANDLED;
}
#endif
CheckValidMap(idmap[])
{
    static 
i;
    if(
_is_map_blocked(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
    else if(
_is_map_nominated(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
    else if((
_is_map_loaded(map)) != -1)
    {
        if(
g_iNomMap[id] == MAX_NOMINATE_PL)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
        else if(
g_iCountNom == MAX_NOMINATE)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS            
        
else if(!IsMapValidOnPlayers(iget_playersnum()))
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif            
        
else
        {
            
g_iIdMapNom[g_iCountNom] = i;
            
copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
            
g_iNomMap[id]++; g_iCountNom++;
    
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            return 
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1."szNamemap);
        }
    }
    return 
PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
    if(!
g_bVoteStarted) return;
    
g_bVoteStarted false;
    
StartVoteMap();
}
#endif

StartVoteMap()
{
    if(!
g_oldMaxSpeedg_oldMaxSpeed get_pcvar_num(g_pMaxSpeed);
    
set_pcvar_num(g_pMaxSpeed0);
#if defined SCREENFADE
    
ScreenFade(1);
#endif
    
set_task(1.0"ShowTimer"__"a"3);
    
set_task(4.0"voteNextMap");
}

public 
CheckTime()
{
    if(
g_bVoteStarted || g_bBeInVote) return;
    static 
iTimeLeftiTimeLimit
    
iTimeLeft get_timeleft();
    
iTimeLimit get_pcvar_num(g_pTimeLimit);
    if(
iTimeLeft 30 && iTimeLimit)
    {
        
g_iTempTimelimit iTimeLimit;
#if defined NOROUND    
        
StartVoteMap();
#else        
        
g_bVoteStarted true;
        if(!
g_oldTimeLimitg_oldTimeLimit iTimeLimit;
        
set_pcvar_num(g_pTimeLimitiTimeLimit get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
        
hud_lastround();
#endif    
    
}
}
    
public 
ShowTimer()
{
    static 
iTimer; if(!iTimeriTimer 3;
    
set_hudmessage(2552450, -1.00.620.01.00.10.01);
    
show_hudmessage(0"vk.com/bestskill"iTimer);
    
client_cmd(0"spk %s"g_szSound[iTimer--]);
}

public 
voteNextMap()
{
    
g_bBeInVote true;
    static 
szMenu[256], iLeniKeysaiMaxMapsiTempMapTime
    if(!
iTempMapTimeiTempMapTime g_iTempTimelimit MAX_NUMEXTEND STEP_EXTEND;
    if(!
iMaxMapsiMaxMaps = (g_iMapCount SELECTMAPS) ? g_iMapCount SELECTMAPS;

    
iLen formatex(szMenucharsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS    
    
new xplayers get_playersnum();
#endif    
    
g_iVoteMapNum iKeys 0;
    while(
g_iVoteMapNum iMaxMaps)
    {
#if defined NOMINATE_FUNC    
        
if(g_iVoteMapNum g_iCountNom)
        {
            
g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
            
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
            
iKeys |= (1<<g_iVoteMapNum++);
            continue;
        }
#endif
        
do random(g_iMapCount 1);
        while(
_is_map_in_menu(a));
        
g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
        
if(!IsMapValidOnPlayers(aplayers))
        {
            if(++
g_iMapCount) continue;
            else break;
        }    
#endif        
        
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
        
iKeys |= (1<<g_iVoteMapNum++);
    }
    if(
g_iTempTimelimit iTempMapTime && !g_bBlockExtended)
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteMapNum+1g_sCurMap);
        
iKeys |= (1<<g_iVoteMapNum);
    }
    
show_menu(0iKeysszMenuVOTETIME"MapChoose");
    
set_task(float(VOTETIME), "checkVotes");
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("Vote: Voting for the nextmap started");
    return 
PLUGIN_HANDLED;
}

public 
votemenu_handler(idiKey)
{
    static 
szName[32]; get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteMapNum)     ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"szName);
    else                 
ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"szNameg_sVoteMap[iKey]);
    
    return 
g_iVoteCount[iKey]++;
}

public 
checkVotes()
{
    new 
b;
    for(new 
aSELECTMAPS+1a++)
        if(
g_iVoteCount[b] < g_iVoteCount[a])        
            
a;        
    
    if(!
g_iVoteCount[b])
    {
        new 
map random(g_iVoteMapNum-1);
        
ChatColor(0"^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"g_sVoteMap[map]);
        
log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s"g_sVoteMap[map]);
        
copy(g_NextMapcharsmax(g_NextMap),g_sCurMap); ChangeLevel();
    }
        
//Copied the nominated function into here which was originally the extend function
    
else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
    {
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Следующая карта будет перезапущена: ^3%s"g_sCurMap);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sCurMap);
        
copy(g_NextMapcharsmax(g_NextMap), g_sCurMap); ChangeLevel();    
    }
    else
    {        
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s"g_sVoteMap[b]);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sVoteMap[b]);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();        
    }
    
set_pcvar_num(g_pMaxSpeedg_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
    
copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
    if(
file_exists(FILE_BLOCKEDMAPS))
    {
        new 
buff[256], fp fopen(FILE_BLOCKEDMAPS"rt");
        while(
g_iLastMap BLOCK_MAPS && !feof(fp))
        {
            
fgets(fpbuffcharsmax(buff));
            if(
buff[0] != ';' && parse(buffg_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
                
g_iLastMap++;
        }
        
fclose(fp);
        
unlink(FILE_BLOCKEDMAPS);
    }
    if(
write_file(FILE_BLOCKEDMAPS"; File generated by Lite Mapchooser. Do not modify!"))
        for(new 
ig_iLastMapi++)
            
write_file(FILE_BLOCKEDMAPSg_sLastMap[i]);
}

LoadMaps()
{
    new 
buff[256], fp fopen("addons/amxmodx/configs/maps.ini""rt");
    if(!
fpset_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS    
    
new minpl[3], maxpl[3];
#endif
    
while(!feof(fp) && g_iMapCount MAX_MAPS)
    {
        
fgets(fpbuffcharsmax(buff));
        
trim(buff); remove_quotes(buff);
        if(!
buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS        
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[]), minplcharsmax(minpl), maxplcharsmax(maxpl)))
#else
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif        
        
{
            if(!
is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
            
g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
            
g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
            
menu_additem(g_iMapsMenug_sMap[g_iMapCount]);
#endif    
            
g_iMapCount++;            
        }
    }
    
fclose(fp); 
    
    if(!
g_iMapCount
        
set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
    else if(
g_iMapCount == 1)
        
set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");    
    else if(
g_iMapCount SELECTMAPS)
        
log_to_file("lite_mapchooser.log""[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]"g_iMapCountSELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
    for(new 
ig_iVoteMapNumi++)
        if(
g_iMapInMenu[i] == MapId)
            return 
true;
    return 
false;
}

bool:_is_map_blocked(map[])
{
    for(new 
ig_iLastMapi++)
        if(!
strcmp(g_sLastMap[i], map))
            return 
true;
    return 
false;    
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
    for(new 
ig_iCountNomi++)
        if(!
strcmp(g_sNomMap[i], map))
            return 
true;
    return 
false;
}

_is_map_loaded(map[])
{
    for(new 
ig_iMapCounti++)
        if(!
strcmp(g_sMap[i], map)) 
            return 
i;    
    return -
1;    
}
#endif
ChangeLevel()
{
    
message_begin(MSG_ALLSVC_INTERMISSION);
    
message_end();
    
set_task(3.0"NextMap");
}

public 
NextMap()
    
server_cmd("changelevel %s"g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
    static 
timeholdflagsmScreenFade;
    if(!
mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    
time = (<= fade <= 1) ? 4096 1;
    
hold = (<= fade <= 1) ? 1024 1;
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }    
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }    
    }
    
message_begin(MSG_BROADCASTmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}
#endif
stock hud_lastround()
{
    
set_hudmessage(1271271270.020.21030.030.00.00.53);
    
show_hudmessage(0"Последний раунд");
}

stock IsValidRtv(const id)
{
    static 
estimated_timeestimated_time = (get_systime() - g_iStartMap);
    if(
RTV_DELAY estimated_time)
    {
        static 
frmt[129], temp_time
        
_time = (temp = ((RTV_DELAY estimated_time) / 60)) < temp;
        
        if(!
_timeformatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
        else 
formatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!"_time);
        
        
ChatColor(id"^1[^4BestSkill^1] %s"frmt);
        return 
0;
    }
    return 
1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage3);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    if(
id
    {
        if(!
is_user_connected(id)) return 0;
        
players[0] = id;
        
pnum 1
    } 
    else 
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
    return 
1;

__________________
BeastGaming Community - Map Maker & Coder.
imindfreak is offline
Vaim
Member
Join Date: Feb 2019
Old 02-17-2019 , 02:11   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #6

Quote:
Originally Posted by imindfreak View Post
Okay, I think I found the error. Try this instead.

PHP Code:
#include <amxmodx>

#define SELECTMAPS        6    // Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS        1    // Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND        2    // Максимальное число продлений
#define STEP_EXTEND        12    // Время продления [В минутах]
#define VOTETIME        10    // Время голосования.
#define RTV_FUNC            // Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
    #define RTV_DELAY    180    // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
    #define RTV_PERCENT    60    // Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC            // Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
    #define MAX_NOMINATE    3    // Максимум карт для номинации
    #define MAX_NOMINATE_PL    1    // Максимум карт для номинации ОДНИМ игроком
    #define MAPSMENU        // Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND            // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV            // Включает команду amx_rtv
#define SCREENFADE            // Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS            // Показывать карты в зависимости от онлайна                        

#define MAX_MAPS 1024            // Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new 
g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS 2];
new 
g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap 1;
new 
g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNumg_iMapCount;
new 
g_NextMap[32], g_sCurMap[32];
new 
bool:g_bVoteStartedbool:g_bBeInVotebool:g_bBlockExtended;
new 
g_pTimeLimitg_oldTimeLimitg_iTempTimelimit;
new 
g_pMaxSpeedg_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTimeg_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][]     = { "",    "fvox/one",    "fvox/two",    "fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
    
public plugin_init()
{
#define VERSION "2.6"
    
register_plugin("Lite MapChooser"VERSION"neygomon");
    
register_cvar("lite_chooser"VERSIONFCVAR_SERVER FCVAR_SPONLY);
    
register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND    
    
register_event("HLTV""eRoundStart""a""1=0""2=0");
#endif    
#if defined RTV_FUNC
    
register_clcmd("say rtv""clcmd_RockVote");
    
register_clcmd("say /rtv""clcmd_RockVote");
#endif
#if defined MAPSMENU
    
register_clcmd("say /maps""clcmd_Maps");
    
register_clcmd("say_team /maps""clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
    
register_clcmd("say""clcmd_Say");
#endif
#if defined AMXRTV
    
register_concmd("amx_rtv""concmd_StartVote"ADMIN_VOTE);
#endif    
    
register_clcmd("say ff""clcmd_FF");
    
register_clcmd("say nextmap""clcmd_NextMap");
    
register_clcmd("say timeleft""clcmd_TimeLeft");
    
register_clcmd("say thetime""clcmd_TheTime");
    
    
g_pTimeLimit      get_cvar_pointer("mp_timelimit");
    
g_pMaxSpeed     get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND    
    
g_pRoundTime      get_cvar_pointer("mp_roundtime");
    
g_pC4Timer     get_cvar_pointer("mp_c4timer");
#endif    
    
g_iStartMap get_systime();
}

public 
plugin_end()
{
    if(
g_oldTimeLimit)
        
set_pcvar_num(g_pTimeLimitg_oldTimeLimit);
}

public 
plugin_cfg()
{
#if defined MAPSMENU    
    
g_iMapsMenu menu_create("\d[\rNominate\d] \yВыберите карту\w""mapsmenu_handler");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Далее");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
get_mapname(g_sCurMapcharsmax(g_sCurMap));
    
LoadBlockMaps(); LoadMaps();    // грузим мапы.
    
set_task(15.0"CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
    if(!
g_bRockVoted[id]) return;
    
    
g_bRockVoted[id] = false;
    
g_iRockVote--;
}            
#endif
#if defined AMXRTV
public concmd_StartVote(idflag)
{
    if(
id)
    {
        if(!
IsValidRtv(id))
            return 
PLUGIN_HANDLED;
        if(~
get_user_flags(id) & flag
            return 
console_print(id"У вас недостаточно прав для использования этой команды!");
    }        
    if(
g_bVoteStarted
        return 
console_print(id"[BestSkill] VoteMap has already started");
    
    
console_print(id"[BestSkill] VoteMap started in new round!");
    new 
name[32]; get_user_name(idnamecharsmax(name));
    
ChatColor(0"^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!"name);
    
log_amx("Администратор %s запустил досрочное голосование"name); 
#if defined NOROUND
    
StartVoteMap(); g_bBlockExtended true;
#else            
    
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif    
    
return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим."get_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TheTime(id)
{
    static 
time[64]; get_time ("%Y/%m/%d - %H:%M:%S"timecharsmax(time));
    
ChatColor(id"^1[^4BestSkill^1] ^4Текущее время: ^3 %s"time);
    return 
PLUGIN_HANDLED;
}

public 
clcmd_NextMap(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TimeLeft(id)
{
    static 
aget_timeleft();
    if(
0ChatColor(id"^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (60), (60));    
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
    return 
PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
    if(
g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
    
    static 
iVote;
    if(!
g_bRockVoted[id])
    {
        
g_bRockVoted[id] = true;
        if((
iVote floatround(get_playersnum() * RTV_PERCENT 100.0floatround_round) - ++g_iRockVote) > 0)
        {
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d"szNameiVote);
            
log_amx("%s проголосовал за смену карты. Осталось: %d голосов."szNameiVote);
        }
        else 
        {
#if defined NOROUND
            
StartVoteMap(); g_bBlockExtended true;
#else            
            
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif            
            
ChatColor(0"^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
        }    
    }
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Вы уже голосовали!");
    return 
PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
    if(
g_bVoteStarted || g_bBeInVote
        return 
PLUGIN_CONTINUE;

    static 
szMessage[36]; 
    
read_args(szMessagecharsmax(szMessage)); 
    
remove_quotes(szMessage);
    return 
CheckValidMap(idszMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
    if(!
g_bVoteStarted && !g_bBeInVote
        
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}

public 
mapsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
        return 
PLUGIN_HANDLED;
    
    new 
_accessitem_data[1], item_name[32], callback;
    
menu_item_getinfo(menuitem_accessitem_datacharsmax(item_data), item_namecharsmax(item_name), callback);
    
CheckValidMap(iditem_name);
    return 
PLUGIN_HANDLED;
}
#endif
CheckValidMap(idmap[])
{
    static 
i;
    if(
_is_map_blocked(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
    else if(
_is_map_nominated(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
    else if((
_is_map_loaded(map)) != -1)
    {
        if(
g_iNomMap[id] == MAX_NOMINATE_PL)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
        else if(
g_iCountNom == MAX_NOMINATE)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS            
        
else if(!IsMapValidOnPlayers(iget_playersnum()))
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif            
        
else
        {
            
g_iIdMapNom[g_iCountNom] = i;
            
copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
            
g_iNomMap[id]++; g_iCountNom++;
    
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            return 
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1."szNamemap);
        }
    }
    return 
PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
    if(!
g_bVoteStarted) return;
    
g_bVoteStarted false;
    
StartVoteMap();
}
#endif

StartVoteMap()
{
    if(!
g_oldMaxSpeedg_oldMaxSpeed get_pcvar_num(g_pMaxSpeed);
    
set_pcvar_num(g_pMaxSpeed0);
#if defined SCREENFADE
    
ScreenFade(1);
#endif
    
set_task(1.0"ShowTimer"__"a"3);
    
set_task(4.0"voteNextMap");
}

public 
CheckTime()
{
    if(
g_bVoteStarted || g_bBeInVote) return;
    static 
iTimeLeftiTimeLimit
    
iTimeLeft get_timeleft();
    
iTimeLimit get_pcvar_num(g_pTimeLimit);
    if(
iTimeLeft 30 && iTimeLimit)
    {
        
g_iTempTimelimit iTimeLimit;
#if defined NOROUND    
        
StartVoteMap();
#else        
        
g_bVoteStarted true;
        if(!
g_oldTimeLimitg_oldTimeLimit iTimeLimit;
        
set_pcvar_num(g_pTimeLimitiTimeLimit get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
        
hud_lastround();
#endif    
    
}
}
    
public 
ShowTimer()
{
    static 
iTimer; if(!iTimeriTimer 3;
    
set_hudmessage(2552450, -1.00.620.01.00.10.01);
    
show_hudmessage(0"vk.com/bestskill"iTimer);
    
client_cmd(0"spk %s"g_szSound[iTimer--]);
}

public 
voteNextMap()
{
    
g_bBeInVote true;
    static 
szMenu[256], iLeniKeysaiMaxMapsiTempMapTime
    if(!
iTempMapTimeiTempMapTime g_iTempTimelimit MAX_NUMEXTEND STEP_EXTEND;
    if(!
iMaxMapsiMaxMaps = (g_iMapCount SELECTMAPS) ? g_iMapCount SELECTMAPS;

    
iLen formatex(szMenucharsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS    
    
new xplayers get_playersnum();
#endif    
    
g_iVoteMapNum iKeys 0;
    while(
g_iVoteMapNum iMaxMaps)
    {
#if defined NOMINATE_FUNC    
        
if(g_iVoteMapNum g_iCountNom)
        {
            
g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
            
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
            
iKeys |= (1<<g_iVoteMapNum++);
            continue;
        }
#endif
        
do random(g_iMapCount 1);
        while(
_is_map_in_menu(a));
        
g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
        
if(!IsMapValidOnPlayers(aplayers))
        {
            if(++
g_iMapCount) continue;
            else break;
        }    
#endif        
        
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
        
iKeys |= (1<<g_iVoteMapNum++);
    }
    if(
g_iTempTimelimit iTempMapTime && !g_bBlockExtended)
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteMapNum+1g_sCurMap);
        
iKeys |= (1<<g_iVoteMapNum);
    }
    
show_menu(0iKeysszMenuVOTETIME"MapChoose");
    
set_task(float(VOTETIME), "checkVotes");
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("Vote: Voting for the nextmap started");
    return 
PLUGIN_HANDLED;
}

public 
votemenu_handler(idiKey)
{
    static 
szName[32]; get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteMapNum)     ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"szName);
    else                 
ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"szNameg_sVoteMap[iKey]);
    
    return 
g_iVoteCount[iKey]++;
}

public 
checkVotes()
{
    new 
b;
    for(new 
aSELECTMAPS+1a++)
        if(
g_iVoteCount[b] < g_iVoteCount[a])        
            
a;        
    
    if(!
g_iVoteCount[b])
    {
        new 
map random(g_iVoteMapNum-1);
        
ChatColor(0"^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"g_sVoteMap[map]);
        
log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s"g_sVoteMap[map]);
        
copy(g_NextMapcharsmax(g_NextMap),g_sCurMap); ChangeLevel();
    }
        
//Copied the nominated function into here which was originally the extend function
    
else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
    {
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Следующая карта будет перезапущена: ^3%s"g_sCurMap);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sCurMap);
        
copy(g_NextMapcharsmax(g_NextMap), g_sCurMap); ChangeLevel();    
    }
    else
    {        
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s"g_sVoteMap[b]);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sVoteMap[b]);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();        
    }
    
set_pcvar_num(g_pMaxSpeedg_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
    
copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
    if(
file_exists(FILE_BLOCKEDMAPS))
    {
        new 
buff[256], fp fopen(FILE_BLOCKEDMAPS"rt");
        while(
g_iLastMap BLOCK_MAPS && !feof(fp))
        {
            
fgets(fpbuffcharsmax(buff));
            if(
buff[0] != ';' && parse(buffg_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
                
g_iLastMap++;
        }
        
fclose(fp);
        
unlink(FILE_BLOCKEDMAPS);
    }
    if(
write_file(FILE_BLOCKEDMAPS"; File generated by Lite Mapchooser. Do not modify!"))
        for(new 
ig_iLastMapi++)
            
write_file(FILE_BLOCKEDMAPSg_sLastMap[i]);
}

LoadMaps()
{
    new 
buff[256], fp fopen("addons/amxmodx/configs/maps.ini""rt");
    if(!
fpset_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS    
    
new minpl[3], maxpl[3];
#endif
    
while(!feof(fp) && g_iMapCount MAX_MAPS)
    {
        
fgets(fpbuffcharsmax(buff));
        
trim(buff); remove_quotes(buff);
        if(!
buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS        
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[]), minplcharsmax(minpl), maxplcharsmax(maxpl)))
#else
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif        
        
{
            if(!
is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
            
g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
            
g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
            
menu_additem(g_iMapsMenug_sMap[g_iMapCount]);
#endif    
            
g_iMapCount++;            
        }
    }
    
fclose(fp); 
    
    if(!
g_iMapCount
        
set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
    else if(
g_iMapCount == 1)
        
set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");    
    else if(
g_iMapCount SELECTMAPS)
        
log_to_file("lite_mapchooser.log""[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]"g_iMapCountSELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
    for(new 
ig_iVoteMapNumi++)
        if(
g_iMapInMenu[i] == MapId)
            return 
true;
    return 
false;
}

bool:_is_map_blocked(map[])
{
    for(new 
ig_iLastMapi++)
        if(!
strcmp(g_sLastMap[i], map))
            return 
true;
    return 
false;    
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
    for(new 
ig_iCountNomi++)
        if(!
strcmp(g_sNomMap[i], map))
            return 
true;
    return 
false;
}

_is_map_loaded(map[])
{
    for(new 
ig_iMapCounti++)
        if(!
strcmp(g_sMap[i], map)) 
            return 
i;    
    return -
1;    
}
#endif
ChangeLevel()
{
    
message_begin(MSG_ALLSVC_INTERMISSION);
    
message_end();
    
set_task(3.0"NextMap");
}

public 
NextMap()
    
server_cmd("changelevel %s"g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
    static 
timeholdflagsmScreenFade;
    if(!
mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    
time = (<= fade <= 1) ? 4096 1;
    
hold = (<= fade <= 1) ? 1024 1;
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }    
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }    
    }
    
message_begin(MSG_BROADCASTmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}
#endif
stock hud_lastround()
{
    
set_hudmessage(1271271270.020.21030.030.00.00.53);
    
show_hudmessage(0"Последний раунд");
}

stock IsValidRtv(const id)
{
    static 
estimated_timeestimated_time = (get_systime() - g_iStartMap);
    if(
RTV_DELAY estimated_time)
    {
        static 
frmt[129], temp_time
        
_time = (temp = ((RTV_DELAY estimated_time) / 60)) < temp;
        
        if(!
_timeformatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
        else 
formatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!"_time);
        
        
ChatColor(id"^1[^4BestSkill^1] %s"frmt);
        return 
0;
    }
    return 
1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage3);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    if(
id
    {
        if(!
is_user_connected(id)) return 0;
        
players[0] = id;
        
pnum 1
    } 
    else 
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
    return 
1;

Everything works fine
Imindfreak, thank you very much))
you helped me a lot
Vaim is offline
Vaim
Member
Join Date: Feb 2019
Old 02-17-2019 , 02:23   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #7

please tell me what was the error?
Vaim is offline
Vaim
Member
Join Date: Feb 2019
Old 02-17-2019 , 07:26   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #8

Quote:
Originally Posted by imindfreak View Post
Okay, I think I found the error. Try this instead.

PHP Code:
#include <amxmodx>

#define SELECTMAPS        6    // Количество карт в голосовании. Не ставить больше 8!
#define BLOCK_MAPS        1    // Количество последних сыгранных карт, которые не будут выставлены на голосование.
#define MAX_NUMEXTEND        2    // Максимальное число продлений
#define STEP_EXTEND        12    // Время продления [В минутах]
#define VOTETIME        10    // Время голосования.
#define RTV_FUNC            // Функция досрочного голосования. Закоментируйте, если не требуется;)
#if defined RTV_FUNC
    #define RTV_DELAY    180    // Через какое время от начала карты можно пользоваться функцией rtv. [В секундах... 60 = 1 минута]
    #define RTV_PERCENT    60    // Сколько процентов надо набрать, чтобы запустить досрочную смену карты.
#endif
#define NOMINATE_FUNC            // Функция номинации карт. Раскомментируйте если требуется;)
#if defined NOMINATE_FUNC
    #define MAX_NOMINATE    3    // Максимум карт для номинации
    #define MAX_NOMINATE_PL    1    // Максимум карт для номинации ОДНИМ игроком
    #define MAPSMENU        // Команда /maps в чате. Работает только при #define NOMINATE_FUNC
#endif
#define NOROUND            // Поддержка бесконечных раундов. Аля CSDM, GunGame сервера
//#define AMXRTV            // Включает команду amx_rtv
#define SCREENFADE            // Затемнять экран на время голосование(плавно :D)
#define MAP_ON_PLAYERS            // Показывать карты в зависимости от онлайна                        

#define MAX_MAPS 1024            // Максимум карт. Если надо, укажите больше. Но я б не стал...

#if defined NOMINATE_FUNC
new g_iNomMap[33], g_iIdMapNom[MAX_NOMINATE+1], g_iCountNom;
new 
g_sNomMap[MAX_NOMINATE+1][32];
#endif
#if defined MAPSMENU
new g_iMapsMenu;
#endif
new g_sVoteMap[SELECTMAPS+2][32], g_iMapInMenu[SELECTMAPS+1], g_iVoteCount[SELECTMAPS 2];
new 
g_sLastMap[BLOCK_MAPS+1][32], g_iLastMap 1;
new 
g_sMap[MAX_MAPS][32];
#if defined MAP_ON_PLAYERS
new g_MapPlayerData[MAX_MAPS][3];
#endif
new g_iVoteMapNumg_iMapCount;
new 
g_NextMap[32], g_sCurMap[32];
new 
bool:g_bVoteStartedbool:g_bBeInVotebool:g_bBlockExtended;
new 
g_pTimeLimitg_oldTimeLimitg_iTempTimelimit;
new 
g_pMaxSpeedg_oldMaxSpeed;
#if !defined NOROUND
new g_pRoundTimeg_pC4Timer;
#endif
new g_iStartMap;
#if defined RTV_FUNC
new bool:g_bRockVoted[33], g_iRockVote;
#endif
new const g_szSound[][]     = { "",    "fvox/one",    "fvox/two",    "fvox/three" };
#define IsMapValidOnPlayers(%0,%1) (g_MapPlayerData[%0][1] <= %1 <= g_MapPlayerData[%0][2])
    
public plugin_init()
{
#define VERSION "2.6"
    
register_plugin("Lite MapChooser"VERSION"neygomon");
    
register_cvar("lite_chooser"VERSIONFCVAR_SERVER FCVAR_SPONLY);
    
register_menucmd(register_menuid("MapChoose"), (-1^(-1<<(SELECTMAPS+2))), "votemenu_handler")
#if !defined NOROUND    
    
register_event("HLTV""eRoundStart""a""1=0""2=0");
#endif    
#if defined RTV_FUNC
    
register_clcmd("say rtv""clcmd_RockVote");
    
register_clcmd("say /rtv""clcmd_RockVote");
#endif
#if defined MAPSMENU
    
register_clcmd("say /maps""clcmd_Maps");
    
register_clcmd("say_team /maps""clcmd_Maps");
#endif
#if defined NOMINATE_FUNC
    
register_clcmd("say""clcmd_Say");
#endif
#if defined AMXRTV
    
register_concmd("amx_rtv""concmd_StartVote"ADMIN_VOTE);
#endif    
    
register_clcmd("say ff""clcmd_FF");
    
register_clcmd("say nextmap""clcmd_NextMap");
    
register_clcmd("say timeleft""clcmd_TimeLeft");
    
register_clcmd("say thetime""clcmd_TheTime");
    
    
g_pTimeLimit      get_cvar_pointer("mp_timelimit");
    
g_pMaxSpeed     get_cvar_pointer("sv_maxspeed");
#if !defined NOROUND    
    
g_pRoundTime      get_cvar_pointer("mp_roundtime");
    
g_pC4Timer     get_cvar_pointer("mp_c4timer");
#endif    
    
g_iStartMap get_systime();
}

public 
plugin_end()
{
    if(
g_oldTimeLimit)
        
set_pcvar_num(g_pTimeLimitg_oldTimeLimit);
}

public 
plugin_cfg()
{
#if defined MAPSMENU    
    
g_iMapsMenu menu_create("\d[\rNominate\d] \yВыберите карту\w""mapsmenu_handler");
    
menu_setprop(g_iMapsMenuMPROP_EXITNAME"Выход");
    
menu_setprop(g_iMapsMenuMPROP_NEXTNAME"Далее");
    
menu_setprop(g_iMapsMenuMPROP_BACKNAME"Назад");
#endif
    
get_mapname(g_sCurMapcharsmax(g_sCurMap));
    
LoadBlockMaps(); LoadMaps();    // грузим мапы.
    
set_task(15.0"CheckTime", .flags="b");
}
#if defined RTV_FUNC
public client_disconnected(id)
{
    if(!
g_bRockVoted[id]) return;
    
    
g_bRockVoted[id] = false;
    
g_iRockVote--;
}            
#endif
#if defined AMXRTV
public concmd_StartVote(idflag)
{
    if(
id)
    {
        if(!
IsValidRtv(id))
            return 
PLUGIN_HANDLED;
        if(~
get_user_flags(id) & flag
            return 
console_print(id"У вас недостаточно прав для использования этой команды!");
    }        
    if(
g_bVoteStarted
        return 
console_print(id"[BestSkill] VoteMap has already started");
    
    
console_print(id"[BestSkill] VoteMap started in new round!");
    new 
name[32]; get_user_name(idnamecharsmax(name));
    
ChatColor(0"^1[^4BestSkill^1] ^4Администратор ^3%s ^4запустил ^3досрочное ^4голосование!"name);
    
log_amx("Администратор %s запустил досрочное голосование"name); 
#if defined NOROUND
    
StartVoteMap(); g_bBlockExtended true;
#else            
    
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif    
    
return PLUGIN_HANDLED;
}
#endif
public clcmd_FF(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4На сервере ^3%s ^4огонь по своим."get_cvar_num("mp_friendlyfire") ? "разрешен" "запрещен");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TheTime(id)
{
    static 
time[64]; get_time ("%Y/%m/%d - %H:%M:%S"timecharsmax(time));
    
ChatColor(id"^1[^4BestSkill^1] ^4Текущее время: ^3 %s"time);
    return 
PLUGIN_HANDLED;
}

public 
clcmd_NextMap(id)
{
    
ChatColor(id"^1[^4BestSkill^1] ^4Следующая карта еще ^3не определена ^1:(");
    return 
PLUGIN_HANDLED;
}    

public 
clcmd_TimeLeft(id)
{
    static 
aget_timeleft();
    if(
0ChatColor(id"^1[^4BestSkill^1] ^4До конца карты осталось: ^3%d:%02d", (60), (60));    
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не ограничена ^4по времени.");
    return 
PLUGIN_HANDLED;
}
#if defined RTV_FUNC
public clcmd_RockVote(id)
{
    if(
g_bVoteStarted || g_bBeInVote || !IsValidRtv(id)) return PLUGIN_HANDLED;
    
    static 
iVote;
    if(!
g_bRockVoted[id])
    {
        
g_bRockVoted[id] = true;
        if((
iVote floatround(get_playersnum() * RTV_PERCENT 100.0floatround_round) - ++g_iRockVote) > 0)
        {
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4проголосовал за смену карты. Осталось голосов: ^3%d"szNameiVote);
            
log_amx("%s проголосовал за смену карты. Осталось: %d голосов."szNameiVote);
        }
        else 
        {
#if defined NOROUND
            
StartVoteMap(); g_bBlockExtended true;
#else            
            
g_bVoteStarted g_bBlockExtended truehud_lastround();
#endif            
            
ChatColor(0"^1[^4BestSkill^1] ^4Все голоса за досрочную смену карты набраны.");
        }    
    }
    else 
ChatColor(id"^1[^4BestSkill^1] ^4Вы уже голосовали!");
    return 
PLUGIN_HANDLED;
}
#endif
#if defined NOMINATE_FUNC
public clcmd_Say(id)
{
    if(
g_bVoteStarted || g_bBeInVote
        return 
PLUGIN_CONTINUE;

    static 
szMessage[36]; 
    
read_args(szMessagecharsmax(szMessage)); 
    
remove_quotes(szMessage);
    return 
CheckValidMap(idszMessage);
}
#if defined MAPSMENU
public clcmd_Maps(id)
{
    if(!
g_bVoteStarted && !g_bBeInVote
        
menu_display(idg_iMapsMenu0);
    return 
PLUGIN_HANDLED;
}

public 
mapsmenu_handler(idmenuitem)
{
    if(
item == MENU_EXIT)
        return 
PLUGIN_HANDLED;
    
    new 
_accessitem_data[1], item_name[32], callback;
    
menu_item_getinfo(menuitem_accessitem_datacharsmax(item_data), item_namecharsmax(item_name), callback);
    
CheckValidMap(iditem_name);
    return 
PLUGIN_HANDLED;
}
#endif
CheckValidMap(idmap[])
{
    static 
i;
    if(
_is_map_blocked(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эту карту ^3недавно ^4играли!");
    else if(
_is_map_nominated(map))
        return 
ChatColor(id"^1[^4BestSkill^1] ^4Эта карта уже номинирована!");
    else if((
_is_map_loaded(map)) != -1)
    {
        if(
g_iNomMap[id] == MAX_NOMINATE_PL)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Вы больше ^3не можете ^4номинировать карт!");
        else if(
g_iCountNom == MAX_NOMINATE)
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Уже номинировано ^3максимальное ^4число карт!");
#if defined MAP_ON_PLAYERS            
        
else if(!IsMapValidOnPlayers(iget_playersnum()))
            return 
ChatColor(id"^1[^4BestSkill^1] ^4Карта ^3не подходит ^4для текущего онлайна!");
#endif            
        
else
        {
            
g_iIdMapNom[g_iCountNom] = i;
            
copy(g_sNomMap[g_iCountNom], charsmax(g_sNomMap[]), map);
            
g_iNomMap[id]++; g_iCountNom++;
    
            static 
szName[32]; get_user_name(idszNamecharsmax(szName));
            return 
ChatColor(0"^1[^4BestSkill^1] ^3%s ^4номинировал на голосование^3 %s^1."szNamemap);
        }
    }
    return 
PLUGIN_CONTINUE;
}
#endif
#if !defined NOROUND
public eRoundStart()
{
    if(!
g_bVoteStarted) return;
    
g_bVoteStarted false;
    
StartVoteMap();
}
#endif

StartVoteMap()
{
    if(!
g_oldMaxSpeedg_oldMaxSpeed get_pcvar_num(g_pMaxSpeed);
    
set_pcvar_num(g_pMaxSpeed0);
#if defined SCREENFADE
    
ScreenFade(1);
#endif
    
set_task(1.0"ShowTimer"__"a"3);
    
set_task(4.0"voteNextMap");
}

public 
CheckTime()
{
    if(
g_bVoteStarted || g_bBeInVote) return;
    static 
iTimeLeftiTimeLimit
    
iTimeLeft get_timeleft();
    
iTimeLimit get_pcvar_num(g_pTimeLimit);
    if(
iTimeLeft 30 && iTimeLimit)
    {
        
g_iTempTimelimit iTimeLimit;
#if defined NOROUND    
        
StartVoteMap();
#else        
        
g_bVoteStarted true;
        if(!
g_oldTimeLimitg_oldTimeLimit iTimeLimit;
        
set_pcvar_num(g_pTimeLimitiTimeLimit get_pcvar_num(g_pRoundTime) + get_pcvar_num(g_pC4Timer));
        
hud_lastround();
#endif    
    
}
}
    
public 
ShowTimer()
{
    static 
iTimer; if(!iTimeriTimer 3;
    
set_hudmessage(2552450, -1.00.620.01.00.10.01);
    
show_hudmessage(0"vk.com/bestskill"iTimer);
    
client_cmd(0"spk %s"g_szSound[iTimer--]);
}

public 
voteNextMap()
{
    
g_bBeInVote true;
    static 
szMenu[256], iLeniKeysaiMaxMapsiTempMapTime
    if(!
iTempMapTimeiTempMapTime g_iTempTimelimit MAX_NUMEXTEND STEP_EXTEND;
    if(!
iMaxMapsiMaxMaps = (g_iMapCount SELECTMAPS) ? g_iMapCount SELECTMAPS;

    
iLen formatex(szMenucharsmax(szMenu), "\d[\rBestSkill\d] \yВыберите карту^n^n");
#if defined MAP_ON_PLAYERS    
    
new xplayers get_playersnum();
#endif    
    
g_iVoteMapNum iKeys 0;
    while(
g_iVoteMapNum iMaxMaps)
    {
#if defined NOMINATE_FUNC    
        
if(g_iVoteMapNum g_iCountNom)
        {
            
g_iMapInMenu[g_iVoteMapNum] = g_iIdMapNom[g_iVoteMapNum];
            
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[g_iIdMapNom[g_iVoteMapNum]]);
            
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
            
iKeys |= (1<<g_iVoteMapNum++);
            continue;
        }
#endif
        
do random(g_iMapCount 1);
        while(
_is_map_in_menu(a));
        
g_iMapInMenu[g_iVoteMapNum] = a;
#if defined MAP_ON_PLAYERS
        
if(!IsMapValidOnPlayers(aplayers))
        {
            if(++
g_iMapCount) continue;
            else break;
        }    
#endif        
        
copy(g_sVoteMap[g_iVoteMapNum], charsmax(g_sVoteMap[]), g_sMap[a]);
        
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen"\r%d. \w%s^n"g_iVoteMapNum+1g_sVoteMap[g_iVoteMapNum]);
        
iKeys |= (1<<g_iVoteMapNum++);
    }
    if(
g_iTempTimelimit iTempMapTime && !g_bBlockExtended)
    {
        
formatex(szMenu[iLen], charsmax(szMenu) - iLen"^n\r%d. \w%s \d[\rПродлить\d]"g_iVoteMapNum+1g_sCurMap);
        
iKeys |= (1<<g_iVoteMapNum);
    }
    
show_menu(0iKeysszMenuVOTETIME"MapChoose");
    
set_task(float(VOTETIME), "checkVotes");
    
client_cmd(0"spk Gman/Gman_Choose2");
    
log_amx("Vote: Voting for the nextmap started");
    return 
PLUGIN_HANDLED;
}

public 
votemenu_handler(idiKey)
{
    static 
szName[32]; get_user_name(idszNamecharsmax(szName));

    if(
iKey == g_iVoteMapNum)     ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"szName);
    else                 
ChatColor(0"^1[^4BestSkill^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"szNameg_sVoteMap[iKey]);
    
    return 
g_iVoteCount[iKey]++;
}

public 
checkVotes()
{
    new 
b;
    for(new 
aSELECTMAPS+1a++)
        if(
g_iVoteCount[b] < g_iVoteCount[a])        
            
a;        
    
    if(!
g_iVoteCount[b])
    {
        new 
map random(g_iVoteMapNum-1);
        
ChatColor(0"^1[^4BestSkill^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"g_sVoteMap[map]);
        
log_amx("[End VoteMap] Nobody voted for the nextmap. Random map %s"g_sVoteMap[map]);
        
copy(g_NextMapcharsmax(g_NextMap),g_sCurMap); ChangeLevel();
    }
        
//Copied the nominated function into here which was originally the extend function
    
else if(g_iVoteCount[b] == g_iVoteCount[g_iVoteMapNum])
    {
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Следующая карта будет перезапущена: ^3%s"g_sCurMap);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sCurMap);
        
copy(g_NextMapcharsmax(g_NextMap), g_sCurMap); ChangeLevel();    
    }
    else
    {        
        
ChatColor(0"^1[^4BestSkill^1] ^4Голосование ^3завершено! ^4Cледующая карта: ^3%s"g_sVoteMap[b]);
        
log_amx("[End VoteMap] Voting for the nextmap finished. The nextmap will be %s"g_sVoteMap[b]);
        
copy(g_NextMapcharsmax(g_NextMap), g_sVoteMap[b]); ChangeLevel();        
    }
    
set_pcvar_num(g_pMaxSpeedg_oldMaxSpeed);
}
#define FILE_BLOCKEDMAPS "addons/amxmodx/data/mm_last.ini"
LoadBlockMaps()
{
    
copy(g_sLastMap[0], charsmax(g_sLastMap[]), g_sCurMap);
    if(
file_exists(FILE_BLOCKEDMAPS))
    {
        new 
buff[256], fp fopen(FILE_BLOCKEDMAPS"rt");
        while(
g_iLastMap BLOCK_MAPS && !feof(fp))
        {
            
fgets(fpbuffcharsmax(buff));
            if(
buff[0] != ';' && parse(buffg_sLastMap[g_iLastMap], charsmax(g_sLastMap[])))
                
g_iLastMap++;
        }
        
fclose(fp);
        
unlink(FILE_BLOCKEDMAPS);
    }
    if(
write_file(FILE_BLOCKEDMAPS"; File generated by Lite Mapchooser. Do not modify!"))
        for(new 
ig_iLastMapi++)
            
write_file(FILE_BLOCKEDMAPSg_sLastMap[i]);
}

LoadMaps()
{
    new 
buff[256], fp fopen("addons/amxmodx/configs/maps.ini""rt");
    if(!
fpset_fail_state("File ^"addons/amxmodx/configs/maps.ini^" not found");
#if defined MAP_ON_PLAYERS    
    
new minpl[3], maxpl[3];
#endif
    
while(!feof(fp) && g_iMapCount MAX_MAPS)
    {
        
fgets(fpbuffcharsmax(buff));
        
trim(buff); remove_quotes(buff);
        if(!
buff[0] || buff[0] == ';') continue;
#if defined MAP_ON_PLAYERS        
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[]), minplcharsmax(minpl), maxplcharsmax(maxpl)))
#else
        
if(parse(buffg_sMap[g_iMapCount], charsmax(g_sMap[])))
#endif        
        
{
            if(!
is_map_valid(g_sMap[g_iMapCount]) || _is_map_blocked(g_sMap[g_iMapCount]) || !strcmp(g_sMap[g_iMapCount], g_sCurMap)) continue;
#if defined MAP_ON_PLAYERS
            
g_MapPlayerData[g_iMapCount][1] = str_to_num(minpl);
            
g_MapPlayerData[g_iMapCount][2] = str_to_num(maxpl);
#endif
#if defined MAPSMENU
            
menu_additem(g_iMapsMenug_sMap[g_iMapCount]);
#endif    
            
g_iMapCount++;            
        }
    }
    
fclose(fp); 
    
    if(!
g_iMapCount
        
set_fail_state("[Load Maps] Nothing loaded. Plugin stopped!");
    else if(
g_iMapCount == 1)
        
set_fail_state("[Load Maps] Critical loaded maps. Add maps in ^"addons/amxmodx/configs/maps.ini^". Plugin stopped!");    
    else if(
g_iMapCount SELECTMAPS)
        
log_to_file("lite_mapchooser.log""[Load Maps] WARNING! Too little maps for voting! [Load: %d / Min: %d]"g_iMapCountSELECTMAPS);
}

bool:_is_map_in_menu(MapId)
{
    for(new 
ig_iVoteMapNumi++)
        if(
g_iMapInMenu[i] == MapId)
            return 
true;
    return 
false;
}

bool:_is_map_blocked(map[])
{
    for(new 
ig_iLastMapi++)
        if(!
strcmp(g_sLastMap[i], map))
            return 
true;
    return 
false;    
}
#if defined NOMINATE_FUNC
bool:_is_map_nominated(map[])
{
    for(new 
ig_iCountNomi++)
        if(!
strcmp(g_sNomMap[i], map))
            return 
true;
    return 
false;
}

_is_map_loaded(map[])
{
    for(new 
ig_iMapCounti++)
        if(!
strcmp(g_sMap[i], map)) 
            return 
i;    
    return -
1;    
}
#endif
ChangeLevel()
{
    
message_begin(MSG_ALLSVC_INTERMISSION);
    
message_end();
    
set_task(3.0"NextMap");
}

public 
NextMap()
    
server_cmd("changelevel %s"g_NextMap);
#if defined SCREENFADE
public ScreenFade(fade)
{
    static 
timeholdflagsmScreenFade;
    if(!
mScreenFademScreenFade get_user_msgid("ScreenFade");
    
    
time = (<= fade <= 1) ? 4096 1;
    
hold = (<= fade <= 1) ? 1024 1;
    
    switch(
fade)
    {
        case 
0:
        {
            
flags 2;
            
set_msg_block(mScreenFadeBLOCK_NOT);
        }    
        case 
1:
        {
            
flags 1;
            
set_task(1.0"ScreenFade"2);
        }
        case 
2
        {
            
flags 4;
            
set_msg_block(mScreenFadeBLOCK_SET);
        }    
    }
    
message_begin(MSG_BROADCASTmScreenFade);
    
write_short(time);
    
write_short(hold);
    
write_short(flags);
    
write_byte(0);
    
write_byte(0);
    
write_byte(0);
    
write_byte(255);
    
message_end();
}
#endif
stock hud_lastround()
{
    
set_hudmessage(1271271270.020.21030.030.00.00.53);
    
show_hudmessage(0"Последний раунд");
}

stock IsValidRtv(const id)
{
    static 
estimated_timeestimated_time = (get_systime() - g_iStartMap);
    if(
RTV_DELAY estimated_time)
    {
        static 
frmt[129], temp_time
        
_time = (temp = ((RTV_DELAY estimated_time) / 60)) < temp;
        
        if(!
_timeformatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна менее, чем через ^3минуту!");
        else 
formatex(frmtcharsmax(frmt), "^4Досрочная смена карты будет доступна через ^3%d ^4мин!"_time);
        
        
ChatColor(id"^1[^4BestSkill^1] %s"frmt);
        return 
0;
    }
    return 
1;
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static 
pnumplayers[32], szMsg[190], IdMsg
    
vformat(szMsgcharsmax(szMsg), szMessage3);
    
    if(!
IdMsgIdMsg get_user_msgid("SayText");
    
    if(
id
    {
        if(!
is_user_connected(id)) return 0;
        
players[0] = id;
        
pnum 1
    } 
    else 
get_players(playerspnum"ch");
    
    for(new 
ipnumi++)
    {
        
message_begin(MSG_ONEIdMsg, .player players[i]);
        
write_byte(players[i]);
        
write_string(szMsg);
        
message_end();
    }
    return 
1;

If no one votes, the server restarts the card.
Vaim is offline
Vaim
Member
Join Date: Feb 2019
Old 02-17-2019 , 17:55   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #9

Quote:
Originally Posted by Vaim View Post
If no one votes, the server restarts the card.

corrected, the error was here:
Code:
copy(g_NextMap, charsmax(g_NextMap),g_sCurMap); ChangeLevel();
I did this:
Code:
copy(g_NextMap, charsmax(g_NextMap), g_sVoteMap[map]); ChangeLevel();
it works
Vaim is offline
Natsheh
Veteran Member
Join Date: Sep 2012
Old 02-18-2019 , 03:55   Re: MapManager: instead of extending the map, restart the current map
Reply With Quote #10

You could do sv_restart
__________________
@Jailbreak Main Mod v2.7.0 100%
@User Tag Prefix 100% done !
@Mystery Box 100% done !
@VIP System 100% done !

Natsheh is offline
Send a message via MSN to Natsheh Send a message via Skype™ to Natsheh
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 17:45.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode