core/smn_console.cpp
author David Anderson <dvander@alliedmods.net>
Sat Feb 17 09:12:21 2007 +0000 (2007-02-17)
changeset 517 da53a0fa5721
parent 514 4c02b38c26ed
child 518 52810a1a9620
permissions -rw-r--r--
added functions for getting arguments
dvander@498
     1
/**
dvander@498
     2
* ===============================================================
dvander@498
     3
* SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@498
     4
* ===============================================================
dvander@498
     5
*
dvander@498
     6
* This file is not open source and may not be copied without explicit
dvander@498
     7
* written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@498
     8
* in whole or significant part.
dvander@498
     9
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@498
    10
*
dvander@498
    11
* Version: $Id$
dvander@498
    12
*/
dvander@498
    13
dvander@498
    14
#include "sm_globals.h"
dvander@498
    15
#include "sourcemm_api.h"
dvander@498
    16
#include "HandleSys.h"
dvander@498
    17
#include "CConVarManager.h"
dvander@498
    18
#include "CConCmdManager.h"
dvander@514
    19
#include "PluginSys.h"
dvander@498
    20
dvander@498
    21
static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    22
{
dvander@498
    23
	char *name, *defaultVal, *helpText;
dvander@498
    24
dvander@498
    25
	pContext->LocalToString(params[1], &name);
dvander@498
    26
dvander@498
    27
	// While the engine seems to accept a blank convar name, it causes a crash upon server quit
dvander@498
    28
	if (name == NULL || strcmp(name, "") == 0)
dvander@498
    29
	{
dvander@498
    30
		return pContext->ThrowNativeError("Null or blank convar name is not allowed");
dvander@498
    31
	}
dvander@498
    32
dvander@498
    33
	pContext->LocalToString(params[2], &defaultVal);
dvander@498
    34
	pContext->LocalToString(params[3], &helpText);
dvander@498
    35
dvander@498
    36
	bool hasMin = params[5] ? true : false;
dvander@498
    37
	bool hasMax = params[7] ? true : false;
dvander@498
    38
	float min = sp_ctof(params[6]);
dvander@498
    39
	float max = sp_ctof(params[8]);
dvander@498
    40
dvander@498
    41
	return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
dvander@498
    42
}
dvander@498
    43
dvander@498
    44
static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    45
{
dvander@498
    46
	char *name;
dvander@498
    47
dvander@498
    48
	pContext->LocalToString(params[1], &name);
dvander@498
    49
dvander@498
    50
	// While the engine seems to accept a blank convar name, it causes a crash upon server quit
dvander@498
    51
	if (name == NULL || strcmp(name, "") == 0)
dvander@498
    52
	{
dvander@498
    53
		return BAD_HANDLE;
dvander@498
    54
	}
dvander@498
    55
dvander@498
    56
	return g_ConVarManager.FindConVar(name);
dvander@498
    57
}
dvander@498
    58
dvander@498
    59
static cell_t sm_HookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    60
{
dvander@498
    61
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    62
	HandleError err;
dvander@498
    63
	ConVar *cvar;
dvander@498
    64
dvander@498
    65
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
    66
		!= HandleError_None)
dvander@498
    67
	{
dvander@498
    68
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
    69
	}
dvander@498
    70
dvander@498
    71
	g_ConVarManager.HookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
dvander@498
    72
dvander@498
    73
	return 1;
dvander@498
    74
}
dvander@498
    75
dvander@498
    76
static cell_t sm_UnhookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    77
{
dvander@498
    78
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    79
	HandleError err;
dvander@498
    80
	ConVar *cvar;
dvander@498
    81
dvander@498
    82
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
    83
		!= HandleError_None)
dvander@498
    84
	{
dvander@498
    85
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
    86
	}
dvander@498
    87
dvander@498
    88
	g_ConVarManager.UnhookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
dvander@498
    89
dvander@498
    90
	return 1;
dvander@498
    91
}
dvander@498
    92
dvander@498
    93
static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
dvander@498
    94
{
dvander@498
    95
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    96
	HandleError err;
dvander@498
    97
	ConVar *cvar;
dvander@498
    98
dvander@498
    99
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   100
		!= HandleError_None)
dvander@498
   101
	{
dvander@498
   102
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   103
	}
dvander@498
   104
dvander@498
   105
	return cvar->GetBool();
dvander@498
   106
}
dvander@498
   107
