Let custom CVar handlers to be called on cloned cvars
This commit is contained in:
parent
82b7e93d26
commit
b50d7f4db5
4 changed files with 184 additions and 31 deletions
|
|
@ -302,6 +302,7 @@ bool FBaseCVar::ToBool (UCVarValue value, ECVarType type)
|
|||
case CVAR_Bool:
|
||||
return value.Bool;
|
||||
|
||||
case CVAR_Color:
|
||||
case CVAR_Int:
|
||||
return !!value.Int;
|
||||
|
||||
|
|
@ -331,6 +332,7 @@ int FBaseCVar::ToInt (UCVarValue value, ECVarType type)
|
|||
switch (type)
|
||||
{
|
||||
case CVAR_Bool: res = (int)value.Bool; break;
|
||||
case CVAR_Color:
|
||||
case CVAR_Int: res = value.Int; break;
|
||||
#if __GNUC__ <= 2
|
||||
case CVAR_Float: tmp = value.Float; res = (int)tmp; break;
|
||||
|
|
@ -359,6 +361,7 @@ float FBaseCVar::ToFloat (UCVarValue value, ECVarType type)
|
|||
case CVAR_Bool:
|
||||
return (float)value.Bool;
|
||||
|
||||
case CVAR_Color:
|
||||
case CVAR_Int:
|
||||
return (float)value.Int;
|
||||
|
||||
|
|
@ -388,6 +391,7 @@ const char *FBaseCVar::ToString (UCVarValue value, ECVarType type)
|
|||
case CVAR_String:
|
||||
return value.String;
|
||||
|
||||
case CVAR_Color:
|
||||
case CVAR_Int:
|
||||
mysnprintf (cstrbuf, countof(cstrbuf), "%i", value.Int);
|
||||
break;
|
||||
|
|
@ -1830,6 +1834,21 @@ void FZSIntCVar::MarkZSCVar()
|
|||
GC::Mark(customCVarHandler);
|
||||
}
|
||||
|
||||
UCVarValue FZSIntCVar::GenericZSCVarCallback(UCVarValue value, ECVarType type) {
|
||||
int val = ToInt(value, type);
|
||||
|
||||
IFVIRTUALPTRNAME(customCVarHandler, "CustomIntCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { customCVarHandler.Get() , cvarName.GetIndex() , val };
|
||||
VMReturn ret(&val);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
}
|
||||
|
||||
UCVarValue v;
|
||||
v.Int = val;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
|
|
@ -1849,11 +1868,11 @@ void FZSFloatCVar::CallCVarCallback(FZSFloatCVar &self)
|
|||
}
|
||||
IFVIRTUALPTRNAME(self.customCVarHandler, "CustomFloatCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { self.customCVarHandler.Get() , self.cvarName.GetIndex() , (double)self.Value };
|
||||
VMValue param[] = { self.customCVarHandler.Get() , self.cvarName.GetIndex() , (double) self.Value };
|
||||
double v;
|
||||
VMReturn ret(&v);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
self.Value = float(v);
|
||||
self.Value = (float) v;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1875,6 +1894,23 @@ void FZSFloatCVar::MarkZSCVar()
|
|||
GC::Mark(customCVarHandler);
|
||||
}
|
||||
|
||||
UCVarValue FZSFloatCVar::GenericZSCVarCallback(UCVarValue value, ECVarType type) {
|
||||
float val = ToFloat(value, type);
|
||||
|
||||
IFVIRTUALPTRNAME(customCVarHandler, "CustomFloatCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { customCVarHandler.Get() , cvarName.GetIndex() , (double) val };
|
||||
double v;
|
||||
VMReturn ret(&v);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
val = (float) v;
|
||||
}
|
||||
|
||||
UCVarValue v;
|
||||
v.Float = val;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
|
|
@ -1918,6 +1954,25 @@ void FZSStringCVar::MarkZSCVar()
|
|||
GC::Mark(customCVarHandler);
|
||||
}
|
||||
|
||||
UCVarValue FZSStringCVar::GenericZSCVarCallback(UCVarValue value, ECVarType type) {
|
||||
FString val = ToString(value, type);
|
||||
|
||||
IFVIRTUALPTRNAME(customCVarHandler, "CustomStringCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { customCVarHandler.Get() , cvarName.GetIndex() , &val };
|
||||
VMReturn ret(&val);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
}
|
||||
|
||||
char * str = new char[val.Len() + 1];
|
||||
memcpy(str, val.GetChars(), val.Len() * sizeof(char));
|
||||
str[val.Len()] = '\0';
|
||||
|
||||
UCVarValue v;
|
||||
v.String = str;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
|
|
@ -1963,10 +2018,27 @@ void FZSBoolCVar::MarkZSCVar()
|
|||
GC::Mark(customCVarHandler);
|
||||
}
|
||||
|
||||
UCVarValue FZSBoolCVar::GenericZSCVarCallback(UCVarValue value, ECVarType type) {
|
||||
bool val = ToFloat(value, type);
|
||||
|
||||
IFVIRTUALPTRNAME(customCVarHandler, "CustomBoolCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { customCVarHandler.Get() , cvarName.GetIndex() , val };
|
||||
int v;
|
||||
VMReturn ret(&v);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
val = v;
|
||||
}
|
||||
|
||||
UCVarValue v;
|
||||
v.Bool = val;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
// FZSIntCVar
|
||||
// FZSColorCVar
|
||||
//
|
||||
//===========================================================================
|
||||
|
||||
|
|
@ -2004,4 +2076,19 @@ void FZSColorCVar::InstantiateZSCVar()
|
|||
void FZSColorCVar::MarkZSCVar()
|
||||
{
|
||||
GC::Mark(customCVarHandler);
|
||||
}
|
||||
|
||||
UCVarValue FZSColorCVar::GenericZSCVarCallback(UCVarValue value, ECVarType type) {
|
||||
int val = ToInt(value, type);
|
||||
|
||||
IFVIRTUALPTRNAME(customCVarHandler, "CustomColorCVar", ModifyValue)
|
||||
{
|
||||
VMValue param[] = { customCVarHandler.Get() , cvarName.GetIndex() , val };
|
||||
VMReturn ret(&val);
|
||||
VMCall(func, param, 3, &ret, 1);
|
||||
}
|
||||
|
||||
UCVarValue v;
|
||||
v.Int = val;
|
||||
return v;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue