Протокол до сих пор умел только рукопожатие: поздороваться, доказать
пароль, получить токен и войти. Дальше играть было нечем.
Добавлено:
- Packet, интерфейс, который умеет написать себя сам. Раньше отправитель
разбирал тип пакета в ветке instanceof, и с каждым новым видом пакета эта
ветка росла. Теперь отправитель знает только, что у пакета есть write().
- Блоки и ChunkFormat переехали в протокол. Идентификаторы блоков и
геометрия чанка — это словарь провода, а не внутреннее дело сервера:
клиент получает чанк байт на блок и обязан знать, что означает каждый
байт. Один источник правды вместо двух, которые могут разойтись.
- Игровые пакеты: JoinWorld, WorldJoin, ChunkData, BlockChange,
PlayerMove, EntityMove, Ping/Pong, EntitySpawn, EntityRemove.
- Чанк уходит по проводу сжатым. Чанк это 65536 байт, и почти все они это
воздух, поэтому дефлейт тут не украшение, а разница между «сервер
принял» и «клиент вошёл».
- Имена всем пакетам в таблице names(), чтобы забытый пакет был виден
сразу, а не всплывал через месяц.
Проверено: 22 теста протокола, включая круг чанка через сжатие, отказ
битому сжатому блоку и отказ обрезанному.