diff --git a/src/openrct2/scripting/HookEngine.cpp b/src/openrct2/scripting/HookEngine.cpp index f364a21d11..8dee351c77 100644 --- a/src/openrct2/scripting/HookEngine.cpp +++ b/src/openrct2/scripting/HookEngine.cpp @@ -82,14 +82,13 @@ void HookEngine::Call(HOOK_TYPE type) auto& hookList = GetHookList(type); for (auto& hook : hookList.Hooks) { - _execInfo.SetCurrentPlugin(hook.Owner); + ScriptExecutionInfo::PluginScope scope(_execInfo, hook.Owner); const auto& function = hook.Function; function.push(); duk_pcall(function.context(), 0); duk_pop(function.context()); } - _execInfo.SetCurrentPlugin(nullptr); } HookList& HookEngine::GetHookList(HOOK_TYPE type) diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index a68fc3795b..2e5a142f4e 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -81,7 +81,7 @@ void ScriptEngine::LoadPlugins() try { auto plugin = std::make_shared(_context, path); - _execInfo.SetCurrentPlugin(plugin); + ScriptExecutionInfo::PluginScope scope(_execInfo, plugin); plugin->Load(); plugin->EnableHotReload(); _plugins.push_back(std::move(plugin)); @@ -91,7 +91,6 @@ void ScriptEngine::LoadPlugins() _console.WriteLineError(e.what()); } } - _execInfo.SetCurrentPlugin(nullptr); } void ScriptEngine::AutoReloadPlugins() @@ -103,7 +102,8 @@ void ScriptEngine::AutoReloadPlugins() try { _hookEngine.UnsubscribeAll(plugin); - _execInfo.SetCurrentPlugin(plugin); + + ScriptExecutionInfo::PluginScope scope(_execInfo, plugin); plugin->Load(); plugin->Start(); } @@ -113,14 +113,13 @@ void ScriptEngine::AutoReloadPlugins() } } } - _execInfo.SetCurrentPlugin(nullptr); } void ScriptEngine::StartPlugins() { for (auto& plugin : _plugins) { - _execInfo.SetCurrentPlugin(plugin); + ScriptExecutionInfo::PluginScope scope(_execInfo, plugin); try { plugin->Start(); @@ -130,7 +129,6 @@ void ScriptEngine::StartPlugins() _console.WriteLineError(e.what()); } } - _execInfo.SetCurrentPlugin(nullptr); } void ScriptEngine::Update() diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index b7177524df..a3f2cc0386 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -13,6 +13,7 @@ #include "HookEngine.h" #include "Plugin.h" #include +#include #include #include @@ -34,8 +35,27 @@ namespace OpenRCT2::Scripting std::shared_ptr _plugin; public: + class PluginScope + { + private: + ScriptExecutionInfo& _execInfo; + std::shared_ptr _plugin; + + public: + PluginScope(ScriptExecutionInfo& execInfo, std::shared_ptr plugin) + : _execInfo(execInfo), + _plugin(plugin) + { + _execInfo._plugin = plugin; + } + PluginScope(const PluginScope&) = delete; + ~PluginScope() + { + _execInfo._plugin = nullptr; + } + }; + std::shared_ptr GetCurrentPlugin() { return _plugin; } - void SetCurrentPlugin(std::shared_ptr value) { _plugin = value; } }; class ScriptEngine