geode/loader/src/hooks/DynamicCastFix.cpp

24 lines
828 B
C++
Raw Normal View History

#include <Geode/DefaultInclude.hpp>
2023-10-02 09:50:10 -04:00
#include <Geode/loader/Mod.hpp>
using namespace geode::prelude;
$execute {
// this replaces the call to __dynamic_cast with a call to our own
// this is needed because the transitions in cocos uses dynamic cast to check
// layers, which fail on user layers due to typeinfo not matching
2023-10-02 09:50:10 -04:00
#if defined(GEODE_IS_MACOS)
(void)Mod::get()->patch(
reinterpret_cast<void*>(base::get() + 0x603948), toByteArray(&cast::typeinfoCastInternal)
);
#elif defined(GEODE_IS_ANDROID)
void* handle = dlopen("libcocos2dcpp.so", RTLD_LAZY | RTLD_NOLOAD);
void* dynamicCastAddr = dlsym(handle, "__dynamic_cast");
2023-10-02 09:50:10 -04:00
(void)Mod::get()->hook(dynamicCastAddr, &cast::typeinfoCastInternal, "__dynamic_cast");
2023-10-02 09:50:10 -04:00
dlclose(handle);
2023-10-02 09:50:10 -04:00
#endif
2024-01-14 16:47:02 -05:00
}