ferret99gt@1440: /**
ferret99gt@1440: * vim: set ts=4 :
ferret99gt@1440: * =============================================================================
ferret99gt@1440: * SourceMod Mapchooser Plugin
ferret99gt@1440: * Creates a map vote at appropriate times, setting sm_nextmap to the winning
ferret99gt@1440: * vote
ferret99gt@1440: *
ferret99gt@1440: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
ferret99gt@1440: * =============================================================================
ferret99gt@1440: *
ferret99gt@1440: * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1440: * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1440: * Free Software Foundation.
ferret99gt@1440: *
ferret99gt@1440: * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1440: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1440: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ferret99gt@1440: * details.
ferret99gt@1440: *
ferret99gt@1440: * You should have received a copy of the GNU General Public License along with
ferret99gt@1440: * this program. If not, see .
ferret99gt@1440: *
ferret99gt@1440: * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1440: * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1440: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1440: * by the Valve Corporation. You must obey the GNU General Public License in
ferret99gt@1440: * all respects for all other code used. Additionally, AlliedModders LLC grants
ferret99gt@1440: * this exception to all derivative works. AlliedModders LLC defines further
ferret99gt@1440: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1440: * or .
ferret99gt@1440: *
ferret99gt@1440: * Version: $Id$
ferret99gt@1440: */
ferret99gt@1440:
ferret99gt@1440: #pragma semicolon 1
ferret99gt@1440: #include
ferret99gt@1440:
ferret99gt@1479: public Plugin:myinfo =
ferret99gt@1479: {
ferret99gt@1479: name = "MapChooser",
ferret99gt@1479: author = "AlliedModders LLC",
ferret99gt@1479: description = "Automated Map Voting",
ferret99gt@1479: version = SOURCEMOD_VERSION,
ferret99gt@1479: url = "http://www.sourcemod.net/"
ferret99gt@1479: };
ferret99gt@1440:
ferret99gt@1440: new Handle:g_Cvar_Winlimit = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_Maxrounds = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_Fraglimit = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1440: new Handle:g_Cvar_Nextmap = INVALID_HANDLE;
ferret99gt@1479:
ferret99gt@1440: new Handle:g_Cvar_StartTime = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_StartRounds = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_StartFrags = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_ExtendTimeMax = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_ExtendTimeStep = INVALID_HANDLE;
ferret99gt@1445: new Handle:g_Cvar_ExtendRoundMax = INVALID_HANDLE;
ferret99gt@1445: new Handle:g_Cvar_ExtendRoundStep = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_ExtendFragMax = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_ExtendFragStep = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_Mapfile = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_ExcludeMaps = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_IncludeMaps = INVALID_HANDLE;
ferret99gt@1531: new Handle:g_Cvar_NoVoteMode = INVALID_HANDLE;
ferret99gt@1531: new Handle:g_Cvar_Extend = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1440: new Handle:g_VoteTimer = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_RetryTimer = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1440: new Handle:g_MapList = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_OldMapList = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_NextMapList = INVALID_HANDLE;
ferret99gt@1606: new Handle:g_TeamScores = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_VoteMenu = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1698: new g_TotalRounds;
ferret99gt@1440: new bool:g_HasVoteStarted;
ferret99gt@1440: new g_mapFileTime;
ferret99gt@1440:
ferret99gt@1531: #define VOTE_EXTEND "##extend##"
ferret99gt@1531:
ferret99gt@1440: public OnPluginStart()
ferret99gt@1440: {
ferret99gt@1440: LoadTranslations("mapchooser.phrases");
ferret99gt@1440:
ferret99gt@1664: new arraySize = ByteCountToCells(33);
ferret99gt@1664: g_MapList = CreateArray(arraySize);
ferret99gt@1664: g_OldMapList = CreateArray(arraySize);
ferret99gt@1664: g_NextMapList = CreateArray(arraySize);
ferret99gt@1440:
ferret99gt@1479: g_Cvar_StartTime = CreateConVar("sm_mapvote_start", "3.0", "Specifies when to start the vote based on time remaining.", _, true, 1.0);
ferret99gt@1479: g_Cvar_StartRounds = CreateConVar("sm_mapvote_startround", "2.0", "Specifies when to start the vote based on rounds remaining.", _, true, 1.0);
ferret99gt@1479: g_Cvar_StartFrags = CreateConVar("sm_mapvote_startfrags", "5.0", "Specifies when to start the vote base on frags remaining.", _, true, 1.0);
ferret99gt@1479: g_Cvar_ExtendTimeMax = CreateConVar("sm_extendmap_maxtime", "90", "Specifies the maximum amount of time a map can be extended", _, true, 0.0);
ferret99gt@1440: g_Cvar_ExtendTimeStep = CreateConVar("sm_extendmap_timestep", "15", "Specifies how much many more minutes each extension makes", _, true, 5.0);
ferret99gt@1479: g_Cvar_ExtendRoundMax = CreateConVar("sm_extendmap_maxrounds", "30", "Specfies the maximum amount of rounds a map can be extended", _, true, 0.0);
ferret99gt@1445: g_Cvar_ExtendRoundStep = CreateConVar("sm_extendmap_roundstep", "5", "Specifies how many more rounds each extension makes", _, true, 5.0);
ferret99gt@1479: g_Cvar_ExtendFragMax = CreateConVar("sm_extendmap_maxfrags", "150", "Specfies the maximum frags allowed that a map can be extended.", _, true, 0.0);
ferret99gt@1479: g_Cvar_ExtendFragStep = CreateConVar("sm_extendmap_fragstep", "10", "Specifies how many more frags are allowed when map is extended.", _, true, 5.0);
ferret99gt@1440: g_Cvar_Mapfile = CreateConVar("sm_mapvote_file", "configs/maps.ini", "Map file to use. (Def sourcemod/configs/maps.ini)");
ferret99gt@1440: g_Cvar_ExcludeMaps = CreateConVar("sm_mapvote_exclude", "5", "Specifies how many past maps to exclude from the vote.", _, true, 0.0);
ferret99gt@1479: g_Cvar_IncludeMaps = CreateConVar("sm_mapvote_include", "5", "Specifies how many maps to include in the vote.", _, true, 2.0, true, 6.0);
ferret99gt@1531: g_Cvar_NoVoteMode = CreateConVar("sm_mapvote_novote", "1", "Specifies whether or not MapChooser should pick a map if no votes are received.", _, true, 0.0, true, 1.0);
ferret99gt@1531: g_Cvar_Extend = CreateConVar("sm_mapvote_extend", "1", "Specifies whether or not MapChooser will allow the map to be extended.", _, true, 0.0, true, 1.0);
ferret99gt@1440:
ferret99gt@1479: RegAdminCmd("sm_mapvote", Command_Mapvote, ADMFLAG_CHANGEMAP, "sm_mapvote - Forces MapChooser to attempt to run a map vote now.");
ferret99gt@1440:
ferret99gt@1452: g_Cvar_Winlimit = FindConVar("mp_winlimit");
ferret99gt@1452: g_Cvar_Maxrounds = FindConVar("mp_maxrounds");
ferret99gt@1479: g_Cvar_Fraglimit = FindConVar("mp_fraglimit");
ferret99gt@1452:
ferret99gt@1452: if (g_Cvar_Winlimit != INVALID_HANDLE || g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1452: HookEvent("round_end", Event_RoundEnd);
ferret99gt@1440: }
ferret99gt@1467:
ferret99gt@1479: if (g_Cvar_Fraglimit != INVALID_HANDLE)
ferret99gt@1479: {
ferret99gt@1479: HookEvent("player_death", Event_PlayerDeath);
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1467: AutoExecConfig(true, "mapchooser");
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1606: public OnConfigsExecuted()
ferret99gt@1440: {
ferret99gt@1440: g_Cvar_Nextmap = FindConVar("sm_nextmap");
ferret99gt@1440:
ferret99gt@1440: if (g_Cvar_Nextmap == INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1440: LogError("FATAL: Cannot find sm_nextmap cvar. Mapchooser not loaded.");
ferret99gt@1440: SetFailState("sm_nextmap not found");
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1606: if (LoadMaps(g_MapList, g_mapFileTime, g_Cvar_Mapfile))
ferret99gt@1440: {
ferret99gt@1440: CreateNextVote();
ferret99gt@1440: SetupTimeleftTimer();
ferret99gt@1531: SetConVarString(g_Cvar_Nextmap, "Pending Vote");
ferret99gt@1440: }
ferret99gt@1698:
ferret99gt@1698: if (g_TeamScores != INVALID_HANDLE)
ferret99gt@1698: {
ferret99gt@1698: CloseHandle(g_TeamScores);
ferret99gt@1698: }
ferret99gt@1698:
ferret99gt@1698: g_TeamScores = CreateArray(2);
ferret99gt@1698: g_TotalRounds = 0;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: public OnMapEnd()
ferret99gt@1440: {
ferret99gt@1440: g_HasVoteStarted = false;
ferret99gt@1606:
ferret99gt@1606: if (g_VoteTimer != INVALID_HANDLE)
ferret99gt@1606: {
ferret99gt@1606: KillTimer(g_VoteTimer);
ferret99gt@1606: g_VoteTimer = INVALID_HANDLE;
ferret99gt@1606: }
ferret99gt@1606:
ferret99gt@1606: if (g_RetryTimer != INVALID_HANDLE)
ferret99gt@1606: {
ferret99gt@1606: KillTimer(g_RetryTimer);
ferret99gt@1606: g_RetryTimer = INVALID_HANDLE;
ferret99gt@1606: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: public OnMapTimeLeftChanged()
ferret99gt@1440: {
ferret99gt@1467: if (GetArraySize(g_MapList))
ferret99gt@1467: {
ferret99gt@1467: SetupTimeleftTimer();
ferret99gt@1467: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: SetupTimeleftTimer()
ferret99gt@1440: {
ferret99gt@1440: new time;
ferret99gt@1440: if (GetMapTimeLeft(time) && time > 0)
ferret99gt@1440: {
ferret99gt@1506: new startTime = GetConVarInt(g_Cvar_StartTime) * 60;
ferret99gt@1440: if (time - startTime < 0)
ferret99gt@1440: {
ferret99gt@1452: InitiateVote();
ferret99gt@1440: }
ferret99gt@1440: else
ferret99gt@1440: {
ferret99gt@1440: if (g_VoteTimer != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1440: KillTimer(g_VoteTimer);
ferret99gt@1440: g_VoteTimer = INVALID_HANDLE;
ferret99gt@1452: }
ferret99gt@1440:
ferret99gt@1606: g_VoteTimer = CreateTimer(float(time - startTime), Timer_StartMapVote);
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: public Action:Timer_StartMapVote(Handle:timer)
ferret99gt@1440: {
ferret99gt@1452: if (!GetArraySize(g_MapList))
ferret99gt@1440: {
ferret99gt@1440: return Plugin_Stop;
ferret99gt@1479: }
ferret99gt@1452:
ferret99gt@1440: if (timer == g_RetryTimer)
ferret99gt@1440: {
ferret99gt@1440: g_RetryTimer = INVALID_HANDLE;
ferret99gt@1440: }
ferret99gt@1440: else
ferret99gt@1440: {
ferret99gt@1440: g_VoteTimer = INVALID_HANDLE;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: InitiateVote();
ferret99gt@1440:
ferret99gt@1440: return Plugin_Stop;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1479: /* You ask, why don't you just use team_score event? And I answer... Because CSS doesn't. */
ferret99gt@1452: public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1440: {
ferret99gt@1528: if (!GetArraySize(g_MapList) || g_HasVoteStarted)
ferret99gt@1440: {
ferret99gt@1440: return;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1479: new winner = GetEventInt(event, "winner");
ferret99gt@1479:
ferret99gt@1479: if (winner == 0 || winner == 1)
ferret99gt@1452: {
ferret99gt@1452: return;
ferret99gt@1452: }
ferret99gt@1479:
ferret99gt@1698: g_TotalRounds++;
ferret99gt@1479:
ferret99gt@1479: new team[2], teamPos = -1;
ferret99gt@1528: for (new i; i < GetArraySize(g_TeamScores); i++)
ferret99gt@1479: {
ferret99gt@1528: GetArrayArray(g_TeamScores, i, team);
ferret99gt@1479: if (team[0] == winner)
ferret99gt@1479: {
ferret99gt@1479: teamPos = i;
ferret99gt@1479: break;
ferret99gt@1479: }
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1479: if (teamPos == -1)
ferret99gt@1479: {
ferret99gt@1479: team[0] = winner;
ferret99gt@1479: team[1] = 1;
ferret99gt@1528: PushArrayArray(g_TeamScores, team);
ferret99gt@1479: }
ferret99gt@1479: else
ferret99gt@1479: {
ferret99gt@1479: team[1]++;
ferret99gt@1528: SetArrayArray(g_TeamScores, teamPos, team);
ferret99gt@1479: }
ferret99gt@1452:
ferret99gt@1452: if (g_Cvar_Winlimit != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1452: new winlimit = GetConVarInt(g_Cvar_Winlimit);
ferret99gt@1452: if (winlimit)
ferret99gt@1440: {
ferret99gt@1528: if (team[1] >= (winlimit - GetConVarInt(g_Cvar_StartRounds)))
ferret99gt@1452: {
ferret99gt@1452: InitiateVote();
ferret99gt@1452: }
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1452:
ferret99gt@1452: if (g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1440: new maxrounds = GetConVarInt(g_Cvar_Maxrounds);
ferret99gt@1440: if (maxrounds)
ferret99gt@1440: {
ferret99gt@1698: if (g_TotalRounds >= (maxrounds - GetConVarInt(g_Cvar_StartRounds)))
ferret99gt@1440: {
ferret99gt@1440: InitiateVote();
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1479: public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1479: {
ferret99gt@1528: if (!GetArraySize(g_MapList) || g_Cvar_Fraglimit == INVALID_HANDLE || g_HasVoteStarted)
ferret99gt@1483: {
ferret99gt@1483: return;
ferret99gt@1483: }
ferret99gt@1483:
ferret99gt@1483: if (!GetConVarInt(g_Cvar_Fraglimit))
ferret99gt@1479: {
ferret99gt@1479: return;
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1479: new fragger = GetClientOfUserId(GetEventInt(event, "attacker"));
ferret99gt@1528: if (fragger && GetClientFrags(fragger) >= (GetConVarInt(g_Cvar_Fraglimit) - GetConVarInt(g_Cvar_StartFrags)))
ferret99gt@1479: {
ferret99gt@1479: InitiateVote();
ferret99gt@1479: }
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1479: public Action:Command_Mapvote(client, args)
ferret99gt@1517: {
ferret99gt@1479: InitiateVote();
ferret99gt@1479:
ferret99gt@1479: return Plugin_Handled;
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1440: InitiateVote()
ferret99gt@1440: {
ferret99gt@1440: if (g_HasVoteStarted || g_RetryTimer != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1440: return;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: if (IsVoteInProgress())
ferret99gt@1440: {
ferret99gt@1440: // Can't start a vote, try again in 5 seconds.
ferret99gt@1606: g_RetryTimer = CreateTimer(5.0, Timer_StartMapVote);
ferret99gt@1440: return;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: g_HasVoteStarted = true;
ferret99gt@1440: g_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);
ferret99gt@1440: SetMenuTitle(g_VoteMenu, "Vote Nextmap");
ferret99gt@1440:
ferret99gt@1440: decl String:map[32];
ferret99gt@1452: for (new i = 0; i < GetArraySize(g_NextMapList); i++)
ferret99gt@1440: {
ferret99gt@1452: GetArrayString(g_NextMapList, i, map, sizeof(map));
ferret99gt@1440: AddMenuItem(g_VoteMenu, map, map);
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1531: if (GetConVarBool(g_Cvar_Extend))
ferret99gt@1440: {
ferret99gt@1531: new bool:allowExtend, time;
ferret99gt@1531: if (GetMapTimeLimit(time) && time > 0 && time < GetConVarInt(g_Cvar_ExtendTimeMax))
ferret99gt@1531: {
ferret99gt@1531: allowExtend = true;
ferret99gt@1531: }
ferret99gt@1531:
ferret99gt@1531: if (g_Cvar_Winlimit != INVALID_HANDLE && GetConVarInt(g_Cvar_Winlimit) < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1531: {
ferret99gt@1531: allowExtend = true;
ferret99gt@1531: }
ferret99gt@1452:
ferret99gt@1531: if (g_Cvar_Maxrounds != INVALID_HANDLE && GetConVarInt(g_Cvar_Maxrounds) < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1531: {
ferret99gt@1531: allowExtend = true;
ferret99gt@1531: }
ferret99gt@1479:
ferret99gt@1531: if (g_Cvar_Fraglimit != INVALID_HANDLE && GetConVarInt(g_Cvar_Fraglimit) < GetConVarInt(g_Cvar_ExtendFragMax))
ferret99gt@1531: {
ferret99gt@1531: allowExtend = true;
ferret99gt@1531: }
ferret99gt@1440:
ferret99gt@1531: if (allowExtend)
ferret99gt@1531: {
ferret99gt@1531: AddMenuItem(g_VoteMenu, VOTE_EXTEND, "Extend Map");
ferret99gt@1531: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: SetMenuExitButton(g_VoteMenu, false);
ferret99gt@1440: VoteMenuToAll(g_VoteMenu, 20);
ferret99gt@1440:
ferret99gt@1440: LogMessage("Voting for next map has started.");
ferret99gt@1440: PrintToChatAll("[SM] %t", "Nextmap Voting Started");
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2)
ferret99gt@1440: {
ferret99gt@1440: switch (action)
ferret99gt@1440: {
ferret99gt@1440: case MenuAction_End:
ferret99gt@1440: {
ferret99gt@1440: g_VoteMenu = INVALID_HANDLE;
ferret99gt@1440: CloseHandle(menu);
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: case MenuAction_Display:
ferret99gt@1440: {
ferret99gt@1440: decl String:buffer[255];
ferret99gt@1440: Format(buffer, sizeof(buffer), "%T", "Vote Nextmap", param1);
ferret99gt@1440:
ferret99gt@1440: new Handle:panel = Handle:param2;
ferret99gt@1440: SetPanelTitle(panel, buffer);
ferret99gt@1479: }
ferret99gt@1479:
ferret99gt@1479: case MenuAction_DisplayItem:
ferret99gt@1479: {
ferret99gt@1479: if (GetMenuItemCount(menu) - 1 == param2)
ferret99gt@1479: {
ferret99gt@1479: decl String:map[64], String:buffer[255];
ferret99gt@1479: GetMenuItem(menu, param2, map, sizeof(map));
ferret99gt@1531: if (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1479: {
ferret99gt@1479: Format(buffer, sizeof(buffer), "%T", "Extend Map", param1);
ferret99gt@1479: return RedrawMenuItem(buffer);
ferret99gt@1479: }
ferret99gt@1479: }
ferret99gt@1479: }
ferret99gt@1440:
ferret99gt@1440: // Why am I commented out? Because BAIL hasn't decided yet if
ferret99gt@1440: // vote notification will be built into the Vote API.
ferret99gt@1440: /*case MenuAction_Select:
ferret99gt@1440: {
ferret99gt@1440: decl String:Name[32], String:Map[32];
ferret99gt@1440: GetClientName(param1, Name, sizeof(Name));
ferret99gt@1440: GetMenuItem(menu, param2, Map, sizeof(Map));
ferret99gt@1440:
ferret99gt@1440: PrintToChatAll("[SM] %s has voted for map '%s'", Name, Map);
ferret99gt@1440: }*/
ferret99gt@1440:
ferret99gt@1440: case MenuAction_VoteCancel:
ferret99gt@1440: {
ferret99gt@1440: // If we receive 0 votes, pick at random.
ferret99gt@1531: if (param1 == VoteCancel_NoVotes && GetConVarBool(g_Cvar_NoVoteMode))
ferret99gt@1440: {
ferret99gt@1440: new count = GetMenuItemCount(menu);
ferret99gt@1440: new item = GetRandomInt(0, count - 1);
ferret99gt@1440: decl String:map[32];
ferret99gt@1440: GetMenuItem(menu, item, map, sizeof(map));
ferret99gt@1440:
ferret99gt@1531: while (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1440: {
ferret99gt@1440: item = GetRandomInt(0, count - 1);
ferret99gt@1440: GetMenuItem(menu, item, map, sizeof(map));
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: SetNextMap(map);
ferret99gt@1440: }
ferret99gt@1440: else
ferret99gt@1440: {
ferret99gt@1440: // We were actually cancelled. What should we do?
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: case MenuAction_VoteEnd:
ferret99gt@1440: {
ferret99gt@1440: decl String:map[32];
ferret99gt@1440: GetMenuItem(menu, param1, map, sizeof(map));
ferret99gt@1440:
ferret99gt@1531: if (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1440: {
ferret99gt@1440: new time;
ferret99gt@1440: if (GetMapTimeLimit(time))
ferret99gt@1440: {
ferret99gt@1440: if (time > 0 && time < GetConVarInt(g_Cvar_ExtendTimeMax))
ferret99gt@1440: {
ferret99gt@1482: ExtendMapTimeLimit(GetConVarInt(g_Cvar_ExtendTimeStep)*60);
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1452: if (g_Cvar_Winlimit != INVALID_HANDLE)
ferret99gt@1440: {
ferret99gt@1440: new winlimit = GetConVarInt(g_Cvar_Winlimit);
ferret99gt@1452: if (winlimit && winlimit < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1440: {
ferret99gt@1452: SetConVarInt(g_Cvar_Winlimit, winlimit + GetConVarInt(g_Cvar_ExtendRoundStep));
ferret99gt@1452: }
ferret99gt@1452: }
ferret99gt@1452:
ferret99gt@1452: if (g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1452: {
ferret99gt@1452: new maxrounds = GetConVarInt(g_Cvar_Maxrounds);
ferret99gt@1452: if (maxrounds && maxrounds < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1440: {
ferret99gt@1452: SetConVarInt(g_Cvar_Maxrounds, maxrounds + GetConVarInt(g_Cvar_ExtendRoundStep));
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1479:
ferret99gt@1479: if (g_Cvar_Fraglimit != INVALID_HANDLE)
ferret99gt@1479: {
ferret99gt@1479: new fraglimit = GetConVarInt(g_Cvar_Fraglimit);
ferret99gt@1479: if (fraglimit && fraglimit < GetConVarInt(g_Cvar_ExtendFragMax))
ferret99gt@1479: {
ferret99gt@1479: SetConVarInt(g_Cvar_Fraglimit, fraglimit + GetConVarInt(g_Cvar_ExtendFragStep));
ferret99gt@1479: }
ferret99gt@1479: }
ferret99gt@1440:
ferret99gt@1440: PrintToChatAll("[SM] %t", "Current Map Extended");
ferret99gt@1440: LogMessage("Voting for next map has finished. The current map has been extended.");
ferret99gt@1440:
ferret99gt@1445: // We extended, so we'll have to vote again.
ferret99gt@1440: g_HasVoteStarted = false;
ferret99gt@1479: CreateNextVote();
ferret99gt@1445: SetupTimeleftTimer();
ferret99gt@1440: }
ferret99gt@1440: else
ferret99gt@1440: {
ferret99gt@1440: SetNextMap(map);
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1440: }
ferret99gt@1479:
ferret99gt@1479: return 0;
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: SetNextMap(const String:map[])
ferret99gt@1440: {
ferret99gt@1440: SetConVarString(g_Cvar_Nextmap, map);
ferret99gt@1440: PushArrayString(g_OldMapList, map);
ferret99gt@1440:
ferret99gt@1479: if (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1440: {
ferret99gt@1440: RemoveFromArray(g_OldMapList, 0);
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1452: PrintToChatAll("[SM] %t", "Nextmap Voting Finished", map);
ferret99gt@1440: LogMessage("Voting for next map has finished. Nextmap: %s.", map);
ferret99gt@1440: }
ferret99gt@1440:
ferret99gt@1440: CreateNextVote()
ferret99gt@1440: {
ferret99gt@1452: if(g_NextMapList != INVALID_HANDLE)
ferret99gt@1445: {
ferret99gt@1452: ClearArray(g_NextMapList);
ferret99gt@1533: }
ferret99gt@1440:
ferret99gt@1533: decl String:map[32];
ferret99gt@1719: new index, Handle:tempMaps = CloneArray(g_MapList);
ferret99gt@1719:
ferret99gt@1719: GetCurrentMap(map, sizeof(map));
ferret99gt@1719: index = FindStringInArray(tempMaps, map);
ferret99gt@1719: if (index != -1)
ferret99gt@1719: {
ferret99gt@1719: RemoveFromArray(tempMaps, index);
ferret99gt@1719: }
ferret99gt@1440:
ferret99gt@1664: if (GetConVarInt(g_Cvar_ExcludeMaps) && GetArraySize(tempMaps) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1533: {
ferret99gt@1533: for (new i = 0; i < GetArraySize(g_OldMapList); i++)
ferret99gt@1533: {
ferret99gt@1533: GetArrayString(g_OldMapList, i, map, sizeof(map));
ferret99gt@1719: index = FindStringInArray(tempMaps, map);
ferret99gt@1664: if (index != -1)
ferret99gt@1533: {
ferret99gt@1664: RemoveFromArray(tempMaps, index);
ferret99gt@1533: }
ferret99gt@1533: }
ferret99gt@1533: }
ferret99gt@1533:
ferret99gt@1533: new limit = (GetConVarInt(g_Cvar_IncludeMaps) < GetArraySize(tempMaps) ? GetConVarInt(g_Cvar_IncludeMaps) : GetArraySize(tempMaps));
ferret99gt@1452: for (new i = 0; i < limit; i++)
ferret99gt@1440: {
ferret99gt@1533: new b = GetRandomInt(0, GetArraySize(tempMaps) - 1);
ferret99gt@1533: GetArrayString(tempMaps, b, map, sizeof(map));
ferret99gt@1533: PushArrayString(g_NextMapList, map);
ferret99gt@1533: RemoveFromArray(tempMaps, b);
ferret99gt@1440: }
ferret99gt@1642:
ferret99gt@1642: CloseHandle(tempMaps);
ferret99gt@1440: }