Туториал LuckPerms, что это и с чем его едят

Часть первая. Быстрый старт.​
Содержание:
Поскольку плагин имеет свойство обновляться, а сидеть на старых версиях ни мне ни вам не хочется, я решил все инструкции разделить на разделы. Каждый раздел пишется для определённой версии плагина и игры, которые упоминаются в первых частях каждого из этих разделов.
  1. Первый раздел
    1. Часть первая. Быстрый старт.
    2. Часть вторая. Префиксы и суффиксы.
    3. Часть третья. Форматы хранения.
    4. Часть четвёртая. BungeeCord.
    5. Часть пятая. Мелкие, но важные детали.
  2. Второй раздел
    1. Часть первая. Локальные и файловые БД.

Приветствую!
Сегодня мы с вами будем разбирать плагин, который смог выполнить очень сложную задачу — обойти по всем параметрам привычный нам PermissionsEx. Да, это действительно так, LuckPerms технически и функционально выигрывает в любом бою с вышеупомянутым PEX.
Многие сейчас зададутся вопросом:

Дык а зачем он мне? У меня сервер уже долгое время стабильно использует PEX и мне нет резона менять его на что бы то ни было.

Действительно, вас никто, и уж тем более я, не заставляет переходить на LuckPerms. Но время идёт и последние сообщения от разработчика PEX не утешают:
Снимок экрана 2018-04-09 в 0.06.24.png
Сообщение о закрытии разработки, перевод репозитория в read-only и совет перейти на тот же LuckPerms ни о чём хорошем не говорят. Разработка PEX приостановлена на неопределённый срок, а это значит, что ни фиксов, ни обновлений на другие версии, ни поддержки от разработчика больше осуществляться не будет. А проблемы есть:
Снимок экрана 2018-04-09 в 0.13.44.png

Но и у LP есть свои недостатки. Пусть он и работает на всех свежих версиях, а сервера с forge для него могут стать проблемой. Thermos, Cauldron и KCauldron в их нынешнем состоянии (заброшенная разработка и версия 1.7.10) не будут работать с LuckPerms. Вообще. А вот с губкой проблем не будет.

И да, самое важное. LuckPerms теперь не поддерживает вообще ничего, что ниже 1.8.8. Очень важно это помнить и смотреть на версию. И обновляться своевременно.
В обновлении 4.2.58 была возвращена поддержка Minecraft 1.7.10. Не знаю, как это сказалось на работе с forge-совместимыми серверами, поживём — увидим.
Поддержки версий ниже 1.8.8 больше нет.

Разработчик некоторое время назад таки выпустил версию для старых версий. Называется она LuckPerms Legacy и достать её можно на официальном сайте.
Это было небольшое отступление, вернёмся к LuckPerms.


Для настройки и работы LP в этом руководстве использовались:
  • Minecraft 1.12.2
  • PaperSpigot (git-Paper-1389)
  • LuckPerms v4.1.25
  • Java 8 (версии ниже нам не подойдут)
Установка​

Если вы хотите перенести все уже настроенные права из, скажем, того же PEX, прошу в спойлер. Остальные могут его пропустить.
Миграция из PEX отличается от нормальной установки совсем немного. На свой сервер с PEX установите LP, загруженный по ссылке ниже. Но не спешите удалять PEX, после запуска сервера пропишите в чате/консоле команду "/lp migration PermissionsEx", после чего будет запущена процедура миграции. Это перенесёт все ваши настройки из PEX в LP. Здорово? Ещё бы. А теперь можно пройти мимо установки и проследовать к следующему пункту.

Установка довольно проста:
  1. Скачиваем LuckPerms с официальной страницы плагина на Spigot.
  2. Перемещаем загруженный оттуда файл в папку plugins своего сервера. Предварительно удостоверьтесь, что там нет других плагинов на права.
  3. (Пере)запускаем сервер.
Если в plugins появилась папка LuckPerms, значит всё прошло хорошо и плагин запустился.

Настройка плагина​

