plugins/basecommands.sp
author Borja Ferrer <faluco@alliedmods.net>
Sat Sep 29 22:26:36 2007 +0000 (2007-09-29)
changeset 1504 312c2e8934b1
parent 1423 e73b3563f254
child 1510 de71b8774afc
permissions -rw-r--r--
added amb964, DispatchKeyValue natives
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@910
    47
public OnPluginStart()
dvander@910
    48
{
dvander@1027
    49
	LoadTranslations("common.phrases");
teame06@1211
    50
dvander@910
    51
	RegAdminCmd("sm_kick", Command_Kick, ADMFLAG_KICK, "sm_kick <#userid|name> [reason]");
dvander@917
    52
	RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map <map>");
dvander@918
    53
	RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon <args>");
dvander@920
    54
	RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar <cvar> [value]");
dvander@921
    55
	RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg <filename>");
dvander@923
    56
	RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]");
dvander@1162
    57
	RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins");
ferret99gt@1276
    58
	RegAdminCmd("sm_cancelvote", Command_CancelVote, ADMFLAG_VOTE, "sm_cancelvote");
dvander@927
    59
}
dvander@927
    60
dvander@1162
    61
public Action:Command_ReloadAdmins(client, args)
dvander@1162
    62
{
dvander@1162
    63
	/* Dump it all! */
dvander@1162
    64
	DumpAdminCache(AdminCache_Groups, true);
dvander@1162
    65
	DumpAdminCache(AdminCache_Overrides, true);
teame06@1211
    66
dvander@1378
    67
	LogAction(client, -1, "\"%L\" refreshed the admin cache.", client);
dvander@1162
    68
	ReplyToCommand(client, "[SM] %t", "Admin cache refreshed");
teame06@1211
    69
dvander@1162
    70
	return Plugin_Handled;
dvander@1162
    71
}
dvander@1162
    72
dvander@923
    73
#define FLAG_STRINGS		14
dvander@923
    74
new String:g_FlagNames[FLAG_STRINGS][20] =
dvander@923
    75
{
dvander@1376
    76
	"res",
dvander@923
    77
	"admin",
dvander@923
    78
	"kick",
dvander@923
    79
	"ban",
dvander@923
    80
	"unban",
dvander@923
    81
	"slay",
dvander@923
    82
	"map",
dvander@923
    83
	"cvars",
dvander@923
    84
	"cfg",
dvander@923
    85
	"chat",
dvander@923
    86
	"vote",
dvander@923
    87
	"pass",
dvander@923
    88
	"rcon",
dvander@923
    89
	"cheat"
dvander@923
    90
};
dvander@923
    91
dvander@1376
    92
CustomFlagsToString(String:buffer[], maxlength, flags)
dvander@1376
    93
{
dvander@1376
    94
	decl String:joins[6][6];
dvander@1376
    95
	new total;
dvander@1376
    96
	
dvander@1376
    97
	for (new i=_:Admin_Custom1; i<=_:Admin_Custom6; i++)
dvander@1376
    98
	{
dvander@1376
    99
		if (flags & (1<<i))
dvander@1376
   100
		{
dvander@1376
   101
			IntToString(i - _:Admin_Custom1 + 1, joins[total++], 6);
dvander@1376
   102
		}
dvander@1376
   103
	}
dvander@1376
   104
	
dvander@1376
   105
	ImplodeStrings(joins, total, ",", buffer, maxlength);
dvander@1376
   106
	
dvander@1376
   107
	return total;
dvander@1376
   108
}
dvander@1376
   109
dvander@923
   110
