plugins/mapmanager/commands.sp
author Scott Ehlert <ds@alliedmods.net>
Thu Mar 27 04:54:56 2008 +0000 (2008-03-27)
changeset 1947 e73a1e51833b
parent 1945 13106cdc0a3c
permissions -rw-r--r--
Updated copyright year
dvander@1945
     1
/**
dvander@1945
     2
 * vim: set ts=4 :
dvander@1945
     3
 * =============================================================================
dvander@1945
     4
 * SourceMod Map Manager Plugin
dvander@1945
     5
 * Contains callbacks for commands
dvander@1945
     6
 *
ds@1947
     7
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@1945
     8
 * =============================================================================
dvander@1945
     9
 *
dvander@1945
    10
 * This program is free software; you can redistribute it and/or modify it under
dvander@1945
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1945
    12
 * Free Software Foundation.
dvander@1945
    13
 * 
dvander@1945
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1945
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1945
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@1945
    17
 * details.
dvander@1945
    18
 *
dvander@1945
    19
 * You should have received a copy of the GNU General Public License along with
dvander@1945
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1945
    21
 *
dvander@1945
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1945
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1945
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1945
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@1945
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@1945
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@1945
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1945
    29
 * or <http://www.sourcemod.net/license.php>.
dvander@1945
    30
 *
dvander@1945
    31
 * Version: $Id$
dvander@1945
    32
 */
dvander@1945
    33
 
dvander@1945
    34
 public Action:Command_Say(client, args)
