68dfea27b5
Сервер умел принимать игроков и не умел ничего, что можно увидеть. Мир был не написан: ни чанков, ни генерации, ни сохранения, ни игровых пакетов. Сделано: - Пакет world: ChunkPos, Chunk, Blocks (теперь в протоколе), WorldGenerator, ChunkStorage, World. Генерация чистая функция от зерна и координат, без java.util.Random и без общего состояния, потому что чанк может появиться через месяц после соседнего, на другой машине, и обязан совпасть с ним побайтово. Сохранение — файл на чанк, запись во временный файл и перенос, версия и контрольная сумма: половина записанного файла это мир, который молча испортился. - Снимок чанка и запись блока теперь под одним замком. Раньше копия могла сняться посреди записи блока, и на диск уходила половина изменения. - Player: позиция, вид, список отправленных чанков, проверка досягаемости блока. Клиент не может переписать блок, до которого не дотянулся. - Сервер держит мир, крутит его по тику, выкидывает давно не тронутые чанки, шлет чанки вокруг игрока и рассылает изменения блоков и передвижения тем, кто их видит. - Клиентский сетевой слой в игре еще не тронут: это следующий шаг. Проверено: 45 тестов сервера. Из них 25 на мир (детерминизм, круг сохранения, автосохранение, вытеснение, отказ битому файлу) и 9 сквозных через настоящий сокет: игрок входит, получает 25 чанков, чанк совпадает с террейном сервера, блок ломается и остаётся сломанным после перезапуска сервера, два игрока видят друг друга.