From a93370895b52b42569a59ce8dede8e4422f8a76b Mon Sep 17 00:00:00 2001 From: Octavian Dima <3403191+wopss@users.noreply.github.com> Date: Fri, 20 Feb 2026 10:27:17 +0200 Subject: [PATCH 1/3] Add support for V1 API --- cmake/deps/RED4extSdk.cmake | 2 +- src/dll/Image.cpp | 19 ++++++- src/dll/Systems/PluginSystem.cpp | 43 +++++++++++--- src/dll/v0/Plugin.cpp | 96 -------------------------------- src/dll/{v0 => v1}/Funcs.cpp | 12 ++-- src/dll/{v0 => v1}/Funcs.hpp | 4 +- src/dll/{v0 => v1}/Logger.cpp | 50 ++++++++--------- src/dll/{v0 => v1}/Logger.hpp | 4 +- src/dll/v1/Plugin.cpp | 96 ++++++++++++++++++++++++++++++++ src/dll/{v0 => v1}/Plugin.hpp | 18 +++--- 10 files changed, 192 insertions(+), 152 deletions(-) delete mode 100644 src/dll/v0/Plugin.cpp rename src/dll/{v0 => v1}/Funcs.cpp (89%) rename src/dll/{v0 => v1}/Funcs.hpp (94%) rename src/dll/{v0 => v1}/Logger.cpp (86%) rename src/dll/{v0 => v1}/Logger.hpp (98%) create mode 100644 src/dll/v1/Plugin.cpp rename src/dll/{v0 => v1}/Plugin.hpp (68%) diff --git a/cmake/deps/RED4extSdk.cmake b/cmake/deps/RED4extSdk.cmake index a797dda2..8064353c 100644 --- a/cmake/deps/RED4extSdk.cmake +++ b/cmake/deps/RED4extSdk.cmake @@ -4,7 +4,7 @@ option(RED4EXT_USE_PCH "" ON) FetchContent_Declare( RED4ext.SDK GIT_REPOSITORY https://github.com/wopss/RED4ext.SDK.git - GIT_TAG 5e5d4fba9917a58a9622c72c4c902dfd27f553b8 + GIT_TAG cfb8421cdcf31470c6f3c1705631ea75d8c1aa7f ) FetchContent_MakeAvailable(RED4ext.SDK) diff --git a/src/dll/Image.cpp b/src/dll/Image.cpp index 28aab3ce..b4d6d9d8 100644 --- a/src/dll/Image.cpp +++ b/src/dll/Image.cpp @@ -1,10 +1,25 @@ #include "Image.hpp" #include "Utils.hpp" +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + Image::Image() : m_isCyberpunk(false) - , m_fileVersion(RED4EXT_V0_FILEVER(0, 0, 0, 0)) - , m_productVersion(RED4EXT_V0_SEMVER(0, 0, 0)) + , m_fileVersion(RED4EXT_FILEVER(0, 0, 0, 0)) + , m_productVersion(RED4EXT_SEMVER(0, 0, 0)) { std::wstring fileName; auto hr = wil::GetModuleFileNameW(nullptr, fileName); diff --git a/src/dll/Systems/PluginSystem.cpp b/src/dll/Systems/PluginSystem.cpp index 0aab4cf2..ccfaf8a1 100644 --- a/src/dll/Systems/PluginSystem.cpp +++ b/src/dll/Systems/PluginSystem.cpp @@ -1,14 +1,38 @@ #include "PluginSystem.hpp" +#include "Config.hpp" +#include "ESystemType.hpp" #include "Image.hpp" +#include "Paths.hpp" +#include "PluginBase.hpp" #include "Utils.hpp" #include "Version.hpp" -#include "v0/Plugin.hpp" +#include "v1/Plugin.hpp" -#define MINIMUM_API_VERSION RED4EXT_API_VERSION_0 -#define LATEST_API_VERSION RED4EXT_API_VERSION_LATEST +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define BACKWARDS_COMP_RED4EXT_API_VERSION_0 0 + +#define MINIMUM_API_VERSION BACKWARDS_COMP_RED4EXT_API_VERSION_0 +#define MAXIMUM_API_VERSION RED4EXT_API_VERSION_1 #define MINIMUM_SDK_VERSION RED4EXT_SDK_0_5_0 -#define LATEST_SDK_VERSION RED4EXT_SDK_LATEST +#define MAXIMUM_SDK_VERSION RED4EXT_SDK_1_0_0 #define LOG_FS_ERROR(text, ec) \ auto val = ec.value(); \ @@ -271,13 +295,13 @@ void PluginSystem::Load(const std::filesystem::path& aPath, bool aUseAlteredSear } const auto& pluginSdk = plugin->GetSdkVersion(); - if (pluginSdk < MINIMUM_SDK_VERSION || pluginSdk > LATEST_SDK_VERSION) + if (pluginSdk < MINIMUM_SDK_VERSION || pluginSdk > MAXIMUM_SDK_VERSION) { spdlog::warn(L"{} (version: {}) uses RED4ext.SDK v{} which is not supported by RED4ext v{}. If you are the " L"plugin's author, recompile the plugin with a version of RED4ext.SDK that meets the following " L"criteria: RED4ext.SDK >= {} && RED4ext.SDK <= {}", pluginName, std::to_wstring(pluginVersion), std::to_wstring(pluginSdk), Version::Get(), - std::to_wstring(MINIMUM_SDK_VERSION), std::to_wstring(LATEST_SDK_VERSION)); + std::to_wstring(MINIMUM_SDK_VERSION), std::to_wstring(MAXIMUM_SDK_VERSION)); return; } @@ -349,7 +373,7 @@ std::shared_ptr PluginSystem::CreatePlugin(const std::filesystem::pa return nullptr; } - if (apiVersion < MINIMUM_API_VERSION || apiVersion > LATEST_API_VERSION) + if (apiVersion < MINIMUM_API_VERSION || apiVersion > MAXIMUM_API_VERSION) { spdlog::warn(L"'{}' is using an unsupported API version. API version: {}, path: '{}'", stem, apiVersion, aPath); return nullptr; @@ -357,9 +381,10 @@ std::shared_ptr PluginSystem::CreatePlugin(const std::filesystem::pa switch (apiVersion) { - case RED4EXT_API_VERSION_0: + case BACKWARDS_COMP_RED4EXT_API_VERSION_0: + case RED4EXT_API_VERSION_1: { - return std::make_shared(aPath, std::move(aModule)); + return std::make_shared(aPath, std::move(aModule)); } } diff --git a/src/dll/v0/Plugin.cpp b/src/dll/v0/Plugin.cpp deleted file mode 100644 index c64c49ec..00000000 --- a/src/dll/v0/Plugin.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "v0/Plugin.hpp" -#include "Image.hpp" -#include "stdafx.hpp" -#include "v0/Funcs.hpp" -#include "v0/Logger.hpp" - -v0::Plugin::Plugin(const std::filesystem::path& aPath, wil::unique_hmodule aModule) - : PluginBase(aPath, std::move(aModule)) - , m_info{} - , m_sdk{} - , m_runtime(Image::Get()->GetProductVersion()) - , m_logger{} - , m_hooking{} - , m_gameStates{} - , m_scripts{} -{ - m_sdk.runtime = &m_runtime; - m_sdk.logger = &m_logger; - m_sdk.hooking = &m_hooking; - m_sdk.gameStates = &m_gameStates; - m_sdk.scripts = &m_scripts; - - m_logger.Trace = v0::Logger::Trace; - m_logger.TraceF = v0::Logger::TraceF; - m_logger.TraceW = v0::Logger::TraceW; - m_logger.TraceWF = v0::Logger::TraceWF; - m_logger.Debug = v0::Logger::Debug; - m_logger.DebugF = v0::Logger::DebugF; - m_logger.DebugW = v0::Logger::DebugW; - m_logger.DebugWF = v0::Logger::DebugWF; - m_logger.Info = v0::Logger::Info; - m_logger.InfoF = v0::Logger::InfoF; - m_logger.InfoW = v0::Logger::InfoW; - m_logger.InfoWF = v0::Logger::InfoWF; - m_logger.Warn = v0::Logger::Warn; - m_logger.WarnF = v0::Logger::WarnF; - m_logger.WarnWF = v0::Logger::WarnWF; - m_logger.WarnW = v0::Logger::WarnW; - m_logger.Error = v0::Logger::Error; - m_logger.ErrorF = v0::Logger::ErrorF; - m_logger.ErrorW = v0::Logger::ErrorW; - m_logger.ErrorWF = v0::Logger::ErrorWF; - m_logger.Critical = v0::Logger::Critical; - m_logger.CriticalF = v0::Logger::CriticalF; - m_logger.CriticalW = v0::Logger::CriticalW; - m_logger.CriticalWF = v0::Logger::CriticalWF; - - m_hooking.Attach = v0::Hooking::Attach; - m_hooking.Detach = v0::Hooking::Detach; - - m_gameStates.Add = v0::GameStates::Add; - - m_scripts.Add = v0::Scripts::Add; - m_scripts.RegisterNeverRefType = v0::Scripts::RegisterNeverRefType; - m_scripts.RegisterMixedRefType = v0::Scripts::RegisterMixedRefType; -} - -const uint32_t v0::Plugin::GetApiVersion() const -{ - return RED4EXT_API_VERSION_0; -} - -void* v0::Plugin::GetPluginInfo() -{ - return &m_info; -} - -const void* v0::Plugin::GetSdkStruct() const -{ - return &m_sdk; -} - -const std::wstring_view v0::Plugin::GetName() const -{ - return m_info.name; -} - -const std::wstring_view v0::Plugin::GetAuthor() const -{ - return m_info.author; -} - -const RED4ext::SemVer& v0::Plugin::GetVersion() const -{ - return m_info.version; -} - -const RED4ext::FileVer& v0::Plugin::GetRuntimeVersion() const -{ - return m_info.runtime; -} - -const RED4ext::SemVer& v0::Plugin::GetSdkVersion() const -{ - return m_info.sdk; -} diff --git a/src/dll/v0/Funcs.cpp b/src/dll/v1/Funcs.cpp similarity index 89% rename from src/dll/v0/Funcs.cpp rename to src/dll/v1/Funcs.cpp index 331d0747..1561ca51 100644 --- a/src/dll/v0/Funcs.cpp +++ b/src/dll/v1/Funcs.cpp @@ -24,7 +24,7 @@ std::shared_ptr GetPluginByHandle(RED4ext::PluginHandle aHandle) } } // namespace -bool v0::Hooking::Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal) +bool v1::Hooking::Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal) { spdlog::trace("Attach request received from plugin with handle {}", fmt::ptr(aHandle)); @@ -50,7 +50,7 @@ bool v0::Hooking::Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDe return hookingSystem->Attach(plugin, aTarget, aDetour, aOriginal); } -bool v0::Hooking::Detach(RED4ext::PluginHandle aHandle, void* aTarget) +bool v1::Hooking::Detach(RED4ext::PluginHandle aHandle, void* aTarget) { spdlog::trace("Detach request received from plugin with handle {}", fmt::ptr(aHandle)); @@ -76,7 +76,7 @@ bool v0::Hooking::Detach(RED4ext::PluginHandle aHandle, void* aTarget) return hookingSystem->Detach(plugin, aTarget); } -bool v0::GameStates::Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType aType, RED4ext::GameState* aState) +bool v1::GameStates::Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType aType, RED4ext::GameState* aState) { spdlog::trace("Request to add a game state has been received from plugin with handle {}", fmt::ptr(aHandle)); @@ -110,7 +110,7 @@ bool v0::GameStates::Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType return false; } -bool v0::Scripts::Add(RED4ext::PluginHandle aHandle, const wchar_t* aPath) +bool v1::Scripts::Add(RED4ext::PluginHandle aHandle, const wchar_t* aPath) { auto app = App::Get(); if (!app) @@ -128,7 +128,7 @@ bool v0::Scripts::Add(RED4ext::PluginHandle aHandle, const wchar_t* aPath) return scriptCompilationSystem->Add(plugin, aPath); } -bool v0::Scripts::RegisterNeverRefType(const char* aType) +bool v1::Scripts::RegisterNeverRefType(const char* aType) { auto app = App::Get(); if (!app) @@ -141,7 +141,7 @@ bool v0::Scripts::RegisterNeverRefType(const char* aType) return true; } -bool v0::Scripts::RegisterMixedRefType(const char* aType) +bool v1::Scripts::RegisterMixedRefType(const char* aType) { auto app = App::Get(); if (!app) diff --git a/src/dll/v0/Funcs.hpp b/src/dll/v1/Funcs.hpp similarity index 94% rename from src/dll/v0/Funcs.hpp rename to src/dll/v1/Funcs.hpp index 744d9dd2..b361fa66 100644 --- a/src/dll/v0/Funcs.hpp +++ b/src/dll/v1/Funcs.hpp @@ -1,6 +1,6 @@ #pragma once -namespace v0 +namespace v1 { namespace Hooking { @@ -20,4 +20,4 @@ bool RegisterNeverRefType(const char* aType); bool RegisterMixedRefType(const char* aType); } // namespace Scripts -} // namespace v0 +} // namespace v1 diff --git a/src/dll/v0/Logger.cpp b/src/dll/v1/Logger.cpp similarity index 86% rename from src/dll/v0/Logger.cpp rename to src/dll/v1/Logger.cpp index 98d6de7f..e3539d4c 100644 --- a/src/dll/v0/Logger.cpp +++ b/src/dll/v1/Logger.cpp @@ -1,6 +1,6 @@ -#include "stdafx.hpp" #include "Logger.hpp" #include "App.hpp" +#include "stdafx.hpp" #define Log(func) \ if (!aMessage) \ @@ -73,122 +73,122 @@ \ va_end(args) -void v0::Logger::Trace(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Trace(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Trace); } -void v0::Logger::TraceF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::TraceF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Trace); } -void v0::Logger::TraceW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::TraceW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Trace); } -void v0::Logger::TraceWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::TraceWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Trace); } -void v0::Logger::Debug(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Debug(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Debug); } -void v0::Logger::DebugF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::DebugF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Debug); } -void v0::Logger::DebugW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::DebugW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Debug); } -void v0::Logger::DebugWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::DebugWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Debug); } -void v0::Logger::Info(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Info(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Info); } -void v0::Logger::InfoF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::InfoF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Info); } -void v0::Logger::InfoW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::InfoW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Info); } -void v0::Logger::InfoWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::InfoWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Info); } -void v0::Logger::Warn(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Warn(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Warn); } -void v0::Logger::WarnF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::WarnF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Warn); } -void v0::Logger::WarnW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::WarnW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Warn); } -void v0::Logger::WarnWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::WarnWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Warn); } -void v0::Logger::Error(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Error(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Error); } -void v0::Logger::ErrorF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::ErrorF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Error); } -void v0::Logger::ErrorW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::ErrorW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Error); } -void v0::Logger::ErrorWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::ErrorWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Error); } -void v0::Logger::Critical(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Critical(RED4ext::PluginHandle aHandle, const char* aMessage) { Log(Critical); } -void v0::Logger::CriticalF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::CriticalF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Critical); } -void v0::Logger::CriticalW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::CriticalW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) { Log(Critical); } -void v0::Logger::CriticalWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::CriticalWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Critical); } diff --git a/src/dll/v0/Logger.hpp b/src/dll/v1/Logger.hpp similarity index 98% rename from src/dll/v0/Logger.hpp rename to src/dll/v1/Logger.hpp index 99f2f836..180fff60 100644 --- a/src/dll/v0/Logger.hpp +++ b/src/dll/v1/Logger.hpp @@ -2,7 +2,7 @@ #pragma once -namespace v0 +namespace v1 { namespace Logger { @@ -42,4 +42,4 @@ void CriticalF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); void CriticalW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); void CriticalWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); } // namespace Logger -} // namespace v0 +} // namespace v1 diff --git a/src/dll/v1/Plugin.cpp b/src/dll/v1/Plugin.cpp new file mode 100644 index 00000000..976bfe4e --- /dev/null +++ b/src/dll/v1/Plugin.cpp @@ -0,0 +1,96 @@ +#include "v1/Plugin.hpp" +#include "Image.hpp" +#include "stdafx.hpp" +#include "v1/Funcs.hpp" +#include "v1/Logger.hpp" + +v1::Plugin::Plugin(const std::filesystem::path& aPath, wil::unique_hmodule aModule) + : PluginBase(aPath, std::move(aModule)) + , m_info{} + , m_sdk{} + , m_runtime(Image::Get()->GetProductVersion()) + , m_logger{} + , m_hooking{} + , m_gameStates{} + , m_scripts{} +{ + m_sdk.runtime = &m_runtime; + m_sdk.logger = &m_logger; + m_sdk.hooking = &m_hooking; + m_sdk.gameStates = &m_gameStates; + m_sdk.scripts = &m_scripts; + + m_logger.Trace = v1::Logger::Trace; + m_logger.TraceF = v1::Logger::TraceF; + m_logger.TraceW = v1::Logger::TraceW; + m_logger.TraceWF = v1::Logger::TraceWF; + m_logger.Debug = v1::Logger::Debug; + m_logger.DebugF = v1::Logger::DebugF; + m_logger.DebugW = v1::Logger::DebugW; + m_logger.DebugWF = v1::Logger::DebugWF; + m_logger.Info = v1::Logger::Info; + m_logger.InfoF = v1::Logger::InfoF; + m_logger.InfoW = v1::Logger::InfoW; + m_logger.InfoWF = v1::Logger::InfoWF; + m_logger.Warn = v1::Logger::Warn; + m_logger.WarnF = v1::Logger::WarnF; + m_logger.WarnWF = v1::Logger::WarnWF; + m_logger.WarnW = v1::Logger::WarnW; + m_logger.Error = v1::Logger::Error; + m_logger.ErrorF = v1::Logger::ErrorF; + m_logger.ErrorW = v1::Logger::ErrorW; + m_logger.ErrorWF = v1::Logger::ErrorWF; + m_logger.Critical = v1::Logger::Critical; + m_logger.CriticalF = v1::Logger::CriticalF; + m_logger.CriticalW = v1::Logger::CriticalW; + m_logger.CriticalWF = v1::Logger::CriticalWF; + + m_hooking.Attach = v1::Hooking::Attach; + m_hooking.Detach = v1::Hooking::Detach; + + m_gameStates.Add = v1::GameStates::Add; + + m_scripts.Add = v1::Scripts::Add; + m_scripts.RegisterNeverRefType = v1::Scripts::RegisterNeverRefType; + m_scripts.RegisterMixedRefType = v1::Scripts::RegisterMixedRefType; +} + +const uint32_t v1::Plugin::GetApiVersion() const +{ + return RED4EXT_API_VERSION_1; +} + +void* v1::Plugin::GetPluginInfo() +{ + return &m_info; +} + +const void* v1::Plugin::GetSdkStruct() const +{ + return &m_sdk; +} + +const std::wstring_view v1::Plugin::GetName() const +{ + return m_info.name; +} + +const std::wstring_view v1::Plugin::GetAuthor() const +{ + return m_info.author; +} + +const RED4ext::SemVer& v1::Plugin::GetVersion() const +{ + return m_info.version; +} + +const RED4ext::FileVer& v1::Plugin::GetRuntimeVersion() const +{ + return m_info.runtime; +} + +const RED4ext::SemVer& v1::Plugin::GetSdkVersion() const +{ + return m_info.sdk; +} diff --git a/src/dll/v0/Plugin.hpp b/src/dll/v1/Plugin.hpp similarity index 68% rename from src/dll/v0/Plugin.hpp rename to src/dll/v1/Plugin.hpp index 62e74806..844e0383 100644 --- a/src/dll/v0/Plugin.hpp +++ b/src/dll/v1/Plugin.hpp @@ -2,7 +2,7 @@ #include "PluginBase.hpp" -namespace v0 +namespace v1 { class Plugin : public PluginBase { @@ -20,13 +20,13 @@ class Plugin : public PluginBase virtual const RED4ext::SemVer& GetSdkVersion() const final; private: - RED4ext::v0::PluginInfo m_info; + RED4ext::v1::PluginInfo m_info; - RED4ext::v0::Sdk m_sdk; - RED4ext::v0::SemVer m_runtime; - RED4ext::v0::Logger m_logger; - RED4ext::v0::Hooking m_hooking; - RED4ext::v0::GameStates m_gameStates; - RED4ext::v0::Scripts m_scripts; + RED4ext::v1::Sdk m_sdk; + RED4ext::v1::SemVer m_runtime; + RED4ext::v1::Logger m_logger; + RED4ext::v1::Hooking m_hooking; + RED4ext::v1::GameStates m_gameStates; + RED4ext::v1::Scripts m_scripts; }; -} // namespace v0 +} // namespace v1 From 52613c73467932b71ef6107f16c149080d0e40eb Mon Sep 17 00:00:00 2001 From: Octavian Dima <3403191+wopss@users.noreply.github.com> Date: Mon, 23 Feb 2026 21:32:45 +0200 Subject: [PATCH 2/3] Update SDK --- cmake/deps/RED4extSdk.cmake | 2 +- src/dll/App.cpp | 4 +-- src/dll/Image.cpp | 19 +++++------ src/dll/Image.hpp | 15 ++++++--- src/dll/PluginBase.cpp | 23 +++++++++---- src/dll/PluginBase.hpp | 19 ++++++++--- src/dll/Systems/PluginSystem.cpp | 23 ++++++------- src/dll/Utils.hpp | 18 ++++++++-- src/dll/v1/Funcs.cpp | 20 +++++++++--- src/dll/v1/Funcs.hpp | 12 ++++--- src/dll/v1/Logger.cpp | 56 ++++++++++++++++++-------------- src/dll/v1/Logger.hpp | 50 ++++++++++++++-------------- src/dll/v1/Plugin.cpp | 17 ++++++++-- src/dll/v1/Plugin.hpp | 20 ++++++++++-- src/playground/Main.cpp | 20 +++++++----- 15 files changed, 203 insertions(+), 115 deletions(-) diff --git a/cmake/deps/RED4extSdk.cmake b/cmake/deps/RED4extSdk.cmake index 8064353c..b20eabc3 100644 --- a/cmake/deps/RED4extSdk.cmake +++ b/cmake/deps/RED4extSdk.cmake @@ -4,7 +4,7 @@ option(RED4EXT_USE_PCH "" ON) FetchContent_Declare( RED4ext.SDK GIT_REPOSITORY https://github.com/wopss/RED4ext.SDK.git - GIT_TAG cfb8421cdcf31470c6f3c1705631ea75d8c1aa7f + GIT_TAG a91535e1bc8d6b0279a21d2c7acd38fb2a32b632 ) FetchContent_MakeAvailable(RED4ext.SDK) diff --git a/src/dll/App.cpp b/src/dll/App.cpp index dd32aa0b..3687fd71 100644 --- a/src/dll/App.cpp +++ b/src/dll/App.cpp @@ -89,8 +89,8 @@ App::App() spdlog::info("Product version: {}.{}{}", productVer.major, productVer.minor, productVer.patch); spdlog::info("File version: {}.{}.{}.{}", fileVer.major, fileVer.minor, fileVer.build, fileVer.revision); - auto minimumVersion = RED4EXT_RUNTIME_2_31; - if (fileVer < RED4EXT_RUNTIME_2_31) + const auto minimumVersion = RED4EXT_V1_RUNTIME_2_31; + if (fileVer < minimumVersion) { spdlog::error(L"To use this version of RED4ext, ensure your game is updated to patch 2.31 or newer"); return; diff --git a/src/dll/Image.cpp b/src/dll/Image.cpp index b4d6d9d8..1df264ed 100644 --- a/src/dll/Image.cpp +++ b/src/dll/Image.cpp @@ -1,9 +1,8 @@ #include "Image.hpp" #include "Utils.hpp" -#include -#include -#include +#include +#include #include #include @@ -18,8 +17,8 @@ Image::Image() : m_isCyberpunk(false) - , m_fileVersion(RED4EXT_FILEVER(0, 0, 0, 0)) - , m_productVersion(RED4EXT_SEMVER(0, 0, 0)) + , m_fileVersion(RED4EXT_V1_FILEVER(0, 0, 0, 0)) + , m_productVersion(RED4EXT_V1_SEMVER(0, 0, 0)) { std::wstring fileName; auto hr = wil::GetModuleFileNameW(nullptr, fileName); @@ -113,7 +112,7 @@ Image::Image() uint16_t build = (fileInfo->dwFileVersionLS >> 16) & 0xFFFF; uint16_t revision = fileInfo->dwFileVersionLS & 0xFFFF; - m_fileVersion = RED4EXT_FILEVER(major, minor, build, revision); + m_fileVersion = RED4EXT_V1_FILEVER(major, minor, build, revision); } { @@ -121,7 +120,7 @@ Image::Image() uint16_t minor = fileInfo->dwProductVersionMS & 0xFFFF; uint32_t patch = (fileInfo->dwProductVersionLS >> 16) & 0xFFFF; - m_productVersion = RED4EXT_SEMVER(major, minor, patch); + m_productVersion = RED4EXT_V1_SEMVER(major, minor, patch); } } } @@ -151,17 +150,17 @@ bool Image::IsSupported() const return false; } -const RED4ext::FileVer& Image::GetFileVersion() const +const RED4ext::v1::FileVer& Image::GetFileVersion() const { return m_fileVersion; } -const RED4ext::SemVer& Image::GetProductVersion() const +const RED4ext::v1::SemVer& Image::GetProductVersion() const { return m_productVersion; } -const std::vector Image::GetSupportedVersions() const +const std::vector Image::GetSupportedVersions() const { return {m_fileVersion}; } diff --git a/src/dll/Image.hpp b/src/dll/Image.hpp index bb54d284..3ba6f718 100644 --- a/src/dll/Image.hpp +++ b/src/dll/Image.hpp @@ -1,5 +1,10 @@ #pragma once +#include +#include + +#include + class Image { public: @@ -8,15 +13,15 @@ class Image bool IsCyberpunk() const; bool IsSupported() const; - const RED4ext::FileVer& GetFileVersion() const; - const RED4ext::SemVer& GetProductVersion() const; - const std::vector GetSupportedVersions() const; + const RED4ext::v1::FileVer& GetFileVersion() const; + const RED4ext::v1::SemVer& GetProductVersion() const; + const std::vector GetSupportedVersions() const; private: Image(); ~Image() = default; bool m_isCyberpunk; - RED4ext::FileVer m_fileVersion; - RED4ext::SemVer m_productVersion; + RED4ext::v1::FileVer m_fileVersion; + RED4ext::v1::SemVer m_productVersion; }; diff --git a/src/dll/PluginBase.cpp b/src/dll/PluginBase.cpp index 31fef8bb..62226061 100644 --- a/src/dll/PluginBase.cpp +++ b/src/dll/PluginBase.cpp @@ -1,7 +1,17 @@ -#include "stdafx.hpp" #include "PluginBase.hpp" #include "Utils.hpp" +#include +#include +#include +#include + +#include + +#include +#include +#include + PluginBase::PluginBase(const std::filesystem::path& aPath, wil::unique_hmodule aModule) : m_path(aPath) , m_module(std::move(aModule)) @@ -71,15 +81,15 @@ bool PluginBase::Query() return true; } -bool PluginBase::Main(RED4ext::EMainReason aReason) +bool PluginBase::Main(RED4ext::v1::EMainReason aReason) { const auto module = GetModule(); const auto name = GetName(); - const auto reasonStr = aReason == RED4ext::EMainReason::Load ? L"Load" : L"Unload"; + const auto reasonStr = aReason == RED4ext::v1::EMainReason::Load ? L"Load" : L"Unload"; spdlog::trace(L"Calling 'Main' function exported by '{}' with reason '{}'...", name, reasonStr); - using Main_t = bool (*)(RED4ext::PluginHandle, RED4ext::EMainReason, const void*); + using Main_t = bool (*)(RED4ext::v1::PluginHandle, RED4ext::v1::EMainReason, const void*); auto mainFn = reinterpret_cast(GetProcAddress(module, "Main")); if (mainFn) { @@ -103,8 +113,9 @@ bool PluginBase::Main(RED4ext::EMainReason aReason) } catch (...) { - spdlog::warn(L"An unknown exception occured while calling 'Main' function with reason '{}', exported by '{}'", - reasonStr, name); + spdlog::warn( + L"An unknown exception occured while calling 'Main' function with reason '{}', exported by '{}'", + reasonStr, name); return false; } } diff --git a/src/dll/PluginBase.hpp b/src/dll/PluginBase.hpp index 08f0e7b5..74bdacec 100644 --- a/src/dll/PluginBase.hpp +++ b/src/dll/PluginBase.hpp @@ -1,5 +1,16 @@ #pragma once +#include +#include +#include +#include + +#include + +#include +#include +#include + class PluginBase { public: @@ -12,15 +23,15 @@ class PluginBase virtual const std::wstring_view GetName() const = 0; virtual const std::wstring_view GetAuthor() const = 0; - virtual const RED4ext::SemVer& GetVersion() const = 0; - virtual const RED4ext::FileVer& GetRuntimeVersion() const = 0; - virtual const RED4ext::SemVer& GetSdkVersion() const = 0; + virtual const RED4ext::v1::SemVer& GetVersion() const = 0; + virtual const RED4ext::v1::FileVer& GetRuntimeVersion() const = 0; + virtual const RED4ext::v1::SemVer& GetSdkVersion() const = 0; const std::filesystem::path& GetPath() const; HMODULE GetModule() const; bool Query(); - bool Main(RED4ext::EMainReason aReason); + bool Main(RED4ext::v1::EMainReason aReason); private: std::filesystem::path m_path; diff --git a/src/dll/Systems/PluginSystem.cpp b/src/dll/Systems/PluginSystem.cpp index ccfaf8a1..95fc4009 100644 --- a/src/dll/Systems/PluginSystem.cpp +++ b/src/dll/Systems/PluginSystem.cpp @@ -8,10 +8,11 @@ #include "Version.hpp" #include "v1/Plugin.hpp" -#include -#include -#include +#include +#include +#include #include +#include #include #include #include @@ -26,13 +27,13 @@ #include #include -#define BACKWARDS_COMP_RED4EXT_API_VERSION_0 0 +#define RED4EXT_API_VERSION_0 0 -#define MINIMUM_API_VERSION BACKWARDS_COMP_RED4EXT_API_VERSION_0 +#define MINIMUM_API_VERSION RED4EXT_API_VERSION_0 #define MAXIMUM_API_VERSION RED4EXT_API_VERSION_1 -#define MINIMUM_SDK_VERSION RED4EXT_SDK_0_5_0 -#define MAXIMUM_SDK_VERSION RED4EXT_SDK_1_0_0 +#define MINIMUM_SDK_VERSION RED4EXT_V1_SEMVER(0, 5, 0) +#define MAXIMUM_SDK_VERSION RED4EXT_V1_SDK_CURRENT #define LOG_FS_ERROR(text, ec) \ auto val = ec.value(); \ @@ -268,7 +269,7 @@ void PluginSystem::Load(const std::filesystem::path& aPath, bool aUseAlteredSear const auto image = Image::Get(); const auto& requestedRuntime = plugin->GetRuntimeVersion(); - if (requestedRuntime != RED4EXT_RUNTIME_INDEPENDENT) + if (requestedRuntime != RED4EXT_V1_RUNTIME_INDEPENDENT) { // Check if the plugins is compiled for a supported version. bool isSupported = false; @@ -308,7 +309,7 @@ void PluginSystem::Load(const std::filesystem::path& aPath, bool aUseAlteredSear auto module = plugin->GetModule(); m_plugins.emplace(module, plugin); - if (!plugin->Main(RED4ext::EMainReason::Load)) + if (!plugin->Main(RED4ext::v1::EMainReason::Load)) { spdlog::warn(L"{} did not initialize properly, unloading...", pluginName); Unload(plugin); @@ -322,7 +323,7 @@ void PluginSystem::Load(const std::filesystem::path& aPath, bool aUseAlteredSear PluginSystem::MapIter_t PluginSystem::Unload(std::shared_ptr aPlugin) { - aPlugin->Main(RED4ext::EMainReason::Unload); + aPlugin->Main(RED4ext::v1::EMainReason::Unload); auto module = aPlugin->GetModule(); auto iter = m_plugins.find(module); @@ -381,7 +382,7 @@ std::shared_ptr PluginSystem::CreatePlugin(const std::filesystem::pa switch (apiVersion) { - case BACKWARDS_COMP_RED4EXT_API_VERSION_0: + case RED4EXT_API_VERSION_0: case RED4EXT_API_VERSION_1: { return std::make_shared(aPath, std::move(aModule)); diff --git a/src/dll/Utils.hpp b/src/dll/Utils.hpp index cd0962f2..e94725a8 100644 --- a/src/dll/Utils.hpp +++ b/src/dll/Utils.hpp @@ -1,5 +1,19 @@ #pragma once +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + class Config; class DevConsole; class Paths; @@ -61,10 +75,10 @@ struct fmt::formatter : formatter -struct fmt::formatter : formatter, Char> +struct fmt::formatter : formatter, Char> { template - auto format(const RED4ext::FileVer& aFileVersion, FormatContext& ctx) + auto format(const RED4ext::v1::FileVer& aFileVersion, FormatContext& ctx) { return fmt::format_to(ctx.out(), "{}.{}.{}.{}", aFileVersion.major, aFileVersion.minor, aFileVersion.build, aFileVersion.revision); diff --git a/src/dll/v1/Funcs.cpp b/src/dll/v1/Funcs.cpp index 1561ca51..51a15275 100644 --- a/src/dll/v1/Funcs.cpp +++ b/src/dll/v1/Funcs.cpp @@ -1,10 +1,19 @@ #include "Funcs.hpp" #include "App.hpp" +#include "PluginBase.hpp" #include "Utils.hpp" +#include +#include +#include +#include +#include + +#include + namespace { -std::shared_ptr GetPluginByHandle(RED4ext::PluginHandle aHandle) +std::shared_ptr GetPluginByHandle(RED4ext::v1::PluginHandle aHandle) { auto app = App::Get(); if (!app) @@ -24,7 +33,7 @@ std::shared_ptr GetPluginByHandle(RED4ext::PluginHandle aHandle) } } // namespace -bool v1::Hooking::Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal) +bool v1::Hooking::Attach(RED4ext::v1::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal) { spdlog::trace("Attach request received from plugin with handle {}", fmt::ptr(aHandle)); @@ -50,7 +59,7 @@ bool v1::Hooking::Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDe return hookingSystem->Attach(plugin, aTarget, aDetour, aOriginal); } -bool v1::Hooking::Detach(RED4ext::PluginHandle aHandle, void* aTarget) +bool v1::Hooking::Detach(RED4ext::v1::PluginHandle aHandle, void* aTarget) { spdlog::trace("Detach request received from plugin with handle {}", fmt::ptr(aHandle)); @@ -76,7 +85,8 @@ bool v1::Hooking::Detach(RED4ext::PluginHandle aHandle, void* aTarget) return hookingSystem->Detach(plugin, aTarget); } -bool v1::GameStates::Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType aType, RED4ext::GameState* aState) +bool v1::GameStates::Add(RED4ext::v1::PluginHandle aHandle, RED4ext::EGameStateType aType, + RED4ext::v1::GameState* aState) { spdlog::trace("Request to add a game state has been received from plugin with handle {}", fmt::ptr(aHandle)); @@ -110,7 +120,7 @@ bool v1::GameStates::Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType return false; } -bool v1::Scripts::Add(RED4ext::PluginHandle aHandle, const wchar_t* aPath) +bool v1::Scripts::Add(RED4ext::v1::PluginHandle aHandle, const wchar_t* aPath) { auto app = App::Get(); if (!app) diff --git a/src/dll/v1/Funcs.hpp b/src/dll/v1/Funcs.hpp index b361fa66..b9f10d0c 100644 --- a/src/dll/v1/Funcs.hpp +++ b/src/dll/v1/Funcs.hpp @@ -1,21 +1,25 @@ #pragma once +#include +#include +#include + namespace v1 { namespace Hooking { -bool Attach(RED4ext::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal); -bool Detach(RED4ext::PluginHandle aHandle, void* aTarget); +bool Attach(RED4ext::v1::PluginHandle aHandle, void* aTarget, void* aDetour, void** aOriginal); +bool Detach(RED4ext::v1::PluginHandle aHandle, void* aTarget); } // namespace Hooking namespace GameStates { -bool Add(RED4ext::PluginHandle aHandle, RED4ext::EGameStateType aType, RED4ext::GameState* aState); +bool Add(RED4ext::v1::PluginHandle aHandle, RED4ext::EGameStateType aType, RED4ext::v1::GameState* aState); } // namespace GameStates namespace Scripts { -bool Add(RED4ext::PluginHandle aHandle, const wchar_t* aPath); +bool Add(RED4ext::v1::PluginHandle aHandle, const wchar_t* aPath); bool RegisterNeverRefType(const char* aType); bool RegisterMixedRefType(const char* aType); } // namespace Scripts diff --git a/src/dll/v1/Logger.cpp b/src/dll/v1/Logger.cpp index e3539d4c..c8a0c000 100644 --- a/src/dll/v1/Logger.cpp +++ b/src/dll/v1/Logger.cpp @@ -1,6 +1,12 @@ #include "Logger.hpp" #include "App.hpp" -#include "stdafx.hpp" + +#include +#include + +#include +#include +#include #define Log(func) \ if (!aMessage) \ @@ -73,122 +79,122 @@ \ va_end(args) -void v1::Logger::Trace(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Trace(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Trace); } -void v1::Logger::TraceF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::TraceF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Trace); } -void v1::Logger::TraceW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::TraceW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Trace); } -void v1::Logger::TraceWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::TraceWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Trace); } -void v1::Logger::Debug(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Debug(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Debug); } -void v1::Logger::DebugF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::DebugF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Debug); } -void v1::Logger::DebugW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::DebugW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Debug); } -void v1::Logger::DebugWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::DebugWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Debug); } -void v1::Logger::Info(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Info(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Info); } -void v1::Logger::InfoF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::InfoF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Info); } -void v1::Logger::InfoW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::InfoW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Info); } -void v1::Logger::InfoWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::InfoWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Info); } -void v1::Logger::Warn(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Warn(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Warn); } -void v1::Logger::WarnF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::WarnF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Warn); } -void v1::Logger::WarnW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::WarnW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Warn); } -void v1::Logger::WarnWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::WarnWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Warn); } -void v1::Logger::Error(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Error(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Error); } -void v1::Logger::ErrorF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::ErrorF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Error); } -void v1::Logger::ErrorW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::ErrorW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Error); } -void v1::Logger::ErrorWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::ErrorWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Error); } -void v1::Logger::Critical(RED4ext::PluginHandle aHandle, const char* aMessage) +void v1::Logger::Critical(RED4ext::v1::PluginHandle aHandle, const char* aMessage) { Log(Critical); } -void v1::Logger::CriticalF(RED4ext::PluginHandle aHandle, const char* aFormat, ...) +void v1::Logger::CriticalF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...) { LogF(char, ::_vscprintf, ::vsnprintf_s, Critical); } -void v1::Logger::CriticalW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage) +void v1::Logger::CriticalW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage) { Log(Critical); } -void v1::Logger::CriticalWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...) +void v1::Logger::CriticalWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...) { LogF(wchar_t, ::_vscwprintf, ::_vsnwprintf_s, Critical); } diff --git a/src/dll/v1/Logger.hpp b/src/dll/v1/Logger.hpp index 180fff60..2491560f 100644 --- a/src/dll/v1/Logger.hpp +++ b/src/dll/v1/Logger.hpp @@ -1,45 +1,45 @@ #pragma once -#pragma once +#include namespace v1 { namespace Logger { -void Trace(RED4ext::PluginHandle aHandle, const char* aMessage); -void TraceF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Trace(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void TraceF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void TraceW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void TraceWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void TraceW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void TraceWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); -void Debug(RED4ext::PluginHandle aHandle, const char* aMessage); -void DebugF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Debug(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void DebugF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void DebugW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void DebugWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void DebugW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void DebugWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); -void Info(RED4ext::PluginHandle aHandle, const char* aMessage); -void InfoF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Info(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void InfoF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void InfoW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void InfoWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void InfoW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void InfoWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); -void Warn(RED4ext::PluginHandle aHandle, const char* aMessage); -void WarnF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Warn(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void WarnF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void WarnW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void WarnWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void WarnW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void WarnWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); -void Error(RED4ext::PluginHandle aHandle, const char* aMessage); -void ErrorF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Error(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void ErrorF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void ErrorW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void ErrorWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void ErrorW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void ErrorWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); -void Critical(RED4ext::PluginHandle aHandle, const char* aMessage); -void CriticalF(RED4ext::PluginHandle aHandle, const char* aFormat, ...); +void Critical(RED4ext::v1::PluginHandle aHandle, const char* aMessage); +void CriticalF(RED4ext::v1::PluginHandle aHandle, const char* aFormat, ...); -void CriticalW(RED4ext::PluginHandle aHandle, const wchar_t* aMessage); -void CriticalWF(RED4ext::PluginHandle aHandle, const wchar_t* aFormat, ...); +void CriticalW(RED4ext::v1::PluginHandle aHandle, const wchar_t* aMessage); +void CriticalWF(RED4ext::v1::PluginHandle aHandle, const wchar_t* aFormat, ...); } // namespace Logger } // namespace v1 diff --git a/src/dll/v1/Plugin.cpp b/src/dll/v1/Plugin.cpp index 976bfe4e..47efd94c 100644 --- a/src/dll/v1/Plugin.cpp +++ b/src/dll/v1/Plugin.cpp @@ -1,9 +1,20 @@ #include "v1/Plugin.hpp" #include "Image.hpp" +#include "PluginBase.hpp" #include "stdafx.hpp" #include "v1/Funcs.hpp" #include "v1/Logger.hpp" +#include +#include +#include +#include + +#include +#include +#include +#include + v1::Plugin::Plugin(const std::filesystem::path& aPath, wil::unique_hmodule aModule) : PluginBase(aPath, std::move(aModule)) , m_info{} @@ -80,17 +91,17 @@ const std::wstring_view v1::Plugin::GetAuthor() const return m_info.author; } -const RED4ext::SemVer& v1::Plugin::GetVersion() const +const RED4ext::v1::SemVer& v1::Plugin::GetVersion() const { return m_info.version; } -const RED4ext::FileVer& v1::Plugin::GetRuntimeVersion() const +const RED4ext::v1::FileVer& v1::Plugin::GetRuntimeVersion() const { return m_info.runtime; } -const RED4ext::SemVer& v1::Plugin::GetSdkVersion() const +const RED4ext::v1::SemVer& v1::Plugin::GetSdkVersion() const { return m_info.sdk; } diff --git a/src/dll/v1/Plugin.hpp b/src/dll/v1/Plugin.hpp index 844e0383..5961f965 100644 --- a/src/dll/v1/Plugin.hpp +++ b/src/dll/v1/Plugin.hpp @@ -2,6 +2,20 @@ #include "PluginBase.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + namespace v1 { class Plugin : public PluginBase @@ -15,9 +29,9 @@ class Plugin : public PluginBase virtual const std::wstring_view GetName() const final; virtual const std::wstring_view GetAuthor() const final; - virtual const RED4ext::SemVer& GetVersion() const final; - virtual const RED4ext::FileVer& GetRuntimeVersion() const final; - virtual const RED4ext::SemVer& GetSdkVersion() const final; + virtual const RED4ext::v1::SemVer& GetVersion() const final; + virtual const RED4ext::v1::FileVer& GetRuntimeVersion() const final; + virtual const RED4ext::v1::SemVer& GetSdkVersion() const final; private: RED4ext::v1::PluginInfo m_info; diff --git a/src/playground/Main.cpp b/src/playground/Main.cpp index 89dbacc4..87efe85d 100644 --- a/src/playground/Main.cpp +++ b/src/playground/Main.cpp @@ -1,16 +1,18 @@ -RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::PluginHandle aHandle, RED4ext::EMainReason aReason, - const RED4ext::Sdk* aSdk) +#include + +RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::v1::PluginHandle aHandle, RED4ext::v1::EMainReason aReason, + const RED4ext::v1::Sdk* aSdk) { RED4EXT_UNUSED_PARAMETER(aHandle); RED4EXT_UNUSED_PARAMETER(aSdk); switch (aReason) { - case RED4ext::EMainReason::Load: + case RED4ext::v1::EMainReason::Load: { break; } - case RED4ext::EMainReason::Unload: + case RED4ext::v1::EMainReason::Unload: { break; } @@ -19,16 +21,16 @@ RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::PluginHandle aHandle, RED4ext:: return true; } -RED4EXT_C_EXPORT void RED4EXT_CALL Query(RED4ext::PluginInfo* aInfo) +RED4EXT_C_EXPORT void RED4EXT_CALL Query(RED4ext::v1::PluginInfo* aInfo) { aInfo->name = L"RED4ext.Playground"; aInfo->author = L"WopsS"; - aInfo->version = RED4EXT_SEMVER(1, 0, 0); - aInfo->runtime = RED4EXT_RUNTIME_LATEST; - aInfo->sdk = RED4EXT_SDK_LATEST; + aInfo->version = RED4EXT_V1_SEMVER(1, 0, 0); + aInfo->runtime = RED4EXT_V1_RUNTIME_LATEST; + aInfo->sdk = RED4EXT_V1_SDK_CURRENT; } RED4EXT_C_EXPORT uint32_t RED4EXT_CALL Supports() { - return RED4EXT_API_VERSION_LATEST; + return RED4EXT_API_VERSION_1; } From 645db96545afee9564d70eacde32b11ad3ee5042 Mon Sep 17 00:00:00 2001 From: Octavian Dima <3403191+wopss@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:48:06 +0200 Subject: [PATCH 3/3] Update SDK --- cmake/deps/RED4extSdk.cmake | 2 +- src/dll/Systems/PluginSystem.cpp | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/cmake/deps/RED4extSdk.cmake b/cmake/deps/RED4extSdk.cmake index b20eabc3..413845c0 100644 --- a/cmake/deps/RED4extSdk.cmake +++ b/cmake/deps/RED4extSdk.cmake @@ -4,7 +4,7 @@ option(RED4EXT_USE_PCH "" ON) FetchContent_Declare( RED4ext.SDK GIT_REPOSITORY https://github.com/wopss/RED4ext.SDK.git - GIT_TAG a91535e1bc8d6b0279a21d2c7acd38fb2a32b632 + GIT_TAG cb224205a41cc458e3db41a81d7a6589bc1baa7e ) FetchContent_MakeAvailable(RED4ext.SDK) diff --git a/src/dll/Systems/PluginSystem.cpp b/src/dll/Systems/PluginSystem.cpp index 95fc4009..2b39c072 100644 --- a/src/dll/Systems/PluginSystem.cpp +++ b/src/dll/Systems/PluginSystem.cpp @@ -27,12 +27,10 @@ #include #include -#define RED4EXT_API_VERSION_0 0 - -#define MINIMUM_API_VERSION RED4EXT_API_VERSION_0 +#define MINIMUM_API_VERSION RED4EXT_API_VERSION_1_COMPAT_0 #define MAXIMUM_API_VERSION RED4EXT_API_VERSION_1 -#define MINIMUM_SDK_VERSION RED4EXT_V1_SEMVER(0, 5, 0) +#define MINIMUM_SDK_VERSION RED4EXT_V1_SDK_1_0_0_COMPAT_0_5_0 #define MAXIMUM_SDK_VERSION RED4EXT_V1_SDK_CURRENT #define LOG_FS_ERROR(text, ec) \ @@ -382,7 +380,7 @@ std::shared_ptr PluginSystem::CreatePlugin(const std::filesystem::pa switch (apiVersion) { - case RED4EXT_API_VERSION_0: + case RED4EXT_API_VERSION_1_COMPAT_0: case RED4EXT_API_VERSION_1: { return std::make_shared(aPath, std::move(aModule));