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

Рулетка

Открываете меню, и иконка предмета быстро перебирает алмаз -> изумруд -> золото -> алмаз…, постепенно замедляясь. Когда всё останавливается, игрок получает случайную награду (или не получает ничего). Показывает формат AnimatedMenu с frames, эффект замедления через рост delay и хук onAnimEnd для логики “что происходит после анимации”.

  • Блок frames как альтернатива items для анимированных меню
  • delay: (в тиках) на каждом кадре и clear: false для сохранения статичных предметов
  • Совместная работа статичного блока items: и frames
  • Хук onAnimEnd для запуска действий по завершении анимации
  • randActions для выбора одного из N исходов случайно
  • Темп анимации - быстро в начале, медленно к концу

Если в файле меню в корне есть блок frames:, плагин считает меню анимированным. frames заменяет обычный однопроходный рендеринг items на последовательность кадров, проигрываемых по порядку.

У каждого кадра есть:

  • delay: задержка перед этим кадром в тиках (по умолчанию 20 = 1 секунда)
  • clear: очищать ли инвентарь перед рендером items этого кадра (по умолчанию true)
  • items: предметы, которые добавляются в этом кадре
  • Опционально: rules, onStart, onEnd

Статичный блок items: в корне работает вместе с кадрами. Если у кадров clear: false, эти статичные предметы сохраняются - именно то, что нужно для рамок и кнопки закрытия.

Рулетка ощущается правильно, когда замедляется к концу. Делаем это через постепенно растущие значения delay::

frames: [
{ delay: 2, ... } # 0.1s - очень быстро
{ delay: 2, ... }
{ delay: 2, ... }
{ delay: 2, ... }
{ delay: 4, ... } # начинает замедляться
{ delay: 6, ... }
{ delay: 10, ... }
{ delay: 20, ... } # 1s - драматичная пауза на финальном кадре
]

Всего: примерно 2.4 секунды. Финальный кадр с NETHER_STAR держится целую секунду, пока onAnimEnd выдаёт приз.

onAnimEnd запускается после того, как закончится последний кадр. Внутри блок randActions, который случайно выбирает один из четырёх исходов:

onAnimEnd {
randActions: [
{ sound: ${successSound}, itemAdd { material: DIAMOND }, message: "..." }
{ sound: ${successSound}, itemAdd { material: EMERALD, count: 2 }, message: "..." }
...
{ sound: ${failSound}, message: "&7В следующий раз повезёт." }
]
}

У каждой записи свой блок действий. Один выбирается равномерно случайно. Исход “не выиграл” - просто звук и сообщение, без itemAdd.

Чтобы взвешивать исходы по-разному, повторяйте их. Запись, встречающаяся дважды, имеет вдвое больший шанс. Чтобы изменить продолжительность вращения, правьте значения delay: - общее время равно сумме всех задержек.

Чтобы сменить, какие предметы появляются во время вращения, замените material: в items каждого кадра. Они декоративные - реальный приз идёт из onAnimEnd, а не “куда попадёт вращение”.

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

  1. Положите бандл в plugins/AbstractMenus/menus/example/.
  2. /am reload.
  3. Введите /ame_roulette в игре. Смотрите на вращение, узнайте, что выпало.