dvander@1945
    35
 {
dvander@1945
    36
	decl String:text[192];
dvander@1945
    37
	if (GetCmdArgString(text, sizeof(text)) < 1)
dvander@1945
    38
	{
dvander@1945
    39
		return Plugin_Continue;
dvander@1945
    40
	}
dvander@1945
    41
	
dvander@1945
    42
	new startidx;
dvander@1945
    43
	if (text[strlen(text)-1] == '"')
dvander@1945
    44
	{
dvander@1945
    45
		text[strlen(text)-1] = '\0';
dvander@1945
    46
		startidx = 1;
dvander@1945
    47
	}
dvander@1945
    48
	
dvander@1945
    49
	decl String:message[8];
dvander@1945
    50
	BreakString(text[startidx], message, sizeof(message));
dvander@1945
    51
	
dvander@1945
    52
	if (strcmp(message, "nextmap", false) == 0)
dvander@1945
    53
	{
dvander@1945
    54
		decl String:map[32];
dvander@1945
    55
		GetConVarString(g_Cvar_Nextmap, map, sizeof(map));
dvander@1945
    56
		
dvander@1945
    57
		PrintToChat(client, "%t", "Next Map", map);
dvander@1945
    58
	}
dvander@1945
    59
	else
dvander@1945
    60
	{
dvander@1945
    61
		if (GetConVarBool(g_Cvar_RockTheVote) && (strcmp(text[startidx], "rtv", false) == 0 || strcmp(text[startidx], "rockthevote", false) == 0))
dvander@1945
    62
		{
dvander@1945
    63
			if (g_MapChanged)
dvander@1945
    64
			{
dvander@1945
    65
				ReplyToCommand(client, "[SM] %t", "Map change in progress");
dvander@1945
    66
				return Plugin_Continue;
dvander@1945
    67
			}			
dvander@1945
    68
			
dvander@1945
    69
			if (!g_RTV_Allowed)
dvander@1945
    70
			{
dvander@1945
    71
				PrintToChat(client, "[SM] %t", "RTV Not Allowed");
dvander@1945
    72
				return Plugin_Continue;
dvander@1945
    73
			}
dvander@1945
    74
			
dvander@1945
    75
			if (g_RTV_Ended)
dvander@1945
    76
			{
dvander@1945
    77
				PrintToChat(client, "[SM] %t", "RTV Ended");
dvander@1945
    78
				return Plugin_Continue;
dvander@1945
    79
			}
dvander@1945
    80
			
dvander@1945
    81
			if (g_RTV_Started)
dvander@1945
    82
			{
dvander@1945
    83
				PrintToChat(client, "[SM] %t", "RTV Started");
dvander@1945
    84
				return Plugin_Continue;
dvander@1945
    85
			}
dvander@1945
    86
			
dvander@1945
    87
			if (GetClientCount(true) < GetConVarInt(g_Cvar_MinPlayers) && g_RTV_Votes == 0) // Should we keep checking g_Votes here?
dvander@1945
    88
			{
dvander@1945
    89
				PrintToChat(client, "[SM] %t", "Minimal Players Not Met");
dvander@1945
    90
				return Plugin_Continue;			
dvander@1945
    91
			}
dvander@1945
    92
			
dvander@1945
    93
			if (g_RTV_Voted[client])
dvander@1945
    94
			{
dvander@1945
    95
				PrintToChat(client, "[SM] %t", "Already Voted");
dvander@1945
    96
				return Plugin_Continue;
dvander@1945
    97
			}	
dvander@1945
    98
			
dvander@1945
    99
			new String:name[64];
dvander@1945
   100
			GetClientName(client, name, sizeof(name));
dvander@1945
   101
			
dvander@1945
   102
			g_RTV_Votes++;
dvander@1945
   103
			g_RTV_Voted[client] = true;
dvander@1945
   104
			
dvander@1945
   105
			PrintToChatAll("[SM] %t", "RTV Requested", name, g_RTV_Votes, g_RTV_VotesNeeded);
dvander@1945
   106
			
dvander@1945
   107
			if (g_RTV_Votes >= g_RTV_VotesNeeded)
dvander@1945
   108
			{
dvander@1945
   109
				g_RTV_Started = true;
dvander@1945
   110
				CreateTimer(2.0, Timer_StartRTV, TIMER_FLAG_NO_MAPCHANGE);
dvander@1945
   111
			}
dvander@1945
   112
		}
dvander@1945
   113
		else if (GetConVarBool(g_Cvar_Nominate) && strcmp(text[startidx], "nominate", false) == 0)
dvander@1945
   114
		{
dvander@1945
   115
			if (g_MapChanged)
dvander@1945
   116
			{
dvander@1945
   117
				ReplyToCommand(client, "[SM] %t", "Map change in progress");
dvander@1945
   118
				return Plugin_Continue;
dvander@1945
   119
			}
dvander@1945
   120
			
dvander@1945
   121
			if (g_RTV_Started || g_HasVoteStarted)
dvander@1945
   122
			{
dvander@1945
   123
				ReplyToCommand(client, "[SM] %t", "Map vote in progress");
dvander@1945
   124
				return Plugin_Continue;				
dvander@1945
   125
			}
dvander@1945
   126
			
dvander@1945
   127
			if (g_Nominated[client])
dvander@1945
   128
			{
dvander@1945
   129
				PrintToChat(client, "[SM] %t", "Already Nominated");
dvander@1945
   130
				return Plugin_Continue;
dvander@1945
   131
			}
dvander@1945
   132
			
dvander@1945
   133
			if (GetArraySize(g_Nominate) >= GetConVarInt(g_Cvar_Maps))
dvander@1945
   134
			{
dvander@1945
   135
				PrintToChat(client, "[SM] %t", "Max Nominations");
dvander@1945
   136
				return Plugin_Continue;			
dvander@1945
   137
			}
dvander@1945
   138
			
dvander@1945
   139
			DisplayMenu(g_Menu_Nominate, client, MENU_TIME_FOREVER);		
dvander@1945
   140
		}		
dvander@1945
   141
	}
dvander@1945
   142
	
dvander@1945
   143
	return Plugin_Continue;	
dvander@1945
   144
}
dvander@1945
   145
dvander@1945
   146
public Action:Command_Mapvote(client, args)
dvander@1945
   147
{
dvander@1945
   148
	InitiateVote();
dvander@1945
   149
dvander@1945
   150
	return Plugin_Handled;	
dvander@1945
   151
}
dvander@1945
   152
 
dvander@1945
   153
public Action:Command_Nextmap(args)
dvander@1945
   154
{
dvander@1945
   155
	decl String:map[64];
dvander@1945
   156
	
dvander@1945
   157
	GetConVarString(g_Cvar_Nextmap, map, sizeof(map));
dvander@1945
   158
	
dvander@1945
   159
	ReplyToCommand(0, "%t", "Next Map", map);
dvander@1945
   160
	
dvander@1945
   161
	return Plugin_Handled;
dvander@1945
   162
} 
dvander@1945
   163
 