FlagsToString(String:buffer[], maxlength, flags)
dvander@923
   111
{
dvander@1376
   112
	decl String:joins[FLAG_STRINGS+1][32];
dvander@923
   113
	new total;
teame06@1211
   114
dvander@923
   115
	for (new i=0; i<FLAG_STRINGS; i++)
dvander@923
   116
	{
dvander@923
   117
		if (flags & (1<<i))
dvander@923
   118
		{
dvander@1376
   119
			strcopy(joins[total++], 32, g_FlagNames[i]);
dvander@923
   120
		}
dvander@923
   121
	}
dvander@1376
   122
	
dvander@1376
   123
	decl String:custom_flags[32];
dvander@1376
   124
	if (CustomFlagsToString(custom_flags, sizeof(custom_flags), flags))
dvander@1376
   125
	{
dvander@1376
   126
		Format(joins[total++], 32, "custom(%s)", custom_flags);
dvander@1376
   127
	}
teame06@1211
   128
dvander@923
   129
	ImplodeStrings(joins, total, ", ", buffer, maxlength);
dvander@923
   130
}
dvander@923
   131
dvander@923
   132
public Action:Command_Who(client, args)
dvander@923
   133
{
dvander@923
   134
	if (args < 1)
dvander@923
   135
	{
dvander@923
   136
		/* Display header */
faluco@1118
   137
		decl String:t_access[16], String:t_name[16];
dvander@923
   138
		Format(t_access, sizeof(t_access), "%t", "Access", client);
dvander@923
   139
		Format(t_name, sizeof(t_name), "%t", "Name", client);
teame06@1211
   140
dvander@923
   141
		PrintToConsole(client, "%-24.23s %s", t_name, t_access);
teame06@1211
   142
dvander@923
   143
		/* List all players */
dvander@923
   144
		new maxClients = GetMaxClients();
faluco@1118
   145
		decl String:flagstring[255];
teame06@1211
   146
dvander@923
   147
		for (new i=1; i<=maxClients; i++)
dvander@923
   148
		{
dvander@923
   149
			if (!IsClientInGame(i))
dvander@923
   150
			{
dvander@923
   151
				continue;
dvander@923
   152
			}
dvander@923
   153
			new flags = GetUserFlagBits(i);
dvander@923
   154
			if (flags == 0)
dvander@923
   155
			{
dvander@923
   156
				strcopy(flagstring, sizeof(flagstring), "none");
dvander@923
   157
			} else if (flags & ADMFLAG_ROOT) {
dvander@923
   158
				strcopy(flagstring, sizeof(flagstring), "root");
dvander@923
   159
			} else {
dvander@923
   160
				FlagsToString(flagstring, sizeof(flagstring), flags);
dvander@923
   161
			}
dvander@923
   162
			decl String:name[65];
dvander@923
   163
			GetClientName(i, name, sizeof(name));
dvander@923
   164
			PrintToConsole(client, "%d. %-24.23s %s", i, name, flagstring);
dvander@923
   165
		}
teame06@1211
   166
dvander@923
   167
		if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
dvander@923
   168
		{
dvander@923
   169
			ReplyToCommand(client, "[SM] %t", "See console for output");
dvander@923
   170
		}
teame06@1211
   171
dvander@923
   172
		return Plugin_Handled;
dvander@923
   173
	}
teame06@1211
   174
faluco@1118
   175
	decl String:arg[65];
dvander@923
   176
	GetCmdArg(1, arg, sizeof(arg));
teame06@1211
   177
dvander@923
   178
	new clients[2];
dvander@923
   179
	new numClients = SearchForClients(arg, clients, 2);
teame06@1211
   180
dvander@923
   181
	if (numClients == 0)
dvander@923
   182
	{
dvander@923
   183
		ReplyToCommand(client, "[SM] %t", "No matching client");
dvander@923
   184
		return Plugin_Handled;
dvander@923
   185
	} else if (numClients > 1) {
dvander@923
   186
		ReplyToCommand(client, "[SM] %t", "More than one client matches", arg);
dvander@923
   187
		return Plugin_Handled;
dvander@923
   188
	}
teame06@1211
   189
dvander@923
   190
	new flags = GetUserFlagBits(clients[0]);
faluco@1118
   191
	decl String:flagstring[255];
dvander@923
   192
	if (flags == 0)
dvander@923
   193
	{
dvander@923
   194
		strcopy(flagstring, sizeof(flagstring), "none");
dvander@923
   195
	} else if (flags & ADMFLAG_ROOT) {
dvander@923
   196
		strcopy(flagstring, sizeof(flagstring), "root");
dvander@923
   197
	} else {
dvander@923
   198
		FlagsToString(flagstring, sizeof(flagstring), flags);
dvander@923
   199
	}
teame06@1211
   200
dvander@923
   201
	ReplyToCommand(client, "[SM] %t: %s", "Access", flagstring);
teame06@1211
   202
dvander@923
   203
	return Plugin_Handled;
dvander@921
   204
}
dvander@921
   205
