mirror of
https://git.techniverse.net/scriptos/tmserver-docker.git
synced 2026-05-08 07:05:47 +00:00
feat: Map-Shuffle beim Containerstart (SHUFFLE_MAPLIST)
This commit is contained in:
@@ -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=""
|
||||
|
||||
@@ -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}"
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user