Developing a permissions plugin/ru

## Введение

В этом руководстве вы узнаете как создать собственный permissions-плагин (плагин разрешений), который управляет разрешениями с помощью API разрешений Bukkit.

### Требования

Это руководство предполагает, что вы хорошо понимаете язык Java и общие принципы разработки плагинов. В руководстве будут рассмотрены только особенности API разрешений Bukkit.

## Класс "Permissible"

Всё, на что можно установливать *разрешения*, должно наследовать класс *Permissible*. В настоящее время это только классы *Player* и *CommandSender*, однако, теоретически, иметь возможность установки *разрешений* может всё что угодно. Далее в этом руководстве мы будем иметь в виду скорее класс игрока, а не какой-либо иной объект.

## PermissionAttachments — Привязка разрешений

### Что из себя представляет PermissionAttachment?

Permission attachment (привязка разрешения) — это способ, который плагин использует для управления разрешениями игрока. Что немаловажно, этот подход также позволяет разным плагинам управлять разрешениями, не конфликтуя между собой. Конечно, это актуально только если два разных плагина не попытаются установить одно и то же разрешение.

### Как создавать и удалять такие "привязки"

Чтобы иметь возможность управлять разрешениями игрока, каждый из этих игроков должен быть сначала "привязан" к плагину разрешений. Чтобы создать такую привязку через объект *PermissionAttachment*, нужно использовать следующий код:

```
PermissionAttachment attachment = player.addAttachment(plugin);

```

Существует также возможность создать привязку игрока к плагину, которая будет длится только на протяжении ограниченного количества тиков. Чтобы добиться этого, используйте следующий код:

```
PermissionAttachment attachment = player.addAttachment(plugin, ticks);

```

Любую из таких "привязок" игрока к плагину нужно где-то хранить. Лучшим решением является создание хэш-карты наподобии: `*HashMap<UUID, PermissionAttachment>*`, где *UUID* — это уникальный идентификатор (ID) игрока, а *PermissionAttachment* — объект "привязки". Такой подход позволит вам удобно управлять разрешениями конкретного игрока по его UUID, а также удалять "привязку" (*PermissionAttachment*) к плагину, когда она больше не требуется.

Лучшее место для удаления "привязки" конкретного игрока — событие *onPlayerQuit*, а для удаления всех "привязок" в событии плагина *onDisable*. Чтобы удалить "привязку" конкретного игрока используйте код, приведенный ниже:

```
player.removeAttachment(attachment);

```

## Выдача разрешений

Есть два основных способа выдать игроку то или иное разрешение:

1. Первый способ — выдача разрешений через строку. Это, вероятно, самый простой способ.
2. Через permission-объект. Это немного сложнее, но изнутри работает точно так же, как и первый способ, поэтому я не буду повторяться.

Чтобы выдать какое-либо разрешение игроку, сначала нужно получить PermissionAttachment этого игрока из HashMap, который мы создали ранее и записали туда пару *UUID* игрока -> *PermissionAttachment* игрока. Как только вы получите объект *PermissionAttachment* (в коде я буду использовать для него переменную *attachment*), выдать разрешение можно одной командой:

```
attachment.setPermission(permissionName, permissionValue);

```
Где *permissionName* это значение типа *String* (строка), а *permissionValue* значение типа *boolean* (логическое true/false).
Когда потребуется, вы можете забрать у игрока разрешение с помощью приведенного ниже кода (альтернатива предыдущему блоку кода с установлением значения *permissionValue* в значение *false*):

```
attachment.unsetPermission(permissionName);

```

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

## Заключение

В принципе, это все, что нужно знать о написании собственного плагина разрешений. Фактическая реализация плагина зависит только от вас. Я могу привести несколько примеров:

* RPG-плагин, который выдает специфические разрешения игроку в зависимости от его уровня или количества опыта.
* Плагин, связывающий разрешения аккаунта игрока между сервером и, к примеру, форумом, таким как phpBB.