From 753fd4e1526faa5ee1ce688f43199204f56604f3 Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 09:51:40 -0300 Subject: [PATCH 1/6] add PlatformID::toShortString and other things --- loader/include/Geode/platform/platform.hpp | 14 ++++++++++++++ loader/src/loader/ModMetadataImpl.cpp | 13 +------------ loader/src/utils/PlatformID.cpp | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/loader/include/Geode/platform/platform.hpp b/loader/include/Geode/platform/platform.hpp index aa0f0cbc..d22bf6a5 100644 --- a/loader/include/Geode/platform/platform.hpp +++ b/loader/include/Geode/platform/platform.hpp @@ -158,6 +158,20 @@ namespace geode { return "Undefined"; } + static constexpr char const* toShortString(Type lp, bool ignoreArch = false) { + switch (lp) { + case Unknown: return "unknown"; + case Windows: return "win"; + case MacOS: return "mac"; + case iOS: return "ios"; + case Android32: return ignoreArch ? "android" : "android32"; + case Android64: return ignoreArch ? "android" : "android64"; + case Linux: return "linux"; + default: break; + } + return "undefined"; + } + template requires requires(T t) { static_cast(t); diff --git a/loader/src/loader/ModMetadataImpl.cpp b/loader/src/loader/ModMetadataImpl.cpp index c9eee2cd..0fa359f8 100644 --- a/loader/src/loader/ModMetadataImpl.cpp +++ b/loader/src/loader/ModMetadataImpl.cpp @@ -181,18 +181,7 @@ Result ModMetadata::Impl::create(ModJson const& json) { if (json["gd"].is_string()) { ver = json["gd"].as_string(); } else if (json["gd"].is_object()) { - std::string key; - switch (GEODE_PLATFORM_TARGET) { - case PlatformID::Android32: - case PlatformID::Android64: - key = "android"; break; - case PlatformID::MacOS: - key = "mac"; break; - case PlatformID::Windows: - key = "win"; break; - case PlatformID::iOS: - key = "ios"; break; - } + auto key = PlatformID::toShortString(GEODE_PLATFORM_TARGET, true); if (json["gd"].contains(key)) ver = json["gd"][ver].as_string(); } else { diff --git a/loader/src/utils/PlatformID.cpp b/loader/src/utils/PlatformID.cpp index 034e766d..b05019ea 100644 --- a/loader/src/utils/PlatformID.cpp +++ b/loader/src/utils/PlatformID.cpp @@ -6,14 +6,25 @@ using namespace geode::prelude; PlatformID PlatformID::from(const char* str) { switch (hash(str)) { - default: - case hash("unknown"): return PlatformID::Unknown; + case hash("win"): + case hash("Windows"): case hash("windows"): return PlatformID::Windows; + + case hash("mac"): + case hash("MacOS"): case hash("macos"): return PlatformID::MacOS; + + case hash("iOS"): case hash("ios"): return PlatformID::iOS; + + case hash("Android32"): case hash("android32"): return PlatformID::Android32; + case hash("Android64"): case hash("android64"): return PlatformID::Android64; + + case hash("Linux"): case hash("linux"): return PlatformID::Linux; + default: return PlatformID::Unknown; } } From 562e73d610ae67025aeb6dfc7f97b922f7cf3064 Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:25:47 -0300 Subject: [PATCH 2/6] redo logic for mod target gd version it was busted idk what i was on when i wrote it, it wouldnt be able to load anything newer than the geode gd version --- loader/src/loader/ModMetadataImpl.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/loader/src/loader/ModMetadataImpl.cpp b/loader/src/loader/ModMetadataImpl.cpp index 0fa359f8..7ee57e55 100644 --- a/loader/src/loader/ModMetadataImpl.cpp +++ b/loader/src/loader/ModMetadataImpl.cpp @@ -8,6 +8,7 @@ #include #include "ModMetadataImpl.hpp" +#include "LoaderImpl.hpp" using namespace geode::prelude; @@ -190,8 +191,24 @@ Result ModMetadata::Impl::create(ModJson const& json) { if (ver.empty()) { return Err("[mod.json] could not find GD version for current platform"); } - if (ver != "*" && ver != GEODE_STR(GEODE_GD_VERSION)) { - return Err(fmt::format("[mod.json] doesn't support this GD version ({} != {})", ver, GEODE_STR(GEODE_GD_VERSION))); + if (ver != "*") { + // probably a bad idea but oh well + float modTargetVer; + try { + // assume gd version is always a valid float + modTargetVer = std::stof(ver); + } catch (...) { + return Err("[mod.json] has invalid target GD version"); + } + if (LoaderImpl::get()->isForwardCompatMode()) { + // this means current gd version is > GEODE_GD_VERSION + if (modTargetVer <= GEODE_GD_VERSION) { + return Err(fmt::format("[mod.json] doesn't support this GD version ({} < current version)", ver)); + } + } else if (modTargetVer != GEODE_GD_VERSION) { + // we are not in forward compat mode, so GEODE_GD_VERSION is the current gd version + return Err(fmt::format("[mod.json] doesn't support this GD version ({} != {})", ver, GEODE_STR(GEODE_GD_VERSION))); + } } } else { return Err("[mod.json] is missing target GD version"); From a0515fad26537c71cfd9a9fb970562303da96ad0 Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 10:45:04 -0300 Subject: [PATCH 3/6] still load game if geode is newer --- loader/src/platform/windows/main.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/loader/src/platform/windows/main.cpp b/loader/src/platform/windows/main.cpp index e369a6eb..ddd4f16d 100644 --- a/loader/src/platform/windows/main.cpp +++ b/loader/src/platform/windows/main.cpp @@ -42,19 +42,18 @@ int WINAPI gdMainHook(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd "Unable to Load Geode!", fmt::format( "This version of Geode is made for Geometry Dash {} " - "but you're trying to play with GD {}." + "but you're trying to play with GD {}.\n" "Please, update your game or install an older version of Geode.", GEODE_STR(GEODE_GD_VERSION), LoaderImpl::get()->getGameVersion() ) ); - return 2; + } else { + int exitCode = geodeEntry(hInstance); + if (exitCode != 0) + return exitCode; } - int exitCode = geodeEntry(hInstance); - if (exitCode != 0) - return exitCode; - return reinterpret_cast(mainTrampolineAddr)(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } From 25dc6eea5b5ae04183c90cf6e0d41214426a21ab Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:47:07 -0300 Subject: [PATCH 4/6] ok so float was not precise enough --- loader/src/loader/ModMetadataImpl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/loader/src/loader/ModMetadataImpl.cpp b/loader/src/loader/ModMetadataImpl.cpp index 7ee57e55..b3e7c7e8 100644 --- a/loader/src/loader/ModMetadataImpl.cpp +++ b/loader/src/loader/ModMetadataImpl.cpp @@ -193,10 +193,10 @@ Result ModMetadata::Impl::create(ModJson const& json) { } if (ver != "*") { // probably a bad idea but oh well - float modTargetVer; + double modTargetVer; try { - // assume gd version is always a valid float - modTargetVer = std::stof(ver); + // assume gd version is always a valid double + modTargetVer = std::stod(ver); } catch (...) { return Err("[mod.json] has invalid target GD version"); } @@ -205,7 +205,7 @@ Result ModMetadata::Impl::create(ModJson const& json) { if (modTargetVer <= GEODE_GD_VERSION) { return Err(fmt::format("[mod.json] doesn't support this GD version ({} < current version)", ver)); } - } else if (modTargetVer != GEODE_GD_VERSION) { + } else if (ver != GEODE_STR(GEODE_GD_VERSION)) { // we are not in forward compat mode, so GEODE_GD_VERSION is the current gd version return Err(fmt::format("[mod.json] doesn't support this GD version ({} != {})", ver, GEODE_STR(GEODE_GD_VERSION))); } From acd9bd78840eab114096d738218e918b3080f0d5 Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:35:18 -0300 Subject: [PATCH 5/6] load native binaries from mod resources/binaries/getID() == "absolllute.megahack") - log::debug("megahack creepypasta"); - for (auto const& dep : node->m_impl->m_dependants) { m_modsToLoad.push_front(dep); } diff --git a/loader/src/loader/LoaderImpl.hpp b/loader/src/loader/LoaderImpl.hpp index f3810aa4..2f6ab2d0 100644 --- a/loader/src/loader/LoaderImpl.hpp +++ b/loader/src/loader/LoaderImpl.hpp @@ -83,6 +83,7 @@ namespace geode { void updateModResources(Mod* mod); void addSearchPaths(); + void addNativeBinariesPath(ghc::filesystem::path const& path); Result<> setup(); void forceReset(); diff --git a/loader/src/loader/ModImpl.cpp b/loader/src/loader/ModImpl.cpp index 9d5db133..5ad862ff 100644 --- a/loader/src/loader/ModImpl.cpp +++ b/loader/src/loader/ModImpl.cpp @@ -46,8 +46,13 @@ Result<> Mod::Impl::setup() { } if (!m_resourcesLoaded) { auto searchPathRoot = dirs::getModRuntimeDir() / m_metadata.getID() / "resources"; + // TODO: why is this commented out // CCFileUtils::get()->addSearchPath(searchPathRoot.string().c_str()); + const auto binariesDir = searchPathRoot / m_metadata.getID() / "binaries" / PlatformID::toShortString(GEODE_PLATFORM_TARGET); + if (ghc::filesystem::exists(binariesDir)) + LoaderImpl::get()->addNativeBinariesPath(binariesDir); + m_resourcesLoaded = true; } diff --git a/loader/src/platform/android/LoaderImpl.cpp b/loader/src/platform/android/LoaderImpl.cpp index c4b08e84..25b111f1 100644 --- a/loader/src/platform/android/LoaderImpl.cpp +++ b/loader/src/platform/android/LoaderImpl.cpp @@ -32,3 +32,7 @@ std::string Loader::Impl::getGameVersion() { bool Loader::Impl::userTriedToLoadDLLs() const { return false; } + +void Loader::Impl::addNativeBinariesPath(ghc::filesystem::path const& path) { + log::warn("LoaderImpl::addNativeBinariesPath not implement on this platform, not adding path {}", path.string()); +} diff --git a/loader/src/platform/mac/LoaderImpl.mm b/loader/src/platform/mac/LoaderImpl.mm index 27e08b40..706134ab 100644 --- a/loader/src/platform/mac/LoaderImpl.mm +++ b/loader/src/platform/mac/LoaderImpl.mm @@ -135,3 +135,8 @@ void Loader::Impl::setupIPC() { bool Loader::Impl::userTriedToLoadDLLs() const { return false; } + +void Loader::Impl::addNativeBinariesPath(ghc::filesystem::path const& path) { + log::warn("LoaderImpl::addNativeBinariesPath not implement on this platform, not adding path {}", path.string()); +} + diff --git a/loader/src/platform/windows/LoaderImpl.cpp b/loader/src/platform/windows/LoaderImpl.cpp index 2b432eb2..a8658de6 100644 --- a/loader/src/platform/windows/LoaderImpl.cpp +++ b/loader/src/platform/windows/LoaderImpl.cpp @@ -74,3 +74,8 @@ bool Loader::Impl::userTriedToLoadDLLs() const { return triedToLoadDLLs; } + +void Loader::Impl::addNativeBinariesPath(ghc::filesystem::path const& path) { + // adds a search directory for native dlls (the name is misleading) + SetDllDirectoryW(path.wstring().c_str()); +} From 5bb386417d027606798cd7c7b7300f4a4b1d484a Mon Sep 17 00:00:00 2001 From: matcool <26722564+matcool@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:43:33 -0300 Subject: [PATCH 6/6] use AddDllDirectory instead --- loader/src/platform/windows/LoaderImpl.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/loader/src/platform/windows/LoaderImpl.cpp b/loader/src/platform/windows/LoaderImpl.cpp index a8658de6..16c16bdf 100644 --- a/loader/src/platform/windows/LoaderImpl.cpp +++ b/loader/src/platform/windows/LoaderImpl.cpp @@ -76,6 +76,10 @@ bool Loader::Impl::userTriedToLoadDLLs() const { } void Loader::Impl::addNativeBinariesPath(ghc::filesystem::path const& path) { - // adds a search directory for native dlls (the name is misleading) - SetDllDirectoryW(path.wstring().c_str()); + // https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-adddlldirectory#remarks + static auto runOnce = [] { + SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); + return 0; + }(); + AddDllDirectory(path.wstring().c_str()); }