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

Drag and drop

Автор меню

Drag-and-drop (дальше - DnD) позволяет класть и забирать предметы из инвентаря меню. На эти события меню может реагировать - менять внешний вид или поведение.

Чтобы игроки могли класть и забирать предметы, добавь в корень меню параметр draggable:

title: "Меню"
size: 3
draggable: 11
items: [
// ...
]

Параметр принимает тот же формат слотов, что и обычные предметы: индекс, диапазон или матрицу. Здесь мы взяли один слот. Теперь предмет можно положить в слот 11 или забрать из него - событие не отменится.

В корень меню можно добавить три блока действий для DnD:

  • onPlaceItem - срабатывает, когда предмет положили в draggable-слот.

  • onTakeItem - срабатывает, когда предмет забрали из draggable-слота.

  • onDragItem - срабатывает на любое из событий выше.

Например, нужно ловить момент, когда игрок что-то положил в меню. Берём onPlaceItem:

title: "Меню"
size: 3
draggable: 11
onPlaceItem {
message: "Ты положил предмет в слот 11"
}
items: [
// ...
]

Как только игрок положит предмет в draggable-слот, ему прилетит сообщение.

События срабатывают на любое изменение предмета в draggable-слоте, даже если игрок просто докинул ещё единиц.

onDragItem пригодится, когда нужно проверять draggable-слот при каждом движении в меню.

Для проверки свойств перетаскиваемого предмета и связанных данных есть специальные плейсхолдеры. Под капотом они тянут информацию через экстрактор предмета.

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

Префикс 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% - его количество.

Специальное правило для DnD-меню. Проверяет итоговый предмет в draggable-слоте после действия. Пример:

title: "Меню"
size: 3
draggable: 11
onDragItem {
rules {
placedItem {
slot: 11
material: COBBLESTONE
count: 32
}
}
actions {
message: "Успех"
}
}
items: [
// ...
]

Здесь при каждом изменении слота идёт проверка. Если в слоте лежит хотя бы 32 единицы COBBLESTONE, игроку прилетает Успех.

Похоже на setButton, но кладёт предмет, который игрок может забрать или изменить через DnD. Пример:

title: "Меню"
size: 1
activators {
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, если он там был.

Убирает положенный игроком предмет из слота. Например, чтобы вычистить слот 5:

removePlaced: 5

Это полностью убирает предмет из инвентаря.

Если нужно срезать только часть стека:

removePlaced {
slot: 5
count: 16
}

Если в слоте лежит больше 16, плагин уменьшит стек на 16. Иначе предмет уберётся целиком.