plugins/basecommands.sp
author David Anderson <dvander@alliedmods.net>
Wed Aug 29 05:22:47 2007 +0000 (2007-08-29)
changeset 1390 287480a3f664
parent 1378 115ba755bcdf
child 1417 79f72a315320
permissions -rw-r--r--
moved trie to public so extensions can use it easier
dvander@910
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Basic Commands Plugin
ds@913
     5
 * Implements basic admin commands.
ds@1330
     6
 *
ds@1330
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     8
 * =============================================================================
dvander@910
     9
 *
ds@1330
    10
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    12
 * Free Software Foundation.
ds@1330
    13
 * 
ds@1330
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    17
 * details.
dvander@910
    18
 *
ds@1330
    19
 * You should have received a copy of the GNU General Public License along with
ds@1330
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
teame06@1211
    21
 *
ds@1330
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    29
 * or <http://www.sourcemod.net/license.php>.
ds@913
    30
 *
ds@913
    31
 * Version: $Id$
dvander@910
    32
 */
dvander@910
    33
ds@989
    34
#pragma semicolon 1
dvander@910
    35
ds@989
    36
#include <sourcemod>
ds@913
    37
teame06@1211
    38
public Plugin:myinfo =
dvander@910
    39
{
dvander@910
    40
	name = "Basic Commands",
dvander@910
    41
	author = "AlliedModders LLC",
dvander@910
    42
	description = "Basic Admin Commands",
dvander@910
    43
	version = SOURCEMOD_VERSION,
dvander@910
    44
	url = "http://www.sourcemod.net/"
dvander@910
    45
};
dvander@910
    46
dvander@926
    47
new Handle:hBanForward = INVALID_HANDLE;
dvander@927
    48
new Handle:hAddBanForward = INVALID_HANDLE;
dvander@927
    49
new Handle:hBanRemoved = INVALID_HANDLE;
dvander@926
    50
dvander@910
    51
public OnPluginStart()
dvander@910
    52
{
dvander@1027
    53
	LoadTranslations("common.phrases");
teame06@1211
    54
dvander@910
    55
	RegAdminCmd("sm_kick", Command_Kick, ADMFLAG_KICK, "sm_kick <#userid|name> [reason]");
dvander@917
    56
	RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map <map>");
dvander@918
    57
	RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon <args>");
dvander@920
    58
	RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar <cvar> [value]");
dvander@921
    59
	RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg <filename>");
dvander@923
    60
	RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]");
dvander@924
    61
	RegAdminCmd("sm_ban", Command_Ban, ADMFLAG_BAN, "sm_ban <#userid|name> <minutes|0> [reason]");
dvander@925
    62
	RegAdminCmd("sm_unban", Command_Unban, ADMFLAG_UNBAN, "sm_unban <steamid>");
dvander@930
    63
	RegAdminCmd("sm_addban", Command_AddBan, ADMFLAG_RCON, "sm_addban <time> <steamid> [reason]");
dvander@1374
    64
	RegAdminCmd("sm_banip", Command_BanIp, ADMFLAG_BAN, "sm_banip <time> <ip|#userid|name> [reason]");
dvander@1162
    65
	RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins");
ferret99gt@1276
    66
	RegAdminCmd("sm_cancelvote", Command_CancelVote, ADMFLAG_VOTE, "sm_cancelvote");
ferret99gt@1276
    67
	
dvander@982
    68
	hBanForward = CreateGlobalForward("OnClientBanned", ET_Hook, Param_Cell, Param_Cell, Param_Cell, Param_String);
dvander@982
    69
	hAddBanForward = CreateGlobalForward("OnBanAdded", ET_Hook, Param_Cell, Param_String, Param_Cell, Param_String);
dvander@982
    70
	hBanRemoved = CreateGlobalForward("OnBanRemoved", ET_Hook, Param_Cell, Param_String);
dvander@927
    71
}
dvander@927
    72
dvander@1162
    73
public Action:Command_ReloadAdmins(client, args)
dvander@1162
    74
{
dvander@1162
    75
	/* Dump it all! */
dvander@1162
    76
	DumpAdminCache(AdminCache_Groups, true);
dvander@1162
    77
	DumpAdminCache(AdminCache_Overrides, true);
teame06@1211
    78
dvander@1378
    79
	LogAction(client, -1, "\"%L\" refreshed the admin cache.", client);
dvander@1162
    80
	ReplyToCommand(client, "[SM] %t", "Admin cache refreshed");
teame06@1211
    81
dvander@1162
    82
	return Plugin_Handled;
dvander@1162
    83
}
dvander@1162
    84
dvander@927
    85
public Action:Command_BanIp(client, args)
dvander@927
    86
{
dvander@927
    87
	if (args < 2)
dvander@927
    88
	{
dvander@1374
    89
		ReplyToCommand(client, "[SM] Usage: sm_banip <time> <ip|#userid|name> [reason]");
dvander@927
    90
		return Plugin_Handled;
dvander@927
    91
	}
teame06@1211
    92
faluco@1118
    93
	decl String:arg[50], String:time[20];
dvander@927
    94
	GetCmdArg(1, time, sizeof(time));
dvander@927
    95
	GetCmdArg(2, arg, sizeof(arg));
dvander@1374
    96
	
dvander@1374
    97
	if (StrEqual(arg, "0"))
dvander@1374
    98
	{
dvander@1374
    99
		ReplyToCommand(client, "[SM] %t", "Cannot ban that IP");
dvander@1374
   100
		return Plugin_Handled;
dvander@1374
   101
	}
dvander@1374
   102
	
dvander@1374
   103
	new clients[1];
dvander@1374
   104
	new numClients = SearchForClients(arg, clients, 1);
dvander@1374
   105
dvander@1374
   106
	new bool:has_rcon;
dvander@1374
   107
	
dvander@1374
   108
	if (client == 0 || (client == 1 && !IsDedicatedServer()))
dvander@1374
   109
	{
dvander@1374
   110
		has_rcon = true;
dvander@1374
   111
	} else {
dvander@1374
   112
		new AdminId:id = GetUserAdmin(client);
dvander@1374
   113
		has_rcon = (id == INVALID_ADMIN_ID) ? false : GetAdminFlag(id, Admin_RCON);
dvander@1374
   114
	}
dvander@1374
   115
	
dvander@1378
   116
	new hit_client = -1;
dvander@1374
   117
	if (numClients == 1 
dvander@1374
   118
		&& !IsFakeClient(clients[0])
dvander@1374
   119
		&& (has_rcon || CanUserTarget(client, clients[0])))
dvander@1374
   120
	{
dvander@1374
   121
		GetClientIP(clients[0], arg, sizeof(arg));
dvander@1378
   122
		hit_client = clients[0];
dvander@1374
   123
	}
dvander@1374
   124
	
dvander@1378
   125
	if (hit_client == -1 && !has_rcon)
dvander@1374
   126
	{
dvander@1374
   127
		ReplyToCommand(client, "[SM] %t", "No Access");
dvander@1374
   128
		return Plugin_Handled;
dvander@1374
   129
	}
teame06@1211
   130
dvander@927
   131
	new minutes = StringToInt(time);
teame06@1211
   132
faluco@1118
   133
	decl String:reason[128];
dvander@927
   134
	if (args >= 3)
dvander@927
   135
	{
dvander@927
   136
		GetCmdArg(3, reason, sizeof(reason));
dvander@927
   137
	}
teame06@1211
   138
dvander@982
   139
	new Action:act = Plugin_Continue;
dvander@927
   140
	Call_StartForward(hAddBanForward);
dvander@927
   141
	Call_PushCell(client);
dvander@927
   142
	Call_PushString(arg);
dvander@927
   143
	Call_PushCell(minutes);
dvander@927
   144
	Call_PushString(reason);
dvander@982
   145
	Call_Finish(act);
teame06@1211
   146
dvander@982
   147
	if (act < Plugin_Handled)
dvander@982
   148
	{
dvander@1378
   149
		LogAction(client, hit_client, "\"%L\" added ban (minutes \"%d\") (ip \"%s\") (reason \"%s\")", client, minutes, arg, reason);
dvander@982
   150
		ReplyToCommand(client, "[SM] %t", "Ban added");
dvander@982
   151
	}
teame06@1211
   152
dvander@982
   153
	if (act < Plugin_Stop)
dvander@982
   154
	{
dvander@1374
   155
		ServerCommand("addip %d %s", minutes, arg);
dvander@982
   156
		ServerCommand("writeip");
dvander@982
   157
	}
teame06@1211
   158
dvander@927
   159
	return Plugin_Handled;
dvander@927
   160
}
dvander@927
   161
dvander@927
   162
