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

Магазин с проверкой ранга

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

  • Паттерн с двумя предметами в одном слоте и правилом на право
  • Цены по рангам без сложных правил if
  • Переиспользуемые обработчики кликов через подстановки ${discountClick} / ${regularClick}
  • Как взаимодействуют короткое замыкание правил и порядок объявления слотов

В одном слоте объявлены два предмета:

# Вариант A: показывается только VIP
{ slot: 13, name: "Golden Apple (VIP price)", rules { permission: "...vip" }, click: ${discountClick} }
# Вариант B: фолбэк для всех остальных
{ slot: 13, name: "Golden Apple", click: ${regularClick} }

Когда меню рендерится, плагин проходит по списку предметов. Для слота 13 он находит вариант A, проверяет его правила и:

  • Использует A, если правило прошло (VIP видит вариант со скидкой)
  • Пропускает A и ищет следующее объявление для слота 13. Находит B. У B правил нет. Рендерится B.

Это БОЕВОЙ паттерн с реальных магазинов. Масштабируется на много рангов (4-уровневые донат-магазины и т.д.) - по одному варианту на ранг, в порядке приоритета, с самым высоким рангом в правиле первым.

Правило if могло бы выразить ту же логику, но добавило бы две проблемы:

  1. Сам отображаемый предмет не менялся бы - менялось бы только действие на клик. Для визуального различия всё равно нужны два предмета.
  2. if парсится как выражение на каждом рендере. Два предмета по правам обходятся дешевле.

if нужен, когда сравниваете числовые/строковые значения, которые нельзя выразить встроенным правилом (математика по уровню, кастомные значения переменных). Для “игрок в ранге X” - паттерн с двумя предметами и правом.

Добавляйте варианты в порядке приоритета. Mythic > Donor > VIP > обычный:

{ slot: 13, ..., rules { permission: "myplugin.mythic" }, click: ${mythicClick} }
{ slot: 13, ..., rules { permission: "myplugin.donor" }, click: ${donorClick} }
{ slot: 13, ..., rules { permission: "myplugin.vip" }, click: ${vipClick} }
{ slot: 13, ..., click: ${regularClick} } # фолбэк - без правил

Порядок важен: ранг с самым высоким приоритетом - первым. Побеждает первый подходящий вариант.