From f204a4c646b4a11e987cc2cb8ebef791326315ad Mon Sep 17 00:00:00 2001 From: JeffR Date: Sun, 27 Mar 2022 14:09:41 -0500 Subject: [PATCH] Fixes issue where nested callOnModules would thrash the queued exec lists from other invokes Also removes unwanted reference ids from the OptionsMenu gui object and disabled the ability for dynamic fields to be saved on it to prevent it from happening again. --- .../game/core/utility/scripts/module.tscript | 46 ++++++++++++------- .../game/data/UI/guis/optionsMenu.gui | 10 +--- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Templates/BaseGame/game/core/utility/scripts/module.tscript b/Templates/BaseGame/game/core/utility/scripts/module.tscript index 2b102eb9e..ae7f0ce13 100644 --- a/Templates/BaseGame/game/core/utility/scripts/module.tscript +++ b/Templates/BaseGame/game/core/utility/scripts/module.tscript @@ -6,7 +6,8 @@ if (!isObject(ExecFilesList)) function callOnModules(%functionName, %moduleGroup, %var0, %var1, %var2, %var3, %var4, %var5, %var6) { //clear per module group file execution chain - ExecFilesList.empty(); + %execArray = new ArrayObject("callOn" @ %functionName @ "_" @ %moduleGroup); + ExecFilesList.push_back(%execArray); //Get our modules so we can exec any specific client-side loading/handling %modulesList = ModuleDatabase.findModules(false); for(%i=0; %i < getWordCount(%modulesList); %i++) @@ -23,12 +24,21 @@ function callOnModules(%functionName, %moduleGroup, %var0, %var1, %var2, %var3, %module.scopeSet.call(%functionName, %var0, %var1, %var2, %var3, %var4, %var5, %var6); } - %execFilecount = ExecFilesList.count(); + %execFilecount = %execArray.count(); + + if($traceModuleCalls) + { + error("ExecFilesList at actual exec point:"); + %execArray.echo(); + } + for (%i=0;%i<%execFilecount;%i++) { - %filename = ExecFilesList.getKey(%i); + %filename = %execArray.getKey(%i); exec(%filename); } + + ExecFilesList.pop_back(); //cleanup } function loadModuleMaterials(%moduleGroup) @@ -213,7 +223,7 @@ function SimSet::queueExec(%scopeSet, %execFilePath, %isExclusive) return; } - if(!isObject(ExecFilesList)) + if(!isObject(ExecFilesList) || ExecFilesList.count() == 0) { error("Module::queueExec() - ExecFilesList array object doesn't exist!"); return; @@ -225,10 +235,11 @@ function SimSet::queueExec(%scopeSet, %execFilePath, %isExclusive) %fullPath = pathConcat(%moduleDef.ModulePath, %execFilePath); ///go through all entries %locked = false; - %execFilecount = ExecFilesList.count(); + %execFileList = ExecFilesList.getKey(ExecFilesList.count()-1); + %execFilecount = %execFileList.count(); for (%i=0;%i<%execFilecount;%i++) { - %check = ExecFilesList.getKey(%i); + %check = %execFileList.getKey(%i); //look for a substring match %isMatch = strIsMatchExpr("*"@ strReplace(%execFilePath,"./","/"),%check ); if (%isMatch) @@ -237,13 +248,13 @@ function SimSet::queueExec(%scopeSet, %execFilePath, %isExclusive) //and kill off any duplicates //do note that doing it in this order means setting exclusive twice //allows one to override exclusive with exclusive - %locked = ExecFilesList.getValue(%i); + %locked = %execFileList.getValue(%i); if ((%locked && !%isExclusive)&&($reportModuleFileConflicts)) error("found" SPC %execFilePath SPC "duplicate file!"); if (%isExclusive) { // Replacing an existing entry, update in-place - ExecFilesList.setKey(%fullPath, %i); - ExecFilesList.setValue(%isExclusive, %i); + %execFileList.setKey(%fullPath, %i); + %execFileList.setValue(%isExclusive, %i); %locked = true; //Done, but don't return and bypass trace logging below } break; @@ -251,9 +262,9 @@ function SimSet::queueExec(%scopeSet, %execFilePath, %isExclusive) } //if we're not locked, go ahead and add it to the pile if (!%locked) - ExecFilesList.add(%fullPath,%isExclusive); + %execFileList.add(%fullPath,%isExclusive); if ($traceModuleCalls) - ExecFilesList.echo(); + %execFileList.echo(); } function SimSet::unQueueExec(%scopeSet, %execFilePath) @@ -269,7 +280,7 @@ function SimSet::unQueueExec(%scopeSet, %execFilePath) return; } - if(!isObject(ExecFilesList)) + if(!isObject(ExecFilesList) || ExecFilesList.count() == 0) { error("Module::unRegisterDatablock() - ExecFilesList array object doesn't exist!"); return; @@ -280,23 +291,24 @@ function SimSet::unQueueExec(%scopeSet, %execFilePath) %fullPath = pathConcat(%moduleDef.ModulePath, %relativePath); ///go through all entries %locked = false; - %execFilecount = ExecFilesList.count(); + %execFileList = ExecFilesList.getKey(ExecFilesList.count()-1); + %execFilecount = %execFileList.count(); for (%i=0;%i<%execFilecount;%i++) { - %check = ExecFilesList.getKey(%i); + %check = %execFileList.getKey(%i); //look for a substring match %isMatch = strIsMatchExpr("*"@ %execFilePath,%check ); if (%isMatch) { //check if we're already locked in. if not, kill it. - %locked = ExecFilesList.getValue(%i); + %locked = %execFileList.getValue(%i); if (!%locked) { - ExecFilesList.erase(%i); + %execFileList.erase(%i); } } } if ($traceModuleCalls) - ExecFilesList.echo(); + %execFileList.echo(); } diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui index 84c70072f..3b1999ed9 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.gui @@ -4,15 +4,7 @@ $guiContent = new GuiControl(OptionsMenu) { profile = "GuiDefaultProfile"; tooltipProfile = "GuiToolTipProfile"; isContainer = "1"; - canSaveDynamicFields = "1"; - currentCategory = "Display"; - optionsCategories = "17177"; - pageTabIndex = "0"; - returnGui = "MainMenuGui"; - tamlReader = "20088"; - tile = "0"; - unappliedChanges = "17178"; - useVariable = "0"; + canSaveDynamicFields = "0"; new GuiControl() { position = "48 56";