From 573bfb870a14a95df9a7e0267c30b2c3ee0f79a3 Mon Sep 17 00:00:00 2001
From: chinosk <2248589280@qq.com>
Date: Fri, 5 Jul 2024 23:53:41 +0800
Subject: [PATCH] fix: lazy initializing - can't get class from `*` namespace

---
 app/src/main/cpp/GakumasLocalify/Hook.cpp     |  2 +-
 .../cpp/deps/UnityResolve/UnityResolve.hpp    | 20 ++++++++++++++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

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<int>("il2cpp_image_get_class_count", image);
+        for (auto i = 0; i < count; i++) {
+            const auto pClass = Invoke<void*>("il2cpp_image_get_class", image, i);
+            const auto className = Invoke<const char*>("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<void*>("il2cpp_assembly_get_image", assembly->address);
-        const auto pClass = Invoke<void*>("il2cpp_class_from_name", image, namespaze, klassName);
+        void* pClass;
+        if (strcmp(namespaze, "*") == 0) {
+            pClass = GetPClassFromUnknownNamespace(image, klassName);
+        }
+        else {
+            pClass = Invoke<void*>("il2cpp_class_from_name", image, namespaze, klassName);
+        }
         if (pClass == nullptr) return nullptr;
         const auto pAClass = new Class();
         pAClass->address = pClass;