From a7bef5442b5d2e59a6c469e7862d2e36a570528f Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Wed, 4 Aug 2021 20:58:02 +0300 Subject: [PATCH] Allow plugins to target a specific API version --- distribution/openrct2.d.ts | 1 + src/openrct2/scripting/Plugin.cpp | 17 +++++++++++++++++ src/openrct2/scripting/Plugin.h | 3 +++ src/openrct2/scripting/ScEntity.hpp | 12 ++++++++++-- src/openrct2/scripting/ScriptEngine.cpp | 7 +++++++ src/openrct2/scripting/ScriptEngine.h | 2 ++ 6 files changed, 40 insertions(+), 2 deletions(-) diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 3beeb00378..b2ff807db4 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -135,6 +135,7 @@ declare global { type: PluginType; licence: string; minApiVersion?: number; + targetApiVersion?: number; main: () => void; } diff --git a/src/openrct2/scripting/Plugin.cpp b/src/openrct2/scripting/Plugin.cpp index fc7ca48821..084ad97ce6 100644 --- a/src/openrct2/scripting/Plugin.cpp +++ b/src/openrct2/scripting/Plugin.cpp @@ -15,6 +15,7 @@ # include "../OpenRCT2.h" # include "../core/File.h" # include "Duktape.hpp" +# include "ScriptEngine.h" # include # include @@ -120,6 +121,7 @@ PluginMetadata Plugin::GetMetadata(const DukValue& dukMetadata) metadata.Name = TryGetString(dukMetadata["name"], "Plugin name not specified."); metadata.Version = TryGetString(dukMetadata["version"], "Plugin version not specified."); metadata.Type = ParsePluginType(TryGetString(dukMetadata["type"], "Plugin type not specified.")); + CheckForLicence(dukMetadata["licence"], metadata.Name); auto dukMinApiVersion = dukMetadata["minApiVersion"]; @@ -128,6 +130,12 @@ PluginMetadata Plugin::GetMetadata(const DukValue& dukMetadata) metadata.MinApiVersion = dukMinApiVersion.as_int(); } + auto dukTargetApiVersion = dukMetadata["targetApiVersion"]; + if (dukTargetApiVersion.type() == DukValue::Type::NUMBER) + { + metadata.TargetApiVersion = dukTargetApiVersion.as_int(); + } + auto dukAuthors = dukMetadata["authors"]; dukAuthors.push(); if (dukAuthors.is_array()) @@ -161,4 +169,13 @@ void Plugin::CheckForLicence(const DukValue& dukLicence, std::string_view plugin log_error("Plugin %s does not specify a licence", std::string(pluginName).c_str()); } +int32_t Plugin::GetTargetAPIVersion() const +{ + if (_metadata.TargetApiVersion) + return *_metadata.TargetApiVersion; + + // If not specified, default to 33 since that is the API version from before 'targetAPIVersion' was introduced. + return 33; +} + #endif diff --git a/src/openrct2/scripting/Plugin.h b/src/openrct2/scripting/Plugin.h index f0e30b8a79..b6fcb41027 100644 --- a/src/openrct2/scripting/Plugin.h +++ b/src/openrct2/scripting/Plugin.h @@ -42,6 +42,7 @@ namespace OpenRCT2::Scripting std::vector Authors; PluginType Type{}; int32_t MinApiVersion{}; + std::optional TargetApiVersion{}; DukValue Main; }; @@ -80,6 +81,8 @@ namespace OpenRCT2::Scripting return _hasStarted; } + int32_t GetTargetAPIVersion() const; + Plugin() = default; Plugin(duk_context* context, const std::string& path); Plugin(const Plugin&) = delete; diff --git a/src/openrct2/scripting/ScEntity.hpp b/src/openrct2/scripting/ScEntity.hpp index f5d90937cc..65bbfcefb4 100644 --- a/src/openrct2/scripting/ScEntity.hpp +++ b/src/openrct2/scripting/ScEntity.hpp @@ -48,6 +48,8 @@ namespace OpenRCT2::Scripting std::string type_get() const { + const auto targetApiVersion = GetTargetAPIVersion(); + auto entity = GetEntity(); if (entity != nullptr) { @@ -56,9 +58,15 @@ namespace OpenRCT2::Scripting case EntityType::Vehicle: return "car"; case EntityType::Guest: - return "guest"; + if (targetApiVersion <= 33) + return "peep"; + else + return "guest"; case EntityType::Staff: - return "staff"; + if (targetApiVersion <= 33) + return "peep"; + else + return "staff"; case EntityType::SteamParticle: return "steam_particle"; case EntityType::MoneyEffect: diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index d7fb754e89..e3478a84d9 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -1419,4 +1419,11 @@ void OpenRCT2::Scripting::ThrowIfGameStateNotMutable() } } +int32_t OpenRCT2::Scripting::GetTargetAPIVersion() +{ + auto& scriptEngine = GetContext()->GetScriptEngine(); + auto& execInfo = scriptEngine.GetExecInfo(); + return execInfo.GetCurrentPlugin()->GetTargetAPIVersion(); +} + #endif diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index ae5fa8859b..fcdd51bcef 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -264,6 +264,8 @@ namespace OpenRCT2::Scripting bool IsGameStateMutable(); void ThrowIfGameStateNotMutable(); + int32_t GetTargetAPIVersion(); + std::string Stringify(const DukValue& value); } // namespace OpenRCT2::Scripting