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
121 changes: 99 additions & 22 deletions com.jagexlauncher.JagexLauncher.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Versions
x-gl-version: &gl-version '1.4'
x-gl-versions: &gl-versions 25.08;1.4
x-gl-merge-dirs: &gl-merge-dirs vulkan/icd.d;glvnd/egl_vendor.d;OpenCL/vendors;lib/dri;lib/d3d;vulkan/explicit_layer.d;vulkan/implicit_layer.d
x-runtime-version: &runtime-version '25.08'
# Flatpak manifest
app-id: com.jagexlauncher.JagexLauncher
Expand All @@ -9,22 +10,42 @@ runtime-version: *runtime-version
sdk: org.freedesktop.Sdk
command: jagex-run
finish-args:
# pressure vessel
- --device=all
- --env=PATH=/app/bin:/app/utils/bin:/usr/bin:/usr/lib/extensions/vulkan/MangoHud/bin:/usr/lib/extensions/vulkan/gamescope/bin:/usr/lib/extensions/vulkan/OBSVkCapture/bin:/app/bin/heroic/resources/app.asar.unpacked/build/bin/linux
- --env=LD_LIBRARY_PATH=/usr/lib/extensions/vulkan/gamescope/lib
- --persist=Games
- --persist=.local
- --filesystem=xdg-run/gamescope-0:rw
# See: https://github.com/flathub/com.valvesoftware.Steam/commit/0538256facdb0837c33232bc65a9195a8a5bc750
- --env=XDG_DATA_DIRS=/app/share:/usr/lib/extensions/vulkan/share:/usr/share:/usr/share/runtime/share:/run/host/user-share:/run/host/share:/usr/lib/pressure-vessel/overrides/share
- --allow=per-app-dev-shm
# umu
- --share=ipc
- --socket=x11
- --socket=wayland
- --socket=pulseaudio
- --device=dri
- --share=network
- --allow=multiarch
- --allow=devel
- --allow=multiarch
- --talk-name=org.freedesktop.Notifications
- --talk-name=org.freedesktop.Flatpak
- --filesystem=xdg-data/icons:create
- --filesystem=xdg-run/app/com.discordapp.Discord
- --filesystem=xdg-run/discord-ipc-0
sdk-extensions:
- org.freedesktop.Sdk.Compat.i386
- org.freedesktop.Sdk.Extension.openjdk17
add-extensions:
org.freedesktop.Platform.Compat.i386:
directory: lib/i386-linux-gnu
version: *runtime-version

org.freedesktop.Platform.Compat.i386.Debug:
directory: lib/debug/lib/i386-linux-gnu
version: *runtime-version
no-autodownload: true

org.freedesktop.Platform.GL32:
directory: lib/i386-linux-gnu/GL
version: *gl-version
Expand All @@ -33,10 +54,61 @@ add-extensions:
no-autodownload: true
autodelete: false
add-ld-path: lib
merge-dirs: vulkan/icd.d;glvnd/egl_vendor.d;OpenCL/vendors;lib/dri;lib/d3d;vulkan/explicit_layer.d;vulkan/implicit_layer.d
merge-dirs: *gl-merge-dirs
download-if: active-gl-driver
enable-if: active-gl-driver
autoprune-unless: active-gl-driver

org.freedesktop.Platform.GL32.Debug:
directory: lib/debug/lib/i386-linux-gnu/GL
version: *gl-version
versions: *gl-versions
subdirectories: true
no-autodownload: true
merge-dirs: *gl-merge-dirs
enable-if: active-gl-driver
autoprune-unless: active-gl-driver

org.freedesktop.Platform.VAAPI.Intel.i386:
directory: lib/i386-linux-gnu/dri/intel-vaapi-driver
version: *runtime-version
versions: *runtime-version
autodelete: false
no-autodownload: true
add-ld-path: lib
download-if: have-intel-gpu
autoprune-unless: have-intel-gpu

