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