Referência
Protocolo do bonk.io
Um resumo do protocolo que a biblioteca fala, com as armadilhas mais importantes.
Esta página resume o que a biblioteca faz por baixo. A documentação completa, com todos os IDs de packet e formatos, fica no arquivo BONK_PROTOCOL.md do repositório.
Camadas de rede
| Camada | Tecnologia |
|---|---|
| Transporte | WebSocket (TLS) |
| Engine.IO | versão 3 (EIO=3) |
| Socket.IO | versão 2 |
| Framing | 42[eventId, payload] |
| Serialização | JSON |
Fluxo de uma sessão
- Login em
login_legacy.php, que devolve um token. - Descoberta do servidor (
getrooms.phppara criar,autojoin.phppara entrar por URL). - Conexão Socket.IO ao servidor indicado, com timesync periódico.
- Criar (
CREATE_ROOM) ou entrar (JOIN_ROOM) na sala. - O host responde a cada jogador que entra com os dados iniciais (veja abaixo).
- Partida: o host envia
TRIGGER_STARTe o servidor ecoaGAME_STARTpara todos.
Duas conexões: Socket.IO e WebRTC
O Socket.IO cobre a sala (jogadores, times, chat, início e fim de partida). Mas o movimento dos jogadores dentro da partida não passa por ele: é sincronizado por WebRTC entre os peers, sinalizado por um broker PeerJS padrão. Para receber esses frames (base do anti-AFK), a biblioteca completa o handshake WebRTC como um jogador comum.
Os frames de input são pequenos pacotes binários. Há um frame por tecla apertada ou solta e nenhum enquanto o jogador está parado.
Dados iniciais de quem entra
Quando um jogador entra, o host envia um pacote com o estado da sala. O client só aceita o primeiro:
| Situação | Pacote |
|---|---|
| Lobby | INFORM_IN_LOBBY (out 11) |
| Partida em andamento | INFORM_IN_GAME (out 40), com state, stateID, fc, inputs, admin, gs, random |
Enviar os dois deixa o segundo ignorado. A biblioteca escolhe o certo automaticamente.
Armadilhas que a biblioteca já resolve
players[]é um array esparso. O índice é o id do jogador; slots vagos sãonull.- O criador da sala não recebe
JOIN_ROOM. Ele é o player 0 e host. room_fullé ambíguo. Só é terminal quando o bot ainda não entrou na sala.- O mapa no
INFORM_IN_LOBBYé um objeto JSON, não uma string LZ. - O IS blob depende do número de jogadores e do mapa.
balexplícito. Combal: [], ids não contíguos podem gerar spawns trocados.gs.tlprecisa refletir o lock real da sala: com o lock ligado egs.tl: false, os jogadores ficavam congelados.- Ids de packet têm namespaces separados por direção (o
20recebido é chat; o20enviado é outra coisa).
Numeração dos times
0 spec · 1 FFA · 2 vermelho · 3 azul · 4 verde · 5 amarelo.
Limites de taxa
O servidor limita a frequência de vários comandos e responde com um status-message (rate_limit_tl para o lock de times, rate_limit_cot para trocas de time, etc.). Códigos terminais, como banned, encerram a sala.