core/smn_console.cpp
author David Anderson <dvander@alliedmods.net>
Mon Mar 19 01:44:09 2007 +0000 (2007-03-19)
changeset 647 1e29dcc9ca97
parent 633 ed7944127bb9
child 653 ef60870067ff
permissions -rw-r--r--
fixed a potential bug with kicking players during authorization
dvander@498
     1
/**
dvander@562
     2
 * ===============================================================
dvander@562
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@562
     4
 * ===============================================================
dvander@562
     5
 *
dvander@562
     6
 * This file is not open source and may not be copied without explicit
dvander@562
     7
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@562
     8
 * in whole or significant part.
dvander@562
     9
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@562
    10
 *
dvander@562
    11
 * Version: $Id$
dvander@562
    12
 */
dvander@498
    13
dvander@498
    14
#include "sm_globals.h"
dvander@498
    15
#include "sourcemm_api.h"
dvander@498
    16
#include "HandleSys.h"
ds@580
    17
#include "ConVarManager.h"
ds@579
    18
#include "ConCmdManager.h"
dvander@514
    19
#include "PluginSys.h"
dvander@518
    20
#include "sm_stringutil.h"
dvander@591
    21
#include "PlayerManager.h"
dvander@498
    22
dvander@498
    23
static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    24
{
dvander@498
    25
	char *name, *defaultVal, *helpText;
dvander@498
    26
dvander@498
    27
	pContext->LocalToString(params[1], &name);
dvander@498
    28
dvander@498
    29
	// While the engine seems to accept a blank convar name, it causes a crash upon server quit
dvander@498
    30
	if (name == NULL || strcmp(name, "") == 0)
dvander@498
    31
	{
ds@582
    32
		return pContext->ThrowNativeError("Convar with blank name is not permitted");
dvander@498
    33
	}
dvander@498
    34
dvander@498
    35
	pContext->LocalToString(params[2], &defaultVal);
dvander@498
    36
	pContext->LocalToString(params[3], &helpText);
dvander@498
    37
dvander@498
    38
	bool hasMin = params[5] ? true : false;
dvander@498
    39
	bool hasMax = params[7] ? true : false;
dvander@498
    40
	float min = sp_ctof(params[6]);
dvander@498
    41
	float max = sp_ctof(params[8]);
dvander@498
    42
ds@582
    43
	Handle_t hndl = g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
ds@582
    44
ds@582
    45
	if (hndl == BAD_HANDLE)
ds@582
    46
	{
ds@582
    47
		return pContext->ThrowNativeError("Convar \"%s\" was not created. A console command with the same name already exists.", name);
ds@582
    48
	}
ds@582
    49
ds@582
    50
	return hndl;
dvander@498
    51
}
dvander@498
    52
dvander@498
    53
static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    54
{
dvander@498
    55
	char *name;
dvander@498
    56
dvander@498
    57
	pContext->LocalToString(params[1], &name);
dvander@498
    58
dvander@498
    59
	return g_ConVarManager.FindConVar(name);
dvander@498
    60
}
dvander@498
    61
dvander@498
    62
static cell_t sm_HookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    63
{
dvander@498
    64
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    65
	HandleError err;
ds@576
    66
	ConVar *pConVar;
dvander@498
    67
ds@576
    68
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
    69
		!= HandleError_None)
dvander@498
    70
	{
ds@581
    71
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
    72
	}
dvander@498
    73
ds@582
    74
	IPluginFunction *pFunction = pContext->GetFunctionById(params[2]);
ds@582
    75
ds@582
    76
	if (!pFunction)
ds@582
    77
	{
ds@582
    78
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
ds@582
    79
	}
ds@582
    80
ds@582
    81
	g_ConVarManager.HookConVarChange(pConVar, pFunction);
dvander@498
    82
dvander@498
    83
	return 1;
dvander@498
    84
}
dvander@498
    85
dvander@498
    86
static cell_t sm_UnhookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    87
{
dvander@498
    88
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    89
	HandleError err;
ds@576
    90
	ConVar *pConVar;
dvander@498
    91
ds@576
    92
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
    93
		!= HandleError_None)
dvander@498
    94
	{
ds@581
    95
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
    96
	}
dvander@498
    97
