2 * ===============================================================
3 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
4 * ===============================================================
6 * This file is not open source and may not be copied without explicit
7 * written permission of AlliedModders LLC. This file may not be redistributed
8 * in whole or significant part.
9 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
14 #include "sm_globals.h"
15 #include "sourcemm_api.h"
16 #include "HandleSys.h"
17 #include "CConVarManager.h"
18 #include "CConCmdManager.h"
20 static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
22 char *name, *defaultVal, *helpText;
24 pContext->LocalToString(params[1], &name);
26 // While the engine seems to accept a blank convar name, it causes a crash upon server quit
27 if (name == NULL || strcmp(name, "") == 0)
29 return pContext->ThrowNativeError("Null or blank convar name is not allowed");
32 pContext->LocalToString(params[2], &defaultVal);
33 pContext->LocalToString(params[3], &helpText);
35 bool hasMin = params[5] ? true : false;
36 bool hasMax = params[7] ? true : false;
37 float min = sp_ctof(params[6]);
38 float max = sp_ctof(params[8]);
40 return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
43 static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
47 pContext->LocalToString(params[1], &name);
49 // While the engine seems to accept a blank convar name, it causes a crash upon server quit
50 if (name == NULL || strcmp(name, "") == 0)
55 return g_ConVarManager.FindConVar(name);
58 static cell_t sm_HookConVarChange(IPluginContext *pContext, const cell_t *params)
60 Handle_t hndl = static_cast<Handle_t>(params[1]);
64 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
67 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
70 g_ConVarManager.HookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
75 static cell_t sm_UnhookConVarChange(IPluginContext *pContext, const cell_t *params)
77 Handle_t hndl = static_cast<Handle_t>(params[1]);
81 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
84 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
87 g_ConVarManager.UnhookConVarChange(pContext, cvar, static_cast<funcid_t>(params[2]));
92 static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
94 Handle_t hndl = static_cast<Handle_t>(params[1]);
98 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
101 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
104 return cvar->GetBool();
107 static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
109 Handle_t hndl = static_cast<Handle_t>(params[1]);
113 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
116 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
119 return cvar->GetInt();
122 /* This handles both SetConVarBool() and SetConVarInt() */
123 static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
125 Handle_t hndl = static_cast<Handle_t>(params[1]);
129 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
132 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
135 cvar->SetValue(params[2]);
140 static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
142 Handle_t hndl = static_cast<Handle_t>(params[1]);
146 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
149 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
152 float value = cvar->GetFloat();
154 return sp_ftoc(value);
157 static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params)
159 Handle_t hndl = static_cast<Handle_t>(params[1]);
163 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
166 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
169 float value = sp_ctof(params[2]);
170 cvar->SetValue(value);
175 static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
177 Handle_t hndl = static_cast<Handle_t>(params[1]);
181 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
184 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
187 pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
192 static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
194 Handle_t hndl = static_cast<Handle_t>(params[1]);
198 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
201 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
205 pContext->LocalToString(params[2], &value);
207 cvar->SetValue(value);
212 static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
214 Handle_t hndl = static_cast<Handle_t>(params[1]);
218 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
221 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
224 return cvar->GetFlags();
227 static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
229 Handle_t hndl = static_cast<Handle_t>(params[1]);
233 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
236 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
239 cvar->SetFlags(params[2]);
244 static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
246 Handle_t hndl = static_cast<Handle_t>(params[1]);
250 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
253 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
260 pContext->LocalToPhysAddr(params[2], &addr);
262 hasMin = cvar->GetMin(min);
263 *addr = sp_ftoc(min);
268 static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
270 Handle_t hndl = static_cast<Handle_t>(params[1]);
274 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
277 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
284 pContext->LocalToPhysAddr(params[2], &addr);
286 hasMax = cvar->GetMax(max);
287 *addr = sp_ftoc(max);
292 static cell_t sm_GetConVarName(IPluginContext *pContext, const cell_t *params)
294 Handle_t hndl = static_cast<Handle_t>(params[1]);
298 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
301 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
304 pContext->StringToLocalUTF8(params[2], params[3], cvar->GetName(), NULL);
309 static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
311 Handle_t hndl = static_cast<Handle_t>(params[1]);
315 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
318 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
326 static cell_t sm_RegServerCmd(IPluginContext *pContext, const cell_t *params)
329 IPluginFunction *pFunction;
331 pContext->LocalToString(params[1], &name);
332 pContext->LocalToString(params[3], &help);
333 pFunction = pContext->GetFunctionById(params[2]);
337 return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
340 g_ConCmds.AddServerCommand(pFunction, name, help, params[4]);
345 static cell_t sm_RegConsoleCmd(IPluginContext *pContext, const cell_t *params)
348 IPluginFunction *pFunction;
350 pContext->LocalToString(params[1], &name);
351 pContext->LocalToString(params[3], &help);
352 pFunction = pContext->GetFunctionById(params[2]);
356 return pContext->ThrowNativeError("Invalid function id (%X)", params[2]);
359 g_ConCmds.AddConsoleCommand(pFunction, name, help, params[4]);
364 REGISTER_NATIVES(convarNatives)
366 {"CreateConVar", sm_CreateConVar},
367 {"FindConVar", sm_FindConVar},
368 {"HookConVarChange", sm_HookConVarChange},
369 {"UnhookConVarChange", sm_UnhookConVarChange},
370 {"GetConVarBool", sm_GetConVarBool},
371 {"SetConVarBool", sm_SetConVarNum},
372 {"GetConVarInt", sm_GetConVarInt},
373 {"SetConVarInt", sm_SetConVarNum},
374 {"GetConVarFloat", sm_GetConVarFloat},
375 {"SetConVarFloat", sm_SetConVarFloat},
376 {"GetConVarString", sm_GetConVarString},
377 {"SetConVarString", sm_SetConVarString},
378 {"GetConVarFlags", sm_GetConVarFlags},
379 {"SetConVarFlags", sm_SetConVarFlags},
380 {"GetConVarName", sm_GetConVarName},
381 {"GetConVarMin", sm_GetConVarMin},
382 {"GetConVarMax", sm_GetConVarMax},
383 {"ResetConVar", sm_ResetConVar},
384 {"RegServerCmd", sm_RegServerCmd},
385 {"RegConsoleCmd", sm_RegConsoleCmd},