openvibers/source.openvibe.games Commits

Add Proton DLL validation and artifact install helpers

CO Copilot committed 29 Jun 2026 · c617b3036f · 7 files, +299 −63


Changes

ddiff --git a/docs/PROTON_CLIENT_DLL_DEBUG.md b/docs/PROTON_CLIENT_DLL_DEBUG.md
nnew file mode 100644
iindex 0000000..0a38e8e
---- /dev/null
++++ b/docs/PROTON_CLIENT_DLL_DEBUG.md
@@@ -0,0 +1,41 @@
++# Proton client DLL debug path
++
++Proton runs the Windows `hl2.exe`, so it loads:
++
++```text
++game/openvibe.games/bin/client.dll
++game/openvibe.games/bin/server.dll
++```
++
++It cannot load the Linux modules:
++
++```text
++game/openvibe.games/bin/linux64/client.so
++game/openvibe.games/bin/linux64/server.so
++```
++
++If the in-game console says `Unknown command "ov_join"` or `Unknown command "ov_menu"`, then one of these is true:
++
++1. `client.dll` is missing.
++2. `client.dll` is stock/old and does not contain the OpenVibe commands.
++3. The mod path is wrong and `hl2.exe` is not loading `game/openvibe.games`.
++4. The DLL failed during load.
++
++Useful commands:
++
++```bash
++tools/verify-openvibe-dll-content.sh
++OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
++tools/collect-proton-openvibe-debug.sh
++```
++
++Safe fallback aliases are prefixed with `ovp_` so they do not mask real client DLL commands:
++
++```text
++ovp_help
++ovp_join_hub
++ovp_join_prophunt
++ovp_join_deathrun
++ovp_join_fortwars
++ovp_join_traitortown
++```
ddiff --git a/game/openvibe.games/cfg/openvibe_proton_client.cfg b/game/openvibe.games/cfg/openvibe_proton_client.cfg
iindex d635926..dc42fde 100644
---- a/game/openvibe.games/cfg/openvibe_proton_client.cfg
++++ b/game/openvibe.games/cfg/openvibe_proton_client.cfg
@@@ -1,35 +1,9 @@
--// OpenVibe Proton client fallback aliases.
--// This file is executed by tools/run-client-proton.sh.
--// Proton Windows hl2.exe does not load Linux bin/linux64/client.so, so the
--// native OpenVibe client DLL commands are not available in this mode.
--
--echo "[OpenVibe] Proton fallback cfg loaded. Electron is the custom menu in Proton mode."
--
--alias ov_help "echo OpenVibe Proton fallback: use ov_join_hub / ov_join_prophunt / ov_join_deathrun / ov_join_fortwars / ov_join_traitortown. Electron remains the full HTML/CSS/JS menu."
--alias ov_menu "echo OpenVibe HTML menu is hosted by Electron in Proton mode. Alt-tab to the launcher or run npm run dev."
--alias ov_ui "ov_menu"
--alias ov_main_menu "ov_menu"
--alias ov_menu_main "ov_menu"
--alias ov_menu_servers "echo Server browser is in Electron. Quick connects: ov_join_hub, ov_join_prophunt, ov_join_deathrun, ov_join_fortwars, ov_join_traitortown."
--alias ov_menu_leaderboard "echo Leaderboard UI is in Electron in Proton mode."
--alias ov_menu_inventory "echo Inventory UI is in Electron in Proton mode."
--alias ov_menu_shop "echo Shop UI is in Electron in Proton mode."
--alias ov_menu_settings "echo Settings UI is in Electron in Proton mode."
--alias ov_menu_reload "echo Reload the Electron window with Ctrl+R or restart npm run dev."
--alias ov_menu_close "echo Close/minimize the Electron launcher window."
--
--alias ov_join "echo Usage in Proton fallback: ov_join_hub / ov_join_prophunt / ov_join_deathrun / ov_join_fortwars / ov_join_traitortown. The argument-taking ov_join command needs OpenVibe client.dll/client.so."
--alias ov_join_hub "connect 127.0.0.1:27015"
--alias ov_join_prophunt "connect 127.0.0.1:27016"
--alias ov_join_deathrun "connect 127.0.0.1:27017"
--alias ov_join_fortwars "connect 127.0.0.1:27018"
--alias ov_join_traitortown "connect 127.0.0.1:27019"
--
--alias ov_js_status "cmd ov_js_status"
--alias ov_js_reload "cmd ov_js_reload"
--alias ov_js_cmd "cmd ov_js_cmd"
--alias ov_js_fire "cmd ov_js_fire"
--
--alias ov_prophunt_disguise "cmd ov_prophunt_disguise"
--alias ov_prophunt_reset_disguise "cmd ov_prophunt_reset_disguise"
--alias ov_fortwars_spawn "cmd ov_fortwars_spawn"
++echo "==== OpenVibe Proton fallback cfg loaded ===="
++echo "This cfg only adds ovp_* fallback aliases. Real ov_join/ov_menu must come from client.dll."
++echo "Try real commands first: ov_join hub ; ov_menu ; ov_menu_servers"
++alias ovp_help "echo OpenVibe Proton fallback commands: ovp_join_hub ovp_join_prophunt ovp_join_deathrun ovp_join_fortwars ovp_join_traitortown"
++alias ovp_join_hub "connect 127.0.0.1:27015"
++alias ovp_join_prophunt "connect 127.0.0.1:27016"
++alias ovp_join_deathrun "connect 127.0.0.1:27017"
++alias ovp_join_fortwars "connect 127.0.0.1:27018"
++alias ovp_join_traitortown "connect 127.0.0.1:27019"
ddiff --git a/tools/check-openvibe-platform-binaries.sh b/tools/check-openvibe-platform-binaries.sh
iindex 7aa34d3..8cf5c12 100755
---- a/tools/check-openvibe-platform-binaries.sh
++++ b/tools/check-openvibe-platform-binaries.sh
@@@ -32,3 +32,11 @@ if [[ -f "$win_bin/client.dll" ]]; then
else
echo "[openvibe] Proton Windows hl2.exe will NOT have in-game ov_* client commands until client.dll exists."
fi
++
++echo
++echo "[openvibe] Deep DLL content check:"
++if [[ -x "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" ]]; then
++ "${OPENVIBE_ROOT:-$HOME/src/openvibe-source}/tools/verify-openvibe-dll-content.sh" || true
++else
++ echo "tools/verify-openvibe-dll-content.sh missing"
++fi
ddiff --git a/tools/collect-proton-openvibe-debug.sh b/tools/collect-proton-openvibe-debug.sh
nnew file mode 100755
iindex 0000000..ec752bb
---- /dev/null
++++ b/tools/collect-proton-openvibe-debug.sh
@@@ -0,0 +1,42 @@
++#!/usr/bin/env bash
++set -euo pipefail
++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
++MOD="$ROOT/game/openvibe.games"
++STEAM_APP_ID="${SteamAppId:-243750}"
++PATTERN='OpenVibe|ov_|client\.dll|server\.dll|GameDLL|ClientDLL|Unknown command|failed|Failed|unable|Unable|error|Error'
++
++printf '[openvibe] collecting Proton/Source debug hints\n'
++printf 'root=%s\n' "$ROOT"
++printf 'mod=%s\n\n' "$MOD"
++
++candidates=(
++ "$MOD/console.log"
++ "$MOD/openvibe_proton_console.log"
++ "$ROOT/console.log"
++ "$ROOT/openvibe_proton_console.log"
++ "$HOME/steam-${STEAM_APP_ID}.log"
++ "$HOME/steam-${STEAM_APP_ID}.log.last"
++)
++
++found=0
++for file in "${candidates[@]}"; do
++ if [[ -f "$file" ]]; then
++ found=1
++ echo "--------------------------------------------------------------------------------"
++ echo "[log] $file"
++ echo "[tail] last matching lines"
++ grep -Eia "$PATTERN" "$file" | tail -80 || true
++ fi
++done
++
++if [[ "$found" -eq 0 ]]; then
++ cat <<MSG
++No common logs found yet.
++
++Launch with Proton logging enabled:
++ OPENVIBE_PROTON_LOG=1 OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015
++
++Then run this again:
++ tools/collect-proton-openvibe-debug.sh
++MSG
++fi
ddiff --git a/tools/gh-windows-build-and-install.sh b/tools/gh-windows-build-and-install.sh
nnew file mode 100755
iindex 0000000..4831390
---- /dev/null
++++ b/tools/gh-windows-build-and-install.sh
@@@ -0,0 +1,90 @@
++#!/usr/bin/env bash
++set -euo pipefail
++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
++cd "$ROOT"
++
++WORKFLOW="${OPENVIBE_WINDOWS_WORKFLOW:-windows-source-sdk-dlls.yml}"
++BRANCH="${OPENVIBE_BRANCH:-$(git branch --show-current)}"
++ART_DIR="$ROOT/.tmp/windows-dll-artifact"
++MOD_BIN="$ROOT/game/openvibe.games/bin"
++
++if ! command -v gh >/dev/null 2>&1; then
++ cat <<MSG
++[openvibe] gh is missing.
++
++Install/authenticate it:
++ sudo apt update
++ sudo apt install gh
++ gh auth login
++
++Then rerun:
++ tools/gh-windows-build-and-install.sh
++
++Manual fallback:
++ Open GitHub Actions -> $WORKFLOW -> Run workflow -> branch $BRANCH
++ Download the artifact, then copy client.dll/server.dll into:
++ $MOD_BIN
++MSG
++ exit 127
++fi
++
++if ! gh auth status >/dev/null 2>&1; then
++ echo "[openvibe] gh is installed but not authenticated. Run: gh auth login" >&2
++ exit 126
++fi
++
++repo="$(gh repo view --json nameWithOwner -q .nameWithOwner)"
++echo "[openvibe] repo=$repo"
++echo "[openvibe] workflow=$WORKFLOW"
++echo "[openvibe] branch=$BRANCH"
++
++git push origin "$BRANCH"
++
++echo "[openvibe] triggering Windows DLL workflow"
++gh workflow run "$WORKFLOW" --ref "$BRANCH"
++
++echo "[openvibe] waiting for workflow run to appear"
++run_id=""
++for _ in {1..30}; do
++ run_id="$(gh run list --workflow "$WORKFLOW" --branch "$BRANCH" --limit 1 --json databaseId,status -q '.[0].databaseId // empty' 2>/dev/null || true)"
++ [[ -n "$run_id" ]] && break
++ sleep 2
++done
++
++if [[ -z "$run_id" ]]; then
++ echo "[openvibe] could not find workflow run. Check GitHub Actions manually." >&2
++ exit 1
++fi
++
++echo "[openvibe] watching run $run_id"
++gh run watch "$run_id" --exit-status
++
++rm -rf "$ART_DIR"
++mkdir -p "$ART_DIR"
++echo "[openvibe] downloading artifacts to $ART_DIR"
++gh run download "$run_id" --dir "$ART_DIR"
++
++client="$(find "$ART_DIR" -iname 'client.dll' -type f | head -n 1 || true)"
++server="$(find "$ART_DIR" -iname 'server.dll' -type f | head -n 1 || true)"
++
++if [[ -z "$client" || -z "$server" ]]; then
++ echo "[openvibe] artifact did not contain client.dll and server.dll" >&2
++ find "$ART_DIR" -maxdepth 5 -type f | sort >&2
++ exit 1
++fi
++
++mkdir -p "$MOD_BIN"
++cp -f "$client" "$MOD_BIN/client.dll"
++cp -f "$server" "$MOD_BIN/server.dll"
++
++echo "[openvibe] installed:"
++ls -lh "$MOD_BIN/client.dll" "$MOD_BIN/server.dll"
++
++tools/verify-openvibe-dll-content.sh
++
++echo "[openvibe] done. Now test:"
++echo " OPENVIBE_CLIENT_MODE=proton tools/run-client-auto.sh 127.0.0.1 27015"
++echo "Then in the game console:"
++echo " ov_join hub"
++echo " ov_menu"
++echo " ov_menu_servers"
ddiff --git a/tools/run-client-proton.sh b/tools/run-client-proton.sh
iindex 123fccf..254f6d2 100755
---- a/tools/run-client-proton.sh
++++ b/tools/run-client-proton.sh
@@@ -1,52 +1,64 @@
#!/bin/bash
# OpenVibe: Source - Game Client Launcher via GE-Proton10-34
--# Uses GE-Proton10-34 with SteamLinuxRuntime_sniper bypassing d3d probe timeout
++set -euo pipefail
--set -e
--
--STEAM_PATH="/mnt/6tb/ssd_offload/home/workstation/.steam/debian-installation"
--GE_PROTON="$STEAM_PATH/compatibilitytools.d/GE-Proton10-34"
--STEAM_COMPAT_DATA="$STEAM_PATH/steamapps/compatdata/243750"
--HL2_EXE="/mnt/data-f/SteamLibrary/steamapps/common/Source SDK Base 2013 Multiplayer/hl2.exe"
--GAME_DIR="/home/workstation/src/openvibe-source/game/openvibe.games"
++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
++STEAM_PATH="${OPENVIBE_STEAM_PATH:-/mnt/6tb/ssd_offload/home/workstation/.steam/debian-installation}"
++GE_PROTON="${OPENVIBE_GE_PROTON:-$STEAM_PATH/compatibilitytools.d/GE-Proton10-34}"
++STEAM_COMPAT_DATA="${OPENVIBE_STEAM_COMPAT_DATA:-$STEAM_PATH/steamapps/compatdata/243750}"
++HL2_EXE="${OPENVIBE_HL2_EXE:-/mnt/data-f/SteamLibrary/steamapps/common/Source SDK Base 2013 Multiplayer/hl2.exe}"
++GAME_DIR="${OPENVIBE_GAME_DIR:-$ROOT/game/openvibe.games}"
CLIENT_DLL="$GAME_DIR/bin/client.dll"
++SERVER_DLL="$GAME_DIR/bin/server.dll"
--# Check dependencies
if [ ! -f "$HL2_EXE" ]; then
-- echo "ERROR: hl2.exe not found at $HL2_EXE"
-- exit 1
++ echo "ERROR: hl2.exe not found at $HL2_EXE" >&2
++ exit 1
fi
if [ ! -d "$GE_PROTON" ]; then
-- echo "ERROR: GE-Proton10-34 not found at $GE_PROTON"
-- exit 1
++ echo "ERROR: GE-Proton not found at $GE_PROTON" >&2
++ exit 1
fi
--# Build connect args if IP/PORT provided
CONNECT_ARGS=""
--if [ -n "$1" ] && [ -n "$2" ]; then
-- CONNECT_ARGS="+connect $1:$2"
++if [ "${1:-}" != "" ] && [ "${2:-}" != "" ]; then
++ CONNECT_ARGS="+connect $1:$2"
fi
--echo "Launching OpenVibe: Source..."
--echo "NOTE: Proton Windows hl2.exe will not load Linux client.so; Electron launcher remains the reliable custom UI."
--echo " Game: $GAME_DIR"
++echo "Launching OpenVibe: Source via Proton..."
++echo " Game: $GAME_DIR"
echo " Proton: $GE_PROTON"
++echo " HL2: $HL2_EXE"
[ -n "$CONNECT_ARGS" ] && echo " Connect: $CONNECT_ARGS"
++if [ -f "$CLIENT_DLL" ] && command -v strings >/dev/null 2>&1 && strings -a "$CLIENT_DLL" | grep -Fq "ov_join"; then
++ echo " Client DLL: patched OpenVibe client.dll detected"
++elif [ -f "$CLIENT_DLL" ]; then
++ echo " WARNING: client.dll exists, but ov_join string was not found. It may be stock/old." >&2
++else
++ echo " WARNING: client.dll missing. Proton will not have OpenVibe client commands." >&2
++fi
++
++if [ ! -f "$SERVER_DLL" ]; then
++ echo " WARNING: server.dll missing for Windows listen/server use." >&2
++fi
++
mkdir -p "$STEAM_COMPAT_DATA"
export DISPLAY="${DISPLAY:-:0}"
export STEAM_COMPAT_CLIENT_INSTALL_PATH="$STEAM_PATH"
export STEAM_COMPAT_DATA_PATH="$STEAM_COMPAT_DATA"
--export SteamAppId=243750
--export PROTON_LOG=0
--export OPENVIBE_PROTON_FALLBACK=1
--export DXVK_ASYNC=1
++export SteamAppId="${SteamAppId:-243750}"
++export PROTON_LOG="${OPENVIBE_PROTON_LOG:-${PROTON_LOG:-1}}"
++export DXVK_ASYNC="${DXVK_ASYNC:-1}"
exec "$GE_PROTON/proton" waitforexitandrun \
-- "$HL2_EXE" \
-- -game "$GAME_DIR" \
-- -console -condebug -dev -novid -sw -w 1280 -h 720 \
-- -port 27115 -clientport 27105 +con_enable 1 +developer 1 \
-- $CONNECT_ARGS
++ "$HL2_EXE" \
++ -game "$GAME_DIR" \
++ -console -dev -condebug -novid -sw -w 1280 -h 720 \
++ -port 27115 -clientport 27105 \
++ +developer 1 \
++ +con_logfile openvibe_proton_console.log \
++ +exec openvibe_proton_client.cfg \
++ $CONNECT_ARGS
ddiff --git a/tools/verify-openvibe-dll-content.sh b/tools/verify-openvibe-dll-content.sh
nnew file mode 100755
iindex 0000000..e4f505d
---- /dev/null
++++ b/tools/verify-openvibe-dll-content.sh
@@@ -0,0 +1,69 @@
++#!/usr/bin/env bash
++set -euo pipefail
++ROOT="${OPENVIBE_ROOT:-$HOME/src/openvibe-source}"
++CLIENT="$ROOT/game/openvibe.games/bin/client.dll"
++SERVER="$ROOT/game/openvibe.games/bin/server.dll"
++
++ok=0
++fail=0
++
++line() { printf '%s\n' "--------------------------------------------------------------------------------"; }
++check_file() {
++ local label="$1" file="$2"; shift 2
++ line
++ echo "[$label] $file"
++ if [[ ! -f "$file" ]]; then
++ echo "[missing] $file"
++ fail=$((fail+1))
++ return
++ fi
++ file "$file" || true
++ stat -c '[size] %s bytes' "$file" || true
++ sha256sum "$file" | awk '{print "[sha256] "$1}' || true
++
++ local missing=0
++ for needle in "$@"; do
++ if strings -a "$file" | grep -Fq -- "$needle"; then
++ echo "[ok] contains string: $needle"
++ else
++ echo "[miss] does not contain string: $needle"
++ missing=1
++ fi
++ done
++
++ if [[ "$missing" -eq 0 ]]; then
++ ok=$((ok+1))
++ else
++ fail=$((fail+1))
++ fi
++}
++
++check_file "Windows/Proton client.dll" "$CLIENT" \
++ "ov_join" \
++ "ov_auth_steam" \
++ "ov_menu" \
++ "OpenVibe"
++
++check_file "Windows/Proton server.dll" "$SERVER" \
++ "ov_js_status" \
++ "ov_js_cmd" \
++ "OpenVibe"
++
++line
++if [[ "$fail" -eq 0 ]]; then
++ echo "[openvibe] DLL content check passed. Proton should load OpenVibe client/server commands if the mod path is correct."
++ exit 0
++fi
++
++cat <<'MSG'
++[openvibe] DLL content check failed.
++
++Meaning:
++ - client.dll/server.dll may exist, but they are probably old/stock/unpatched DLLs.
++ - If the in-game console says Unknown command "ov_join" or "ov_menu", this is the first thing to fix.
++
++Fix:
++ - Trigger the Windows GitHub Actions build, download its artifact, and install the resulting DLLs.
++ - Run: tools/gh-windows-build-and-install.sh
++MSG
++exit 2