From ae7ef0d7a8bab1f12734c6073acc1f356839102d Mon Sep 17 00:00:00 2001 From: HardCPP Date: Wed, 6 Aug 2025 23:40:14 +0200 Subject: [PATCH 1/6] Version 6.4.1 for BS 1.40.8 --- include/git_info.h | 2 +- mod.json | 24 ++++++------- mod.template.json | 5 +-- qpm.json | 17 ++++----- qpm.shared.json | 87 ++++++++++++++++++++++++++-------------------- 5 files changed, 72 insertions(+), 63 deletions(-) diff --git a/include/git_info.h b/include/git_info.h index 8f5ee7b..8a3b54a 100644 --- a/include/git_info.h +++ b/include/git_info.h @@ -1,5 +1,5 @@ #pragma once #define GIT_USER "HardCPP" #define GIT_BRANCH "dev" -#define GIT_COMMIT 0xa983814 +#define GIT_COMMIT 0x7dee42f #define GIT_MODIFIED 1 diff --git a/mod.json b/mod.json index 8f5380c..19603fb 100644 --- a/mod.json +++ b/mod.json @@ -5,37 +5,37 @@ "id": "qbeatsaberplus-gametweaker", "modloader": "Scotland2", "author": "HardCPP", - "version": "6.4.0", + "version": "6.4.1", "packageId": "com.beatgames.beatsaber", - "packageVersion": "1.40.4_5283", + "packageVersion": "1.40.8_7379", "description": "Feel good!", "coverImage": "cover.png", "dependencies": [ { - "version": "^6.4.1", + "version": "^6.4.2", "id": "beatsaber-hook", - "downloadIfMissing": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.1/beatsaber-hook.qmod" + "downloadIfMissing": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.2/beatsaber-hook.qmod" }, { - "version": "^0.18.2", + "version": "^0.18.3", "id": "custom-types", - "downloadIfMissing": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.2/CustomTypes.qmod" + "downloadIfMissing": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/CustomTypes.qmod" }, { - "version": "^4.6.1", + "version": "^4.6.4", "id": "paper2_scotland2", - "downloadIfMissing": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.3/paper2_scotland2.qmod" + "downloadIfMissing": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/paper2_scotland2.qmod" }, { - "version": "^6.4.0", + "version": "^6.4.1", "id": "chatplex-sdk-bs", - "downloadIfMissing": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.0/ChatPlexSDK-BS.qmod" + "downloadIfMissing": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/ChatPlexSDK-BS.qmod" } ], - "modFiles": [ + "modFiles": [], + "lateModFiles": [ "libqbeatsaberplus-gametweaker.so" ], - "lateModFiles": [], "libraryFiles": [], "fileCopies": [], "copyExtensions": [] diff --git a/mod.template.json b/mod.template.json index 5af37ad..ba4d5ff 100644 --- a/mod.template.json +++ b/mod.template.json @@ -7,11 +7,12 @@ "author": "HardCPP", "version": "${version}", "packageId": "com.beatgames.beatsaber", - "packageVersion": "1.40.4_5283", + "packageVersion": "1.40.8_7379", "description": "Feel good!", "coverImage": "cover.png", "dependencies": [], - "modFiles": ["${binary}"], + "modFiles": [], + "lateModFiles": ["${binary}"], "libraryFiles": [], "fileCopies": [], "copyExtensions": [] diff --git a/qpm.json b/qpm.json index 07beaf9..a40939a 100644 --- a/qpm.json +++ b/qpm.json @@ -5,7 +5,7 @@ "info": { "name": "QBeatSaberPlus-GameTweaker", "id": "qbeatsaberplus-gametweaker", - "version": "6.4.0", + "version": "6.4.1", "url": "https://github.com/hardcpp/QBeatSaberPlus-GameTweaker", "additionalData": { "overrideSoName": "libqbeatsaberplus-gametweaker.so", @@ -47,17 +47,17 @@ "dependencies": [ { "id": "beatsaber-hook", - "versionRange": "^6.4.1", + "versionRange": "^6.4.2", "additionalData": {} }, { "id": "bs-cordl", - "versionRange": "^4004.0.0", + "versionRange": "^4008.*", "additionalData": {} }, { "id": "custom-types", - "versionRange": "^0.18.2", + "versionRange": "^0.18.3", "additionalData": {} }, { @@ -68,14 +68,9 @@ "private": true } }, - { - "id": "libil2cpp", - "versionRange": "^0.4.0", - "additionalData": {} - }, { "id": "paper2_scotland2", - "versionRange": "^4.6.1", + "versionRange": "^4.6.4", "additionalData": {} }, { @@ -85,7 +80,7 @@ }, { "id": "chatplex-sdk-bs", - "versionRange": "^6.4.0", + "versionRange": "^6.4.1", "additionalData": { "private": true } diff --git a/qpm.shared.json b/qpm.shared.json index 85974c6..e204ce0 100644 --- a/qpm.shared.json +++ b/qpm.shared.json @@ -7,7 +7,7 @@ "info": { "name": "QBeatSaberPlus-GameTweaker", "id": "qbeatsaberplus-gametweaker", - "version": "6.4.0", + "version": "6.4.1", "url": "https://github.com/hardcpp/QBeatSaberPlus-GameTweaker", "additionalData": { "overrideSoName": "libqbeatsaberplus-gametweaker.so", @@ -49,17 +49,17 @@ "dependencies": [ { "id": "beatsaber-hook", - "versionRange": "^6.4.1", + "versionRange": "^6.4.2", "additionalData": {} }, { "id": "bs-cordl", - "versionRange": "^4004.0.0", + "versionRange": "4008.*", "additionalData": {} }, { "id": "custom-types", - "versionRange": "^0.18.2", + "versionRange": "^0.18.3", "additionalData": {} }, { @@ -70,14 +70,9 @@ "private": true } }, - { - "id": "libil2cpp", - "versionRange": "^0.4.0", - "additionalData": {} - }, { "id": "paper2_scotland2", - "versionRange": "^4.6.1", + "versionRange": "^4.6.4", "additionalData": {} }, { @@ -87,7 +82,7 @@ }, { "id": "chatplex-sdk-bs", - "versionRange": "^6.4.0", + "versionRange": "^6.4.1", "additionalData": { "private": true } @@ -98,12 +93,12 @@ { "dependency": { "id": "paper2_scotland2", - "versionRange": "=4.6.3", + "versionRange": "=4.6.4", "additionalData": { - "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.3/libpaper2_scotland2.so", + "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.3/paper2_scotland2.qmod", - "branchName": "version/v4_6_3", + "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/paper2_scotland2.qmod", + "branchName": "version/v4_6_4", "compileOptions": { "systemIncludes": [ "shared/utfcpp/source" @@ -112,7 +107,7 @@ "cmake": false } }, - "version": "4.6.3" + "version": "4.6.4" }, { "dependency": { @@ -133,28 +128,28 @@ { "dependency": { "id": "chatplex-sdk-bs", - "versionRange": "=6.4.0", + "versionRange": "=6.4.1", "additionalData": { - "soLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.0/libchatplex-sdk-bs.so", - "debugSoLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.0/debug_libchatplex-sdk-bs.so", + "soLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/libchatplex-sdk-bs.so", + "debugSoLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/debug_libchatplex-sdk-bs.so", "overrideSoName": "libchatplex-sdk-bs.so", - "modLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.0/ChatPlexSDK-BS.qmod", - "branchName": "version/v6_4_0", + "modLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/ChatPlexSDK-BS.qmod", + "branchName": "version/v6_4_1", "cmake": true } }, - "version": "6.4.0" + "version": "6.4.1" }, { "dependency": { "id": "custom-types", - "versionRange": "=0.18.2", + "versionRange": "=0.18.3", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.2/libcustom-types.so", - "debugSoLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.2/debug_libcustom-types.so", + "soLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/libcustom-types.so", + "debugSoLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/debug_libcustom-types.so", "overrideSoName": "libcustom-types.so", - "modLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.2/CustomTypes.qmod", - "branchName": "version/v0_18_2", + "modLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/CustomTypes.qmod", + "branchName": "version/v0_18_3", "compileOptions": { "cppFlags": [ "-Wno-invalid-offsetof" @@ -163,15 +158,15 @@ "cmake": true } }, - "version": "0.18.2" + "version": "0.18.3" }, { "dependency": { "id": "bs-cordl", - "versionRange": "=4004.0.0", + "versionRange": "=4008.0.0", "additionalData": { "headersOnly": true, - "branchName": "version/v4004_0_0", + "branchName": "version/v4008_0_0", "compileOptions": { "includePaths": [ "include" @@ -187,22 +182,40 @@ } } }, - "version": "4004.0.0" + "version": "4008.0.0" + }, + { + "dependency": { + "id": "libcurl", + "versionRange": "=8.5.0", + "additionalData": { + "staticLinking": true, + "soLink": "https://github.com/darknight1050/openssl-curl-android/releases/download/v8.5.0/libcurl.a", + "overrideSoName": "libcurl.a", + "branchName": "version-v8.5.0" + } + }, + "version": "8.5.0" }, { "dependency": { "id": "beatsaber-hook", - "versionRange": "=6.4.1", + "versionRange": "=6.4.2", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.1/libbeatsaber-hook.so", - "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.1/debug_libbeatsaber-hook.so", + "soLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.2/libbeatsaber-hook.so", + "debugSoLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.2/debug_libbeatsaber-hook.so", "overrideSoName": "libbeatsaber-hook.so", - "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.1/beatsaber-hook.qmod", - "branchName": "version/v6_4_1", + "modLink": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.2/beatsaber-hook.qmod", + "branchName": "version/v6_4_2", + "compileOptions": { + "cppFlags": [ + "-Wno-extra-qualification" + ] + }, "cmake": true } }, - "version": "6.4.1" + "version": "6.4.2" }, { "dependency": { From 80b1df80bcbd647eeb40185f650de1576945b062 Mon Sep 17 00:00:00 2001 From: HardCPP Date: Mon, 10 Aug 2026 00:32:48 +0200 Subject: [PATCH 2/6] Move scripts --- scripts/build.ps1 | 34 ++++++ scripts/build.sh | 36 ++++++ scripts/copy.ps1 | 80 ++++++++++++ scripts/copy.sh | 93 ++++++++++++++ createqmod.ps1 => scripts/createqmod.ps1 | 0 scripts/createqmod.sh | 94 ++++++++++++++ ndk-stack.ps1 => scripts/ndk-stack.ps1 | 2 +- scripts/ndk-stack.sh | 54 ++++++++ .../pull-tombstone.ps1 | 4 +- scripts/pull-tombstone.sh | 82 +++++++++++++ .../pullandanalyze.ps1 | 4 +- scripts/pullandanalyze.sh | 32 +++++ restart-game.ps1 => scripts/restart-game.ps1 | 0 scripts/restart-game.sh | 11 ++ .../start-logging.ps1 | 6 +- scripts/start-logging.sh | 115 ++++++++++++++++++ .../validate-modjson.ps1 | 0 scripts/validate-modjson.sh | 75 ++++++++++++ 18 files changed, 714 insertions(+), 8 deletions(-) create mode 100644 scripts/build.ps1 create mode 100755 scripts/build.sh create mode 100644 scripts/copy.ps1 create mode 100755 scripts/copy.sh rename createqmod.ps1 => scripts/createqmod.ps1 (100%) create mode 100755 scripts/createqmod.sh rename ndk-stack.ps1 => scripts/ndk-stack.ps1 (99%) create mode 100755 scripts/ndk-stack.sh rename pull-tombstone.ps1 => scripts/pull-tombstone.ps1 (99%) create mode 100755 scripts/pull-tombstone.sh rename pullandanalyze.ps1 => scripts/pullandanalyze.ps1 (90%) create mode 100755 scripts/pullandanalyze.sh rename restart-game.ps1 => scripts/restart-game.ps1 (100%) create mode 100755 scripts/restart-game.sh rename start-logging.ps1 => scripts/start-logging.ps1 (93%) create mode 100755 scripts/start-logging.sh rename validate-modjson.ps1 => scripts/validate-modjson.ps1 (100%) create mode 100755 scripts/validate-modjson.sh diff --git a/scripts/build.ps1 b/scripts/build.ps1 new file mode 100644 index 0000000..33f3a7f --- /dev/null +++ b/scripts/build.ps1 @@ -0,0 +1,34 @@ +Param( + [Parameter(Mandatory = $false)] + [Switch] $clean, + + [Parameter(Mandatory = $false)] + [Switch] $help +) + +if ($help -eq $true) { + Write-Output "`"Build`" - Copiles your mod into a `".so`" or a `".a`" library" + Write-Output "`n-- Arguments --`n" + + Write-Output "-Clean `t`t Deletes the `"build`" folder, so that the entire library is rebuilt" + + exit +} + +# if user specified clean, remove all build files +if ($clean.IsPresent) { + if (Test-Path -Path "build") { + remove-item build -R + } +} + + +if (($clean.IsPresent) -or (-not (Test-Path -Path "build"))) { + new-item -Path build -ItemType Directory +} + +& cmake -G "Ninja" -DCMAKE_BUILD_TYPE="RelWithDebInfo" -B build +& cmake --build ./build --parallel 12 + +$ExitCode = $LastExitCode +exit $ExitCode \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..692fd07 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +clean=false + +usage() { + cat <<'EOF' +"Build" - Compiles your mod into a ".so" or ".a" library + +Arguments: + -clean, --clean Delete the build folder before compiling + -help, --help Show this help +EOF +} + +while (($#)); do + case "$1" in + -clean|--clean) clean=true ;; + -help|--help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac + shift +done + +cd -- "$project_root" + +if [[ "$clean" == true && -d "$project_root/build" ]]; then + rm -rf -- "$project_root/build" +fi + +mkdir -p -- "$project_root/build" +cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -B "$project_root/build" +cmake --build "$project_root/build" --parallel 12 diff --git a/scripts/copy.ps1 b/scripts/copy.ps1 new file mode 100644 index 0000000..aeabc97 --- /dev/null +++ b/scripts/copy.ps1 @@ -0,0 +1,80 @@ +Param( + [Parameter(Mandatory=$false)] + [Switch] $clean, + + [Parameter(Mandatory=$false)] + [Switch] $log, + + [Parameter(Mandatory=$false)] + [Switch] $useDebug, + + [Parameter(Mandatory=$false)] + [Switch] $self, + + [Parameter(Mandatory=$false)] + [Switch] $all, + + [Parameter(Mandatory=$false)] + [String] $custom="", + + [Parameter(Mandatory=$false)] + [String] $file="", + + [Parameter(Mandatory=$false)] + [Switch] $help +) + +if ($help -eq $true) { + Write-Output "`"Copy`" - Builds and copies your mod to your quest, and also starts Beat Saber with optional logging" + Write-Output "`n-- Arguments --`n" + + Write-Output "-Clean `t`t Performs a clean build (equvilant to running `"build -clean`")" + Write-Output "-UseDebug `t Copies the debug version of the mod to your quest" + Write-Output "-Log `t`t Logs Beat Saber using the `"Start-Logging`" command" + + Write-Output "`n-- Logging Arguments --`n" + + & $PSScriptRoot/start-logging.ps1 -help -excludeHeader -self + + exit +} + +& $PSScriptRoot/build.ps1 -clean:$clean + +if ($LASTEXITCODE -ne 0) { + Write-Output "Failed to build, exiting..." + exit $LASTEXITCODE +} + +& $PSScriptRoot/validate-modjson.ps1 +if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE +} +$modJson = Get-Content "./mod.json" -Raw | ConvertFrom-Json + +$modFiles = $modJson.modFiles + +foreach ($fileName in $modFiles) { + if ($useDebug -eq $true) { + & adb push build/debug/$fileName /sdcard/ModData/com.beatgames.beatsaber/Modloader/mods/$fileName + } else { + & adb push build/$fileName /sdcard/ModData/com.beatgames.beatsaber/Modloader/mods/$fileName + } +} + +$modFiles = $modJson.lateModFiles +foreach ($fileName in $modFiles) { + if ($useDebug -eq $true) { + & adb push build/debug/$fileName /sdcard/ModData/com.beatgames.beatsaber/Modloader/mods/$fileName + } else { + & adb push build/$fileName /sdcard/ModData/com.beatgames.beatsaber/Modloader/mods/$fileName + } +} + + +& $PSScriptRoot/restart-game.ps1 + +if ($log -eq $true) { + & adb logcat -c + & $PSScriptRoot/start-logging.ps1 -self:$self -all:$all -custom:$custom -file:$file +} diff --git a/scripts/copy.sh b/scripts/copy.sh new file mode 100755 index 0000000..fa83112 --- /dev/null +++ b/scripts/copy.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +clean=false +log=false +use_debug=false +self_only=false +all=false +custom="" +log_file="" + +usage() { + cat <<'EOF' +"Copy" - Builds and copies your mod to your Quest, then starts Beat Saber + +Arguments: + -clean, --clean Perform a clean build + -useDebug, --use-debug Copy files from build/debug + -log, --log Start logging after launching Beat Saber + +Logging arguments: + -self, --self Only show this mod and crash logs + -all, --all Show all logs from the Beat Saber process + -custom, --custom REGEX + Add a custom logging pattern + -file, --file FILE Save logging output under the scripts folder + -help, --help Show this help +EOF +} + +require_value() { + if (($# < 2)); then + printf 'Missing value for %s\n' "$1" >&2 + exit 2 + fi +} + +while (($#)); do + case "$1" in + -clean|--clean) clean=true; shift ;; + -log|--log) log=true; shift ;; + -useDebug|--use-debug) use_debug=true; shift ;; + -self|--self) self_only=true; shift ;; + -all|--all) all=true; shift ;; + -custom|--custom) require_value "$@"; custom="$2"; shift 2 ;; + -custom:*|--custom=*) custom="${1#*:}"; [[ "$1" == --custom=* ]] && custom="${1#*=}"; shift ;; + -file|--file) require_value "$@"; log_file="$2"; shift 2 ;; + -file:*|--file=*) log_file="${1#*:}"; [[ "$1" == --file=* ]] && log_file="${1#*=}"; shift ;; + -help|--help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +cd -- "$project_root" + +build_args=() +[[ "$clean" == true ]] && build_args+=(--clean) +if "$script_dir/build.sh" "${build_args[@]}"; then + : +else + status=$? + printf 'Failed to build, exiting...\n' >&2 + exit "$status" +fi + +"$script_dir/validate-modjson.sh" + +if ! command -v jq >/dev/null 2>&1; then + printf 'Error: jq is required to read mod.json\n' >&2 + exit 1 +fi + +mapfile -t mod_files < <(jq -r '(.modFiles // [])[], (.lateModFiles // [])[]' "$project_root/mod.json") +for file_name in "${mod_files[@]}"; do + source_dir="$project_root/build" + [[ "$use_debug" == true ]] && source_dir="$project_root/build/debug" + adb push "$source_dir/$file_name" "/sdcard/ModData/com.beatgames.beatsaber/Modloader/mods/$file_name" +done + +"$script_dir/restart-game.sh" + +if [[ "$log" == true ]]; then + adb logcat -c + logging_args=() + [[ "$self_only" == true ]] && logging_args+=(--self) + [[ "$all" == true ]] && logging_args+=(--all) + [[ -n "$custom" ]] && logging_args+=(--custom "$custom") + [[ -n "$log_file" ]] && logging_args+=(--file "$log_file") + "$script_dir/start-logging.sh" "${logging_args[@]}" +fi diff --git a/createqmod.ps1 b/scripts/createqmod.ps1 similarity index 100% rename from createqmod.ps1 rename to scripts/createqmod.ps1 diff --git a/scripts/createqmod.sh b/scripts/createqmod.sh new file mode 100755 index 0000000..bdce95d --- /dev/null +++ b/scripts/createqmod.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +qmod_name="" +clean=false + +usage() { + cat <<'EOF' +"CreateQmod" - Packages mod.json and its files into a .qmod archive + +Usage: createqmod.sh [QMOD_NAME] [-clean] + +Arguments: + -qmodname, --qmod-name NAME Set the output name (defaults to mod.json's name) + -clean, --clean Build a fresh archive instead of updating an old one + -help, --help Show this help +EOF +} + +while (($#)); do + case "$1" in + -qmodname|--qmod-name) + (($# >= 2)) || { printf 'Missing qmod name\n' >&2; exit 2; } + qmod_name="$2" + shift 2 + ;; + -qmodname:*|--qmod-name=*) + qmod_name="${1#*:}" + [[ "$1" == --qmod-name=* ]] && qmod_name="${1#*=}" + shift + ;; + -clean|--clean) clean=true; shift ;; + -help|--help|-h) usage; exit 0 ;; + -*) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + *) + [[ -z "$qmod_name" ]] || { printf 'Unexpected argument: %s\n' "$1" >&2; exit 2; } + qmod_name="$1" + shift + ;; + esac +done + +cd -- "$project_root" + +for tool in jq zip; do + command -v "$tool" >/dev/null 2>&1 || { printf 'Error: %s is required\n' "$tool" >&2; exit 1; } +done + +mod_file="$project_root/mod.json" +[[ -f "$mod_file" ]] || { printf 'Error: mod.json was not found\n' >&2; exit 1; } + +if [[ -z "$qmod_name" ]]; then + qmod_name="$(jq -er '.name' "$mod_file")" +fi + +files=("$mod_file") +cover="$(jq -r '.coverImage // empty' "$mod_file")" +if [[ -n "$cover" && -f "$project_root/$cover" ]]; then + files+=("$project_root/$cover") +fi + +mapfile -t packaged_files < <(jq -r '(.modFiles // [])[], (.lateModFiles // [])[], (.libraryFiles // [])[]' "$mod_file") +for file_name in "${packaged_files[@]}"; do + path="$project_root/build/$file_name" + [[ -f "$path" ]] || path="$project_root/extern/libs/$file_name" + if [[ ! -f "$path" ]]; then + printf 'Error: could not find dependency: %s\n' "$path" >&2 + exit 1 + fi + files+=("$path") +done + +[[ "$clean" == true ]] && printf 'Making clean Qmod\n' + +output="$project_root/${qmod_name}.qmod" +temp_dir="$(mktemp -d)" +trap 'rm -rf -- "$temp_dir"' EXIT +temp_archive="$temp_dir/archive.zip" + +if [[ "$clean" == false && -f "$output" ]]; then + cp -- "$output" "$temp_archive" +fi + +if [[ -f "$temp_archive" ]]; then + zip -j -u "$temp_archive" "${files[@]}" +else + zip -j "$temp_archive" "${files[@]}" +fi + +mv -- "$temp_archive" "$output" +printf 'Created %s\n' "$output" diff --git a/ndk-stack.ps1 b/scripts/ndk-stack.ps1 similarity index 99% rename from ndk-stack.ps1 rename to scripts/ndk-stack.ps1 index b247dbc..ac30cea 100644 --- a/ndk-stack.ps1 +++ b/scripts/ndk-stack.ps1 @@ -9,7 +9,7 @@ Param( if ($help -eq $true) { Write-Output "`"NDK-Stack`" - Processes a tombstone using the debug .so to find file locations" Write-Output "`n-- Arguments --`n" - + Write-Output "LogName `t`t The file name of the tombstone to process" exit diff --git a/scripts/ndk-stack.sh b/scripts/ndk-stack.sh new file mode 100755 index 0000000..faeafa8 --- /dev/null +++ b/scripts/ndk-stack.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +log_name="log.log" + +usage() { + cat <<'EOF' +"NDK-Stack" - Processes a tombstone using the debug .so files + +Usage: ndk-stack.sh [LOG_NAME] + +Arguments: + -logName, --log-name FILE Tombstone to process (default: log.log) + -help, --help Show this help +EOF +} + +while (($#)); do + case "$1" in + -logName|--log-name) + (($# >= 2)) || { printf 'Missing log file name\n' >&2; exit 2; } + log_name="$2" + shift 2 + ;; + -logName:*|--log-name=*) + log_name="${1#*:}" + [[ "$1" == --log-name=* ]] && log_name="${1#*=}" + shift + ;; + -help|--help|-h) usage; exit 0 ;; + -*) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + *) log_name="$1"; shift ;; + esac +done + +cd -- "$project_root" + +if [[ -f "$project_root/ndkpath.txt" ]]; then + IFS= read -r ndk_path < "$project_root/ndkpath.txt" || true + ndk_path="${ndk_path%$'\r'}" +else + ndk_path="${ANDROID_NDK_HOME:-}" +fi + +[[ -n "$ndk_path" ]] || { printf 'Error: set ANDROID_NDK_HOME or create ndkpath.txt\n' >&2; exit 1; } +stack_script="$ndk_path/ndk-stack" +[[ -x "$stack_script" ]] || { printf 'Error: ndk-stack was not found at %s\n' "$stack_script" >&2; exit 1; } +[[ -f "$log_name" ]] || { printf 'Error: log file was not found: %s\n' "$log_name" >&2; exit 1; } + +"$stack_script" -sym "$project_root/build/debug/" < "$log_name" > "${log_name}_processed.log" +printf 'Created %s\n' "${log_name}_processed.log" diff --git a/pull-tombstone.ps1 b/scripts/pull-tombstone.ps1 similarity index 99% rename from pull-tombstone.ps1 rename to scripts/pull-tombstone.ps1 index 17d3f83..10fbc24 100644 --- a/pull-tombstone.ps1 +++ b/scripts/pull-tombstone.ps1 @@ -1,10 +1,10 @@ Param( [Parameter(Mandatory=$false)] [String] $fileName = "RecentCrash.log", - + [Parameter(Mandatory=$false)] [Switch] $analyze, - + [Parameter(Mandatory=$false)] [Switch] $help ) diff --git a/scripts/pull-tombstone.sh b/scripts/pull-tombstone.sh new file mode 100755 index 0000000..fa339d9 --- /dev/null +++ b/scripts/pull-tombstone.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +file_name="RecentCrash.log" +analyze=false + +usage() { + cat <<'EOF' +"Pull-Tombstone" - Pulls the most recent Beat Saber tombstone from your Quest + +Arguments: + -fileName, --file-name FILE Output file (default: RecentCrash.log) + -analyze, --analyze Process the file with ndk-stack afterward + -help, --help Show this help +EOF +} + +while (($#)); do + case "$1" in + -fileName|--file-name) + (($# >= 2)) || { printf 'Missing output file name\n' >&2; exit 2; } + file_name="$2" + shift 2 + ;; + -fileName:*|--file-name=*) + file_name="${1#*:}" + [[ "$1" == --file-name=* ]] && file_name="${1#*=}" + shift + ;; + -analyze|--analyze) analyze=true; shift ;; + -help|--help|-h) usage; exit 0 ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +cd -- "$project_root" + +current_epoch="$(date +%s)" +recent_epoch="" +recent_tombstone="" + +for index in 0 1 2; do + remote="/sdcard/Android/data/com.beatgames.beatsaber/files/tombstone_0${index}" + if ! stats="$(adb shell stat "$remote" 2>&1)"; then + printf 'Failed to inspect tombstone_0%s: %s\n' "$index" "$stats" >&2 + exit 1 + fi + + modified="$(sed -nE 's/^Modify:[[:space:]]+([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}).*/\1/p' <<< "$stats" | head -n 1)" + if [[ -z "$modified" ]] || ! modified_epoch="$(date -d "$modified" +%s 2>/dev/null)"; then + printf 'Failed to read the modification time for tombstone_0%s\n' "$index" >&2 + exit 1 + fi + + delta=$((current_epoch - modified_epoch)) + if ((delta >= 0)); then + difference=$(((delta + 30) / 60)) + else + difference=$(((delta - 30) / 60)) + fi + + if ((difference == 1)); then + printf 'Found tombstone_0%s %s minute ago\n' "$index" "$difference" + else + printf 'Found tombstone_0%s %s minutes ago\n' "$index" "$difference" + fi + + if [[ -z "$recent_epoch" ]] || ((modified_epoch > recent_epoch)); then + recent_epoch="$modified_epoch" + recent_tombstone="$index" + fi +done + +printf 'Latest tombstone was tombstone_0%s\n' "$recent_tombstone" +adb pull "/sdcard/Android/data/com.beatgames.beatsaber/files/tombstone_0${recent_tombstone}" "$file_name" + +if [[ "$analyze" == true ]]; then + "$script_dir/ndk-stack.sh" --log-name "$file_name" +fi diff --git a/pullandanalyze.ps1 b/scripts/pullandanalyze.ps1 similarity index 90% rename from pullandanalyze.ps1 rename to scripts/pullandanalyze.ps1 index 813eb55..736f3b4 100644 --- a/pullandanalyze.ps1 +++ b/scripts/pullandanalyze.ps1 @@ -1,4 +1,4 @@ - + $NDKPath = $env:ANDROID_NDK_HOME $stackScript = "$NDKPath/ndk-stack" @@ -8,4 +8,4 @@ if (-not ($PSVersionTable.PSEdition -eq "Core")) { $filename = "tombstone_0" + $args[0] & adb pull /storage/emulated/0/Android/data/com.beatgames.beatsaber/files/$($filename) Get-Content $filename | & $stackScript -sym ./build/debug/ > "$($filename)_unstripped.txt" -& code "$($filename)_unstripped.txt" +& code "$($filename)_unstripped.txt" diff --git a/scripts/pullandanalyze.sh b/scripts/pullandanalyze.sh new file mode 100755 index 0000000..d8c1c4b --- /dev/null +++ b/scripts/pullandanalyze.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" + +if [[ "${1:-}" == "-help" || "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then + printf 'Usage: pullandanalyze.sh TOMBSTONE_INDEX\n' + exit 0 +fi + +if (($# != 1)); then + printf 'Usage: pullandanalyze.sh TOMBSTONE_INDEX\n' >&2 + exit 2 +fi + +ndk_path="${ANDROID_NDK_HOME:-}" +[[ -n "$ndk_path" ]] || { printf 'Error: ANDROID_NDK_HOME is not set\n' >&2; exit 1; } +stack_script="$ndk_path/ndk-stack" +[[ -x "$stack_script" ]] || { printf 'Error: ndk-stack was not found at %s\n' "$stack_script" >&2; exit 1; } + +cd -- "$project_root" +filename="tombstone_0${1}" +adb pull "/storage/emulated/0/Android/data/com.beatgames.beatsaber/files/$filename" +"$stack_script" -sym "$project_root/build/debug/" < "$filename" > "${filename}_unstripped.txt" + +if command -v code >/dev/null 2>&1; then + code "${filename}_unstripped.txt" +else + printf 'Created %s (the code command was not found, so it was not opened)\n' "${filename}_unstripped.txt" +fi diff --git a/restart-game.ps1 b/scripts/restart-game.ps1 similarity index 100% rename from restart-game.ps1 rename to scripts/restart-game.ps1 diff --git a/scripts/restart-game.sh b/scripts/restart-game.sh new file mode 100755 index 0000000..9444092 --- /dev/null +++ b/scripts/restart-game.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -euo pipefail + +package="com.beatgames.beatsaber" +activity="$package/com.unity3d.player.UnityPlayerActivity" + +adb shell am force-stop "$package" +adb shell am start "$activity" +sleep 1 +adb shell am start "$activity" diff --git a/start-logging.ps1 b/scripts/start-logging.ps1 similarity index 93% rename from start-logging.ps1 rename to scripts/start-logging.ps1 index 91fdbab..44320c7 100644 --- a/start-logging.ps1 +++ b/scripts/start-logging.ps1 @@ -36,7 +36,7 @@ if ($help -eq $true) { $bspid = adb shell pidof com.beatgames.beatsaber $command = "adb logcat " -if ($all -eq $false) { +if ($all -eq $true) { $loops = 0 while ([string]::IsNullOrEmpty($bspid) -and $loops -lt 3) { Start-Sleep -Milliseconds 100 @@ -55,8 +55,8 @@ if ($all -eq $false) { if ($all -eq $false) { $pattern = "(" if ($self -eq $true) { - $modID = (Get-Content "./mod.json" -Raw | ConvertFrom-Json).id - $pattern += "ChatPlexSDK-BS|$modID|" + $modName = (Get-Content "./mod.json" -Raw | ConvertFrom-Json).name + $pattern += "ChatPlexSDK-BS|$modName|" } if (![string]::IsNullOrEmpty($custom)) { $pattern += "$custom|" diff --git a/scripts/start-logging.sh b/scripts/start-logging.sh new file mode 100755 index 0000000..6bc6b95 --- /dev/null +++ b/scripts/start-logging.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash + +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +self_only=false +all=false +custom="" +log_file="" +exclude_header=false +show_help=false + +usage() { + if [[ "$exclude_header" == false ]]; then + cat <<'EOF' +"Start-Logging" - Logs Beat Saber using adb logcat + +Arguments: +EOF + fi + cat <<'EOF' + -self, --self Only show this mod and crash logs + -all, --all Show all logs from the Beat Saber process + -custom, --custom REGEX + Add a custom pattern; AndroidRuntime and CRASH are always included + -file, --file FILE Save output under the scripts folder + -help, --help Show this help +EOF +} + +while (($#)); do + case "$1" in + -self|--self) self_only=true; shift ;; + -all|--all) all=true; shift ;; + -custom|--custom) + (($# >= 2)) || { printf 'Missing custom pattern\n' >&2; exit 2; } + custom="$2" + shift 2 + ;; + -custom:*|--custom=*) + custom="${1#*:}" + [[ "$1" == --custom=* ]] && custom="${1#*=}" + shift + ;; + -file|--file) + (($# >= 2)) || { printf 'Missing output file\n' >&2; exit 2; } + log_file="$2" + shift 2 + ;; + -file:*|--file=*) + log_file="${1#*:}" + [[ "$1" == --file=* ]] && log_file="${1#*=}" + shift + ;; + -excludeHeader|--exclude-header) exclude_header=true; shift ;; + -help|--help|-h) show_help=true; shift ;; + *) printf 'Unknown argument: %s\n' "$1" >&2; usage >&2; exit 2 ;; + esac +done + +if [[ "$show_help" == true ]]; then + usage + exit 0 +fi + +cd -- "$project_root" + +output_file="" +if [[ -n "$log_file" ]]; then + if [[ "$log_file" = /* ]]; then + output_file="$log_file" + else + output_file="$script_dir/$log_file" + fi +fi + +if [[ "$all" == true ]]; then + beat_saber_pid="" + for _ in 0 1 2 3; do + beat_saber_pid="$(adb shell pidof com.beatgames.beatsaber 2>/dev/null | tr -d '\r')" + [[ -n "$beat_saber_pid" ]] && break + sleep 0.1 + done + + if [[ -z "$beat_saber_pid" ]]; then + printf 'Could not connect to adb or find Beat Saber, exiting...\n' >&2 + exit 1 + fi + + printf 'Logging using command: adb logcat --pid %s\n' "$beat_saber_pid" + if [[ -n "$output_file" ]]; then + adb logcat --pid "$beat_saber_pid" > "$output_file" + else + adb logcat --pid "$beat_saber_pid" + fi + exit +fi + +pattern="" +if [[ "$self_only" == true ]]; then + command -v jq >/dev/null 2>&1 || { printf 'Error: jq is required for --self\n' >&2; exit 1; } + mod_name="$(jq -er '.name' "$project_root/mod.json")" + pattern+="ChatPlexSDK-BS|$mod_name|" +fi +[[ -n "$custom" ]] && pattern+="$custom|" +[[ -n "$pattern" ]] || pattern='QuestHook|modloader|scotland2|ChatPlexSDK-BS|' +pattern+='AndroidRuntime|CRASH' + +printf 'Logging using command: adb logcat | grep -E %q\n' "$pattern" +if [[ -n "$output_file" ]]; then + adb logcat | grep --line-buffered -E "$pattern" > "$output_file" +else + adb logcat | grep --line-buffered -E "$pattern" +fi diff --git a/validate-modjson.ps1 b/scripts/validate-modjson.ps1 similarity index 100% rename from validate-modjson.ps1 rename to scripts/validate-modjson.ps1 diff --git a/scripts/validate-modjson.sh b/scripts/validate-modjson.sh new file mode 100755 index 0000000..9b7cf9a --- /dev/null +++ b/scripts/validate-modjson.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +exit +set -euo pipefail + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" +project_root="$(cd -- "$script_dir/.." && pwd -P)" +mod_file="$project_root/mod.json" +template_file="$project_root/mod.template.json" +schema_url="https://raw.githubusercontent.com/Lauriethefish/QuestPatcher.QMod/refs/heads/main/QuestPatcher.QMod/Resources/qmod.schema.json" + +cd -- "$project_root" + +if [[ ! -f "$mod_file" ]]; then + if [[ -f "$template_file" ]]; then + if command -v qpm-rust >/dev/null 2>&1; then + qpm-rust qmod build + elif command -v qpm >/dev/null 2>&1; then + qpm qmod build + else + printf 'Error: qpm is required to generate mod.json from mod.template.json\n' >&2 + exit 1 + fi + else + printf 'Error: mod.json and mod.template.json were not present\n' >&2 + exit 1 + fi +fi + +printf 'Creating qmod from mod.json\n' +command -v curl >/dev/null 2>&1 || { printf 'Error: curl is required to download the qmod schema\n' >&2; exit 1; } +command -v python3 >/dev/null 2>&1 || { printf 'Error: Python 3 and jsonschema are required to validate mod.json\n' >&2; exit 1; } + +schema_file="$(mktemp)" +trap 'rm -f -- "$schema_file"' EXIT +curl -fsSL "$schema_url" -o "$schema_file" + +printf 'Validating mod.json...\n' +python3 - "$mod_file" "$schema_file" <<'PY' +import json +import sys + +try: + import jsonschema +except ImportError: + print("Error: install the Python 'jsonschema' package to validate mod.json", file=sys.stderr) + raise SystemExit(1) + +mod_path, schema_path = sys.argv[1:] +try: + with open(mod_path, encoding="utf-8") as mod_stream: + instance = json.load(mod_stream) + with open(schema_path, encoding="utf-8") as schema_stream: + schema = json.load(schema_stream) +except (OSError, json.JSONDecodeError) as error: + print(f"Error: {error}", file=sys.stderr) + raise SystemExit(1) + +validator_class = jsonschema.validators.validator_for(schema) +try: + validator_class.check_schema(schema) +except jsonschema.SchemaError as error: + print(f"Error: invalid qmod schema: {error.message}", file=sys.stderr) + raise SystemExit(1) + +validator = validator_class(schema, format_checker=validator_class.FORMAT_CHECKER) +errors = sorted(validator.iter_errors(instance), key=lambda error: list(error.absolute_path)) +if errors: + print("Error: mod.json is not valid", file=sys.stderr) + for error in errors: + location = "$" + for part in error.absolute_path: + location += f"[{part}]" if isinstance(part, int) else f".{part}" + print(f" {location}: {error.message}", file=sys.stderr) + raise SystemExit(1) +PY From 751fd904d00ad72faf4d41bbaa828c900edb85b6 Mon Sep 17 00:00:00 2001 From: HardCPP Date: Mon, 10 Aug 2026 00:35:00 +0200 Subject: [PATCH 3/6] CI/CD: Update publish workflow --- .github/workflows/build-ndk.yml | 2 +- .github/workflows/publish.yml | 3 ++- .gitignore | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-ndk.yml b/.github/workflows/build-ndk.yml index a830b4c..0d1b512 100644 --- a/.github/workflows/build-ndk.yml +++ b/.github/workflows/build-ndk.yml @@ -53,7 +53,7 @@ jobs: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> ${GITHUB_OUTPUT} - name: Setup qpm - uses: Fernthedev/qpm-action@main + uses: Fernthedev/qpm-action@v1 with: workflow_token: ${{ secrets.GITHUB_TOKEN }} restore: true diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index da567c6..fe40fd3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -43,7 +43,7 @@ jobs: echo VERSION="${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT - name: Setup qpm - uses: Fernthedev/qpm-action@main + uses: Fernthedev/qpm-action@v1 with: workflow_token: ${{ secrets.GITHUB_TOKEN }} restore: true @@ -54,6 +54,7 @@ jobs: qpm_release_bin: true qpm_debug_bin: true qpm_qmod: ${{ env.qmodName }}.qmod + resolve_ndk: true - name: Build & Create Qmod run: | diff --git a/.gitignore b/.gitignore index 9d7352d..34b63fe 100644 --- a/.gitignore +++ b/.gitignore @@ -66,4 +66,5 @@ cmake-build-*/ extern.cmake # QMOD Schema -mod.json.schema \ No newline at end of file +mod.json.schema +.env From e33bc0f461b26fb81892dc3a2bd833acf17b488b Mon Sep 17 00:00:00 2001 From: HardCPP Date: Mon, 10 Aug 2026 00:35:29 +0200 Subject: [PATCH 4/6] Use properties instead of fields --- src/Components/MusicBandLogoRemover.cpp | 2 +- src/GameTweaker.cpp | 4 +- src/Managers/CustomMenuLightManager.cpp | 51 ++++++++++--------- src/Patches/PComboUIController.cpp | 4 +- src/Patches/PLevelListTableCell.cpp | 7 +-- src/Patches/PLevelSearchViewController.cpp | 4 +- src/Patches/PMainMenuViewController.cpp | 4 +- src/Patches/PNoteCutCoreEffectsSpawner.cpp | 2 +- .../PObstacleSaberSparkleEffectManager.cpp | 2 +- .../PPlayerHeightSettingsController.cpp | 4 +- .../PPlayerSettingsPanelController.cpp | 30 +++++------ src/Patches/PSaberClashEffect.cpp | 4 +- 12 files changed, 58 insertions(+), 60 deletions(-) diff --git a/src/Components/MusicBandLogoRemover.cpp b/src/Components/MusicBandLogoRemover.cpp index ecc7fdd..116fa60 100644 --- a/src/Components/MusicBandLogoRemover.cpp +++ b/src/Components/MusicBandLogoRemover.cpp @@ -50,7 +50,7 @@ namespace QBeatSaberPlus_GameTweaker::Components { return; } - if (m_AudioTimeSyncController->____songTime == 0.0f) + if (m_AudioTimeSyncController->_songTime == 0.0f) return; GameObject* l_Object = nullptr; diff --git a/src/GameTweaker.cpp b/src/GameTweaker.cpp index 8a9047e..ad95d57 100644 --- a/src/GameTweaker.cpp +++ b/src/GameTweaker.cpp @@ -165,8 +165,8 @@ namespace QBeatSaberPlus_GameTweaker { if (GTConfig::Instance()->Environment->RemoveMusicBandLogo && p_LevelData && p_LevelData->Data && p_LevelData->Data->targetEnvironmentInfo) { - if ( p_LevelData->Data->targetEnvironmentInfo->____serializedName == "BTSEnvironment" - || p_LevelData->Data->targetEnvironmentInfo->____serializedName == "LinkinParkEnvironment") + if ( p_LevelData->Data->targetEnvironmentInfo->_serializedName == "BTSEnvironment" + || p_LevelData->Data->targetEnvironmentInfo->_serializedName == "LinkinParkEnvironment") { GameObject::New_ctor("BeatSaberPlus_MusicBandLogoRemover")->AddComponent(); } diff --git a/src/Managers/CustomMenuLightManager.cpp b/src/Managers/CustomMenuLightManager.cpp index 4f487cc..62dbd8a 100644 --- a/src/Managers/CustomMenuLightManager.cpp +++ b/src/Managers/CustomMenuLightManager.cpp @@ -3,6 +3,7 @@ #include +#include #include #include #include @@ -65,21 +66,21 @@ namespace QBeatSaberPlus_GameTweaker::Managers { { for (int l_I = 0; l_I < m_DefaultPresetBackup.size(); ++l_I) { - m_DefaultPreset->____lightIdColorPairs[l_I]->___intensity = std::get<0>(m_DefaultPresetBackup[l_I]); - m_DefaultPreset->____lightIdColorPairs[l_I]->___baseColor = std::get<1>(m_DefaultPresetBackup[l_I]).Ptr(); + m_DefaultPreset->_lightIdColorPairs[l_I]->intensity = std::get<0>(m_DefaultPresetBackup[l_I]); + m_DefaultPreset->_lightIdColorPairs[l_I]->baseColor = std::get<1>(m_DefaultPresetBackup[l_I]).Ptr(); } if (m_LevelClearedPreset && m_LevelFailedPreset) { for (int l_I = 0; l_I < m_LevelClearedPresetBackup.size(); ++l_I) { - m_LevelClearedPreset->____lightIdColorPairs[l_I]->___intensity = std::get<0>(m_LevelClearedPresetBackup[l_I]); - m_LevelClearedPreset->____lightIdColorPairs[l_I]->___baseColor = std::get<1>(m_LevelClearedPresetBackup[l_I]).Ptr(); + m_LevelClearedPreset->_lightIdColorPairs[l_I]->intensity = std::get<0>(m_LevelClearedPresetBackup[l_I]); + m_LevelClearedPreset->_lightIdColorPairs[l_I]->baseColor = std::get<1>(m_LevelClearedPresetBackup[l_I]).Ptr(); } for (int l_I = 0; l_I < m_LevelFailedPresetBackup.size(); ++l_I) { - m_LevelFailedPreset->____lightIdColorPairs[l_I]->___intensity = std::get<0>(m_LevelFailedPresetBackup[l_I]); - m_LevelFailedPreset->____lightIdColorPairs[l_I]->___baseColor = std::get<1>(m_LevelFailedPresetBackup[l_I]).Ptr(); + m_LevelFailedPreset->_lightIdColorPairs[l_I]->intensity = std::get<0>(m_LevelFailedPresetBackup[l_I]); + m_LevelFailedPreset->_lightIdColorPairs[l_I]->baseColor = std::get<1>(m_LevelFailedPresetBackup[l_I]).Ptr(); } } } @@ -89,16 +90,16 @@ namespace QBeatSaberPlus_GameTweaker::Managers { m_Custom_Cleared->_color = GTConfig::Instance()->MainMenu->LevelClearedColor; m_Custom_Failed->_color = GTConfig::Instance()->MainMenu->LevelFailedColor; - for (int l_I = 0; l_I < m_DefaultPreset->____lightIdColorPairs->get_Length(); ++l_I) - m_DefaultPreset->____lightIdColorPairs[l_I]->___baseColor = m_Custom_Default.Ptr(); + for (int l_I = 0; l_I < m_DefaultPreset->_lightIdColorPairs->get_Length(); ++l_I) + m_DefaultPreset->_lightIdColorPairs[l_I]->baseColor = m_Custom_Default.Ptr(); if (m_LevelClearedPreset && m_LevelFailedPreset) { - for (int l_I = 0; l_I < m_LevelClearedPreset->____lightIdColorPairs->get_Length(); ++l_I) - m_LevelClearedPreset->____lightIdColorPairs[l_I]->___baseColor = m_Custom_Cleared.Ptr(); + for (int l_I = 0; l_I < m_LevelClearedPreset->_lightIdColorPairs->get_Length(); ++l_I) + m_LevelClearedPreset->_lightIdColorPairs[l_I]->baseColor = m_Custom_Cleared.Ptr(); - for (int l_I = 0; l_I < m_LevelFailedPreset->____lightIdColorPairs->get_Length(); ++l_I) - m_LevelFailedPreset->____lightIdColorPairs[l_I]->___baseColor = m_Custom_Failed.Ptr(); + for (int l_I = 0; l_I < m_LevelFailedPreset->_lightIdColorPairs->get_Length(); ++l_I) + m_LevelFailedPreset->_lightIdColorPairs[l_I]->baseColor = m_Custom_Failed.Ptr(); } } @@ -106,7 +107,7 @@ namespace QBeatSaberPlus_GameTweaker::Managers { { if (m_MenuLightsManager && m_DefaultPreset) { - m_MenuLightsManager->____preset = m_DefaultPreset.Ptr(); + m_MenuLightsManager->_preset = m_DefaultPreset.Ptr(); m_MenuLightsManager->set_enabled(true); m_MenuLightsManager->RefreshColors(); } @@ -126,7 +127,7 @@ namespace QBeatSaberPlus_GameTweaker::Managers { { if (m_MenuLightsManager && m_DefaultPreset) { - m_MenuLightsManager->____preset = m_DefaultPreset.Ptr(); + m_MenuLightsManager->_preset = m_DefaultPreset.Ptr(); m_MenuLightsManager->set_enabled(true); m_MenuLightsManager->RefreshColors(); } @@ -146,7 +147,7 @@ namespace QBeatSaberPlus_GameTweaker::Managers { { if (m_MenuLightsManager && m_LevelClearedPreset) { - m_MenuLightsManager->____preset = m_LevelClearedPreset.Ptr(); + m_MenuLightsManager->_preset = m_LevelClearedPreset.Ptr(); m_MenuLightsManager->set_enabled(true); m_MenuLightsManager->RefreshColors(); } @@ -166,7 +167,7 @@ namespace QBeatSaberPlus_GameTweaker::Managers { { if (m_MenuLightsManager && m_LevelFailedPreset) { - m_MenuLightsManager->____preset = m_LevelFailedPreset.Ptr(); + m_MenuLightsManager->_preset = m_LevelFailedPreset.Ptr(); m_MenuLightsManager->set_enabled(true); m_MenuLightsManager->RefreshColors(); } @@ -192,10 +193,10 @@ namespace QBeatSaberPlus_GameTweaker::Managers { m_MenuLightsManager = l_Found; } - m_DefaultPreset = m_MenuLightsManager->____defaultPreset; + m_DefaultPreset = m_MenuLightsManager->_defaultPreset; - for (auto& l_Current : m_DefaultPreset->____lightIdColorPairs) - m_DefaultPresetBackup.push_back(std::make_tuple(l_Current->___intensity, l_Current->___baseColor.unsafePtr())); + for (auto& l_Current : m_DefaultPreset->_lightIdColorPairs) + m_DefaultPresetBackup.push_back(std::make_tuple(l_Current->intensity, l_Current->baseColor.unsafePtr())); UpdateFromConfig(); @@ -206,14 +207,14 @@ namespace QBeatSaberPlus_GameTweaker::Managers { l_SoloFreePlayFlowCoordinator = GameObject::FindObjectOfType(); } - m_LevelClearedPreset = l_SoloFreePlayFlowCoordinator->____resultsClearedLightsPreset; - m_LevelFailedPreset = l_SoloFreePlayFlowCoordinator->____resultsFailedLightsPreset; + m_LevelClearedPreset = l_SoloFreePlayFlowCoordinator->_resultsClearedLightsPreset; + m_LevelFailedPreset = l_SoloFreePlayFlowCoordinator->_resultsFailedLightsPreset; - for (auto& l_Current : m_LevelClearedPreset->____lightIdColorPairs) - m_LevelClearedPresetBackup.push_back(std::make_tuple(l_Current->___intensity, l_Current->___baseColor.unsafePtr())); + for (auto& l_Current : m_LevelClearedPreset->_lightIdColorPairs) + m_LevelClearedPresetBackup.push_back(std::make_tuple(l_Current->intensity, l_Current->baseColor.unsafePtr())); - for (auto& l_Current : m_LevelFailedPreset->____lightIdColorPairs) - m_LevelFailedPresetBackup.push_back(std::make_tuple(l_Current->___intensity, l_Current->___baseColor.unsafePtr())); + for (auto& l_Current : m_LevelFailedPreset->_lightIdColorPairs) + m_LevelFailedPresetBackup.push_back(std::make_tuple(l_Current->intensity, l_Current->baseColor.unsafePtr())); UpdateFromConfig(); } diff --git a/src/Patches/PComboUIController.cpp b/src/Patches/PComboUIController.cpp index 233a059..aed511a 100644 --- a/src/Patches/PComboUIController.cpp +++ b/src/Patches/PComboUIController.cpp @@ -22,9 +22,9 @@ namespace QBeatSaberPlus_GameTweaker::Patches { return; ///< Continue to original function } - if (!__Instance->____fullComboLost) + if (!__Instance->_fullComboLost) { - __Instance->____fullComboLost = true; + __Instance->_fullComboLost = true; auto l_Line0 = __Instance->get_transform()->Find("Line0"); auto l_Line1 = __Instance->get_transform()->Find("Line1"); diff --git a/src/Patches/PLevelListTableCell.cpp b/src/Patches/PLevelListTableCell.cpp index d9dbc10..8a330e8 100644 --- a/src/Patches/PLevelListTableCell.cpp +++ b/src/Patches/PLevelListTableCell.cpp @@ -5,9 +5,6 @@ #include #include -#include -#include - #include #include #include @@ -32,7 +29,7 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { auto l_HaveAnyScore = false; auto l_HaveAllScores = false; - CP_SDK_BS::Game::Levels::GetScoresByLevelID(__a->___levelID, &l_HaveAnyScore, &l_HaveAllScores); + CP_SDK_BS::Game::Levels::GetScoresByLevelID(__a->levelID, &l_HaveAnyScore, &l_HaveAllScores); StringW l_ColorPrefix; if (l_HaveAllScores) @@ -40,7 +37,7 @@ namespace QBeatSaberPlus_GameTweaker::Patches { else if (l_HaveAnyScore) l_ColorPrefix = "<" + ColorU::ToHexRGB(ColorU::Convert(l_Config->LevelSelection->HighlightPlayed)) + ">"; - __Instance->____songNameText->set_text(l_ColorPrefix + __Instance->____songNameText->get_text()); + __Instance->_songNameText->set_text(l_ColorPrefix + __Instance->_songNameText->get_text()); } catch (const std::exception& l_Exception) { diff --git a/src/Patches/PLevelSearchViewController.cpp b/src/Patches/PLevelSearchViewController.cpp index 1a3f4f6..3873570 100644 --- a/src/Patches/PLevelSearchViewController.cpp +++ b/src/Patches/PLevelSearchViewController.cpp @@ -39,8 +39,8 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { LevelSearchViewController_Setup(__Instance, __a, __b, __c); - if (__Instance->____filterParamsText) - PLevelSearchViewController_FilterButton = __Instance->____filterParamsText->get_transform()->get_parent()->get_gameObject(); + if (__Instance->_filterParamsText) + PLevelSearchViewController_FilterButton = __Instance->_filterParamsText->get_transform()->get_parent()->get_gameObject(); else PLevelSearchViewController_FilterButton = nullptr; diff --git a/src/Patches/PMainMenuViewController.cpp b/src/Patches/PMainMenuViewController.cpp index 5f8b962..2948e63 100644 --- a/src/Patches/PMainMenuViewController.cpp +++ b/src/Patches/PMainMenuViewController.cpp @@ -36,8 +36,8 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { MainMenuViewController_DidActivate(__Instance, __a, __b, __c); - if (PMainMenuViewController_MusicPackPromoBanner != __Instance->____musicPackPromoBanner) - PMainMenuViewController_MusicPackPromoBanner = __Instance->____musicPackPromoBanner; + if (PMainMenuViewController_MusicPackPromoBanner != __Instance->_musicPackPromoBanner) + PMainMenuViewController_MusicPackPromoBanner = __Instance->_musicPackPromoBanner; auto l_Config = GTConfig::Instance(); if (l_Config->Enabled) diff --git a/src/Patches/PNoteCutCoreEffectsSpawner.cpp b/src/Patches/PNoteCutCoreEffectsSpawner.cpp index f3434e4..f0d1620 100644 --- a/src/Patches/PNoteCutCoreEffectsSpawner.cpp +++ b/src/Patches/PNoteCutCoreEffectsSpawner.cpp @@ -36,7 +36,7 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { NoteCutCoreEffectsSpawner_Start(__Instance); - PNoteCutCoreEffectsSpawner_NoteCutParticlesEffect = __Instance->____noteCutParticlesEffect; + PNoteCutCoreEffectsSpawner_NoteCutParticlesEffect = __Instance->_noteCutParticlesEffect; auto l_Config = GTConfig::Instance(); if (l_Config->Enabled) diff --git a/src/Patches/PObstacleSaberSparkleEffectManager.cpp b/src/Patches/PObstacleSaberSparkleEffectManager.cpp index 265c219..7b6864b 100644 --- a/src/Patches/PObstacleSaberSparkleEffectManager.cpp +++ b/src/Patches/PObstacleSaberSparkleEffectManager.cpp @@ -43,7 +43,7 @@ namespace QBeatSaberPlus_GameTweaker::Patches { ObstacleSaberSparkleEffectManager_Start(__Instance); PObstacleSaberSparkleEffectManager_ObstacleSaberSparkleEffects.clear(); - for (auto& l_Current : __Instance->____effects) + for (auto& l_Current : __Instance->_effects) PObstacleSaberSparkleEffectManager_ObstacleSaberSparkleEffects.push_back(l_Current.unsafePtr()); auto l_Config = GTConfig::Instance(); diff --git a/src/Patches/PPlayerHeightSettingsController.cpp b/src/Patches/PPlayerHeightSettingsController.cpp index f459abb..596b7c3 100644 --- a/src/Patches/PPlayerHeightSettingsController.cpp +++ b/src/Patches/PPlayerHeightSettingsController.cpp @@ -21,9 +21,9 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { std::ostringstream l_Builder; l_Builder.precision(2); - l_Builder << std::fixed << __Instance->____value; + l_Builder << std::fixed << __Instance->_value; - __Instance->____text->set_text(l_Builder.str()); + __Instance->_text->set_text(l_Builder.str()); } } diff --git a/src/Patches/PPlayerSettingsPanelController.cpp b/src/Patches/PPlayerSettingsPanelController.cpp index 6dcafa7..471acf5 100644 --- a/src/Patches/PPlayerSettingsPanelController.cpp +++ b/src/Patches/PPlayerSettingsPanelController.cpp @@ -180,21 +180,21 @@ namespace QBeatSaberPlus_GameTweaker::Patches { PlayerSettingsPanelController::PlayerSettingsPanelLayout __a) { - PMainMenuViewController_LeftHandedToggle = __Instance->____leftHandedToggle; - PMainMenuViewController_EnvironmentEffectsFilterDefaultPresetDropdown = __Instance->____environmentEffectsFilterDefaultPresetDropdown; - PMainMenuViewController_EnvironmentEffectsFilterExpertPlusPresetDropdown = __Instance->____environmentEffectsFilterExpertPlusPresetDropdown; - PMainMenuViewController_ReduceDebrisToggle = __Instance->____reduceDebrisToggle; - PMainMenuViewController_NoTextsAndHudsToggle = __Instance->____noTextsAndHudsToggle; - PMainMenuViewController_AdvanceHudToggle = __Instance->____advanceHudToggle; - PMainMenuViewController_PlayerHeightSettingsController = __Instance->____playerHeightSettingsController; - PMainMenuViewController_AutomaticPlayerHeightToggle = __Instance->____automaticPlayerHeightToggle; - PMainMenuViewController_SfxVolumeSettingsController = __Instance->____sfxVolumeSettingsController; - PMainMenuViewController_SaberTrailIntensitySettingsController = __Instance->____saberTrailIntensitySettingsController; - PMainMenuViewController_NoteJumpStartBeatOffsetDropdown = __Instance->____noteJumpStartBeatOffsetDropdown; - PMainMenuViewController_HideNoteSpawnEffectToggle = __Instance->____hideNoteSpawnEffectToggle; - PMainMenuViewController_AdaptiveSfxToggle = __Instance->____adaptiveSfxToggle; - PMainMenuViewController_NoteJumpDurationTypeSettingsDropdown = __Instance->____noteJumpDurationTypeSettingsDropdown; - PMainMenuViewController_NoteJumpFixedDurationSettingsController = __Instance->____noteJumpFixedDurationSettingsController; + PMainMenuViewController_LeftHandedToggle = __Instance->_leftHandedToggle; + PMainMenuViewController_EnvironmentEffectsFilterDefaultPresetDropdown = __Instance->_environmentEffectsFilterDefaultPresetDropdown; + PMainMenuViewController_EnvironmentEffectsFilterExpertPlusPresetDropdown = __Instance->_environmentEffectsFilterExpertPlusPresetDropdown; + PMainMenuViewController_ReduceDebrisToggle = __Instance->_reduceDebrisToggle; + PMainMenuViewController_NoTextsAndHudsToggle = __Instance->_noTextsAndHudsToggle; + PMainMenuViewController_AdvanceHudToggle = __Instance->_advanceHudToggle; + PMainMenuViewController_PlayerHeightSettingsController = __Instance->_playerHeightSettingsController; + PMainMenuViewController_AutomaticPlayerHeightToggle = __Instance->_automaticPlayerHeightToggle; + PMainMenuViewController_SfxVolumeSettingsController = __Instance->_sfxVolumeSettingsController; + PMainMenuViewController_SaberTrailIntensitySettingsController = __Instance->_saberTrailIntensitySettingsController; + PMainMenuViewController_NoteJumpStartBeatOffsetDropdown = __Instance->_noteJumpStartBeatOffsetDropdown; + PMainMenuViewController_HideNoteSpawnEffectToggle = __Instance->_hideNoteSpawnEffectToggle; + PMainMenuViewController_AdaptiveSfxToggle = __Instance->_adaptiveSfxToggle; + PMainMenuViewController_NoteJumpDurationTypeSettingsDropdown = __Instance->_noteJumpDurationTypeSettingsDropdown; + PMainMenuViewController_NoteJumpFixedDurationSettingsController = __Instance->_noteJumpFixedDurationSettingsController; auto l_Config = GTConfig::Instance(); diff --git a/src/Patches/PSaberClashEffect.cpp b/src/Patches/PSaberClashEffect.cpp index 409ba3b..8739953 100644 --- a/src/Patches/PSaberClashEffect.cpp +++ b/src/Patches/PSaberClashEffect.cpp @@ -44,8 +44,8 @@ namespace QBeatSaberPlus_GameTweaker::Patches { { SaberClashEffect_Start(__Instance); - PSaberClashEffect_SparkleParticleSystem = __Instance->____sparkleParticleSystem; - PSaberClashEffect_GlowParticleSystem = __Instance->____glowParticleSystem; + PSaberClashEffect_SparkleParticleSystem = __Instance->_sparkleParticleSystem; + PSaberClashEffect_GlowParticleSystem = __Instance->_glowParticleSystem; auto l_Config = GTConfig::Instance(); if (l_Config->Enabled) From 6d11c7bc11659ca585abf4a16ae30ff0a8e0a476 Mon Sep 17 00:00:00 2001 From: HardCPP Date: Mon, 10 Aug 2026 00:35:43 +0200 Subject: [PATCH 5/6] Fix possible crash in MusicBandLogoRemover --- src/Components/MusicBandLogoRemover.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Components/MusicBandLogoRemover.cpp b/src/Components/MusicBandLogoRemover.cpp index 116fa60..cb2c192 100644 --- a/src/Components/MusicBandLogoRemover.cpp +++ b/src/Components/MusicBandLogoRemover.cpp @@ -74,7 +74,11 @@ namespace QBeatSaberPlus_GameTweaker::Components { if (l_Object != nullptr) l_Object->GetComponent()->set_enabled(false); - l_Object = Resources::FindObjectsOfTypeAll()->FirstOrDefault([](GameObject* x) { return x->get_name() == "Logo" && x->get_transform()->get_parent()->get_name() == "Environment"; }); + l_Object = Resources::FindObjectsOfTypeAll()->FirstOrDefault([](GameObject* x) { + return x->get_name() == "Logo" && + x->get_transform()->get_parent() && + x->get_transform()->get_parent()->get_name() == "Environment"; + }); if (l_Object != nullptr) l_Object->GetComponent()->set_enabled(false); From 5e10b6a8949e3e08df7ba87e4df84cbf3a5e7104 Mon Sep 17 00:00:00 2001 From: HardCPP Date: Mon, 10 Aug 2026 00:36:03 +0200 Subject: [PATCH 6/6] Bump version --- include/git_info.h | 2 +- mod.json | 14 ++-- qpm.json | 28 +++---- qpm.shared.json | 190 ++++++++++++++++++++++----------------------- 4 files changed, 117 insertions(+), 117 deletions(-) diff --git a/include/git_info.h b/include/git_info.h index 8a3b54a..46995c3 100644 --- a/include/git_info.h +++ b/include/git_info.h @@ -1,5 +1,5 @@ #pragma once #define GIT_USER "HardCPP" #define GIT_BRANCH "dev" -#define GIT_COMMIT 0x7dee42f +#define GIT_COMMIT 0xae7ef0d #define GIT_MODIFIED 1 diff --git a/mod.json b/mod.json index 19603fb..72d01b1 100644 --- a/mod.json +++ b/mod.json @@ -5,7 +5,7 @@ "id": "qbeatsaberplus-gametweaker", "modloader": "Scotland2", "author": "HardCPP", - "version": "6.4.1", + "version": "6.4.5", "packageId": "com.beatgames.beatsaber", "packageVersion": "1.40.8_7379", "description": "Feel good!", @@ -17,19 +17,19 @@ "downloadIfMissing": "https://github.com/QuestPackageManager/beatsaber-hook/releases/download/v6.4.2/beatsaber-hook.qmod" }, { - "version": "^0.18.3", + "version": "^0.18.4", "id": "custom-types", - "downloadIfMissing": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/CustomTypes.qmod" + "downloadIfMissing": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.4/CustomTypes.qmod" }, { - "version": "^4.6.4", + "version": "^4.8.0", "id": "paper2_scotland2", - "downloadIfMissing": "https://github.com/Fernthedev/paperlog/releases/download/v4.6.4/paper2_scotland2.qmod" + "downloadIfMissing": "https://github.com/Fernthedev/paperlog/releases/download/v4.8.0/paper2_scotland2.qmod" }, { - "version": "^6.4.1", + "version": "^6.4.5", "id": "chatplex-sdk-bs", - "downloadIfMissing": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/ChatPlexSDK-BS.qmod" + "downloadIfMissing": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.5/ChatPlexSDK-BS.qmod" } ], "modFiles": [], diff --git a/qpm.json b/qpm.json index a40939a..81f36f1 100644 --- a/qpm.json +++ b/qpm.json @@ -5,7 +5,7 @@ "info": { "name": "QBeatSaberPlus-GameTweaker", "id": "qbeatsaberplus-gametweaker", - "version": "6.4.1", + "version": "6.4.5", "url": "https://github.com/hardcpp/QBeatSaberPlus-GameTweaker", "additionalData": { "overrideSoName": "libqbeatsaberplus-gametweaker.so", @@ -15,28 +15,28 @@ "workspace": { "scripts": { "build": [ - "pwsh ./build.ps1" + "pwsh ./scripts/build.ps1" ], "clean": [ - "pwsh ./build.ps1 -clean" + "pwsh ./scripts/build.ps1 -clean" ], "copy": [ - "pwsh ./copy.ps1" + "pwsh ./scripts/copy.ps1" ], "log": [ - "pwsh ./start-logging.ps1" + "pwsh ./scripts/start-logging.ps1" ], "qmod": [ - "pwsh ./build.ps1 -clean", - "pwsh ./createqmod.ps1 -clean" + "pwsh ./scripts/build.ps1 -clean", + "pwsh ./scripts/createqmod.ps1 -clean" ], "qmod_backup": [ - "pwsh ./build.ps1 -clean", + "pwsh ./scripts/build.ps1 -clean", "qpm qmod build", - "pwsh ./createqmod.ps1 -clean" + "pwsh ./scripts/createqmod.ps1 -clean" ] }, - "ndk": "^27.2.12479018", + "ndk": "^27.3.13750724", "qmodIncludeDirs": [ "build", "extern/libs" @@ -52,12 +52,12 @@ }, { "id": "bs-cordl", - "versionRange": "^4008.*", + "versionRange": "4008.*", "additionalData": {} }, { "id": "custom-types", - "versionRange": "^0.18.3", + "versionRange": "^0.18.4", "additionalData": {} }, { @@ -70,7 +70,7 @@ }, { "id": "paper2_scotland2", - "versionRange": "^4.6.4", + "versionRange": "^4.8.0", "additionalData": {} }, { @@ -80,7 +80,7 @@ }, { "id": "chatplex-sdk-bs", - "versionRange": "^6.4.1", + "versionRange": "^6.4.5", "additionalData": { "private": true } diff --git a/qpm.shared.json b/qpm.shared.json index e204ce0..67d8c65 100644 --- a/qpm.shared.json +++ b/qpm.shared.json @@ -7,7 +7,7 @@ "info": { "name": "QBeatSaberPlus-GameTweaker", "id": "qbeatsaberplus-gametweaker", - "version": "6.4.1", + "version": "6.4.5", "url": "https://github.com/hardcpp/QBeatSaberPlus-GameTweaker", "additionalData": { "overrideSoName": "libqbeatsaberplus-gametweaker.so", @@ -17,28 +17,28 @@ "workspace": { "scripts": { "build": [ - "pwsh ./build.ps1" + "pwsh ./scripts/build.ps1" ], "clean": [ - "pwsh ./build.ps1 -clean" + "pwsh ./scripts/build.ps1 -clean" ], "copy": [ - "pwsh ./copy.ps1" + "pwsh ./scripts/copy.ps1" ], "log": [ - "pwsh ./start-logging.ps1" + "pwsh ./scripts/start-logging.ps1" ], "qmod": [ - "pwsh ./build.ps1 -clean", - "pwsh ./createqmod.ps1 -clean" + "pwsh ./scripts/build.ps1 -clean", + "pwsh ./scripts/createqmod.ps1 -clean" ], "qmod_backup": [ - "pwsh ./build.ps1 -clean", + "pwsh ./scripts/build.ps1 -clean", "qpm qmod build", - "pwsh ./createqmod.ps1 -clean" + "pwsh ./scripts/createqmod.ps1 -clean" ] }, - "ndk": "^27.2.12479018", + "ndk": "^27.3.13750724", "qmodIncludeDirs": [ "build", "extern/libs" @@ -59,7 +59,7 @@ }, { "id": "custom-types", - "versionRange": "^0.18.3", + "versionRange": "^0.18.4", "additionalData": {} }, { @@ -72,7 +72,7 @@ }, { "id": "paper2_scotland2", - "versionRange": "^4.6.4", + "versionRange": "^4.8.0", "additionalData": {} }, { @@ -82,7 +82,7 @@ }, { "id": "chatplex-sdk-bs", - "versionRange": "^6.4.1", + "versionRange": "^6.4.5", "additionalData": { "private": true } @@ -92,73 +92,40 @@ "restoredDependencies": [ { "dependency": { - "id": "paper2_scotland2", - "versionRange": "=4.6.4", + "id": "custom-types", + "versionRange": "=0.18.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", + "soLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.4/libcustom-types.so", + "debugSoLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.4/debug_libcustom-types.so", + "overrideSoName": "libcustom-types.so", + "modLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.4/CustomTypes.qmod", + "branchName": "version/v0_18_4", "compileOptions": { - "systemIncludes": [ - "shared/utfcpp/source" + "cppFlags": [ + "-Wno-invalid-offsetof" ] }, - "cmake": false - } - }, - "version": "4.6.4" - }, - { - "dependency": { - "id": "libil2cpp", - "versionRange": "=0.4.0", - "additionalData": { - "headersOnly": true, - "compileOptions": { - "systemIncludes": [ - "il2cpp/external/baselib/Include", - "il2cpp/external/baselib/Platforms/Android/Include" - ] - } - } - }, - "version": "0.4.0" - }, - { - "dependency": { - "id": "chatplex-sdk-bs", - "versionRange": "=6.4.1", - "additionalData": { - "soLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/libchatplex-sdk-bs.so", - "debugSoLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/debug_libchatplex-sdk-bs.so", - "overrideSoName": "libchatplex-sdk-bs.so", - "modLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.1/ChatPlexSDK-BS.qmod", - "branchName": "version/v6_4_1", "cmake": true } }, - "version": "6.4.1" + "version": "0.18.4" }, { "dependency": { - "id": "custom-types", - "versionRange": "=0.18.3", + "id": "kaleb", + "versionRange": "=0.1.9", "additionalData": { - "soLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/libcustom-types.so", - "debugSoLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/debug_libcustom-types.so", - "overrideSoName": "libcustom-types.so", - "modLink": "https://github.com/QuestPackageManager/Il2CppQuestTypePatching/releases/download/v0.18.3/CustomTypes.qmod", - "branchName": "version/v0_18_3", + "headersOnly": true, + "branchName": "version/v0_1_9", "compileOptions": { "cppFlags": [ - "-Wno-invalid-offsetof" + "-DKALEB_VERSION=\"0.1.9\"" ] }, - "cmake": true + "cmake": false } }, - "version": "0.18.3" + "version": "0.1.9" }, { "dependency": { @@ -184,6 +151,38 @@ }, "version": "4008.0.0" }, + { + "dependency": { + "id": "paper2_scotland2", + "versionRange": "=4.8.0", + "additionalData": { + "soLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.8.0/libpaper2_scotland2.so", + "overrideSoName": "libpaper2_scotland2.so", + "modLink": "https://github.com/Fernthedev/paperlog/releases/download/v4.8.0/paper2_scotland2.qmod", + "branchName": "version/v4_8_0", + "compileOptions": { + "systemIncludes": [ + "shared/utfcpp/source" + ] + }, + "cmake": false + } + }, + "version": "4.8.0" + }, + { + "dependency": { + "id": "scotland2", + "versionRange": "=0.1.7", + "additionalData": { + "soLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.7/libsl2.so", + "debugSoLink": "https://github.com/sc2ad/scotland2/releases/download/v0.1.7/debug_libsl2.so", + "overrideSoName": "libsl2.so", + "branchName": "version/v0_1_7" + } + }, + "version": "0.1.7" + }, { "dependency": { "id": "libcurl", @@ -197,6 +196,25 @@ }, "version": "8.5.0" }, + { + "dependency": { + "id": "fmt", + "versionRange": "=11.0.2", + "additionalData": { + "headersOnly": true, + "branchName": "version/v11_0_2", + "compileOptions": { + "systemIncludes": [ + "fmt/include/" + ], + "cppFlags": [ + "-DFMT_HEADER_ONLY" + ] + } + } + }, + "version": "11.0.2" + }, { "dependency": { "id": "beatsaber-hook", @@ -219,52 +237,34 @@ }, { "dependency": { - "id": "scotland2", - "versionRange": "=0.1.6", + "id": "chatplex-sdk-bs", + "versionRange": "=6.4.5", "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/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.5/libchatplex-sdk-bs.so", + "debugSoLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.5/debug_libchatplex-sdk-bs.so", + "overrideSoName": "libchatplex-sdk-bs.so", + "modLink": "https://github.com/hardcpp/QuestChatPlexSDK-BS/releases/download/v6.4.5/ChatPlexSDK-BS.qmod", + "branchName": "version/v6_4_5", + "cmake": true } }, - "version": "0.1.6" + "version": "6.4.5" }, { "dependency": { - "id": "fmt", - "versionRange": "=11.0.2", + "id": "libil2cpp", + "versionRange": "=0.4.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" - }, - { - "dependency": { - "id": "kaleb", - "versionRange": "=0.1.9", - "additionalData": { - "headersOnly": true, - "branchName": "version/v0_1_9", - "compileOptions": { - "cppFlags": [ - "-DKALEB_VERSION=\"0.1.9\"" - ] - }, - "cmake": false - } - }, - "version": "0.1.9" + "version": "0.4.0" } ] } \ No newline at end of file