plugins/basecommands.sp
author Drifter <rgr_02@comcast.net>
Thu Oct 11 23:16:47 2012 -0400 (2012-10-11)
changeset 3662 3c6e4351a81b
parent 3452 fbd5f04f635e
child 3887 3e8a8d9903ce
permissions -rw-r--r--
Updated CS:GO Cstrike ext gamedata.
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@1947
     7
 * SourceMod (C)2004-2008 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
dvander@1624
    23
 * code of this program (as well as its derivative 1works) 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;
dvander@1839
    52
new Handle:g_ProtectedVars;
pred@1536
    53
dvander@1510
    54
#include "basecommands/kick.sp"
dvander@1518
    55
#include "basecommands/reloadadmins.sp"
dvander@1523
    56
#include "basecommands/cancelvote.sp"
pred@1536
    57
#include "basecommands/who.sp"
pred@1536
    58
#include "basecommands/map.sp"
pred@1536
    59
#include "basecommands/execcfg.sp"
dvander@1510
    60
dvander@910
    61
public OnPluginStart()
dvander@910
    62
{
dvander@1027
    63
	LoadTranslations("common.phrases");
dvander@1521
    64
	LoadTranslations("plugin.basecommands");
teame06@1211
    65
dvander@910
    66
	RegAdminCmd("sm_kick", Command_Kick, ADMFLAG_KICK, "sm_kick <#userid|name> [reason]");
dvander@917
    67
	RegAdminCmd("sm_map", Command_Map, ADMFLAG_CHANGEMAP, "sm_map <map>");
dvander@918
    68
	RegAdminCmd("sm_rcon", Command_Rcon, ADMFLAG_RCON, "sm_rcon <args>");
dvander@920
    69
	RegAdminCmd("sm_cvar", Command_Cvar, ADMFLAG_CONVARS, "sm_cvar <cvar> [value]");
downtown1@2775
    70
	RegAdminCmd("sm_resetcvar", Command_ResetCvar, ADMFLAG_CONVARS, "sm_resetcvar <cvar>");
dvander@921
    71
	RegAdminCmd("sm_execcfg", Command_ExecCfg, ADMFLAG_CONFIG, "sm_execcfg <filename>");
dvander@923
    72
	RegAdminCmd("sm_who", Command_Who, ADMFLAG_GENERIC, "sm_who [#userid|name]");
dvander@1162
    73
	RegAdminCmd("sm_reloadadmins", Command_ReloadAdmins, ADMFLAG_BAN, "sm_reloadadmins");
ferret99gt@1276
    74
	RegAdminCmd("sm_cancelvote", Command_CancelVote, ADMFLAG_VOTE, "sm_cancelvote");
dvander@2068
    75
	RegConsoleCmd("sm_revote", Command_ReVote);
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);
dvander@1738
    87
	
dvander@1738
    88
	decl String:mapListPath[PLATFORM_MAX_PATH];
dvander@1738
    89
	BuildPath(Path_SM, mapListPath, sizeof(mapListPath), "configs/adminmenu_maplist.ini");
pred@1740
    90
	SetMapListCompatBind("sm_map menu", mapListPath);
dvander@1839
    91
	
dvander@1839
    92
	g_ProtectedVars = CreateTrie();
dvander@1839
    93
	ProtectVar("rcon_password");
dvander@1839
    94
	ProtectVar("sm_show_activity");
dvander@1839
    95
	ProtectVar("sm_immunity_mode");
pred@1536
    96
}
pred@1536
    97
pred@1536
    98
public OnMapStart()
pred@1536
    99
{
pred@1740
   100
	ParseConfigs();
pred@1740
   101
}
pred@1740
   102
pred@1740
   103
public OnConfigsExecuted()
pred@1740
   104
{
ferret99gt@1606
   105
	LoadMapList(g_MapList);
pred@1536
   106
}
pred@1536
   107
dvander@1839
   108
ProtectVar(const String:cvar[])
dvander@1839
   109
{
dvander@1839
   110
	SetTrieValue(g_ProtectedVars, cvar, 1);
dvander@1839
   111
}
dvander@1839
   112
dvander@1839
   113
bool:IsVarProtected(const String:cvar[])
dvander@1839
   114
{
dvander@1839
   115
	decl dummy_value;
dvander@1839
   116
	return GetTrieValue(g_ProtectedVars, cvar, dummy_value);
dvander@1839
   117
}
dvander@1839
   118