dvander@921
   206
public Action:Command_ExecCfg(client, args)
dvander@921
   207
{
dvander@921
   208
	if (args < 1)
dvander@921
   209
	{
dvander@921
   210
		ReplyToCommand(client, "[SM] Usage: sm_execcfg <filename>");
dvander@921
   211
		return Plugin_Handled;
dvander@921
   212
	}
teame06@1211
   213
dvander@921
   214
	new String:path[64] = "cfg/";
dvander@921
   215
	GetCmdArg(1, path[4], sizeof(path)-4);
teame06@1211
   216
dvander@921
   217
	if (!FileExists(path))
dvander@921
   218
	{
dvander@921
   219
		ReplyToCommand(client, "[SM] %t", "Config not found", path[4]);
dvander@921
   220
		return Plugin_Handled;
dvander@921
   221
	}
teame06@1211
   222
dvander@924
   223
	ShowActivity(client, "%t", "Executed config", path[4]);
teame06@1211
   224
dvander@1378
   225
	LogAction(client, -1, "\"%L\" executed config (file \"%s\")", client, path[4]);
teame06@1211
   226
dvander@921
   227
	ServerCommand("exec \"%s\"", path[4]);
teame06@1211
   228
dvander@921
   229
	return Plugin_Handled;
dvander@920
   230
}
dvander@920
   231
dvander@920
   232
public Action:Command_Cvar(client, args)
dvander@920
   233
{
dvander@920
   234
	if (args < 1)
dvander@920
   235
	{
dvander@920
   236
		ReplyToCommand(client, "[SM] Usage: sm_cvar <cvar> [value]");
dvander@920
   237
		return Plugin_Handled;
dvander@920
   238
	}
teame06@1211
   239
faluco@1118
   240
	decl String:cvarname[33];
dvander@920
   241
	GetCmdArg(1, cvarname, sizeof(cvarname));
teame06@1211
   242
dvander@920
   243
	new Handle:hndl = FindConVar(cvarname);
dvander@920
   244
	if (hndl == INVALID_HANDLE)
dvander@920
   245
	{
dvander@920
   246
		ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname);
dvander@920
   247
		return Plugin_Handled;
dvander@920
   248
	}
teame06@1211
   249
dvander@920
   250
	new bool:allowed = false;
dvander@920
   251
	if (GetConVarFlags(hndl) & FCVAR_PROTECTED)
dvander@920
   252
	{
dvander@920
   253
		/* If they're root, allow anything */
dvander@920
   254
		if ((GetUserFlagBits(client) & ADMFLAG_ROOT) == ADMFLAG_ROOT)
dvander@920
   255
		{
dvander@920
   256
			allowed = true;
dvander@920
   257
		}
dvander@920
   258
		/* If they're not root, and getting sv_password, see if they have ADMFLAG_PASSWORD */
dvander@920
   259
		else if (StrEqual(cvarname, "sv_password") && (GetUserFlagBits(client) & ADMFLAG_PASSWORD))
dvander@920
   260
		{
dvander@920
   261
			allowed = true;
dvander@920
   262
		}
teame06@1211
   263
	}
dvander@920
   264
	/* Do a check for the cheat cvar */
