Handle_t ConVarManager::FindConVar(const char *name) { ConVar *pConVar = NULL; ConVarInfo *pInfo; Handle_t hndl; /* Check convar cache to find out if we already have a handle */ if (convar_cache_lookup(name, &pInfo)) { return pInfo->handle; } /* Couldn't find it in cache, so search for it */ pConVar = icvar->FindVar(name); /* If it doesn't exist, then return an invalid handle */ if (!pConVar) { return BAD_HANDLE; } /* Create and initialize ConVarInfo structure */ pInfo = new ConVarInfo(); pInfo->sourceMod = false; pInfo->pChangeForward = NULL; pInfo->pVar = pConVar; /* If we don't have a handle, then create a new one */ hndl = handlesys->CreateHandle(m_ConVarType, pInfo, NULL, g_pCoreIdent, NULL); if (hndl == BAD_HANDLE) { delete pInfo; return BAD_HANDLE; } pInfo->handle = hndl; /* Insert struct into our caches */ m_ConVars.push_back(pInfo); convar_cache.insert(name, pInfo); TrackConCommandBase(pConVar, this); return hndl; }
Handle_t ConVarManager::CreateConVar(IPluginContext *pContext, const char *name, const char *defaultVal, const char *description, int flags, bool hasMin, float min, bool hasMax, float max) { ConVar *pConVar = NULL; ConVarInfo *pInfo = NULL; Handle_t hndl = 0; /* Find out if the convar exists already */ pConVar = icvar->FindVar(name); /* If the convar already exists... */ if (pConVar) { /* Add convar to plugin's list */ AddConVarToPluginList(pContext, pConVar); /* First find out if we already have a handle to it */ if (convar_cache_lookup(name, &pInfo)) { return pInfo->handle; } else { /* Create and initialize ConVarInfo structure */ pInfo = new ConVarInfo(); pInfo->sourceMod = false; pInfo->pChangeForward = NULL; pInfo->pVar = pConVar; /* If we don't, then create a new handle from the convar */ hndl = handlesys->CreateHandle(m_ConVarType, pInfo, NULL, g_pCoreIdent, NULL); if (hndl == BAD_HANDLE) { delete pInfo; return BAD_HANDLE; } pInfo->handle = hndl; /* Insert struct into caches */ m_ConVars.push_back(pInfo); convar_cache.insert(name, pInfo); TrackConCommandBase(pConVar, this); return hndl; } } /* Prevent creating a convar that has the same name as a console command */ if (FindCommand(name)) { return BAD_HANDLE; } /* Create and initialize ConVarInfo structure */ pInfo = new ConVarInfo(); pInfo->handle = hndl; pInfo->sourceMod = true; pInfo->pChangeForward = NULL; /* Create a handle from the new convar */ hndl = handlesys->CreateHandle(m_ConVarType, pInfo, NULL, g_pCoreIdent, NULL); if (hndl == BAD_HANDLE) { delete pInfo; return BAD_HANDLE; } pInfo->handle = hndl; /* Hardening: remove NOTIFY from any convar plugins attempt to create */ flags &= ~FCVAR_NOTIFY; /* Since an existing convar (or concmd with the same name) was not found , now we can finally create it */ pConVar = new ConVar(sm_strdup(name), sm_strdup(defaultVal), flags, sm_strdup(description), hasMin, min, hasMax, max); pInfo->pVar = pConVar; /* Add convar to plugin's list */ AddConVarToPluginList(pContext, pConVar); /* Insert struct into caches */ m_ConVars.push_back(pInfo); convar_cache.insert(name, pInfo); return hndl; }