Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 7 additions & 2 deletions qpm.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -43,7 +43,7 @@
"dependencies": [
{
"id": "beatsaber-hook",
"versionRange": "^6.2.0",
"versionRange": "^7.0.0",
"additionalData": {}
},
{
Expand All @@ -57,6 +57,11 @@
"id": "paper2_scotland2",
"versionRange": "^4.2.1",
"additionalData": {}
},
{
"id": "flamingo",
"versionRange": "^1.1.2",
"additionalData": {}
}
]
}
108 changes: 66 additions & 42 deletions qpm.shared.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -44,7 +44,7 @@
"dependencies": [
{
"id": "beatsaber-hook",
"versionRange": "^6.2.0",
"versionRange": "^7.0.0",
"additionalData": {}
},
{
Expand All @@ -58,19 +58,24 @@
"id": "paper2_scotland2",
"versionRange": "^4.2.1",
"additionalData": {}
},
{
"id": "flamingo",
"versionRange": "^1.1.2",
"additionalData": {}
}
]
},
"restoredDependencies": [
{
"dependency": {
"id": "paper2_scotland2",
"versionRange": "=4.4.0",
"versionRange": "=4.7.0",
"additionalData": {
"soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.4.0/libpaper2_scotland2.so",
"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.4.0/paper2_scotland2.qmod",
"branchName": "version/v4_4_0",
"modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.7.0/paper2_scotland2.qmod",
"branchName": "version/v4_7_0",
"compileOptions": {
"systemIncludes": [
"shared/utfcpp/source"
Expand All @@ -79,82 +84,101 @@
"cmake": false
}
},
"version": "4.4.0"
"version": "4.7.0"
},
{
"dependency": {
"id": "libil2cpp",
"versionRange": "=0.4.0",
"id": "fmt",
"versionRange": "=11.0.2",
"additionalData": {
"headersOnly": true,
"branchName": "version/v11_0_2",
"compileOptions": {
"systemIncludes": [
"il2cpp/external/baselib/Include",
"il2cpp/external/baselib/Platforms/Android/Include"
"fmt/include/"
],
"cppFlags": [
"-DFMT_HEADER_ONLY"
]
}
}
},
"version": "0.4.0"
"version": "11.0.2"
},
{
"dependency": {
"id": "beatsaber-hook",
"versionRange": "=6.3.0",
"id": "capstone",
"versionRange": "=0.1.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",
"overrideSoName": "libbeatsaber-hook.so",
"modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.3.0/beatsaber-hook.qmod",
"branchName": "version/v6_3_0",
"cmake": true
"staticLinking": true,
"soLink": "https://github.com/sc2ad/capstone-qpm/releases/download/v0.1.0/libcapstone.a",
"overrideSoName": "libcapstone.a"
}
},
"version": "6.3.0"
"version": "0.1.0"
},
{
"dependency": {
"id": "scotland2",
"versionRange": "=0.1.6",
"id": "beatsaber-hook",
"versionRange": "=7.4.1",
"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/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.4.1/beatsaber-hook.qmod",
"branchName": "version/v7_4_1",
"compileOptions": {
"cppFlags": [
"-Wno-extra-qualification"
]
},
"cmake": true
}
},
"version": "0.1.6"
"version": "7.4.1"
},
{
"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": "flamingo",
"versionRange": "=1.1.2",
"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/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": "0.1.0"
"version": "1.1.2"
},
{
"dependency": {
"id": "scotland2",
"versionRange": "=0.1.6",
"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"
}
},
"version": "0.1.6"
}
]
}
7 changes: 3 additions & 4 deletions src/register.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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!"
Expand Down Expand Up @@ -611,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");

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<void*>(GetScriptingClassAddr));

// get the location of Type::GetClassOrElementClass
Expand Down
69 changes: 31 additions & 38 deletions src/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
};
Expand Down Expand Up @@ -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!
Expand Down Expand Up @@ -209,16 +209,27 @@ 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<Il2CppNamespace::MyCustomRandom*>::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<double>(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").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);
auto* customType = il2cpp_utils::GetSystemType(custom_types::Register::classes[0]);
logger.debug("Custom System.Type: {}", fmt::ptr(customType));
auto strType = RET_V_UNLESS(logger, il2cpp_utils::RunMethodOpt<StringW>(customType, "ToString"));
logger.debug("ToString: {}", strType);
auto name = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue<StringW>(customType, "Name"));
auto name = RET_V_UNLESS(logger, il2cpp_utils::GetPropertyValue<StringW>(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));
Expand Down Expand Up @@ -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"));
logger.debug("Existing arr: {}", fmt::ptr(arr));
logger.debug("Constructing custom type and setting it to field!");
// auto* myType = CRASH_UNLESS(il2cpp_utils::New<Il2CppNamespace::MyCustomBeatmapLevelPackCollection*>(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<Il2CppNamespace::MyBeatmapObjectManager>());
// INSTALL_HOOK_OFFSETLESS(BeatmapObjectSpawnController_SpawnNote, il2cpp_utils::FindMethodUnsafe("", "BeatmapObjectSpawnController", "SpawnNote", 2));
// il2cpp_utils::LogClass(il2cpp_utils::GetClassFromName("Il2CppNamespace", "MyBeatmapObjectManager"));
Expand Down
2 changes: 1 addition & 1 deletion src/test_small.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down