plugins/mapchooser.sp
author Michael McKoy <ferret99gt@gmail.com>
Sat Jan 26 19:54:15 2008 +0000 (2008-01-26)
changeset 1861 cc6c6ed7615d
parent 1719 c9d5e55f0899
child 1862 2220462e2237
permissions -rw-r--r--
MapChooser extensions simplied. "maxtime/maxround/maxfrag" cvars removed. sm_mapvote_extend now controls the number of extensions that will occur. If set to 0, no extensions occur. If set to 1, then 1, and set to 2, then 2. The "step" cvars are still used to determine how big the extension is.
ferret99gt@1440
     1
/**
ferret99gt@1440
     2
 * vim: set ts=4 :
ferret99gt@1440
     3
 * =============================================================================
ferret99gt@1440
     4
 * SourceMod Mapchooser Plugin
ferret99gt@1440
     5
 * Creates a map vote at appropriate times, setting sm_nextmap to the winning
ferret99gt@1440
     6
 * vote
ferret99gt@1440
     7
 *
ferret99gt@1440
     8
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ferret99gt@1440
     9
 * =============================================================================
ferret99gt@1440
    10
 *
ferret99gt@1440
    11
 * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1440
    12
 * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1440
    13
 * Free Software Foundation.
ferret99gt@1440
    14
 * 
ferret99gt@1440
    15
 * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1440
    16
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1440
    17
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ferret99gt@1440
    18
 * details.
ferret99gt@1440
    19
 *
ferret99gt@1440
    20
 * You should have received a copy of the GNU General Public License along with
ferret99gt@1440
    21
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ferret99gt@1440
    22
 *
ferret99gt@1440
    23
 * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1440
    24
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1440
    25
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1440
    26
 * by the Valve Corporation.  You must obey the GNU General Public License in
ferret99gt@1440
    27
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ferret99gt@1440
    28
 * this exception to all derivative works.  AlliedModders LLC defines further
ferret99gt@1440
    29
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1440
    30
 * or <http://www.sourcemod.net/license.php>.
ferret99gt@1440
    31
 *
ferret99gt@1440
    32
 * Version: $Id$
ferret99gt@1440
    33
 */
ferret99gt@1440
    34
ferret99gt@1440
    35
#pragma semicolon 1
ferret99gt@1440
    36
#include <sourcemod>
ferret99gt@1440
    37
ferret99gt@1479
    38
public Plugin:myinfo =
ferret99gt@1479
    39
{
ferret99gt@1479
    40
	name = "MapChooser",
ferret99gt@1479
    41
	author = "AlliedModders LLC",
ferret99gt@1479
    42
	description = "Automated Map Voting",
ferret99gt@1479
    43
	version = SOURCEMOD_VERSION,
ferret99gt@1479
    44
	url = "http://www.sourcemod.net/"
ferret99gt@1479
    45
};
ferret99gt@1440
    46
ferret99gt@1440
    47
new Handle:g_Cvar_Winlimit = INVALID_HANDLE;
ferret99gt@1440
    48
new Handle:g_Cvar_Maxrounds = INVALID_HANDLE;
ferret99gt@1479
    49
new Handle:g_Cvar_Fraglimit = INVALID_HANDLE;
ferret99gt@1440
    50
ferret99gt@1440
    51
new Handle:g_Cvar_Nextmap = INVALID_HANDLE;
ferret99gt@1479
    52
ferret99gt@1440
    53
new Handle:g_Cvar_StartTime = INVALID_HANDLE;
ferret99gt@1479
    54
new Handle:g_Cvar_StartRounds = INVALID_HANDLE;
ferret99gt@1479
    55
new Handle:g_Cvar_StartFrags = INVALID_HANDLE;
ferret99gt@1440
    56
new Handle:g_Cvar_ExtendTimeStep = INVALID_HANDLE;
ferret99gt@1445
    57
new Handle:g_Cvar_ExtendRoundStep = INVALID_HANDLE;
ferret99gt@1479
    58
new Handle:g_Cvar_ExtendFragStep = INVALID_HANDLE;
ferret99gt@1440
    59
new Handle:g_Cvar_Mapfile = INVALID_HANDLE;
ferret99gt@1440
    60
new Handle:g_Cvar_ExcludeMaps = INVALID_HANDLE;
ferret99gt@1479
    61