downtown1@2775
   119
bool:IsClientAllowedToChangeCvar(client, const String:cvarname[])
downtown1@2775
   120
{
downtown1@2775
   121
	new Handle:hndl = FindConVar(cvarname);
downtown1@2775
   122
downtown1@2775
   123
	new bool:allowed = false;
downtown1@2775
   124
	new client_flags = client == 0 ? ADMFLAG_ROOT : GetUserFlagBits(client);
downtown1@2775
   125
	
downtown1@2775
   126
	if (client_flags & ADMFLAG_ROOT)
downtown1@2775
   127
	{
downtown1@2775
   128
		allowed = true;
downtown1@2775
   129
	}
downtown1@2775
   130
	else
downtown1@2775
   131
	{
downtown1@2775
   132
		if (GetConVarFlags(hndl) & FCVAR_PROTECTED)
downtown1@2775
   133
		{
downtown1@2775
   134
			allowed = ((client_flags & ADMFLAG_PASSWORD) == ADMFLAG_PASSWORD);
downtown1@2775
   135
		}
downtown1@2775
   136
		else if (StrEqual(cvarname, "sv_cheats"))
downtown1@2775
   137
		{
downtown1@2775
   138
			allowed = ((client_flags & ADMFLAG_CHEATS) == ADMFLAG_CHEATS);
downtown1@2775
   139
		}
downtown1@2775
   140
		else if (!IsVarProtected(cvarname))
downtown1@2775
   141
		{
downtown1@2775
   142
			allowed = true;
downtown1@2775
   143
		}
downtown1@2775
   144
	}
downtown1@2775
   145
downtown1@2775
   146
	return allowed;
downtown1@2775
   147
}
downtown1@2775
   148
dvander@1510
   149
public OnAdminMenuReady(Handle:topmenu)
dvander@1510
   150
{
dvander@1510
   151
	/* Block us from being called twice */
dvander@1510
   152
	if (topmenu == hTopMenu)
dvander@1510
   153
	{
dvander@1510
   154
		return;
dvander@1510
   155
	}
dvander@1510
   156
	
dvander@1510
   157
	/* Save the Handle */
dvander@1510
   158
	hTopMenu = topmenu;
dvander@1510
   159
	
dvander@1510
   160
	/* Build the "Player Commands" category */
dvander@1510
   161
	new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
dvander@1510
   162
	
dvander@1510
   163
	if (player_commands != INVALID_TOPMENUOBJECT)
dvander@1510
   164
	{
dvander@1510
   165
		AddToTopMenu(hTopMenu, 
dvander@1600
   166
			"sm_kick",
dvander@1510
   167
			TopMenuObject_Item,
dvander@1510
   168
			AdminMenu_Kick,
dvander@1510
   169
			player_commands,
dvander@1510
   170
			"sm_kick",
dvander@1510
   171
			ADMFLAG_KICK);
pred@1536
   172
			
pred@1536
   173
		AddToTopMenu(hTopMenu,
dvander@1600
   174
			"sm_who",
pred@1536
   175
			TopMenuObject_Item,
pred@1536
   176
			AdminMenu_Who,
pred@1536
   177
			player_commands,
pred@1536
   178
			"sm_who",
pred@1536
   179
			ADMFLAG_GENERIC);
dvander@1510
   180
	}
dvander@1518
   181
dvander@1518
   182
	new TopMenuObject:server_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_SERVERCOMMANDS);
dvander@1518
   183
dvander@1518
   184
	if (server_commands != INVALID_TOPMENUOBJECT)
dvander@1518
   185
	{
dvander@1518
   186
		AddToTopMenu(hTopMenu,
dvander@1600
   187
			"sm_reloadadmins",
dvander@1518
   188
			TopMenuObject_Item,
dvander@1518
   189
			AdminMenu_ReloadAdmins,
dvander@1518
   190
			server_commands,
dvander@1518
   191
			"sm_reloadadmins",
dvander@1518
   192
			ADMFLAG_BAN);
pred@1536
   193
			
pred@1536
   194
		AddToTopMenu(hTopMenu,
dvander@1600
   195
			"sm_map",
pred@1536
   196
			TopMenuObject_Item,
pred@1536
   197
			AdminMenu_Map,
pred@1536
   198
			server_commands,
pred@1536
   199
			"sm_map",
pred@1536
   200
			ADMFLAG_CHANGEMAP);
pred@1536
   201
			
pred@1536
   202
		AddToTopMenu(hTopMenu,
dvander@1600
   203
			"sm_execcfg",
pred@1536
   204
			TopMenuObject_Item,
pred@1536
   205
			AdminMenu_ExecCFG,
pred@1536
   206
			server_commands,
pred@1536
   207
			"sm_execcfg",
pred@1536
   208
			ADMFLAG_CONFIG);		
dvander@1518
   209
	}
