feat: Map-Shuffle beim Containerstart (SHUFFLE_MAPLIST)

This commit is contained in:
Patrick Asmus (scriptos)
2026-03-23 21:55:27 +01:00
parent ca6c0faaa0
commit 12a8e0f778
3 changed files with 100 additions and 0 deletions
+1
View File
@@ -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=""
+77
View File
@@ -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 <challenge>-Eintraege werden zufaellig gemischt
# und <startindex> 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 <challenge>...</challenge>-Bloecke extrahieren
if (!preg_match_all("/<challenge>.*?<\/challenge>/s", $xml, $matches)) {
echo " Keine <challenge>-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 <challenge>-Bloecke aus dem XML entfernen
$xmlClean = preg_replace("/(\s*<challenge>.*?<\/challenge>)+/s", "", $xml, 1);
// Gemischte Challenges vor </playlist> wieder einfuegen
$challengeBlock = "";
foreach ($challenges as $ch) {
$challengeBlock .= "\t" . $ch . "\n";
}
$xmlNew = str_replace("</playlist>", $challengeBlock . "</playlist>", $xmlClean);
// <startindex> auf 0 setzen (damit ab der ersten gemischten Map gestartet wird)
$xmlNew = preg_replace("/<startindex>[^<]*<\/startindex>/", "<startindex>0</startindex>", $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>(.*?)<\/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}"
+22
View File
@@ -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 `<challenge>`-Einträge in der MatchSettings-XML werden zufällig neu angeordnet
- Der `<startindex>` 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.