diff --git a/src/openrct2/actions/CustomAction.cpp b/src/openrct2/actions/CustomAction.cpp index b573f7c45c..61c800ec56 100644 --- a/src/openrct2/actions/CustomAction.cpp +++ b/src/openrct2/actions/CustomAction.cpp @@ -13,9 +13,10 @@ # include "../Context.h" # include "../scripting/ScriptEngine.h" -CustomAction::CustomAction(const std::string& id, const std::string& json) +CustomAction::CustomAction(const std::string& id, const std::string& json, const std::string& pluginName) : _id(id) , _json(json) + , _pluginName(pluginName) { } @@ -29,6 +30,11 @@ std::string CustomAction::GetJson() const return _json; } +std::string CustomAction::GetPluginName() const +{ + return _pluginName; +} + uint16_t CustomAction::GetActionFlags() const { return GameAction::GetActionFlags() | GameActions::Flags::AllowWhilePaused; diff --git a/src/openrct2/actions/CustomAction.h b/src/openrct2/actions/CustomAction.h index 94ed5877a3..26ebe971fe 100644 --- a/src/openrct2/actions/CustomAction.h +++ b/src/openrct2/actions/CustomAction.h @@ -18,13 +18,15 @@ class CustomAction final : public GameActionBase private: std::string _id; std::string _json; + std::string _pluginName; public: CustomAction() = default; - CustomAction(const std::string& id, const std::string& json); + CustomAction(const std::string& id, const std::string& json, const std::string& pluginName); std::string GetId() const; std::string GetJson() const; + std::string GetPluginName() const; uint16_t GetActionFlags() const override; diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index 8d9f9172a0..155bb1b613 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1090,7 +1090,7 @@ GameActions::Result ScriptEngine::QueryOrExecuteCustomGameAction(const CustomAct auto action = GameActions::Result(); action.Error = GameActions::Status::Unknown; - action.ErrorTitle = "Unknown custom action"; + action.ErrorTitle = " [Unknown custom action] \n" + customAction.GetPluginName() + ": " + actionz; return action; } @@ -1466,7 +1466,7 @@ void ScriptEngine::RunGameActionHooks(const GameAction& action, GameActions::Res } } -std::unique_ptr ScriptEngine::CreateGameAction(const std::string& actionid, const DukValue& args) +std::unique_ptr ScriptEngine::CreateGameAction(const std::string& actionid, const DukValue& args, const std::string& pluginName) { auto action = CreateGameActionFromActionId(actionid); if (action != nullptr) @@ -1494,7 +1494,7 @@ std::unique_ptr ScriptEngine::CreateGameAction(const std::string& ac auto jsonz = duk_json_encode(ctx, -1); auto json = std::string(jsonz); duk_pop(ctx); - auto customAction = std::make_unique(actionid, json); + auto customAction = std::make_unique(actionid, json, pluginName); if (customAction->GetPlayer() == -1 && NetworkGetMode() != NETWORK_MODE_NONE) { diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index ac870caa85..6c0b9178da 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -257,7 +257,7 @@ namespace OpenRCT2::Scripting bool RegisterCustomAction( const std::shared_ptr& plugin, std::string_view action, const DukValue& query, const DukValue& execute); void RunGameActionHooks(const GameAction& action, GameActions::Result& result, bool isExecute); - [[nodiscard]] std::unique_ptr CreateGameAction(const std::string& actionid, const DukValue& args); + [[nodiscard]] std::unique_ptr CreateGameAction(const std::string& actionid, const DukValue& args, const std::string& pluginName); [[nodiscard]] DukValue GameActionResultToDuk(const GameAction& action, const GameActions::Result& result); void SaveSharedStorage(); diff --git a/src/openrct2/scripting/bindings/game/ScContext.hpp b/src/openrct2/scripting/bindings/game/ScContext.hpp index 73a2009e5f..c8a71a02bc 100644 --- a/src/openrct2/scripting/bindings/game/ScContext.hpp +++ b/src/openrct2/scripting/bindings/game/ScContext.hpp @@ -348,10 +348,10 @@ namespace OpenRCT2::Scripting auto ctx = scriptEngine.GetContext(); try { - auto action = scriptEngine.CreateGameAction(actionid, args); + auto plugin = scriptEngine.GetExecInfo().GetCurrentPlugin(); + auto action = scriptEngine.CreateGameAction(actionid, args, plugin->GetMetadata().Name); if (action != nullptr) { - auto plugin = scriptEngine.GetExecInfo().GetCurrentPlugin(); if (isExecute) { action->SetCallback(