public Action:Command_AddBan(client, args)
dvander@927
   163
{
dvander@927
   164
	if (args < 2)
dvander@927
   165
	{
dvander@927
   166
		ReplyToCommand(client, "[SM] Usage: sm_addban <time> <steamid> [reason]");
dvander@927
   167
		return Plugin_Handled;
dvander@927
   168
	}
teame06@1211
   169
faluco@1118
   170
	decl String:arg[50], String:time[20];
dvander@927
   171
	GetCmdArg(1, time, sizeof(time));
dvander@927
   172
	GetCmdArg(2, arg, sizeof(arg));
teame06@1211
   173
dvander@927
   174
	new minutes = StringToInt(time);
teame06@1211
   175
dvander@1263
   176
	new String:reason[128];
dvander@927
   177
	if (args >= 3)
dvander@927
   178
	{
dvander@927
   179
		GetCmdArg(3, reason, sizeof(reason));
dvander@927
   180
	}
teame06@1211
   181
dvander@982
   182
	new Action:act = Plugin_Continue;
dvander@927
   183
	Call_StartForward(hAddBanForward);
dvander@927
   184
	Call_PushCell(client);
dvander@927
   185
	Call_PushString(arg);
dvander@927
   186
	Call_PushCell(minutes);
dvander@927
   187
	Call_PushString(reason);
dvander@982
   188
	Call_Finish(act);
teame06@1211
   189
dvander@982
   190
	if (act < Plugin_Handled)
dvander@982
   191
	{
dvander@1378
   192
		LogAction(client, -1, "\"%L\" added ban (minutes \"%d\") (id \"%s\") (reason \"%s\")", client, minutes, arg, reason);
dvander@982
   193
		ReplyToCommand(client, "[SM] %t", "Ban added");
dvander@982
   194
	}
teame06@1211
   195
dvander@982
   196
	if (act < Plugin_Stop)
dvander@982
   197
	{
dvander@982
   198
		ServerCommand("banid %d %s", minutes, arg);
dvander@982
   199
		ServerCommand("writeid");
dvander@982
   200
	}
teame06@1211
   201
dvander@927
   202
	return Plugin_Handled;
dvander@925
   203
}
dvander@925
   204
dvander@925
   205
public Action:Command_Unban(client, args)
dvander@925
   206
{
dvander@925
   207
	if (args < 1)
dvander@925
   208
	{
dvander@925
   209
		ReplyToCommand(client, "[SM] Usage: sm_unban <steamid>");
dvander@925
   210
		return Plugin_Handled;
dvander@925
   211
	}
teame06@1211
   212
teame06@1215
   213
	decl String:arg[50], String:new_arg[50];
faluco@1118
   214
	new start=0;
dvander@925
   215
	GetCmdArgString(arg, sizeof(arg));
teame06@1211
   216
teame06@1215
   217
	if(arg[start] == '"')
dvander@925
   218
	{
teame06@1215
   219
		start++;
teame06@1215
   220
	}
teame06@1215
   221
teame06@1215
   222
	if (strncmp(arg[start], "STEAM_0:", 8, false) == 0)
dvander@925
   223
	{
teame06@1215
   224
		start += 8;
teame06@1215
   225
	} else if (strncmp(arg[start], "0:1:", 4) == 0 || strncmp(arg[start], "0:0:", 4) == 0) {
teame06@1215
   226
		start += 2;
dvander@925
   227
	}
teame06@1211
   228
dvander@982
   229
	Format(new_arg, sizeof(new_arg), "STEAM_0:%s", arg[start]);
teame06@1211
   230
teame06@1215
   231
	/* Remove white spaces */
teame06@1215
   232
	new len = TrimString(new_arg);
teame06@1215
   233
	if(new_arg[len - 1] == '"')
teame06@1215
   234
	{
teame06@1215
   235
		new_arg[len - 1] = '\0';
teame06@1215
   236
	}
teame06@1215
   237
dvander@982
   238
	new Action:act = Plugin_Continue;
dvander@927
   239
	Call_StartForward(hBanRemoved);
dvander@927
   240
	Call_PushCell(client);
dvander@927
   241
	Call_PushString(new_arg);
ds@1138
   242
	Call_Finish(act);
teame06@1211
   243
dvander@982
   244
	if (act < Plugin_Handled)
dvander@982
   245
	{
dvander@1378
   246
		LogAction(client, -1, "\"%L\" removed ban (filter \"%s\")", client, new_arg);
teame06@1215
   247
		ReplyToCommand(client, "[SM] %t", "Removed bans matching", new_arg);
dvander@982
   248
	}
teame06@1211
   249
dvander@982
   250
	if (act < Plugin_Stop)
dvander@982
   251
	{
teame06@1215
   252
		ServerCommand("removeid %s", new_arg);
dvander@982
   253
		ServerCommand("writeid");
dvander@982
   254
	}
teame06@1211
   255
dvander@925
   256
	return Plugin_Handled;
dvander@924
   257
}
dvander@924
   258