В папке LuckPerms нас интересует только файл config.yml, к остальному мы притрагиваться не будем. Поскольку BungeeCord мы не используем, настройка будет быстрой и не сложной, и часть параметров можно просто не трогать. Самые важные параметры я описал здесь, остальное лучше изучать самим на LuckPerms Wiki (англ.). В этом руководстве единственный пункт, который я изменю в конфиге, будет "apply-bukkit-default-permissions: false", подробнее про него по ссылке выше.

Настройка прав​

Самая интересная часть. Наверное, самым сложным будет создание групп. Поэтому сразу пишу, как это сделать:
Код:
/lp creategroup <название> — создать группу
/lp deletegroup <название> — удалить группу
Стандартная группа для всех — default. Очень желательно её не удалять, если есть желание её переименовать можно сменить видимое имя командой (потом поймёте зачем):
Код:
/lp group <группа> setdisplayname <имя> — устанавливает отображаемое имя для группы
У меня, в итоге, получилось 3 группы с названиями:
Код:
> lp creategroup admin
[01:04:56 INFO]: [LP] admin was successfully created.
> lp creategroup donate
[01:04:59 INFO]: [LP] donate was successfully created.
> lp group default setdisplayname "Обычные игроки"
[01:11:34 INFO]: [LP] Set display name to Обычные игроки for group default.
> lp group donate setdisplayname "Донат"
[01:11:53 INFO]: [LP] Set display name to Донат for group donate.
> lp group admin setdisplayname "Администраторы"
[01:12:07 INFO]: [LP] Set display name to Администраторы for group admin.

Всё, хватит медлить, переходим к самому интересному. Для настройки прав мы не будем использовать ни редакторы БД, ни текстовые редакторы. Нам понадобится только интернет, веб-браузер (надеюсь это не Internet Explorer) и запущенный сервер с LP на борту. Прописываем команду:
Код:
> lp editor groups
[01:15:49 INFO]: [LP] Preparing a new editor session. Please wait...
[01:15:52 INFO]: [LP] Click the link below to open the editor:
[01:15:52 INFO]: https://luckperms.github.io/editor/?*******
Если вы делаете это в игре — достаточно просто нажать в чате на ссылку https://luckperms.github.io/editor/?******* и она откроется в браузере. Из консоли её можно скопировать строку браузера. Открываем...
Снимок экрана 2018-04-09 в 1.18.54.png
Да, это и есть наша настройка прав. Вверху список наших групп, потом поля для добавления и список добавленных прав.
Не бойтесь вносить правки, они не применятся, пока вы сами не сохраните и не пропишете в игре/консоли необходимую команду. Здесь полная свобода действий.
Для администраторов у нас доступны все права, для донатеров добавим право /say и /me, а обычным юзерам и так хорошо. Хотя лучше будет им запретить все доступные права, а потом добавлять необходимые.
Работают права здесь таким же образом, как и в PEX (кстати, * даёт все права, никаких кавычек не надо). В поле Permission пишем необходимое право и нажимаем справа "+". Всё. Некоторые права LP будет распознавать сам и подсказывать при вводе:
Снимок экрана 2018-04-09 в 1.31.53.png
С добавлением прав всё просто, а как запрещать?
Очень просто. Достаточно добавить право, которое надо запретить, и нажать в его строке на зелёное слово "true", которое сразу же изменится на "false", обозначая запрет.
В результате должно получиться так:
Снимок экрана 2018-04-09 в 1.33.29.png
Снимок экрана 2018-04-09 в 1.33.31.png
Снимок экрана 2018-04-09 в 1.33.33.png
Выглядит замечательно! Но мы совсем забыли про наследование групп. Помните inheritance из пекса? Так вот, здесь это делается тоже добавлением прав для группы. Надеюсь все заметили право displayname с названием группы. Так вот, здесь все параметры решаются через такие же права, как и для игроков. Только не для игроков, а для групп, и не права, а параметры.
Чтобы добавить наследование для группы достаточно будет добавить ей право:
Код:
group.<название наследуемой группы>
В моём случае это будет group.default:
Снимок экрана 2018-04-09 в 1.42.52.png

