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);