modules:
- name: platform-bootstrap
buildsystem: simple
build-commands:
- |
set -e
mkdir -p /app/bin
mkdir -p /app/lib/i386-linux-gnu
mkdir -p /app/lib/i386-linux-gnu/GL
mkdir -p /app/lib/i386-linux-gnu/dri/intel-vaapi-driver
mkdir -p /app/lib/debug/lib/i386-linux-gnu
mkdir -p /app/lib/debug/lib/i386-linux-gnu/GL
install -Dm644 -t /app/etc ld.so.conf
mkdir -p /app/lib{,32}/ffmpeg
mkdir -p /app/share/steam/compatibilitytools.d
mkdir -p /app/utils /app/share/vulkan
ln -srv /app/{utils/,}share/vulkan/explicit_layer.d
ln -srv /app/{utils/,}share/vulkan/implicit_layer.d
mkdir -p /app/links/lib
ln -srv /app/lib /app/links/lib/x86_64-linux-gnu
ln -srv /app/lib32 /app/links/lib/i386-linux-gnu
sources:
- type: inline
dest-filename: ld.so.conf
contents: |
# We just make any GL32 extension have higher priority
include /run/flatpak/ld.so.conf.d/app-*-org.freedesktop.Platform.GL32.*.conf
/app/lib32
/app/lib/i386-linux-gnu
/lib64
- name: libnotify
buildsystem: meson
config-opts:
Expand All @@ -58,35 +130,40 @@ modules:
- name: openjdk
buildsystem: simple
build-commands:
# https://gitlab.com/hdos/issues/-/issues/2004
- /usr/lib/sdk/openjdk17/install.sh
- mv /app/jre/bin/java /app/jre/bin/java.bk
- mv java /app/jre/bin/java
- chmod +x /app/jre/bin/java
sources:
- type: script
dest-filename: java # https://gitlab.com/hdos/issues/-/issues/2004
dest-filename: java
commands:
-
#!/bin/bash
- /app/jre/bin/java.bk $(echo "$@" | sed 's|--add-opens java.desktop/java.awt=ALL-UNNAMED||g')
- name: wine-ge
- /run/parent/app/jre/bin/java.bk $(echo "$@" | sed 's|--add-opens java.desktop/java.awt=ALL-UNNAMED||g')
- name: proton-ge
buildsystem: simple
build-commands:
- mkdir wine
- tar xf wine.tar.xz -C wine --strip-components 1 # String top level dir and place into predictable directory name to decouple from the name of the top-level dir
- mkdir proton
- tar xf protonge.tar.xz -C proton --strip-components 1
- install --directory /app/opt
- mv wine /app/opt/wine
- chmod 755 -R proton
- mv proton /app/opt/proton
sources:
- type: file
dest-filename: wine.tar.xz
url: https://github.com/GloriousEggroll/wine-ge-custom/releases/download/GE-Proton8-26/wine-lutris-GE-Proton8-26-x86_64.tar.xz
sha512: 3abd578ed45a16096843936e0258799450e6a5751bc67afaf8c58cd245c40e62794a89af25ae482d74d5ca2b7527d17ff77232781c6d9cf97bc02976c2f960bd
x-checker-data:
type: json
url: https://api.github.com/repos/GloriousEggroll/wine-ge-custom/releases/latest
version-query: .tag_name | sub("^GE-Proton-"; "")
url-query: .assets[] | select(.name=="wine-lutris-" + $version + "-x86_64.tar.xz")
| .browser_download_url
dest-filename: protonge.tar.xz
url: https://github.com/GloriousEggroll/proton-ge-custom/releases/download/GE-Proton10-27/GE-Proton10-27.tar.gz
sha512: 7bc683b62a9cdf027089af501c93cf78c7aaef30c70010c54389d199894a679870becfda417ad1761c4d8faa17ac3d2da805d4c4efce8992197eaff74fcb5fea
- name: umu-run
buildsystem: simple
build-commands:
- |
install umu-run /app/bin/umu-run
sources:
- type: archive
url: https://github.com/Open-Wine-Components/umu-launcher/releases/download/1.3.0/umu-launcher-1.3.0-zipapp.tar
sha256: 36502de766f3cc549ff85196a04fb5afdb4eb2a72c023f22fd25895df91fda2f
- name: runelite-jar
buildsystem: simple
build-commands:
Expand All @@ -110,7 +187,7 @@ modules:
-
#!/bin/bash
- set -x
- /app/jre/bin/java.bk -Duser.home="$XDG_DATA_HOME/user_home" -jar /app/RuneLite.jar
- /run/parent/app/jre/bin/java.bk -Duser.home="$XDG_DATA_HOME/user_home" -jar /run/parent/app/RuneLite.jar
-J-Duser.home="$XDG_DATA_HOME/user_home"
- name: hdos-jar
buildsystem: simple
Expand All @@ -126,13 +203,13 @@ modules:
type: html
url: https://cdn.hdos.dev/client/getdown.txt
version-pattern: launcher.version = (\d.*)
url-template: https://cdn.hdos.dev/launcher/v$version/hdos-launcher.jar
url-template: https://cdn.hdos.dev/launcher/$version/hdos-launcher.jar
- type: script
dest-filename: HDOS.exe # We name this bash script .exe bc Jagex Launcher runs RuneLite.exe. Wine is able to somehow intepret it is a bash script and run that instead.
dest-filename: HDOS.exe
commands:
-
#!/bin/bash
- /app/jre/bin/java -jar /app/hdos-launcher.jar
- /run/parent/app/jre/bin/java -jar /run/parent/app/hdos-launcher.jar
- name: jagex-launcher
buildsystem: simple
build-commands:
Expand Down
88 changes: 80 additions & 8 deletions scripts/jagex-run.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,81 @@
#!/bin/sh
set -e
set -euo pipefail

