plugins/basecommands.sp
author David Anderson <dvander@alliedmods.net>
Mon Oct 15 18:51:11 2007 +0000 (2007-10-15)
changeset 1575 408a1174f19a
parent 1536 fe2146e4975d
child 1592 ff10cfeaf5d2
permissions -rw-r--r--
filled in data for core's TF2 support
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>
dvander@1510
    37
#undef REQUIRE_PLUGIN
dvander@1510
    38
#include <adminmenu>
ds@913
    39
teame06@1211
    40
public Plugin:myinfo =
dvander@910
    41
{
dvander@910
    42
	name = "Basic Commands",
dvander@910
    43
	author = "AlliedModders LLC",
dvander@910
    44
	description = "Basic Admin Commands",
dvander@910
    45
	version = SOURCEMOD_VERSION,
dvander@910
    46
	url = "http://www.sourcemod.net/"
dvander@910
    47
};
dvander@910
    48
dvander@1510
    49
new Handle:hTopMenu = INVALID_HANDLE;
dvander@1510
    50
pred@1536
    51
new Handle:g_MapList;
pred@1536
    52
new g_mapFileTime;
pred@1536
    53
pred@1536
    54
new Handle:g_ConfigList;
pred@1536
    55
dvander@1510
    56
#include "basecommands/kick.sp"
dvander@1518
    57
#include "basecommands/reloadadmins.sp"
dvander@1523
    58
#include "basecommands/cancelvote.sp"
pred@1536
    59
#include "basecommands/who.sp"
pred@1536
    60
#include "basecommands/map.sp"
pred@1536
    61
#include "basecommands/execcfg.sp"
dvander@1510
    62
dvander@910
    63
public OnPluginStart()
dvander@910
    64
{
dvander@1027
    65
	LoadTranslations("common.phrases");
dvander@1521
    66
	LoadTranslations("plugin.basecommands");
teame06@1211
    67
dvander@910
    68
	RegAdminCmd("sm_kick", Command_Kick, ADMFLAG_KICK, "sm_kick <#userid|name> [reason]");
dvander@917
    69
	RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map <map>");
dvander@918
    70
	RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon <args>");
dvander@920
    71
	RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar <cvar> [value]");
dvander@921
    72
	RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg <filename>");
dvander@923
    73
	RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]");
dvander@1162
    74
	RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins");
ferret99gt@1276
    75
	RegAdminCmd("sm_cancelvote", Command_CancelVote, ADMFLAG_VOTE, "sm_cancelvote");
dvander@1510
    76
	
dvander@1510
    77
	/* Account for late loading */
dvander@1510
    78
	new Handle:topmenu;
dvander@1510
    79
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
dvander@1510
    80
	{
dvander@1510
    81
		OnAdminMenuReady(topmenu);
dvander@1510
    82
	}
pred@1536
    83
	
pred@1536
    84
	g_MapList = CreateMenu(MenuHandler_ChangeMap);
pred@1536
    85
	SetMenuTitle(g_MapList, "Please select a map");
pred@1536
    86
	SetMenuExitBackButton(g_MapList, true);
pred@1536
    87
}
pred@1536
    88
pred@1536
    89
public OnMapStart()
pred@1536
    90
{
pred@1536
    91
	LoadMaps(g_MapList);
pred@1536
    92
	
pred@1536
    93
	ParseConfigs();
pred@1536
    94
}
pred@1536
    95
pred@1536
    96
public OnMapEnd()
pred@1536
    97
{
pred@1536
    98
	if (g_ConfigList != INVALID_HANDLE)
pred@1536
    99
	{
pred@1536
   100
		CloseHandle(g_ConfigList);
pred@1536
   101
		g_ConfigList = INVALID_HANDLE;
pred@1536
   102
	}
dvander@1510
   103
}
dvander@1510
   104
dvander@1510
   105
