Правила
Правило - это проверка перед выполнением действий. Результат проверки определяет, какие действия будут выполнены.
У правил простой формат. Пример:
rules { permission: "some.perm"}Правил можно указать сколько угодно, как у активаторов и действий. Каждое - с новой строки. Например:
rules { permission: "some.perm" group: "default" money: 3000}Здесь проверяем у игрока право some.perm, группу default и баланс 3000. Дальше пойдут действия - но только если игрок проходит все три правила сразу.
Все правила
Заголовок раздела «Все правила»| Имя | Тип данных | Описание |
|---|---|---|
| permission | Список строк | У игрока есть право |
| world | String | Игрок в указанном мире |
| gamemode | String | Игровой режим игрока совпадает |
| group | Список строк | Игрок в группе LuckPerms |
| money | Number или Object | У игрока минимум N валюты. В объектной форме { amount, provider } можно указать конкретного провайдера экономики - см. Выбор провайдера. |
| level | Number | У игрока минимум N уровней |
| xp | Number | У игрока минимум N опыта |
| health | Number | У игрока минимум N HP |
| foodLevel | Number | У игрока минимум N сытости |
| chance | Number | Случайная проверка с вероятностью N процентов |
| online | Number | На сервере минимум N игроков |
| playerIsOnline | String | Конкретный игрок онлайн |
| inventoryItems | Список объектов | У игрока в инвентаре есть указанные предметы |
| heldItem | Object | Предмет в основной руке совпадает |
| freeSlot | Number | В инвентаре есть свободный слот (или конкретный слот свободен) |
| freeSlotCount | Number | В инвентаре минимум N свободных слотов |
| existVar | String or Object | Глобальная переменная существует |
| existVarp | String | Персональная переменная существует |
| placedItem | Object | В drag-and-drop слоте лежит ожидаемый предмет |
| WorldGuard | ||
| region | Список строк | Игрок внутри региона WorldGuard |
| BungeeCord | ||
| bungeeOnline | Object | На сервере BungeeCord достаточно игроков |
| bungeeIsOnline | String | Сервер BungeeCord онлайн |
| Сложные правила | ||
| if | Список объектов | Сравнить плейсхолдер с текстом или числом |
| js | String | Выполнить JavaScript-выражение и взять его результат |
| Специальные правила | ||
| and | Список объектов | Логическая обёртка AND |
| or | Список объектов | Логическая обёртка OR |
| oneof | Список объектов | Останавливается на первом совпавшем правиле |
| playerScope | Object | Перепроверить правила для другого игрока |
Inventory items
Заголовок раздела «Inventory items»Проверяет, что у игрока в инвентаре есть нужные предметы. Это список объектов, где каждый объект - один предмет. Формат предмета такой же, как везде в AM. Пример:
inventoryItems: [ { material: CAKE amount: 5 }, { material: STONE amount: 2 }]Можно задать и одним объектом. Пример:
inventoryItems { material: CAKE amount: 5}Если добавить slot, правило будет смотреть конкретный слот или диапазон слотов:
inventoryItems { slot: 0 material: CAKE amount: 5}Правило вернёт true, если в слоте 0 у игрока минимум 5 тортов. Слот можно задавать и в других форматах, например:
inventoryItems { slot: "0-8" material: CAKE amount: 5}Тогда правило вернёт true, если в каждом из слотов 0, 1, 2, ..., 8 лежит минимум 5 тортов.
Held item
Заголовок раздела «Held item»Правило для проверки предмета в руке.
heldItem { material: CAKE amount: 5}Существование переменной
Заголовок раздела «Существование переменной»Проверка, есть ли переменная.
Для глобальных переменных:
existVar: "global_var_name"Для персональных переменных:
existVarp: "personal_var_name"У existVar остался устаревший формат - объект с именем переменной и (опционально) именем игрока-владельца.
existVar { player: "Peter" // Указывается, только если переменная персональная. Опциональный параметр name: "name" // Имя переменной. Обязательный параметр.}-
name- Имя переменной. -
player- [Опционально] Указывается, если нужно проверить персональную переменную.
По возможности используй краткий формат existVar.
BungeeCord online
Заголовок раздела «BungeeCord online»Проверка количества игроков на сервере BungeeCord. Пример:
bungeeOnline { server: "lobby" online: 20}-
server- Имя сервера BungeeCord. -
online- Требуемое количество игроков.
Правило “If”
Заголовок раздела «Правило “If”»Сравнивает данные - например, плейсхолдер из PAPI - с другими данными.
У правила if два формата: современный и устаревший. Бери современный, устаревший остался только ради совместимости со старыми меню.
Современный формат “If”
Заголовок раздела «Современный формат “If”»По духу похож на js, но работает в 8-10 раз быстрее. Пример:
if: "%player_name% == Notch"Сравниваем плейсхолдер со значением. Математики в современном if нет - только логика. Все логические операторы ниже.
| Оператор | Пример | Значение | Приоритет |
|---|---|---|---|
> | %player_level% > 5 | Больше | 3 |
< | %player_level% < 8 | Меньше | 3 |
>= | %player_level% >= 5 | Больше или равно | 3 |
<= | %player_level% <= 8 | Меньше или равно | 3 |
== | %player_level% == 9 | Равно | 2 |
!= | %player_level% != 9 | Не равно | 2 |
=== | %player_name% === nOtCh | Равно без учёта регистра | 2 |
!== | %player_name% !== nOtCh | Не равно без учёта регистра | 2 |
&& | %player_level% > 5 && %player_name% == Notch | И | 1 |
| || | %player_level% > 5 || %player_name% == Notch | Или | 0 |
В отличие от js, в if строки кавычками ('', "") оборачивать не надо. Доступны и круглые скобки () для группировки и повышения приоритета. Пример:
if: "(%player_lvl% == 5 || %player_lvl% == 10) && (%player_name% == Notch || %player_name% == Nanit)"Выражение вернёт true, если у игрока уровень 5 или 10 И ник “Notch” или “Nanit”.
Если нужна математика или более сложные условия - бери js. Если хватает обычной логики - бери современный if ради скорости.
Устаревший формат “If”
Заголовок раздела «Устаревший формат “If”»Пример:
if { param: "%player_name%" equals: [ "Notch", "DeadMouse" ] equalsIgnoreCase: [ "notch", "deadmouse" ] contains: [ "dead", "tch" ] less: 6 more: 2}Параметр param обязательный. Все остальные опциональны.
-
param- Сравниваемый параметр (%player_name%- плейсхолдер, который заменяется на имя игрока, открывшего меню). -
equals- сравнить со списком строк, с учётом регистра. -
equalsIgnoreCase- сравнить со списком строк, без учёта регистра. -
contains- содержит ли параметр одну из подстрок. -
less- меньше ли параметр указанного числа. Только для числовых параметров. -
more- больше ли параметр указанного числа. Только для числовых параметров.
JavaScript
Заголовок раздела «JavaScript»Плагин умеет выполнять JS-код. Код должен вернуть true или false; всё остальное плагин посчитает за false. По возможностям js шире, чем if, так что им можно его заменять - но интерпретация JS заметно медленнее.
В js работают плейсхолдеры - можно сравнивать и манипулировать ими через JS-синтаксис. Пример:
rules { js: "'%player_name%'.length < 5"}Правила в области другого игрока
Заголовок раздела «Правила в области другого игрока»Если правила нужно проверять не на том, кто открыл меню, а на ком-то ещё - есть обёртка playerScope. Пример для правил отображения предмета:
{ slot: 0 material: cake rules { playerScope { name: "%player_name_placeholder%" rules { permission: "perm.name" } } }}Правила внутри rules будут проверены на игроке, найденном по имени из поля name. Здесь предмет покажется только если у этого игрока (найденного по плейсхолдеру) есть право perm.name.