dvander@924
   259
public Action:Command_Ban(client, args)
dvander@924
   260
{
dvander@924
   261
	if (args < 2)
dvander@924
   262
	{
dvander@924
   263
		ReplyToCommand(client, "[SM] Usage: sm_ban <#userid|name> <minutes|0> [reason]");
dvander@924
   264
		return Plugin_Handled;
dvander@924
   265
	}
teame06@1211
   266
faluco@1118
   267
	decl String:arg[65];
dvander@924
   268
	GetCmdArg(1, arg, sizeof(arg));
teame06@1211
   269
ferret99gt@1195
   270
	new target = FindTarget(client, arg, true);
ferret99gt@1195
   271
	if (target == -1)
dvander@924
   272
	{
dvander@924
   273
		return Plugin_Handled;
dvander@924
   274
	}
teame06@1211
   275
faluco@1118
   276
	decl String:s_time[12];
dvander@924
   277
	GetCmdArg(2, s_time, sizeof(s_time));
teame06@1211
   278
dvander@924
   279
	new time = StringToInt(s_time);
teame06@1211
   280
dvander@924
   281
	decl String:reason[128];
dvander@924
   282
	if (args >= 3)
dvander@924
   283
	{
dvander@924
   284
		GetCmdArg(3, reason, sizeof(reason));
dvander@924
   285
	} else {
dvander@924
   286
		reason[0] = '\0';
dvander@924
   287
	}
teame06@1211
   288
teame06@1197
   289
	decl String:authid[64];
ferret99gt@1195
   290
	GetClientAuthString(target, authid, sizeof(authid));
ferret99gt@1195
   291
	GetClientName(target, arg, sizeof(arg));
teame06@1211
   292
dvander@926
   293
	/* Fire the ban forward */
dvander@982
   294
	new Action:act = Plugin_Continue;
dvander@926
   295
	Call_StartForward(hBanForward);
dvander@926
   296
	Call_PushCell(client);
ferret99gt@1195
   297
	Call_PushCell(target);
dvander@927
   298
	Call_PushCell(time);
dvander@926
   299
	Call_PushString(reason);
ds@1138
   300
	Call_Finish(act);
teame06@1211
   301
dvander@982
   302
	if (act < Plugin_Handled)
dvander@924
   303
	{
dvander@982
   304
		if (!time)
dvander@982
   305
		{
dvander@982
   306
			if (reason[0] == '\0')
dvander@982
   307
			{
dvander@982
   308
				ShowActivity(client, "%t", "Permabanned player", arg);
dvander@982
   309
			} else {
dvander@982
   310
				ShowActivity(client, "%t", "Permabanned player reason", arg, reason);
dvander@982
   311
			}
dvander@982
   312
		} else {
dvander@982
   313
			if (reason[0] == '\0')
dvander@982
   314
			{
dvander@982
   315
				ShowActivity(client, "%t", "Banned player", arg, time);
dvander@982
   316
			} else {
dvander@982
   317
				ShowActivity(client, "%t", "Banned player reason", arg, time, reason);
dvander@982
   318
			}
dvander@982
   319
		}
dvander@1378
   320
		LogAction(client, target, "\"%L\" banned \"%L\" (minutes \"%d\") (reason \"%s\")", client, target, time, reason);
dvander@924
   321
	}
dvander@982
   322
dvander@982
   323
	if (act < Plugin_Stop)
dvander@924
   324
	{
dvander@982
   325
		if (reason[0] == '\0')
dvander@982
   326
		{
dvander@982
   327
			strcopy(reason, sizeof(reason), "Banned");
dvander@982
   328
		}
teame06@1211
   329
ds@1144
   330
		ServerCommand("banid %d %s", time, authid);
ferret99gt@1195
   331
		KickClient(target, "%s", reason);
teame06@1211
   332
dvander@982
   333
		if (time == 0)
dvander@982
   334
		{
dvander@982
   335
			ServerCommand("writeid");
dvander@982
   336
		}
dvander@924
   337
	}
teame06@1211
   338
dvander@924
   339
	return Plugin_Handled;
dvander@923
   340
}
dvander@923
   341
