Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
e983774
Rewrite yay
Metalit Mar 21, 2026
d33338a
Fix tests (some ai generation) and compilation
Metalit Mar 21, 2026
9c38b9a
Add hook test
Metalit Mar 21, 2026
332e31d
Fix some other errors
Metalit Mar 22, 2026
df0a312
Fix r29 and span annoyances
Metalit Mar 22, 2026
8bd7be8
Sprinkle in noexcept
Metalit Mar 31, 2026
baa9b5e
Revert debug change
Metalit Apr 1, 2026
621bb06
Keep r28 compat
Metalit Apr 3, 2026
0a9d4cc
Fix type marking bugs
Metalit Apr 3, 2026
efef301
Add helper for generic methods
Metalit Apr 3, 2026
05da159
Fix method running bugs
Metalit Apr 3, 2026
687df5f
Fix concerning typo
Metalit Apr 3, 2026
ab580e2
Fix tests
Metalit Apr 3, 2026
5107c17
Fix valuew
Metalit Apr 4, 2026
7b71066
Restore stack trace exception
Metalit Apr 4, 2026
4b58150
Remove source location actually
Metalit Apr 4, 2026
2f2dba0
I don't wanna have a reverse type checking flag
Metalit Apr 4, 2026
42b1c17
Fix generic classes
Metalit Apr 4, 2026
61505a3
Fix method finds
Metalit Apr 4, 2026
ae4968f
Update README
Metalit Apr 4, 2026
68787e0
Small safety
Metalit Apr 4, 2026
ea95c02
Fix test
Metalit Apr 4, 2026
85be1f2
Return potentially useful log
Metalit Apr 4, 2026
d5b9eb3
Fix uninitialized field
Metalit Apr 4, 2026
95bd94f
Add generics to log method
Metalit Apr 4, 2026
4dfa16c
Fix size type
Metalit Apr 4, 2026
d79d2f0
Fix accidental copy
Metalit Apr 4, 2026
d6ba29f
Document other defines
Metalit Apr 4, 2026
c4d612a
Fix typo
Metalit Apr 4, 2026
9fe5f91
Fix conversion check order
Metalit Apr 4, 2026
88d7d9d
Fix void* test
Metalit Apr 4, 2026
739c9a3
Fix cast functions
Metalit Apr 5, 2026
4ae9d5a
Remove unnecessary decay_t
Metalit Apr 5, 2026
64be0c6
Lazier instance conversion
Metalit Apr 5, 2026
56f5964
Change concept to bool
Metalit Apr 5, 2026
3d9168a
Document ValueW and disincentivize inheritance
Metalit Apr 5, 2026
e8bebe7
Move ctors for clarity
Metalit Apr 5, 2026
ab0c2f6
Better IWYU
Metalit Apr 5, 2026
65d7ff9
Move functions to more sensible file
Metalit Apr 5, 2026
2ec60ee
Remove commented code
Metalit Apr 5, 2026
8d6d3f3
Reorganize members with detail namespace
Metalit Apr 5, 2026
a990fc6
Change pair to more readable enum
Metalit Apr 5, 2026
b7f51e0
Clarify type
Metalit Apr 5, 2026
82e818b
Allow method info in hooks
Metalit Apr 19, 2026
63253ce
Fixes for cordl
Metalit Apr 19, 2026
0815930
Allow result type
Metalit Apr 19, 2026
692ac5f
Format api
Metalit Apr 19, 2026
3b9f140
Idk why I did this
Metalit Apr 19, 2026
a9e21eb
Update cast and noexcept with result
Metalit Apr 19, 2026
00e8c65
Fix build
Metalit Apr 19, 2026
7fb78f1
Wrapper fixes
Metalit May 6, 2026
25667c9
Unwrap results
Metalit May 6, 2026
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
70 changes: 60 additions & 10 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -1,13 +1,63 @@
Language: Cpp
BasedOnStyle: Google
AllowShortBlocksOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: true
ColumnLimit: 200
CommentPragmas: NOLINT:.*
AccessModifierOffset: -1
AlignAfterOpenBracket: BlockIndent
AlignOperands: AlignAfterOperator
AlignTrailingComments:
Kind: Never
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: false
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
BreakAfterAttributes: Never
BreakBeforeConceptDeclarations: Always
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
BreakStringLiterals: false
ColumnLimit: 150
DerivePointerAlignment: false
IncludeBlocks: Preserve
FixNamespaceComments: false
IncludeBlocks: Regroup
IncludeCategories:
- Regex: "^<[^.>]+>$"
Priority: 2
SortPriority: 3
CaseSensitive: false
- Regex: '^<.+\.(h|hpp)>$'
Priority: 2
SortPriority: 4
CaseSensitive: false
- Regex: '^"[A-Z].*\/.+\.hpp"$'
Priority: 5
CaseSensitive: true
- Regex: "^.+/shared/.+"
Priority: 1
SortPriority: 2
CaseSensitive: true
- Regex: ".*"
Priority: 1
SortPriority: 1
CaseSensitive: false
IndentExternBlock: Indent
IndentRequiresClause: false
IndentWidth: 4
PointerAlignment: Left
TabWidth: 4
UseTab: Never
Cpp11BracedListStyle: false
InsertBraces: true
InsertNewlineAtEOF: true
KeepEmptyLinesAtTheStartOfBlocks: true
LineEnding: LF
NamespaceIndentation: All
PackConstructorInitializers: CurrentLine
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 50
QualifierAlignment: Right
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SkipMacroDefinitionBody: true
SpaceAfterCStyleCast: true
SpacesBeforeTrailingComments: 2
5 changes: 4 additions & 1 deletion .clangd
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
Diagnostics:
UnusedIncludes: None
---
If:
# Note: This is a regexp, notice '.*' at the end of PathMatch string.
PathMatch: ./extern/.*
Index:
# Disable slow background indexing of these files.
Background: Skip
Background: Skip
202 changes: 65 additions & 137 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,154 +1,82 @@
# include some defines automatically made by qpm
cmake_minimum_required(VERSION 3.22)

# Include definitions generated by QPM on restore
include(qpm_defines.cmake)

cmake_minimum_required(VERSION 3.22)
project(${COMPILE_ID})

# c++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED 20)
# LTO
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
# C++ standard
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED 23)

# Provide compile commands so they can be used for intellisense
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)

# define that stores the actual source directory
set(SHARED_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shared)
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
# Set compiler options
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
add_compile_options(-frtti -fexceptions -O3)
add_compile_options(-Wall -Wextra -Werror -Wno-extra-qualification -Wno-vla-cxx-extension)

# compile options used
add_compile_options(-frtti -fPIE -fPIC -fexceptions -flto)
add_link_options(-Wl,--exclude-libs,ALL)
add_compile_options(-Wall -Wextra -Werror -Wno-unused-function -Wno-extra-qualification)
# clangd bug https://github.com/clangd/clangd/issues/1167
add_compile_options(-Wno-pragma-pack)
add_compile_options(-Wno-vla-cxx-extension)
# compile definitions used
add_compile_definitions(VERSION=\"${MOD_VERSION}\")
add_compile_definitions(MOD_ID=\"${MOD_ID}\")
# add_compile_options(-Wno-vla-cxx-extension)
# Expose definitions from qpm_defines.cmake
add_compile_definitions(VERSION="${MOD_VERSION}")
add_compile_definitions(MOD_ID="${MOD_ID}")

add_compile_definitions(VERSION_NUMBER=300150000)
add_compile_definitions(UNITY_6)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Trim source folder in logcat messages
string(LENGTH "${CMAKE_CURRENT_SOURCE_DIR}/" FOLDER_LENGTH)
add_compile_definitions(PAPER_ROOT_FOLDER_LENGTH=${FOLDER_LENGTH})

function(setup_target target add_test)
message(STATUS "Setting up target ${target}")

string(LENGTH "${CMAKE_CURRENT_LIST_DIR}" FOLDER_LENGTH)
add_compile_definitions("PAPER_ROOT_FOLDER_LENGTH=(${FOLDER_LENGTH} + 1)")
# Define the code directories
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

add_library(
${target}
SHARED
)

if (add_test)
target_compile_definitions(
${target}
PRIVATE

TEST_CALLBACKS
TEST_BETTER_SPAN
TEST_SAFEPTR
TEST_BYREF
TEST_ARRAY
TEST_LIST
TEST_STRING
TEST_HOOK
TEST_THREAD
TEST_UNITYW
)
endif()

# recursively get all src files
RECURSE_FILES(cpp_file_list_utils ${SOURCE_DIR}/utils/*.cpp)
RECURSE_FILES(c_file_list_utils ${SOURCE_DIR}/utils/*.c)
target_sources(${target} PRIVATE ${cpp_file_list_utils})
target_sources(${target} PRIVATE ${c_file_list_utils})

# recursively get all src files
RECURSE_FILES(cpp_file_list_hook ${SHARED_DIR}/inline-hook/*.cpp)
RECURSE_FILES(c_file_list_hook ${SHARED_DIR}/inline-hook/*.c)
target_sources(${target} PRIVATE ${cpp_file_list_hook})
target_sources(${target} PRIVATE ${c_file_list_hook})

RECURSE_FILES(cpp_file_list_config ${SOURCE_DIR}/config/*.cpp)
RECURSE_FILES(c_file_list_config ${SOURCE_DIR}/config/*.c)
target_sources(${target} PRIVATE ${cpp_file_list_config})
target_sources(${target} PRIVATE ${c_file_list_config})

if (add_test)
message(STATUS "Adding tests source files to target ${target}")
RECURSE_FILES(cpp_file_list_tests ${SOURCE_DIR}/tests/*.cpp)
RECURSE_FILES(c_file_list_tests ${SOURCE_DIR}/tests/*.c)
target_sources(${target} PRIVATE ${cpp_file_list_tests})
target_sources(${target} PRIVATE ${c_file_list_tests})
endif()

# add root dir as include dir
target_include_directories(${target} PRIVATE ${CMAKE_SOURCE_DIR})
# add src dir as include dir
target_include_directories(${target} PRIVATE ${SOURCE_DIR})
# add include dir as include dir
target_include_directories(${target} PRIVATE ${INCLUDE_DIR})
# add shared dir as include dir
target_include_directories(${target} PUBLIC ${SHARED_DIR})

target_include_directories(${target} SYSTEM PRIVATE ${EXTERN_DIR}/includes/libil2cpp/il2cpp/external/baselib/Include)
target_include_directories(${target} SYSTEM PRIVATE ${EXTERN_DIR}/includes/libil2cpp/il2cpp/external/baselib/Platforms/Android/Include)

target_include_directories(${target} SYSTEM PRIVATE ${EXTERN_DIR}/includes/fmt/fmt/include/)
target_compile_options(${target} PRIVATE -DFMT_HEADER_ONLY)

target_link_directories(${target} PRIVATE ${EXTERN_DIR}/libs)
target_link_libraries(${target} PRIVATE -llog)
target_link_options(${target} PRIVATE "-fuse-ld=ld")

file(GLOB_RECURSE so_libs ${EXTERN_DIR}/libs/*.so)
file(GLOB_RECURSE a_libs ${EXTERN_DIR}/libs/*.a)

target_link_libraries(
${target}
PRIVATE
${so_libs}
${a_libs}
function(shared_setup TARGET)
# Add include directories to compilation
target_include_directories(${TARGET} PUBLIC ${SHARED_DIR})

# Link necessary Android libraries
target_link_libraries(${TARGET} PRIVATE -llog)

# include extern.cmake with the correct compile id
set(OLD_COMPILE_ID ${COMPILE_ID})
set(COMPILE_ID ${TARGET})
include(extern.cmake)
set(COMPILE_ID ${OLD_COMPILE_ID})

add_custom_command(
TARGET ${TARGET}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "debug"
COMMAND ${CMAKE_COMMAND} -E rename "lib${TARGET}.so" "debug/lib${TARGET}.so"
COMMAND ${CMAKE_STRIP} -d --strip-all "debug/lib${TARGET}.so" -o "lib${TARGET}.so"
COMMENT "Create stripped and debug libraries"
)

target_include_directories(${target} PRIVATE ${EXTERN_DIR}/includes)
target_include_directories(${target} SYSTEM PRIVATE ${EXTERN_DIR}/includes/libil2cpp/il2cpp/libil2cpp)
endfunction()

# compile test as one project
setup_target(test-${COMPILE_ID} YES)
# regular bs hook
setup_target(${COMPILE_ID} NO)

add_dependencies(${COMPILE_ID} test-${COMPILE_ID})

target_compile_definitions(
${COMPILE_ID}
PRIVATE
NO_TEST
)

# make bs hook build depend on the build of bs hook tests
# add_dependencies(${COMPILE_ID} ${COMPILE_ID}-test)

add_custom_command(TARGET ${COMPILE_ID} POST_BUILD
COMMAND ${CMAKE_STRIP} -g -S -d --strip-all
"lib${COMPILE_ID}.so" -o "stripped_lib${COMPILE_ID}.so"
COMMENT "Strip debug symbols done on final binary.")

add_custom_command(TARGET ${COMPILE_ID} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory debug
COMMENT "Create the debug dir"
)
add_custom_command(TARGET ${COMPILE_ID} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E rename lib${COMPILE_ID}.so debug/lib${COMPILE_ID}.so
COMMENT "Rename the lib to debug_ since it has debug symbols"
)

add_custom_command(TARGET ${COMPILE_ID} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E rename stripped_lib${COMPILE_ID}.so lib${COMPILE_ID}.so
COMMENT "Rename the stripped lib to regular"
)
# Non-recursively get all source files
FILE(GLOB cpp_file_list ${SOURCE_DIR}/*.cpp)
FILE(GLOB c_file_list ${SOURCE_DIR}/*.c)

# Add all source files to compilation
add_library(${COMPILE_ID} SHARED ${cpp_file_list} ${c_file_list})

shared_setup(${COMPILE_ID})

# Create test target
set(TEST_ID test-${COMPILE_ID})

# Recursively get all source files
recurse_files(cpp_test_list ${SOURCE_DIR}/tests/*.cpp)
recurse_files(c_test_list ${SOURCE_DIR}/tests/*.c)

add_library(${TEST_ID} SHARED ${cpp_test_list} ${c_test_list})

shared_setup(${TEST_ID})

add_dependencies(${TEST_ID} ${COMPILE_ID})
target_link_libraries(${TEST_ID} PRIVATE ${COMPILE_ID})
Loading
Loading