1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал Работа с Permissions

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем DmitriyMX, 10 июл 2012.

  1. Автор темы
    DmitriyMX

    DmitriyMX Старожил Пользователь

    Баллы:
    153
    Skype:
    dmn550
    На любом нормальном сервере всегда есть разделение игроков на какие-то группы. Будь то просто админ/юзер или что-то покруче, как admin/gm/vip/builder/crafter/noob. Ведь не всегда нужно, что бы какие-то функции плагина были доступны всем подряд, верно? По этому и возникла потребность в «пермишенах». В этой статье я рассмотрю методы работы с двумя permission-плагинами: PermissionsEx и PermissionsBukkit.

    PermissionsEx

    На момент написания статьи, это самый популярный плагин для управления правами доступа. Вот с него то мы и начнем.

    Для начала, нам понадобится сам плагин. На Bukkit-Dev, он последний раз находился здесь. В скаченном архиве будет 3 файла: один плагин и два расширения к нему. Нам нужен только плагин, и поэтому распаковываем только его. Далее нужно подключить его как библиотеку к нашему проекту. Делается это слудующим образом (описание для eclipse):
    1. Правый тык по проекту -> Properties
    2. По древу переходим в Java Build Path
    3. Переходим на вкладку Libraries и жмем там кнопку Add External JARs
    4. Выбираем наш PermissionsEx.jar и жмем везде OK
    Отлично, теперь перейдем к коду.

    По сравнению со старым плагином Permissions (от Yeti), о котором говорилось в моей старой статье (кстати, незаконченной, простите), здесь всё куда проще реализовывается. По сути, нам от PermissionsEx нужно узнать только одну банальную вещь: имеет ли определенный игрок права на определенное правило. Под «правилом» я имею ввиду строки вида «worldedit.select.region». Так вот, всё что нам нужно, это написать пару строчек простого кода:
    Код:
    PermissionUser pex_user = PermissionsEx.getUser(event.getPlayer());
    if(pex_user.has("worldedit.select.region")){
       //тут какое-то действие, если разрешение есть
    }
     
    // Или, если вам нужно только один раз за функцию/событие узнать права
    if(PermissionsEx.getUser(event.getPlayer()).has("worldedit.select.region")){
       //тут какое-то действие, если разрешение есть
    }
    Этого примера должно хватить для большинства задач. Если интересуют еще какие-либо возможности PermissionsEx, то бегом изучать оф. документацию. Ну или задавайте вопросы здесь в коментариях, постараюсь на них ответить =)

    PermissionsBukkit

    Тоже не менее популярный плагин для управления правами доступа. Скажу даже больше: это официальный плагин по работе с пермишенами от разработчиков Bukkit. На самом деле, в Bukkit уже встроена своя система пермишенов (как давно – не знаю), а сам плагин нужен лишь для удобства управления ими. Скачать плагин можно здесь.

    А теперь самое интересное… Нам этот плагин не нужно подключать к своему проекту! Как я уже сказал выше: весь необходимый функцианал уже реализовано в самом «ведре».
    Код:
    Player user = event.getPlayer();
    if(user.hasPermission("worldedit.select.region")){
       //действие, если есть права     
    }
    Разницы с PermissionsEx (по проверке прав доступа) почти никакой, за исключением факта, что весь этот функцианал уже доступен «из коробки» Bukkit-а.

    PermissionsEx or PermissionsBukkit?
    2 in 1!


    Если делаешь плагин для общественности, а не для себя, то использовать нужно оба плагина. Реализовать такое очень просто. Достаточно при старте плагина выяснить, какой из “движков” есть на сервере:
    Код:
    //объявляем глобальные переменные
    boolean usePEX = false;
    boolean usePB = false;
     
    //в onEnabled() пишем "распознаватель"
    PluginManager pm = Bukkit.getPluginManager();
    if(pm.getPlugin("PermissionsEx") != null){
       usePEX = true;
    }else if(pm.getPlugin("PermissionsBukkit") != null){
       usePB = true;
    }else{
       Bukkit.getLogger().warning("Permissions plugins not found!")
    }
     
    //Пишем универсальную функцию проверки прав
    public boolean hasPermission(Player player, String permission){
       if(usePEX){
           return PermissionsEx.getUser(player).has(permissions);
       }else if(usePB){
           return player.hasPermission(permission);
       }else{
           return player.isOp(); //ну операторам то делать всё можно, ведь так? ;)
       }
    }
     
    //в каком-либо эвенте, теперь надо только написать
    if(hasPermission(event.getPlayer(), "worldedit.select.region")){
       //тут какие-то действия
    }
    Вуаля! Теперь ваш плагин поддерживает 2 системы управления пермишенами.
    Для тех из вас, кому всё-таки нужен рабочий пример всей этой бурды, которую я нагородил выше, выкладываю исходники для разбора и эксперементов.


    Ссылки

    Следующая статья:
    Документация:
    Полезное:
    ________________________________________​
    Источник: Работа с Permissions
     
    DaDeraNeTiVe нравится это.
  2. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Мне кажется гораздо актуальнее рассмотреть работу с пермишенами Vault - он работает с большим количеством пермишенов. А тут фактически статья заточена на два плагина, причем очень популярный bPermissions "пролетает".

    В принципе сейчас все адекватные пермишен-плагины поддерживают стандартные команды и поэтому если Вам нужно просто проверить есть ли у игрока пермишены не нужно ни в коем случае использовать обращение к ним через плагины. В настоящий момент времени if (Player.hasPermission("xxx.zzz")) — это универсальная проверка, которая работает всегда.

    Ну и есть нюансы, к примеру, некоторые плагины вроде PEX глючат (ну месяца три назад точно так было) если в пермшенах встречались большие буквы. К примеру, проверка if (player.has"MySuperPlugin.config") возвращала в PEX false даже если такой пермишен игроку прописывали. Поэтому на всякий случай всегда надо делать пермишены в нижнем регистре.

    Vault я использую исключительно для работы с группами, но мне наверное пока большего не требовалось.
     
    DPOH-VAR и DmitriyMX нравится это.
  3. Автор темы
    DmitriyMX

    DmitriyMX Старожил Пользователь

    Баллы:
    153
    Skype:
    dmn550
    Спасибо за предложение. В ближайшее время дополню статью плагинами Vault и bPermission
     
  4. kaban1997

    kaban1997 Старожил Переводчик Пользователь

    Баллы:
    173
    А мне выдаёт ошибку в getPlayer():
    if(hasPermission((sender.getPlayer(), "test.test"))
    Предлагает сделать так
    if(hasPermission(((Player) sender).getPlayer(), "pid.all"))
    В чате от игрока работаёт, а от консоли - нет
    sender это CommandSender
     
    ПриветОтМиднайта нравится это.
  5. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    sender - это.. отправитель команды. игрок тоже сендер.
    Причем я не понимаю, для чего для PEX городить какой-то огород. Все работает если использоваться стандартные методы проверки предоставляемые баккитом.

    Я всегда делал так:

    Код:
    if (sender instanceof Player) {
     
        Player p = (Player) sender;
     
        if (p.hasPermission ("aaa.bbb.ccc"){
            p.sendMessage ("Право имеешь!");
        } else p.sendMessage ("Тварь ты дрожащая!");
     
    } else sender.sendMessage ("Миша, а ну отойди от сервера! Щас приду руки обломаю!");
     
    kaban1997 нравится это.
  6. DonateloWich

    DonateloWich Ньюби

    Баллы:
    1
    Проверять пермишин можем, а изменить его состояние для определеного игрока, как?
     
  7. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @DonateloWich Используйте Vault. Это лучше всего, посмотрите описание API. Там всё понятно и подробно.
     
  8. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Там поверхностно все. Нет ни групп на время ни веса группам, много чего нет. А вообще pex помер в пользу LP.
     

Поделиться этой страницей