Bibliothek

Zustand und Events

room.state und alle typisierten Events von BonkRoom.

BonkRoom erweitert EventEmitter3 um die Event-Map BonkRoomEvents. Jedes Event ist typisiert: TypeScript warnt dich, wenn Name oder Argumenttyp nicht stimmen.

Aktueller Zustand: room.state

ts
const state = room.state;
state.myId;         // numerische ID des Bots (null vor dem Beitritt)
state.hostId;       // ID des aktuellen Hosts
state.players;      // Map<id, PlayerData>
state.inGame;       // true während einer Partie
state.teamsLocked;  // true, wenn die Teams gesperrt sind

PlayerData

FeldBeschreibung
idNumerische ID im Raum
peerIDID der WebRTC-Verbindung (nützlich, um Input-Frames zuzuordnen)
userName, guest, levelIdentität des Spielers
team0 spec · 1 ffa · 2 rot · 3 blau · 4 grün · 5 gelb
ready, tabbedAls bereit markiert / Tab im Hintergrund
ping, xp, balanceLatenz, geschätzte XP und Partie-Balance

So hörst du zu

ts
room.on('player-join', (p) => console.log(p.userName, p.id, p.level));

room.on('chat-message', (p) => {
  const nome = room.state.players.get(p.id)?.userName;
  console.log(`[${nome}]: ${p.message}`);
});

room.on('room-dead', (reason) => {
  // reason.kind: 'socket-disconnect' | 'status-banned' | 'status-room_full' | 'max-retries-exceeded'
});

room.on('room-rebuilt', (link) => console.log('neue URL:', link));

Event-Tabelle

EventPayloadWann
room-createdRoomCreatedPacketDer Bot hat den Raum erstellt
room-joinRoomJoinPacketDer Bot ist einem Raum beigetreten
player-joinPlayerJoinPacketEin Spieler ist beigetreten
player-leavePlayerLeavePacketEin Spieler ist gegangen
host-leaveHostLeavePacketDer Host ist gegangen (newHostId = -1: Raum geschlossen)
team-changeTeamChangePacketEin Spieler hat das Team gewechselt
ready-changeReadyChangePacketAls bereit markiert/entmarkiert
tabbedTabbedPacketHat den Tab verlassen / ist zurückgekehrt
username-changeUsernameChangePacketName geändert
player-pingsPlayerPingsPacketPing aller Spieler
game-startGameStartPacketPartie gestartet
game-endGameEndPacketPartie beendet
all-ready-resetAllReadyResetPacketDas „Bereit“ aller wurde zurückgesetzt
chat-messageChatMessagePacketChat-Nachricht
player-kickPlayerKickPacketEin Spieler wurde rausgeworfen
countdown / abort-countdownCountdownPacket / AbortCountdownPacketCountdown
teamlock-toggleTeamlockTogglePacketTeams gesperrt/entsperrt
gamemode-changeGamemodeChangePacketSpielmodus geändert
change-roundsChangeRoundsPacketRunden geändert
map-switchMapSwitchPacketKarte gewechselt
balance-setBalanceSetPacketBalance eines Spielers geändert
player-level-upPlayerLevelUpPacketEin Spieler ist aufgestiegen
room-name-update / room-password-updatePaketeRaumname/-passwort geändert
status-messageStatusMessagePacketServer-Hinweis (Fehler, Ratenlimits)
share-linkShareLinkPacketRaumlink verfügbar
room-deadRoomDeadReasonDer Raum ist ausgefallen (mit Wiederholung oder endgültig)
room-rebuiltstringDer Raum wurde neu erstellt (neuer Link)
raw-packetIncomingPacket | UnknownPacketJedes Rohpaket, auch nicht zugeordnete

Von Anti-AFK hinzugefügte Events

EventPayloadWann
peer-input{ playerId, peerID, data }Über WebRTC empfangener Input-Frame eines Spielers
player-afkplayerIdDer Spieler war für die Zeitgrenze inaktiv (ohne Input und ohne Chat)
player-backplayerIdEin AFK-Spieler hat sich wieder bewegt oder geschrieben

Siehe Anti-AFK.