public OnAdminMenuReady(Handle:topmenu)
dvander@1510
   106
{
dvander@1510
   107
	/* Block us from being called twice */
dvander@1510
   108
	if (topmenu == hTopMenu)
dvander@1510
   109
	{
dvander@1510
   110
		return;
dvander@1510
   111
	}
dvander@1510
   112
	
dvander@1510
   113
	/* Save the Handle */
dvander@1510
   114
	hTopMenu = topmenu;
dvander@1510
   115
	
dvander@1510
   116
	/* Build the "Player Commands" category */
dvander@1510
   117
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
dvander@1510
   118
	
dvander@1510
   119
	if (player_commands != INVALID_TOPMENUOBJECT)
dvander@1510
   120
	{
dvander@1510
   121
		AddToTopMenu(hTopMenu, 
dvander@1510
   122
			"Kick",
dvander@1510
   123
			TopMenuObject_Item,
dvander@1510
   124
			AdminMenu_Kick,
dvander@1510
   125
			player_commands,
dvander@1510
   126
			"sm_kick",
dvander@1510
   127
			ADMFLAG_KICK);
pred@1536
   128
			
pred@1536
   129
		AddToTopMenu(hTopMenu,
pred@1536
   130
			"Get Info",
pred@1536
   131
			TopMenuObject_Item,
pred@1536
   132
			AdminMenu_Who,
pred@1536
   133
			player_commands,
pred@1536
   134
			"sm_who",
pred@1536
   135
			ADMFLAG_GENERIC);
dvander@1510
   136
	}
dvander@1518
   137
dvander@1518
   138
	new TopMenuObject:server_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_SERVERCOMMANDS);
dvander@1518
   139
dvander@1518
   140
	if (server_commands != INVALID_TOPMENUOBJECT)
dvander@1518
   141
	{
dvander@1518
   142
		AddToTopMenu(hTopMenu,
dvander@1518
   143
			"Reload Admins",
dvander@1518
   144
			TopMenuObject_Item,
dvander@1518
   145
			AdminMenu_ReloadAdmins,
dvander@1518
   146
			server_commands,
dvander@1518
   147
			"sm_reloadadmins",
dvander@1518
   148
			ADMFLAG_BAN);
pred@1536
   149
			
pred@1536
   150
		AddToTopMenu(hTopMenu,
pred@1536
   151
			"Change Map",
pred@1536
   152
			TopMenuObject_Item,
pred@1536
   153
			AdminMenu_Map,
pred@1536
   154
			server_commands,
pred@1536
   155
			"sm_map",
pred@1536
   156
			ADMFLAG_CHANGEMAP);
pred@1536
   157
			
pred@1536
   158
		AddToTopMenu(hTopMenu,
pred@1536
   159
			"Exec CFG",
pred@1536
   160
			TopMenuObject_Item,
pred@1536
   161
			AdminMenu_ExecCFG,
pred@1536
   162
			server_commands,
pred@1536
   163
			"sm_execcfg",
pred@1536
   164
			ADMFLAG_CONFIG);		
dvander@1518
   165
	}
dvander@1523
   166
dvander@1523
   167
	new TopMenuObject:voting_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_VOTINGCOMMANDS);
dvander@1523
   168
dvander@1523
   169
	if (voting_commands != INVALID_TOPMENUOBJECT)
dvander@1523
   170
	{
dvander@1523
   171
		AddToTopMenu(hTopMenu,
dvander@1523
   172
			"Cancel Vote",
dvander@1523
   173
			TopMenuObject_Item,
dvander@1523
   174
			AdminMenu_CancelVote,
dvander@1523
   175
			voting_commands,
dvander@1523
   176
			"sm_cancelvote",
dvander@1523
   177
			ADMFLAG_VOTE);
dvander@1523
   178
	}
dvander@1510
   179
}
dvander@1510
   180
dvander@1510
   181
