ds@457: /** ds@457: * =============================================================== ds@457: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. ds@457: * =============================================================== ds@457: * ds@457: * This file is not open source and may not be copied without explicit ds@457: * written permission of AlliedModders LLC. This file may not be redistributed ds@457: * in whole or significant part. ds@457: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php ds@457: * ds@457: * Version: $Id$ ds@457: */ ds@457: ds@457: #include "sm_globals.h" ds@457: #include "sourcemm_api.h" ds@457: #include "HandleSys.h" ds@457: #include "CConVarManager.h" ds@457: ds@457: static cell_t sm_CreateConVar(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: char *name, *defaultVal, *helpText; ds@457: ds@457: pContext->LocalToString(params[1], &name); ds@457: ds@457: // While the engine seems to accept a blank convar name, it causes a crash upon server quit ds@457: if (name == NULL || strcmp(name, "") == 0) ds@457: { ds@457: pContext->ThrowNativeError("Null or blank convar name is not allowed."); ds@457: return BAD_HANDLE; ds@457: } ds@457: ds@457: pContext->LocalToString(params[2], &defaultVal); ds@457: pContext->LocalToString(params[3], &helpText); ds@457: ds@457: bool hasMin = params[5] ? true : false; ds@457: bool hasMax = params[7] ? true : false; ds@457: float min = sp_ctof(params[6]); ds@457: float max = sp_ctof(params[8]); ds@457: ds@457: return g_ConVarManager.CreateConVar(pContext, name, defaultVal, helpText, params[4], hasMin, min, hasMax, max); ds@457: } ds@457: ds@457: static cell_t sm_FindConVar(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: char *name; ds@457: ds@457: pContext->LocalToString(params[1], &name); ds@457: ds@457: // While the engine seems to accept a blank convar name, it causes a crash upon server quit ds@457: if (name == NULL || strcmp(name, "") == 0) ds@457: { ds@457: return BAD_HANDLE; ds@457: } ds@457: ds@457: return g_ConVarManager.FindConVar(name); ds@457: } ds@457: ds@457: static cell_t sm_GetConVarBool(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: return cvar->GetBool(); ds@457: } ds@457: ds@457: static cell_t sm_GetConVarInt(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: return cvar->GetInt(); ds@457: } ds@457: ds@457: /* This handles both SetConVarBool() and SetConVarInt() */ ds@457: static cell_t sm_SetConVarNum(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: cvar->SetValue(params[2]); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: static cell_t sm_GetConVarFloat(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: float value = cvar->GetFloat(); ds@457: ds@457: return sp_ftoc(value); ds@457: } ds@457: ds@457: static cell_t sm_SetConVarFloat(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: float value = sp_ctof(params[2]); ds@457: cvar->SetValue(value); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: static cell_t sm_GetConVarString(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: pContext->StringToLocalUTF8(params[2], params[3], cvar->GetString(), NULL); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: static cell_t sm_SetConVarString(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: char *value; ds@457: pContext->LocalToString(params[2], &value); ds@457: ds@457: cvar->SetValue(value); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: static cell_t sm_GetConVarFlags(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: return cvar->GetFlags(); ds@457: } ds@457: ds@457: static cell_t sm_SetConVarFlags(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: cvar->SetFlags(params[2]); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: static cell_t sm_GetConVarMin(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: cell_t *addr; ds@457: bool hasMin; ds@457: float min; ds@457: ds@457: pContext->LocalToPhysAddr(params[2], &addr); ds@457: ds@457: hasMin = cvar->GetMin(min); ds@457: *addr = sp_ftoc(min); ds@457: ds@457: return hasMin; ds@457: } ds@457: ds@457: static cell_t sm_GetConVarMax(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: cell_t *addr; ds@457: bool hasMax; ds@457: float max; ds@457: ds@457: pContext->LocalToPhysAddr(params[2], &addr); ds@457: ds@457: hasMax = cvar->GetMax(max); ds@457: *addr = sp_ftoc(max); ds@457: ds@457: return hasMax; ds@457: } ds@457: ds@457: static cell_t sm_ResetConVar(IPluginContext *pContext, const cell_t *params) ds@457: { ds@457: Handle_t hndl = static_cast(params[1]); ds@457: HandleError err; ds@457: ConVar *cvar; ds@457: ds@457: if ((err=g_HandleSys.ReadHandle(hndl, g_ConVarManager.GetHandleType(), NULL, (void **)&cvar)) ds@457: != HandleError_None) ds@457: { ds@457: return pContext->ThrowNativeError("Invalid ConVar Handle %x (error %d)", hndl, err); ds@457: } ds@457: ds@457: cvar->Revert(); ds@457: ds@457: return 1; ds@457: } ds@457: ds@457: REGISTER_NATIVES(convarNatives) ds@457: { ds@457: {"CreateConVar", sm_CreateConVar}, ds@457: {"FindConVar", sm_FindConVar}, ds@457: {"GetConVarBool", sm_GetConVarBool}, ds@457: {"SetConVarBool", sm_SetConVarNum}, ds@457: {"GetConVarInt", sm_GetConVarInt}, ds@457: {"SetConVarInt", sm_SetConVarNum}, ds@457: {"GetConVarFloat", sm_GetConVarFloat}, ds@457: {"SetConVarFloat", sm_SetConVarFloat}, ds@457: {"GetConVarString", sm_GetConVarString}, ds@457: {"SetConVarString", sm_SetConVarString}, ds@457: {"GetConVarFlags", sm_GetConVarFlags}, ds@457: {"SetConVarFlags", sm_SetConVarFlags}, ds@457: {"GetConVarMin", sm_GetConVarMin}, ds@457: {"GetConVarMax", sm_GetConVarMax}, ds@457: {"ResetConVar", sm_ResetConVar}, ds@457: {NULL, NULL} ds@457: };