ds@582
    98
	IPluginFunction *pFunction = pContext->GetFunctionById(params[2]);
ds@582
    99
ds@582
   100
	if (!pFunction)
ds@582
   101
	{
ds@582
   102
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
ds@582
   103
	}
ds@582
   104
ds@582
   105
	g_ConVarManager.UnhookConVarChange(pConVar, pFunction);
dvander@498
   106
dvander@498
   107
	return 1;
dvander@498
   108
}
dvander@498
   109
dvander@498
   110
static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
dvander@498
   111
{
dvander@498
   112
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   113
	HandleError err;
ds@576
   114
	ConVar *pConVar;
dvander@498
   115
ds@576
   116
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   117
		!= HandleError_None)
dvander@498
   118
	{
ds@581
   119
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   120
	}
dvander@498
   121
ds@576
   122
	return pConVar->GetBool();
dvander@498
   123
}
dvander@498
   124
dvander@498
   125
static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
dvander@498
   126
{
dvander@498
   127
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   128
	HandleError err;
ds@576
   129
	ConVar *pConVar;
dvander@498
   130
ds@576
   131
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   132
		!= HandleError_None)
dvander@498
   133
	{
ds@581
   134
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   135
	}
dvander@498
   136
ds@576
   137
	return pConVar->GetInt();
dvander@498
   138
}
dvander@498
   139
dvander@498
   140
/* This handles both SetConVarBool() and SetConVarInt() */
dvander@498
   141
static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
dvander@498
   142
{
dvander@498
   143
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   144
	HandleError err;
ds@576
   145
	ConVar *pConVar;
dvander@498
   146
ds@576
   147
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   148
		!= HandleError_None)
dvander@498
   149
	{
ds@581
   150
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   151
	}
dvander@498
   152
ds@576
   153
	pConVar->SetValue(params[2]);
dvander@498
   154
dvander@498
   155
	return 1;
dvander@498
   156
}
dvander@498
   157
dvander@498
   158
static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
dvander@498
   159
{
dvander@498
   160
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   161
	HandleError err;
ds@576
   162
	ConVar *pConVar;
dvander@498
   163
ds@576
   164
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   165
		!= HandleError_None)
dvander@498
   166
	{
ds@581
   167
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   168
	}
dvander@498
   169
	
ds@576
   170
	float value = pConVar->GetFloat();
dvander@498
   171
dvander@498
   172
	return sp_ftoc(value);
dvander@498
   173
}
dvander@498
   174
dvander@498
   175
static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params)
dvander@498
   176
{
dvander@498
   177
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   178
	HandleError err;
ds@576
   179
	ConVar *pConVar;
dvander@498
   180
ds@576
   181
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   182
		!= HandleError_None)
dvander@498
   183
	{
ds@581
   184
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   185
	}
dvander@498
   186
dvander@498
   187
	float value = sp_ctof(params[2]);
ds@576
   188
	pConVar->SetValue(value);
dvander@498
   189
dvander@498
   190
	return 1;
dvander@498
   191
}
dvander@498
   192
dvander@498
   193
static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
dvander@498
   194
{
dvander@498
   195
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   196
	HandleError err;
ds@576
   197
	ConVar *pConVar;
dvander@498
   198
ds@576
   199
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   200
		!= HandleError_None)
dvander@498
   201
	{
ds@581
   202
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   203
	}
dvander@498
   204
ds@576
   205
	pContext->StringToLocalUTF8(params[2], params[3], pConVar->GetString(), NULL);
dvander@498
   206
dvander@498
   207
	return 1;
dvander@498
   208
}
dvander@498
   209
dvander@498
   210
static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
dvander@498
   211
{
dvander@498
   212
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   213
	HandleError err;
ds@576
   214
	ConVar *pConVar;
dvander@498
   215
ds@576
   216
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   217
		!= HandleError_None)
dvander@498
   218
	{
ds@581
   219
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   220
	}
dvander@498
   221
dvander@498
   222
	char *value;
dvander@498
   223
	pContext->LocalToString(params[2], &value);
dvander@498
   224
ds@576
   225
	pConVar->SetValue(value);
dvander@498
   226
dvander@498
   227
	return 1;
dvander@498
   228
}
dvander@498
   229
dvander@498
   230