public OnLibraryRemoved(const String:name[])
dvander@1510
   182
{
dvander@1510
   183
	if (strcmp(name, "adminmenu") == 0)
dvander@1510
   184
	{
dvander@1510
   185
		hTopMenu = INVALID_HANDLE;
dvander@1510
   186
	}
dvander@927
   187
}
dvander@927
   188
dvander@923
   189
#define FLAG_STRINGS		14
dvander@923
   190
new String:g_FlagNames[FLAG_STRINGS][20] =
dvander@923
   191
{
dvander@1376
   192
	"res",
dvander@923
   193
	"admin",
dvander@923
   194
	"kick",
dvander@923
   195
	"ban",
dvander@923
   196
	"unban",
dvander@923
   197
	"slay",
dvander@923
   198
	"map",
dvander@923
   199
	"cvars",
dvander@923
   200
	"cfg",
dvander@923
   201
	"chat",
dvander@923
   202
	"vote",
dvander@923
   203
	"pass",
dvander@923
   204
	"rcon",
dvander@923
   205
	"cheat"
dvander@923
   206
};
dvander@923
   207
dvander@1376
   208
CustomFlagsToString(String:buffer[], maxlength, flags)
dvander@1376
   209
{
dvander@1376
   210
	decl String:joins[6][6];
dvander@1376
   211
	new total;
dvander@1376
   212
	
dvander@1376
   213
	for (new i=_:Admin_Custom1; i<=_:Admin_Custom6; i++)
dvander@1376
   214
	{
dvander@1376
   215
		if (flags & (1<<i))
dvander@1376
   216
		{
dvander@1376
   217
			IntToString(i - _:Admin_Custom1 + 1, joins[total++], 6);
dvander@1376
   218
		}
dvander@1376
   219
	}
dvander@1376
   220
	
dvander@1376
   221
	ImplodeStrings(joins, total, ",", buffer, maxlength);
dvander@1376
   222
	
dvander@1376
   223
	return total;
dvander@1376
   224
}
dvander@1376
   225
dvander@923
   226
FlagsToString(String:buffer[], maxlength, flags)
dvander@923
   227
{
dvander@1376
   228
	decl String:joins[FLAG_STRINGS+1][32];
dvander@923
   229
	new total;
teame06@1211
   230
dvander@923
   231
	for (new i=0; i<FLAG_STRINGS; i++)
dvander@923
   232
	{
dvander@923
   233
		if (flags & (1<<i))
dvander@923
   234
		{
dvander@1376
   235
			strcopy(joins[total++], 32, g_FlagNames[i]);
dvander@923
   236
		}
dvander@923
   237
	}
dvander@1376
   238
	
dvander@1376
   239
	decl String:custom_flags[32];
dvander@1376
   240
	if (CustomFlagsToString(custom_flags, sizeof(custom_flags), flags))
dvander@1376
   241
	{
dvander@1376
   242
		Format(joins[total++], 32, "custom(%s)", custom_flags);
dvander@1376
   243
	}
teame06@1211
   244
dvander@923
   245
	ImplodeStrings(joins, total, ", ", buffer, maxlength);
dvander@923
   246
}
dvander@923
   247
dvander@920
   248
public Action:Command_Cvar(client, args)
dvander@920
   249
{
dvander@920
   250
	if (args < 1)
dvander@920
   251
	{
dvander@920
   252
		ReplyToCommand(client, "[SM] Usage: sm_cvar <cvar> [value]");
dvander@920
   253
		return Plugin_Handled;
dvander@920
   254
	}
teame06@1211
   255
faluco@1118
   256
	decl String:cvarname[33];
dvander@920
   257
	GetCmdArg(1, cvarname, sizeof(cvarname));
teame06@1211
   258
dvander@920
   259
	new Handle:hndl = FindConVar(cvarname);
dvander@920
   260
	if (hndl == INVALID_HANDLE)
dvander@920
   261
	{
dvander@920
   262
		ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname);
dvander@920
   263
		return Plugin_Handled;
dvander@920
   264
	}
teame06@1211
   265
