Referenz

Das bonk.io-Protokoll

Eine Zusammenfassung des Protokolls, das die Bibliothek spricht, mit den wichtigsten Fallstricken.

Diese Seite fasst zusammen, was die Bibliothek im Hintergrund tut. Die vollständige Dokumentation mit allen Paket-IDs und Formaten steht in der Datei BONK_PROTOCOL.md des Repositorys.

Netzwerkschichten

SchichtTechnologie
TransportWebSocket (TLS)
Engine.IOVersion 3 (EIO=3)
Socket.IOVersion 2
Framing42[eventId, payload]
SerialisierungJSON

Ablauf einer Sitzung

  1. Login bei login_legacy.php, das ein Token zurückgibt.
  2. Server-Ermittlung (getrooms.php zum Erstellen, autojoin.php zum Beitreten per URL).
  3. Socket.IO-Verbindung zum angegebenen Server, mit periodischem Timesync.
  4. Den Raum erstellen (CREATE_ROOM) oder ihm beitreten (JOIN_ROOM).
  5. Der Host antwortet jedem beitretenden Spieler mit den Anfangsdaten (siehe unten).
  6. Partie: Der Host sendet TRIGGER_START und der Server spiegelt GAME_START an alle.

Zwei Verbindungen: Socket.IO und WebRTC

Socket.IO deckt den Raum ab (Spieler, Teams, Chat, Beginn und Ende der Partie). Aber die Bewegung der Spieler innerhalb der Partie läuft nicht darüber: Sie wird per WebRTC zwischen den Peers synchronisiert, signalisiert über einen Standard-PeerJS-Broker. Um diese Frames zu empfangen (die Grundlage von Anti-AFK), schließt die Bibliothek den WebRTC-Handshake wie ein gewöhnlicher Spieler ab.

Input-Frames sind kleine binäre Pakete. Es gibt einen Frame pro gedrückter oder losgelassener Taste und keinen, solange der Spieler ruht.

Anfangsdaten für Beitretende

Tritt ein Spieler bei, sendet der Host ein Paket mit dem Raumzustand. Der Client akzeptiert nur das erste:

SituationPaket
LobbyINFORM_IN_LOBBY (out 11)
Partie läuftINFORM_IN_GAME (out 40), mit state, stateID, fc, inputs, admin, gs, random

Werden beide gesendet, wird das zweite ignoriert. Die Bibliothek wählt automatisch das richtige.

Fallstricke, die die Bibliothek bereits löst

  • players[] ist ein dünn besetztes Array. Der Index ist die Spieler-ID; freie Plätze sind null.
  • Der Ersteller des Raums erhält kein JOIN_ROOM. Er ist Spieler 0 und Host.
  • room_full ist mehrdeutig. Es ist nur endgültig, wenn der Bot dem Raum noch nicht beigetreten ist.
  • Die Karte in INFORM_IN_LOBBY ist ein JSON-Objekt, kein LZ-String.
  • Der IS-Blob hängt von der Spielerzahl und der Karte ab.
  • Explizites bal. Bei bal: [] können nicht zusammenhängende IDs vertauschte Spawns erzeugen.
  • gs.tl muss die tatsächliche Sperre des Raums widerspiegeln: Bei aktiver Sperre und gs.tl: false waren die Spieler eingefroren.
  • Paket-IDs haben getrennte Namensräume je Richtung (die eingehende 20 ist Chat; die ausgehende 20 ist etwas anderes).

Team-Nummerierung

0 spec · 1 FFA · 2 rot · 3 blau · 4 grün · 5 gelb.

Ratenlimits

Der Server begrenzt die Häufigkeit mehrerer Befehle und antwortet mit einer status-message (rate_limit_tl für die Team-Sperre, rate_limit_cot für Team-Wechsel usw.). Endgültige Codes wie banned beenden den Raum.