static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   231
{
dvander@498
   232
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   233
	HandleError err;
ds@576
   234
	ConVar *pConVar;
dvander@498
   235
ds@576
   236
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   237
		!= HandleError_None)
dvander@498
   238
	{
ds@581
   239
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   240
	}
dvander@498
   241
ds@576
   242
	return pConVar->GetFlags();
dvander@498
   243
}
dvander@498
   244
dvander@498
   245
static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   246
{
dvander@498
   247
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   248
	HandleError err;
ds@576
   249
	ConVar *pConVar;
dvander@498
   250
ds@576
   251
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   252
		!= HandleError_None)
dvander@498
   253
	{
ds@581
   254
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   255
	}
dvander@498
   256
ds@576
   257
	pConVar->SetFlags(params[2]);
dvander@498
   258
dvander@498
   259
	return 1;
dvander@498
   260
}
dvander@498
   261
dvander@498
   262
static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
dvander@498
   263
{
dvander@498
   264
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   265
	HandleError err;
ds@576
   266
	ConVar *pConVar;
dvander@498
   267
ds@576
   268
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   269
		!= HandleError_None)
dvander@498
   270
	{
ds@581
   271
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   272
	}
dvander@498
   273
dvander@498
   274
	cell_t *addr;
dvander@498
   275
	bool hasMin;
dvander@498
   276
	float min;
dvander@498
   277
dvander@498
   278
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   279
ds@576
   280
	hasMin = pConVar->GetMin(min);
dvander@498
   281
	*addr = sp_ftoc(min);
dvander@498
   282
dvander@498
   283
	return hasMin;
dvander@498
   284
}
dvander@498
   285
dvander@498
   286
static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
dvander@498
   287
{
dvander@498
   288
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   289
	HandleError err;
ds@576
   290
	ConVar *pConVar;
dvander@498
   291
ds@576
   292
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   293
		!= HandleError_None)
dvander@498
   294
	{
ds@581
   295
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   296
	}
dvander@498
   297
dvander@498
   298
	cell_t *addr;
dvander@498
   299
	bool hasMax;
dvander@498
   300
	float max;
dvander@498
   301
dvander@498
   302
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   303
ds@576
   304
	hasMax = pConVar->GetMax(max);
dvander@498
   305
	*addr = sp_ftoc(max);
dvander@498
   306
dvander@498
   307
	return hasMax;
dvander@498
   308
}
dvander@498
   309
dvander@498
   310
static cell_t sm_GetConVarName(IPluginContext *pContext, const cell_t *params)
dvander@498
   311
{
dvander@498
   312
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   313
	HandleError err;
ds@576
   314
	ConVar *pConVar;
dvander@498
   315
ds@576
   316
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   317
		!= HandleError_None)
dvander@498
   318
	{
ds@581
   319
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   320
	}
dvander@498
   321
ds@576
   322
	pContext->StringToLocalUTF8(params[2], params[3], pConVar->GetName(), NULL);
dvander@498
   323
dvander@498
   324
	return 1;
dvander@498
   325
}
dvander@498
   326
dvander@498
   327
static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
   328
{
dvander@498
   329
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   330
	HandleError err;
ds@576
   331
	ConVar *pConVar;
dvander@498
   332
ds@576
   333
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&pConVar))
dvander@498
   334
		!= HandleError_None)
dvander@498
   335
	{
ds@581
   336
		return pContext->ThrowNativeError("Invalid convar handle %x (error %d)", hndl, err);
dvander@498
   337
	}
dvander@498
   338
ds@576
   339
	pConVar->Revert();
dvander@498
   340
dvander@498
   341
	return 1;
dvander@498
   342
}
dvander@498
   343
dvander@498
   344
static cell_t sm_RegServerCmd(IPluginContext *pContext, const cell_t *params)
dvander@498
   345
{
dvander@498
   346
	char *name,*help;
dvander@498
   347
	IPluginFunction *pFunction;
dvander@498
   348
dvander@498
   349
	pContext->LocalToString(params[1], &name);
dvander@498
   350
	pContext->LocalToString(params[3], &help);
dvander@498
   351
	pFunction = pContext->GetFunctionById(params[2]);
dvander@498
   352
dvander@498
   353
	if (!pFunction)
dvander@498
   354
	{
dvander@498
   355
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@498
   356
	}
dvander@498
   357
ds@579
   358
	if (!g_ConCmds.AddServerCommand(pFunction, name, help, params[4]))
ds@579
   359
	{
ds@579
   360
		return pContext->ThrowNativeError("Command \"%s\" could not be created. A convar with the same name already exists.", name);
ds@579
   361
	}
dvander@498
   362
dvander@498
   363
	return 1;
dvander@498
   364
}
dvander@498
   365
dvander@500
   366
static cell_t sm_RegConsoleCmd(IPluginContext *pContext, const cell_t *params)
dvander@500
   367
{
dvander@500
   368
	char *name,*help;
dvander@500
   369
	IPluginFunction *pFunction;
dvander@500
   370
dvander@500
   371
	pContext->LocalToString(params[1], &name);
dvander@500
   372
	pContext->LocalToString(params[3], &help);
dvander@500
   373
	pFunction = pContext->GetFunctionById(params[2]);
dvander@500
   374
dvander@500
   375
	if (!pFunction)
dvander@500
   376
	{
dvander@500
   377
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@500
   378
	}
dvander@500
   379
ds@579
   380
	if (!g_ConCmds.AddConsoleCommand(pFunction, name, help, params[4]))
ds@579
   381
	{
ds@579
   382
		return pContext->ThrowNativeError("Command \"%s\" could not be created. A convar with the same name already exists.", name);
ds@579
   383
	}
dvander@500
   384
dvander@500
   385
	return 1;
dvander@500
   386
}
dvander@500
   387
dvander@514
   388
static cell_t sm_RegAdminCmd(IPluginContext *pContext, const cell_t *params)
dvander@514
   389
{
dvander@514
   390
	char *name,*help;
dvander@514
   391
	const char *group;
dvander@514
   392
	IPluginFunction *pFunction;
dvander@514
   393
	FlagBits flags = params[3];
dvander@514
   394
	int cmdflags = params[6];
dvander@514
   395
dvander@514
   396
	pContext->LocalToString(params[1], &name);
dvander@514
   397
	pContext->LocalToString(params[4], &help);
dvander@514
   398
	pContext->LocalToString(params[5], (char **)&group);
dvander@514
   399
	pFunction = pContext->GetFunctionById(params[2]);
dvander@514
   400
dvander@514
   401
	if (group[0] == '\0')
dvander@514
   402
	{
dvander@514
   403
		CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@514
   404
		group = pPlugin->GetFilename();
dvander@514
   405
	}
dvander@514
   406
dvander@514
   407
	if (!pFunction)
dvander@514
   408
	{
dvander@514
   409
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@514
   410
	}
dvander@514
   411
ds@579
   412
	if (!g_ConCmds.AddAdminCommand(pFunction, name, group, flags, help, cmdflags))
ds@579
   413
	{
ds@579
   414
		return pContext->ThrowNativeError("Command \"%s\" could not be created. A convar with the same name already exists.", name);
ds@579
   415
	}
dvander@514
   416
dvander@514
   417
	return 1;
dvander@514
   418
}
dvander@514
   419
dvander@517
   420
static cell_t sm_GetCmdArgs(IPluginContext *pContext, const cell_t *params)
dvander@517
   421
{
dvander@517
   422
	return engine->Cmd_Argc() - 1;
dvander@517
   423
}
dvander@517
   424
dvander@517
   425
static cell_t sm_GetCmdArg(IPluginContext *pContext, const cell_t *params)
dvander@517
   426
{
dvander@517
   427
	const char *arg = engine->Cmd_Argv(params[1]);
dvander@517
   428
	
dvander@517
   429
	pContext->StringToLocalUTF8(params[2], params[3], arg, NULL);
dvander@517
   430
dvander@517
   431
	return 1;
dvander@517
   432
}
dvander@517
   433
dvander@517
   434
static cell_t sm_GetCmdArgString(IPluginContext *pContext, const cell_t *params)
dvander@517
   435
{
dvander@517
   436
	const char *args = engine->Cmd_Args();
dvander@517
   437
dvander@633
   438
	if (!args)
dvander@633
   439
	{
dvander@633
   440
		args = "";
dvander@633
   441
	}
dvander@633
   442
dvander@517
   443
	pContext->StringToLocalUTF8(params[1], params[2], args, NULL);
dvander@517
   444
dvander@517
   445
	return 1;
dvander@517
   446
}
dvander@517
   447
