core/smn_convar.cpp
author Scott Ehlert <ds@alliedmods.net>
Thu Feb 08 21:41:28 2007 +0000 (2007-02-08)
changeset 457 9b8a85bf4175
child 465 8856d2e7018d
permissions -rw-r--r--
Initial import of convar stuff
1) Natives to create, find, set, and get convars
2) "cvars" option added to sm menu
3) Some internal additions to CPlugin to store a convar list
Still some things left to do...
     1 /**
     2 * ===============================================================
     3 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
     4 * ===============================================================
     5 *
     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
    10 *
    11 * Version: $Id$
    12 */
    13 
    14 #include "sm_globals.h"
    15 #include "sourcemm_api.h"
    16 #include "HandleSys.h"
    17 #include "CConVarManager.h"
    18 
    19 static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
    20 {
    21 	char *name, *defaultVal, *helpText;
    22 
    23 	pContext->LocalToString(params[1], &name);
    24 
    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)
    27 	{
    28 		pContext->ThrowNativeError("Null or blank convar name is not allowed.");
    29 		return BAD_HANDLE;
    30 	}
    31 
    32 	pContext->LocalToString(params[2], &defaultVal);
    33 	pContext->LocalToString(params[3], &helpText);
    34 
    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]);
    39 
    40 	return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
    41 }
    42 
    43 static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
    44 {
    45 	char *name;
    46 
    47 	pContext->LocalToString(params[1], &name);
    48 
    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)
    51 	{
    52 		return BAD_HANDLE;
    53 	}
    54 
    55 	return g_ConVarManager.FindConVar(name);
    56 }
    57 
    58 static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
    59 {
    60 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    61 	HandleError err;
    62 	ConVar *cvar;
    63 
    64 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
    65 		!= HandleError_None)
    66 	{
    67 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
    68 	}
    69 
    70 	return cvar->GetBool();
    71 }
    72 
    73 static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
    74 {
    75 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    76 	HandleError err;
    77 	ConVar *cvar;
    78 
    79 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
    80 		!= HandleError_None)
    81 	{
    82 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
    83 	}
    84 
    85 	return cvar->GetInt();
    86 }
    87 
    88 /* This handles both SetConVarBool() and SetConVarInt() */
    89 static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
    90 {
    91 	Handle_t hndl = static_cast<Handle_t>(params[1]);
    92 	HandleError err;
    93 	ConVar *cvar;
    94 
    95 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
    96 		!= HandleError_None)
    97 	{
    98 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
    99 	}
   100 
   101 	cvar->SetValue(params[2]);
   102 
   103 	return 1;
   104 }
   105 
   106 static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
   107 {
   108 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   109 	HandleError err;
   110 	ConVar *cvar;
   111 
   112 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   113 		!= HandleError_None)
   114 	{
   115 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   116 	}
   117 	
   118 	float value = cvar->GetFloat();
   119 
   120 	return sp_ftoc(value);
   121 }
   122 
   123 static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params)
   124 {
   125 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   126 	HandleError err;
   127 	ConVar *cvar;
   128 
   129 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   130 		!= HandleError_None)
   131 	{
   132 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   133 	}
   134 
   135 	float value = sp_ctof(params[2]);
   136 	cvar->SetValue(value);
   137 
   138 	return 1;
   139 }
   140 
   141 static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
   142 {
   143 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   144 	HandleError err;
   145 	ConVar *cvar;
   146 
   147 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   148 		!= HandleError_None)
   149 	{
   150 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   151 	}
   152 
   153 	pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
   154 
   155 	return 1;
   156 }
   157 
   158 static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
   159 {
   160 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   161 	HandleError err;
   162 	ConVar *cvar;
   163 
   164 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   165 		!= HandleError_None)
   166 	{
   167 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   168 	}
   169 
   170 	char *value;
   171 	pContext->LocalToString(params[2], &value);
   172 
   173 	cvar->SetValue(value);
   174 
   175 	return 1;
   176 }
   177 
   178 static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
   179 {
   180 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   181 	HandleError err;
   182 	ConVar *cvar;
   183 
   184 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   185 		!= HandleError_None)
   186 	{
   187 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   188 	}
   189 
   190 	return cvar->GetFlags();
   191 }
   192 
   193 static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
   194 {
   195 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   196 	HandleError err;
   197 	ConVar *cvar;
   198 
   199 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   200 		!= HandleError_None)
   201 	{
   202 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   203 	}
   204 
   205 	cvar->SetFlags(params[2]);
   206 
   207 	return 1;
   208 }
   209 
   210 static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
   211 {
   212 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   213 	HandleError err;
   214 	ConVar *cvar;
   215 
   216 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   217 		!= HandleError_None)
   218 	{
   219 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   220 	}
   221 
   222 	cell_t *addr;
   223 	bool hasMin;
   224 	float min;
   225 
   226 	pContext->LocalToPhysAddr(params[2], &addr);
   227 
   228 	hasMin = cvar->GetMin(min);
   229 	*addr = sp_ftoc(min);
   230 
   231 	return hasMin;
   232 }
   233 
   234 static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
   235 {
   236 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   237 	HandleError err;
   238 	ConVar *cvar;
   239 
   240 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   241 		!= HandleError_None)
   242 	{
   243 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   244 	}
   245 
   246 	cell_t *addr;
   247 	bool hasMax;
   248 	float max;
   249 
   250 	pContext->LocalToPhysAddr(params[2], &addr);
   251 
   252 	hasMax = cvar->GetMax(max);
   253 	*addr = sp_ftoc(max);
   254 
   255 	return hasMax;
   256 }
   257 
   258 static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
   259 {
   260 	Handle_t hndl = static_cast<Handle_t>(params[1]);
   261 	HandleError err;
   262 	ConVar *cvar;
   263 
   264 	if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
   265 		!= HandleError_None)
   266 	{
   267 		return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
   268 	}
   269 
   270 	cvar->Revert();
   271 
   272 	return 1;
   273 }
   274 
   275 REGISTER_NATIVES(convarNatives)
   276 {
   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},
   292 	{NULL,				NULL}
   293 };