Drag and drop
Drag-and-drop (дальше - DnD) позволяет класть и забирать предметы из инвентаря меню. На эти события меню может реагировать - менять внешний вид или поведение.
Включение DnD
Заголовок раздела «Включение DnD»Чтобы игроки могли класть и забирать предметы, добавь в корень меню параметр draggable:
title: "Меню"size: 3draggable: 11items: [ // ...]Параметр принимает тот же формат слотов, что и обычные предметы: индекс, диапазон или матрицу. Здесь мы взяли один слот. Теперь предмет можно положить в слот 11 или забрать из него - событие не отменится.
Слушатели DnD-событий
Заголовок раздела «Слушатели DnD-событий»В корень меню можно добавить три блока действий для DnD:
-
onPlaceItem- срабатывает, когда предмет положили в draggable-слот. -
onTakeItem- срабатывает, когда предмет забрали из draggable-слота. -
onDragItem- срабатывает на любое из событий выше.
Например, нужно ловить момент, когда игрок что-то положил в меню. Берём onPlaceItem:
title: "Меню"size: 3draggable: 11onPlaceItem { message: "Ты положил предмет в слот 11"}items: [ // ...]Как только игрок положит предмет в draggable-слот, ему прилетит сообщение.
События срабатывают на любое изменение предмета в draggable-слоте, даже если игрок просто докинул ещё единиц.
onDragItem пригодится, когда нужно проверять draggable-слот при каждом движении в меню.
DnD-плейсхолдеры
Заголовок раздела «DnD-плейсхолдеры»Для проверки свойств перетаскиваемого предмета и связанных данных есть специальные плейсхолдеры. Под капотом они тянут информацию через экстрактор предмета.
Плейсхолдеры разбиты по типам событий - описаны ниже. С ними удобно поиграться вручную, чтобы понять, что они возвращают.
Для положенного предмета
Заголовок раздела «Для положенного предмета»Префикс placed_, данные о последнем положенном предмете. Например:
%placed_item_type%- тип положенного предмета.%placed_item_amount%- его количество.
И так далее - полный список см. в экстракторе предмета.
Отдельно есть плейсхолдер placed_slot - индекс слота, в который положили предмет.
Для забранного предмета
Заголовок раздела «Для забранного предмета»Префикс taken_, данные о последнем забранном предмете. Например:
%taken_item_type%- тип забранного предмета.%taken_item_amount%- его количество.
И отдельный taken_slot - индекс слота, из которого забрали предмет.
Для изменённого предмета
Заголовок раздела «Для изменённого предмета»Префикс changed_, данные об итоговом предмете в слоте после действия. Например, в слоте уже лежало 32 камня, игрок докинул ещё 32 - в итоге 64. Это значение и вернёт changed_. А placed_ в той же ситуации вернёт 32 - то, что только что положили.
Пример:
%changed_item_type%- тип итогового предмета.%changed_item_amount%- его количество.
Правило placedItem
Заголовок раздела «Правило placedItem»Специальное правило для DnD-меню. Проверяет итоговый предмет в draggable-слоте после действия. Пример:
title: "Меню"size: 3draggable: 11onDragItem { rules { placedItem { slot: 11 material: COBBLESTONE count: 32 } } actions { message: "Успех" }}items: [ // ...]Здесь при каждом изменении слота идёт проверка. Если в слоте лежит хотя бы 32 единицы COBBLESTONE, игроку прилетает Успех.
Специальные действия
Заголовок раздела «Специальные действия»Действие placeItem
Заголовок раздела «Действие placeItem»Похоже на setButton, но кладёт предмет, который игрок может забрать или изменить через DnD. Пример:
title: "Меню"size: 1activators { command: "menu"}draggable: [ // Слоты 2 и 6 "--x---x--",]onDragItem { rules { placedItem { slot: 2 material: COBBLESTONE count: 32 } } actions { placeItem { slot: 6 material: COAL_ORE count: "%changed_item_amount%" } } denyActions { removePlaced: 6 }}items: [ { slot: [ "xx-xxx-xx" ] material: BLACK_STAINED_GLASS_PANE name: " " }]Если игрок положил в слот 2 хотя бы 32 булыжника, в слоте 6 появляется угольная руда. Иначе - убрать ранее положенный предмет из слота 6, если он там был.
Действие removePlaced
Заголовок раздела «Действие removePlaced»Убирает положенный игроком предмет из слота. Например, чтобы вычистить слот 5:
removePlaced: 5Это полностью убирает предмет из инвентаря.
Если нужно срезать только часть стека:
removePlaced { slot: 5 count: 16}Если в слоте лежит больше 16, плагин уменьшит стек на 16. Иначе предмет уберётся целиком.