- changed FraggleScript setup so that the MapLoader does not use the global level variable anymore.
This involves passing the level explicitly to many functions. What was done here may seem a bit excessive but at least it covers everything. Most importantly, the global ActiveThinker pointer has been moved into FLevelLocals and is now getting tracked properly by the level without using dangerous assumptions about how the game organizes its data.
This commit is contained in:
parent
95995e4aa3
commit
7b16433e97
16 changed files with 108 additions and 86 deletions
|
|
@ -176,8 +176,8 @@ void DFsScript::OnDestroy()
|
|||
void DFsScript::Serialize(FSerializer &arc)
|
||||
{
|
||||
Super::Serialize(arc);
|
||||
// don't save a reference to the global script
|
||||
if (parent == DFraggleThinker::ActiveThinker->GlobalScript) parent = nullptr;
|
||||
// don't save a reference to the global script, which contains unserializable data.
|
||||
if (parent == level.FraggleScriptThinker->GlobalScript) parent = nullptr;
|
||||
|
||||
arc("data", data)
|
||||
("scriptnum", scriptnum)
|
||||
|
|
@ -189,7 +189,7 @@ void DFsScript::Serialize(FSerializer &arc)
|
|||
.Array("variables", variables, VARIABLESLOTS)
|
||||
.Array("children", children, MAXSCRIPTS);
|
||||
|
||||
if (parent == nullptr) parent = DFraggleThinker::ActiveThinker->GlobalScript;
|
||||
if (parent == nullptr) parent = level.FraggleScriptThinker->GlobalScript;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
@ -215,7 +215,7 @@ void DFsScript::ParseScript(char *position)
|
|||
return;
|
||||
}
|
||||
|
||||
DFraggleThinker::ActiveThinker->trigger_obj = trigger; // set trigger
|
||||
level.FraggleScriptThinker->trigger_obj = trigger; // set trigger
|
||||
|
||||
try
|
||||
{
|
||||
|
|
@ -359,8 +359,6 @@ IMPLEMENT_POINTERS_START(DFraggleThinker)
|
|||
IMPLEMENT_POINTER(GlobalScript)
|
||||
IMPLEMENT_POINTERS_END
|
||||
|
||||
TObjPtr<DFraggleThinker*> DFraggleThinker::ActiveThinker;
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
|
@ -370,22 +368,18 @@ TObjPtr<DFraggleThinker*> DFraggleThinker::ActiveThinker;
|
|||
DFraggleThinker::DFraggleThinker()
|
||||
: DThinker(STAT_SCRIPTS)
|
||||
{
|
||||
if (ActiveThinker)
|
||||
GlobalScript = Create<DFsScript>();
|
||||
GC::WriteBarrier(this, GlobalScript);
|
||||
// do not create resources which will be filled in by the serializer if being called from there.
|
||||
if (!bSerialOverride)
|
||||
{
|
||||
I_Error ("Only one FraggleThinker is allowed to exist at a time.\nCheck your code.");
|
||||
}
|
||||
else
|
||||
{
|
||||
ActiveThinker = this;
|
||||
RunningScripts = Create<DRunningScript>();
|
||||
GC::WriteBarrier(this, RunningScripts);
|
||||
GlobalScript = Create<DFsScript>();
|
||||
GC::WriteBarrier(this, GlobalScript);
|
||||
LevelScript = Create<DFsScript>();
|
||||
LevelScript->parent = GlobalScript;
|
||||
GC::WriteBarrier(this, LevelScript);
|
||||
InitFunctions();
|
||||
}
|
||||
InitFunctions();
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
@ -413,7 +407,6 @@ void DFraggleThinker::OnDestroy()
|
|||
LevelScript = NULL;
|
||||
|
||||
SpawnedThings.Clear();
|
||||
ActiveThinker = NULL;
|
||||
Super::OnDestroy();
|
||||
}
|
||||
|
||||
|
|
@ -609,9 +602,9 @@ void DFraggleThinker::AddRunningScript(DRunningScript *runscr)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void T_PreprocessScripts()
|
||||
void T_PreprocessScripts(FLevelLocals *Level)
|
||||
{
|
||||
DFraggleThinker *th = DFraggleThinker::ActiveThinker;
|
||||
DFraggleThinker *th = Level->FraggleScriptThinker;
|
||||
if (th)
|
||||
{
|
||||
// run the levelscript first
|
||||
|
|
@ -631,9 +624,9 @@ void T_PreprocessScripts()
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
bool T_RunScript(int snum, AActor * t_trigger)
|
||||
bool T_RunScript(FLevelLocals *Level, int snum, AActor * t_trigger)
|
||||
{
|
||||
DFraggleThinker *th = DFraggleThinker::ActiveThinker;
|
||||
DFraggleThinker *th = Level->FraggleScriptThinker;
|
||||
if (th)
|
||||
{
|
||||
// [CO] It is far too dangerous to start the script right away.
|
||||
|
|
@ -655,7 +648,7 @@ bool T_RunScript(int snum, AActor * t_trigger)
|
|||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
// This isn't network safe. FraggleScript as a whole most likely isn't...
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
|
|
@ -669,6 +662,6 @@ CCMD(fpuke)
|
|||
}
|
||||
else
|
||||
{
|
||||
T_RunScript(atoi(argv[1]), players[consoleplayer].mo);
|
||||
T_RunScript(&level, atoi(argv[1]), players[consoleplayer].mo);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue