Статус оператора - это выключатель с одним положением: можно всё, включая остановку сервера и правку мира. 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. Каждый игрок состоит в ней, пока вы его не переведёте, и удалить её нельзя. Всё остальное вы строите сами.
$ 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. Сам по себе вес ничего не даёт: тяжёлая группа без нод ничего не разрешает.
Порядок разрешения, когда групп больше пары, стоит знать точно:
- Ноды, заданные прямо у пользователя, перевешивают всё, что унаследовано от группы.
- Среди групп побеждает та, у которой вес выше.
- Из двух значений на одном уровне
falseпобеждаетtrue: отрицание - это осознанное заявление, и LuckPerms относится к нему именно так. - Подстановочная нода менее конкретна, чем точная, поэтому
essentials.homeсо значениемfalseпо-прежнему действует на того, у кого естьessentials.*.
Последнее правило и есть способ построить группу, у которой есть почти всё: дайте ей подстановочную ноду, а затем отрицайте несколько ненужных.
$ 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.sethome | EssentialsX | Систему домов |
essentials.sethome.multiple.vip | EssentialsX | Больше домов, привязано к записи в конфиге |
essentials.tpa, essentials.tpaccept | EssentialsX | Запросы на телепортацию между игроками |
essentials.kit.tools | EssentialsX | Один именованный набор |
worldedit.* | WorldEdit | Весь WorldEdit. Не раздавайте его без нужды |
worldguard.region.claim | WorldGuard | Заявку на регион |
coreprotect.inspect, coreprotect.lookup | CoreProtect | Чтение журнала блоков |
coreprotect.rollback | CoreProtect | Откат. Только для модераторов |
luckperms.editor | LuckPerms | Открытие веб-редактора |
minecraft.command.gamemode | Paper | Ванильную команду /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, а плагины могут добавлять свои.
$ 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=lobbyworld - это имя папки мира: 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 лишь поставляет значение.
$ 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%, а это большинство плагинов чата, скорборда и списка игроков.
Трек - это упорядоченная лестница групп, и нужен он для того, чтобы повышение выполнялось одной командой вместо двух.
$ lp createtrack ranks$ lp track ranks append default$ lp track ranks append member$ lp track ranks append trusted$ lp user Steve promote rankspromote переводит игрока в следующую группу трека и убирает предыдущую; demote идёт обратно. Такая форма подходит для лестницы доверия, и ошибиться в ней куда труднее, чем помнить, что старую группу нужно убрать вручную.
Временные права и группы - вторая половина хорошей гигиены. Испытательный модератор должен закончиться сам:
$ lp user Steve parent addtemp moderator 14d$ lp group builder permission settemp worldedit.* true 7dДлительности пишутся как 30m, 12h, 7d, 2w, 3mo, 1y и могут комбинироваться (1d12h). LuckPerms убирает ноду по истечении срока, без перезапуска и без напоминаний. Используйте это для каждой выдачи, у которой есть конечная дата, иначе получите постоянного модератора, которого никто не помнит назначавшим, - именно тот сбой, о котором рассказано в статье про белые списки, роли и права.
Один набор прав на всю сеть#
Если у вас есть прокси, смысл общего хранилища в том, что ранг, купленный в лобби, существует и в выживании. Для этого должны совпасть три вещи.
- Одно и то же хранилище. Поставьте
storage-methodв удалённую базу и дайте всем серверам, включая прокси, одинаковые учётные данные. - Служба сообщений. Одно общее хранилище означает, что каждый сервер замечает изменение лишь при следующем опросе, с периодом
sync-minutes. Если задатьmessaging-service(sqlиспользует ту же базу,pluginmsgотправляет уведомление через прокси,redisтребует сервер Redis), изменения расходятся меньше чем за секунду./lp networksyncзапускает это вручную. - Свой `server:` на каждом сервере. Без него контексты не работают, как описано выше.
LuckPerms на прокси важнее, чем думают: именно на прокси группа игрока известна раньше, чем его увидит любой бэкенд, а от этого зависят команды на стороне прокси и белые списки по серверам. Сама сеть описана в статье сеть Minecraft на Velocity; часть про права сводится к трём пунктам выше.
Когда право не работает#
Проходите по порядку. Это почти всегда один из первых трёх пунктов.
- Игрок - оператор? Тогда Bukkit выдаёт ноду раньше, чем обратится к LuckPerms, и ваше отрицание невидимо. Снимите с него op командой
/deopи проверьте снова. - Есть забытое отрицание?
/lp search essentials.flyперечислит все группы и всех пользователей с этой нодой и её значением. Так находитсяfalse, выставленный наdefaultполгода назад. - Нода написана в точности верно? Ноды не проверяются.
essentials.homesсохранится без возражений и ничего не выдаст. - Не мешает ли контекст? Проверьте
server:вconfig.ymlименно на этом сервере и сверьте имя мира с именем папки. - Доходит ли группа до игрока?
/lp user <name> infoвыводит его группы и основную группу. Если группы нет, родитель добавлен не той группе. - Не кэширует ли плагин? Повторный вход ничего не стоит и исключает эту причину.
Если ничто из этого не объясняет проблему, включите подробный режим: он записывает каждую проверку права, которую делает сервер, и ответ на неё:
$ 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.