Netzwerk

Netzwerk

Autoritativer Multiplayer-Server mit WebRTC und tick-basierter Zustandssynchronisierung.

MavonEngine verwendet eine autoritative Server-Architektur für Multiplayer. Der Server ist die einzige Wahrheitsquelle — Clients senden Befehle, der Server verarbeitet sie und sendet den Zustand zurück an die Clients.

Referenz: Die Architektur ist inspiriert von Gaffer On Games und Source Engine Multiplayer Networking.

Transport

Echtzeit-Daten werden über UDP via WebRTC mit geckos.io übertragen. Dies ermöglicht latenzarme, unzuverlässige Nachrichten, die für die Spielzustandssynchronisierung geeignet sind.

Architekturübersicht

Client                          Server
  │                               │
  │── Befehl (Eingabe) ─────────► │
  │                               │  1) Befehl verarbeiten
  │                               │  2) Physik-Schritt
  │                               │  3) Zustand aktualisieren
  │◄── Zustandsabgleich (Tick) ── │
  │                               │
  1. Client erfasst Eingaben und sendet Befehle an den Server
  2. Server stellt Befehle in einen Befehlspuffer
  3. Bei jedem Tick verarbeitet der Server Befehle, berechnet Physik und sendet den Weltzustand
  4. Zustand wird nur an Clients innerhalb des Sichtbarkeitsradius jeder Entity gesendet

Gemeinsame 3D-Szene

Sowohl Server als auch Client betreiben eine Three.js-Szene, jedoch mit unterschiedlichem Zweck. Der Client hält die vollständige Szene - detaillierte Meshes, Materialien und visuelle Geometrie. Der Server hält vereinfachte Hitbox-Meshes - leichtgewichtige Geometrie, die ausschließlich für räumliche Abfragen genutzt wird.

Das bedeutet, der Server kann autoritativen Raycasting, Treffernachweis und Flächenwirkungsprüfungen direkt gegen seine Szene durchführen, ohne den vom Client gemeldeten Positionen zu vertrauen - und ohne den Overhead vollständiger visueller Geometrie.

// Serverseitiges Raycasting gegen Hitbox-Meshes
const raycaster = new THREE.Raycaster()
raycaster.set(origin, direction)
const hits = raycaster.intersectObjects(game.scene.children, true)

Schlüsselklassen

Server

Autoritativer Server mit Befehlspuffer, Tick-Schleife und HTTP-Health-Endpunkt.

NetworkManager

Client-seitige WebRTC-Verbindung mit Ping-Überwachung.

Vernetzte Actors

NetworkedActor, NetworkedGameObject und Zustandssynchronisierungs-Utilities.

Zustandsabgleich

Wie Entity-Zustand zwischen Server und Clients serialisiert und synchronisiert wird.