Перейти к содержимому

С чего начать

Разработчик аддонов

У AbstractMenus 2.0 есть SPI: через него аддоны в рантайме регистрируют свои действия, правила, свойства предметов, активаторы, каталоги и хендлеры провайдеров (экономика, права, уровни, плейсхолдеры, скины). Встроенные типы тянут тот же SPI.

Аддон можно поставить двумя способами - выбирай:

Дальше идут страницы про сам API. Про доставку (какой путь выбрать, формат манифеста, жизненный цикл) смотри страницу аддонов.

API AbstractMenus публикуется на GitHub Packages и собирается под каждый релиз на JitPack.

build.gradle.kts
repositories {
maven("https://jitpack.io")
}
dependencies {
compileOnly("com.github.AbstractMenus:minecraft-plugin:2.0.0-alpha.2")
}

artifactId - minecraft-plugin, по имени репозитория. JitPack кладёт мульти-модульные Gradle-проекты под одну корневую координату; внутри jar - модуль api.

Плагины-как-аддоны (Путь 2) объявляют AbstractMenus жёсткой зависимостью - тогда Bukkit гарантирует, что твой onEnable запустится после того, как AbstractMenus уже поднялся.

plugin.yml
name: MyAddon
version: 1.0.0
depend:
- AbstractMenus

Если плагин должен подниматься и без AbstractMenus, ставь softdepend: - и тогда обмазывай вызовы API проверкой Bukkit.getPluginManager().getPlugin("AbstractMenus") != null.

У аддонов Пути 1 plugin.yml нет вообще - вместо него addon.conf с полем pluginDependencies. См. страницу аддонов.

Точка входа - AbstractMenusApi. Берётся через статический get():

import ru.abstractmenus.api.AbstractMenusApi;
AbstractMenusApi api = AbstractMenusApi.get();

Если AbstractMenus ещё не включился - вернёт null. С depend: [AbstractMenus] в манифесте к моменту твоего onEnable он точно поднят.

В аддонах Пути 1 get() дёргать вообще не нужно - API прилетает параметром в методы жизненного цикла:

public final class MyAddon implements MenuExtension {
@Override
public void onEnable(AbstractMenusApi api) {
// api уже инициализирован
}
}
api.actions(); // TypeRegistry<Action>
api.rules(); // TypeRegistry<Rule>
api.activators(); // TypeRegistry<Activator>
api.itemProperties(); // TypeRegistry<ItemProperty>
api.catalogs(); // TypeRegistry<Catalog<?>>
api.providers(); // ProviderRegistry - экономика, права, уровни, плейсхолдеры, скины
api.serializers(); // общие HOCON NodeSerializers
api.variables(); // VariableManager - чтение/запись персональных и глобальных переменных
api.openMenu(activator, ctx, player, menu);
api.getOpenedMenu(player);
api.loadMenus();
api.apiVersion(); // строка версии для диагностики
api.getPlugin(); // сырой хэндл Bukkit Plugin

Под каждый реестр, менеджер и хелпер есть отдельная страница в этом разделе.

Если по какой-то причине GitHub Packages обязателен (например, политика CI):

  1. Сгенерируй Personal Access Token (classic) со скоупом read:packages.

  2. Сложи учётку в ~/.gradle/gradle.properties:

    ~/.gradle/gradle.properties
    gpr.user=your-github-username
    gpr.token=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  3. Добавь репозиторий и переключи координату на родную ru.abstractmenus:api:

    build.gradle
    repositories {
    maven {
    url = uri('https://maven.pkg.github.com/AbstractMenus/minecraft-plugin')
    credentials {
    username = providers.gradleProperty('gpr.user')
    .orElse(providers.environmentVariable('GITHUB_ACTOR')).getOrNull()
    password = providers.gradleProperty('gpr.token')
    .orElse(providers.environmentVariable('GITHUB_TOKEN')).getOrNull()
    }
    }
    // JitPack всё ещё нужен для транзитивной зависимости api
    // com.github.AbstractMenus:hocon:
    maven { url 'https://jitpack.io' }
    }
    dependencies {
    compileOnly 'ru.abstractmenus:api:2.0.0-alpha.2'
    }