dvander@518
   448
static cell_t sm_PrintToServer(IPluginContext *pCtx, const cell_t *params)
dvander@518
   449
{
dvander@518
   450
	char buffer[1024];
dvander@518
   451
	char *fmt;
dvander@518
   452
	int arg = 2;
dvander@518
   453
dvander@518
   454
	pCtx->LocalToString(params[1], &fmt);
dvander@518
   455
	size_t res = atcprintf(buffer, sizeof(buffer)-2, fmt, pCtx, params, &arg);
dvander@518
   456
dvander@518
   457
	buffer[res++] = '\n';
dvander@518
   458
	buffer[res] = '\0';
dvander@518
   459
dvander@518
   460
	META_CONPRINT(buffer);
dvander@518
   461
dvander@518
   462
	return 1;
dvander@518
   463
}
dvander@518
   464
dvander@518
   465
static cell_t sm_PrintToConsole(IPluginContext *pCtx, const cell_t *params)
dvander@518
   466
{
dvander@518
   467
	int index = params[1];
dvander@520
   468
	if ((index < 0) || (index > g_Players.GetMaxClients()))
dvander@518
   469
	{
dvander@518
   470
		return pCtx->ThrowNativeError("Invalid client index %d", index);
dvander@518
   471
	}
dvander@518
   472
dvander@520
   473
	CPlayer *pPlayer = NULL;
dvander@520
   474
	if (index != 0)
dvander@518
   475
	{
dvander@520
   476
		pPlayer = g_Players.GetPlayerByIndex(index);
dvander@520
   477
		if (!pPlayer->IsInGame())
dvander@520
   478
		{
dvander@520
   479
			return pCtx->ThrowNativeError("Client %d is not in game", index);
dvander@520
   480
		}
dvander@520
   481
		
dvander@520
   482
		/* Silent fail on bots, engine will crash */
dvander@520
   483
		if (pPlayer->IsFakeClient())
dvander@520
   484
		{
dvander@520
   485
			return 0;
dvander@520
   486
		}
dvander@519
   487
	}
dvander@518
   488
dvander@518
   489
	char buffer[1024];
dvander@518
   490
	char *fmt;
dvander@518
   491
	int arg = 3;
dvander@518
   492
dvander@518
   493
	pCtx->LocalToString(params[2], &fmt);
dvander@518
   494
	size_t res = atcprintf(buffer, sizeof(buffer)-2, fmt, pCtx, params, &arg);
dvander@518
   495
dvander@518
   496
	buffer[res++] = '\n';
dvander@518
   497
	buffer[res] = '\0';
dvander@518
   498
dvander@520
   499
	if (index != 0)
dvander@520
   500
	{
dvander@520
   501
		engine->ClientPrintf(pPlayer->GetEdict(), buffer);
dvander@520
   502
	} else {
dvander@520
   503
		META_CONPRINT(buffer);
dvander@520
   504
	}
dvander@518
   505
dvander@518
   506
	return 1;
dvander@518
   507
}
dvander@518
   508
dvander@522
   509
static cell_t sm_ServerCommand(IPluginContext *pContext, const cell_t *params)
dvander@522
   510
{
dvander@522
   511
	char buffer[1024];
dvander@522
   512
	size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
dvander@522
   513
dvander@522
   514
	/* One byte for null terminator, one for newline */
dvander@522
   515
	buffer[len++] = '\n';
dvander@522
   516
	buffer[len] = '\0';
dvander@522
   517
dvander@522
   518
	engine->ServerCommand(buffer);
dvander@522
   519
dvander@522
   520
	return 1;
dvander@522
   521
}
dvander@522
   522
dvander@522
   523
static cell_t sm_InsertServerCommand(IPluginContext *pContext, const cell_t *params)
dvander@522
   524
{
dvander@522
   525
	char buffer[1024];
dvander@522
   526
	size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer)-2, pContext, params, 1);
dvander@522
   527
dvander@522
   528
	/* One byte for null terminator, one for newline */
dvander@522
   529
	buffer[len++] = '\n';
dvander@522
   530
	buffer[len] = '\0';
dvander@522
   531
