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
| Schicht | Technologie |
|---|---|
| Transport | WebSocket (TLS) |
| Engine.IO | Version 3 (EIO=3) |
| Socket.IO | Version 2 |
| Framing | 42[eventId, payload] |
| Serialisierung | JSON |
Ablauf einer Sitzung
- Login bei
login_legacy.php, das ein Token zurückgibt. - Server-Ermittlung (
getrooms.phpzum Erstellen,autojoin.phpzum Beitreten per URL). - Socket.IO-Verbindung zum angegebenen Server, mit periodischem Timesync.
- Den Raum erstellen (
CREATE_ROOM) oder ihm beitreten (JOIN_ROOM). - Der Host antwortet jedem beitretenden Spieler mit den Anfangsdaten (siehe unten).
- Partie: Der Host sendet
TRIGGER_STARTund der Server spiegeltGAME_STARTan 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:
| Situation | Paket |
|---|---|
| Lobby | INFORM_IN_LOBBY (out 11) |
| Partie läuft | INFORM_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 sindnull.- Der Ersteller des Raums erhält kein
JOIN_ROOM. Er ist Spieler 0 und Host. room_fullist mehrdeutig. Es ist nur endgültig, wenn der Bot dem Raum noch nicht beigetreten ist.- Die Karte in
INFORM_IN_LOBBYist ein JSON-Objekt, kein LZ-String. - Der IS-Blob hängt von der Spielerzahl und der Karte ab.
- Explizites
bal. Beibal: []können nicht zusammenhängende IDs vertauschte Spawns erzeugen. gs.tlmuss die tatsächliche Sperre des Raums widerspiegeln: Bei aktiver Sperre undgs.tl: falsewaren die Spieler eingefroren.- Paket-IDs haben getrennte Namensräume je Richtung (die eingehende
20ist Chat; die ausgehende20ist 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.