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

Энхансер предметов

Меню энхансера с фиксированной таблицей: камень становится угольной рудой, яблоко - золотым яблоком, деревянный меч - алмазным мечом, деревянный топор - алмазным топором. Построено вокруг правила oneof, которое короткозамыкается на первом совпадении - идеально подходит под “переключиться по типу предмета и сделать своё”.

  • Тип правила oneof и его семантику “первое совпадение выигрывает”
  • Действия per-ветке внутри записей oneof (у каждой записи свой actions {})
  • Drag-and-drop слоты и правило placedItem для матчинга входа
  • Сборку drag-and-drop примитивов (placeItem, removePlaced, setButton) в пайплайн трансформации
  • Шаблоны для переиспользуемых правил и действий (${inputSlotRule}, ${outputAction})

Этот пример лежит в state-and-vars, потому что drag-and-drop сама по себе - форма состояния меню: предметы, физически лежащие в слотах 2 и 6, это сессионные “переменные” меню. setVar/setVarp тут не используются, но концептуальный паттерн (читать состояние слота, ветвиться по нему, мутировать его) тот же.

oneof - логическая обёртка-правило, принимающая список записей. Она проходит список сверху вниз и останавливается на первой, чьё собственное правило совпадает. Блок actions {} совпавшей записи и выполняется.

oneof: [
{ placedItem: { slot: 2, material: STONE }, actions { placeItem: { ..., material: COAL_ORE } } }
{ placedItem: { slot: 2, material: APPLE }, actions { placeItem: { ..., material: GOLDEN_APPLE } } }
...
]

Если ни одна запись не совпала, весь oneof возвращает false. Внешний click тогда выполняет denyActions вместо успешной ветки.

Чище, чем вложенные if/and/or, для switch-подобной логики.

Допишите в список oneof внутри enhanceRules:

{ placedItem: ${inputSlotRule} { material: COAL }
actions { placeItem: ${outputAction} { material: DIAMOND } } }

Подстановки ${inputSlotRule} и ${outputAction} держат номера слотов в одном месте - если переразметите меню, поменяются только два якорных блока, а не каждая запись рецепта.

После установки example pack:

  1. Положите бандл в plugins/AbstractMenus/menus/example/.
  2. /am reload.
  3. Введите /ame_enhancer в игре.
  4. Перетащите блок камня в левый слот.
  5. Кликните “Улучшить!”. В правом слоте появится угольная руда.