Fixed master address, admin cheats (money, needs, goto/bring), docs page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-26 21:56:31 +02:00
co-authored by Claude Opus 5.5
parent 48f76e97cc
commit 0ab5b32d08
4 changed files with 18 additions and 17 deletions
+10
View File
@@ -286,6 +286,16 @@ public sealed class GameServer
string result; string result;
if (!c.IsAdmin) result = "You are not an admin on this server"; if (!c.IsAdmin) result = "You are not an admin on this server";
else if (!clients.TryGetValue(targetId, out var target) || target.State != ClientState.Joined) result = "Player not found"; else if (!clients.TryGetValue(targetId, out var target) || target.State != ClientState.Joined) result = "Player not found";
else if (action == 3)
{
// Spieler zum Admin holen: Position kommt vom Admin
if (r.BaseStream.Length - r.BaseStream.Position < 12) return;
float x = r.ReadSingle(), y = r.ReadSingle(), z = r.ReadSingle();
if (!float.IsFinite(x) || !float.IsFinite(y) || !float.IsFinite(z)) return;
target.Conn.Send(MsgType.Teleport, Wire.Build(w => { w.Write(x); w.Write(y); w.Write(z); }));
result = $"Brought {target.Name} to you";
Log($"{c.Name} teleported {target.Name} to themselves");
}
else if (target.IsAdmin && target != c) result = "You cannot kick or ban another admin"; else if (target.IsAdmin && target != c) result = "You cannot kick or ban another admin";
else result = KickOrBan(target, action == 2, reason, c.Name); else result = KickOrBan(target, action == 2, reason, c.Name);
c.Conn.Send(MsgType.AdminResult, Wire.Build(w => w.Write(result))); c.Conn.Send(MsgType.AdminResult, Wire.Build(w => w.Write(result)));
+2 -14
View File
@@ -4,25 +4,13 @@ namespace MSCO.Server;
/// <summary> /// <summary>
/// Alle Server hängen am offiziellen Master (Keymaster + Serverliste). Die Adresse ist fest eingebaut, /// Alle Server hängen am offiziellen Master (Keymaster + Serverliste). Die Adresse ist fest eingebaut,
/// damit niemand die Schlüsselprüfung über einen eigenen Master umgehen kann. /// damit niemand die Schlüsselprüfung über einen eigenen Master umgehen kann - nicht über server.json,
/// Nur Debug-Builds (lokales Testen) dürfen sie mit MSCO_MASTER_URL umstellen. /// Umgebungsvariablen oder Startparameter änderbar.
/// </summary> /// </summary>
public static class MasterServer public static class MasterServer
{ {
public const string OfficialUrl = "https://msco.mbm.wtf"; public const string OfficialUrl = "https://msco.mbm.wtf";
#if DEBUG
public static string Url
{
get
{
string custom = Environment.GetEnvironmentVariable("MSCO_MASTER_URL");
return string.IsNullOrWhiteSpace(custom) ? OfficialUrl : custom.Trim().TrimEnd('/');
}
}
#else
public static string Url => OfficialUrl; public static string Url => OfficialUrl;
#endif
} }
/// <summary>Spricht mit dem Master-Server: Lizenzschlüssel prüfen und Server in der Liste melden.</summary> /// <summary>Spricht mit dem Master-Server: Lizenzschlüssel prüfen und Server in der Liste melden.</summary>
+2 -1
View File
@@ -33,7 +33,8 @@ public enum MsgType : byte
AdminAction = 26, // Client -> Server: byte (1 = kick, 2 = ban), int Spieler-ID, string Grund AdminAction = 26, // Client -> Server: byte (1 = kick, 2 = ban), int Spieler-ID, string Grund
AdminResult = 27, // Server -> Client: string Meldung AdminResult = 27, // Server -> Client: string Meldung
Chat = 28, // Chatnachricht (string) Chat = 28, // Chatnachricht (string)
VarSync = 29 // Fahrzeugzustand: int n, je [int key, byte typ, wert] VarSync = 29, // Fahrzeugzustand: int n, je [int key, byte typ, wert]
Teleport = 30 // Admin holt einen Spieler zu sich: 3 float Position
} }
public readonly record struct Message(MsgType Type, byte[] Payload) public readonly record struct Message(MsgType Type, byte[] Payload)
+4 -2
View File
@@ -132,7 +132,9 @@ Fehlende Einstellungen ergänzt der Server beim Start automatisch. Umgebungsvari
| `reload-save` | Spielstand-Dateien neu einlesen | | `reload-save` | Spielstand-Dateien neu einlesen |
| `stop` | speichern und beenden | | `stop` | speichern und beenden |
Im Spiel öffnen Admins mit `/admin` (Chat, Taste T) oder `admin` (F8-Konsole) ein Kick/Ban-Menü. Im Spiel öffnen Admins mit `/admin` (Chat, Taste T) oder `admin` (F8-Konsole) das Admin-Menü: Kick/Ban,
GOTO/BRING (zu einem Spieler / Spieler zu sich teleportieren) und Cheats (Geld, Bedürfnisse auffüllen).
Cheats werden allen im Chat angezeigt, Teleports stehen im Server-Log.
Der Chat landet auch im Server-Log. Der Chat landet auch im Server-Log.
## Was der Server speichert ## Was der Server speichert
@@ -181,7 +183,7 @@ einen aktuellen Spielstand nach `data/save/` legen und `msco reset-world` ausfü
## Sicherheit ## Sicherheit
- Die Adresse des Masters (`https://msco.mbm.wtf`) ist fest eingebaut, damit niemand die Schlüsselprüfung mit - 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`. einem eigenen Master umgehen kann. Sie lässt sich weder in `server.json` noch per Umgebungsvariable ändern.
- `data/` enthält Lizenzschlüssel und API-Keys – nicht veröffentlichen (steht in `.gitignore`). - `data/` enthält Lizenzschlüssel und API-Keys – nicht veröffentlichen (steht in `.gitignore`).
- Der Container läuft nicht als root. Spielerdaten (Nachrichten, Objektzustände) werden in der Größe begrenzt, - Der Container läuft nicht als root. Spielerdaten (Nachrichten, Objektzustände) werden in der Größe begrenzt,
unbekannte oder zu große Nachrichten verworfen. unbekannte oder zu große Nachrichten verworfen.