Skip to content

fix: preserve Proton's S: gamedrive mapping when launching TeamSpeak - #39

Open
gitshipdone wants to merge 1 commit into
ninelore:masterfrom
gitshipdone:fix-gamedrive-removal
Open

fix: preserve Proton's S: gamedrive mapping when launching TeamSpeak#39
gitshipdone wants to merge 1 commit into
ninelore:masterfrom
gitshipdone:fix-gamedrive-removal

Conversation

@gitshipdone

Copy link
Copy Markdown

Problem

Launching TeamSpeak through Arma3Helper.sh deletes the S: drive mapping from the Arma prefix on Proton builds that enable the gamedrive option (current Proton Hotfix does by default).

The script exports STEAM_COMPAT_DATA_PATH but not STEAM_COMPAT_INSTALL_PATH / STEAM_COMPAT_LIBRARY_PATHS, and then invokes the full proton run verb. Proton's gamedrive setup needs both variables to resolve the game's Steam library (see try_get_game_library_dir()proton, proton_11.0 branch, the check is at ~line 275 in the shipped Proton Hotfix script). When either is missing it returns None and setup_dir_drive() removes pfx/dosdevices/s: from the live prefix.

Symptom this causes

Arma keeps running on already-open file handles, but multiplayer signature verification (verifySignatures = 2 servers) re-opens PBOs on demand. Every file Arma loads through S: then fails the check, producing kicks like:

Files "dta\bin.pbo" are not signed by a key accepted by this server.
Player X: Wrong signature for file S:\workshop\content\107410\<id>\addons\<name>.pbo

naming a different, provably-clean file each join — but only while TeamSpeak is running. This is extremely confusing to debug from the game side (files validate, keys match, network is clean). Forensics that pinned it: the prefix's dosdevices/ mtime matches the helper launch to the second, and across many kicks every flagged file was S:-pathed while Z:-pathed workshop mods never appeared once.

Fix

Derive both variables from COMPAT_DATA_PATH, which always lives in the same Steam library as the game:

  • runs only when the user hasn't already exported either variable (the config file is sourced earlier and can still override),
  • canonicalizes with readlink -f first, and only exports when the derived <library>/common/Arma 3 directory actually exists — a noncanonical/symlinked COMPAT_DATA_PATH can never point Proton at a wrong library,
  • otherwise prints a warning telling the user to set both variables in their config, and changes nothing.

Verified

Reproduced and fixed on Arch, Arma 3 2.20 + Proton Hotfix (Wine 11), TS3 + ACRE2 in the shared prefix: with the exports, s: survives the TeamSpeak launch (watched dosdevices/ live), the ACRE game pipe still connects, and joins to a verifySignatures=2 server pass cleanly with TS connected. shellcheck clean (zero findings before and after), bash -n passes, both derivation branches exercised (default-library path and custom-library path derive correctly; bogus path falls through to the warning).

Proton builds with the gamedrive option enabled (e.g. current Proton
Hotfix) resolve the game's Steam library from STEAM_COMPAT_INSTALL_PATH
and STEAM_COMPAT_LIBRARY_PATHS during 'proton run'. The helper never
exported them, so Proton's drive setup removed pfx/dosdevices/s: from
the live prefix every time TeamSpeak was launched. A running Arma then
fails multiplayer signature checks on any file it reopens through S:
(random "not signed by a key accepted by this server" and "Wrong
signature for file" kicks that only occur while TeamSpeak is open).

Derive both variables from COMPAT_DATA_PATH, which always lives in the
game's own Steam library. Export them only when the derived library
actually contains "common/Arma 3" (after readlink -f
canonicalization), so a noncanonical COMPAT_DATA_PATH can never point
Proton at a wrong library; otherwise warn and preserve existing
behavior. Values already exported by the user are respected.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant