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

Инвентарный крафт

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

  • Правило inventoryItems для проверки “есть ли у игрока эти предметы”
  • itemRemove для расхода подходящих предметов
  • itemAdd для выдачи результата крафта
  • Объявление рецептов как именованных блоков на уровне файла, на которые ссылаются через подстановку ${name}

Каждый рецепт описывает output (полученный предмет) и список requirements (ингредиенты):

helmetRecipe {
output {
material: LEATHER_HELMET
name: "&aHunter's Hat"
enchantments { durability: 2 }
}
requirements: [
{ material: LEATHER, count: 5 }
]
}

Блок click ссылается на оба:

click {
rules { inventoryItems: ${helmetRecipe.requirements} }
actions {
itemRemove: ${helmetRecipe.requirements}
itemAdd: ${helmetRecipe.output}
...
}
denyActions: ${denyNotEnoughItems}
}

Этот паттерн держит данные рецепта в одном месте: правило, расход и результат - всё ссылается на один и тот же блок helmetRecipe. Добавить или поправить рецепт значит править один блок, а не три.

Два разных паттерна “крафта” в AbstractMenus:

  • Инвентарный крафт (этот пример): предметы остаются в обычном инвентаре игрока. Правило inventoryItems смотрит в инвентарь, itemRemove списывает оттуда. Игрок ничего не перемещает руками.
  • Drag-and-drop крафт: в меню есть слоты, в которые можно перетаскивать. Игрок физически перетягивает предметы. Использует действие placeItem, правило placedItem и поле draggable у предметов. Альтернативный паттерн смотрите в документации drag-and-drop.

Этот сниппет показывает паттерн инвентарного крафта, потому что он хорошо сочетается с магазинными интерфейсами и не требует кастомной настройки слотов.

Опишите новый блок xxxRecipe на уровне файла с output {} и requirements: [...]. Добавьте предмет в список items, ссылающийся на него по той же схеме, что и шлем. Рецепт упоминается в трёх местах: предмет в отображении, правило, действия. Если везде стоит ${xxxRecipe.something}, рецепты не разъедутся.

После установки набора примеров:

  1. Положите бандл в plugins/AbstractMenus/menus/example/.
  2. /am reload.
  3. Получите 5 кожи в инвентарь.
  4. Введите в игре /ame_craft.
  5. Кликните по рецепту шлема. Кожа расходуется, шапка появляется.