fix: use absolute paths in Arma 3 launch args to survive cwd change
Arma 3 changes its own working directory to the exe folder on startup, so relative paths like -config=server.cfg resolved against A3Master/ instead of the server data dir. Configs were never found, and profile/ battleye dirs pointed at the wrong location (confirmed via RPT location in A3Master/server/ instead of the data dir). build_launch_args() now accepts an optional server_dir: Path argument. When provided, all four path args (-config, -cfg, -profiles, -bepath) use absolute paths. Service passes server_dir at the call site.
This commit is contained in:
@@ -401,20 +401,36 @@ class Arma3ConfigGenerator:
|
|||||||
self,
|
self,
|
||||||
config_sections: dict[str, dict],
|
config_sections: dict[str, dict],
|
||||||
mod_args: list[str] | None = None,
|
mod_args: list[str] | None = None,
|
||||||
|
server_dir: Path | None = None,
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
from adapters.exceptions import LaunchArgsError
|
from adapters.exceptions import LaunchArgsError
|
||||||
launch = LaunchConfig(**config_sections.get("launch", {}))
|
launch = LaunchConfig(**config_sections.get("launch", {}))
|
||||||
server = ServerConfig(**config_sections.get("server", {}))
|
server = ServerConfig(**config_sections.get("server", {}))
|
||||||
|
|
||||||
|
# Arma 3 changes its own cwd to the exe directory at startup, so relative
|
||||||
|
# paths in launch args resolve against the exe dir, not server_dir.
|
||||||
|
# Use absolute paths when server_dir is provided so configs are always found.
|
||||||
|
if server_dir is not None:
|
||||||
|
d = Path(server_dir)
|
||||||
|
config_arg = f"-config={d / 'server.cfg'}"
|
||||||
|
cfg_arg = f"-cfg={d / 'basic.cfg'}"
|
||||||
|
profiles_arg = f"-profiles={d / 'server'}"
|
||||||
|
bepath_arg = f"-bepath={d / 'battleye'}"
|
||||||
|
else:
|
||||||
|
config_arg = "-config=server.cfg"
|
||||||
|
cfg_arg = "-cfg=basic.cfg"
|
||||||
|
profiles_arg = "-profiles=./server"
|
||||||
|
bepath_arg = "-bepath=./battleye"
|
||||||
|
|
||||||
args = [
|
args = [
|
||||||
f"-port={config_sections.get('_port', 2302)}",
|
f"-port={config_sections.get('_port', 2302)}",
|
||||||
"-config=server.cfg",
|
config_arg,
|
||||||
"-cfg=basic.cfg",
|
cfg_arg,
|
||||||
"-profiles=./server",
|
profiles_arg,
|
||||||
"-name=server",
|
"-name=server",
|
||||||
f"-world={launch.world}",
|
f"-world={launch.world}",
|
||||||
f"-limitFPS={launch.limit_fps}",
|
f"-limitFPS={launch.limit_fps}",
|
||||||
"-bepath=./battleye",
|
bepath_arg,
|
||||||
]
|
]
|
||||||
if launch.auto_init:
|
if launch.auto_init:
|
||||||
args.append("-autoInit")
|
args.append("-autoInit")
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ class ServerService:
|
|||||||
|
|
||||||
# Build launch args
|
# Build launch args
|
||||||
try:
|
try:
|
||||||
launch_args = config_gen.build_launch_args(raw_sections, mod_args)
|
launch_args = config_gen.build_launch_args(raw_sections, mod_args, server_dir=server_dir)
|
||||||
except LaunchArgsError as e:
|
except LaunchArgsError as e:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_400_BAD_REQUEST,
|
status_code=status.HTTP_400_BAD_REQUEST,
|
||||||
|
|||||||
Reference in New Issue
Block a user