EliteMobs-Java-API
Die generierte Java-Referenz enthält durchsuchbare Klassen, Methoden und Signaturen sowie die Quellversion und den Commit jedes Moduls.
Dieser Leitfaden behandelt die EliteMobs-API 10.9. Die aktuelle öffentliche Maven-Version ist com.magmaguy:EliteMobs:10.9.13. Verwende den Gültigkeitsbereich provided oder compileOnly und deklariere depend: [EliteMobs]. Wähle die Abhängigkeit passend zum installierten Plugin. Die Einrichtung für Maven und Gradle findest du im Entwicklerverzeichnis.
Einstiegspunkte
| Paket oder Typ | Zweck |
|---|---|
com.magmaguy.elitemobs.api | Bukkit-Events für Kampf, Quests, NPCs, Teleports, Dungeons und Initialisierung |
com.magmaguy.elitemobs.api.instanced | Lebenszyklus-Events instanzierter Matches |
com.magmaguy.elitemobs.api.utils.EliteItemManager | Helfer für Elite-Item-Erkennung, Level, Schaden und Verteidigung |
com.magmaguy.elitemobs.entitytracker.EntityTracker | Eine Bukkit-Entity in ihre erfasste EliteMobs-Entity auflösen |
com.magmaguy.elitemobs.api.power.EliteLuaPowerService | Lua-Powers über die EliteMobs-Laufzeit registrieren und zuweisen |
com.magmaguy.elitemobs.api.mind.EliteMindService | Lua-Mind-Programme registrieren und Akteure spawnen, die sie ausführen |
EliteEntity, CustomBossEntity und RegionalBossEntity repräsentieren aktive Akteure, die dem Plugin gehören. Sie geben mehr Implementierungsdetails preis als die Event-Verträge. Behalte Referenzen nur so lange, wie der Akteur existiert, und ändere Tracker-Sammlungen nicht direkt.
Auf Fertigkeits-XP-Vergaben reagieren
Diese vollständige Plugin-Klasse verhindert die Vergabe von Kampffertigkeits-XP für Spieler mit der Berechtigung example.blockskillxp deiner Integration. Trage ihren vollqualifizierten Klassennamen als main in deine eigene plugin.yml ein.
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 läuft synchron nach den Prüfungen der Kampfberechtigung und der Anwendung nativer sowie berechtigungsabhängiger Multiplikatoren. getOriginalXp() liefert den Betrag beim Erstellen des Events; getXp() enthält Änderungen früherer Listener. setXp(long) lehnt negative Werte ab. Ein Abbruch oder ein endgültiger Betrag von null verhindert die Vergabe und ihre Rückmeldung.
EliteMobs übernimmt den angenommenen Betrag, speichert ihn und wendet Levelaufstiegseffekte an. Schreibe Spieler-XP nicht zusätzlich in diesem Listener. Administrative XP-Änderungen und Klassen-XP verwenden eigene Pfade und entsprechen nicht der Kampffertigkeitsvergabe dieses Events.
Andere Events haben eigene Verträge. Insbesondere verhindert ein Abbruch von EliteMobSpawnEvent die Erstellung und entfernt die zugrunde liegende lebende Entity; es bleibt kein gewöhnlicher Mob zurück. EliteMobDeathEvent und EliteMobRemoveEvent beschreiben unterschiedliche Lebenszyklusübergänge. Prüfe das Event und seinen auslösenden Code, bevor du jede Entfernung als Tötung oder Belohnung behandelst.
Eine erfasste Entity auflösen
EliteEntity elite = EntityTracker.getEliteMobEntity(bukkitEntity);
if (elite == null) {
return;
}
Importiere com.magmaguy.elitemobs.entitytracker.EntityTracker und com.magmaguy.elitemobs.mobconstructor.EliteEntity. Die Suche kann null liefern; eine Bukkit-Entity ist nicht zwingend ein aktuell erfasster EliteMob. Übergib eine vorhandene Bukkit-Entity ungleich null und führe die Suche auf dem Server-Thread aus.
Beginne bei Ausrüstung mit EliteItemManager.isEliteMobsItem(itemStack) und dem Helfer für die tatsächlich benötigte Größe, beispielsweise getItemLevel, getEliteDefense oder getTotalDPS. Diese Größen unterscheiden sich; das Level eines Items ist nicht sein endgültiger Schaden. Prüfe die Null-Behandlung jeder Methode, statt anzunehmen, dass jeder Helfer ein leeres Item akzeptiert.
Initialisierung und Neuladen
EliteMobs initialisiert zunächst asynchron und anschließend auf dem Server-Thread. EliteMobsInitializedEvent wird nach erfolgreichem Abschluss ausgelöst, einschließlich der entsprechenden Initialisierung beim Neuladen. Registriere Listener früh genug, um es zu empfangen. Integrationen, die erst danach aktiviert werden, müssen außerdem berücksichtigen, dass das Plugin bereits initialisiert ist.
Entity-Referenzen, Zuweisungen und zwischengespeicherte Dienste können beim Neuladen veralten. Beziehe die von deiner Integration benötigten Referenzen nach Abschluss der Initialisierung erneut. Rufe weder onEnable oder onDisable noch das Herunterfahren von MagmaCore im Namen von EliteMobs auf.
Lua-Power-Integration
Beziehe den Dienst nach der EliteMobs-Initialisierung über Bukkit:
EliteLuaPowerService powers = Bukkit.getServicesManager()
.load(EliteLuaPowerService.class);
if (powers == null) {
return;
}
Importiere org.bukkit.Bukkit und com.magmaguy.elitemobs.api.power.EliteLuaPowerService. Behandle einen fehlenden Dienst als nicht verfügbar, statt seine Implementierung selbst zu erzeugen.
registerLuaPower(owner, key, revision, source) registriert ein Programm, das deinem Plugin gehört. setPowers(owner, eliteEntity, orderedPowerKeys) ersetzt die vollständige Power-Sammlung des Akteurs durch neue Laufzeitinstanzen in der angegebenen Reihenfolge. Jeder Schlüssel muss diesem Besitzer gehören; doppelte Schlüssel werden abgelehnt. Die Operation hängt keine Powers an die vorhandenen Powers des Bosses an. Bei der Event-Verteilung laufen Powers aufsteigend nach executionPriority(); die angegebene Reihenfolge entscheidet nur bei Gleichstand.
inspectPowers liefert die vom Dienst verwalteten Programme in Zuweisungsreihenfolge. inspectPowerActivity zeigt ihre Laufzeitaktivität. unregisterOwner(owner) entfernt die Katalogeinträge des Besitzers und löst seine Laufzeitinstanzen von aktiven Akteuren; verwende dies beim Deaktivieren deiner Integration, solange der Dienst verfügbar ist.
Alle Änderungen laufen auf dem Server-Thread. Der Dienst gibt bewusst keine MagmaCore-Skriptingtypen über Plugin-Classloader-Grenzen hinweg weiter. Übergib EliteMobs-API-Typen statt Objekten aus einer privat eingebetteten MagmaCore-Kopie.
Lua-Hooks und selbst erstellte Inhalte sind in der gemeinsamen Skriptingreferenz beschrieben. Der Java-Dienst koordiniert Zuweisung und Besitz; EliteMobs verwaltet weiterhin den Power-Lebenszyklus.
Lua-Mind-Programme
com.magmaguy.elitemobs.api.mind.EliteMindService führt in Lua geschriebene KI auf EliteMobs-Akteuren aus. Lade den Dienst wie den Power-Dienst nach EliteMobsInitializedEvent über den Services-Manager von Bukkit. EliteMobs registriert ihn nur, wenn der NMS-Adapter des Servers native Minds unterstützt; andernfalls liefert die Suche null.
Registriere Module mit registerLuaModule(owner, key, revision, source) vor den Programmen, die sie verwenden, und registriere danach die Programme mit registerLuaProgram. Der Namensraum jedes Schlüssels muss deinem Plugin gehören, und ID und Revision der Lua-Definition müssen mit dem übergebenen Schlüssel und der Revision übereinstimmen. Die ID eines Programms darf nicht die ID eines seiner Module sein. Eine identische Registrierung zu wiederholen bewirkt nichts. Geänderter Quellcode benötigt eine höhere Revision. Das Lua-Format, einschließlich der Modul-settings, die EliteMobs nicht liest, ist unter Verhaltensprogramme beschrieben.
spawn(EliteMindSpawnRequest) erstellt einen Akteur auf einem nativen Mind-Körper, der das angeforderte Programm ausführt, mit einem Level von 1 oder höher. setProgram tauscht das Programm eines Akteurs aus, der bereits einen Mind-Körper hat; gewöhnliche Elites werden dadurch nicht umgewandelt. setPaused hält Mind-Ticks und die Power-Callbacks des Akteurs an und setzt sie fort, inspect liefert den aktuellen Zustand und clearProgram entfernt den Akteur. Mit registerNaturalSpawnProvider kann dein Plugin natürliche Elite-Spawns vor der eigenen zufälligen Umwandlung durch EliteMobs unverändert lassen, unterdrücken oder ersetzen. unregisterOwner(owner) entfernt deine Module, Programme und Provider sowie die Akteure, die noch deine Programme ausführen.
Mind-Aktionen erreichen die zugewiesenen Powers des Akteurs über on_mind_action. Java-Integrationen können eine Aktion für eine ihrer Powers außerdem mit EliteLuaPowerService.registerActionHandler behandeln; Lua-Hooks erhalten zuerst die Gelegenheit, sie anzunehmen. Die Lua-Seite ist im Mind-Programmkontext beschrieben.
Aus dem Quellcode bauen
Das EliteMobs-Repository wird mit Gradle 9.1.0 und einer JDK-21-Toolchain gebaut. Es enthält den Gradle-Wrapper für Windows. Führe im Stammverzeichnis des Repositorys Folgendes aus:
.\gradlew.bat shadowJar
Das Repository hat kein Unix-Skript gradlew. Installiere auf anderen Systemen die Gradle-Version aus gradle/wrapper/gradle-wrapper.properties und führe gradle shadowJar aus.
Das auslieferbare Plugin ist build/libs/EliteMobs.jar. build/libs/EliteMobs-min.jar enthält nur die EliteMobs-Klassen und ist kein funktionierendes Plugin. Ist die Umgebungsvariable MC_DIST_DIR oder die Gradle-Property mcDistDir gesetzt, kopiert der Build EliteMobs.jar zusätzlich in diesen Ordner.
Die JAR bindet MagmaCore, bStats und commons-io per Shading ein. MagmaCore, seine Lua-Laufzeit, seine Reflections-Bibliothek und easyminecraftgoals werden nach com.magmaguy.elitemobs verschoben (Relocation), sodass EliteMobs eine eigene Kopie trägt, getrennt von anderen Plugins, die MagmaCore per Shading einbinden. bStats wird nach com.magmaguy.shaded.bstats verschoben. Der Build löst com.magmaguy:MagmaCore:2.2.0-SNAPSHOT zuerst aus Maven Local und danach aus dem Maven-Repository von MagmaGuy auf; -PmagmacoreVersion=<version> wählt eine andere veröffentlichte MagmaCore-Version. Braucht der Quellcode MagmaCore-Änderungen, die neuer sind als der veröffentlichte Build, veröffentliche MagmaCore zuerst in Maven Local, wie unter Verbraucher nach Bibliotheksänderungen bauen beschrieben. Dasselbe gilt für ein lokal geändertes FreeMinecraftModels, gegen das der Build als Version 2.12.2 kompiliert.
Der Task test kompiliert und führt die Tests auf einer JDK-25-Toolchain aus, weil die Paper-Test-API Java 25 braucht. Das Plugin selbst zielt auf Java 21.