new Handle:g_Cvar_IncludeMaps = INVALID_HANDLE;
ferret99gt@1531
    62
new Handle:g_Cvar_NoVoteMode = INVALID_HANDLE;
ferret99gt@1531
    63
new Handle:g_Cvar_Extend = INVALID_HANDLE;
ferret99gt@1440
    64
ferret99gt@1440
    65
new Handle:g_VoteTimer = INVALID_HANDLE;
ferret99gt@1440
    66
new Handle:g_RetryTimer = INVALID_HANDLE;
ferret99gt@1440
    67
ferret99gt@1440
    68
new Handle:g_MapList = INVALID_HANDLE;
ferret99gt@1440
    69
new Handle:g_OldMapList = INVALID_HANDLE;
ferret99gt@1440
    70
new Handle:g_NextMapList = INVALID_HANDLE;
ferret99gt@1606
    71
new Handle:g_TeamScores = INVALID_HANDLE;
ferret99gt@1440
    72
new Handle:g_VoteMenu = INVALID_HANDLE;
ferret99gt@1440
    73
ferret99gt@1861
    74
new g_Extends;
ferret99gt@1698
    75
new g_TotalRounds;
ferret99gt@1440
    76
new bool:g_HasVoteStarted;
ferret99gt@1440
    77
new g_mapFileTime;
ferret99gt@1440
    78
ferret99gt@1531
    79
#define VOTE_EXTEND "##extend##"
ferret99gt@1531
    80
ferret99gt@1440
    81