winebin="/app/opt/wine/bin"
wineprefix="$XDG_DATA_HOME"/prefix
jagex_launcher_exe_path="$wineprefix/drive_c/Program Files (x86)/Jagex Launcher/JagexLauncher.exe"
wineprefix="$XDG_DATA_HOME"/umu_prefix
JAGEX_LAUNCHER_EXE_PATH="$wineprefix/drive_c/Program Files (x86)/Jagex Launcher/JagexLauncher.exe"
JAGEX_LAUNCHER_GAMES_PATH="$(dirname "$JAGEX_LAUNCHER_EXE_PATH")/Games"
# The umu_proton_dir and protonpath need to be different because umu_proton_dir is from the flatpak sandbox perspective, while protonpath is from the steam runtime perspective.
export UMU_PROTON_DIR="$HOME/.var/app/com.jagexlauncher.JagexLauncher/.local/share/umu/proton-bundled/proton"
export PROTONPATH="$HOME/.local/share/umu/proton-bundled"
export WINEPREFIX="$wineprefix"

if ! [ -f "$jagex_launcher_exe_path" ]; then
function ensure_latest_file () {
SOURCE_FILE_PATH="$1"
DEST_FILE_PATH="$2"

echo "ensuring $SOURCE_FILE_PATH matches $DEST_FILE_PATH"
if [[ -f "$DEST_FILE_PATH" ]]; then
SOURCE_SHA256="$(sha256sum "$SOURCE_FILE_PATH" | awk '{ print $1 }')"
DEST_SHA256="$(sha256sum "$DEST_FILE_PATH" | awk '{ print $1 }')"

if [[ "$SOURCE_SHA256" != "$DEST_SHA256" ]]; then
echo "$SOURCE_SHA256 does not match $DEST_SHA256. Updating $DEST_FILE_PATH..."

mkdir -p "$(dirname "$DEST_FILE_PATH")"
cp -r "$SOURCE_FILE_PATH" "$DEST_FILE_PATH"
else
echo "$SOURCE_SHA256 DOES match $DEST_SHA256. No update needed."
fi

else
echo "$DEST_FILE_PATH does not exist. Copying..."
mkdir -p "$(dirname "$DEST_FILE_PATH")"
cp -r "$SOURCE_FILE_PATH" "$DEST_FILE_PATH"
fi
}

