Миграция 1.x → 2.0
Если аддон писался под API 1.x (AbstractMenusProvider, AbstractMenusPlugin, Types, Handlers), на этой странице - таблица соответствий “старый вызов - чем заменить в 2.0”.
Точка входа в API
Заголовок раздела «Точка входа в API»AbstractMenusPlugin plugin = AbstractMenusProvider.get();AbstractMenusApi api = AbstractMenusApi.get();AbstractMenusApi заменяет и AbstractMenusPlugin, и AbstractMenusProvider. Статический get() ищет реализацию через Bukkit-овский ServicesManager - так же, как старый провайдер.
В аддонах Пути 1 (он появился в 2.0) get() дёргать не нужно: API прилетает параметром в методы жизненного цикла MenuExtension. См. поставка аддона.
Регистрация типов
Заголовок раздела «Регистрация типов»Каждый Types.register* переехал в типизированный реестр на api:
Types.registerAction("myAction", MyAction.class, new MyAction.Serializer());api.actions().register("myAction", MyAction.class, new MyAction.Serializer(), this);
Types.registerRule("myRule", MyRule.class, new MyRule.Serializer());api.rules().register("myRule", MyRule.class, new MyRule.Serializer(), this);
Types.registerActivator("myActivator", MyActivator.class, new MyActivator.Serializer());api.activators().register("myActivator", MyActivator.class, new MyActivator.Serializer(), this);
Types.registerItemProperty("myProp", MyProp.class, new MyProp.Serializer());api.itemProperties().register("myProp", MyProp.class, new MyProp.Serializer(), this);
Types.registerCatalog("my_catalog", MyCatalog.class, new MyCatalog.Serializer());api.catalogs().register("my_catalog", MyCatalog.class, new MyCatalog.Serializer(), this);Новый четвёртый параметр (this) - твой экземпляр MenuExtension. По нему AbstractMenus снимает твои регистрации при выключении аддона - руками unregister дёргать не надо.
Кастомный HOCON-сериализатор
Заголовок раздела «Кастомный HOCON-сериализатор»Types.serializers().register(MyType.class, new MyTypeSerializer());api.serializers().register(MyType.class, new MyTypeSerializer());Сигнатура та же, поменялась только точка доступа. api.serializers() возвращает ту же коллекцию NodeSerializers.
Хендлеры (экономика/права/уровни/плейсхолдеры/скины)
Заголовок раздела «Хендлеры (экономика/права/уровни/плейсхолдеры/скины)»Статический Handlers выпилен. Каждая секция теперь - ProviderSection<T> на api.providers():
Handlers.setEconomyHandler(new MyEconomy());api.providers().economy().register("myEcoId", new MyEconomy(), 100, this);
Handlers.getEconomyHandler();api.providers().economy().resolve();
Handlers.getPermissionsHandler();api.providers().permissions().resolve();
Handlers.getLevelHandler();api.providers().levels().resolve();
Handlers.getPlaceholderHandler();api.providers().placeholders().resolve();
Handlers.getSkinHandler();api.providers().skins().resolve();В 2.0 в одной секции может жить несколько провайдеров - поэтому регистрация принимает id и priority. Операторы фиксируют id из config.conf (providers.economy = "vault" или "playerpoints"), а меню могут точечно перебивать выбор через provider: "...". Поведение 1.x (“побеждает единственный провайдер”) тоже работает - когда он один.
Переменные
Заголовок раздела «Переменные»VariableManager vm = AbstractMenusProvider.get().getVariableManager();VariableManager vm = api.variables();Сигнатуры остались такими же - createBuilder(), saveGlobal(), операции на игрока - но методы для игрока переименованы: savePlayer → savePersonal, getPlayer → getPersonal, deletePlayer → deletePersonal. Поправь вызовы.
Жизненный цикл меню
Заголовок раздела «Жизненный цикл меню»AbstractMenusProvider.get().reloadMenus();api.loadMenus();
AbstractMenusProvider.get().openMenu(player, menu);api.openMenu(player, menu);Обе формы остаются: двухаргументная (player + menu) и четырёхаргументная (activator + ctx + player + menu).
Планировщик на Folia
Заголовок раздела «Планировщик на Folia»1.x вышел ещё до Folia. Если ты гонял задачи через Bukkit.getScheduler().runTaskLater(plugin, ...) и аддон должен жить на Folia, переезжай на entity-aware планировщик для всего, что трогает игрока или другую сущность:
Bukkit.getScheduler().runTaskLater(plugin, () -> player.kick(reason), 20L);BukkitTasks.runForEntityLater(player, () -> player.kick(reason), 20L);BukkitTasks живёт в plugin-модуле, не в api jar, - импортируй из ru.abstractmenus.util.bukkit.BukkitTasks. Если на plugin-модуль не завязан, ветвись сам по детекту Folia и зови Bukkit.getRegionScheduler()/getEntityScheduler() напрямую.
Координата Maven/Gradle
Заголовок раздела «Координата Maven/Gradle»compileOnly 'com.github.AbstractMenus:api:1.16'compileOnly 'com.github.AbstractMenus:minecraft-plugin:2.0.0-alpha.2'artifactId - minecraft-plugin: JitPack публикует мульти-модульные Gradle-проекты под одной корневой координатой (имя репозитория). Внутри jar - модуль api.
Если у тебя GitHub Packages, а не JitPack, родная координата - ru.abstractmenus:api:2.0.0-alpha.2. Подробная настройка - в С чего начать.
Что ушло насовсем
Заголовок раздела «Что ушло насовсем»| Убрано | Заменено на |
|---|---|
AbstractMenusPlugin | AbstractMenusApi |
AbstractMenusProvider | AbstractMenusApi.get() |
Types (статический фасад) | api.actions()/api.rules()/api.activators()/api.itemProperties()/api.catalogs()/api.serializers() |
Handlers (статический фасад) | api.providers().<section>(), возвращающий ProviderSection<T> |
| Adventure в составе плагина | Бери встроенный в Paper (compileOnly Paper API) |