dvander@920
   265
	else if (StrEqual(cvarname, "sv_cheats"))
dvander@920
   266
	{
dvander@929
   267
		if (GetUserFlagBits(client) & ADMFLAG_CHEATS
dvander@929
   268
			|| GetUserFlagBits(client) & ADMFLAG_ROOT)
dvander@920
   269
		{
dvander@920
   270
			allowed = true;
dvander@920
   271
		}
dvander@920
   272
	}
dvander@920
   273
	/* If we drop down to here, it was a normal cvar. */
dvander@920
   274
	else
dvander@920
   275
	{
dvander@920
   276
		allowed = true;
dvander@920
   277
	}
teame06@1211
   278
dvander@920
   279
	if (!allowed)
dvander@920
   280
	{
dvander@920
   281
		ReplyToCommand(client, "[SM] %t", "No access to cvar");
dvander@920
   282
		return Plugin_Handled;
dvander@920
   283
	}
teame06@1211
   284
dvander@920
   285
	decl String:value[255];
dvander@920
   286
	if (args < 2)
dvander@920
   287
	{
dvander@920
   288
		GetConVarString(hndl, value, sizeof(value));
teame06@1211
   289
dvander@920
   290
		ReplyToCommand(client, "[SM] %t", "Value of cvar", cvarname, value);
dvander@920
   291
		return Plugin_Handled;
dvander@920
   292
	}
teame06@1211
   293
dvander@920
   294
	GetCmdArg(2, value, sizeof(value));
teame06@1211
   295
dvander@920
   296
	if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED)
dvander@920
   297
	{
dvander@920
   298
		ShowActivity(client, "%t", "Cvar changed", cvarname, value);
dvander@924
   299
	} else {
dvander@924
   300
		ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value);
dvander@920
   301
	}
teame06@1211
   302
dvander@1378
   303
	LogAction(client, -1, "\"%L\" changed cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value);
teame06@1211
   304
ds@937
   305
	SetConVarString(hndl, value, true);
teame06@1211
   306
dvander@920
   307
	return Plugin_Handled;
dvander@918
   308
}
dvander@918
   309
dvander@918
   310
public Action:Command_Rcon(client, args)
dvander@918
   311
{
dvander@918
   312
	if (args < 1)
dvander@918
   313
	{
dvander@918
   314
		ReplyToCommand(client, "[SM] Usage: sm_rcon <args>");
dvander@918
   315
		return Plugin_Handled;
dvander@918
   316
	}
teame06@1211
   317
dvander@918
   318
	decl String:argstring[255];
dvander@918
   319
	GetCmdArgString(argstring, sizeof(argstring));
teame06@1211
   320
dvander@1378
   321
	LogAction(client, -1, "\"%L\" console command (cmdline \"%s\")", client, argstring);
teame06@1211
   322
dvander@918
   323
	ServerCommand("%s", argstring);
teame06@1211
   324
dvander@918
   325
	return Plugin_Handled;
dvander@917
   326
}
dvander@917
   327
dvander@917
   328
public Action:Command_Map(client, args)
dvander@917
   329
{
dvander@917
   330
	if (args < 1)
dvander@917
   331
	{
dvander@917
   332
		ReplyToCommand(client, "[SM] Usage: sm_map <map>");
dvander@917
   333
		return Plugin_Handled;
dvander@917
   334
	}
teame06@1211
   335
faluco@1118
   336
	decl String:map[64];
dvander@917
   337
	GetCmdArg(1, map, sizeof(map));
teame06@1211
   338
dvander@917
   339
	if (!IsMapValid(map))
dvander@917
   340
	{
dvander@917
   341
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
dvander@917
   342
		return Plugin_Handled;
dvander@917
   343
	}
teame06@1211
   344
dvander@924
   345
	ShowActivity(client, "%t", "Changing map", map);
teame06@1211
   346
dvander@1378
   347
	LogAction(client, -1, "\"%L\" changed map to \"%s\"", client, map);
teame06@1211
   348
dvander@918
   349
	new Handle:dp;
dvander@917
   350
	CreateDataTimer(3.0, Timer_ChangeMap, dp);
dvander@917
   351
	WritePackString(dp, map);
teame06@1211
   352
dvander@917
   353
	return Plugin_Handled;
dvander@917
   354
}
dvander@917
   355