Всё, с правами мы закончили, давайте сохраним наши изменения. Справа вверху, около стрелок, нажимаем на значок дискеты и появляется сообщение:
Снимок экрана 2018-04-09 в 1.45.38.png
На белом фоне появилась команда (само собой, у вас она будет отличаться), которую необходимо выполнить на сервере, чтобы применить наши изменения. Она сама скопируется, если на неё нажать. Переходим на сервер и выполняем:
Код:
> lp applyedits **********
[01:47:38 INFO]: [LP] Web editor data was applied to admin (Администраторы) successfully.
[01:47:38 INFO]: [LP] (1 addition and 0 deletions)
[01:47:38 INFO]: +  * (true)
[01:47:38 INFO]: [LP] Web editor data was applied to default (Обычные игроки) successfully.
[01:47:38 INFO]: [LP] (1 addition and 0 deletions)
[01:47:38 INFO]: +  * (false)
[01:47:38 INFO]: [LP] Web editor data was applied to donate (Донат) successfully.
[01:47:38 INFO]: [LP] (3 additions and 0 deletions)
[01:47:38 INFO]: +  minecraft.command.me (true)
[01:47:38 INFO]: +  minecraft.command.say (true)
[01:47:38 INFO]: +  group.default (true)
Как видим, все наши изменения применились и теперь права на сервере регулируются по заданным параметрам.
Но у нас осталась проблема. Группа default убирает все права игрока, а группа admin их все обратно добавляет. Почему это проблема? Дело в том, что в LP все группы друг для друга одинаковы, пока не обозначено наследование в группе остаётся одинаковый приоритет для запрета и разрешения. Но не беда, каждый раз лезть в редактор мы не будем. Для наследования также есть команды:
Код:
/lp group <группа> parent add <группа-1> — добавить группе наследование прав из группы-1
/lp group <группа> parent remove <группа-1> — убрать наследование группы от группы-1.
Командой у себя пропишу наследование от donate к admin:
Код:
/lp group admin parent add donate

Добавление игрока в группу​

Здесь всё просто, достаточно будет ввести команду:
Код:
/lp user <игрок> parent add <группа> — добавить игроку группу
/lp user <игрок> parent remove <группа> — удалить игроку группу
/lp user <игрок> parent set <группа> — установить игроку группу и удалить все остальные

На этом всё. Естественно, охватить весь объём LP в одном посте трудно, это самые самые основы, мы с вами даже префиксы/суффиксы не разбирали. Поговорим о них в следующий раз.
А с вами был InterWall. До встречи!
 
Последнее редактирование:
С помощью каких плагинов можно выводить привилегию игрока в TAB? ColoredTags, NTE работают с LuckPerms? @InterWall
Все должны работать, главное это совместимость с Vault, а она у каждого такого плагина присутствует.
 
Все должны работать, главное это совместимость с Vault, а она у каждого такого плагина присутствует.
Спасибо, учту. Подумал и попробовал, только после того, как написал сюда.
 
Как можно перезаписать префикс? Чтобы игрок мог его менять без сохранения предыдущего.
 
Как можно перезаписать префикс? Чтобы игрок мог его менять без сохранения предыдущего.
Перезаписать префикс? Ты имеешь ввиду убирать у игрока префикс, если он его сам себе поставил?
(если да — никак, убирать префикс я бы и не советовал, лучше ставить вес выше)
 
Перезаписать префикс? Ты имеешь ввиду убирать у игрока префикс, если он его сам себе поставил?
(если да — никак, убирать префикс я бы и не советовал, лучше ставить вес выше)
Не убрать, а переставить (как /pex user <> prefix). Я делаю скрипт на кастомные префиксы, и если игроки будут добавлять себе префиксы, то получится каша.
 
Не убрать, а переставить (как /pex user <> prefix). Я делаю скрипт на кастомные префиксы, и если игроки будут добавлять себе префиксы, то получится каша.
А, стоп, понял. Перезаписать уже установленный у игрока префикс на новый.
Сейчас гляну, там такое было.
 
Сорри за тупой вопрос.
Как там выдавать привилегия?
Ну или скажи где там список команд...
 
Странно, я был уверен, что такая функция в нём была. В любом случае, пока мне не ответил разраб, сделать это можно только удалив предыдущий и поставив новый.
Ок, пока сделаю так.
Если бд подключена и задать игроку кастомный префикс на одном сервере, он сменится на другом? Или там что-то надо дополнительно настраивать.
 
