core/smn_console.cpp
author David Anderson <dvander@alliedmods.net>
Thu Feb 15 22:17:01 2007 +0000 (2007-02-15)
changeset 498 b404e8154de4
child 500 868e9b19a872
permissions -rw-r--r--
implemented+tested RegServerCmd()
renamed internal project console stuff
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@498
    19
dvander@498
    20
static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    21
{
dvander@498
    22
	char *name, *defaultVal, *helpText;
dvander@498
    23
dvander@498
    24
	pContext->LocalToString(params[1], &name);
dvander@498
    25
dvander@498
    26
	// While the engine seems to accept a blank convar name, it causes a crash upon server quit
dvander@498
    27
	if (name == NULL || strcmp(name, "") == 0)
dvander@498
    28
	{
dvander@498
    29
		return pContext->ThrowNativeError("Null or blank convar name is not allowed");
dvander@498
    30
	}
dvander@498
    31
dvander@498
    32
	pContext->LocalToString(params[2], &defaultVal);
dvander@498
    33
	pContext->LocalToString(params[3], &helpText);
dvander@498
    34
dvander@498
    35
	bool hasMin = params[5] ? true : false;
dvander@498
    36
	bool hasMax = params[7] ? true : false;
dvander@498
    37
	float min = sp_ctof(params[6]);
dvander@498
    38
	float max = sp_ctof(params[8]);
dvander@498
    39
dvander@498
    40
	return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
dvander@498
    41
}
dvander@498
    42
dvander@498
    43
static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
    44
{
dvander@498
    45
	char *name;
dvander@498
    46
dvander@498
    47
	pContext->LocalToString(params[1], &name);
dvander@498
    48
dvander@498
    49
	// While the engine seems to accept a blank convar name, it causes a crash upon server quit
dvander@498
    50
	if (name == NULL || strcmp(name, "") == 0)
dvander@498
    51
	{
dvander@498
    52
		return BAD_HANDLE;
dvander@498
    53
	}
dvander@498
    54
dvander@498
    55
	return g_ConVarManager.FindConVar(name);
dvander@498
    56
}
dvander@498
    57
dvander@498
    58
static cell_t sm_HookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    59
{
dvander@498
    60
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    61
	HandleError err;
dvander@498
    62
	ConVar *cvar;
dvander@498
    63
dvander@498
    64
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
    65
		!= HandleError_None)
dvander@498
    66
	{
dvander@498
    67
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
    68
	}
dvander@498
    69
dvander@498
    70
	g_ConVarManager.HookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
dvander@498
    71
dvander@498
    72
	return 1;
dvander@498
    73
}
dvander@498
    74
dvander@498
    75
static cell_t sm_UnhookConVarChange(IPluginContext *pContext, const cell_t *params)
dvander@498
    76
{
dvander@498
    77
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    78
	HandleError err;
dvander@498
    79
	ConVar *cvar;
dvander@498
    80
dvander@498
    81
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
    82
		!= HandleError_None)
dvander@498
    83
	{
dvander@498
    84
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
    85
	}
dvander@498
    86
dvander@498
    87
	g_ConVarManager.UnhookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
dvander@498
    88
dvander@498
    89
	return 1;
dvander@498
    90
}
dvander@498
    91
dvander@498
    92
static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
dvander@498
    93
{
dvander@498
    94
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
    95
	HandleError err;
dvander@498
    96
	ConVar *cvar;
dvander@498
    97
dvander@498
    98
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
    99
		!= HandleError_None)
dvander@498
   100
	{
dvander@498
   101
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   102
	}
dvander@498
   103
dvander@498
   104
	return cvar->GetBool();
dvander@498
   105
}
dvander@498
   106
dvander@498
   107
static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
dvander@498
   108
{
dvander@498
   109
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   110
	HandleError err;
dvander@498
   111
	ConVar *cvar;
dvander@498
   112
dvander@498
   113
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   114
		!= HandleError_None)
dvander@498
   115
	{
dvander@498
   116
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   117
	}
dvander@498
   118
dvander@498
   119
	return cvar->GetInt();
dvander@498
   120
}
dvander@498
   121
dvander@498
   122
/* This handles both SetConVarBool() and SetConVarInt() */
dvander@498
   123
static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
dvander@498
   124
{
dvander@498
   125
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   126
	HandleError err;
dvander@498
   127
	ConVar *cvar;
dvander@498
   128
dvander@498
   129
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   130
		!= HandleError_None)
