Магазин с проверкой ранга
Многие реальные магазины показывают разные цены разным рангам - 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 для проверки рангов
Заголовок раздела «Почему это лучше if для проверки рангов»Правило if могло бы выразить ту же логику, но добавило бы две проблемы:
- Сам отображаемый предмет не менялся бы - менялось бы только действие на клик. Для визуального различия всё равно нужны два предмета.
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} } # фолбэк - без правилПорядок важен: ранг с самым высоким приоритетом - первым. Побеждает первый подходящий вариант.