dvander@1523
   210
dvander@1523
   211
	new TopMenuObject:voting_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_VOTINGCOMMANDS);
dvander@1523
   212
dvander@1523
   213
	if (voting_commands != INVALID_TOPMENUOBJECT)
dvander@1523
   214
	{
dvander@1523
   215
		AddToTopMenu(hTopMenu,
dvander@1600
   216
			"sm_cancelvote",
dvander@1523
   217
			TopMenuObject_Item,
dvander@1523
   218
			AdminMenu_CancelVote,
dvander@1523
   219
			voting_commands,
dvander@1523
   220
			"sm_cancelvote",
dvander@1523
   221
			ADMFLAG_VOTE);
dvander@1523
   222
	}
dvander@1510
   223
}
dvander@1510
   224
dvander@1510
   225
public OnLibraryRemoved(const String:name[])
dvander@1510
   226
{
dvander@1510
   227
	if (strcmp(name, "adminmenu") == 0)
dvander@1510
   228
	{
dvander@1510
   229
		hTopMenu = INVALID_HANDLE;
dvander@1510
   230
	}
dvander@927
   231
}
dvander@927
   232
dvander@923
   233
#define FLAG_STRINGS		14
dvander@923
   234
new String:g_FlagNames[FLAG_STRINGS][20] =
dvander@923
   235
{
dvander@1376
   236
	"res",
dvander@923
   237
	"admin",
dvander@923
   238
	"kick",
dvander@923
   239
	"ban",
dvander@923
   240
	"unban",
dvander@923
   241
	"slay",
dvander@923
   242
	"map",
dvander@923
   243
	"cvars",
dvander@923
   244
	"cfg",
dvander@923
   245
	"chat",
dvander@923
   246
	"vote",
dvander@923
   247
	"pass",
dvander@923
   248
	"rcon",
dvander@923
   249
	"cheat"
dvander@923
   250
};
dvander@923
   251
dvander@1376
   252
CustomFlagsToString(String:buffer[], maxlength, flags)
dvander@1376
   253
{
dvander@1376
   254
	decl String:joins[6][6];
dvander@1376
   255
	new total;
dvander@1376
   256
	
dvander@1376
   257
	for (new i=_:Admin_Custom1; i<=_:Admin_Custom6; i++)
dvander@1376
   258
	{
dvander@1376
   259
		if (flags & (1<<i))
dvander@1376
   260
		{
dvander@1376
   261
			IntToString(i - _:Admin_Custom1 + 1, joins[total++], 6);
dvander@1376
   262
		}
dvander@1376
   263
	}
dvander@1376
   264
	
dvander@1376
   265
	ImplodeStrings(joins, total, ",", buffer, maxlength);
dvander@1376
   266
	
dvander@1376
   267
	return total;
dvander@1376
   268
}
dvander@1376
   269
dvander@923
   270
FlagsToString(String:buffer[], maxlength, flags)
dvander@923
   271
{
dvander@1376
   272
	decl String:joins[FLAG_STRINGS+1][32];
dvander@923
   273
	new total;
teame06@1211
   274
dvander@923
   275
	for (new i=0; i<FLAG_STRINGS; i++)
dvander@923
   276
	{
dvander@923
   277
		if (flags & (1<<i))
dvander@923
   278
		{
dvander@1376
   279
			strcopy(joins[total++], 32, g_FlagNames[i]);
dvander@923
   280
		}
dvander@923
   281
	}
dvander@1376
   282
	
dvander@1376
   283
	decl String:custom_flags[32];
dvander@1376
   284
	if (CustomFlagsToString(custom_flags, sizeof(custom_flags), flags))
dvander@1376
   285
	{
dvander@1376
   286
		Format(joins[total++], 32, "custom(%s)", custom_flags);
dvander@1376
   287
	}
teame06@1211
   288
dvander@923
   289
	ImplodeStrings(joins, total, ", ", buffer, maxlength);
dvander@923
   290
}
dvander@923
   291
dvander@920
   292
