Мир на сервере: чанки, генерация, сохранение и поток игрока

Сервер умел принимать игроков и не умел ничего, что можно увидеть. Мир
был не написан: ни чанков, ни генерации, ни сохранения, ни игровых
пакетов.

Сделано:

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

Проверено: 45 тестов сервера. Из них 25 на мир (детерминизм, круг
сохранения, автосохранение, вытеснение, отказ битому файлу) и 9 сквозных
через настоящий сокет: игрок входит, получает 25 чанков, чанк совпадает с
террейном сервера, блок ломается и остаётся сломанным после перезапуска
сервера, два игрока видят друг друга.
This commit is contained in:
sasheg dev
2026-10-19 18:58:07 +03:00
parent 7cd074e13c
commit 68dfea27b5
15 changed files with 2588 additions and 58 deletions
+7
View File
@@ -19,6 +19,13 @@ out/
target/
*.class
# what a running server leaves behind. The patterns are anchored on purpose:
# a bare "world/" would also match the world package under
# rsx-server-core/src/main/java/net/rustnotmc/server/world, which is ours.
/rsx-server-core/world/
/rsx-server-core/accounts*.txt
/rsx-server-core/*.txt
# jars are build products; the third-party ones we redistribute are un-ignored
*.jar
!rsx-client/third_party/**/*.jar