serialize cvars
This commit is contained in:
parent
74ace89d6e
commit
aed85a25a2
9 changed files with 115 additions and 5 deletions
|
|
@ -646,6 +646,15 @@ static int propcmp(const void * a, const void * b)
|
|||
//==========================================================================
|
||||
void InitImports();
|
||||
|
||||
struct UserInfoCVarNamePlayer
|
||||
{
|
||||
FBaseCVar** addr;
|
||||
FString name;
|
||||
int pnum;
|
||||
};
|
||||
|
||||
TArray<UserInfoCVarNamePlayer> LoadGameUserInfoCVars;
|
||||
|
||||
void InitThingdef()
|
||||
{
|
||||
// Some native types need size and serialization information added before the scripts get compiled.
|
||||
|
|
@ -803,6 +812,79 @@ void InitThingdef()
|
|||
auto fspp = NewStruct("FSpawnParticleParams", nullptr);
|
||||
fspp->Size = sizeof(FSpawnParticleParams);
|
||||
fspp->Align = alignof(FSpawnParticleParams);
|
||||
|
||||
auto cvst = NewStruct("CVar", nullptr, true);
|
||||
NewPointer(cvst, false)->InstallHandlers(
|
||||
[](FSerializer &arc, const char *key, const void *addr)
|
||||
{
|
||||
const FBaseCVar * self = *(const FBaseCVar**)addr;
|
||||
|
||||
if(self)
|
||||
{
|
||||
arc.BeginObject(key);
|
||||
|
||||
|
||||
if(self->pnum != -1)
|
||||
{
|
||||
int32_t pnum = self->pnum;
|
||||
FName name = self->userinfoName;
|
||||
arc("name", name);
|
||||
arc("player", pnum);
|
||||
}
|
||||
else
|
||||
{
|
||||
FString name = self->GetName();
|
||||
arc("name", name);
|
||||
}
|
||||
|
||||
arc.EndObject();
|
||||
}
|
||||
},
|
||||
[](FSerializer &arc, const char *key, void *addr)
|
||||
{
|
||||
FBaseCVar ** self = (FBaseCVar**)addr;
|
||||
|
||||
FString name;
|
||||
arc.BeginObject(key);
|
||||
|
||||
arc("name", name);
|
||||
|
||||
FBaseCVar * backing = FindCVar(name.GetChars(), nullptr);
|
||||
if(!backing)
|
||||
{
|
||||
I_Error("Attempt to load pointer to inexisted CVar '%s'", name.GetChars());
|
||||
}
|
||||
else if((backing->GetFlags() & (CVAR_USERINFO|CVAR_IGNORE)) == CVAR_USERINFO)
|
||||
{
|
||||
if(int pnum; arc.ReadOptionalInt("player", pnum))
|
||||
{
|
||||
*self = nullptr;
|
||||
LoadGameUserInfoCVars.Push({self, name, pnum}); // this needs to be done later, since userinfo isn't loaded yet
|
||||
arc.EndObject();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
*self = backing;
|
||||
|
||||
arc.EndObject();
|
||||
|
||||
return true;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
void SetupLoadingCVars()
|
||||
{
|
||||
LoadGameUserInfoCVars.Clear();
|
||||
}
|
||||
|
||||
void FinishLoadingCVars()
|
||||
{
|
||||
for(UserInfoCVarNamePlayer &cvar : LoadGameUserInfoCVars)
|
||||
{
|
||||
(*cvar.addr) = GetCVar(cvar.pnum, cvar.name.GetChars());
|
||||
}
|
||||
}
|
||||
|
||||
void SynthesizeFlagFields()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue