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

Java API EliteMobs

Сгенерированный справочник Java содержит классы, методы и сигнатуры с поиском, а также версию исходников и коммит каждого модуля.

Руководство описывает API EliteMobs 10.9. Текущая публичная Maven-версия — com.magmaguy:EliteMobs:10.9.13. Используйте область provided или compileOnly и объявите depend: [EliteMobs]. Версия зависимости должна соответствовать установленному плагину. Настройка Maven и Gradle приведена в указателе для разработчиков.

Точки входа​

Пакет или типНазначение
com.magmaguy.elitemobs.apiСобытия Bukkit для боя, заданий, NPC, телепортации, подземелий и инициализации
com.magmaguy.elitemobs.api.instancedСобытия жизненного цикла матчей в экземплярах
com.magmaguy.elitemobs.api.utils.EliteItemManagerОпределение элитных предметов, их уровня, урона и защиты
com.magmaguy.elitemobs.entitytracker.EntityTrackerПолучение отслеживаемой сущности EliteMobs по сущности Bukkit
com.magmaguy.elitemobs.api.power.EliteLuaPowerServiceРегистрация и назначение Lua-способностей через среду EliteMobs
com.magmaguy.elitemobs.api.mind.EliteMindServiceРегистрация Lua-программ Mind и создание персонажей, которые их выполняют

EliteEntity, CustomBossEntity и RegionalBossEntity представляют действующих персонажей, которыми владеет плагин. Они раскрывают больше деталей реализации, чем события. Храните ссылки только пока персонаж существует и не изменяйте коллекции трекера напрямую.

Прослушивание награды XP навыка​

Этот полный класс плагина отменяет выдачу боевого XP навыков игрокам с правом вашей интеграции example.blockskillxp. Укажите полное имя класса в поле main собственного plugin.yml.

SkillXpIntegration.java
package example;

import com.magmaguy.elitemobs.api.EliteSkillXpGainEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public final class SkillXpIntegration extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}

@EventHandler(ignoreCancelled = true)
public void onSkillXp(EliteSkillXpGainEvent event) {
if (event.getPlayer().hasPermission("example.blockskillxp")) {
event.setCancelled(true);
}
}
}

EliteSkillXpGainEvent вызывается синхронно после проверок права на боевую награду и применения штатных множителей и множителей разрешений. getOriginalXp() возвращает значение при создании события; getXp() учитывает изменения предыдущих слушателей. setXp(long) отклоняет отрицательные значения. Отмена или итоговый ноль подавляют награду и сообщение о её получении.

EliteMobs применяет принятое значение, сохраняет данные и обрабатывает эффекты повышения уровня. Не записывайте XP игрока отдельно из этого слушателя. Административное изменение XP и классовый XP идут другими путями и не относятся к боевой награде навыка в этом событии.

У других событий свои правила. В частности, отмена EliteMobSpawnEvent предотвращает создание и удаляет исходную живую сущность, а не оставляет обычного моба. EliteMobDeathEvent и EliteMobRemoveEvent описывают разные переходы жизненного цикла. Прежде чем считать любое удаление убийством или наградой, изучите событие и вызывающий его код.

Получение отслеживаемой сущности​

Lookup inside your integration
EliteEntity elite = EntityTracker.getEliteMobEntity(bukkitEntity);
if (elite == null) {
return;
}

Импортируйте com.magmaguy.elitemobs.entitytracker.EntityTracker и com.magmaguy.elitemobs.mobconstructor.EliteEntity. Поиск может вернуть null: сущность Bukkit не обязательно является отслеживаемым сейчас EliteMob. Передавайте существующую сущность Bukkit, отличную от null, и выполняйте поиск в серверном потоке.

Для снаряжения начните с EliteItemManager.isEliteMobsItem(itemStack) и метода для нужной величины, например getItemLevel, getEliteDefense или getTotalDPS. Это разные величины; уровень предмета не равен окончательному урону. Проверяйте обработку null каждым методом, не предполагая, что все методы принимают пустой предмет.

Инициализация и перезагрузка​

EliteMobs сначала выполняет асинхронную инициализацию, затем инициализацию в серверном потоке. После успешной последовательности вызывается EliteMobsInitializedEvent, в том числе при соответствующей перезагрузке. Регистрируйте слушатели достаточно рано, чтобы получить событие. Интеграции, включённые после него, должны также учитывать уже завершённую инициализацию.

Ссылки на сущности, назначения и сохранённые сервисы могут устареть при перезагрузке. Получайте нужные объекты заново после завершения инициализации. Не вызывайте onEnable, onDisable или остановку MagmaCore от имени EliteMobs.

Интеграция Lua-способностей​

После инициализации EliteMobs получите сервис через Bukkit:

Service lookup
EliteLuaPowerService powers = Bukkit.getServicesManager()
.load(EliteLuaPowerService.class);
if (powers == null) {
return;
}

Импортируйте org.bukkit.Bukkit и com.magmaguy.elitemobs.api.power.EliteLuaPowerService. Если сервиса нет, считайте его недоступным, а не создавайте реализацию самостоятельно.

registerLuaPower(owner, key, revision, source) регистрирует программу, принадлежащую вашему плагину. setPowers(owner, eliteEntity, orderedPowerKeys) заменяет весь набор способностей персонажа новыми средами выполнения в указанном порядке. Каждый ключ должен принадлежать этому владельцу; повторяющиеся ключи отклоняются. Операция не дополняет существующие способности босса. При обработке событий способности выполняются по возрастанию executionPriority(), а указанный порядок используется только при равенстве приоритетов.

inspectPowers возвращает управляемые сервисом программы в порядке назначения. inspectPowerActivity показывает их текущую активность. unregisterOwner(owner) удаляет записи владельца из каталога и отсоединяет его среды выполнения от активных персонажей. Вызывайте его при отключении интеграции, пока сервис доступен.

Все изменения выполняются в серверном потоке. Сервис намеренно не передаёт типы скриптов MagmaCore между загрузчиками классов плагинов. Передавайте типы API EliteMobs, а не объекты из собственной встроенной копии MagmaCore.

Описание Lua-хуков и контента находится в общем справочнике скриптов. Java-сервис координирует назначение и владение, а жизненным циклом способностей по-прежнему управляет EliteMobs.

Lua-программы Mind​

com.magmaguy.elitemobs.api.mind.EliteMindService выполняет написанный на Lua ИИ для персонажей EliteMobs. Получайте его из менеджера сервисов Bukkit после EliteMobsInitializedEvent, как и сервис способностей. EliteMobs регистрирует его только тогда, когда NMS-адаптер сервера поддерживает нативные Mind; в противном случае поиск возвращает null.

Регистрируйте модули через registerLuaModule(owner, key, revision, source) раньше использующих их программ, затем регистрируйте программы через registerLuaProgram. Пространство имён каждого ключа должно принадлежать вашему плагину, а id и ревизия в Lua-определении должны совпадать с переданными ключом и ревизией. Id программы не может совпадать с id одного из её модулей. Повторная идентичная регистрация ничего не делает. Для изменённого исходного кода нужна более высокая ревизия. Формат Lua, включая settings модуля, которые EliteMobs не читает, описан в разделе Программы поведения.

spawn(EliteMindSpawnRequest) создаёт персонажа на нативном теле Mind, выполняющем запрошенную программу, с уровнем 1 или выше. setProgram меняет программу у персонажа, у которого уже есть тело Mind; обычных элитных мобов он не преобразует. setPaused останавливает и возобновляет тики Mind и обратные вызовы способностей персонажа, inspect возвращает текущее состояние, а clearProgram удаляет персонажа. registerNaturalSpawnProvider позволяет вашему плагину оставить, подавить или заменить естественное появление элитных мобов до собственного случайного преобразования EliteMobs. unregisterOwner(owner) удаляет ваши модули, программы и провайдеры, а также персонажей, которые всё ещё выполняют ваши программы.

Действия Mind доходят до назначенных персонажу способностей через on_mind_action. Java-интеграции также могут обрабатывать действие для одной из своих способностей через EliteLuaPowerService.registerActionHandler; Lua-хуки получают возможность принять его первыми. Lua-сторона описана в разделе Контекст программы Mind.

Сборка из исходного кода​

Репозиторий EliteMobs собирается с Gradle 9.1.0 и тулчейном JDK 21. В него входит Gradle wrapper для Windows. Из корня репозитория выполните:

Windows
.\gradlew.bat shadowJar

В репозитории нет скрипта gradlew для Unix. В других системах установите версию Gradle, указанную в gradle/wrapper/gradle-wrapper.properties, и выполните gradle shadowJar.

Разворачиваемый плагин — build/libs/EliteMobs.jar. build/libs/EliteMobs-min.jar содержит только классы EliteMobs и не является работающим плагином. Если задана переменная окружения MC_DIST_DIR или свойство Gradle mcDistDir, сборка также копирует EliteMobs.jar в эту папку.

Jar включает (shaded) MagmaCore, bStats и commons-io. MagmaCore, его среда выполнения Lua, его библиотека reflections и easyminecraftgoals перемещены под com.magmaguy.elitemobs, поэтому EliteMobs несёт собственную копию отдельно от других плагинов, включающих MagmaCore. bStats перемещён в com.magmaguy.shaded.bstats. Сборка разрешает com.magmaguy:MagmaCore:2.2.0-SNAPSHOT из Maven Local раньше, чем из Maven-репозитория MagmaGuy; -PmagmacoreVersion=<version> выбирает другую опубликованную версию MagmaCore. Если исходному коду нужны изменения MagmaCore новее опубликованной сборки, сначала опубликуйте MagmaCore в Maven Local, как описано в разделе Сборка потребителя после изменений библиотеки. То же относится к локально изменённому FreeMinecraftModels, против которого сборка компилируется как против версии 2.12.2.

Задача test компилирует и запускает тесты на тулчейне JDK 25, потому что тестовому API Paper нужна Java 25. Сам плагин нацелен на Java 21.