dvander@917
   356
public Action:Timer_ChangeMap(Handle:timer, Handle:dp)
dvander@917
   357
{
faluco@1118
   358
	decl String:map[65];
teame06@1211
   359
dvander@917
   360
	ResetPack(dp);
dvander@917
   361
	ReadPackString(dp, map, sizeof(map));
teame06@1211
   362
dvander@917
   363
	ServerCommand("changelevel \"%s\"", map);
teame06@1211
   364
dvander@917
   365
	return Plugin_Stop;
dvander@910
   366
}
dvander@910
   367
dvander@910
   368
public Action:Command_Kick(client, args)
dvander@910
   369
{
dvander@910
   370
	if (args < 1)
dvander@910
   371
	{
dvander@910
   372
		ReplyToCommand(client, "[SM] Usage: sm_kick <#userid|name> [reason]");
dvander@910
   373
		return Plugin_Handled;
dvander@910
   374
	}
teame06@1211
   375
teame06@1216
   376
teame06@1216
   377
	decl String:Arguments[256];
teame06@1216
   378
	GetCmdArgString(Arguments, sizeof(Arguments));
teame06@1216
   379
faluco@1118
   380
	decl String:arg[65];
teame06@1216
   381
	new len = BreakString(Arguments, arg, sizeof(arg));
teame06@1211
   382
ferret99gt@1195
   383
	new target = FindTarget(client, arg);
ferret99gt@1195
   384
	if (target == -1)
dvander@910
   385
	{
dvander@924
   386
		return Plugin_Handled;
dvander@910
   387
	}
teame06@1211
   388
teame06@1216
   389
	GetClientName(target, arg, sizeof(arg));
teame06@1211
   390
teame06@1216
   391
	if (len == -1)
dvander@910
   392
	{
dvander@910
   393
		/* Safely null terminate */
teame06@1216
   394
		len = 0;
teame06@1216
   395
		Arguments[0] = '\0';
dvander@910
   396
	}
teame06@1211
   397
teame06@1216
   398
	ShowActivity(client, "%t", "Kicked player", arg);
dvander@1378
   399
	LogAction(client, target, "\"%L\" kicked \"%L\" (reason \"%s\")", client, target, Arguments[len]);
teame06@1211
   400
dvander@1417
   401
	if (Arguments[0] == '\0')
dvander@1417
   402
	{
dvander@1417
   403
		KickClient(target, "%t", "Kicked by admin");
dvander@1417
   404
	}
dvander@1417
   405
	else
dvander@1417
   406
	{
dvander@1417
   407
		KickClient(target, "%s", Arguments[len]);
dvander@1417
   408
	}
teame06@1211
   409
dvander@910
   410
	return Plugin_Handled;
dvander@910
   411
}
ferret99gt@1276
   412
ferret99gt@1276
   413
public Action:Command_CancelVote(client, args)
ferret99gt@1276
   414
{
ferret99gt@1278
   415
	if (!IsVoteInProgress())
ferret99gt@1276
   416
	{
ferret99gt@1276
   417
		ReplyToCommand(client, "[SM] %t", "Vote Not In Progress");
ferret99gt@1276
   418
		return Plugin_Handled;
ferret99gt@1276
   419
	}
ferret99gt@1276
   420
ferret99gt@1276
   421
	ShowActivity(client, "%t", "Cancelled Vote");
ferret99gt@1276
   422
	
ferret99gt@1276
   423
	CancelVote();
ferret99gt@1276
   424
	
ferret99gt@1276
   425
	return Plugin_Handled;
dvander@1417
   426
}