public OnPluginStart()
ferret99gt@1440
    82
{
ferret99gt@1440
    83
	LoadTranslations("mapchooser.phrases");
ferret99gt@1440
    84
	
ferret99gt@1664
    85
	new arraySize = ByteCountToCells(33);
ferret99gt@1664
    86
	g_MapList = CreateArray(arraySize);
ferret99gt@1664
    87
	g_OldMapList = CreateArray(arraySize);
ferret99gt@1664
    88
	g_NextMapList = CreateArray(arraySize);
ferret99gt@1440
    89
ferret99gt@1479
    90
	g_Cvar_StartTime = CreateConVar("sm_mapvote_start", "3.0", "Specifies when to start the vote based on time remaining.", _, true, 1.0);
ferret99gt@1479
    91
	g_Cvar_StartRounds = CreateConVar("sm_mapvote_startround", "2.0", "Specifies when to start the vote based on rounds remaining.", _, true, 1.0);
ferret99gt@1479
    92
	g_Cvar_StartFrags = CreateConVar("sm_mapvote_startfrags", "5.0", "Specifies when to start the vote base on frags remaining.", _, true, 1.0);
ferret99gt@1440
    93
	g_Cvar_ExtendTimeStep = CreateConVar("sm_extendmap_timestep", "15", "Specifies how much many more minutes each extension makes", _, true, 5.0);
ferret99gt@1445
    94
	g_Cvar_ExtendRoundStep = CreateConVar("sm_extendmap_roundstep", "5", "Specifies how many more rounds each extension makes", _, true, 5.0);
ferret99gt@1479
    95
	g_Cvar_ExtendFragStep = CreateConVar("sm_extendmap_fragstep", "10", "Specifies how many more frags are allowed when map is extended.", _, true, 5.0);	
ferret99gt@1440
    96
	g_Cvar_Mapfile = CreateConVar("sm_mapvote_file", "configs/maps.ini", "Map file to use. (Def sourcemod/configs/maps.ini)");
ferret99gt@1440
    97
	g_Cvar_ExcludeMaps = CreateConVar("sm_mapvote_exclude", "5", "Specifies how many past maps to exclude from the vote.", _, true, 0.0);
ferret99gt@1479
    98
	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
    99
	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@1861
   100
	g_Cvar_Extend = CreateConVar("sm_mapvote_extend", "0", "Number of extensions allowed each map.", _, true, 0.0);
ferret99gt@1440
   101
ferret99gt@1479
   102
	RegAdminCmd("sm_mapvote", Command_Mapvote, ADMFLAG_CHANGEMAP, "sm_mapvote - Forces MapChooser to attempt to run a map vote now.");
ferret99gt@1440
   103
ferret99gt@1452
   104
	g_Cvar_Winlimit = FindConVar("mp_winlimit");
ferret99gt@1452
   105
	g_Cvar_Maxrounds = FindConVar("mp_maxrounds");
ferret99gt@1479
   106
	g_Cvar_Fraglimit = FindConVar("mp_fraglimit");
ferret99gt@1452
   107
	
ferret99gt@1452
   108
	if (g_Cvar_Winlimit != INVALID_HANDLE || g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1440
   109
	{
ferret99gt@1452
   110
		HookEvent("round_end", Event_RoundEnd);
ferret99gt@1440
   111
	}
ferret99gt@1467
   112
	
ferret99gt@1479
   113
	if (g_Cvar_Fraglimit != INVALID_HANDLE)
ferret99gt@1479
   114
	{
ferret99gt@1479
   115
		HookEvent("player_death", Event_PlayerDeath);		
ferret99gt@1479
   116
	}
ferret99gt@1479
   117
	
ferret99gt@1467
   118
	AutoExecConfig(true, "mapchooser");
ferret99gt@1440
   119
}
ferret99gt@1440
   120
ferret99gt@1606
   121
public OnConfigsExecuted()
ferret99gt@1440
   122
{
ferret99gt@1440
   123
	g_Cvar_Nextmap = FindConVar("sm_nextmap");
ferret99gt@1440
   124
ferret99gt@1440
   125
	if (g_Cvar_Nextmap == INVALID_HANDLE)
ferret99gt@1440
   126
	{
ferret99gt@1440
   127
		LogError("FATAL: Cannot find sm_nextmap cvar. Mapchooser not loaded.");
ferret99gt@1440
   128
		SetFailState("sm_nextmap not found");
ferret99gt@1440
   129
	}
ferret99gt@1440
   130
	
ferret99gt@1606
   131
	if (LoadMaps(g_MapList, g_mapFileTime, g_Cvar_Mapfile))
ferret99gt@1440
   132
	{
ferret99gt@1440
   133
		CreateNextVote();
ferret99gt@1440
   134
		SetupTimeleftTimer();
ferret99gt@1531
   135
		SetConVarString(g_Cvar_Nextmap, "Pending Vote");
ferret99gt@1440
   136
	}
ferret99gt@1698
   137
	
ferret99gt@1698
   138
	if (g_TeamScores != INVALID_HANDLE)
ferret99gt@1698
   139
	{
ferret99gt@1698
   140
		CloseHandle(g_TeamScores);
ferret99gt@1698
   141
	}
ferret99gt@1698
   142
	
ferret99gt@1698
   143
	g_TeamScores = CreateArray(2);
ferret99gt@1698
   144
	g_TotalRounds = 0;
ferret99gt@1861
   145
	
ferret99gt@1861
   146
	g_Extends = 0;
ferret99gt@1440
   147
}
ferret99gt@1440
   148
ferret99gt@1440
   149
public OnMapEnd()
ferret99gt@1440
   150
{
ferret99gt@1440
   151
	g_HasVoteStarted = false;
ferret99gt@1606
   152
	
ferret99gt@1606
   153
	if (g_VoteTimer != INVALID_HANDLE)
ferret99gt@1606
   154
	{
ferret99gt@1606
   155
		KillTimer(g_VoteTimer);
ferret99gt@1606
   156
		g_VoteTimer = INVALID_HANDLE;
ferret99gt@1606
   157
	}
ferret99gt@1606
   158
	
ferret99gt@1606
   159
	if (g_RetryTimer != INVALID_HANDLE)
ferret99gt@1606
   160
	{
ferret99gt@1606
   161
		KillTimer(g_RetryTimer);
ferret99gt@1606
   162
		g_RetryTimer = INVALID_HANDLE;
ferret99gt@1606
   163
	}
ferret99gt@1440
   164
}
ferret99gt@1440
   165
ferret99gt@1440
   166
public OnMapTimeLeftChanged()
ferret99gt@1440
   167
{
ferret99gt@1467
   168
	if (GetArraySize(g_MapList))
ferret99gt@1467
   169
	{
ferret99gt@1467
   170
		SetupTimeleftTimer();
ferret99gt@1467
   171
	}
ferret99gt@1440
   172
}
ferret99gt@1440
   173
ferret99gt@1440
   174
SetupTimeleftTimer()
ferret99gt@1440
   175
{
ferret99gt@1440
   176
	new time;
ferret99gt@1440
   177
	if (GetMapTimeLeft(time) && time > 0)
ferret99gt@1440
   178
	{
ferret99gt@1506
   179
		new startTime = GetConVarInt(g_Cvar_StartTime) * 60;
ferret99gt@1440
   180
		if (time - startTime < 0)
ferret99gt@1440
   181
		{
ferret99gt@1452
   182
			InitiateVote();		
ferret99gt@1440
   183
		}
ferret99gt@1440
   184
		else
ferret99gt@1440
   185
		{
ferret99gt@1440
   186
			if (g_VoteTimer != INVALID_HANDLE)
ferret99gt@1440
   187
			{
ferret99gt@1440
   188
				KillTimer(g_VoteTimer);
ferret99gt@1440
   189
				g_VoteTimer = INVALID_HANDLE;
ferret99gt@1452
   190
			}	
ferret99gt@1440
   191
			
ferret99gt@1606
   192
			g_VoteTimer = CreateTimer(float(time - startTime), Timer_StartMapVote);
ferret99gt@1440
   193
		}		
ferret99gt@1440
   194
	}
ferret99gt@1440
   195
}
ferret99gt@1440
   196
ferret99gt@1440
   197
public Action:Timer_StartMapVote(Handle:timer)
ferret99gt@1440
   198
{
ferret99gt@1452
   199
	if (!GetArraySize(g_MapList))
ferret99gt@1440
   200
	{
ferret99gt@1440
   201
		return Plugin_Stop;
ferret99gt@1479
   202
	}		
ferret99gt@1452
   203
	
ferret99gt@1440
   204
	if (timer == g_RetryTimer)
ferret99gt@1440
   205
	{
ferret99gt@1440
   206
		g_RetryTimer = INVALID_HANDLE;
ferret99gt@1440
   207
	}
ferret99gt@1440
   208
	else
ferret99gt@1440
   209
	{
ferret99gt@1440
   210
		g_VoteTimer = INVALID_HANDLE;
ferret99gt@1440
   211
	}
ferret99gt@1440
   212
ferret99gt@1440
   213
	InitiateVote();
ferret99gt@1440
   214
ferret99gt@1440
   215
	return Plugin_Stop;
ferret99gt@1440
   216
}
ferret99gt@1440
   217
ferret99gt@1479
   218
/* You ask, why don't you just use team_score event? And I answer... Because CSS doesn't. */
ferret99gt@1452
   219
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1440
   220
{
ferret99gt@1528
   221
	if (!GetArraySize(g_MapList) || g_HasVoteStarted)
ferret99gt@1440
   222
	{
ferret99gt@1440
   223
		return;
ferret99gt@1440
   224
	}
ferret99gt@1440
   225
ferret99gt@1479
   226
	new winner = GetEventInt(event, "winner");
ferret99gt@1479
   227
	
ferret99gt@1479
   228
	if (winner == 0 || winner == 1)
ferret99gt@1452
   229
	{
ferret99gt@1452
   230
		return;
ferret99gt@1452
   231
	}
ferret99gt@1479
   232
ferret99gt@1698
   233
	g_TotalRounds++;
ferret99gt@1479
   234
	
ferret99gt@1479
   235
	new team[2], teamPos = -1;
ferret99gt@1528
   236
	for (new i; i < GetArraySize(g_TeamScores); i++)
ferret99gt@1479
   237
	{
ferret99gt@1528
   238
		GetArrayArray(g_TeamScores, i, team);
ferret99gt@1479
   239
		if (team[0] == winner)
ferret99gt@1479
   240
		{
ferret99gt@1479
   241
			teamPos = i;
ferret99gt@1479
   242
			break;
ferret99gt@1479
   243
		}		
ferret99gt@1479
   244
	}
ferret99gt@1479
   245
	
ferret99gt@1479
   246
	if (teamPos == -1)
ferret99gt@1479
   247
	{
ferret99gt@1479
   248
		team[0] = winner;
ferret99gt@1479
   249
		team[1] = 1;
ferret99gt@1528
   250
		PushArrayArray(g_TeamScores, team);
ferret99gt@1479
   251
	}
ferret99gt@1479
   252
	else
ferret99gt@1479
   253
	{
ferret99gt@1479
   254
		team[1]++;
ferret99gt@1528
   255
		SetArrayArray(g_TeamScores, teamPos, team);
ferret99gt@1479
   256
	}	
ferret99gt@1452
   257
	
ferret99gt@1452
   258
	if (g_Cvar_Winlimit != INVALID_HANDLE)
ferret99gt@1440
   259
	{
ferret99gt@1452
   260
		new winlimit = GetConVarInt(g_Cvar_Winlimit);
ferret99gt@1452
   261
		if (winlimit)
ferret99gt@1440
   262
		{
ferret99gt@1528
   263
			if (team[1] >= (winlimit - GetConVarInt(g_Cvar_StartRounds)))
ferret99gt@1452
   264
			{
ferret99gt@1452
   265
				InitiateVote();
ferret99gt@1452
   266
			}
ferret99gt@1440
   267
		}
ferret99gt@1440
   268
	}
ferret99gt@1452
   269
	
ferret99gt@1452
   270
	if (g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1440
   271
	{
ferret99gt@1440
   272
		new maxrounds = GetConVarInt(g_Cvar_Maxrounds);
ferret99gt@1440
   273
		if (maxrounds)
ferret99gt@1440
   274
		{
ferret99gt@1698
   275
			if (g_TotalRounds >= (maxrounds - GetConVarInt(g_Cvar_StartRounds)))
ferret99gt@1440
   276
			{
ferret99gt@1440
   277
				InitiateVote();
ferret99gt@1440
   278
			}			
ferret99gt@1440
   279
		}
ferret99gt@1440
   280
	}
ferret99gt@1440
   281
}
ferret99gt@1440
   282
ferret99gt@1479
   283
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
ferret99gt@1479
   284
{
ferret99gt@1528
   285
	if (!GetArraySize(g_MapList) || g_Cvar_Fraglimit == INVALID_HANDLE || g_HasVoteStarted)
ferret99gt@1483
   286
	{
ferret99gt@1483
   287
		return;
ferret99gt@1483
   288
	}
ferret99gt@1483
   289
	
ferret99gt@1483
   290
	if (!GetConVarInt(g_Cvar_Fraglimit))
ferret99gt@1479
   291
	{
ferret99gt@1479
   292
		return;
ferret99gt@1479
   293
	}
ferret99gt@1479
   294
ferret99gt@1479
   295
	new fragger = GetClientOfUserId(GetEventInt(event, "attacker"));
ferret99gt@1528
   296
	if (fragger && GetClientFrags(fragger) >= (GetConVarInt(g_Cvar_Fraglimit) - GetConVarInt(g_Cvar_StartFrags)))
ferret99gt@1479
   297
	{
ferret99gt@1479
   298
		InitiateVote();
ferret99gt@1479
   299
	}
ferret99gt@1479
   300
}
ferret99gt@1479
   301
ferret99gt@1479
   302
public Action:Command_Mapvote(client, args)
ferret99gt@1517
   303
{
ferret99gt@1479
   304
	InitiateVote();
ferret99gt@1479
   305
ferret99gt@1479
   306
	return Plugin_Handled;	
ferret99gt@1479
   307
}
ferret99gt@1479
   308
ferret99gt@1440
   309
InitiateVote()
ferret99gt@1440
   310
{
ferret99gt@1440
   311
	if (g_HasVoteStarted || g_RetryTimer != INVALID_HANDLE)
ferret99gt@1440
   312
	{
ferret99gt@1440
   313
		return;
ferret99gt@1440
   314
	}
ferret99gt@1440
   315
	
ferret99gt@1440
   316
	if (IsVoteInProgress())
ferret99gt@1440
   317
	{
ferret99gt@1440
   318
		// Can't start a vote, try again in 5 seconds.
ferret99gt@1606
   319
		g_RetryTimer = CreateTimer(5.0, Timer_StartMapVote);
ferret99gt@1440
   320
		return;
ferret99gt@1440
   321
	}		
ferret99gt@1440
   322
	
ferret99gt@1440
   323
	g_HasVoteStarted = true;
ferret99gt@1440
   324
	g_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);
ferret99gt@1440
   325
	SetMenuTitle(g_VoteMenu, "Vote Nextmap");
ferret99gt@1440
   326
ferret99gt@1440
   327
	decl String:map[32];
ferret99gt@1452
   328
	for (new i = 0; i < GetArraySize(g_NextMapList); i++)
ferret99gt@1440
   329
	{
ferret99gt@1452
   330
		GetArrayString(g_NextMapList, i, map, sizeof(map));
ferret99gt@1440
   331
		AddMenuItem(g_VoteMenu, map, map);
ferret99gt@1440
   332
	}
ferret99gt@1440
   333
ferret99gt@1861
   334
	if (GetConVarBool(g_Cvar_Extend) && g_Extends < GetConVarInt(g_Cvar_Extend))
ferret99gt@1440
   335
	{
ferret99gt@1861
   336
		AddMenuItem(g_VoteMenu, VOTE_EXTEND, "Extend Map");
ferret99gt@1440
   337
	}
ferret99gt@1440
   338
ferret99gt@1440
   339
	SetMenuExitButton(g_VoteMenu, false);
ferret99gt@1440
   340
	VoteMenuToAll(g_VoteMenu, 20);
ferret99gt@1440
   341
ferret99gt@1440
   342
	LogMessage("Voting for next map has started.");
ferret99gt@1440
   343
	PrintToChatAll("[SM] %t", "Nextmap Voting Started");
ferret99gt@1440
   344
}
ferret99gt@1440
   345
ferret99gt@1440
   346
public Handler_MapVoteMenu(Handle:menu, MenuAction:action, param1, param2)
ferret99gt@1440
   347
{
ferret99gt@1440
   348
	switch (action)
ferret99gt@1440
   349
	{
ferret99gt@1440
   350
		case MenuAction_End:
ferret99gt@1440
   351
		{
ferret99gt@1440
   352
			g_VoteMenu = INVALID_HANDLE;
ferret99gt@1440
   353
			CloseHandle(menu);
ferret99gt@1440
   354
		}
ferret99gt@1440
   355
		
ferret99gt@1440
   356
		case MenuAction_Display:
ferret99gt@1440
   357
		{
ferret99gt@1440
   358
	 		decl String:buffer[255];
ferret99gt@1440
   359
			Format(buffer, sizeof(buffer), "%T", "Vote Nextmap", param1);
ferret99gt@1440
   360
ferret99gt@1440
   361
			new Handle:panel = Handle:param2;
ferret99gt@1440
   362
			SetPanelTitle(panel, buffer);
ferret99gt@1479
   363
		}		
ferret99gt@1479
   364
		
ferret99gt@1479
   365
		case MenuAction_DisplayItem:
ferret99gt@1479
   366
		{
ferret99gt@1479
   367
			if (GetMenuItemCount(menu) - 1 == param2)
ferret99gt@1479
   368
			{
ferret99gt@1479
   369
				decl String:map[64], String:buffer[255];
ferret99gt@1479
   370
				GetMenuItem(menu, param2, map, sizeof(map));
ferret99gt@1531
   371
				if (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1479
   372
				{
ferret99gt@1479
   373
					Format(buffer, sizeof(buffer), "%T", "Extend Map", param1);
ferret99gt@1479
   374
					return RedrawMenuItem(buffer);
ferret99gt@1479
   375
				}
ferret99gt@1479
   376
			}
ferret99gt@1479
   377
		}		
ferret99gt@1440
   378
ferret99gt@1440
   379
		// Why am I commented out? Because BAIL hasn't decided yet if
ferret99gt@1440
   380
		// vote notification will be built into the Vote API.
ferret99gt@1440
   381
		/*case MenuAction_Select:
ferret99gt@1440
   382
		{
ferret99gt@1440
   383
			decl String:Name[32], String:Map[32];
ferret99gt@1440
   384
			GetClientName(param1, Name, sizeof(Name));
ferret99gt@1440
   385
			GetMenuItem(menu, param2, Map, sizeof(Map));
ferret99gt@1440
   386
ferret99gt@1440
   387
			PrintToChatAll("[SM] %s has voted for map '%s'", Name, Map);
ferret99gt@1440
   388
		}*/
ferret99gt@1440
   389
		
ferret99gt@1440
   390
		case MenuAction_VoteCancel:
ferret99gt@1440
   391
		{
ferret99gt@1440
   392
			// If we receive 0 votes, pick at random.
ferret99gt@1531
   393
			if (param1 == VoteCancel_NoVotes && GetConVarBool(g_Cvar_NoVoteMode))
ferret99gt@1440
   394
			{
ferret99gt@1440
   395
				new count = GetMenuItemCount(menu);
ferret99gt@1440
   396
				new item = GetRandomInt(0, count - 1);
ferret99gt@1440
   397
				decl String:map[32];
ferret99gt@1440
   398
				GetMenuItem(menu, item, map, sizeof(map));
ferret99gt@1440
   399
				
ferret99gt@1531
   400
				while (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1440
   401
				{
ferret99gt@1440
   402
					item = GetRandomInt(0, count - 1);
ferret99gt@1440
   403
					GetMenuItem(menu, item, map, sizeof(map));
ferret99gt@1440
   404
				}
ferret99gt@1440
   405
				
ferret99gt@1440
   406
				SetNextMap(map);			
ferret99gt@1440
   407
			}
ferret99gt@1440
   408
			else
ferret99gt@1440
   409
			{
ferret99gt@1440
   410
				// We were actually cancelled. What should we do?
ferret99gt@1440
   411
			}
ferret99gt@1440
   412
		}
ferret99gt@1440
   413
ferret99gt@1440
   414
		case MenuAction_VoteEnd:
ferret99gt@1440
   415
		{
ferret99gt@1440
   416
			decl String:map[32];
ferret99gt@1440
   417
			GetMenuItem(menu, param1, map, sizeof(map));
ferret99gt@1440
   418
ferret99gt@1531
   419
			if (strcmp(map, VOTE_EXTEND, false) == 0)
ferret99gt@1440
   420
			{
ferret99gt@1861
   421
				g_Extends++;
ferret99gt@1861
   422
				
ferret99gt@1440
   423
				new time;
ferret99gt@1440
   424
				if (GetMapTimeLimit(time))
ferret99gt@1440
   425
				{
ferret99gt@1440
   426
					if (time > 0 && time < GetConVarInt(g_Cvar_ExtendTimeMax))
ferret99gt@1440
   427
					{
ferret99gt@1482
   428
						ExtendMapTimeLimit(GetConVarInt(g_Cvar_ExtendTimeStep)*60);						
ferret99gt@1440
   429
					}
ferret99gt@1440
   430
				}
ferret99gt@1440
   431
				
ferret99gt@1452
   432
				if (g_Cvar_Winlimit != INVALID_HANDLE)
ferret99gt@1440
   433
				{
ferret99gt@1440
   434
					new winlimit = GetConVarInt(g_Cvar_Winlimit);
ferret99gt@1452
   435
					if (winlimit && winlimit < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1440
   436
					{
ferret99gt@1452
   437
						SetConVarInt(g_Cvar_Winlimit, winlimit + GetConVarInt(g_Cvar_ExtendRoundStep));
ferret99gt@1452
   438
					}					
ferret99gt@1452
   439
				}
ferret99gt@1452
   440
				
ferret99gt@1452
   441
				if (g_Cvar_Maxrounds != INVALID_HANDLE)
ferret99gt@1452
   442
				{
ferret99gt@1452
   443
					new maxrounds = GetConVarInt(g_Cvar_Maxrounds);
ferret99gt@1452
   444
					if (maxrounds && maxrounds < GetConVarInt(g_Cvar_ExtendRoundMax))
ferret99gt@1440
   445
					{
ferret99gt@1452
   446
						SetConVarInt(g_Cvar_Maxrounds, maxrounds + GetConVarInt(g_Cvar_ExtendRoundStep));
ferret99gt@1440
   447
					}
ferret99gt@1440
   448
				}
ferret99gt@1479
   449
				
ferret99gt@1479
   450
				if (g_Cvar_Fraglimit != INVALID_HANDLE)
ferret99gt@1479
   451
				{
ferret99gt@1479
   452
					new fraglimit = GetConVarInt(g_Cvar_Fraglimit);
ferret99gt@1479
   453
					if (fraglimit && fraglimit < GetConVarInt(g_Cvar_ExtendFragMax))
ferret99gt@1479
   454
					{
ferret99gt@1479
   455
						SetConVarInt(g_Cvar_Fraglimit, fraglimit + GetConVarInt(g_Cvar_ExtendFragStep));						
ferret99gt@1479
   456
					}
ferret99gt@1479
   457
				}
ferret99gt@1440
   458
ferret99gt@1440
   459
				PrintToChatAll("[SM] %t", "Current Map Extended");
ferret99gt@1440
   460
				LogMessage("Voting for next map has finished. The current map has been extended.");
ferret99gt@1440
   461
				
ferret99gt@1445
   462
				// We extended, so we'll have to vote again.
ferret99gt@1440
   463
				g_HasVoteStarted = false;
ferret99gt@1479
   464
				CreateNextVote();
ferret99gt@1445
   465
				SetupTimeleftTimer();
ferret99gt@1440
   466
			}
ferret99gt@1440
   467
			else
ferret99gt@1440
   468
			{
ferret99gt@1440
   469
				SetNextMap(map);
ferret99gt@1440
   470
			}
ferret99gt@1440
   471
		}
ferret99gt@1440
   472
	}
ferret99gt@1479
   473
	
ferret99gt@1479
   474
	return 0;
ferret99gt@1440
   475
}
ferret99gt@1440
   476
ferret99gt@1440
   477
SetNextMap(const String:map[])
ferret99gt@1440
   478
{
ferret99gt@1440
   479
	SetConVarString(g_Cvar_Nextmap, map);
ferret99gt@1440
   480
	PushArrayString(g_OldMapList, map);
ferret99gt@1440
   481
				
ferret99gt@1479
   482
	if (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1440
   483
	{
ferret99gt@1440
   484
		RemoveFromArray(g_OldMapList, 0);
ferret99gt@1440
   485
	}
ferret99gt@1440
   486
		
ferret99gt@1452
   487
	PrintToChatAll("[SM] %t", "Nextmap Voting Finished", map);
ferret99gt@1440
   488
	LogMessage("Voting for next map has finished. Nextmap: %s.", map);	
ferret99gt@1440
   489
}
ferret99gt@1440
   490
ferret99gt@1440
   491
CreateNextVote()
ferret99gt@1440
   492
{
ferret99gt@1452
   493
	if(g_NextMapList != INVALID_HANDLE)
ferret99gt@1445
   494
	{
ferret99gt@1452
   495
		ClearArray(g_NextMapList);
ferret99gt@1533
   496
	}
ferret99gt@1440
   497
	
ferret99gt@1533
   498
	decl String:map[32];
ferret99gt@1719
   499
	new index, Handle:tempMaps  = CloneArray(g_MapList);
ferret99gt@1719
   500
	
ferret99gt@1719
   501
	GetCurrentMap(map, sizeof(map));
ferret99gt@1719
   502
	index = FindStringInArray(tempMaps, map);
ferret99gt@1719
   503
	if (index != -1)
ferret99gt@1719
   504
	{
ferret99gt@1719
   505
		RemoveFromArray(tempMaps, index);
ferret99gt@1719
   506
	}	
ferret99gt@1440
   507
	
ferret99gt@1664
   508
	if (GetConVarInt(g_Cvar_ExcludeMaps) && GetArraySize(tempMaps) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1533
   509
	{
ferret99gt@1533
   510
		for (new i = 0; i < GetArraySize(g_OldMapList); i++)
ferret99gt@1533
   511
		{
ferret99gt@1533
   512
			GetArrayString(g_OldMapList, i, map, sizeof(map));
ferret99gt@1719
   513
			index = FindStringInArray(tempMaps, map);
ferret99gt@1664
   514
			if (index != -1)
ferret99gt@1533
   515
			{
ferret99gt@1664
   516
				RemoveFromArray(tempMaps, index);
ferret99gt@1533
   517
			}
ferret99gt@1533
   518
		}	
ferret99gt@1533
   519
	}
ferret99gt@1533
   520
ferret99gt@1533
   521
	new limit = (GetConVarInt(g_Cvar_IncludeMaps) < GetArraySize(tempMaps) ? GetConVarInt(g_Cvar_IncludeMaps) : GetArraySize(tempMaps));
ferret99gt@1452
   522
	for (new i = 0; i < limit; i++)
ferret99gt@1440
   523
	{
ferret99gt@1533
   524
		new b = GetRandomInt(0, GetArraySize(tempMaps) - 1);
ferret99gt@1533
   525
		GetArrayString(tempMaps, b, map, sizeof(map));		
ferret99gt@1533
   526
		PushArrayString(g_NextMapList, map);
ferret99gt@1533
   527
		RemoveFromArray(tempMaps, b);
ferret99gt@1440
   528
	}
ferret99gt@1642
   529
	
ferret99gt@1642
   530
	CloseHandle(tempMaps);
ferret99gt@1440
   531
}