From cdb16bf8bba9bb6bd35ff2555080dad827c75dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 24 Jun 2023 16:20:21 +0300 Subject: [PATCH] Fix crashes when custom plugin actions fail due to immutable state --- src/openrct2/scripting/ScriptEngine.cpp | 28 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index f9f7ea3449..c064ca486d 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1109,20 +1109,28 @@ GameActions::Result ScriptEngine::QueryOrExecuteCustomGameAction(const CustomAct GameActions::Result ScriptEngine::DukToGameActionResult(const DukValue& d) { auto result = GameActions::Result(); - result.Error = static_cast(AsOrDefault(d["error"])); - result.ErrorTitle = AsOrDefault(d["errorTitle"]); - result.ErrorMessage = AsOrDefault(d["errorMessage"]); - result.Cost = AsOrDefault(d["cost"]); - - auto expenditureType = AsOrDefault(d["expenditureType"]); - if (!expenditureType.empty()) + if (d.type() == DUK_TYPE_OBJECT) { - auto expenditure = StringToExpenditureType(expenditureType); - if (expenditure != ExpenditureType::Count) + result.Error = static_cast(AsOrDefault(d["error"])); + result.ErrorTitle = AsOrDefault(d["errorTitle"]); + result.ErrorMessage = AsOrDefault(d["errorMessage"]); + result.Cost = AsOrDefault(d["cost"]); + auto expenditureType = AsOrDefault(d["expenditureType"]); + if (!expenditureType.empty()) { - result.Expenditure = expenditure; + auto expenditure = StringToExpenditureType(expenditureType); + if (expenditure != ExpenditureType::Count) + { + result.Expenditure = expenditure; + } } } + else + { + result.Error = GameActions::Status::Unknown; + result.ErrorTitle = "Unknown"; + result.ErrorMessage = "Unknown"; + } return result; }