Biblioteca

Estado y eventos

room.state y todos los eventos tipados de BonkRoom.

BonkRoom extiende EventEmitter3 con el mapa de eventos BonkRoomEvents. Todos los eventos están tipados: TypeScript te avisa si te equivocas en el nombre o en el tipo del argumento.

Estado actual: room.state

ts
const state = room.state;
state.myId;         // ID numérico del bot (null antes de entrar)
state.hostId;       // ID del host actual
state.players;      // Map<id, PlayerData>
state.inGame;       // true durante una partida
state.teamsLocked;  // true si los equipos están bloqueados

PlayerData

CampoDescripción
idID numérico en la sala
peerIDID de la conexión WebRTC (útil para asociar los frames de input)
userName, guest, levelIdentidad del jugador
team0 spec · 1 ffa · 2 rojo · 3 azul · 4 verde · 5 amarillo
ready, tabbedMarcado como listo / pestaña en segundo plano
ping, xp, balanceLatencia, XP estimado y balance de la partida

Cómo escuchar

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('nueva URL:', link));

Tabla de eventos

EventoPayloadCuándo
room-createdRoomCreatedPacketEl bot creó la sala
room-joinRoomJoinPacketEl bot entró en una sala
player-joinPlayerJoinPacketEntró un jugador
player-leavePlayerLeavePacketSalió un jugador
host-leaveHostLeavePacketSalió el host (newHostId = -1: sala cerrada)
team-changeTeamChangePacketUn jugador cambió de equipo
ready-changeReadyChangePacketMarcado/desmarcado como listo
tabbedTabbedPacketSalió de / volvió a la pestaña
username-changeUsernameChangePacketCambió de nombre
player-pingsPlayerPingsPacketPing de todos los jugadores
game-startGameStartPacketEmpezó la partida
game-endGameEndPacketTerminó la partida
all-ready-resetAllReadyResetPacketSe reinició el "listo" de todos
chat-messageChatMessagePacketMensaje de chat
player-kickPlayerKickPacketUn jugador fue expulsado
countdown / abort-countdownCountdownPacket / AbortCountdownPacketCuenta atrás
teamlock-toggleTeamlockTogglePacketEquipos bloqueados/desbloqueados
gamemode-changeGamemodeChangePacketCambió el modo de juego
change-roundsChangeRoundsPacketCambiaron los rounds
map-switchMapSwitchPacketCambió el mapa
balance-setBalanceSetPacketCambió el balance de un jugador
player-level-upPlayerLevelUpPacketUn jugador subió de nivel
room-name-update / room-password-updatepaquetesCambió el nombre/contraseña de la sala
status-messageStatusMessagePacketAviso del servidor (errores, límites de tasa)
share-linkShareLinkPacketEnlace de la sala disponible
room-deadRoomDeadReasonLa sala cayó (con reintento o terminal)
room-rebuiltstringLa sala fue recreada (enlace nuevo)
raw-packetIncomingPacket | UnknownPacketTodos los paquetes crudos, incluidos los no mapeados

Eventos añadidos por el anti-AFK

EventoPayloadCuándo
peer-input{ playerId, peerID, data }Frame de input recibido por WebRTC de un jugador
player-afkplayerIdEl jugador estuvo inactivo (sin input y sin chat) durante el tiempo límite
player-backplayerIdUn jugador AFK volvió a moverse o a escribir

Consulta Anti-AFK.