RE:NODE

Minecraft15 мин чтения

LuckPerms на сервере Minecraft: группы, ноды и контексты

Как настроить группы LuckPerms, наследование, контексты для отдельных миров и веб-редактор на сервере Paper, и какие ноды прав вам действительно пригодятся.

0 прочтений

Статус оператора - это выключатель с одним положением: можно всё, включая остановку сервера и правку мира. LuckPerms нужен, чтобы им больше не пользоваться. Загрузите jar, снимите op со всех, соберите три-четыре группы, и с этого момента доступ превращается в список, который можно прочитать, менять на работающем сервере и выдать модератору, не отдавая заодно /stop. Установка занимает пять минут. Выходные уходят на всё остальное: как взаимодействуют наследование и вес, что такое нода прав на самом деле, как контексты заставляют одну и ту же группу вести себя иначе в творческом мире и как выяснить, почему право, которое вы точно выдали, не срабатывает. Об этом и пойдёт речь.

Установка LuckPerms и выбор хранилища#

LuckPerms - это один плагин со сборками под несколько платформ, и они не взаимозаменяемы. Серверу Paper или Spigot нужна сборка Bukkit; прокси Velocity или BungeeCord - своя. Возьмите jar на luckperms.net, положите его в plugins/ и нормально перезапустите сервер. Не используйте для этого /reload, как и для установки любого другого плагина: он загружает всё наполовину и порождает ошибки, похожие на баги самого плагина.

Линейка Minecraft на RE:NODE работает на Paper с уже установленной подходящей версией Java, так что вам нужна именно сборка Bukkit. Плагины загружаете вы сами, через файловый менеджер или по SFTP: установщика плагинов и отобранного списка нет, а значит, ничто и не заблокировано. Перетащите jar в plugins/ в файловом менеджере, перезапустите сервер из консоли и следите за строками запуска.

При первом запуске создаются plugins/LuckPerms/config.yml и база данных. По умолчанию это H2, один файл внутри папки плагина, и для одного сервера этого вполне достаточно. Выбор становится важен, когда серверов несколько или когда данные нужно читать снаружи.

storage-methodЧто этоКогда использовать
h2По умолчанию. Один файл в папке плагинаОдин сервер, менять незачем
sqliteЕщё одна база в одном файлеТо же самое
mysql, mariadb, postgresqlУдалённый SQL-серверНесколько серверов с общим набором прав
mongodbУдалённая документная базаТо же, если она у вас уже есть
yaml, json, hocon, tomlПлоские файлы, которые можно открыть и правитьВы хотите хранить данные в git и готовы к меньшей скорости

Плоские файлы соблазнительны тем, что их можно прочитать. Именно их и портят: правят users/<uuid>.yml при работающем сервере, а потом теряют правку при следующей записи. Если нужна читаемая копия, оставьте базу и выполните /lp export backup: эта команда записывает в папку плагина сжатый снимок всех групп, пользователей и треков, а /lp import backup возвращает его обратно. Это стоит делать перед любым крупным изменением прав.

/lp info показывает способ хранения, службу обмена сообщениями и версию плагина. Это первая команда, которую стоит запустить, когда что-то выглядит неправильно, и та, которую нужно приложить, когда просите помощи.

Группы, вес и наследование#

У LuckPerms ровно одна обязательная группа - default. Каждый игрок состоит в ней, пока вы его не переведёте, и удалить её нельзя. Всё остальное вы строите сами.

code
$ lp creategroup builder$ lp creategroup moderator$ lp creategroup admin$ lp group builder setweight 10$ lp group moderator setweight 50$ lp group admin setweight 100$ lp group moderator parent add builder$ lp group admin parent add moderator

Здесь работают два разных механизма, и путаница между ними - самый частый источник недоразумений.

Родители - это наследование. parent add даёт группе всё, что есть у её родителя. Внутри это хранится как нода прав group.builder, поэтому вы увидите её в экспорте, и поэтому выдача игроку group.vip - то же самое, что включение его в группу VIP. Наследование транзитивно, так что admin в примере выше получает и всё, что есть у builder.

Вес - это разрешение конфликтов. Когда две группы игрока задают одну и ту же ноду с разными значениями, побеждает группа с большим весом. Вес также определяет, какой префикс отображается и в каком порядке группы идут в /lp listgroups. Сам по себе вес ничего не даёт: тяжёлая группа без нод ничего не разрешает.

Порядок разрешения, когда групп больше пары, стоит знать точно:

  1. Ноды, заданные прямо у пользователя, перевешивают всё, что унаследовано от группы.
  2. Среди групп побеждает та, у которой вес выше.
  3. Из двух значений на одном уровне false побеждает true: отрицание - это осознанное заявление, и LuckPerms относится к нему именно так.
  4. Подстановочная нода менее конкретна, чем точная, поэтому essentials.home со значением false по-прежнему действует на того, у кого есть essentials.*.

Последнее правило и есть способ построить группу, у которой есть почти всё: дайте ей подстановочную ноду, а затем отрицайте несколько ненужных.

code
$ lp group moderator permission set essentials.* true$ lp group moderator permission set essentials.gamemode false$ lp group moderator permission set essentials.give false

Осторожнее с голой *. LuckPerms разрешит её против всех прав, которые зарегистрировал любой плагин, включая ноды, которых вы никогда не читали, и ноды, которые появятся с очередным обновлением плагина. Оставьте её для группы с единственным участником - вами, и даже тогда лучше перечислять конкретные подстановочные ноды плагинов.

Команды, которые вы действительно будете вводить#

Команда - /lp, а /luckperms, /perm, /perms и /permission тоже работают. В консоли панели ведущего слэша нет, потому что консоль - это стандартный ввод сервера, а не окно чата; так же и со всеми остальными командами, о чём написано в шпаргалке по командам сервера Minecraft.

КомандаЧто делает
lp creategroup <name>Создаёт группу
lp listgroupsВсе группы с весом и родителями
lp group <g> permission set <node> [true/false]Выдаёт или отрицает ноду
lp group <g> permission unset <node>Полностью удаляет ноду
lp group <g> permission infoПоказывает собственные ноды группы
lp group <g> parent add <parent>Наследование
lp group <g> setweight <n>Приоритет при конфликте
lp group <g> listmembersКто в ней состоит, пользователи и группы
lp user <name> infoГруппы, основная группа, префикс, meta
lp user <name> parent add <g>Добавляет игроку группу
lp user <name> parent set <g>Заменяет все его группы этой
lp user <name> permission check <node>Результат и откуда он взялся
lp user <name> clearСбрасывает все ноды и родителей до default
lp search <node>Все пользователи и группы, у которых есть эта нода
lp editorОткрывает веб-редактор
lp verbose on <filter>Записывает проверки прав в реальном времени
lp export <file> / lp import <file>Снимок и восстановление

Обратите внимание на разницу между unset и set false. unset убирает ваше утверждение и отдаёт решение наследованию; set false - это активный запрет, который перекрывает группы с меньшим весом. Когда вы хотите, чтобы у группы просто чего-то не было, почти всегда вам нужен именно unset.

После этих команд не нужно ни перезапускать сервер, ни перезагружать плагины. LuckPerms применяет изменения сразу, а права игрока пересчитываются на месте. Исключение - плагины, которые кэшируют проверку права при входе (таких ещё несколько): им помогает повторный вход.

Ноды прав и где их искать#

Нода - это строка в нижнем регистре, разделённая точками, которую придумал плагин. essentials.home - не стандарт: она существует, потому что её объявил EssentialsX. Поэтому единого списка нет, а честный ответ на вопрос «какая нода для X» звучит так: прочитайте документацию плагина или откройте его jar.

Каждый плагин для Bukkit несёт внутри jar файл plugin.yml, где объявлены его команды и права с их значениями по умолчанию. Откройте jar любым архиватором (файловый менеджер панели распаковывает архив на месте, так что ничего скачивать не придётся) и прочитайте plugin.yml. Этот файл - авторитетный список для именно вашей версии, чего о документации часто не скажешь.

Ноды, которые встречаются почти на любом сервере:

НодаПлагинЧто разрешает
essentials.home, essentials.sethomeEssentialsXСистему домов
essentials.sethome.multiple.vipEssentialsXБольше домов, привязано к записи в конфиге
essentials.tpa, essentials.tpacceptEssentialsXЗапросы на телепортацию между игроками
essentials.kit.toolsEssentialsXОдин именованный набор
worldedit.*WorldEditВесь WorldEdit. Не раздавайте его без нужды
worldguard.region.claimWorldGuardЗаявку на регион
coreprotect.inspect, coreprotect.lookupCoreProtectЧтение журнала блоков
coreprotect.rollbackCoreProtectОткат. Только для модераторов
luckperms.editorLuckPermsОткрытие веб-редактора
minecraft.command.gamemodePaperВанильную команду /gamemode

Последняя строка показывает шаблон для ванильных команд на сервере, производном от Bukkit: minecraft.command.<name>. minecraft.command.tp, minecraft.command.give, minecraft.command.time и остальные существуют, а значит, /time set day можно выдать, не выдавая ничего больше.

Есть одна оговорка, которая обесценивает всё сказанное, если её пропустить. В Bukkit оператору выдаётся каждое право, у которого объявленное значение по умолчанию - op, и происходит это ниже уровня LuckPerms. Аккуратно выставленное вами отрицание на опнутого игрока не подействует. Снимите op со всех, включая себя, и вместо этого выдайте группе admin право luckperms.* плюс то, что нужно. Границы этого поведения определяют три ключа в plugins/LuckPerms/config.yml: enable-ops решает, учитывается ли ванильная система op вообще, commands-allow-op - может ли оператор выполнять команды LuckPerms, а auto-op (по умолчанию выключен) заставляет LuckPerms самому выдавать и отзывать статус оператора по праву luckperms.autoop. На сервере с нормальным деревом групп аккуратный финал - enable-ops: false, но сначала настройте собственную группу, иначе заблокируете себя и будете исправлять всё из консоли.

Контексты: права для отдельных миров и серверов#

Контекст - это условие, привязанное к ноде. LuckPerms поставляется с двумя, world и server, а плагины могут добавлять свои.

code
$ lp group builder permission set worldedit.* true world=creative$ lp group default permission set essentials.tpa false server=survival$ lp user Steve parent add vip server=lobby

world - это имя папки мира: world, world_nether, world_the_end или как назвал его ваш плагин для нескольких миров. Работает сразу.

server не работает сразу, и на этом попадаются все. Контексты по server сопоставляются со значением server: в config.yml, которое по умолчанию равно global. Пока вы не измените его на каждом сервере (server: survival на одном, server: lobby на другом), ни один написанный вами контекст server= просто не совпадёт. Задайте его до того, как напишете первый контекст, и помните, что к названию сервера в MOTD оно не имеет отношения.

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

  • include-global - применяются ли ноды без контекста везде. Оставьте true, если только не хотите, чтобы каждое право было задано явно с областью действия.
  • include-global-world - тот же вопрос для контекстов мира.
  • apply-global-groups и apply-global-world-groups - те же два вопроса, но о членстве в группах, а не об отдельных нодах.

Трогать их стоит в сети, где ранг должен существовать только на одном сервере. С настройками по умолчанию игрок, добавленный в vip без контекста, является VIP везде; обычно это то, что нужно, а исключения лучше оформлять добавлением группы с контекстом server=, чем менять глобальные переключатели.

Веб-редактор#

