From bde9e060aa66aaa973b39e5348f21b2c4344ec6d Mon Sep 17 00:00:00 2001 From: arrowmaster Date: Thu, 3 Jul 2025 06:57:59 -0400 Subject: [PATCH 001/181] Fix posix scripts to preserve arguments with spaces --- public/linux_wrapper.sh | 31 +++++++++++++------------------ public/macos_wrapper.sh | 33 ++++++++++++++++----------------- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/public/linux_wrapper.sh b/public/linux_wrapper.sh index 3e504c04b..6926219f5 100644 --- a/public/linux_wrapper.sh +++ b/public/linux_wrapper.sh @@ -3,48 +3,43 @@ # Linux wrapper script for r2modman # Written by Naomi Calabretta (blame her if something does not work) -a="/$0"; a=${a%/*}; a=${a#/}; a=${a:-.}; BASEDIR=$(cd "$a"; pwd -P) +a="/$0"; a=${a%/*}; a=${a#/}; a=${a:-.}; BASEDIR=$(cd "$a" || exit; pwd -P) R2PROFILE="" R2STARTSERVER="" -args="" -while :; do +i=0; max=$# +while [ $i -lt $max ]; do case $1 in --r2profile) if [ -n "$2" ]; then R2PROFILE="$2" shift + i=$((i+1)) else echo "[R2MODMAN LINUX WRAPPER] Warning: --r2profile value is empty!" fi - ;; + ;; --server) R2STARTSERVER="true" - ;; + ;; *) - if [ -z "$1" ]; then - break - fi - if [ -z "$args" ]; then - args="$1" - else - args="$args $1" - fi - ;; + set -- "$@" "$1" + ;; esac shift + i=$((i+1)) done if [ -z "$R2PROFILE" ]; then echo "[R2MODMAN LINUX WRAPPER] Launching vanilla!" - exec $args + exec "$@" fi -[ -n "$R2STARTSERVER" ] && exec "$BASEDIR/profiles/$R2PROFILE/start_server_bepinex.sh" $args || true +[ -n "$R2STARTSERVER" ] && exec "$BASEDIR/profiles/$R2PROFILE/start_server_bepinex.sh" "$@" || true if test -f "$BASEDIR/profiles/$R2PROFILE/run_bepinex.sh"; then - exec "$BASEDIR/profiles/$R2PROFILE/run_bepinex.sh" $args + exec "$BASEDIR/profiles/$R2PROFILE/run_bepinex.sh" "$@" else - exec "$BASEDIR/profiles/$R2PROFILE/start_game_bepinex.sh" $args + exec "$BASEDIR/profiles/$R2PROFILE/start_game_bepinex.sh" "$@" fi diff --git a/public/macos_wrapper.sh b/public/macos_wrapper.sh index 1dd72be68..6926219f5 100644 --- a/public/macos_wrapper.sh +++ b/public/macos_wrapper.sh @@ -3,44 +3,43 @@ # Linux wrapper script for r2modman # Written by Naomi Calabretta (blame her if something does not work) -a="/$0"; a=${a%/*}; a=${a#/}; a=${a:-.}; BASEDIR=$(cd "$a"; pwd -P) +a="/$0"; a=${a%/*}; a=${a#/}; a=${a:-.}; BASEDIR=$(cd "$a" || exit; pwd -P) R2PROFILE="" R2STARTSERVER="" -args="" -while :; do +i=0; max=$# +while [ $i -lt $max ]; do case $1 in --r2profile) if [ -n "$2" ]; then R2PROFILE="$2" shift + i=$((i+1)) else echo "[R2MODMAN LINUX WRAPPER] Warning: --r2profile value is empty!" fi - ;; + ;; --server) R2STARTSERVER="true" - ;; + ;; *) - if [ -z "$1" ]; then - break - fi - if [ -z "$args" ]; then - args="$1" - else - args="$args $1" - fi - ;; + set -- "$@" "$1" + ;; esac shift + i=$((i+1)) done if [ -z "$R2PROFILE" ]; then echo "[R2MODMAN LINUX WRAPPER] Launching vanilla!" - exec $args + exec "$@" fi -[ -n "$R2STARTSERVER" ] && exec "$BASEDIR/profiles/$R2PROFILE/start_server_bepinex.sh" $args || true +[ -n "$R2STARTSERVER" ] && exec "$BASEDIR/profiles/$R2PROFILE/start_server_bepinex.sh" "$@" || true -exec "$BASEDIR/profiles/$R2PROFILE/start_game_bepinex.sh" $args +if test -f "$BASEDIR/profiles/$R2PROFILE/run_bepinex.sh"; then + exec "$BASEDIR/profiles/$R2PROFILE/run_bepinex.sh" "$@" +else + exec "$BASEDIR/profiles/$R2PROFILE/start_game_bepinex.sh" "$@" +fi From f25ccc4ceb75ae5bb41ccc3bfe4154723003332d Mon Sep 17 00:00:00 2001 From: cade Date: Thu, 24 Jul 2025 14:12:05 +0100 Subject: [PATCH 002/181] Added close action to preview panel --- src/components/v2/OnlinePreviewPanel.vue | 15 ++++++++++++++- src/components/views/OnlineModView.vue | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/v2/OnlinePreviewPanel.vue b/src/components/v2/OnlinePreviewPanel.vue index 835e6f50a..b8e1b6a34 100644 --- a/src/components/v2/OnlinePreviewPanel.vue +++ b/src/components/v2/OnlinePreviewPanel.vue @@ -17,6 +17,10 @@ interface ModPreviewPanelProps { } const props = defineProps(); +const emits = defineEmits<{ + (e: 'close'): void +}>(); + const readme = ref(null); const readmeError = ref(null); const changelog = ref(null); @@ -138,7 +142,12 @@ function showDownloadModal(mod: ThunderstoreMod) { diff --git a/src/providers/ror2/downloading/ThunderstoreDownloaderProvider.ts b/src/providers/ror2/downloading/ThunderstoreDownloaderProvider.ts index 5322442a3..fcdd31073 100644 --- a/src/providers/ror2/downloading/ThunderstoreDownloaderProvider.ts +++ b/src/providers/ror2/downloading/ThunderstoreDownloaderProvider.ts @@ -1,5 +1,6 @@ import ProviderUtils from '../../generic/ProviderUtils'; import ThunderstoreCombo from '../../../model/ThunderstoreCombo'; +import { DownloadStatusEnum } from '../../../model/enums/DownloadStatusEnum'; import R2Error from '../../../model/errors/R2Error'; export default abstract class ThunderstoreDownloaderProvider { @@ -19,7 +20,7 @@ export default abstract class ThunderstoreDownloaderProvider { public abstract download( combos: ThunderstoreCombo[], ignoreCache: boolean, - totalProgressCallback: (downloadedSize: number, modName: string, status: number, err: R2Error | null) => void + totalProgressCallback: (downloadedSize: number, modName: string, status: DownloadStatusEnum, err: R2Error | null) => void ): Promise; /** diff --git a/src/r2mm/downloading/BetterThunderstoreDownloader.ts b/src/r2mm/downloading/BetterThunderstoreDownloader.ts index 1ef797336..ffd5ac090 100644 --- a/src/r2mm/downloading/BetterThunderstoreDownloader.ts +++ b/src/r2mm/downloading/BetterThunderstoreDownloader.ts @@ -17,7 +17,7 @@ export default class BetterThunderstoreDownloader extends ThunderstoreDownloader public async download( combos: ThunderstoreCombo[], ignoreCache: boolean, - totalProgressCallback: (downloadedSize: number, modName: string, status: number, err: R2Error | null) => void + totalProgressCallback: (downloadedSize: number, modName: string, status: DownloadStatusEnum, err: R2Error | null) => void ): Promise { if (combos.length === 0) { throw new R2Error('No mods to download', 'An empty list of mods was passed to the downloader'); @@ -26,7 +26,7 @@ export default class BetterThunderstoreDownloader extends ThunderstoreDownloader let modInProgressName = combos[0].getMod().getName(); let finishedModsDownloadedSize = 0; - const singleModProgressCallback = (downloadedBytes: number, status: number, err: R2Error | null) => { + const singleModProgressCallback = (downloadedBytes: number, status: DownloadStatusEnum, err: R2Error | null) => { let modInProgressDownloadedSize; if (status === DownloadStatusEnum.FAILED) { @@ -66,7 +66,7 @@ export default class BetterThunderstoreDownloader extends ThunderstoreDownloader } } - private async _downloadCombo(combo: ThunderstoreCombo, callback: (downloadedBytes: number, status: number, err: R2Error | null) => void): Promise { + private async _downloadCombo(combo: ThunderstoreCombo, callback: (downloadedBytes: number, status: DownloadStatusEnum, err: R2Error | null) => void): Promise { return axios.get(combo.getVersion().getDownloadUrl(), { onDownloadProgress: progress => callback(progress.loaded, DownloadStatusEnum.DOWNLOADING, null), responseType: 'arraybuffer', @@ -77,7 +77,7 @@ export default class BetterThunderstoreDownloader extends ThunderstoreDownloader }); } - private async _saveDownloadResponse(response: AxiosResponse, combo: ThunderstoreCombo, callback: (downloadedBytes: number, status: number, err: R2Error | null) => void): Promise { + private async _saveDownloadResponse(response: AxiosResponse, combo: ThunderstoreCombo, callback: (downloadedBytes: number, status: DownloadStatusEnum, err: R2Error | null) => void): Promise { const buf: Buffer = Buffer.from(response.data); const comboSize = combo.getVersion().getFileSize(); callback(comboSize, DownloadStatusEnum.EXTRACTING, null); diff --git a/src/store/modules/DownloadModule.ts b/src/store/modules/DownloadModule.ts index cf545bfa1..9b79bc4a0 100644 --- a/src/store/modules/DownloadModule.ts +++ b/src/store/modules/DownloadModule.ts @@ -210,7 +210,7 @@ export const DownloadModule = { downloadId: UUID, downloadedSize: number, modName: string, - status: number, + status: DownloadStatusEnum, err: R2Error | null }) { const { downloadId, downloadedSize, modName, status, err} = params; @@ -222,11 +222,7 @@ export const DownloadModule = { DownloadUtils.addSolutionsToError(err); throw err; } - } else if ( - status === DownloadStatusEnum.DOWNLOADING || - status === DownloadStatusEnum.EXTRACTING || - status === DownloadStatusEnum.EXTRACTED - ) { + } else if (DownloadUtils.statusIsDownloadOrExtract(status)) { commit('updateDownload', { downloadId, modName, downloadedSize, status }); } }, diff --git a/src/utils/DownloadUtils.ts b/src/utils/DownloadUtils.ts index 079e49096..f5a492590 100644 --- a/src/utils/DownloadUtils.ts +++ b/src/utils/DownloadUtils.ts @@ -1,3 +1,4 @@ +import { DownloadStatusEnum } from '../model/enums/DownloadStatusEnum'; import R2Error from '../model/errors/R2Error'; import ThunderstoreCombo from '../model/ThunderstoreCombo'; import FsProvider from '../providers/generic/file/FsProvider'; @@ -81,3 +82,7 @@ export function generateProgressPercentage(currentProgress: number, targetProgre const percentage = Math.round(currentProgress / targetProgress * 100); return Math.max(0, Math.min(100, percentage)); } + +export function statusIsDownloadOrExtract(status: DownloadStatusEnum): boolean { + return status === DownloadStatusEnum.DOWNLOADING || status === DownloadStatusEnum.EXTRACTING || status === DownloadStatusEnum.EXTRACTED; +} From 54e92a28284b49d29efe4b6a463dee2ee45520fd Mon Sep 17 00:00:00 2001 From: VilppeRiskidev Date: Tue, 9 Sep 2025 19:23:43 +0300 Subject: [PATCH 035/181] Add cover image asset for House of Legacy --- .../images/game_selection/house-of-legacy.webp | Bin 0 -> 27088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/assets/images/game_selection/house-of-legacy.webp diff --git a/src/assets/images/game_selection/house-of-legacy.webp b/src/assets/images/game_selection/house-of-legacy.webp new file mode 100644 index 0000000000000000000000000000000000000000..a75a82595aa3706fee87dcbbe2fbe0b0e3b54388 GIT binary patch literal 27088 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 L0000000000P1)VD literal 0 HcmV?d00001 From 207264883f5900fb568c90a847e5b64255c7699a Mon Sep 17 00:00:00 2001 From: Cade Ayres Date: Fri, 25 Jul 2025 13:02:00 +0100 Subject: [PATCH 036/181] Added barebones drag resize functionality --- src/components/v2/OnlinePreviewPanel.vue | 158 ++++++++++++++--------- src/r2mm/manager/SettingsDexieStore.ts | 4 +- 2 files changed, 99 insertions(+), 63 deletions(-) diff --git a/src/components/v2/OnlinePreviewPanel.vue b/src/components/v2/OnlinePreviewPanel.vue index b8e1b6a34..04d2bc263 100644 --- a/src/components/v2/OnlinePreviewPanel.vue +++ b/src/components/v2/OnlinePreviewPanel.vue @@ -1,6 +1,6 @@