dvander@920
   266
	new bool:allowed = false;
dvander@920
   267
	if (GetConVarFlags(hndl) & FCVAR_PROTECTED)
dvander@920
   268
	{
dvander@920
   269
		/* If they're root, allow anything */
dvander@920
   270
		if ((GetUserFlagBits(client) & ADMFLAG_ROOT) == ADMFLAG_ROOT)
dvander@920
   271
		{
dvander@920
   272
			allowed = true;
dvander@920
   273
		}
dvander@920
   274
		/* If they're not root, and getting sv_password, see if they have ADMFLAG_PASSWORD */
dvander@920
   275
		else if (StrEqual(cvarname, "sv_password") && (GetUserFlagBits(client) & ADMFLAG_PASSWORD))
dvander@920
   276
		{
dvander@920
   277
			allowed = true;
dvander@920
   278
		}
teame06@1211
   279
	}
dvander@920
   280
	/* Do a check for the cheat cvar */
dvander@920
   281
	else if (StrEqual(cvarname, "sv_cheats"))
dvander@920
   282
	{
dvander@929
   283
		if (GetUserFlagBits(client) & ADMFLAG_CHEATS
dvander@929
   284
			|| GetUserFlagBits(client) & ADMFLAG_ROOT)
dvander@920
   285
		{
dvander@920
   286
			allowed = true;
dvander@920
   287
		}
dvander@920
   288
	}
dvander@920
   289
	/* If we drop down to here, it was a normal cvar. */
dvander@920
   290
	else
dvander@920
   291
	{
dvander@920
   292
		allowed = true;
dvander@920
   293
	}
teame06@1211
   294
dvander@920
   295
	if (!allowed)
dvander@920
   296
	{
dvander@920
   297
		ReplyToCommand(client, "[SM] %t", "No access to cvar");
dvander@920
   298
		return Plugin_Handled;
dvander@920
   299
	}
teame06@1211
   300
dvander@920
   301
	decl String:value[255];
dvander@920
   302
	if (args < 2)
dvander@920
   303
	{
dvander@920
   304
		GetConVarString(hndl, value, sizeof(value));
teame06@1211
   305
dvander@920
   306
		ReplyToCommand(client, "[SM] %t", "Value of cvar", cvarname, value);
dvander@920
   307
		return Plugin_Handled;
dvander@920
   308
	}
teame06@1211
   309
dvander@920
   310
	GetCmdArg(2, value, sizeof(value));
teame06@1211
   311
dvander@920
   312
	if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED)
dvander@920
   313
	{
dvander@920
   314
		ShowActivity(client, "%t", "Cvar changed", cvarname, value);
dvander@924
   315
	} else {
dvander@924
   316
		ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value);
dvander@920
   317
	}
teame06@1211
   318
dvander@1378
   319
	LogAction(client, -1, "\"%L\" changed cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value);
teame06@1211
   320
ds@937
   321
	SetConVarString(hndl, value, true);
teame06@1211
   322
dvander@920
   323
	return Plugin_Handled;
dvander@918
   324
}
dvander@918
   325
dvander@918
   326
public Action:Command_Rcon(client, args)
dvander@918
   327
{
dvander@918
   328
	if (args < 1)
dvander@918
   329
	{
dvander@918
   330
		ReplyToCommand(client, "[SM] Usage: sm_rcon <args>");
dvander@918
   331
		return Plugin_Handled;
dvander@918
   332
	}
teame06@1211
   333
dvander@918
   334
	decl String:argstring[255];
dvander@918
   335
	GetCmdArgString(argstring, sizeof(argstring));
teame06@1211
   336
dvander@1378
   337
	LogAction(client, -1, "\"%L\" console command (cmdline \"%s\")", client, argstring);
teame06@1211
   338
dvander@918
   339
	ServerCommand("%s", argstring);
teame06@1211
   340
dvander@918
   341
	return Plugin_Handled;
dvander@917
   342
}