/lp editor - функция, благодаря которой LuckPerms приятен в работе. Он выгружает текущие данные о правах во временную запись и выдаёт ссылку на веб-страницу, где группы, ноды, родители, веса и meta разложены таблицей, которую можно править, фильтровать, копировать и переносить между группами. Когда вы закончите, редактор либо отправляет изменения обратно на сервер сразу, либо выдаёт строку /lp applyedits <code>, которую нужно вставить в чат или консоль. В любом случае ничего не меняется, пока вы не примените правки, так что редактор - ещё и безопасный способ просто посмотреть.

Две практические заметки. Редактору нужно, чтобы сервер мог по HTTPS обратиться к bytebin.lucko.me; если исходящие запросы заблокированы, /lp editor не работает, и остаётся только командная строка. И код applyedits - это разница, а не снимок, поэтому применение старого кода после других изменений сделает не то, что вы задумали. Применяйте его или отбрасывайте в тот же сеанс.

Для массовых изменений, с которыми редактор справляется плохо (переименовать группу везде, удалить ноду у всех пользователей), есть /lp bulkupdate: он запускается только из консоли и просит подтверждения, потому что правит каждую строку в базе. Сначала сделайте экспорт.

Префиксы, треки и временные ранги#

LuckPerms хранит префикс и суффикс для каждой группы вместе с числом-приоритетом и сам нигде их не выводит. Это многих удивляет. Формат чата принадлежит плагину чата (EssentialsX Chat или любому плагину, читающему Vault или PlaceholderAPI), а LuckPerms лишь поставляет значение.

code
$ lp group vip meta setprefix 50 "&6[VIP] &r"$ lp group admin meta setprefix 100 "&c[Admin] &r"$ lp user Steve meta set nickcolour "&b"

Число - это приоритет: когда игрок состоит в нескольких группах, отображается префикс с наибольшим приоритетом. Он намеренно отделён от веса группы, так что у тяжёлой группы может не быть видимой метки. Для плейсхолдеров везде, где есть PlaceholderAPI, доступны %luckperms_prefix%, %luckperms_suffix% и %luckperms_primary_group_name%, а это большинство плагинов чата, скорборда и списка игроков.

Трек - это упорядоченная лестница групп, и нужен он для того, чтобы повышение выполнялось одной командой вместо двух.

code
$ lp createtrack ranks$ lp track ranks append default$ lp track ranks append member$ lp track ranks append trusted$ lp user Steve promote ranks

promote переводит игрока в следующую группу трека и убирает предыдущую; demote идёт обратно. Такая форма подходит для лестницы доверия, и ошибиться в ней куда труднее, чем помнить, что старую группу нужно убрать вручную.

Временные права и группы - вторая половина хорошей гигиены. Испытательный модератор должен закончиться сам:

code
$ lp user Steve parent addtemp moderator 14d$ lp group builder permission settemp worldedit.* true 7d

Длительности пишутся как 30m, 12h, 7d, 2w, 3mo, 1y и могут комбинироваться (1d12h). LuckPerms убирает ноду по истечении срока, без перезапуска и без напоминаний. Используйте это для каждой выдачи, у которой есть конечная дата, иначе получите постоянного модератора, которого никто не помнит назначавшим, - именно тот сбой, о котором рассказано в статье про белые списки, роли и права.

Один набор прав на всю сеть#

Если у вас есть прокси, смысл общего хранилища в том, что ранг, купленный в лобби, существует и в выживании. Для этого должны совпасть три вещи.

read and writeПрокси VelocityLuckPerms и здесьЛоббиserver=lobbyВыживаниеserver=survivalОбщая базагруппы и игроки
Одна база прав за небольшой сетью
  1. Одно и то же хранилище. Поставьте storage-method в удалённую базу и дайте всем серверам, включая прокси, одинаковые учётные данные.
  2. Служба сообщений. Одно общее хранилище означает, что каждый сервер замечает изменение лишь при следующем опросе, с периодом sync-minutes. Если задать messaging-service (sql использует ту же базу, pluginmsg отправляет уведомление через прокси, redis требует сервер Redis), изменения расходятся меньше чем за секунду. /lp networksync запускает это вручную.
  3. Свой `server:` на каждом сервере. Без него контексты не работают, как описано выше.

