Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Модульность в плагинах

Migel

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Migel077
Как можно реализовать модульность в плагинах или так называеммые аддоны, тоесть чтобы спомощью аддонов, можно было вносить фичи в основной плагин, например взаимодействуя с его API?
 
Достаточно, собственно, предоставить адекватное рабочее API плагина, и любой третий плагин сможет взаимодействовать с твоим.
Если хочешь а-ля PlaceholderAPI, придется работать с загрузчиком классов. У меня в РеА работает так - ищутся джарники в папке; открываются; проверяются все классы; если класс нужного мне типа - создается его экземпляр.
 
Имеется ввиду код берëтся из джарника который закинут в папку? Можно поподробнее
В методе, который я скинул, в принципе и так должно быть понятно, но немного разъясню.

Заранее обусловлюсь - чтобы добавить аддон/модуль к своему плагину, нам в любом случае требуется какая-нибудь точка входа - точно также, как у нас есть JavaPlugin. Новый экземпляр нашего плагина создается, когда баккит загружает плагины из папки.
За экземпляр модуля у меня отвечает класс Module. Что в нем и как сделано - неважно, кроме одного момента - у него либо нет каких-либо явных конструкторов, либо есть, но это публичный конструктор без аргументов. В общем, нужно сделать так, чтобы можно было создать экземпляр нашего модуля через new MyNewModule() (в целом, можно и с аргументами, но об этом чуть позже).

Итак, шаги следующие (на цифрах списка ссылки на соответствующие строки кода):
1. Берём наш загрузчик классов.
2. Ищем все джарники в папке. Для всех джарников:
3. Открываем джарник и создаем подзагрузчик.
4. Проходимся по всем файлам джарника (ибо джарник это по сути просто архив).
5. Убеждаемся, что файл - это джава класс.
6. Загружаем класс.
7. Убеждаемся, что это основной класс модуля.
8. Создаем новый экземпляр этого основного класса модуля через рефлексию (по сути тоже самое, что new MyNewModule()) и регистрируем куда надо.
Я отложил создание на потом, но делать это необязательно - просто показалось, что так будет немного проще редактировать код, если что-то понадобится отрефакторить.

Если понимаешь в рефлексиях, можешь изменить создание экземпляра на 8 шаге - например, направлять туда какие-нибудь данные, но это я пояснять не буду - материал и без того есть.
 
Последнее редактирование:
Я обычно делаю интерфейс, который позволяет зарегистрировать фабрику

Например тут пример, как добавить новую фабрику предметов, в уже существующий плагин
 

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

Назад
Верх