Cvars: Add get|set_pcvar_bounds natives
This commit is contained in:
parent
a05d0df50e
commit
8ebb7be36d
|
@ -207,7 +207,7 @@ cvar_t* CvarManager::CreateCvar(const char* name, const char* value, const char*
|
||||||
return info->var;
|
return info->var;
|
||||||
}
|
}
|
||||||
|
|
||||||
cvar_t* CvarManager::FindCvar(const char* name)
|
CvarInfo* CvarManager::FindCvar(const char* name)
|
||||||
{
|
{
|
||||||
cvar_t* var = nullptr;
|
cvar_t* var = nullptr;
|
||||||
CvarInfo* info = nullptr;
|
CvarInfo* info = nullptr;
|
||||||
|
@ -215,7 +215,7 @@ cvar_t* CvarManager::FindCvar(const char* name)
|
||||||
// Do we have already cvar in cache?
|
// Do we have already cvar in cache?
|
||||||
if (CacheLookup(name, &info))
|
if (CacheLookup(name, &info))
|
||||||
{
|
{
|
||||||
return info->var;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cvar doesn't exist.
|
// Cvar doesn't exist.
|
||||||
|
@ -232,7 +232,7 @@ cvar_t* CvarManager::FindCvar(const char* name)
|
||||||
m_Cvars.append(info);
|
m_Cvars.append(info);
|
||||||
m_Cache.insert(name, info);
|
m_Cache.insert(name, info);
|
||||||
|
|
||||||
return var;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
CvarInfo* CvarManager::FindCvar(size_t index)
|
CvarInfo* CvarManager::FindCvar(size_t index)
|
||||||
|
|
|
@ -17,6 +17,12 @@
|
||||||
|
|
||||||
class CDetour;
|
class CDetour;
|
||||||
|
|
||||||
|
enum CvarBounds
|
||||||
|
{
|
||||||
|
CvarBound_Upper = 0,
|
||||||
|
CvarBound_Lower
|
||||||
|
};
|
||||||
|
|
||||||
struct Forward
|
struct Forward
|
||||||
{
|
{
|
||||||
enum fwdstate
|
enum fwdstate
|
||||||
|
@ -102,7 +108,8 @@ class CvarManager
|
||||||
int flags = 0, const char* helpText = "",
|
int flags = 0, const char* helpText = "",
|
||||||
bool hasMin = false, float min = 0,
|
bool hasMin = false, float min = 0,
|
||||||
bool hasMax = false, float max = 0);
|
bool hasMax = false, float max = 0);
|
||||||
cvar_t* FindCvar(const char* name);
|
|
||||||
|
CvarInfo* FindCvar(const char* name);
|
||||||
CvarInfo* FindCvar(size_t index);
|
CvarInfo* FindCvar(size_t index);
|
||||||
bool CacheLookup(const char* name, CvarInfo** info);
|
bool CacheLookup(const char* name, CvarInfo** info);
|
||||||
|
|
||||||
|
|
|
@ -73,11 +73,11 @@ static cell AMX_NATIVE_CALL cvar_exists(AMX *amx, cell *params)
|
||||||
static cell AMX_NATIVE_CALL get_cvar_pointer(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL get_cvar_pointer(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
char *name = get_amxstring(amx, params[1], 0, len);
|
const char *name = get_amxstring(amx, params[1], 0, len);
|
||||||
|
|
||||||
cvar_t *ptr = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
return reinterpret_cast<cell>(ptr);
|
return reinterpret_cast<cell>(info ? info->var : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hook_cvar_change(cvarHandle, const callback[])
|
// hook_cvar_change(cvarHandle, const callback[])
|
||||||
|
@ -141,9 +141,9 @@ static cell AMX_NATIVE_CALL get_cvar_flags(AMX *amx, cell *params)
|
||||||
int ilen;
|
int ilen;
|
||||||
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
|
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
|
||||||
|
|
||||||
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
|
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
|
||||||
|
|
||||||
return pCvar ? pCvar->flags : 0;
|
return info ? info->var->flags : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_cvar_float(const cvarname[])
|
// get_cvar_float(const cvarname[])
|
||||||
|
@ -152,9 +152,9 @@ static cell AMX_NATIVE_CALL get_cvar_float(AMX *amx, cell *params)
|
||||||
int length;
|
int length;
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
return var ? amx_ftoc(var->value) : 0;
|
return info ? amx_ftoc(info->var->value) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_cvar_num(const cvarname[])
|
// get_cvar_num(const cvarname[])
|
||||||
|
@ -163,9 +163,9 @@ static cell AMX_NATIVE_CALL get_cvar_num(AMX *amx, cell *params)
|
||||||
int length;
|
int length;
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
return var ? (int)var->value : 0;
|
return info ? (int)info->var->value : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get_cvar_string(const cvarname[], output[], iLen)
|
// get_cvar_string(const cvarname[], output[], iLen)
|
||||||
|
@ -174,10 +174,10 @@ static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params)
|
||||||
int length;
|
int length;
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
const char *value = var ? var->string : "";
|
const char *value = info ? info->var->string : "";
|
||||||
length = var ? strlen(value) : 0;
|
length = info ? strlen(value) : 0;
|
||||||
|
|
||||||
return set_amxstring_utf8(amx, params[2], value, length, params[3] + 1); // + EOS
|
return set_amxstring_utf8(amx, params[2], value, length, params[3] + 1); // + EOS
|
||||||
}
|
}
|
||||||
|
@ -186,16 +186,16 @@ static cell AMX_NATIVE_CALL get_cvar_string(AMX *amx, cell *params)
|
||||||
static cell AMX_NATIVE_CALL set_cvar_flags(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_cvar_flags(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
int ilen;
|
int ilen;
|
||||||
char* sCvar = get_amxstring(amx, params[1], 0, ilen);
|
const char* sCvar = get_amxstring(amx, params[1], 0, ilen);
|
||||||
|
|
||||||
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
|
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
|
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
|
||||||
|
|
||||||
if (pCvar)
|
if (info)
|
||||||
{
|
{
|
||||||
pCvar->flags |= (int)(params[2]);
|
info->var->flags |= (int)(params[2]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,12 +208,12 @@ static cell AMX_NATIVE_CALL set_cvar_float(AMX *amx, cell *params)
|
||||||
int length;
|
int length;
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
if (var)
|
if (info)
|
||||||
{
|
{
|
||||||
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%f", amx_ctof(params[2]));
|
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%f", amx_ctof(params[2]));
|
||||||
CVAR_DIRECTSET(var, &CVarTempBuffer[0]);
|
CVAR_DIRECTSET(info->var, &CVarTempBuffer[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -226,12 +226,12 @@ static cell AMX_NATIVE_CALL set_cvar_num(AMX *amx, cell *params)
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
int value = params[2];
|
int value = params[2];
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
if (var)
|
if (info)
|
||||||
{
|
{
|
||||||
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%d", value);
|
UTIL_Format(CVarTempBuffer, sizeof(CVarTempBuffer) - 1, "%d", value);
|
||||||
CVAR_DIRECTSET(var, &CVarTempBuffer[0]);
|
CVAR_DIRECTSET(info->var, &CVarTempBuffer[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -243,11 +243,11 @@ static cell AMX_NATIVE_CALL set_cvar_string(AMX *amx, cell *params)
|
||||||
int length;
|
int length;
|
||||||
const char* name = get_amxstring(amx, params[1], 0, length);
|
const char* name = get_amxstring(amx, params[1], 0, length);
|
||||||
|
|
||||||
cvar_t* var = g_CvarManager.FindCvar(name);
|
CvarInfo* info = g_CvarManager.FindCvar(name);
|
||||||
|
|
||||||
if (var)
|
if (info)
|
||||||
{
|
{
|
||||||
CVAR_DIRECTSET(var, get_amxstring(amx, params[2], 1, length));
|
CVAR_DIRECTSET(info->var, get_amxstring(amx, params[2], 1, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -305,6 +305,41 @@ static cell AMX_NATIVE_CALL get_pcvar_string(AMX *amx, cell *params)
|
||||||
return set_amxstring_utf8(amx, params[2], ptr->string ? ptr->string : "", ptr->string ? strlen(ptr->string) : 0, params[3] + 1); // EOS
|
return set_amxstring_utf8(amx, params[2], ptr->string ? ptr->string : "", ptr->string ? strlen(ptr->string) : 0, params[3] + 1); // EOS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get_pcvar_bounds(pcvar, CvarBounds:type, &Float:value)
|
||||||
|
static cell AMX_NATIVE_CALL get_pcvar_bounds(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
|
||||||
|
CvarInfo* info = nullptr;
|
||||||
|
|
||||||
|
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasBound = false;
|
||||||
|
float bound;
|
||||||
|
|
||||||
|
switch (params[2])
|
||||||
|
{
|
||||||
|
case CvarBound_Lower:
|
||||||
|
hasBound = info->hasMin;
|
||||||
|
bound = info->minVal;
|
||||||
|
break;
|
||||||
|
case CvarBound_Upper:
|
||||||
|
hasBound = info->hasMax;
|
||||||
|
bound = info->maxVal;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid CvarBounds value: %d", params[2]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*get_amxaddr(amx, params[3]) = amx_ftoc(bound);
|
||||||
|
|
||||||
|
return hasBound;
|
||||||
|
}
|
||||||
|
|
||||||
// set_pcvar_flags(pcvar, flags)
|
// set_pcvar_flags(pcvar, flags)
|
||||||
static cell AMX_NATIVE_CALL set_pcvar_flags(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL set_pcvar_flags(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
|
@ -369,6 +404,38 @@ static cell AMX_NATIVE_CALL set_pcvar_string(AMX *amx, cell *params)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set_pcvar_bounds(pcvar, CvarBounds:type, bool:set, Float:value = 0.0)
|
||||||
|
static cell AMX_NATIVE_CALL set_pcvar_bounds(AMX *amx, cell *params)
|
||||||
|
{
|
||||||
|
cvar_t *ptr = reinterpret_cast<cvar_t *>(params[1]);
|
||||||
|
CvarInfo* info = nullptr;
|
||||||
|
|
||||||
|
if (!ptr || !(info = g_CvarManager.FindCvar(ptr->name)))
|
||||||
|
{
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid CVAR pointer");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool set = params[3] > 0 ? true : false;
|
||||||
|
|
||||||
|
switch (params[2])
|
||||||
|
{
|
||||||
|
case CvarBound_Lower:
|
||||||
|
info->hasMin = set;
|
||||||
|
info->minVal = set ? amx_ctof(params[4]) : 0;
|
||||||
|
break;
|
||||||
|
case CvarBound_Upper:
|
||||||
|
info->hasMax = set;
|
||||||
|
info->maxVal = set ? amx_ctof(params[4]) : 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LogError(amx, AMX_ERR_NATIVE, "Invalid CvarBounds value: %d", params[2]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// remove_cvar_flags(const cvar[], flags=-1)
|
// remove_cvar_flags(const cvar[], flags=-1)
|
||||||
static cell AMX_NATIVE_CALL remove_cvar_flags(AMX *amx, cell *params)
|
static cell AMX_NATIVE_CALL remove_cvar_flags(AMX *amx, cell *params)
|
||||||
{
|
{
|
||||||
|
@ -378,11 +445,11 @@ 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"))
|
if (!strcmp(sCvar, "amx_version") || !strcmp(sCvar, "amxmodx_version") || !strcmp(sCvar, "fun_version") || !strcmp(sCvar, "sv_cheats"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cvar_t* pCvar = g_CvarManager.FindCvar(sCvar);
|
CvarInfo* info = g_CvarManager.FindCvar(sCvar);
|
||||||
|
|
||||||
if (pCvar)
|
if (info)
|
||||||
{
|
{
|
||||||
pCvar->flags &= ~((int)(params[2]));
|
info->var->flags &= ~((int)(params[2]));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,11 +603,13 @@ AMX_NATIVE_INFO g_CvarNatives[] =
|
||||||
{"get_pcvar_float", get_pcvar_float},
|
{"get_pcvar_float", get_pcvar_float},
|
||||||
{"get_pcvar_num", get_pcvar_num},
|
{"get_pcvar_num", get_pcvar_num},
|
||||||
{"get_pcvar_string", get_pcvar_string},
|
{"get_pcvar_string", get_pcvar_string},
|
||||||
|
{"get_pcvar_bounds", get_pcvar_bounds},
|
||||||
|
|
||||||
{"set_pcvar_flags", set_pcvar_flags},
|
{"set_pcvar_flags", set_pcvar_flags},
|
||||||
{"set_pcvar_float", set_pcvar_float},
|
{"set_pcvar_float", set_pcvar_float},
|
||||||
{"set_pcvar_string", set_pcvar_string},
|
|
||||||
{"set_pcvar_num", set_pcvar_num},
|
{"set_pcvar_num", set_pcvar_num},
|
||||||
|
{"set_pcvar_string", set_pcvar_string},
|
||||||
|
{"set_pcvar_bounds", set_pcvar_bounds},
|
||||||
|
|
||||||
{"remove_cvar_flags", remove_cvar_flags},
|
{"remove_cvar_flags", remove_cvar_flags},
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define _cvars_included
|
#define _cvars_included
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CVAR flags for register_cvar()
|
* CVAR flags for create_cvar()
|
||||||
*/
|
*/
|
||||||
#define FCVAR_NONE 0 /* No flags */
|
#define FCVAR_NONE 0 /* No flags */
|
||||||
#define FCVAR_ARCHIVE 1 /* Set to cause it to be saved to vars.rc */
|
#define FCVAR_ARCHIVE 1 /* Set to cause it to be saved to vars.rc */
|
||||||
|
@ -361,6 +361,39 @@ native get_pcvar_string(pcvar, string[], maxlen);
|
||||||
*/
|
*/
|
||||||
native set_pcvar_string(pcvar, const string[]);
|
native set_pcvar_string(pcvar, const string[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cvar bound values used with get/set_pcvar_bounds()
|
||||||
|
*/
|
||||||
|
enum CvarBounds
|
||||||
|
{
|
||||||
|
CvarBound_Upper = 0,
|
||||||
|
CvarBound_Lower
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the specified bound of a cvar.
|
||||||
|
*
|
||||||
|
* @param pcvar Pointer to cvar
|
||||||
|
* @param type Type of bound to retrieve, CvarBound_Lower or CvarBound_Upper
|
||||||
|
* @param value By-reference cell to store the specified floating point bound value
|
||||||
|
*
|
||||||
|
* @return True if the cvar has the specified bound set, false otherwise.
|
||||||
|
* @error If an invalid cvar pointer or CvarBounds value, an error is thrown.
|
||||||
|
*/
|
||||||
|
native bool:get_pcvar_bounds(pcvar, CvarBounds:type, &Float:value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the specified bound of a cvar.
|
||||||
|
*
|
||||||
|
* @param pcvar Pointer to cvar
|
||||||
|
* @param type Type of bound to set, CvarBound_Lower or CvarBound_Upper
|
||||||
|
* @param set If set to true, cvar will use specified bound. If false, bound will be removed
|
||||||
|
* @param value Floating point value to use as the specified bound
|
||||||
|
*
|
||||||
|
* @error If an invalid cvar pointer or CvarBounds value, an error is thrown.
|
||||||
|
*/
|
||||||
|
native set_pcvar_bounds(pcvar, CvarBounds:type, bool:set, Float:value = 0.0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of plugin-registered cvars.
|
* Returns the number of plugin-registered cvars.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue
Block a user