Cvars: Rearrange a bit some code

Changed class CCVar -> struct CvarInfo
Added CvarManager class and moved some code there
Code of registering a cvar is rewritten
Cvars datas are stored in a hashtable for fast lookup
For natives compatibility, an inline list is kept (though CList -> ke::InlineList)
Replace some CVAR_GET/SEt_ by FindVar
This commit is contained in:
Arkshine
2015-01-19 19:17:41 +01:00
parent f973f5beb7
commit cdc7d550eb
8 changed files with 511 additions and 154 deletions

View File

@ -1923,11 +1923,15 @@ static cell AMX_NATIVE_CALL get_pcvar_string(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params) /* 3 param */
{
int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
const char *value = CVAR_GET_STRING(sptemp);
return set_amxstring_utf8(amx, params[2], value, strlen(value), params[3] + 1); // + EOS
cvar_t* var = g_CvarManager.FindCvar(name);
const char *value = var ? var->string : "";
length = var ? strlen(value) : 0;
return set_amxstring_utf8(amx, params[2], value, length, params[3] + 1); // + EOS
}
static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
@ -1939,18 +1943,17 @@ static cell AMX_NATIVE_CALL get_pcvar_float(AMX *amx, cell *params)
return 0;
}
REAL val = (REAL)ptr->value;
return amx_ftoc(val);
return amx_ftoc(ptr->value);
}
static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params) /* 1 param */
{
int ilen;
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
REAL pFloat = CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
return amx_ftoc(pFloat);
cvar_t* var = g_CvarManager.FindCvar(name);
return var ? amx_ftoc(var->value) : 0;
}
static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
@ -1962,16 +1965,25 @@ static cell AMX_NATIVE_CALL set_pcvar_float(AMX *amx, cell *params)
return 0;
}
UTIL_Format(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%f",amx_ctof(params[2]));
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%f", amx_ctof(params[2]));
CVAR_DIRECTSET(ptr, &CVarTempBuffer[0]);
return 1;
}
static cell AMX_NATIVE_CALL set_cvar_float(AMX *amx, cell *params) /* 2 param */
{
int ilen;
CVAR_SET_FLOAT(get_amxstring(amx, params[1], 0, ilen), amx_ctof(params[2]));
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
cvar_t* var = g_CvarManager.FindCvar(name);
if (var)
{
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%f", amx_ctof(params[2]));
CVAR_DIRECTSET(var, &CVarTempBuffer[0]);
}
return 1;
}
@ -1989,8 +2001,13 @@ static cell AMX_NATIVE_CALL get_pcvar_num(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params) /* 1 param */
{
int ilen;
return (int)CVAR_GET_FLOAT(get_amxstring(amx, params[1], 0, ilen));
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
cvar_t* var = g_CvarManager.FindCvar(name);
return var ? (int)var->value : 0;
}
static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
@ -2003,27 +2020,40 @@ static cell AMX_NATIVE_CALL set_pcvar_num(AMX *amx, cell *params)
}
UTIL_Format(CVarTempBuffer,sizeof(CVarTempBuffer)-1,"%d",params[2]);
(*g_engfuncs.pfnCvar_DirectSet)(ptr, &CVarTempBuffer[0]);
CVAR_DIRECTSET(ptr, &CVarTempBuffer[0]);
return 1;
}
static cell AMX_NATIVE_CALL set_cvar_num(AMX *amx, cell *params) /* 2 param */
{
int ilen;
CVAR_SET_FLOAT(get_amxstring(amx, params[1], 0, ilen), (float)params[2]);
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
int value = params[2];
cvar_t* var = g_CvarManager.FindCvar(name);
if (var)
{
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%d", value);
CVAR_DIRECTSET(var, &CVarTempBuffer[0]);
}
return 1;
}
static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params) /* 2 param */
{
int ilen;
char* sptemp = get_amxstring(amx, params[1], 0, ilen);
char* szValue = get_amxstring(amx, params[2], 1, ilen);
CVAR_SET_STRING(sptemp, szValue);
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
cvar_t* var = g_CvarManager.FindCvar(name);
if (var)
{
CVAR_DIRECTSET(var, get_amxstring(amx, params[2], 1, length));
}
return 1;
}
@ -2038,7 +2068,7 @@ static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params) /* 2 param
int len;
(*g_engfuncs.pfnCvar_DirectSet)(ptr, get_amxstring(amx,params[2],0,len));
CVAR_DIRECTSET(ptr, get_amxstring(amx,params[2],0,len));
return 1;
}
@ -2598,40 +2628,28 @@ static cell AMX_NATIVE_CALL task_exists(AMX *amx, cell *params) /* 1 param */
static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params) /* 1 param */
{
int ilen;
return (CVAR_GET_POINTER(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0);
return (g_CvarManager.FindCvar(get_amxstring(amx, params[1], 0, ilen)) ? 1 : 0);
}
static cell AMX_NATIVE_CALL register_cvar(AMX *amx, cell *params) /* 3 param */
{
int i;
char* temp = get_amxstring(amx, params[1], 0, i);
int length;
const char* name = get_amxstring(amx, params[1], 0, length);
const char* value = get_amxstring(amx, params[2], 1, length);
int flags = params[3];
float fvalue = amx_ctof(params[4]);
CPluginMngr::CPlugin *plugin = g_plugins.findPluginFast(amx);
if (CheckBadConList(temp, 0))
if (CheckBadConList(name, 0))
{
plugin->AddToFailCounter(1);
}
if (!g_cvars.find(temp))
{
CCVar* cvar = new CCVar(temp, plugin->getName(), params[3], amx_ctof(params[4]));
cvar_t* var = g_CvarManager.CreateCvar(name, value, fvalue, flags, plugin->getName(), plugin->getId());
cvar->plugin_id = plugin->getId();
g_cvars.put(cvar);
if (CVAR_GET_POINTER(temp) == 0)
{
static cvar_t cvar_reg_helper;
cvar_reg_helper = *(cvar->getCvar());
CVAR_REGISTER(&cvar_reg_helper);
}
CVAR_SET_STRING(temp, get_amxstring(amx, params[2], 1, i));
return reinterpret_cast<cell>(CVAR_GET_POINTER(temp));
}
return reinterpret_cast<cell>(CVAR_GET_POINTER(temp));
return reinterpret_cast<cell>(var);
}
static cell AMX_NATIVE_CALL get_user_ping(AMX *amx, cell *params) /* 3 param */
@ -3022,29 +3040,16 @@ static cell AMX_NATIVE_CALL remove_quotes(AMX *amx, cell *params) /* 1 param */
//native get_plugins_cvar(id, name[], namelen, &flags=0, &plugin_id=0, &pcvar_handle=0);
static cell AMX_NATIVE_CALL get_plugins_cvar(AMX *amx, cell *params)
{
int id = params[1];
int iter_id = 0;
CvarInfo* info = g_CvarManager.FindCvar(params[1]);
for (CList<CCVar>::iterator iter=g_cvars.begin(); iter; ++iter)
if (info)
{
if (id == iter_id)
{
CCVar *var = &(*iter);
set_amxstring(amx, params[2], var->getName(), params[3]);
cvar_t *ptr = CVAR_GET_POINTER(var->getName());
if (!ptr)
{
return 0;
}
cell *addr = get_amxaddr(amx, params[4]);
*addr = ptr->flags;
addr = get_amxaddr(amx, params[5]);
*addr = var->plugin_id;
addr = get_amxaddr(amx, params[6]);
*addr = (cell)ptr;
return 1;
}
iter_id++;
set_amxstring(amx, params[2], info->name.chars(), params[3]);
*get_amxaddr(amx, params[4]) = info->var->flags;
*get_amxaddr(amx, params[5]) = info->pluginId;
*get_amxaddr(amx, params[6]) = reinterpret_cast<cell>(info->var);
return 1;
}
return 0;
@ -3053,7 +3058,7 @@ static cell AMX_NATIVE_CALL get_plugins_cvar(AMX *amx, cell *params)
//native get_plugins_cvarsnum();
static cell AMX_NATIVE_CALL get_plugins_cvarsnum(AMX *amx, cell *params)
{
return g_cvars.size();
return g_CvarManager.GetRegCvarsCount();
}
static cell AMX_NATIVE_CALL get_user_aiming(AMX *amx, cell *params) /* 4 param */
@ -3107,7 +3112,7 @@ static cell AMX_NATIVE_CALL remove_cvar_flags(AMX *amx, cell *params)
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
return 0;
cvar_t* pCvar = CVAR_GET_POINTER(sCvar);
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
if (pCvar)
{
@ -3135,7 +3140,7 @@ static cell AMX_NATIVE_CALL get_cvar_flags(AMX *amx, cell *params)
int ilen;
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
cvar_t* pCvar = CVAR_GET_POINTER(sCvar);
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
return pCvar ? pCvar->flags : 0;
}
@ -3162,7 +3167,7 @@ static cell AMX_NATIVE_CALL set_cvar_flags(AMX *amx, cell *params)
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
return 0;
cvar_t* pCvar = CVAR_GET_POINTER(sCvar);
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
if (pCvar)
{
@ -4448,9 +4453,9 @@ static cell AMX_NATIVE_CALL DestroyForward(AMX *amx, cell *params)
static cell AMX_NATIVE_CALL get_cvar_pointer(AMX *amx, cell *params)
{
int len;
char *temp = get_amxstring(amx, params[1], 0, len);
char *name = get_amxstring(amx, params[1], 0, len);
cvar_t *ptr = CVAR_GET_POINTER(temp);
cvar_t *ptr = g_CvarManager.FindCvar(name);
return reinterpret_cast<cell>(ptr);
}