Bibliothek

Partien, IS-Blob und Zuschauer

Wie man Partien mit dem korrekten Anfangszustand startet und Spätbeitretende synchronisiert.

Eine Partie auf bonk.io zu starten erfordert mehr als „Start“ zu drücken: Der Host sendet den physikalischen Anfangszustand (den IS-Blob) und die Spieleinstellungen. Die Bibliothek übernimmt das Senden, aber den richtigen Blob musst du liefern.

Starten und stoppen

ts
room.startGame({ is: isBlob, gs: { bal: { 0: 0, 5: 1, 7: 2 } } });
room.stopGame();
OptionWas es ist
isDer physikalische Anfangszustand (ein LZ-String).
gsÜberschreibungen der Spieleinstellungen (Partial<GameSettings>), etwa bal.

Der Server spiegelt den Blob unverändert an alle Clients zurück. Ein leerer Blob verhindert, dass die Physik-Engine startet: Die Spieler erscheinen nicht auf dem Feld und das Spiel scheint beim Laden festzuhängen.

Der IS-Blob

Der IS-Blob kodiert Spawn-Positionen, Rotationen und welche Körper in der Partie existieren. Er hängt von zwei Faktoren ab:

  • Der Karte. Ein auf einer Karte aufgezeichneter Blob funktioniert auf einer anderen nicht.
  • Der Anzahl aktiver Spieler. Der 1v1-Blob (2 Spieler) funktioniert nicht für 2v2 (4 Spieler).

Standard-Blobs

Für die Standard-Fußballkarte und einige Modi liefert die Bibliothek fertige Blobs mit:

ts
import { getFootballDefaultBlob, getGamemodeDefaultBlob } from 'bonktools';

getFootballDefaultBlob(2);              // 1v1
getFootballDefaultBlob(4);              // 2v2
getGamemodeDefaultBlob('football', 2);  // pro Spielmodus

Für Karten, die je Raum variieren (Classic, Arrows usw.), nutze den Cache pro Karte.

Cache pro Karte

ts
import { MapBlobCache } from 'bonktools';

const cache = new MapBlobCache('./map-blob-cache.json');

const blob = cache.getForMap(room.currentMap, 4);   // Blob dieser Karte für 4 Spieler
if (!blob) { /* capture um (veja abaixo) */ }
cache.setForMap(room.currentMap, 4, capturedBlob);

Einen Blob aufzeichnen

Der zuverlässige Weg ist, ihn in einer echten Sitzung aufzuzeichnen. Die Bibliothek enthält ein Hilfsprogramm:

bash
BONK_USERNAME=dein_benutzer BONK_PASSWORD=dein_passwort npx bonktools-capture-is https://bonk.io/123456abcde

Es tritt dem Raum als Zuschauer bei und wartet. Sobald ein echter Host im Browser eine Partie startet, gibt es den Blob im Format BONK_INITIAL_STATE=... aus, bereit zum Einfügen in deine .env oder in den Cache pro Karte. Zeichne für jede Anzahl aktiver Spieler, die du nutzen willst, einen Blob auf.

Das Feld bal

bal gibt an, welchen Körper jeder Spieler steuert, in der Form { playerId: bodyIndex }.

ts
// Bot (id 0) ohne Körper; Spieler 5 und 7 mit Körpern 1 und 2
room.startGame({ is, gs: { bal: { 0: 0, 5: 1, 7: 2 } } });

Nutze immer die explizite Zuordnung. Bei bal: [] werden die Körper in aufsteigender ID-Reihenfolge vergeben, und wenn Spieler kamen und gingen, haben die IDs Lücken: Ein Spieler des blauen Teams kann auf der roten Seite spawnen.

Spieler, die während einer laufenden Partie beitreten

Wenn ein Spieler beitritt, muss der Host ihm die Anfangsdaten übergeben. Es gibt zwei mögliche Pakete, und der Client akzeptiert nur eines:

SituationGesendetes Paket
Raum in der LobbyINFORM_IN_LOBBY
Partie läuftINFORM_IN_GAME (enthält den Partiezustand)

Die Bibliothek wählt selbst: Wurde eine Partie mit startGame({ is }) gestartet und ist noch aktiv, erhält der neue Spieler INFORM_IN_GAME anstelle von INFORM_IN_LOBBY und sieht die Partie, ohne sie für die anderen neu zu starten.

Startet dein Bot die Partie direkt nach einem Beitritt neu (wie es der 24/7-Raum tut, um Teams aufzufüllen), funktioniert alles: Der Spieler erhält das richtige Paket und danach den Start der neuen Partie.