dvander@923
   342
#define FLAG_STRINGS		14
dvander@923
   343
new String:g_FlagNames[FLAG_STRINGS][20] =
dvander@923
   344
{
dvander@1376
   345
	"res",
dvander@923
   346
	"admin",
dvander@923
   347
	"kick",
dvander@923
   348
	"ban",
dvander@923
   349
	"unban",
dvander@923
   350
	"slay",
dvander@923
   351
	"map",
dvander@923
   352
	"cvars",
dvander@923
   353
	"cfg",
dvander@923
   354
	"chat",
dvander@923
   355
	"vote",
dvander@923
   356
	"pass",
dvander@923
   357
	"rcon",
dvander@923
   358
	"cheat"
dvander@923
   359
};
dvander@923
   360
dvander@1376
   361
CustomFlagsToString(String:buffer[], maxlength, flags)
dvander@1376
   362
{
dvander@1376
   363
	decl String:joins[6][6];
dvander@1376
   364
	new total;
dvander@1376
   365
	
dvander@1376
   366
	for (new i=_:Admin_Custom1; i<=_:Admin_Custom6; i++)
dvander@1376
   367
	{
dvander@1376
   368
		if (flags & (1<<i))
dvander@1376
   369
		{
dvander@1376
   370
			IntToString(i - _:Admin_Custom1 + 1, joins[total++], 6);
dvander@1376
   371
		}
dvander@1376
   372
	}
dvander@1376
   373
	
dvander@1376
   374
	ImplodeStrings(joins, total, ",", buffer, maxlength);
dvander@1376
   375
	
dvander@1376
   376
	return total;
dvander@1376
   377
}
dvander@1376
   378
dvander@923
   379
FlagsToString(String:buffer[], maxlength, flags)
dvander@923
   380
{
dvander@1376
   381
	decl String:joins[FLAG_STRINGS+1][32];
dvander@923
   382
	new total;
teame06@1211
   383
dvander@923
   384
	for (new i=0; i<FLAG_STRINGS; i++)
dvander@923
   385
	{
dvander@923
   386
		if (flags & (1<<i))
dvander@923
   387
		{
dvander@1376
   388
			strcopy(joins[total++], 32, g_FlagNames[i]);
dvander@923
   389
		}
dvander@923
   390
	}
dvander@1376
   391
	
dvander@1376
   392
	decl String:custom_flags[32];
dvander@1376
   393
	if (CustomFlagsToString(custom_flags, sizeof(custom_flags), flags))
dvander@1376
   394
	{
dvander@1376
   395
		Format(joins[total++], 32, "custom(%s)", custom_flags);
dvander@1376
   396
	}
teame06@1211
   397
dvander@923
   398
	ImplodeStrings(joins, total, ", ", buffer, maxlength);
dvander@923
   399
}
dvander@923
   400
dvander@923
   401
public Action:Command_Who(client, args)
dvander@923
   402
{
dvander@923
   403
	if (args < 1)
dvander@923
   404
	{
dvander@923
   405
		/* Display header */
faluco@1118
   406
		decl String:t_access[16], String:t_name[16];
dvander@923
   407
		Format(t_access, sizeof(t_access), "%t", "Access", client);
dvander@923
   408
		Format(t_name, sizeof(t_name), "%t", "Name", client);
teame06@1211
   409
dvander@923
   410
		PrintToConsole(client, "%-24.23s %s", t_name, t_access);
teame06@1211
   411
dvander@923
   412
		/* List all players */
dvander@923
   413
		new maxClients = GetMaxClients();
faluco@1118
   414
		decl String:flagstring[255];
teame06@1211
   415
dvander@923
   416
		for (new i=1; i<=maxClients; i++)
dvander@923
   417
		{
dvander@923
   418
			if (!IsClientInGame(i))
dvander@923
   419
			{
dvander@923
   420
				continue;
dvander@923
   421
			}
dvander@923
   422
			new flags = GetUserFlagBits(i);
dvander@923
   423
			if (flags == 0)
dvander@923
   424
			{
dvander@923
   425
				strcopy(flagstring, sizeof(flagstring), "none");
dvander@923
   426
			} else if (flags & ADMFLAG_ROOT) {
dvander@923
   427
				strcopy(flagstring, sizeof(flagstring), "root");
dvander@923
   428
			} else {
dvander@923
   429
				FlagsToString(flagstring, sizeof(flagstring), flags);
dvander@923
   430
			}
dvander@923
   431
			decl String:name[65];
dvander@923
   432
			GetClientName(i, name, sizeof(name));
dvander@923
   433
			PrintToConsole(client, "%d. %-24.23s %s", i, name, flagstring);
dvander@923
   434
		}
teame06@1211
   435
dvander@923
   436
		if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
dvander@923
   437
		{
dvander@923
   438
			ReplyToCommand(client, "[SM] %t", "See console for output");
dvander@923
   439
		}
teame06@1211
   440
dvander@923
   441
		return Plugin_Handled;
dvander@923
   442
	}
teame06@1211
   443
faluco@1118
   444
	decl String:arg[65];
dvander@923
   445
	GetCmdArg(1, arg, sizeof(arg));
teame06@1211
   446
dvander@923
   447
	new clients[2];
dvander@923
   448
	new numClients = SearchForClients(arg, clients, 2);
teame06@1211
   449
dvander@923
   450
	if (numClients == 0)
dvander@923
   451
	{
dvander@923
   452
		ReplyToCommand(client, "[SM] %t", "No matching client");
dvander@923
   453
		return Plugin_Handled;
dvander@923
   454
	} else if (numClients > 1) {
dvander@923
   455
		ReplyToCommand(client, "[SM] %t", "More than one client matches", arg);
dvander@923
   456
		return Plugin_Handled;
dvander@923
   457
	}
teame06@1211
   458
dvander@923
   459
	new flags = GetUserFlagBits(clients[0]);
faluco@1118
   460
	decl String:flagstring[255];
dvander@923
   461
	if (flags == 0)
dvander@923
   462
	{
dvander@923
   463
		strcopy(flagstring, sizeof(flagstring), "none");
dvander@923
   464
	} else if (flags & ADMFLAG_ROOT) {
dvander@923
   465
		strcopy(flagstring, sizeof(flagstring), "root");
dvander@923
   466
	} else {
dvander@923
   467
		FlagsToString(flagstring, sizeof(flagstring), flags);
dvander@923
   468
	}
teame06@1211
   469
dvander@923
   470
	ReplyToCommand(client, "[SM] %t: %s", "Access", flagstring);
teame06@1211
   471
dvander@923
   472
	return Plugin_Handled;
dvander@921
   473
}
dvander@921
   474
dvander@921
   475
public Action:Command_ExecCfg(client, args)
dvander@921
   476
{
dvander@921
   477
	if (args < 1)
dvander@921
   478
	{
dvander@921
   479
		ReplyToCommand(client, "[SM] Usage: sm_execcfg <filename>");
dvander@921
   480
		return Plugin_Handled;
dvander@921
   481
	}
teame06@1211
   482
dvander@921
   483
	new String:path[64] = "cfg/";
dvander@921
   484
	GetCmdArg(1, path[4], sizeof(path)-4);
teame06@1211
   485
dvander@921
   486
	if (!FileExists(path))
dvander@921
   487
	{
dvander@921
   488
		ReplyToCommand(client, "[SM] %t", "Config not found", path[4]);
dvander@921
   489
		return Plugin_Handled;
dvander@921
   490
	}
teame06@1211
   491
dvander@924
   492
	ShowActivity(client, "%t", "Executed config", path[4]);
teame06@1211
   493
dvander@1378
   494
	LogAction(client, -1, "\"%L\" executed config (file \"%s\")", client, path[4]);
teame06@1211
   495
dvander@921
   496
	ServerCommand("exec \"%s\"", path[4]);
teame06@1211
   497
dvander@921
   498
	return Plugin_Handled;
dvander@920
   499
}
dvander@920
   500
dvander@920
   501
public Action:Command_Cvar(client, args)
dvander@920
   502
{
dvander@920
   503
	if (args < 1)
dvander@920
   504
	{
dvander@920
   505
		ReplyToCommand(client, "[SM] Usage: sm_cvar <cvar> [value]");
dvander@920
   506
		return Plugin_Handled;
dvander@920
   507
	}
teame06@1211
   508
faluco@1118
   509
	decl String:cvarname[33];
dvander@920
   510
	GetCmdArg(1, cvarname, sizeof(cvarname));
teame06@1211
   511
dvander@920
   512
	new Handle:hndl = FindConVar(cvarname);
dvander@920
   513
	if (hndl == INVALID_HANDLE)
dvander@920
   514
	{
dvander@920
   515
		ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname);
dvander@920
   516
		return Plugin_Handled;
dvander@920
   517
	}
teame06@1211
   518
dvander@920
   519
	new bool:allowed = false;
dvander@920
   520
	if (GetConVarFlags(hndl) & FCVAR_PROTECTED)
dvander@920
   521
	{
dvander@920
   522
		/* If they're root, allow anything */
dvander@920
   523
		if ((GetUserFlagBits(client) & ADMFLAG_ROOT) == ADMFLAG_ROOT)
dvander@920
   524
		{
dvander@920
   525
			allowed = true;
dvander@920
   526
		}
dvander@920
   527
		/* If they're not root, and getting sv_password, see if they have ADMFLAG_PASSWORD */
dvander@920
   528
		else if (StrEqual(cvarname, "sv_password") && (GetUserFlagBits(client) & ADMFLAG_PASSWORD))
dvander@920
   529
		{
dvander@920
   530
			allowed = true;
dvander@920
   531
		}
teame06@1211
   532
	}
dvander@920
   533
	/* Do a check for the cheat cvar */
dvander@920
   534
	else if (StrEqual(cvarname, "sv_cheats"))
dvander@920
   535
	{
dvander@929
   536
		if (GetUserFlagBits(client) & ADMFLAG_CHEATS
dvander@929
   537
			|| GetUserFlagBits(client) & ADMFLAG_ROOT)
dvander@920
   538
		{
dvander@920
   539
			allowed = true;
dvander@920
   540
		}
dvander@920
   541
	}
dvander@920
   542
	/* If we drop down to here, it was a normal cvar. */
dvander@920
   543
	else
dvander@920
   544
	{
dvander@920
   545
		allowed = true;
dvander@920
   546
	}
teame06@1211
   547
dvander@920
   548
	if (!allowed)
dvander@920
   549
	{
dvander@920
   550
		ReplyToCommand(client, "[SM] %t", "No access to cvar");
dvander@920
   551
		return Plugin_Handled;
dvander@920
   552
	}
teame06@1211
   553
dvander@920
   554
	decl String:value[255];
dvander@920
   555
	if (args < 2)
dvander@920
   556
	{
dvander@920
   557
		GetConVarString(hndl, value, sizeof(value));
teame06@1211
   558
dvander@920
   559
		ReplyToCommand(client, "[SM] %t", "Value of cvar", cvarname, value);
dvander@920
   560
		return Plugin_Handled;
dvander@920
   561
	}
teame06@1211
   562
dvander@920
   563
	GetCmdArg(2, value, sizeof(value));
teame06@1211
   564
dvander@920
   565
	if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED)
dvander@920
   566
	{
dvander@920
   567
		ShowActivity(client, "%t", "Cvar changed", cvarname, value);
dvander@924
   568
	} else {
dvander@924
   569
		ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value);
dvander@920
   570
	}
teame06@1211
   571
dvander@1378
   572
	LogAction(client, -1, "\"%L\" changed cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value);
teame06@1211
   573
ds@937
   574
	SetConVarString(hndl, value, true);
teame06@1211
   575
dvander@920
   576
	return Plugin_Handled;
dvander@918
   577
}
dvander@918
   578
dvander@918
   579
public Action:Command_Rcon(client, args)
dvander@918
   580
{
dvander@918
   581
	if (args < 1)
dvander@918
   582
	{
dvander@918
   583
		ReplyToCommand(client, "[SM] Usage: sm_rcon <args>");
dvander@918
   584
		return Plugin_Handled;
dvander@918
   585
	}
teame06@1211
   586
dvander@918
   587
	decl String:argstring[255];
dvander@918
   588
	GetCmdArgString(argstring, sizeof(argstring));
teame06@1211
   589
dvander@1378
   590
	LogAction(client, -1, "\"%L\" console command (cmdline \"%s\")", client, argstring);
teame06@1211
   591
dvander@918
   592
	ServerCommand("%s", argstring);
teame06@1211
   593
dvander@918
   594
	return Plugin_Handled;
dvander@917
   595
}
dvander@917
   596
dvander@917
   597
public Action:Command_Map(client, args)
dvander@917
   598
{
dvander@917
   599
	if (args < 1)
dvander@917
   600
	{
dvander@917
   601
		ReplyToCommand(client, "[SM] Usage: sm_map <map>");
dvander@917
   602
		return Plugin_Handled;
dvander@917
   603
	}
teame06@1211
   604
faluco@1118
   605
	decl String:map[64];
dvander@917
   606
	GetCmdArg(1, map, sizeof(map));
teame06@1211
   607
dvander@917
   608
	if (!IsMapValid(map))
dvander@917
   609
	{
dvander@917
   610
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
dvander@917
   611
		return Plugin_Handled;
dvander@917
   612
	}
teame06@1211
   613
dvander@924
   614
	ShowActivity(client, "%t", "Changing map", map);
teame06@1211
   615
dvander@1378
   616
	LogAction(client, -1, "\"%L\" changed map to \"%s\"", client, map);
teame06@1211
   617
dvander@918
   618
	new Handle:dp;
dvander@917
   619
	CreateDataTimer(3.0, Timer_ChangeMap, dp);
dvander@917
   620
	WritePackString(dp, map);
teame06@1211
   621
dvander@917
   622
	return Plugin_Handled;
dvander@917
   623
}
dvander@917
   624
dvander@917
   625
public Action:Timer_ChangeMap(Handle:timer, Handle:dp)
dvander@917
   626
{
faluco@1118
   627
	decl String:map[65];
teame06@1211
   628
dvander@917
   629
	ResetPack(dp);
dvander@917
   630
	ReadPackString(dp, map, sizeof(map));
teame06@1211
   631
dvander@917
   632
	ServerCommand("changelevel \"%s\"", map);
teame06@1211
   633
dvander@917
   634
	return Plugin_Stop;
dvander@910
   635
}
dvander@910
   636
dvander@910
   637
public Action:Command_Kick(client, args)
dvander@910
   638
{
dvander@910
   639
	if (args < 1)
dvander@910
   640
	{
dvander@910
   641
		ReplyToCommand(client, "[SM] Usage: sm_kick <#userid|name> [reason]");
dvander@910
   642
		return Plugin_Handled;
dvander@910
   643
	}
teame06@1211
   644
teame06@1216
   645
teame06@1216
   646
	decl String:Arguments[256];
teame06@1216
   647
	GetCmdArgString(Arguments, sizeof(Arguments));
teame06@1216
   648
faluco@1118
   649
	decl String:arg[65];
teame06@1216
   650
	new len = BreakString(Arguments, arg, sizeof(arg));
teame06@1211
   651
ferret99gt@1195
   652
	new target = FindTarget(client, arg);
ferret99gt@1195
   653
	if (target == -1)
dvander@910
   654
	{
dvander@924
   655
		return Plugin_Handled;
dvander@910
   656
	}
teame06@1211
   657
teame06@1216
   658
	GetClientName(target, arg, sizeof(arg));
teame06@1211
   659
teame06@1216
   660
	if (len == -1)
dvander@910
   661
	{
dvander@910
   662
		/* Safely null terminate */
teame06@1216
   663
		len = 0;
teame06@1216
   664
		Arguments[0] = '\0';
dvander@910
   665
	}
teame06@1211
   666
teame06@1216
   667
	ShowActivity(client, "%t", "Kicked player", arg);
dvander@1378
   668
	LogAction(client, target, "\"%L\" kicked \"%L\" (reason \"%s\")", client, target, Arguments[len]);
teame06@1211
   669
teame06@1216
   670
	KickClient(target, "%s", Arguments[len]);
teame06@1211
   671
dvander@910
   672
	return Plugin_Handled;
dvander@910
   673
}
ferret99gt@1276
   674
ferret99gt@1276
   675
public Action:Command_CancelVote(client, args)
ferret99gt@1276
   676
{
ferret99gt@1278
   677
	if (!IsVoteInProgress())
ferret99gt@1276
   678
	{
ferret99gt@1276
   679
		ReplyToCommand(client, "[SM] %t", "Vote Not In Progress");
ferret99gt@1276
   680
		return Plugin_Handled;
ferret99gt@1276
   681
	}
ferret99gt@1276
   682
ferret99gt@1276
   683
	ShowActivity(client, "%t", "Cancelled Vote");
ferret99gt@1276
   684
	
ferret99gt@1276
   685
	CancelVote();
ferret99gt@1276
   686
	
ferret99gt@1276
   687
	return Plugin_Handled;
ferret99gt@1276
   688
}