public Action:Command_Cvar(client, args)
dvander@920
   293
{
dvander@920
   294
	if (args < 1)
dvander@920
   295
	{
dvander@1839
   296
		if (client == 0)
dvander@1839
   297
		{
dvander@1839
   298
			ReplyToCommand(client, "[SM] Usage: sm_cvar <cvar|protect> [value]");
dvander@1839
   299
		}
dvander@1839
   300
		else
dvander@1839
   301
		{
dvander@1839
   302
			ReplyToCommand(client, "[SM] Usage: sm_cvar <cvar> [value]");
dvander@1839
   303
		}
dvander@920
   304
		return Plugin_Handled;
dvander@920
   305
	}
teame06@1211
   306
dvander@1671
   307
	decl String:cvarname[64];
dvander@920
   308
	GetCmdArg(1, cvarname, sizeof(cvarname));
dvander@1839
   309
	
dvander@1839
   310
	if (client == 0 && StrEqual(cvarname, "protect"))
dvander@1839
   311
	{
dvander@1839
   312
		if (args < 2)
dvander@1839
   313
		{
dvander@1839
   314
			ReplyToCommand(client, "[SM] Usage: sm_cvar <protect> <cvar>");
dvander@1839
   315
			return Plugin_Handled;
dvander@1839
   316
		}
dvander@1839
   317
		GetCmdArg(2, cvarname, sizeof(cvarname));
dvander@1839
   318
		ProtectVar(cvarname);
dvander@1839
   319
		ReplyToCommand(client, "[SM] %t", "Cvar is now protected", cvarname);
dvander@1839
   320
		return Plugin_Handled;
dvander@1839
   321
	}
teame06@1211
   322
dvander@920
   323
	new Handle:hndl = FindConVar(cvarname);
dvander@920
   324
	if (hndl == INVALID_HANDLE)
dvander@920
   325
	{
dvander@920
   326
		ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname);
dvander@920
   327
		return Plugin_Handled;
dvander@920
   328
	}
downtown1@2775
   329
downtown1@2775
   330
	if (!IsClientAllowedToChangeCvar(client, cvarname))
dvander@920
   331
	{
dvander@920
   332
		ReplyToCommand(client, "[SM] %t", "No access to cvar");
dvander@920
   333
		return Plugin_Handled;
dvander@920
   334
	}
teame06@1211
   335
dvander@920
   336
	decl String:value[255];
dvander@920
   337
	if (args < 2)
dvander@920
   338
	{
dvander@920
   339
		GetConVarString(hndl, value, sizeof(value));
teame06@1211
   340
dvander@920
   341
		ReplyToCommand(client, "[SM] %t", "Value of cvar", cvarname, value);
dvander@920
   342
		return Plugin_Handled;
dvander@920
   343
	}
teame06@1211
   344
dvander@920
   345
	GetCmdArg(2, value, sizeof(value));
teame06@1211
   346
dvander@920
   347
	if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED)
dvander@920
   348
	{
dvander@1623
   349
		ShowActivity2(client, "[SM] ", "%t", "Cvar changed", cvarname, value);
dvander@1623
   350
	}
dvander@1623
   351
	else
dvander@1623
   352
	{
dvander@924
   353
		ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value);
dvander@920
   354
	}
teame06@1211
   355
dvander@1378
   356
	LogAction(client, -1, "\"%L\" changed cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value);
teame06@1211
   357
ds@937
   358
	SetConVarString(hndl, value, true);
teame06@1211
   359
dvander@920
   360
	return Plugin_Handled;
dvander@918
   361
}
dvander@918
   362
downtown1@2775
   363
