# MSCO Dedicated Server Dedizierter Server für **MSCO – My Summer Car Online**. Er hält einen gemeinsamen Spielstand, speichert alles, was die Spieler verändern, und gibt es an später Beitretende weiter. .NET 10, läuft unter Linux (Docker oder systemd) und Windows. - Mod: [MSCO](https://git.mbm.wtf/MrMaho/MSCO) - Keymaster & Serverliste: [MSCO-Keymaster](https://git.mbm.wtf/MrMaho/MSCO-Keymaster) – https://msco.mbm.wtf ## Voraussetzungen - Ein **Lizenzschlüssel** von https://msco.mbm.wtf/keys (Login mit Steam, wie der FiveM-Keymaster). Der Server prüft ihn beim Start und meldet sich danach regelmäßig beim Master für die Serverliste. - Ein My-Summer-Car-Spielstand als Startwelt. - Port **7777/TCP** im Router/Firewall freigegeben (sonst wird der Server nicht gelistet). - Server und Mod müssen dieselbe Version haben (sonst bekommen Spieler eine Warnung). ## Mit Docker (empfohlen) ```bash git clone https://git.mbm.wtf/MrMaho/MSCO-Dedicated-Server.git cd MSCO-Dedicated-Server docker compose up -d --build # erster Start legt data/server.json an und beendet sich ``` 1. In `data/server.json` mindestens `LicenseKey` eintragen. 2. Die Spielstand-Dateien nach `data/save/` kopieren (siehe unten). 3. `docker compose up -d` | Aktion | Befehl | |---|---| | Konsole | `docker attach msco-server` – verlassen mit **Strg+P, dann Strg+Q** (Strg+C beendet den Server) | | Einzelner Befehl | `docker exec msco-server msco `, z.B. `msco players` | | Logs | `docker logs -f msco-server` | | Stoppen | `docker compose stop` – speichert vorher den Weltzustand und meldet den Server ab | | Update | `git pull && docker compose up -d --build` | Anderer Port: in `data/server.json` **und** in `docker-compose.yml` ändern. ### Linux: „Permission denied“ in `data/` Der Container läuft als Benutzer-ID **1000** (der erste Linux-Benutzer), damit dir die Dateien in `data/` gehören. Hat dein Benutzer eine andere ID (`id -u` / `id -g`), trag sie in eine `.env` neben der `docker-compose.yml` ein: ```bash echo "MSCO_UID=$(id -u)" > .env echo "MSCO_GID=$(id -g)" >> .env ``` Wurden Dateien schon von einer älteren Version als root angelegt, einmal zurückholen: ```bash docker compose down sudo chown -R $(id -u):$(id -g) data docker compose up -d --build ``` ## Ohne Docker **Linux (systemd):** .NET 10 Runtime installieren (`sudo apt install dotnet-runtime-10.0`), dann `dotnet publish -c Release -o /opt/msco-server` und [`deploy/msco-server.service`](deploy/msco-server.service) einrichten (Anleitung oben in der Datei). Daten liegen in `/var/lib/msco-server`. Für eine Konsole den Server stattdessen in `screen`/`tmux` starten. **Windows:** `dotnet publish -c Release -o publish`, dann `publish\MSCO.Server.exe` starten. Startparameter: - `--data ` – Datenordner (Standard: Programmordner; Docker: `/data`) - `--import-save [pfad]` – Spielstand übernehmen (ohne Pfad: der eigene Spielstand dieses PCs, auch Proton) - `--cmd ` – Befehl an einen laufenden Server im selben Datenordner schicken ## Spielstand In `data/save/` gehören diese Dateien aus dem My-Summer-Car-Spielstand: `defaultES2File.txt`, `items.txt`, `meshsave.txt`, `graveyard.txt` (und `notepad.txt`, falls vorhanden). - Windows: `%USERPROFILE%\AppData\LocalLow\Amistech\My Summer Car` - Linux (Proton): `~/.steam/steam/steamapps/compatdata/516750/pfx/drive_c/users/steamuser/AppData/LocalLow/Amistech/My Summer Car` Neuen Spielstand übernehmen: Dateien ersetzen, `data/world.json` löschen, Server neu starten. ## Einstellungen (`data/server.json`) | Einstellung | Bedeutung | |---|---| | `LicenseKey` | Schlüssel von der Keymaster-Seite (Pflicht) | | `Name`, `Description` | Anzeige im Server-Browser | | `MaxPlayers`, `Port` | Spieler-Limit (max. 3 sinnvoll), Port | | `Public` | `false` = nicht in der Liste, nur Direct Connect | | `RequireSteam` | `true` = nur Spieler mit Steam; `false` = Non-Steam-Server (Spieler werden über den Namen erkannt) | | `PublicAddress` | öffentliche IP/Domain für die Liste (nur hinter NAT/Proxy nötig) | | `AutosaveSeconds` | wie oft der Weltzustand gespeichert wird | | `SteamWebApiKey` | optional: Steam-Anmeldetickets der Spieler bei Steam prüfen | | `BannedSteamIds` | gesperrte Spieler | | `Admins` | SteamID64s, die im Spiel mit `/admin` kicken/bannen dürfen | Fehlende Einstellungen ergänzt der Server beim Start automatisch. Umgebungsvariablen (`MSCO_LICENSE_KEY`, `MSCO_NAME`, `MSCO_PORT`, `MSCO_MAX_PLAYERS`, `MSCO_PUBLIC`, `MSCO_REQUIRE_STEAM`, `MSCO_PUBLIC_ADDRESS`, `MSCO_STEAM_WEB_API_KEY`) überschreiben `server.json`. ## Konsolenbefehle | Befehl | Beschreibung | |---|---| | `status`, `players` | Übersicht, Spielerliste mit IDs | | `kick [grund]`, `ban [grund]` | Spieler entfernen / sperren | | `say ` | Chatnachricht an alle | | `admins`, `op `, `deop <...>` | Admins anzeigen / geben / nehmen | | `save` | Weltzustand jetzt speichern | | `reset-world` | alle Änderungen seit dem Spielstand verwerfen | | `reload-save` | Spielstand-Dateien neu einlesen | | `stop` | speichern und beenden | Im Spiel öffnen Admins mit `/admin` (Chat, Taste T) oder `admin` (F8-Konsole) ein Kick/Ban-Menü. Der Chat landet auch im Server-Log. ## Was der Server speichert - `save/` – der Ausgangs-Spielstand, den jeder neue Spieler bekommt. - `world.json` – alles, was seitdem passiert ist: Positionen bewegter Objekte, Schraub-/Montage-Aktionen, Geld, Türen/Tore, Fahrzeugzustand (Tank, Öl, Schrauben, Verschleiß …) und die letzte Position jedes Spielers. Beim Beitreten: Spielstand laden → Objekte erfassen → Weltzustand anwenden → an der letzten eigenen Position weiterspielen. ## Sicherheit - Die Adresse des Masters (`https://msco.mbm.wtf`) ist fest eingebaut, damit niemand die Schlüsselprüfung mit einem eigenen Master umgehen kann. Nur Debug-Builds akzeptieren `MSCO_MASTER_URL`. - `data/` enthält Lizenzschlüssel und API-Keys – nicht veröffentlichen (steht in `.gitignore`). ## Lizenz GNU AGPL-3.0 – siehe [LICENSE](LICENSE). Made by **MBM** – [mbm.wtf](https://mbm.wtf)