mirror of
https://git.techniverse.net/scriptos/tmserver-docker.git
synced 2026-07-09 21:47:02 +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)
|
# Spieleinstellungen (MatchSettings)
|
||||||
ENV ALLWARMUPDURATION=0
|
ENV ALLWARMUPDURATION=0
|
||||||
|
ENV SHUFFLE_MAPLIST=false
|
||||||
|
|
||||||
# Forced Mods (Skins) - URL zu ZIP-Dateien, die beim Start forciert werden
|
# Forced Mods (Skins) - URL zu ZIP-Dateien, die beim Start forciert werden
|
||||||
ENV FORCE_MOD_STADIUM=""
|
ENV FORCE_MOD_STADIUM=""
|
||||||
|
|||||||
@@ -743,6 +743,83 @@ fi
|
|||||||
|
|
||||||
echo " Aktive MatchSettings: ${GAME_SETTINGS_PATH}"
|
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)
|
# Bestimme Server-Modus (Standard: internet)
|
||||||
SERVER_MODE="${SERVER_MODE:-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` |
|
| `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` |
|
| `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
|
### 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.
|
> **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
|
||||||
|
|
||||||
RemoteCP verwendet die SuperAdmin-Zugangsdaten (`SERVER_SA_PASSWORD`) des TM-Servers für den Web-Login. Es werden keine separaten Login-Variablen benötigt.
|
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