dvander@498
   108
static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
dvander@498
   109
{
dvander@498
   110
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   111
	HandleError err;
dvander@498
   112
	ConVar *cvar;
dvander@498
   113
dvander@498
   114
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   115
		!= HandleError_None)
dvander@498
   116
	{
dvander@498
   117
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   118
	}
dvander@498
   119
dvander@498
   120
	return cvar->GetInt();
dvander@498
   121
}
dvander@498
   122
dvander@498
   123
/* This handles both SetConVarBool() and SetConVarInt() */
dvander@498
   124
static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
dvander@498
   125
{
dvander@498
   126
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   127
	HandleError err;
dvander@498
   128
	ConVar *cvar;
dvander@498
   129
dvander@498
   130
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   131
		!= HandleError_None)
dvander@498
   132
	{
dvander@498
   133
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   134
	}
dvander@498
   135
dvander@498
   136
	cvar->SetValue(params[2]);
dvander@498
   137
dvander@498
   138
	return 1;
dvander@498
   139
}
dvander@498
   140
dvander@498
   141
static cell_t sm_GetConVarFloat(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;
dvander@498
   145
	ConVar *cvar;
dvander@498
   146
dvander@498
   147
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   148
		!= HandleError_None)
dvander@498
   149
	{
dvander@498
   150
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   151
	}
dvander@498
   152
	
dvander@498
   153
	float value = cvar->GetFloat();
dvander@498
   154
dvander@498
   155
	return sp_ftoc(value);
dvander@498
   156
}
dvander@498
   157
dvander@498
   158
static cell_t sm_SetConVarFloat(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;
dvander@498
   162
	ConVar *cvar;
dvander@498
   163
dvander@498
   164
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   165
		!= HandleError_None)
dvander@498
   166
	{
dvander@498
   167
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   168
	}
dvander@498
   169
dvander@498
   170
	float value = sp_ctof(params[2]);
dvander@498
   171
	cvar->SetValue(value);
dvander@498
   172
dvander@498
   173
	return 1;
dvander@498
   174
}
dvander@498
   175
dvander@498
   176
static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
dvander@498
   177
{
dvander@498
   178
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   179
	HandleError err;
dvander@498
   180
	ConVar *cvar;
dvander@498
   181
dvander@498
   182
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   183
		!= HandleError_None)
dvander@498
   184
	{
dvander@498
   185
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   186
	}
dvander@498
   187
dvander@498
   188
	pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
dvander@498
   189
dvander@498
   190
	return 1;
dvander@498
   191
}
dvander@498
   192
dvander@498
   193
static cell_t sm_SetConVarString(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;
dvander@498
   197
	ConVar *cvar;
dvander@498
   198
dvander@498
   199
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   200
		!= HandleError_None)
dvander@498
   201
	{
dvander@498
   202
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   203
	}
dvander@498
   204
dvander@498
   205
	char *value;
dvander@498
   206
	pContext->LocalToString(params[2], &value);
dvander@498
   207
dvander@498
   208
	cvar->SetValue(value);
dvander@498
   209
dvander@498
   210
	return 1;
dvander@498
   211
}
dvander@498
   212
dvander@498
   213
static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   214
{
dvander@498
   215
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   216
	HandleError err;
dvander@498
   217
	ConVar *cvar;
dvander@498
   218
dvander@498
   219
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   220
		!= HandleError_None)
dvander@498
   221
	{
dvander@498
   222
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   223
	}
dvander@498
   224
dvander@498
   225
	return cvar->GetFlags();
dvander@498
   226
}
dvander@498
   227
dvander@498
   228
static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   229
{
dvander@498
   230
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   231
	HandleError err;
dvander@498
   232
	ConVar *cvar;
dvander@498
   233
dvander@498
   234
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   235
		!= HandleError_None)
dvander@498
   236
	{
dvander@498
   237
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   238
	}
dvander@498
   239
dvander@498
   240
	cvar->SetFlags(params[2]);
dvander@498
   241
dvander@498
   242
	return 1;
dvander@498
   243
}
dvander@498
   244
dvander@498
   245
static cell_t sm_GetConVarMin(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;
dvander@498
   249
	ConVar *cvar;
dvander@498
   250
dvander@498
   251
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   252
		!= HandleError_None)
dvander@498
   253
	{
dvander@498
   254
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   255
	}
dvander@498
   256
dvander@498
   257
	cell_t *addr;
