Перейти к содержимому

Управлять окружением

Сделать панель управления подтверждёнными параметрами окружения.

Сделаем небольшое окно для настройки Minecraft-окружения: времени суток, фазы Луны, гаммы и дальности. Все изменения выполняются через editorAPI.sky.

Скачать полный пример environment.js. После установки нажмите кнопку с иконкой солнца на панели инструментов. Открытие окна ничего не меняет в сцене; изменения применяются по кнопке.

Параметры панели

Поле Метод Значения в примере
Время суток setDayTime(ticks) 0-23999 тиков внутри суток
Фаза Луны setMoonPhase(index) Индекс из getMoonPhases()
Гамма setGamma(value) 0-1
Дальность setRenderDistance(chunks) 2-250 чанков

Время меняется только при действии пользователя. Здесь нет таймера, который автоматически ведёт сутки. tick(delta) существует для пошагового продвижения, но запуск и остановка такого цикла были бы ответственностью плагина.

Это параметры Minecraft-окружения редактора. Панель не настраивает сервер Minecraft, не записывает игровые команды и не управляет гаммой постобработки RT-изображения.

Подтвердить методы

const sky = window.editorAPI.sky;
const state = sky.getState();
if (!state) throw new Error('Окружение недоступно.');
console.log(state.dayTime, state.moonPhaseName, state.gamma);
console.log(sky.getMoonPhases());

getState() возвращает текущее состояние, включая active, owners, totalTicks, dayTime, moonPhase, moonPhaseName, gamma и renderDistanceChunks. Если подсистема отсутствует, возвращается null; список фаз в этом случае пустой.

setTime(ticks) устанавливает общее время с учётом дней. setDayTime(ticks) сохраняет текущий день и меняет положение внутри суток, нормализуя значение по циклу 24000. Для возврата к снимку состояния используйте totalTicks, а не только dayTime: номер дня определяет фазу Луны.

setMoonPhase принимает индекс либо точное имя из getMoonPhases(). Внутри метод переставляет день текущего лунного цикла, сохраняя время суток. setGamma ограничивает число диапазоном 0-1, дальность ограничивается 2-250. В текущем окружении граница тумана рассчитывается как min(chunks * 16, 512); это не дальность загрузки игровых чанков.

Состав состояния и остальные операции: справочник API окружения.

Панель и значения

Пример создаёт стандартное окно через createWindow, заполняет поля из getState() и проверяет их встроенной валидацией HTML-формы. У него есть три действия:

  • «Применить и включить» отправляет настройки и включает окружение от имени API.
  • «Снять включение через API» снимает только включение от editor-api.
  • «Восстановить значения при открытии» возвращает снимок, сделанный при открытии этого окна.
const initial = window.editorAPI.sky.getState();
const panel = window.editorAPI.createWindow(
'Учебное окружение', 'my-plugin.environment', 'icon-sun',
520, 470, 320, 380
);
// Создайте input/select и добавьте их в panel.container.

Как организовать своё окно и избежать повторных экземпляров: добавить кнопку и собственное окно.

Применение и состояние

Параметр {render: false} позволяет последовательно задать несколько значений без отдельного рендера после каждого вызова. Последний enable() обновляет изображение:

const sky = window.editorAPI.sky;
sky.setDayTime(18000, {render: false});
sky.setMoonPhase(0, {render: false});
sky.setGamma(0.5, {render: false});
sky.setRenderDistance(16, {render: false});
sky.enable();

Если активация уже выполнена и нужно только обновить время и освещение, используйте refresh(). Значения также можно менять при выключенном окружении; это само по себе не означает его включения.

У окружения несколько владельцев. Например, оно может быть нужно режиму погружения, Animator или Live Link. sky.disable() удаляет владельца editor-api, но окружение может остаться активным из-за другого владельца. Кроме того, все плагины, вызывающие публичный sky.enable(), используют одно имя editor-api, а не отдельное имя каждого плагина. Не обещайте независимый переключатель для каждого расширения.

Полный пример восстанавливает время, гамму, дальность и прежнее участие editor-api. Это возврат значений из снимка, а не отмена через историю. Если за это время пользователь или другой плагин поменял окружение, восстановление заменит и эти более новые значения. Поэтому действие оставлено явной кнопкой, а закрытие окна не меняет окружение.

Проверка границ

  1. Откройте окно и убедитесь, что поля отражают текущее состояние.
  2. Примените полдень и ночь, затем смените фазу Луны. После смены фазы время внутри суток должно сохраниться.
  3. Проверьте гамму 0 и 1, а также дальность 2 и 32 чанка. Дальнейшее повышение дальности не обязано отодвигать туман за предел 512 блоков.
  4. Нажмите восстановление и сравните поля с исходными. Для чистой проверки приостановите другие механизмы, которые обновляют время.
  5. Снимите включение через API и проверьте active/owners. Оставшийся владелец объясняет, почему окружение всё ещё отображается.

Вызовы этого API не создают запись Undo и сами не сериализуют настройки в проект. Если плагину нужно восстанавливать свои значения после перезапуска, продумайте отдельное хранение и явный момент применения. Не связывайте эти настройки автоматически с экспортом, RT или состоянием подключённого игрового мира.

Методы и диапазоны сверены с publicFunctions.js и MinecraftSky.js. В примере нет обращения к внутреннему editor и нет таймеров, продолжающих менять сцену после закрытия окна.