function ensure_latest_dir () {
SOURCE_FILE_PATH="$1"
DEST_FILE_PATH="$2"

echo "ensuring $SOURCE_FILE_PATH matches $DEST_FILE_PATH"
if [[ -f "$DEST_FILE_PATH" ]]; then
SOURCE_SHA256="$(sha256sum "$SOURCE_FILE_PATH" | awk '{ print $1 }')"
DEST_SHA256="$(sha256sum "$DEST_FILE_PATH" | awk '{ print $1 }')"

if [[ "$SOURCE_SHA256" != "$DEST_SHA256" ]]; then
echo "$SOURCE_SHA256 does not match $DEST_SHA256. Updating $DEST_FILE_PATH..."

mkdir -p "$(dirname "$DEST_FILE_PATH")"
rm -r "$(dirname "$DEST_FILE_PATH")"
cp -r "$(dirname "$SOURCE_FILE_PATH")" "$(dirname "$DEST_FILE_PATH")"
else
echo "$SOURCE_SHA256 DOES match $DEST_SHA256. No update needed."
fi

else
echo "$DEST_FILE_PATH does not exist. Copying..."
mkdir -p "$(dirname "$DEST_FILE_PATH")"
rm -r "$(dirname "$DEST_FILE_PATH")"
cp -r "$(dirname "$SOURCE_FILE_PATH")" "$(dirname "$DEST_FILE_PATH")"
fi
}

ensure_latest_dir "/app/opt/proton/proton" "$UMU_PROTON_DIR"

# If we are still using wine-ge, migrate to umu proton
if [[ -z "$XDG_DATA_HOME/prefix" ]]; then

echo "We are still on wine-ge. Migrating to proton..."
umu-run wineboot -u
mkdir -p "$WINEPREFIX/umu_prefix/drive_c/Program Files (x86)/Jagex Launcher"
cp -r "$XDG_DATA_HOME/prefix/drive_c/Program Files (x86)/Jagex Launcher" "$WINEPREFIX/drive_c/Program Files (x86)/Jagex Launcher" || exit 1
mv "$XDG_DATA_HOME/prefix" "$XDG_DATA_HOME/prefix.bk"

fi

if ! [ -f "$JAGEX_LAUNCHER_EXE_PATH" ]; then
mkdir tmp
cd tmp
python3 /app/bin/jagex-install
Expand All @@ -17,11 +87,13 @@ if ! [ -f "$jagex_launcher_exe_path" ]; then
cp /app/steamdeck-settings.properties "$XDG_DATA_HOME/steamdeck-settings.properties"
fi

ensure_latest_file "/app/RuneLite.exe" "$JAGEX_LAUNCHER_GAMES_PATH/RuneLite.exe"
ensure_latest_file "/app/HDOS.exe" "$JAGEX_LAUNCHER_GAMES_PATH/HDOS.exe"

# Make sure the registry has the installation location for runelite.
WINEPREFIX="$wineprefix" WINEDEBUG="-all" "$winebin/wine" reg.exe add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\RuneLite Launcher_is1" /v "InstallLocation" /t REG_SZ /d "Z:\app" /f
WINEDEBUG="-all" umu-run reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\RuneLite Launcher_is1" /v "InstallLocation" /t REG_SZ /d "C:\Program Files (x86)\Jagex Launcher\Games" /f

# Make sure the registry has the installation location for hdos
WINEPREFIX="$wineprefix" WINEDEBUG="-all" "$winebin/wine" reg.exe add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\HDOS Launcher_is1" /v "InstallLocation" /t REG_SZ /d "Z:\app" /f
WINEDEBUG="-all" umu-run reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\HDOS Launcher_is1" /v "InstallLocation" /t REG_SZ /d "C:\Program Files (x86)\Jagex Launcher\Games" /f

# Run with overrides for dxvk
WINEPREFIX="$wineprefix" WINEDLLOVERRIDES="dxgi=b" "$winebin/wine" "$jagex_launcher_exe_path"
umu-run "$JAGEX_LAUNCHER_EXE_PATH"