diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 49be7bf598..ea50eff39e 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -174,6 +174,10 @@ namespace OpenRCT2 // NOTE: We must shutdown all systems here before Instance is set back to null. // If objects use GetContext() in their destructor things won't go well. +#ifdef ENABLE_SCRIPTING + _scriptEngine.StopUnloadRegisterAllPlugins(); +#endif + GameActions::ClearQueue(); #ifndef DISABLE_NETWORK _network.Close(); @@ -503,6 +507,10 @@ namespace OpenRCT2 _gameState = std::make_unique(); _gameState->InitAll(DEFAULT_MAP_SIZE); +#ifdef ENABLE_SCRIPTING + _scriptEngine.Initialise(); +#endif + _titleScreen = std::make_unique(*_gameState); _uiContext->Initialise(); diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 8d867cd180..af76646e45 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -386,6 +386,9 @@ ScriptEngine::ScriptEngine(InteractiveConsole& console, IPlatformEnvironment& en void ScriptEngine::Initialise() { + if (_initialised) + throw std::runtime_error("Script engine already initialised."); + auto ctx = static_cast(_context); ScCheats::Register(ctx); ScClimate::Register(ctx); @@ -445,11 +448,6 @@ void ScriptEngine::Initialise() void ScriptEngine::RefreshPlugins() { - if (!_initialised) - { - Initialise(); - } - // Get a list of removed and added plugin files auto pluginFiles = GetPluginFiles(); std::vector plugins; @@ -481,9 +479,6 @@ void ScriptEngine::RefreshPlugins() { SetupHotReloading(); } - - // Start any new intransient plugins - StartIntransientPlugins(); } std::vector ScriptEngine::GetPluginFiles() const @@ -568,6 +563,8 @@ void ScriptEngine::StartIntransientPlugins() StartPlugin(plugin); } } + + _intransientPluginsStarted = true; } void ScriptEngine::StopUnloadRegisterAllPlugins() @@ -811,23 +808,32 @@ void ScriptEngine::Tick() { PROFILED_FUNCTION(); - if (!_initialised) - { - Initialise(); - RefreshPlugins(); - } - - if (_transientPluginsEnabled && !_transientPluginsStarted) - { - StartTransientPlugins(); - } - + CheckAndStartPlugins(); UpdateIntervals(); UpdateSockets(); ProcessREPL(); DoAutoReloadPluginCheck(); } +void ScriptEngine::CheckAndStartPlugins() +{ + auto startIntransient = !_intransientPluginsStarted; + auto startTransient = !_transientPluginsStarted && _transientPluginsEnabled; + + if (startIntransient || startTransient) + { + RefreshPlugins(); + } + if (startIntransient) + { + StartIntransientPlugins(); + } + if (startTransient) + { + StartTransientPlugins(); + } +} + void ScriptEngine::ProcessREPL() { while (_evalQueue.size() > 0) diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index add4c00f99..2b4208ed72 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -148,6 +148,7 @@ namespace OpenRCT2::Scripting bool _hotReloadingInitialised{}; bool _transientPluginsEnabled{}; bool _transientPluginsStarted{}; + bool _intransientPluginsStarted{}; std::queue, std::string>> _evalQueue; std::vector> _plugins; uint32_t _lastHotReloadCheckTick{}; @@ -210,10 +211,10 @@ namespace OpenRCT2::Scripting std::string GetParkStorageAsJSON(); void SetParkStorageFromJSON(std::string_view value); - void LoadPlugins(); - void UnloadPlugins(); + void Initialise(); void LoadTransientPlugins(); void UnloadTransientPlugins(); + void StopUnloadRegisterAllPlugins(); void Tick(); std::future Eval(const std::string& s); DukValue ExecutePluginCall( @@ -249,11 +250,11 @@ namespace OpenRCT2::Scripting # endif private: - void Initialise(); void RefreshPlugins(); std::vector GetPluginFiles() const; void UnregisterPlugin(std::string_view path); void RegisterPlugin(std::string_view path); + void CheckAndStartPlugins(); void StartIntransientPlugins(); void StartTransientPlugins(); void LoadPlugin(const std::string& path); @@ -262,7 +263,6 @@ namespace OpenRCT2::Scripting void StartPlugin(std::shared_ptr plugin); void StopPlugin(std::shared_ptr plugin); void ReloadPlugin(std::shared_ptr plugin); - void StopUnloadRegisterAllPlugins(); static bool ShouldLoadScript(std::string_view path); bool ShouldStartPlugin(const std::shared_ptr& plugin); void SetupHotReloading();