diff --git a/app/src/main/cpp/GakumasLocalify/Hook.cpp b/app/src/main/cpp/GakumasLocalify/Hook.cpp index 688babc..34852ef 100644 --- a/app/src/main/cpp/GakumasLocalify/Hook.cpp +++ b/app/src/main/cpp/GakumasLocalify/Hook.cpp @@ -98,7 +98,7 @@ namespace GakumasLocal::HookMain { UnityResolve::UnityType::Transform* cameraTransformCache = nullptr; void CheckAndUpdateMainCamera() { if (!Config::enableFreeCamera) return; - if (IsNativeObjectAlive(mainCameraCache)) return; + if (IsNativeObjectAlive(mainCameraCache) && IsNativeObjectAlive(cameraTransformCache)) return; mainCameraCache = UnityResolve::UnityType::Camera::GetMain(); cameraTransformCache = mainCameraCache->GetTransform(); diff --git a/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp b/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp index c2f24ac..02c01d8 100644 --- a/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp +++ b/app/src/main/cpp/deps/UnityResolve/UnityResolve.hpp @@ -619,9 +619,27 @@ private: } } + static auto GetPClassFromUnknownNamespace(void* image, const char* klassName) -> void* { + const auto count = Invoke("il2cpp_image_get_class_count", image); + for (auto i = 0; i < count; i++) { + const auto pClass = Invoke("il2cpp_image_get_class", image, i); + const auto className = Invoke("il2cpp_class_get_name", pClass); + if (strcmp(className, klassName) == 0) { + return pClass; + } + } + return nullptr; + } + static auto FillClass_Il2ccpp(Assembly* assembly, const char* namespaze, const char* klassName) -> Class* { auto image = Invoke("il2cpp_assembly_get_image", assembly->address); - const auto pClass = Invoke("il2cpp_class_from_name", image, namespaze, klassName); + void* pClass; + if (strcmp(namespaze, "*") == 0) { + pClass = GetPClassFromUnknownNamespace(image, klassName); + } + else { + pClass = Invoke("il2cpp_class_from_name", image, namespaze, klassName); + } if (pClass == nullptr) return nullptr; const auto pAClass = new Class(); pAClass->address = pClass;