dvander@522
   532
	engine->InsertServerCommand(buffer);
dvander@522
   533
dvander@522
   534
	return 1;
dvander@522
   535
}
dvander@522
   536
dvander@522
   537
static cell_t sm_ServerExecute(IPluginContext *pContext, const cell_t *params)
dvander@522
   538
{
dvander@522
   539
	engine->ServerExecute();
dvander@522
   540
dvander@522
   541
	return 1;
dvander@522
   542
}
dvander@522
   543
dvander@532
   544
static cell_t sm_ClientCommand(IPluginContext *pContext, const cell_t *params)
dvander@532
   545
{
dvander@532
   546
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(params[1]);
dvander@532
   547
dvander@532
   548
	if (!pPlayer)
dvander@532
   549
	{
dvander@532
   550
		return pContext->ThrowNativeError("Player %d is not a valid player", params[1]);
dvander@532
   551
	}
dvander@532
   552
dvander@532
   553
	if (!pPlayer->IsConnected())
dvander@532
   554
	{
dvander@532
   555
		return pContext->ThrowNativeError("Player %d is not connected", params[1]);
dvander@532
   556
	}
dvander@532
   557
dvander@532
   558
	char buffer[256];
dvander@532
   559
	g_SourceMod.FormatString(buffer, sizeof(buffer)-1, pContext, params, 2);
dvander@532
   560
dvander@532
   561
	engine->ClientCommand(pPlayer->GetEdict(), "%s", buffer);
dvander@532
   562
dvander@532
   563
	return 1;
dvander@532
   564
}
dvander@532
   565
dvander@518
   566
REGISTER_NATIVES(consoleNatives)
dvander@498
   567
{
dvander@498
   568
	{"CreateConVar",		sm_CreateConVar},
dvander@498
   569
	{"FindConVar",			sm_FindConVar},
dvander@498
   570
	{"HookConVarChange",	sm_HookConVarChange},
dvander@498
   571
	{"UnhookConVarChange",	sm_UnhookConVarChange},
dvander@498
   572
	{"GetConVarBool",		sm_GetConVarBool},
dvander@498
   573
	{"SetConVarBool",		sm_SetConVarNum},
dvander@498
   574
	{"GetConVarInt",		sm_GetConVarInt},
dvander@498
   575
	{"SetConVarInt",		sm_SetConVarNum},
dvander@498
   576
	{"GetConVarFloat",		sm_GetConVarFloat},
dvander@498
   577
	{"SetConVarFloat",		sm_SetConVarFloat},
dvander@498
   578
	{"GetConVarString",		sm_GetConVarString},
dvander@498
   579
	{"SetConVarString",		sm_SetConVarString},
dvander@498
   580
	{"GetConVarFlags",		sm_GetConVarFlags},
dvander@498
   581
	{"SetConVarFlags",		sm_SetConVarFlags},
dvander@498
   582
	{"GetConVarName",		sm_GetConVarName},
dvander@498
   583
	{"GetConVarMin",		sm_GetConVarMin},
dvander@498
   584
	{"GetConVarMax",		sm_GetConVarMax},
dvander@498
   585
	{"ResetConVar",			sm_ResetConVar},
dvander@498
   586
	{"RegServerCmd",		sm_RegServerCmd},
dvander@500
   587
	{"RegConsoleCmd",		sm_RegConsoleCmd},
dvander@517
   588
	{"GetCmdArgString",		sm_GetCmdArgString},
dvander@517
   589
	{"GetCmdArgs",			sm_GetCmdArgs},
dvander@517
   590
	{"GetCmdArg",			sm_GetCmdArg},
dvander@518
   591
	{"PrintToServer",		sm_PrintToServer},
dvander@518
   592
	{"PrintToConsole",		sm_PrintToConsole},
dvander@520
   593
	{"RegAdminCmd",			sm_RegAdminCmd},
dvander@522
   594
	{"ServerCommand",		sm_ServerCommand},
dvander@522
   595
	{"InsertServerCommand",	sm_InsertServerCommand},
dvander@522
   596
	{"ServerExecute",		sm_ServerExecute},
dvander@532
   597
	{"ClientCommand",		sm_ClientCommand},
dvander@498
   598
	{NULL,					NULL}
dvander@498
   599
};