dvander@498
   131
	{
dvander@498
   132
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   133
	}
dvander@498
   134
dvander@498
   135
	cvar->SetValue(params[2]);
dvander@498
   136
dvander@498
   137
	return 1;
dvander@498
   138
}
dvander@498
   139
dvander@498
   140
static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
dvander@498
   141
{
dvander@498
   142
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   143
	HandleError err;
dvander@498
   144
	ConVar *cvar;
dvander@498
   145
dvander@498
   146
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   147
		!= HandleError_None)
dvander@498
   148
	{
dvander@498
   149
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   150
	}
dvander@498
   151
	
dvander@498
   152
	float value = cvar->GetFloat();
dvander@498
   153
dvander@498
   154
	return sp_ftoc(value);
dvander@498
   155
}
dvander@498
   156
dvander@498
   157
static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params)
dvander@498
   158
{
dvander@498
   159
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   160
	HandleError err;
dvander@498
   161
	ConVar *cvar;
dvander@498
   162
dvander@498
   163
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   164
		!= HandleError_None)
dvander@498
   165
	{
dvander@498
   166
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   167
	}
dvander@498
   168
dvander@498
   169
	float value = sp_ctof(params[2]);
dvander@498
   170
	cvar->SetValue(value);
dvander@498
   171
dvander@498
   172
	return 1;
dvander@498
   173
}
dvander@498
   174
dvander@498
   175
static cell_t sm_GetConVarString(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;
dvander@498
   179
	ConVar *cvar;
dvander@498
   180
dvander@498
   181
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   182
		!= HandleError_None)
dvander@498
   183
	{
dvander@498
   184
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   185
	}
dvander@498
   186
dvander@498
   187
	pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
dvander@498
   188
dvander@498
   189
	return 1;
dvander@498
   190
}
dvander@498
   191
dvander@498
   192
static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
dvander@498
   193
{
dvander@498
   194
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   195
	HandleError err;
dvander@498
   196
	ConVar *cvar;
dvander@498
   197
dvander@498
   198
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   199
		!= HandleError_None)
dvander@498
   200
	{
dvander@498
   201
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   202
	}
dvander@498
   203
dvander@498
   204
	char *value;
dvander@498
   205
	pContext->LocalToString(params[2], &value);
dvander@498
   206
dvander@498
   207
	cvar->SetValue(value);
dvander@498
   208
dvander@498
   209
	return 1;
dvander@498
   210
}
dvander@498
   211
dvander@498
   212
static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   213
{
dvander@498
   214
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   215
	HandleError err;
dvander@498
   216
	ConVar *cvar;
dvander@498
   217
dvander@498
   218
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   219
		!= HandleError_None)
dvander@498
   220
	{
dvander@498
   221
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   222
	}
dvander@498
   223
dvander@498
   224
	return cvar->GetFlags();
dvander@498
   225
}
dvander@498
   226
dvander@498
   227
static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
dvander@498
   228
{
dvander@498
   229
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   230
	HandleError err;
dvander@498
   231
	ConVar *cvar;
dvander@498
   232
dvander@498
   233
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   234
		!= HandleError_None)
dvander@498
   235
	{
dvander@498
   236
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   237
	}
dvander@498
   238
dvander@498
   239
	cvar->SetFlags(params[2]);
dvander@498
   240
dvander@498
   241
	return 1;
dvander@498
   242
}
dvander@498
   243
dvander@498
   244
static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
dvander@498
   245
{
dvander@498
   246
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   247
	HandleError err;
dvander@498
   248
	ConVar *cvar;
dvander@498
   249
dvander@498
   250
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   251
		!= HandleError_None)
dvander@498
   252
	{
dvander@498
   253
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   254
	}
dvander@498
   255
dvander@498
   256
	cell_t *addr;
dvander@498
   257
	bool hasMin;
dvander@498
   258
	float min;
dvander@498
   259
dvander@498
   260
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   261
dvander@498
   262
	hasMin = cvar->GetMin(min);
dvander@498
   263
	*addr = sp_ftoc(min);
dvander@498
   264
dvander@498
   265
	return hasMin;
dvander@498
   266
}
dvander@498
   267
dvander@498
   268
static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
dvander@498
   269
{
dvander@498
   270
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   271
	HandleError err;
dvander@498
   272
	ConVar *cvar;
dvander@498
   273
dvander@498
   274
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   275
		!= HandleError_None)
dvander@498
   276
	{
dvander@498
   277
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   278
	}
dvander@498
   279
dvander@498
   280
	cell_t *addr;
dvander@498
   281
	bool hasMax;
dvander@498
   282
	float max;
dvander@498
   283
dvander@498
   284
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@498
   285
dvander@498
   286
	hasMax = cvar->GetMax(max);
dvander@498
   287
	*addr = sp_ftoc(max);
dvander@498
   288
dvander@498
   289
	return hasMax;
dvander@498
   290
}
dvander@498
   291
dvander@498
   292
static cell_t sm_GetConVarName(IPluginContext *pContext, const cell_t *params)
dvander@498
   293
{
dvander@498
   294
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   295
	HandleError err;
dvander@498
   296
	ConVar *cvar;
dvander@498
   297
dvander@498
   298
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   299
		!= HandleError_None)
dvander@498
   300
	{
dvander@498
   301
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   302
	}
dvander@498
   303
dvander@498
   304
	pContext->StringToLocalUTF8(params[2], params[3], cvar->GetName(), NULL);
dvander@498
   305
dvander@498
   306
	return 1;
dvander@498
   307
}
dvander@498
   308
dvander@498
   309
static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
dvander@498
   310
{
dvander@498
   311
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@498
   312
	HandleError err;
dvander@498
   313
	ConVar *cvar;
dvander@498
   314
dvander@498
   315
	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
dvander@498
   316
		!= HandleError_None)
dvander@498
   317
	{
dvander@498
   318
		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
dvander@498
   319
	}
dvander@498
   320
dvander@498
   321
	cvar->Revert();
dvander@498
   322
dvander@498
   323
	return 1;
dvander@498
   324
}
dvander@498
   325
dvander@498
   326
static cell_t sm_RegServerCmd(IPluginContext *pContext, const cell_t *params)
dvander@498
   327
{
dvander@498
   328
	char *name,*help;
dvander@498
   329
	IPluginFunction *pFunction;
dvander@498
   330
dvander@498
   331
	pContext->LocalToString(params[1], &name);
dvander@498
   332
	pContext->LocalToString(params[3], &help);
dvander@498
   333
	pFunction = pContext->GetFunctionById(params[2]);
dvander@498
   334
dvander@498
   335
	if (!pFunction)
dvander@498
   336
	{
dvander@498
   337
		return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
dvander@498
   338
	}
dvander@498
   339
dvander@498
   340
	g_ConCmds.AddServerCommand(pFunction, name, help, params[4]);
dvander@498
   341
dvander@498
   342
	return 1;
dvander@498
   343
}
dvander@498
   344
dvander@498
   345
REGISTER_NATIVES(convarNatives)
dvander@498
   346
{
dvander@498
   347
	{"CreateConVar",		sm_CreateConVar},
dvander@498
   348
	{"FindConVar",			sm_FindConVar},
dvander@498
   349
	{"HookConVarChange",	sm_HookConVarChange},
dvander@498
   350
	{"UnhookConVarChange",	sm_UnhookConVarChange},
dvander@498
   351
	{"GetConVarBool",		sm_GetConVarBool},
dvander@498
   352
	{"SetConVarBool",		sm_SetConVarNum},
dvander@498
   353
	{"GetConVarInt",		sm_GetConVarInt},
dvander@498
   354
	{"SetConVarInt",		sm_SetConVarNum},
dvander@498
   355
	{"GetConVarFloat",		sm_GetConVarFloat},
dvander@498
   356
	{"SetConVarFloat",		sm_SetConVarFloat},
dvander@498
   357
	{"GetConVarString",		sm_GetConVarString},
dvander@498
   358
	{"SetConVarString",		sm_SetConVarString},
dvander@498
   359
	{"GetConVarFlags",		sm_GetConVarFlags},
dvander@498
   360
	{"SetConVarFlags",		sm_SetConVarFlags},
dvander@498
   361
	{"GetConVarName",		sm_GetConVarName},
dvander@498
   362
	{"GetConVarMin",		sm_GetConVarMin},
dvander@498
   363
	{"GetConVarMax",		sm_GetConVarMax},
dvander@498
   364
	{"ResetConVar",			sm_ResetConVar},
dvander@498
   365
	{"RegServerCmd",		sm_RegServerCmd},
dvander@498
   366
	{NULL,					NULL}
dvander@498
   367
};