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