diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 5205d4dca4..5a62087759 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -15,7 +15,7 @@ // /// // -export type PluginType = "local" | "remote" | intransient; +export type PluginType = "local" | "remote" | "intransient"; declare global { /** diff --git a/src/openrct2/scripting/Plugin.h b/src/openrct2/scripting/Plugin.h index 5e150b821c..6af3c15b8f 100644 --- a/src/openrct2/scripting/Plugin.h +++ b/src/openrct2/scripting/Plugin.h @@ -35,7 +35,8 @@ namespace OpenRCT2::Scripting Remote, /** - * Scripts that run when the game starts and never unload. + * Scripts that run when the game starts and only unload explicitly rather than when the + * park changes. */ Intransient, }; diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index a49ab36964..7cf2fa98b4 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -626,8 +626,11 @@ void ScriptEngine::LoadPlugin(std::shared_ptr& plugin) void ScriptEngine::UnloadPlugin(std::shared_ptr& plugin) { - plugin->Unload(); - LogPluginInfo(plugin, "Unloaded"); + if (plugin->IsLoaded()) + { + plugin->Unload(); + LogPluginInfo(plugin, "Unloaded"); + } } void ScriptEngine::StartPlugin(std::shared_ptr plugin) @@ -663,9 +666,21 @@ void ScriptEngine::StopPlugin(std::shared_ptr plugin) _hookEngine.UnsubscribeAll(plugin); plugin->StopEnd(); + LogPluginInfo(plugin, "Stopped"); } } +void ScriptEngine::ReloadPlugin(std::shared_ptr plugin) +{ + StopPlugin(plugin); + { + ScriptExecutionInfo::PluginScope scope(_execInfo, plugin, false); + plugin->Load(); + LogPluginInfo(plugin, "Reloaded"); + } + StartPlugin(plugin); +} + void ScriptEngine::SetupHotReloading() { try @@ -715,12 +730,7 @@ void ScriptEngine::AutoReloadPlugins() auto& plugin = *findResult; try { - StopPlugin(plugin); - - ScriptExecutionInfo::PluginScope scope(_execInfo, plugin, false); - plugin->Load(); - LogPluginInfo(plugin, "Reloaded"); - plugin->Start(); + ReloadPlugin(plugin); } catch (const std::exception& e) { @@ -739,18 +749,17 @@ void ScriptEngine::UnloadTransientPlugins() { if (plugin->IsTransient()) { - if (plugin->HasStarted()) - { - StopPlugin(plugin); - LogPluginInfo(plugin, "Stopped"); - } + StopPlugin(plugin); } } // Now unload them for (auto& plugin : _plugins) { - UnloadPlugin(plugin); + if (plugin->IsTransient()) + { + UnloadPlugin(plugin); + } } _transientPluginsEnabled = false; diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 17020fc7cc..01633ca8f7 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -261,6 +261,7 @@ namespace OpenRCT2::Scripting void UnloadPlugin(std::shared_ptr& plugin); 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);