dvander@498
   258
	bool hasMin;
dvander@498
   259
	float min;
dvander@498
   260
dvander@498
   261
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   262
dvander@498
   263
	hasMin = cvar->GetMin(min);
dvander@498
   264
	*addr = sp_ftoc(min);
dvander@498
   265
dvander@498
   266
	return hasMin;
dvander@498
   267
}
dvander@498
   268
dvander@498
   269
static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
dvander@498
   270
{
dvander@498
   271
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   272
	HandleError err;
dvander@498
   273
	ConVar *cvar;
dvander@498
   274
dvander@498
   275
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   276
		!= HandleError_None)
dvander@498
   277
	{
dvander@498
   278
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   279
	}
dvander@498
   280
dvander@498
   281
	cell_t *addr;
dvander@498
   282
	bool hasMax;
dvander@498
   283
	float max;
dvander@498
   284
dvander@498
   285
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   286
dvander@498
   287
	hasMax = cvar->GetMax(max);
dvander@498
   288
	*addr = sp_ftoc(max);
dvander@498
   289
dvander@498
   290
	return hasMax;
dvander@498
   291
}
dvander@498
   292
dvander@498
   293
static cell_t sm_GetConVarName(IPluginContext *pContext, const cell_t *params)
dvander@498
   294
{
dvander@498
   295
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   296
	HandleError err;
dvander@498
   297
	ConVar *cvar;
dvander@498
   298
dvander@498
   299
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   300
		!= HandleError_None)
dvander@498
   301
	{
dvander@498
   302
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   303
	}
dvander@498
   304
dvander@498
   305
	pContext->StringToLocalUTF8(params[2], params[3], cvar->GetName(), NULL);
dvander@498
   306
dvander@498
   307
	return 1;
dvander@498
   308
}
dvander@498
   309
dvander@498
   310
static cell_t sm_ResetConVar(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;
dvander@498
   314
	ConVar *cvar;
dvander@498
   315
dvander@498
   316
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   317
		!= HandleError_None)
dvander@498
   318
	{
dvander@498
   319
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   320
	}
dvander@498
   321
dvander@498
   322
	cvar->Revert();
dvander@498
   323
dvander@498
   324
	return 1;
dvander@498
   325
}
dvander@498
   326
dvander@498
   327
static cell_t sm_RegServerCmd(IPluginContext *pContext, const cell_t *params)
dvander@498
   328
{
dvander@498
   329
	char *name,*help;
dvander@498
   330
	IPluginFunction *pFunction;
dvander@498
   331
dvander@498
   332
	pContext->LocalToString(params[1], &name);
dvander@498
   333
	pContext->LocalToString(params[3], &help);
dvander@498
   334
	pFunction = pContext->GetFunctionById(params[2]);
dvander@498
   335
dvander@498
   336
	if (!pFunction)
dvander@498
   337
	{
dvander@498
   338
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@498
   339
	}
dvander@498
   340
dvander@498
   341
	g_ConCmds.AddServerCommand(pFunction, name, help, params[4]);
dvander@498
   342
dvander@498
   343
	return 1;
dvander@498
   344
}
dvander@498
   345
dvander@500
   346
static cell_t sm_RegConsoleCmd(IPluginContext *pContext, const cell_t *params)
dvander@500
   347
{
dvander@500
   348
	char *name,*help;
dvander@500
   349
	IPluginFunction *pFunction;
dvander@500
   350
dvander@500
   351
	pContext->LocalToString(params[1], &name);
dvander@500
   352
	pContext->LocalToString(params[3], &help);
dvander@500
   353
	pFunction = pContext->GetFunctionById(params[2]);
dvander@500
   354
dvander@500
   355
	if (!pFunction)
dvander@500
   356
	{
dvander@500
   357
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@500
   358
	}
dvander@500
   359
dvander@500
   360
	g_ConCmds.AddConsoleCommand(pFunction, name, help, params[4]);
dvander@500
   361
dvander@500
   362
	return 1;
dvander@500
   363
}
dvander@500
   364
dvander@514
   365