dvander@1945
   164
public Action:Command_List(client, args) 
dvander@1945
   165
{
dvander@1945
   166
	PrintToConsole(client, "Map Cycle:");
dvander@1945
   167
	
dvander@1945
   168
	decl String:currentMap[64];
dvander@1945
   169
	GetCurrentMap(currentMap, 64);	
dvander@1945
   170
	
dvander@1945
   171
	decl String:mapName[64];
dvander@1945
   172
	for (new i = 0; i < GetArraySize(g_MapCycle); i++)
dvander@1945
   173
	{
dvander@1945
   174
		GetArrayString(g_MapCycle, i, mapName, sizeof(mapName));
dvander@1945
   175
		if (strcmp(mapName, currentMap) == 0)
dvander@1945
   176
		{
dvander@1945
   177
			PrintToConsole(client, "%s <========= Current map", mapName);
dvander@1945
   178
		}
dvander@1945
   179
		else if (strcmp(mapName, g_NextMap) == 0)
dvander@1945
   180
		{
dvander@1945
   181
			PrintToConsole(client, "%s <========= Next map", mapName);
dvander@1945
   182
		}
dvander@1945
   183
		else
dvander@1945
   184
		{
dvander@1945
   185
			PrintToConsole(client, "%s", mapName);
dvander@1945
   186
		}
dvander@1945
   187
	}
dvander@1945
   188
 
dvander@1945
   189
	return Plugin_Handled;
dvander@1945
   190
} 
dvander@1945
   191
dvander@1945
   192
public Action:Command_SetNextmap(client, args)
dvander@1945
   193
{
dvander@1945
   194
	if (args < 1)
dvander@1945
   195
	{
dvander@1945
   196
		ReplyToCommand(client, "[SM] Usage: sm_setnextmap <map>");
dvander@1945
   197
		return Plugin_Handled;
dvander@1945
   198
	}
dvander@1945
   199
	
dvander@1945
   200
	if (g_MapChanged)
dvander@1945
   201
	{
dvander@1945
   202
		ReplyToCommand(client, "[SM] %t", "Map change in progress");
dvander@1945
   203
		return Plugin_Handled;
dvander@1945
   204
	}	
dvander@1945
   205
dvander@1945
   206
	decl String:map[64];
dvander@1945
   207
	GetCmdArg(1, map, sizeof(map));
dvander@1945
   208
dvander@1945
   209
	if (!IsMapValid(map))
dvander@1945
   210
	{
dvander@1945
   211
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
dvander@1945
   212
		return Plugin_Handled;
dvander@1945
   213
	}
dvander@1945
   214
dvander@1945
   215
	ShowActivity(client, "%t", "Cvar changed", "sm_nextmap", map);
dvander@1945
   216
	LogMessage("\"%L\" changed sm_nextmap to \"%s\"", client, map);
dvander@1945
   217
dvander@1945
   218
	SetNextMap(map);
dvander@1945
   219
dvander@1945
   220
	return Plugin_Handled;
dvander@1945
   221
}
dvander@1945
   222
 
dvander@1945
   223
 public Action:Command_Map(client, args)