Ок, пока сделаю так.
Если бд подключена и задать игроку кастомный префикс на одном сервере, он сменится на другом? Или там что-то надо дополнительно настраивать.
Да, но подробнее про это описано в статье про банджу. Лучше почитать перед тем, как что-либо делать.
 
Да, но подробнее про это описано в статье про банджу. Лучше почитать перед тем, как что-либо делать.
Пытался вот подключить дб, выбивает такое (первый раз с бд работаю)
[16:13:46 WARN]: Exception in thread "Craft Scheduler Thread - 8"
[16:13:46 WARN]: org.apache.commons.lang.UnhandledException: Plugin LuckPerms v4
.1.25 generated an exception while executing task 90
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftAsyncTask.run(CraftAsyn
cTask.java:56)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.util.concurrent.CompletionException: java.sql.SQLTransientConnec
tionException: luckperms - Connection is not available, request timed out after
5000ms.
at me.lucko.luckperms.common.storage.AbstractStorage.lambda$makeFuture$1
(AbstractStorage.java:100)
at java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftTask.run(CraftTask.java
:71)
at org.bukkit.craftbukkit.v1_8_R3.scheduler.CraftAsyncTask.run(CraftAsyn
cTask.java:53)
... 3 more
Caused by: java.sql.SQLTransientConnectionException: luckperms - Connection is n
ot available, request timed out after 5000ms.
at me.lucko.luckperms.lib.hikari.pool.HikariPool.createTimeoutException(
HikariPool.java:667)
at me.lucko.luckperms.lib.hikari.pool.HikariPool.getConnection(HikariPoo
l.java:183)
at me.lucko.luckperms.lib.hikari.pool.HikariPool.getConnection(HikariPoo
l.java:148)
at me.lucko.luckperms.lib.hikari.HikariDataSource.getConnection(HikariDa
taSource.java:100)
at me.lucko.luckperms.common.storage.dao.sql.connection.hikari.HikariCon
nectionFactory.getConnection(HikariConnectionFactory.java:132)
at me.lucko.luckperms.common.storage.dao.sql.SqlDao.loadAllGroups(SqlDao
.java:608)
at me.lucko.luckperms.common.storage.AbstractStorage.lambda$loadAllGroup
s$10(AbstractStorage.java:219)
at me.lucko.luckperms.common.storage.AbstractStorage.lambda$makeFuture$1
(AbstractStorage.java:97)
... 6 more
Caused by: me.lucko.luckperms.lib.mysql.jdbc.exceptions.jdbc4.CommunicationsExce
ption: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driv
er has not received any packets from the server.
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source
)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at me.lucko.luckperms.lib.mysql.jdbc.Util.handleNewInstance(Util.java:42
5)
at me.lucko.luckperms.lib.mysql.jdbc.SQLError.createCommunicationsExcept
ion(SQLError.java:990)
at me.lucko.luckperms.lib.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
at me.lucko.luckperms.lib.mysql.jdbc.ConnectionImpl.coreConnect(Connecti
onImpl.java:2186)
at me.lucko.luckperms.lib.mysql.jdbc.ConnectionImpl.connectOneTryOnly(Co
nnectionImpl.java:2219)
at me.lucko.luckperms.lib.mysql.jdbc.ConnectionImpl.createNewIO(Connecti
onImpl.java:2014)
at me.lucko.luckperms.lib.mysql.jdbc.ConnectionImpl.<init>(ConnectionImp
l.java:776)
at me.lucko.luckperms.lib.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connect
ion.java:47)
at sun.reflect.GeneratedConstructorAccessor46.newInstance(Unknown Source
)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at me.lucko.luckperms.lib.mysql.jdbc.Util.handleNewInstance(Util.java:42
5)
at me.lucko.luckperms.lib.mysql.jdbc.ConnectionImpl.getInstance(Connecti
onImpl.java:386)
at me.lucko.luckperms.lib.mysql.jdbc.NonRegisteringDriver.connect(NonReg
isteringDriver.java:330)
at me.lucko.luckperms.lib.mysql.jdbc.jdbc2.optional.MysqlDataSource.getC
onnection(MysqlDataSource.java:428)
at me.lucko.luckperms.lib.mysql.jdbc.jdbc2.optional.MysqlDataSource.getC
onnection(MysqlDataSource.java:136)
at me.lucko.luckperms.lib.hikari.pool.PoolBase.newConnection(PoolBase.ja
va:365)
at me.lucko.luckperms.lib.hikari.pool.PoolBase.newPoolEntry(PoolBase.jav
a:194)
at me.lucko.luckperms.lib.hikari.pool.HikariPool.createPoolEntry(HikariP
ool.java:460)
at me.lucko.luckperms.lib.hikari.pool.HikariPool.access$100(HikariPool.j
ava:71)
at me.lucko.luckperms.lib.hikari.pool.HikariPool$PoolEntryCreator.call(H
ikariPool.java:697)
at me.lucko.luckperms.lib.hikari.pool.HikariPool$PoolEntryCreator.call(H
ikariPool.java:683)
at java.util.concurrent.FutureTask.run(Unknown Source)
... 3 more
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at me.lucko.luckperms.lib.mysql.jdbc.StandardSocketFactory.connect(Stand
ardSocketFactory.java:211)
at me.lucko.luckperms.lib.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
... 23 more

