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.
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 описывают разные переходы жизненного цикла. Прежде чем считать любое удаление убийством или наградой, изучите событие и вызывающий его код.
Получение отслеживаемой сущности
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:
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. Из корня репозитория выполните:
.\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.