From 8e00cada9e7dcdba451a53b15103132319a3591c Mon Sep 17 00:00:00 2001 From: kodenamekrak Date: Wed, 30 Jul 2025 04:15:34 +0100 Subject: [PATCH 1/8] Update dependencies --- CMakeLists.txt | 2 +- qpm.json | 4 +- qpm.shared.json | 102 +++++++++++++++++++++++++----------------------- 3 files changed, 56 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a7cc5c..0663cca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ add_compile_definitions(MOD_ID=\"${MOD_ID}\") # TODO: Implement more robustly add_compile_definitions(VERSION_LONG=1) add_compile_definitions(NEED_UNSAFE_CSHARP) -add_compile_definitions(UNITY_2021) +add_compile_definitions(UNITY_6) add_compile_definitions(NO_VERBOSE_LOGS) # For performing debug logging of very hard to diagnose issues if (NOT DEFINED LOCAL_TEST) diff --git a/qpm.json b/qpm.json index 5c9866c..31bab1f 100644 --- a/qpm.json +++ b/qpm.json @@ -6,7 +6,7 @@ "info": { "name": "custom-types", "id": "custom-types", - "version": "0.18.0", + "version": "0.19.0", "url": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching", "additionalData": { "overrideSoName": "libcustom-types.so", @@ -43,7 +43,7 @@ "dependencies": [ { "id": "beatsaber-hook", - "versionRange": "^6.2.0", + "versionRange": "^7.0.0", "additionalData": {} }, { diff --git a/qpm.shared.json b/qpm.shared.json index cdb97ee..4734b89 100644 --- a/qpm.shared.json +++ b/qpm.shared.json @@ -7,7 +7,7 @@ "info": { "name": "custom-types", "id": "custom-types", - "version": "0.18.0", + "version": "0.19.0", "url": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching", "additionalData": { "overrideSoName": "libcustom-types.so", @@ -44,7 +44,7 @@ "dependencies": [ { "id": "beatsaber-hook", - "versionRange": "^6.2.0", + "versionRange": "^7.0.0", "additionalData": {} }, { @@ -64,97 +64,101 @@ "restoredDependencies": [ { "dependency": { - "id": "paper2_scotland2", - "versionRange": "=4.4.0", + "id": "fmt", + "versionRange": "=11.0.2", "additionalData": { - "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.4.0/libpaper2_scotland2.so", - "overrideSoName": "libpaper2_scotland2.so", - "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.4.0/paper2_scotland2.qmod", - "branchName": "version/v4_4_0", + "headersOnly": true, + "branchName": "version/v11_0_2", "compileOptions": { "systemIncludes": [ - "shared/utfcpp/source" + "fmt/include/" + ], + "cppFlags": [ + "-DFMT_HEADER_ONLY" ] - }, - "cmake": false + } } }, - "version": "4.4.0" + "version": "11.0.2" }, { "dependency": { - "id": "libil2cpp", - "versionRange": "=0.4.0", + "id": "capstone", + "versionRange": "=0.1.0", "additionalData": { - "headersOnly": true, - "compileOptions": { - "systemIncludes": [ - "il2cpp/external/baselib/Include", - "il2cpp/external/baselib/Platforms/Android/Include" - ] - } + "staticLinking": true, + "soLink": "https://github.com/sc2ad/capstone-qpm/releases/download/v0.1.0/libcapstone.a", + "overrideSoName": "libcapstone.a" } }, - "version": "0.4.0" + "version": "0.1.0" }, { "dependency": { "id": "beatsaber-hook", - "versionRange": "=6.3.0", + "versionRange": "=7.0.0", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.3.0/libbeatsaber-hook.so", - "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.3.0/debug_libbeatsaber-hook.so", + "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v5.0.0/libbeatsaber-hook.so", + "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v5.0.0/debug_libbeatsaber-hook.so", "overrideSoName": "libbeatsaber-hook.so", - "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.3.0/beatsaber-hook.qmod", - "branchName": "version/v6_3_0", + "branchName": "master", + "compileOptions": { + "cppFlags": [ + "-Wno-extra-qualification" + ] + }, "cmake": true } }, - "version": "6.3.0" + "version": "7.0.0" }, { "dependency": { - "id": "scotland2", - "versionRange": "=0.1.6", + "id": "paper2_scotland2", + "versionRange": "=4.6.4", "additionalData": { - "soLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.6/libsl2.so", - "debugSoLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.6/debug_libsl2.so", - "overrideSoName": "libsl2.so", - "branchName": "version/v0_1_6" + "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/libpaper2_scotland2.so", + "overrideSoName": "libpaper2_scotland2.so", + "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/paper2_scotland2.qmod", + "branchName": "version/v4_6_4", + "compileOptions": { + "systemIncludes": [ + "shared/utfcpp/source" + ] + }, + "cmake": false } }, - "version": "0.1.6" + "version": "4.6.4" }, { "dependency": { - "id": "fmt", - "versionRange": "=11.0.2", + "id": "libil2cpp", + "versionRange": "=0.5.0", "additionalData": { "headersOnly": true, - "branchName": "version/v11_0_2", "compileOptions": { "systemIncludes": [ - "fmt/include/" - ], - "cppFlags": [ - "-DFMT_HEADER_ONLY" + "il2cpp/external/baselib/Include", + "il2cpp/external/baselib/Platforms/Android/Include" ] } } }, - "version": "11.0.2" + "version": "0.5.0" }, { "dependency": { - "id": "capstone", - "versionRange": "=0.1.0", + "id": "scotland2", + "versionRange": "=0.1.6", "additionalData": { - "staticLinking": true, - "soLink": "https://github.com/sc2ad/capstone-qpm/releases/download/v0.1.0/libcapstone.a", - "overrideSoName": "libcapstone.a" + "soLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.6/libsl2.so", + "debugSoLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.6/debug_libsl2.so", + "overrideSoName": "libsl2.so", + "branchName": "version/v0_1_6" } }, - "version": "0.1.0" + "version": "0.1.6" } ] } \ No newline at end of file From 5cbeaac87065591bf868eb2ee0c1e076a9516387 Mon Sep 17 00:00:00 2001 From: kodenamekrak Date: Wed, 30 Jul 2025 04:18:36 +0100 Subject: [PATCH 2/8] Remove unity 2019 warning --- src/register.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/register.cpp b/src/register.cpp index 5e5925e..5c01b7e 100644 --- a/src/register.cpp +++ b/src/register.cpp @@ -175,9 +175,6 @@ MAKE_HOOK(GetScriptingClass, nullptr, Il2CppClass*, void* thisptr, char* assembl } #ifdef CT_USE_GCDESCRIPTOR_DEBUG -#ifndef UNITY_2019 -#warning "Hey, this probably only works for 2019 unity, so be careful." -#endif #ifdef LOCAL_TEST #warning "Hey, you shouldn't use LOCAL_TEST while building with CT_USE_GCDESCRIPTOR_DEBUG!" From 457fd7f0b402538ed89afebafe67fb172481e925 Mon Sep 17 00:00:00 2001 From: kodenamekrak Date: Wed, 30 Jul 2025 04:19:44 +0100 Subject: [PATCH 3/8] Use hard offset for GetScriptingClass hook --- src/register.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/register.cpp b/src/register.cpp index 5c01b7e..6046fa2 100644 --- a/src/register.cpp +++ b/src/register.cpp @@ -608,7 +608,9 @@ void Register::EnsureHooks() { INSTALL_HOOK_DIRECT(logger, GlobalMetadata_GetTypeInfoFromHandle, (void*)il2cpp_functions::il2cpp_GlobalMetadata_GetTypeInfoFromHandle); INSTALL_HOOK_DIRECT(logger, GlobalMetadata_GetTypeInfoFromTypeDefinitionIndex, (void*)il2cpp_functions::il2cpp_GlobalMetadata_GetTypeInfoFromTypeDefinitionIndex); INSTALL_HOOK_DIRECT(logger, Class_Init, (void*)il2cpp_functions::il2cpp_Class_Init); - uintptr_t GetScriptingClassAddr = findPattern(baseAddr("libunity.so"), "ff 43 02 d1 fe 23 00 f9 fa 67 05 a9 f8 5f 06 a9 f6 57 07 a9 f4 4f 08 a9 57 d0 3b d5 e8 16 40 f9 f6 03 01 aa"); + + const uintptr_t kGetScriptingClassOffset = 0xa66928; + uintptr_t GetScriptingClassAddr = baseAddr("libunity.so") + kGetScriptingClassOffset; INSTALL_HOOK_DIRECT(logger, GetScriptingClass, reinterpret_cast(GetScriptingClassAddr)); // get the location of Type::GetClassOrElementClass From 41989f6a01a3fa0a44d5b696d03aab74b5c5901c Mon Sep 17 00:00:00 2001 From: Kye Lodge Date: Sat, 6 Dec 2025 22:17:17 +0000 Subject: [PATCH 4/8] Fix tests --- src/test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index 078567f..e99ff45 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -210,7 +210,7 @@ MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(MainMenuViewController_DidActivate, "", "Ma logger.debug("MainMenuViewController.DidActivate!"); MainMenuViewController_DidActivate(self, firstActivation, addedToHierarchy, screenSystemEnabling); logger.debug("Getting GO..."); - auto* go = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue(self, "gameObject").value_or(nullptr)); + auto* go = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue(self, "gameObject").into_optional_result().value_or(nullptr)); logger.debug("Got GO: {}", fmt::ptr(go)); custom_types::logAll(classof(Il2CppNamespace::MyType*)); custom_types::logAll(classof(Il2CppNamespace::MyType*)->parent); @@ -218,7 +218,7 @@ MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(MainMenuViewController_DidActivate, "", "Ma logger.debug("Custom System.Type: {}", fmt::ptr(customType)); auto strType = RET_V_UNLESS(logger, il2cpp_utils::RunMethodOpt(customType, "ToString")); logger.debug("ToString: {}", strType); - auto name = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue(customType, "Name")); + auto name = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue(customType, "Name").into_optional_result()); logger.debug("Name: {}", name); logger.debug("Actual type: {}", fmt::ptr(&custom_types::Register::classes[0]->byval_arg)); logger.debug("Type: {}", fmt::ptr(customType->type)); @@ -256,7 +256,7 @@ MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(BeatmapLevelModels_UpdateAllLoadedBeatmapLe BeatmapLevelModels_UpdateAllLoadedBeatmapLevelPacks(self); auto* existing = CRASH_UNLESS(il2cpp_utils::GetFieldValue(self, "_allLoadedBeatmapLevelPackCollection")); logger.debug("Existing: {}", fmt::ptr(existing)); - auto* arr = CRASH_UNLESS(il2cpp_utils::GetPropertyValue(existing, "beatmapLevelPacks")); + auto* arr = CRASH_UNLESS(il2cpp_utils::GetPropertyValue(existing, "beatmapLevelPacks").into_optional_result()); logger.debug("Existing arr: {}", fmt::ptr(arr)); logger.debug("Constructing custom type and setting it to field!"); // auto* myType = CRASH_UNLESS(il2cpp_utils::New(arr)); From 323a91e785b3fed44a5441d47c713cc215250f59 Mon Sep 17 00:00:00 2001 From: Kye Lodge Date: Sat, 6 Dec 2025 22:17:29 +0000 Subject: [PATCH 5/8] Add flamingo --- qpm.json | 5 ++++ qpm.shared.json | 68 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/qpm.json b/qpm.json index 31bab1f..4ea745a 100644 --- a/qpm.json +++ b/qpm.json @@ -57,6 +57,11 @@ "id": "paper2_scotland2", "versionRange": "^4.2.1", "additionalData": {} + }, + { + "id": "flamingo", + "versionRange": "^1.1.2", + "additionalData": {} } ] } \ No newline at end of file diff --git a/qpm.shared.json b/qpm.shared.json index 4734b89..cea9879 100644 --- a/qpm.shared.json +++ b/qpm.shared.json @@ -58,10 +58,34 @@ "id": "paper2_scotland2", "versionRange": "^4.2.1", "additionalData": {} + }, + { + "id": "flamingo", + "versionRange": "^1.1.2", + "additionalData": {} } ] }, "restoredDependencies": [ + { + "dependency": { + "id": "paper2_scotland2", + "versionRange": "=4.7.0", + "additionalData": { + "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.7.0/libpaper2_scotland2.so", + "overrideSoName": "libpaper2_scotland2.so", + "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.7.0/paper2_scotland2.qmod", + "branchName": "version/v4_7_0", + "compileOptions": { + "systemIncludes": [ + "shared/utfcpp/source" + ] + }, + "cmake": false + } + }, + "version": "4.7.0" + }, { "dependency": { "id": "fmt", @@ -96,12 +120,13 @@ { "dependency": { "id": "beatsaber-hook", - "versionRange": "=7.0.0", + "versionRange": "=7.3.0", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v5.0.0/libbeatsaber-hook.so", - "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v5.0.0/debug_libbeatsaber-hook.so", + "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/libbeatsaber-hook.so", + "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/debug_libbeatsaber-hook.so", "overrideSoName": "libbeatsaber-hook.so", - "branchName": "master", + "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/beatsaber-hook.qmod", + "branchName": "version/v7_3_0", "compileOptions": { "cppFlags": [ "-Wno-extra-qualification" @@ -110,26 +135,7 @@ "cmake": true } }, - "version": "7.0.0" - }, - { - "dependency": { - "id": "paper2_scotland2", - "versionRange": "=4.6.4", - "additionalData": { - "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/libpaper2_scotland2.so", - "overrideSoName": "libpaper2_scotland2.so", - "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/paper2_scotland2.qmod", - "branchName": "version/v4_6_4", - "compileOptions": { - "systemIncludes": [ - "shared/utfcpp/source" - ] - }, - "cmake": false - } - }, - "version": "4.6.4" + "version": "7.3.0" }, { "dependency": { @@ -147,6 +153,20 @@ }, "version": "0.5.0" }, + { + "dependency": { + "id": "flamingo", + "versionRange": "=1.1.2", + "additionalData": { + "soLink": "https://github.com/sc2ad/Flamingo/releases/download/v1.1.2/libflamingo.so", + "debugSoLink": "https://github.com/sc2ad/Flamingo/releases/download/v1.1.2/debug_libflamingo.so", + "overrideSoName": "libflamingo.so", + "modLink": "https://github.com/sc2ad/Flamingo/releases/download/v1.1.2/flamingo.qmod", + "branchName": "version/v1_1_2" + } + }, + "version": "1.1.2" + }, { "dependency": { "id": "scotland2", From 9aa59aed9db8251a2a189575f429ce747a3675eb Mon Sep 17 00:00:00 2001 From: Kye Lodge Date: Sun, 7 Dec 2025 13:33:13 +0000 Subject: [PATCH 6/8] Remove static fields --- src/test.cpp | 2 +- src/test_small.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index e99ff45..b3d8929 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -34,7 +34,7 @@ DECLARE_CLASS(Il2CppNamespace, MyType, "UnityEngine", "MonoBehaviour", sizeof(Il DECLARE_INSTANCE_METHOD(int, asdf, int q); - DECLARE_STATIC_FIELD(int, x); + // DECLARE_STATIC_FIELD(int, x); DECLARE_OVERRIDE_METHOD(Il2CppString*, ToString, il2cpp_utils::FindMethod("UnityEngine", "Object", "ToString")); }; diff --git a/src/test_small.cpp b/src/test_small.cpp index 1a18904..1d7fa44 100644 --- a/src/test_small.cpp +++ b/src/test_small.cpp @@ -2,7 +2,7 @@ #include "macros.hpp" DECLARE_CLASS(Custom, Tester, "System", "Object", sizeof(Il2CppObject)) { - DECLARE_STATIC_FIELD(int, x); + // DECLARE_STATIC_FIELD(int, x); DECLARE_INSTANCE_FIELD_DEFAULT(float, z, 3.0f); DECLARE_INSTANCE_METHOD(bool, test, int arg1, int arg2); // bool test(int arg1, int arg2); From f6b711b9fbdf9d6819885953933d6bf4db03f0cd Mon Sep 17 00:00:00 2001 From: Kye Lodge Date: Sun, 7 Dec 2025 13:34:27 +0000 Subject: [PATCH 7/8] Update interface test --- src/test.cpp | 63 +++++++++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/src/test.cpp b/src/test.cpp index b3d8929..b559ae8 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -89,36 +89,36 @@ void Il2CppNamespace::MyTypeDllTest::ctor() { custom_types::logImage(classof(MyTypeDllTest*)->image); } -DECLARE_CLASS_INTERFACES(Il2CppNamespace, MyCustomBeatmapLevelPackCollection, "System", "Object", sizeof(Il2CppObject), INTERFACE_NAME("", "IBeatmapLevelPackCollection")) { - DECLARE_INSTANCE_FIELD(Il2CppArray*, wrappedArr); +DECLARE_CLASS_INTERFACES(Il2CppNamespace, MyCustomRandom, "System", "Object", sizeof(Il2CppObject), INTERFACE_NAME("", "IRandom")) { + DECLARE_INSTANCE_FIELD(double, fixedValue); - DECLARE_OVERRIDE_METHOD(Il2CppArray*, get_beatmapLevelPacks, il2cpp_utils::FindMethod("", "IBeatmapLevelPackCollection", "get_beatmapLevelPacks")); - DECLARE_CTOR(ctor, Il2CppArray* originalArray); + DECLARE_OVERRIDE_METHOD(double, Sample, il2cpp_utils::FindMethod("", "IRandom", "Sample")); + DECLARE_CTOR(ctor, double value); }; -DEFINE_TYPE(Il2CppNamespace, MyCustomBeatmapLevelPackCollection); +DEFINE_TYPE(Il2CppNamespace, MyCustomRandom); -void Il2CppNamespace::MyCustomBeatmapLevelPackCollection::ctor(Il2CppArray* originalArray) { +void Il2CppNamespace::MyCustomRandom::ctor(double value) { // We want to basically wrap the original instance. // Also log. - wrappedArr = originalArray; - logger.debug("Added original array: {}", fmt::ptr(originalArray)); + fixedValue = value; + logger.debug("Created random with value: {}", fixedValue);; } -Il2CppArray* Il2CppNamespace::MyCustomBeatmapLevelPackCollection::get_beatmapLevelPacks() { - logger.debug("My cool getter wrappedArr: {}!", fmt::ptr(wrappedArr)); - return wrappedArr; +double Il2CppNamespace::MyCustomRandom::Sample() { + logger.debug("My cool sample fixedValue: {}!", fixedValue); + return fixedValue; } -DECLARE_CLASS_CUSTOM(Il2CppNamespace, MyCustomBeatmapCollection2, Il2CppNamespace::MyCustomBeatmapLevelPackCollection) { - DECLARE_CTOR(ctor, Il2CppArray* originalArray); +DECLARE_CLASS_CUSTOM(Il2CppNamespace, MyCustomRandom2, Il2CppNamespace::MyCustomRandom) { + DECLARE_CTOR(ctor, double original); }; -DEFINE_TYPE(Il2CppNamespace, MyCustomBeatmapCollection2); +DEFINE_TYPE(Il2CppNamespace, MyCustomRandom2); -void Il2CppNamespace::MyCustomBeatmapCollection2::ctor(Il2CppArray* originalArray) { - wrappedArr = originalArray; - logger.debug("Custom inherited type original array: {}", fmt::ptr(originalArray)); +void Il2CppNamespace::MyCustomRandom2::ctor(double original) { + fixedValue = original; + logger.debug("Custom inherited type original: {}", original); } // TODO: Self references still do not work! @@ -209,6 +209,17 @@ MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(MainMenuViewController_DidActivate, "", "Ma bool screenSystemEnabling) { logger.debug("MainMenuViewController.DidActivate!"); MainMenuViewController_DidActivate(self, firstActivation, addedToHierarchy, screenSystemEnabling); + + logger.debug("Creating random..."); + auto* rand = Il2CppNamespace::MyCustomRandom::New_ctor(1.23456789); + logger.debug("Created random: {}", fmt::ptr(rand)); + custom_types::logAll(classof(Il2CppNamespace::MyCustomRandom*)); + auto* method = RET_V_UNLESS(logger, il2cpp_utils::ResolveVtableSlot(::il2cpp_utils::il2cpp_type_check::il2cpp_no_arg_class::get(), + il2cpp_utils::GetClassFromName("", "IRandom"), 0)); + logger.debug("Found IRandom.Sample MethodInfo at {}", fmt::ptr(method)); + auto num = RET_V_UNLESS(logger, il2cpp_utils::RunMethod(rand, method).into_optional_result()); + logger.debug("Sample method returned {}", num); + logger.debug("Getting GO..."); auto* go = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue(self, "gameObject").into_optional_result().value_or(nullptr)); logger.debug("Got GO: {}", fmt::ptr(go)); @@ -252,30 +263,12 @@ MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(MainMenuViewController_DidActivate, "", "Ma // } // } -MAKE_HOOK_FIND_CLASS_UNSAFE_INSTANCE(BeatmapLevelModels_UpdateAllLoadedBeatmapLevelPacks, "", "BeatmapLevelModels", "UpdateAllLoadedBeatmapLevelPacks", void, Il2CppObject* self) { - BeatmapLevelModels_UpdateAllLoadedBeatmapLevelPacks(self); - auto* existing = CRASH_UNLESS(il2cpp_utils::GetFieldValue(self, "_allLoadedBeatmapLevelPackCollection")); - logger.debug("Existing: {}", fmt::ptr(existing)); - auto* arr = CRASH_UNLESS(il2cpp_utils::GetPropertyValue(existing, "beatmapLevelPacks").into_optional_result()); - logger.debug("Existing arr: {}", fmt::ptr(arr)); - logger.debug("Constructing custom type and setting it to field!"); - // auto* myType = CRASH_UNLESS(il2cpp_utils::New(arr)); - auto myType = Il2CppNamespace::MyCustomBeatmapLevelPackCollection::New_ctor((Il2CppArray*)arr); - logger.debug("Created new type: {}", fmt::ptr(myType)); - auto* k = il2cpp_functions::object_get_class(existing); - custom_types::logAll(k); - k = il2cpp_functions::object_get_class((Il2CppObject*)myType); - custom_types::logAll(k); - CRASH_UNLESS(il2cpp_utils::SetFieldValue(self, "_allLoadedBeatmapLevelPackCollection", myType)); -} - CUSTOM_TYPES_FUNC void load() { static constexpr auto& logger = custom_types::logger; logger.debug("Registering types! (current size: {})", custom_types::Register::classes.size()); custom_types::Register::AutoRegister(); logger.debug("Registered: {} types!", custom_types::Register::classes.size()); INSTALL_HOOK(logger, MainMenuViewController_DidActivate); - INSTALL_HOOK(logger, BeatmapLevelModels_UpdateAllLoadedBeatmapLevelPacks); // auto k = CRASH_UNLESS(custom_types::Register::RegisterType()); // INSTALL_HOOK_OFFSETLESS(BeatmapObjectSpawnController_SpawnNote, il2cpp_utils::FindMethodUnsafe("", "BeatmapObjectSpawnController", "SpawnNote", 2)); // il2cpp_utils::LogClass(il2cpp_utils::GetClassFromName("Il2CppNamespace", "MyBeatmapObjectManager")); From 6f3f9cb6c616a054ac321648a1cc93f50eda6da1 Mon Sep 17 00:00:00 2001 From: kodenamekrak Date: Fri, 12 Dec 2025 18:35:17 +0000 Subject: [PATCH 8/8] Use mapped find pattern --- qpm.shared.json | 12 ++++++------ src/register.cpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qpm.shared.json b/qpm.shared.json index cea9879..efb26c9 100644 --- a/qpm.shared.json +++ b/qpm.shared.json @@ -120,13 +120,13 @@ { "dependency": { "id": "beatsaber-hook", - "versionRange": "=7.3.0", + "versionRange": "=7.4.1", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/libbeatsaber-hook.so", - "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/debug_libbeatsaber-hook.so", + "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.4.1/libbeatsaber-hook.so", + "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.4.1/debug_libbeatsaber-hook.so", "overrideSoName": "libbeatsaber-hook.so", - "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.3.0/beatsaber-hook.qmod", - "branchName": "version/v7_3_0", + "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v7.4.1/beatsaber-hook.qmod", + "branchName": "version/v7_4_1", "compileOptions": { "cppFlags": [ "-Wno-extra-qualification" @@ -135,7 +135,7 @@ "cmake": true } }, - "version": "7.3.0" + "version": "7.4.1" }, { "dependency": { diff --git a/src/register.cpp b/src/register.cpp index 6046fa2..dba684c 100644 --- a/src/register.cpp +++ b/src/register.cpp @@ -609,8 +609,8 @@ void Register::EnsureHooks() { INSTALL_HOOK_DIRECT(logger, GlobalMetadata_GetTypeInfoFromTypeDefinitionIndex, (void*)il2cpp_functions::il2cpp_GlobalMetadata_GetTypeInfoFromTypeDefinitionIndex); INSTALL_HOOK_DIRECT(logger, Class_Init, (void*)il2cpp_functions::il2cpp_Class_Init); - const uintptr_t kGetScriptingClassOffset = 0xa66928; - uintptr_t GetScriptingClassAddr = baseAddr("libunity.so") + kGetScriptingClassOffset; + bool multiple; + uintptr_t GetScriptingClassAddr = findUniquePatternInLibunity(multiple, "ff 43 02 d1 fe 23 00 f9 fa 67 05 a9 f8 5f 06 a9 f6 57 07 a9 f4 4f 08 a9 57 d0 3b d5 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 21 ?? ?? 91 e0 03 16 aa"); INSTALL_HOOK_DIRECT(logger, GetScriptingClass, reinterpret_cast(GetScriptingClassAddr)); // get the location of Type::GetClassOrElementClass