static cell_t sm_RegAdminCmd(IPluginContext *pContext, const cell_t *params)
dvander@514
   366
{
dvander@514
   367
	char *name,*help;
dvander@514
   368
	const char *group;
dvander@514
   369
	IPluginFunction *pFunction;
dvander@514
   370
	FlagBits flags = params[3];
dvander@514
   371
	int cmdflags = params[6];
dvander@514
   372
dvander@514
   373
	pContext->LocalToString(params[1], &name);
dvander@514
   374
	pContext->LocalToString(params[4], &help);
dvander@514
   375
	pContext->LocalToString(params[5], (char **)&group);
dvander@514
   376
	pFunction = pContext->GetFunctionById(params[2]);
dvander@514
   377
dvander@514
   378
	if (group[0] == '\0')
dvander@514
   379
	{
dvander@514
   380
		CPlugin *pPlugin = g_PluginSys.GetPluginByCtx(pContext->GetContext());
dvander@514
   381
		group = pPlugin->GetFilename();
dvander@514
   382
	}
dvander@514
   383
dvander@514
   384
	if (!pFunction)
dvander@514
   385
	{
dvander@514
   386
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@514
   387
	}
dvander@514
   388
dvander@514
   389
	g_ConCmds.AddAdminCommand(pFunction, name, group, flags, help, cmdflags);
dvander@514
   390
dvander@514
   391
	return 1;
dvander@514
   392
}
dvander@514
   393
dvander@517
   394
static cell_t sm_GetCmdArgs(IPluginContext *pContext, const cell_t *params)
dvander@517
   395
{
dvander@517
   396
	return engine->Cmd_Argc() - 1;
dvander@517
   397
}
dvander@517
   398
dvander@517
   399
static cell_t sm_GetCmdArg(IPluginContext *pContext, const cell_t *params)
dvander@517
   400
{
dvander@517
   401
	const char *arg = engine->Cmd_Argv(params[1]);
dvander@517
   402
	
dvander@517
   403
	pContext->StringToLocalUTF8(params[2], params[3], arg, NULL);
dvander@517
   404
dvander@517
   405
	return 1;
dvander@517
   406
}
dvander@517
   407
dvander@517
   408
static cell_t sm_GetCmdArgString(IPluginContext *pContext, const cell_t *params)
dvander@517
   409
{
dvander@517
   410
	const char *args = engine->Cmd_Args();
dvander@517
   411
dvander@517
   412
	pContext->StringToLocalUTF8(params[1], params[2], args, NULL);
dvander@517
   413
dvander@517
   414
	return 1;
dvander@517
   415
}
dvander@517
   416
dvander@498
   417
REGISTER_NATIVES(convarNatives)
dvander@498
   418
{
dvander@498
   419
	{"CreateConVar",		sm_CreateConVar},
dvander@498
   420
	{"FindConVar",			sm_FindConVar},
dvander@498
   421
	{"HookConVarChange",	sm_HookConVarChange},
dvander@498
   422
	{"UnhookConVarChange",	sm_UnhookConVarChange},
dvander@498
   423
	{"GetConVarBool",		sm_GetConVarBool},
dvander@498
   424
	{"SetConVarBool",		sm_SetConVarNum},
dvander@498
   425
	{"GetConVarInt",		sm_GetConVarInt},
dvander@498
   426
	{"SetConVarInt",		sm_SetConVarNum},
dvander@498
   427
	{"GetConVarFloat",		sm_GetConVarFloat},
dvander@498
   428
	{"SetConVarFloat",		sm_SetConVarFloat},
dvander@498
   429
	{"GetConVarString",		sm_GetConVarString},
dvander@498
   430
	{"SetConVarString",		sm_SetConVarString},
dvander@498
   431
	{"GetConVarFlags",		sm_GetConVarFlags},
dvander@498
   432
	{"SetConVarFlags",		sm_SetConVarFlags},
dvander@498
   433
	{"GetConVarName",		sm_GetConVarName},
dvander@498
   434
	{"GetConVarMin",		sm_GetConVarMin},
dvander@498
   435
	{"GetConVarMax",		sm_GetConVarMax},
dvander@498
   436
	{"ResetConVar",			sm_ResetConVar},
dvander@498
   437
	{"RegServerCmd",		sm_RegServerCmd},
dvander@500
   438
	{"RegConsoleCmd",		sm_RegConsoleCmd},
dvander@517
   439
	{"GetCmdArgString",		sm_GetCmdArgString},
dvander@517
   440
	{"GetCmdArgs",			sm_GetCmdArgs},
dvander@517
   441
	{"GetCmdArg",			sm_GetCmdArg},
dvander@498
   442
	{NULL,					NULL}
dvander@498
   443
};