SashegDev ecb741140b feat(voidworld): void world rules, adventure mode and basalt ambience
Восьмой этап: поведение мира пустоты. Заход в пустоту пока не сделан, но все
правила поведения готовы и включаются сразу, как только игрок туда попадёт.

Что сделано:
- режим приключений на входе и возврат прежнего на выходе. Слушается
  PlayerChangedWorldEvent, а не проверка каждый тик: состояние меняется только
  при смене мира, и событие об этом сообщает.
- кровать в пустоте взрывается. Тип измерения уже запрещает сон через
  bed_works, но игрок всё равно получает сообщение об успешном сне и ждёт
  пробуждения — доводим до взрыва.
- якорь возвражения взрывается.
- ломать блоки нельзя.
- эмбиент базальтовых дельт: AMBIENT_BASALT_DELTAS_LOOP и ADDITIONS, плюс
  пепельный дым и белые языки пламени. Одна задача на сервер, не на игрока.

Три ошибки поймал компилятор, а не я, и все три были про выдуманные имена:

1. PlayerRespawnAnchorEvent в этом API НЕ существует. Есть только блочные
   данные org.bukkit.block.data.type.RespawnAnchor. Якорь ловится обычным
   PlayerInteractEvent со сверкой типа данных блока.

2. У PlayerChangedWorldEvent в Paper есть только getFrom(), getTo() нет.
   Но к моменту события игрок уже в новом мире, поэтому цель берётся из
   p.getWorld() — это надёжнее, чем отсутствующий геттер.

3. PlayerBedEnterEvent#getBed() возвращает Block, а не Bed. Приводим с
   проверкой: при неудачном входе в кровать блок может оказаться чем угодно.

Имена enum проверял по jar, а не по памяти: звук называется
AMBIENT_BASALT_DELTAS_ADDITIONS, со строчной s в DELTAS. Варианта без неё
в enum нет.

Плюс в лог при старте печатается имя найденного измерения. Оно оказалось
world_delta_void_void_world, а не delta_void:void_world, как я бы угадал:
сервер добавляет префикс папки мира и санитизирует путь. Угадывать имя
измерения в коде было бы верным способом не заработать.
2026-10-17 15:47:30 +00:00
S
Description
BlackKnife plugin - DeltaMine
611 KiB
Languages
Java 100%