1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/core/smn_convar.cpp Thu Feb 08 21:41:28 2007 +0000
1.3 @@ -0,0 +1,293 @@
1.4 +/**
1.5 +* ===============================================================
1.6 +* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
1.7 +* ===============================================================
1.8 +*
1.9 +* This file is not open source and may not be copied without explicit
1.10 +* written permission of AlliedModders LLC. This file may not be redistributed
1.11 +* in whole or significant part.
1.12 +* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
1.13 +*
1.14 +* Version: $Id$
1.15 +*/
1.16 +
1.17 +#include "sm_globals.h"
1.18 +#include "sourcemm_api.h"
1.19 +#include "HandleSys.h"
1.20 +#include "CConVarManager.h"
1.21 +
1.22 +static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params)
1.23 +{
1.24 + char *name, *defaultVal, *helpText;
1.25 +
1.26 + pContext->LocalToString(params[1], &name);
1.27 +
1.28 + // While the engine seems to accept a blank convar name, it causes a crash upon server quit
1.29 + if (name == NULL || strcmp(name, "") == 0)
1.30 + {
1.31 + pContext->ThrowNativeError("Null or blank convar name is not allowed.");
1.32 + return BAD_HANDLE;
1.33 + }
1.34 +
1.35 + pContext->LocalToString(params[2], &defaultVal);
1.36 + pContext->LocalToString(params[3], &helpText);
1.37 +
1.38 + bool hasMin = params[5] ? true : false;
1.39 + bool hasMax = params[7] ? true : false;
1.40 + float min = sp_ctof(params[6]);
1.41 + float max = sp_ctof(params[8]);
1.42 +
1.43 + return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max);
1.44 +}
1.45 +
1.46 +static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params)
1.47 +{
1.48 + char *name;
1.49 +
1.50 + pContext->LocalToString(params[1], &name);
1.51 +
1.52 + // While the engine seems to accept a blank convar name, it causes a crash upon server quit
1.53 + if (name == NULL || strcmp(name, "") == 0)
1.54 + {
1.55 + return BAD_HANDLE;
1.56 + }
1.57 +
1.58 + return g_ConVarManager.FindConVar(name);
1.59 +}
1.60 +
1.61 +static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params)
1.62 +{
1.63 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.64 + HandleError err;
1.65 + ConVar *cvar;
1.66 +
1.67 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.68 + != HandleError_None)
1.69 + {
1.70 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.71 + }
1.72 +
1.73 + return cvar->GetBool();
1.74 +}
1.75 +
1.76 +static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params)
1.77 +{
1.78 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.79 + HandleError err;
1.80 + ConVar *cvar;
1.81 +
1.82 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.83 + != HandleError_None)
1.84 + {
1.85 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.86 + }
1.87 +
1.88 + return cvar->GetInt();
1.89 +}
1.90 +
1.91 +/* This handles both SetConVarBool() and SetConVarInt() */
1.92 +static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params)
1.93 +{
1.94 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.95 + HandleError err;
1.96 + ConVar *cvar;
1.97 +
1.98 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.99 + != HandleError_None)
1.100 + {
1.101 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.102 + }
1.103 +
1.104 + cvar->SetValue(params[2]);
1.105 +
1.106 + return 1;
1.107 +}
1.108 +
1.109 +static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params)
1.110 +{
1.111 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.112 + HandleError err;
1.113 + ConVar *cvar;
1.114 +
1.115 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.116 + != HandleError_None)
1.117 + {
1.118 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.119 + }
1.120 +
1.121 + float value = cvar->GetFloat();
1.122 +
1.123 + return sp_ftoc(value);
1.124 +}
1.125 +
1.126 +static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params)
1.127 +{
1.128 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.129 + HandleError err;
1.130 + ConVar *cvar;
1.131 +
1.132 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.133 + != HandleError_None)
1.134 + {
1.135 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.136 + }
1.137 +
1.138 + float value = sp_ctof(params[2]);
1.139 + cvar->SetValue(value);
1.140 +
1.141 + return 1;
1.142 +}
1.143 +
1.144 +static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params)
1.145 +{
1.146 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.147 + HandleError err;
1.148 + ConVar *cvar;
1.149 +
1.150 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.151 + != HandleError_None)
1.152 + {
1.153 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.154 + }
1.155 +
1.156 + pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL);
1.157 +
1.158 + return 1;
1.159 +}
1.160 +
1.161 +static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params)
1.162 +{
1.163 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.164 + HandleError err;
1.165 + ConVar *cvar;
1.166 +
1.167 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.168 + != HandleError_None)
1.169 + {
1.170 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.171 + }
1.172 +
1.173 + char *value;
1.174 + pContext->LocalToString(params[2], &value);
1.175 +
1.176 + cvar->SetValue(value);
1.177 +
1.178 + return 1;
1.179 +}
1.180 +
1.181 +static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params)
1.182 +{
1.183 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.184 + HandleError err;
1.185 + ConVar *cvar;
1.186 +
1.187 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.188 + != HandleError_None)
1.189 + {
1.190 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.191 + }
1.192 +
1.193 + return cvar->GetFlags();
1.194 +}
1.195 +
1.196 +static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params)
1.197 +{
1.198 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.199 + HandleError err;
1.200 + ConVar *cvar;
1.201 +
1.202 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.203 + != HandleError_None)
1.204 + {
1.205 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.206 + }
1.207 +
1.208 + cvar->SetFlags(params[2]);
1.209 +
1.210 + return 1;
1.211 +}
1.212 +
1.213 +static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params)
1.214 +{
1.215 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.216 + HandleError err;
1.217 + ConVar *cvar;
1.218 +
1.219 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.220 + != HandleError_None)
1.221 + {
1.222 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.223 + }
1.224 +
1.225 + cell_t *addr;
1.226 + bool hasMin;
1.227 + float min;
1.228 +
1.229 + pContext->LocalToPhysAddr(params[2], &addr);
1.230 +
1.231 + hasMin = cvar->GetMin(min);
1.232 + *addr = sp_ftoc(min);
1.233 +
1.234 + return hasMin;
1.235 +}
1.236 +
1.237 +static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params)
1.238 +{
1.239 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.240 + HandleError err;
1.241 + ConVar *cvar;
1.242 +
1.243 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.244 + != HandleError_None)
1.245 + {
1.246 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.247 + }
1.248 +
1.249 + cell_t *addr;
1.250 + bool hasMax;
1.251 + float max;
1.252 +
1.253 + pContext->LocalToPhysAddr(params[2], &addr);
1.254 +
1.255 + hasMax = cvar->GetMax(max);
1.256 + *addr = sp_ftoc(max);
1.257 +
1.258 + return hasMax;
1.259 +}
1.260 +
1.261 +static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params)
1.262 +{
1.263 + Handle_t hndl = static_cast<Handle_t>(params[1]);
1.264 + HandleError err;
1.265 + ConVar *cvar;
1.266 +
1.267 + if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar))
1.268 + != HandleError_None)
1.269 + {
1.270 + return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err);
1.271 + }
1.272 +
1.273 + cvar->Revert();
1.274 +
1.275 + return 1;
1.276 +}
1.277 +
1.278 +REGISTER_NATIVES(convarNatives)
1.279 +{
1.280 + {"CreateConVar", sm_CreateConVar},
1.281 + {"FindConVar", sm_FindConVar},
1.282 + {"GetConVarBool", sm_GetConVarBool},
1.283 + {"SetConVarBool", sm_SetConVarNum},
1.284 + {"GetConVarInt", sm_GetConVarInt},
1.285 + {"SetConVarInt", sm_SetConVarNum},
1.286 + {"GetConVarFloat", sm_GetConVarFloat},
1.287 + {"SetConVarFloat", sm_SetConVarFloat},
1.288 + {"GetConVarString", sm_GetConVarString},
1.289 + {"SetConVarString", sm_SetConVarString},
1.290 + {"GetConVarFlags", sm_GetConVarFlags},
1.291 + {"SetConVarFlags", sm_SetConVarFlags},
1.292 + {"GetConVarMin", sm_GetConVarMin},
1.293 + {"GetConVarMax", sm_GetConVarMax},
1.294 + {"ResetConVar", sm_ResetConVar},
1.295 + {NULL, NULL}
1.296 +};