diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 58b80d0d58..de56ffc3dd 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3719,6 +3719,7 @@ STR_6644 :Touch enhancements STR_6645 :Makes some UI elements bigger so they are easier to click or tap. STR_6646 :Author: {STRING} STR_6647 :Authors: {STRING} +STR_6648 :Loading plugin engine… ############# # Scenarios # diff --git a/distribution/changelog.txt b/distribution/changelog.txt index dc1c0b0c73..2df5592d7f 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -4,6 +4,7 @@ - Feature: [#20832] The ride music tab now shows a track listing for the current music style. - Feature: [#22172] [Plugin] Expose ride satisfaction ratings to the plugin API. - Feature: [#22213] [Plugin] Allow plugins to focus on textboxes in custom windows. +- Change: [#22230] The plugin/script engine is now initialised off the main thread. - Change: [#22251] Hide author info in the scenery window unless debug tools are active. 0.4.12 (2024-07-07) diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index 922eff7b43..5f9b6598ea 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -131,7 +131,7 @@ public: SDL_QuitSubSystem(SDL_INIT_VIDEO); } - void Initialise() override + void InitialiseScriptExtensions() override { #ifdef ENABLE_SCRIPTING auto& scriptEngine = GetContext()->GetScriptEngine(); diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 90d151db7d..be0f913ba1 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -523,18 +523,14 @@ namespace OpenRCT2 // TODO: preload the title scene in another (parallel) job. preloaderScene->AddJob([this]() { InitialiseRepositories(); }); + preloaderScene->AddJob([this]() { InitialiseScriptEngine(); }); } else { InitialiseRepositories(); + InitialiseScriptEngine(); } -#ifdef ENABLE_SCRIPTING - _scriptEngine.Initialise(); -#endif - - _uiContext->Initialise(); - return true; } @@ -574,6 +570,17 @@ namespace OpenRCT2 OpenProgress(STR_LOADING_GENERIC); } + void InitialiseScriptEngine() + { +#ifdef ENABLE_SCRIPTING + OpenProgress(STR_LOADING_PLUGIN_ENGINE); + _scriptEngine.Initialise(); + _uiContext->InitialiseScriptExtensions(); + + OpenProgress(STR_LOADING_GENERIC); +#endif + } + public: void InitialiseDrawingEngine() final override { @@ -1349,7 +1356,10 @@ namespace OpenRCT2 ChatUpdate(); #ifdef ENABLE_SCRIPTING - _scriptEngine.Tick(); + if (GetActiveScene() != GetPreloaderScene()) + { + _scriptEngine.Tick(); + } #endif _stdInOutConsole.ProcessEvalQueue(); _uiContext->Tick(); diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 178b0d76fe..2a6f266f25 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -1692,6 +1692,8 @@ enum : StringId STR_STRING_M_OF_N = 6642, STR_STRING_M_OF_N_KIB = 6643, + STR_LOADING_PLUGIN_ENGINE = 6648, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings }; diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 0ae1e48a2c..e8d6cee198 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -913,6 +913,11 @@ bool ScriptEngine::ShouldStartPlugin(const std::shared_ptr& plugin) void ScriptEngine::Tick() { + if (!_initialised) + { + return; + } + PROFILED_FUNCTION(); CheckAndStartPlugins(); diff --git a/src/openrct2/ui/DummyUiContext.cpp b/src/openrct2/ui/DummyUiContext.cpp index 72ef0af253..5dbb82f09b 100644 --- a/src/openrct2/ui/DummyUiContext.cpp +++ b/src/openrct2/ui/DummyUiContext.cpp @@ -24,7 +24,7 @@ namespace OpenRCT2::Ui std::unique_ptr const _windowManager = CreateDummyWindowManager(); public: - void Initialise() override + void InitialiseScriptExtensions() override { } void Tick() override diff --git a/src/openrct2/ui/UiContext.h b/src/openrct2/ui/UiContext.h index 7f86450917..4c247e2d8c 100644 --- a/src/openrct2/ui/UiContext.h +++ b/src/openrct2/ui/UiContext.h @@ -99,7 +99,7 @@ namespace OpenRCT2 { virtual ~IUiContext() = default; - virtual void Initialise() abstract; + virtual void InitialiseScriptExtensions() abstract; virtual void Tick() abstract; virtual void Draw(DrawPixelInfo& dpi) abstract;