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"
19 static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
21 char *name, *defaultVal, *helpText;
23 pContext->LocalToString(params[1], &name);
25 // While the engine seems to accept a blank convar name, it causes a crash upon server quit
26 if (name == NULL || strcmp(name, "") == 0)
28 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_GetConVarBool(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 return cvar->GetBool();
73 static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
75 Handle_t hndl = static_cast<Handle_t>(params[1]);
79 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
82 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
85 return cvar->GetInt();
88 /* This handles both SetConVarBool() and SetConVarInt() */
89 static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
91 Handle_t hndl = static_cast<Handle_t>(params[1]);
95 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
98 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
101 cvar->SetValue(params[2]);
106 static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
108 Handle_t hndl = static_cast<Handle_t>(params[1]);
112 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
115 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
118 float value = cvar->GetFloat();
120 return sp_ftoc(value);
123 static cell_t sm_SetConVarFloat(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 float value = sp_ctof(params[2]);
136 cvar->SetValue(value);
141 static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
143 Handle_t hndl = static_cast<Handle_t>(params[1]);
147 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
150 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
153 pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
158 static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
160 Handle_t hndl = static_cast<Handle_t>(params[1]);
164 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
167 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
171 pContext->LocalToString(params[2], &value);
173 cvar->SetValue(value);
178 static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
180 Handle_t hndl = static_cast<Handle_t>(params[1]);
184 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
187 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
190 return cvar->GetFlags();
193 static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
195 Handle_t hndl = static_cast<Handle_t>(params[1]);
199 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
202 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
205 cvar->SetFlags(params[2]);
210 static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
212 Handle_t hndl = static_cast<Handle_t>(params[1]);
216 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
219 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
226 pContext->LocalToPhysAddr(params[2], &addr);
228 hasMin = cvar->GetMin(min);
229 *addr = sp_ftoc(min);
234 static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
236 Handle_t hndl = static_cast<Handle_t>(params[1]);
240 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
243 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
250 pContext->LocalToPhysAddr(params[2], &addr);
252 hasMax = cvar->GetMax(max);
253 *addr = sp_ftoc(max);
258 static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
260 Handle_t hndl = static_cast<Handle_t>(params[1]);
264 if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
267 return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
275 REGISTER_NATIVES(convarNatives)
277 {"CreateConVar", sm_CreateConVar},
278 {"FindConVar", sm_FindConVar},
279 {"GetConVarBool", sm_GetConVarBool},
280 {"SetConVarBool", sm_SetConVarNum},
281 {"GetConVarInt", sm_GetConVarInt},
282 {"SetConVarInt", sm_SetConVarNum},
283 {"GetConVarFloat", sm_GetConVarFloat},
284 {"SetConVarFloat", sm_SetConVarFloat},
285 {"GetConVarString", sm_GetConVarString},
286 {"SetConVarString", sm_SetConVarString},
287 {"GetConVarFlags", sm_GetConVarFlags},
288 {"SetConVarFlags", sm_SetConVarFlags},
289 {"GetConVarMin", sm_GetConVarMin},
290 {"GetConVarMax", sm_GetConVarMax},
291 {"ResetConVar", sm_ResetConVar},