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

Подстановка шаблона HOCON

HOCON поддерживает подстановку ${name} - ссылку на ранее определённый блок по имени. Если за ней идёт { ... переопределения ... }, переопределение мержится поверх подставленного значения. Именно за счёт этого работают общий _shared/templates.conf и локальные шаблоны в каждом меню.

# Описать один раз
prizeTile {
material: NETHER_STAR
lore: ["&7Click for a prize."]
click { actions { itemAdd { material: DIAMOND } } }
}
# Использовать много раз с переопределениями
items: [
${prizeTile} { slot: 2, name: "&aCommon Prize" }
${prizeTile} { slot: 4, name: "&6Rare Prize" }
${prizeTile} { slot: 6, name: "&dEpic Prize" }
]

Каждый экземпляр стартует как копия prizeTile (material, lore, click), затем блок переопределения добавляет slot и name. На выходе три разных предмета с общей структурой, отличающиеся только идентифицирующими полями.

${A} { B } делает глубокий мерж объектов - ключи из B перебивают ключи из A, но вложенные объекты мержатся рекурсивно. Если у A есть click.actions.sound: ${clickSound}, а у B есть click.actions.message: "Hi", в результате будет и то и другое: click.actions.{sound: ..., message: "Hi"}.

Для списков переопределение ЗАМЕНЯЕТ исходный список - не добавляет в конец. Чтобы расширить список lore:

${prizeTile} {
lore: ${prizeTile.lore} [ "&7Extra line" ]
}

Подстановка ${prizeTile.lore} подтягивает исходный массив lore, а [...] добавляет к нему новые записи. Этот паттерн в действии смотрите в примере Daily Kit.

  • Форма предмета повторяется 3+ раза - выносите в шаблон
  • Один обработчик клика используется в нескольких предметах - вынесите clickFoo {...} и подставляйте через click: ${clickFoo}
  • Стоимость или цена общая для отображаемого предмета и проверки правила - опишите один раз на уровне файла, ссылайтесь в обоих местах

Если что-то используется дважды и встроенный код по-прежнему читается понятно, оставьте как есть. Шаблоны окупаются, когда они уменьшают площадь правок при изменении повторяющейся логики.