From 12a8e0f778bb5a175984c382f4634a7983930466 Mon Sep 17 00:00:00 2001 From: "Patrick Asmus (scriptos)" Date: Mon, 23 Mar 2026 21:55:27 +0100 Subject: [PATCH] feat: Map-Shuffle beim Containerstart (SHUFFLE_MAPLIST) --- Dockerfile | 1 + assets/bin/RunTrackmaniaServer.sh | 77 +++++++++++++++++++++++++++++++ docs/umgebungsvariablen.md | 22 +++++++++ 3 files changed, 100 insertions(+) diff --git a/Dockerfile b/Dockerfile index dbc418f..8138181 100644 --- a/Dockerfile +++ b/Dockerfile @@ -169,6 +169,7 @@ ENV FORCE_CONFIG_UPDATE=false # Spieleinstellungen (MatchSettings) ENV ALLWARMUPDURATION=0 +ENV SHUFFLE_MAPLIST=false # Forced Mods (Skins) - URL zu ZIP-Dateien, die beim Start forciert werden ENV FORCE_MOD_STADIUM="" diff --git a/assets/bin/RunTrackmaniaServer.sh b/assets/bin/RunTrackmaniaServer.sh index 4bcbed8..7617667 100644 --- a/assets/bin/RunTrackmaniaServer.sh +++ b/assets/bin/RunTrackmaniaServer.sh @@ -743,6 +743,83 @@ fi echo " Aktive MatchSettings: ${GAME_SETTINGS_PATH}" +# ============================================================ +# MatchSettings: Map-Reihenfolge zufaellig mischen +# ============================================================ +# Ueber die Umgebungsvariable SHUFFLE_MAPLIST kann gesteuert werden, +# ob die Reihenfolge der Maps in der aktiven MatchSettings-Datei +# beim Containerstart zufaellig durchgemischt wird: +# - "false" (Standard): Reihenfolge bleibt unveraendert. +# - "true": Alle -Eintraege werden zufaellig gemischt +# und wird auf 0 gesetzt. +# Die originale Datei wird dabei ueberschrieben. +# ============================================================ + +SHUFFLE_MAPLIST="${SHUFFLE_MAPLIST:-false}" + +if [ "$SHUFFLE_MAPLIST" = "true" ]; then + # Vollstaendigen Pfad zur aktiven MatchSettings-Datei bestimmen + ACTIVE_MS_FILE="$GAMEDATA_DIR/Tracks/${GAME_SETTINGS_PATH}" + if [ -f "$ACTIVE_MS_FILE" ]; then + echo "==> Map-Shuffle: Mische Maps in ${GAME_SETTINGS_PATH}..." + php -r ' + $file = $argv[1]; + $xml = file_get_contents($file); + if ($xml === false) { + echo " FEHLER: Konnte MatchSettings-Datei nicht lesen.\n"; + exit(1); + } + + // Alle ...-Bloecke extrahieren + if (!preg_match_all("/.*?<\/challenge>/s", $xml, $matches)) { + echo " Keine -Eintraege gefunden. Shuffle uebersprungen.\n"; + exit(0); + } + + $challenges = $matches[0]; + $count = count($challenges); + echo " $count Maps gefunden. Mische Reihenfolge...\n"; + + // Zufaellig mischen + shuffle($challenges); + + // Alle bestehenden -Bloecke aus dem XML entfernen + $xmlClean = preg_replace("/(\s*.*?<\/challenge>)+/s", "", $xml, 1); + + // Gemischte Challenges vor wieder einfuegen + $challengeBlock = ""; + foreach ($challenges as $ch) { + $challengeBlock .= "\t" . $ch . "\n"; + } + $xmlNew = str_replace("", $challengeBlock . "", $xmlClean); + + // auf 0 setzen (damit ab der ersten gemischten Map gestartet wird) + $xmlNew = preg_replace("/[^<]*<\/startindex>/", "0", $xmlNew); + + // Datei zurueckschreiben + if (file_put_contents($file, $xmlNew) === false) { + echo " FEHLER: Konnte MatchSettings-Datei nicht schreiben.\n"; + exit(1); + } + + // Erste 3 Maps anzeigen + echo " Reihenfolge erfolgreich gemischt.\n"; + echo " Neue Startreihenfolge (erste 3 Maps):\n"; + for ($i = 0; $i < min(3, $count); $i++) { + if (preg_match("/(.*?)<\/file>/", $challenges[$i], $m)) { + echo " " . ($i + 1) . ". " . $m[1] . "\n"; + } + } + if ($count > 3) echo " ... und " . ($count - 3) . " weitere Maps\n"; + ' "$ACTIVE_MS_FILE" + else + echo "==> Map-Shuffle: MatchSettings-Datei nicht gefunden: ${ACTIVE_MS_FILE}" + echo " Shuffle uebersprungen." + fi +else + echo "==> Map-Shuffle: Deaktiviert (SHUFFLE_MAPLIST=false)." +fi + # Bestimme Server-Modus (Standard: internet) SERVER_MODE="${SERVER_MODE:-internet}" diff --git a/docs/umgebungsvariablen.md b/docs/umgebungsvariablen.md index c439ea4..29b02f9 100644 --- a/docs/umgebungsvariablen.md +++ b/docs/umgebungsvariablen.md @@ -73,6 +73,7 @@ nano .env |----------|-------------|----------| | `MATCHSETTINGS_FILE` | MatchSettings-Datei beim Serverstart: `auto` = neueste `.txt`-Datei im Ordner wird automatisch geladen, oder ein expliziter Dateiname (z.B. `meine_settings.txt`) | `auto` | | `ALLWARMUPDURATION` | Warmup-Dauer für alle Runden (`0` = deaktiviert, `1` = eine Runde Warmup) | `0` | +| `SHUFFLE_MAPLIST` | Map-Reihenfolge beim Containerstart zufällig mischen (`true` = aktiviert, `false` = deaktiviert) | `false` | ### Automatische MatchSettings-Erkennung @@ -90,6 +91,27 @@ MATCHSETTINGS_FILE=turnier_settings.txt > **Hinweis:** Falls die angegebene oder automatisch ermittelte Datei nicht existiert, wird auf `custom_game_settings.txt` zurückgefallen. Die aktiv geladene Datei wird beim Serverstart in der Konsole ausgegeben. +### Map-Shuffle + +Mit `SHUFFLE_MAPLIST=true` wird die Reihenfolge aller Maps in der aktiven MatchSettings-Datei beim **jedem Containerstart** zufällig durchgemischt. So startet der Server jedes Mal mit einer anderen Map, statt immer bei Map #1 zu beginnen. + +- Die ``-Einträge in der MatchSettings-XML werden zufällig neu angeordnet +- Der `` wird automatisch auf `0` gesetzt +- Die aktive MatchSettings-Datei wird dabei direkt überschrieben +- Die ersten 3 Maps der neuen Reihenfolge werden beim Start in der Konsole angezeigt + +**Beispiel:** + +```bash +# Map-Reihenfolge bei jedem Start mischen +SHUFFLE_MAPLIST=true + +# Deaktiviert (Standard) – Reihenfolge bleibt wie in der Datei +SHUFFLE_MAPLIST=false +``` + +> **Hinweis:** Der Shuffle wird auf die MatchSettings-Datei angewendet, die durch `MATCHSETTINGS_FILE` bestimmt wird (entweder automatisch oder explizit). Die Änderung ist persistent – die Datei wird tatsächlich umgeschrieben. Bei jedem Neustart wird erneut gemischt. + ## RemoteCP RemoteCP verwendet die SuperAdmin-Zugangsdaten (`SERVER_SA_PASSWORD`) des TM-Servers für den Web-Login. Es werden keine separaten Login-Variablen benötigt.