diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 5af65873..46f8fcdb 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -132,7 +132,7 @@ CPMAddPackage("gh:mity/md4c#e9ff661") target_include_directories(${PROJECT_NAME} PRIVATE ${md4c_SOURCE_DIR}/src) # Tulip hook (hooking) -CPMAddPackage("gh:altalk23/TulipHook#92b3cca") +CPMAddPackage("gh:altalk23/TulipHook#5ba99a8") target_link_libraries(${PROJECT_NAME} md4c z TulipHook geode-sdk) @@ -143,7 +143,6 @@ target_precompile_headers(${PROJECT_NAME} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/Loader.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/UI.hpp" # "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/Bindings.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/Modify.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/cocos/include/cocos2d.h" "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/cocos/extensions/cocos-ext.h" ) diff --git a/loader/include/Geode/modify/Modify.hpp b/loader/include/Geode/modify/Modify.hpp index d182ffa1..b6c341be 100644 --- a/loader/include/Geode/modify/Modify.hpp +++ b/loader/include/Geode/modify/Modify.hpp @@ -12,7 +12,7 @@ #include #define GEODE_APPLY_MODIFY_FOR_FUNCTION(addr_index, pure_index, convention, className, functionName) \ - { \ + do { \ using DerivedWrap = wrap::functionName; \ using BaseWrap = wrap::functionName; \ if constexpr (DerivedWrap::uuid != nullptr && (void*)BaseWrap::uuid != (void*)DerivedWrap::uuid) { \ @@ -22,9 +22,9 @@ DerivedWrap::value, \ #className "::" #functionName \ ); \ - BaseModify::m_hooks[FunctionUUID::value] = hook; \ + this->m_hooks[#className "::" #functionName] = hook; \ } \ - } + } while (0); namespace geode::modifier { @@ -34,25 +34,25 @@ namespace geode::modifier { template class ModifyBase { public: - std::map m_hooks; + std::map m_hooks; - template - Result getHook() { - auto uuid = FunctionUUID::value; - if (m_hooks.find(uuid) == m_hooks.end()) { + Result getHook(std::string const& name) { + if (m_hooks.find(name) == m_hooks.end()) { return Err("Hook not in this modify"); } - return m_hooks[uuid]; + return Ok(m_hooks[name]); } // unordered_map idea ModifyBase() { - this->apply(); + // i really dont want to recompile codegen + auto test = static_cast(this); + test->ModifyDerived::apply(); ModifyDerived::Derived::onModify(*this); for (auto& [uuid, hook] : m_hooks) { auto res = Mod::get()->addHook(hook); if (!res) { - log::error("Failed to add hook: {}", res.error()); + log::error("Failed to add hook {}: {}", hook->getDisplayName(), res.error()); } } } diff --git a/loader/src/loader/HookImpl.cpp b/loader/src/loader/HookImpl.cpp index cbb856f3..c2945fce 100644 --- a/loader/src/loader/HookImpl.cpp +++ b/loader/src/loader/HookImpl.cpp @@ -7,7 +7,9 @@ Hook::Impl::Impl(void* address, void* detour, std::string const& displayName, tu m_displayName(displayName), m_handlerMetadata(handlerMetadata), m_hookMetadata(hookMetadata), - m_owner(owner) {} + m_owner(owner), + m_enabled(false), + m_autoEnable(true) {} Hook::Impl::~Impl() { if (m_enabled) { auto res = this->disable(); @@ -46,11 +48,10 @@ Result<> Hook::Impl::enable() { if (!LoaderImpl::get()->hasHandler(m_address)) { GEODE_UNWRAP(LoaderImpl::get()->createHandler(m_address, m_handlerMetadata)); } - GEODE_UNWRAP_INTO(auto handler, LoaderImpl::get()->getHandler(m_address)); m_handle = tulip::hook::createHook(handler, m_detour, m_hookMetadata); - log::debug("Enabling hook at function {}", m_displayName); + log::debug("Enabling hook at function {} with address {}", m_displayName, m_address); m_enabled = true; } return Ok(); diff --git a/loader/src/loader/Mod.cpp b/loader/src/loader/Mod.cpp index 2de8c682..dd2a009f 100644 --- a/loader/src/loader/Mod.cpp +++ b/loader/src/loader/Mod.cpp @@ -409,9 +409,12 @@ bool Mod::depends(std::string const& id) const { // Hooks Result<> Mod::enableHook(Hook* hook) { - log::debug("Enabling hook {} for mod {}", (void*)hook, m_info.id); + log::debug("Enabling hook {} for mod {} at address {}", (void*)hook, m_info.id, (void*)hook->getAddress()); auto res = hook->enable(); if (res) m_hooks.push_back(hook); + else { + log::error("Can't enable hook {} for mod {}: {}", (void*)hook, m_info.id, res.unwrapErr()); + } return res; } diff --git a/loader/src/main.cpp b/loader/src/main.cpp index 0099ed62..8963c1d9 100644 --- a/loader/src/main.cpp +++ b/loader/src/main.cpp @@ -172,9 +172,9 @@ int geodeEntry(void* platformData) { log::debug("Set up loader"); - if (InternalMod::get()->getSettingValue("show-platform-console")) { - Loader::get()->openPlatformConsole(); - } + // if (InternalMod::get()->getSettingValue("show-platform-console")) { + // Loader::get()->openPlatformConsole(); + // } log::debug("Entry done.");