dvander@1945
   224
 {
dvander@1945
   225
	if (args < 1)
dvander@1945
   226
	{
dvander@1945
   227
		ReplyToCommand(client, "[SM] Usage: sm_map <map> [r/e]");
dvander@1945
   228
		return Plugin_Handled;
dvander@1945
   229
	}
dvander@1945
   230
	
dvander@1945
   231
	if (g_MapChanged)
dvander@1945
   232
	{
dvander@1945
   233
		ReplyToCommand(client, "[SM] %t", "Map change in progress");
dvander@1945
   234
		return Plugin_Handled;
dvander@1945
   235
	}
dvander@1945
   236
 
dvander@1945
   237
	decl String:map[64];
dvander@1945
   238
	GetCmdArg(1, map, sizeof(map));
dvander@1945
   239
 
dvander@1945
   240
	if (!IsMapValid(map))
dvander@1945
   241
	{
dvander@1945
   242
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
dvander@1945
   243
		return Plugin_Handled;
dvander@1945
   244
	}
dvander@1945
   245
	
dvander@1945
   246
	decl String:when[2];
dvander@1945
   247
	if (args > 1)
dvander@1945
   248
	{
dvander@1945
   249
		GetCmdArg(2, when, sizeof(when));
dvander@1945
   250
		
dvander@1945
   251
		when[0] = CharToLower(when[0]);
dvander@1945
   252
		if (when[0] != 'r' && when[0] != 'e')
dvander@1945
   253
		{
dvander@1945
   254
			when[0] = 'i';
dvander@1945
   255
		}	
dvander@1945
   256
	}
dvander@1945
   257
	
dvander@1945
   258
	SetMapChange(client, map, when);
dvander@1945
   259
 
dvander@1945
   260
	return Plugin_Handled;
dvander@1945
   261
}
dvander@1945
   262
dvander@1945
   263
public Action:Command_Votemap(client, args)
dvander@1945
   264
{
dvander@1945
   265
	if (args < 1)
dvander@1945
   266
	{
dvander@1945
   267
		ReplyToCommand(client, "[SM] Usage: sm_votemap [r/e] <mapname> [mapname2] ... [mapname5]");
dvander@1945
   268
		return Plugin_Handled;	
dvander@1945
   269
	}
dvander@1945
   270
	
dvander@1945
   271
	if (g_MapChanged)
dvander@1945
   272
	{
dvander@1945
   273
		ReplyToCommand(client, "[SM] %t", "Map change in progress");
dvander@1945
   274
		return Plugin_Handled;
dvander@1945
   275
	}	
dvander@1945
   276
	
dvander@1945
   277
	if (IsVoteInProgress())
dvander@1945
   278
	{
dvander@1945
   279
		ReplyToCommand(client, "[SM] %t", "Vote in Progress");
dvander@1945
   280
		return Plugin_Handled;
dvander@1945
   281
	}
dvander@1945
   282
		
dvander@1945
   283
	if (!TestVoteDelay(client))
dvander@1945
   284
	{
dvander@1945
   285
		return Plugin_Handled;
dvander@1945
   286
	}
dvander@1945
   287
	
dvander@1945
   288
	decl String:text[256];
dvander@1945
   289
	GetCmdArgString(text, sizeof(text));
dvander@1945
   290
dvander@1945
   291
	decl String:maps[5][64];
dvander@1945
   292
	new mapCount;	
dvander@1945
   293
	new len, pos;
dvander@1945
   294
dvander@1945
   295
	// Find out if the user specified "when"
dvander@1945
   296
	decl String:when[64];
dvander@1945
   297
	pos = BreakString(text[len], when, sizeof(when));
dvander@1945
   298
	if (!IsMapValid(when))
dvander@1945
   299
	{
dvander@1945
   300
		when[0] = CharToLower(when[0]);
dvander@1945
   301
		if (when[0] != 'r' && when[0] != 'e')
dvander@1945
   302
		{
dvander@1945
   303
			ReplyToCommand(client, "[SM] %t", "Map was not found", maps[mapCount]);
dvander@1945
   304
			return Plugin_Handled;
dvander@1945
   305
		}
dvander@1945
   306
	}
dvander@1945
   307
	else
dvander@1945
   308
	{
dvander@1945
   309
		strcpy(maps[mapCount], sizeof(maps[]), when);
dvander@1945
   310
		mapCount++;
dvander@1945
   311
		when[0] = 'i';
dvander@1945
   312
	}
dvander@1945
   313
	
dvander@1945
   314
	len += pos;
dvander@1945
   315
	
dvander@1945
   316
	while (pos != -1 && mapCount < 5)
dvander@1945
   317
	{	
dvander@1945
   318
		pos = BreakString(text[len], maps[mapCount], sizeof(maps[]));
dvander@1945
   319
		
dvander@1945
   320
		if (!IsMapValid(maps[mapCount]))
dvander@1945
   321
		{
dvander@1945
   322
			ReplyToCommand(client, "[SM] %t", "Map was not found", maps[mapCount]);
dvander@1945
   323
			return Plugin_Handled;
dvander@1945
   324
		}		
dvander@1945
   325
dvander@1945
   326
		mapCount++;
dvander@1945
   327
		
dvander@1945
   328
		len += pos;
dvander@1945
   329
	}
dvander@1945
   330
dvander@1945
   331
	g_VoteMapInUse = client;
dvander@1945
   332
	g_Client_Data[client][0] = when[0];
dvander@1945
   333
dvander@1945
   334
	DisplayVoteMapMenu(client, mapCount, maps);
dvander@1945
   335
	
dvander@1945
   336
	return Plugin_Handled;	
dvander@1945
   337
}
dvander@1945
   338