public Action:Command_ResetCvar(client, args)
downtown1@2775
   364
{
downtown1@2775
   365
	if (args < 1)
downtown1@2775
   366
	{
downtown1@2775
   367
		ReplyToCommand(client, "[SM] Usage: sm_resetcvar <cvar>");
downtown1@2775
   368
downtown1@2775
   369
		return Plugin_Handled;
downtown1@2775
   370
	}
downtown1@2775
   371
downtown1@2775
   372
	decl String:cvarname[64];
downtown1@2775
   373
	GetCmdArg(1, cvarname, sizeof(cvarname));
downtown1@2775
   374
	
downtown1@2775
   375
	new Handle:hndl = FindConVar(cvarname);
downtown1@2775
   376
	if (hndl == INVALID_HANDLE)
downtown1@2775
   377
	{
downtown1@2775
   378
		ReplyToCommand(client, "[SM] %t", "Unable to find cvar", cvarname);
downtown1@2775
   379
		return Plugin_Handled;
downtown1@2775
   380
	}
downtown1@2775
   381
	
downtown1@2775
   382
	if (!IsClientAllowedToChangeCvar(client, cvarname))
downtown1@2775
   383
	{
downtown1@2775
   384
		ReplyToCommand(client, "[SM] %t", "No access to cvar");
downtown1@2775
   385
		return Plugin_Handled;
downtown1@2775
   386
	}
downtown1@2775
   387
downtown1@2775
   388
	ResetConVar(hndl);
downtown1@2775
   389
downtown1@2775
   390
	decl String:value[255];
downtown1@2775
   391
	GetConVarString(hndl, value, sizeof(value));
downtown1@2775
   392
downtown1@2775
   393
	if ((GetConVarFlags(hndl) & FCVAR_PROTECTED) != FCVAR_PROTECTED)
downtown1@2775
   394
	{
downtown1@2775
   395
		ShowActivity2(client, "[SM] ", "%t", "Cvar changed", cvarname, value);
downtown1@2775
   396
	}
downtown1@2775
   397
	else
downtown1@2775
   398
	{
downtown1@2775
   399
		ReplyToCommand(client, "[SM] %t", "Cvar changed", cvarname, value);
downtown1@2775
   400
	}
downtown1@2775
   401
downtown1@2775
   402
	LogAction(client, -1, "\"%L\" reset cvar (cvar \"%s\") (value \"%s\")", client, cvarname, value);
downtown1@2775
   403
downtown1@2775
   404
	return Plugin_Handled;
downtown1@2775
   405
}
downtown1@2775
   406
dvander@918
   407
public Action:Command_Rcon(client, args)
dvander@918
   408
{
dvander@918
   409
	if (args < 1)
dvander@918
   410
	{
dvander@918
   411
		ReplyToCommand(client, "[SM] Usage: sm_rcon <args>");
dvander@918
   412
		return Plugin_Handled;
dvander@918
   413
	}
teame06@1211
   414
dvander@918
   415
	decl String:argstring[255];
dvander@918
   416
	GetCmdArgString(argstring, sizeof(argstring));
teame06@1211
   417
dvander@1378
   418
	LogAction(client, -1, "\"%L\" console command (cmdline \"%s\")", client, argstring);
teame06@1211
   419
asherkin@3362
   420
	if (client == 0) // They will already see the response in the console.
asherkin@3362
   421
	{
asherkin@3362
   422
		ServerCommand("%s", argstring);
asherkin@3362
   423
	} else {
bluebriansimon@3452
   424
		new String:responseBuffer[4096];
asherkin@3362
   425
		ServerCommandEx(responseBuffer, sizeof(responseBuffer), "%s", argstring);
asherkin@3362
   426
		ReplyToCommand(client, responseBuffer);
asherkin@3362
   427
	}
teame06@1211
   428
dvander@918
   429
	return Plugin_Handled;
dvander@917
   430
}
dvander@2068
   431
dvander@2068
   432
public Action:Command_ReVote(client, args)
dvander@2068
   433
{
dvander@2068
   434
	if (client == 0)
dvander@2068
   435
	{
dvander@2068
   436
		ReplyToCommand(client, "[SM] %t", "Command is in-game only");
dvander@2068
   437
		return Plugin_Handled;
dvander@2068
   438
	}
dvander@2068
   439
	
dvander@2068
   440
	if (!IsVoteInProgress())
dvander@2068
   441
	{
dvander@2068
   442
		ReplyToCommand(client, "[SM] %t", "Vote Not In Progress");
dvander@2068
   443
		return Plugin_Handled;
dvander@2068
   444
	}
dvander@2068
   445
	
dvander@2068
   446
	if (!IsClientInVotePool(client))
dvander@2068
   447
	{
dvander@2068
   448
		ReplyToCommand(client, "[SM] %t", "Cannot participate in vote");
dvander@2068
   449
		return Plugin_Handled;
dvander@2068
   450
	}
dvander@2068
   451
	
dvander@2068
   452
	if (!RedrawClientVoteMenu(client))
dvander@2068
   453
	{
dvander@2068
   454
		ReplyToCommand(client, "[SM] %t", "Cannot change vote");
dvander@2068
   455
	}
dvander@2068
   456
	
dvander@2068
   457
	return Plugin_Handled;
dvander@2068
   458
}