LuckPerms на прокси важнее, чем думают: именно на прокси группа игрока известна раньше, чем его увидит любой бэкенд, а от этого зависят команды на стороне прокси и белые списки по серверам. Сама сеть описана в статье сеть Minecraft на Velocity; часть про права сводится к трём пунктам выше.

Когда право не работает#

Проходите по порядку. Это почти всегда один из первых трёх пунктов.

  • Игрок - оператор? Тогда Bukkit выдаёт ноду раньше, чем обратится к LuckPerms, и ваше отрицание невидимо. Снимите с него op командой /deop и проверьте снова.
  • Есть забытое отрицание? /lp search essentials.fly перечислит все группы и всех пользователей с этой нодой и её значением. Так находится false, выставленный на default полгода назад.
  • Нода написана в точности верно? Ноды не проверяются. essentials.homes сохранится без возражений и ничего не выдаст.
  • Не мешает ли контекст? Проверьте server: в config.yml именно на этом сервере и сверьте имя мира с именем папки.
  • Доходит ли группа до игрока? /lp user <name> info выводит его группы и основную группу. Если группы нет, родитель добавлен не той группе.
  • Не кэширует ли плагин? Повторный вход ничего не стоит и исключает эту причину.

Если ничто из этого не объясняет проблему, включите подробный режим: он записывает каждую проверку права, которую делает сервер, и ответ на неё:

code
$ lp verbose on Steve$ lp verbose paste

Результат - фильтруемый журнал проверок: нода, ответ и плагин, который спрашивал. Он отвечает на вопрос, на который не отвечают другие средства: какую именно ноду проверяет плагин. Очень часто это не та нода, что названа в документации: команду переименовали или плагин сначала проверяет родительскую ноду. Когда закончите, выполните /lp verbose off, потому что запись каждой проверки на загруженном сервере не бесплатна.

FAQ#

Нужно ли мне по-прежнему кому-то выдавать op?

Нет, и не стоит. Дайте группе admin право luckperms.*, нужные подстановочные ноды плагинов и minecraft.command.*, если хотите ванильные команды, а затем снимите op со всех. Оставьте один op-аккаунт, на котором вы никогда не играете, на тот день, когда сломаете собственные права, - или пользуйтесь консолью панели: она не игрок и права на неё вообще не распространяются.

Где LuckPerms хранит данные игроков и что будет, если кто-то сменит имя?

Пользователи хранятся по UUID, поэтому при смене имени права остаются с ним. LuckPerms ведёт кэш соответствия имён и UUID, чтобы команды принимали имена, и обновляет его при входе. Для игрока, который ещё ни разу не заходил, указывайте в команде его UUID напрямую.

Можно ли править файлы вручную вместо команд?

Только при способах хранения в плоских файлах, только при остановленном сервере, и это плохая привычка. Пока сервер работает, источником истины остаётся база, поэтому ручная правка будет перезаписана при следующем сохранении. Для массовых изменений используйте веб-редактор, а для резервных копий - /lp export.

Почему мой префикс не отображается в чате?

Потому что LuckPerms не пишет сообщения чата. Нужен плагин, который форматирует чат и читает префикс, через Vault или через плейсхолдер %luckperms_prefix%. Задайте не только значение префикса, но и его приоритет: две группы с одинаковым приоритетом дают случайного победителя.

Влияет ли LuckPerms на производительность?

Заметно - нет. Проверки прав разрешаются из памяти, а база затрагивается при входе, при изменении и по таймеру синхронизации. Стоимость, которая всё же проявляется, - это подстановочная * на сервере с сорока плагинами, потому что её приходится разрешать против всех зарегистрированных прав. Если вы гоняетесь за лагами, причина где-то в другом месте: начните со статьи почему падает TPS и что делать.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000