Upd. Ясно-понятно, это я тупой. Оказывается, MySql ещё надо установить👍
 
Последнее редактирование:
Использую LP с сентября 2017, по сравнению с Pex небо и земля. Особенно радует возможность присваивать группам bungee права - /lpb group Группа permission set Права.Которые.Выдаем true server=bungee - так, например, хелперам права на bungee /viaversion list выданы и отобраны все bungee права у администраторов на auth сервере, чтобы всякие кулхацкеры до авторизации не щелкали куда попало. Для такого нужно поставить LP на bungee + общая база данных.
После установки отпала головная боль по синхронизации прав разных серверов, все обновляется моментально.
Таб дополнение прав радует, тайминги прекрасные.. До кучи есть веб редактор всего на свете и приятное оформление команд, после которого белое полотно Pex'a вспоминать не хочется.
Ядро 1.12.2, проблем совместимости не появлялось.
 
Последнее редактирование:
Подскажите, как выставить привилегию default по default-у? Всё вроде настроил, но при авторизации у меня нет никакой привилегии. Как я это понял? /lp listgroup - ТЫК

Вроде и наследования все сделал, но всё равно не работает - подскажите)
 
Подскажите, как выставить привилегию default по default-у? Всё вроде настроил, но при авторизации у меня нет никакой привилегии. Как я это понял? /lp listgroup - ТЫК

Вроде и наследования все сделал, но всё равно не работает - подскажите)
Экспорт прав в файл и выложи его сюда. А дальше уже проще будет.
 
Экспорт прав в файл и выложи его сюда. А дальше уже проще будет.
Честно говоря, я что-то пока не понял. Походу через какое-то определенное время права на хрен отваливаются xD После перезахода/рестарта заработало всё.
 
Привет,как удалить игроков из ДБ(чтобы сбросить у них привелегии)?
 
Честно говоря, я что-то пока не понял. Походу через какое-то определенное время права на хрен отваливаются xD После перезахода/рестарта заработало всё.
Получается, что теперь проблемы нет? Это замечательно.
Привет,как удалить игроков из ДБ(чтобы сбросить у них привелегии)?
Что за БД? Если мускуль — там есть таблица с игроками, достаточно просто её очистить.
Если нет — можно попробовать по-другому. Прописываешь команду /lp export <название_файла>, после чего в этом файле убираешь все строки, которые относятся к юзерам. Они там одним блоком должны идти, примерно вот так:
Код:
# Export users
# Export user: 0ccae30b-825a-4b21-b670-37622c15a028 - interwall
/lp user 0ccae30b-825a-4b21-b670-37622c15a028 parent add admin
/lp user 0ccae30b-825a-4b21-b670-37622c15a028 parent add donate
/lp user 0ccae30b-825a-4b21-b670-37622c15a028 switchprimarygroup admin
После редактирования сохраняешь и прописываешь /lp import <название_файла>. Всё.
 
Назад
Верх Низ