dvander@1945
   339
public Action:Command_Nominate(client, args)
dvander@1945
   340
{
dvander@1945
   341
	if (args < 1)
dvander@1945
   342
	{
dvander@1945
   343
		ReplyToCommand(client, "[SM] Usage: sm_nominate <mapname>");
dvander@1945
   344
		return Plugin_Handled;
dvander@1945
   345
	}
dvander@1945
   346
	
dvander@1945
   347
	if (!GetConVarBool(g_Cvar_Nominate))
dvander@1945
   348
	{
dvander@1945
   349
		ReplyToCommand(client, "[SM] Nominations are currently disabled.");
dvander@1945
   350
		return Plugin_Handled;
dvander@1945
   351
	}
dvander@1945
   352
	
dvander@1945
   353
	decl String:mapname[64];
dvander@1945
   354
	GetCmdArg(1, mapname, sizeof(mapname));
dvander@1945
   355
dvander@1945
   356
	if (FindStringInArray(g_MapList, mapname) == -1)
dvander@1945
   357
	{
dvander@1945
   358
		ReplyToCommand(client, "%t", "Map was not found", mapname);
dvander@1945
   359
		return Plugin_Handled;
dvander@1945
   360
	}
dvander@1945
   361
	
dvander@1945
   362
	if (GetArraySize(g_Nominated) > 0)
dvander@1945
   363
	{
dvander@1945
   364
		if (FindStringInArray(g_Nominated, mapname) != -1)
dvander@1945
   365
		{
dvander@1945
   366
			ReplyToCommand(client, "%t", "Map Already In Vote", mapname);
dvander@1945
   367
			return Plugin_Handled;				
dvander@1945
   368
		}
dvander@1945
   369
		
dvander@1945
   370
		ShiftArrayUp(g_Nominated, 0);
dvander@1945
   371
		SetArrayString(g_Nominated, 0, mapname);
dvander@1945
   372
		
dvander@1945
   373
		while (GetArraySize(g_Nominated) > GetConVarInt(g_Cvar_Maps))
dvander@1945
   374
		{
dvander@1945
   375
			RemoveFromArray(g_Nominated, GetConVarInt(g_Cvar_Maps));
dvander@1945
   376
		}
dvander@1945
   377
	}
dvander@1945
   378
	else
dvander@1945
   379
	{
dvander@1945
   380
		PushArrayString(g_Nominated, mapname);
dvander@1945
   381
	}
dvander@1945
   382
		
dvander@1945
   383
	decl String:item[64];
dvander@1945
   384
	for (new i = 0; i < GetMenuItemCount(g_Menu_Nominate); i++)
dvander@1945
   385
	{
dvander@1945
   386
		GetMenuItem(g_Menu_Nominate, i, item, sizeof(item));
dvander@1945
   387
		if (strcmp(item, mapname) == 0)
dvander@1945
   388
		{
dvander@1945
   389
			RemoveMenuItem(g_Menu_Nominate, i);
dvander@1945
   390
			break;
dvander@1945
   391
		}			
dvander@1945
   392
	}	
dvander@1945
   393
	
dvander@1945
   394
	ReplyToCommand(client, "%t", "Map Inserted", mapname);
dvander@1945
   395
	LogAction(client, -1, "\"%L\" inserted map \"%s\".", client, mapname);
dvander@1945
   396
dvander@1945
   397
	return Plugin_Handled;		
dvander@1945
   398
}