Zum Hauptinhalt springen

Kräfte erstellen

webapp_banner.jpg

Zwei Wege, eine Kraft zu schreiben​

Dateibasierte Kräfte liegen in plugins/EliteMobs/powers, einschließlich Unterordnern. Es gibt zwei Formate:

FormatDateiWofür du es verwendest
Lua*.luaSkriptverhalten mit Boss-Hooks, Schleifen und Zustand. Die meisten mitgelieferten Kräfte verwenden dieses Format.
EliteScript*.ymlDas deklarative Event-/Aktions-Format, das auf dem Rest dieser Seite dokumentiert ist. Weiterhin vollständig unterstützt.

Von den 71 mitgelieferten Kräften verwenden 68 Lua. Nur bonus_coins.yml, custom_summon.yml und elite_script.yml verbleiben als YAML-gestützte Java-Kräfte. Beginne für neues Skriptverhalten bei Lua: Erste Schritte und Boss-Hooks & Lebenszyklus.

Beide Formate werden von einem Boss auf dieselbe Weise referenziert, über die powers-Liste.

Verwende über alle Unterordner hinweg eindeutige Dateinamen. Die Registrierung verwendet den Dateinamen, keinen Pfad mit Ordnernamen; Unterordner trennen doppelte Namen daher nicht. Haben zwei Dateien denselben Namen, lädt EliteMobs diejenige, deren vollständiger Pfad in der Sortierung zuerst kommt, und protokolliert für die andere Duplicate content filename, sofern die beiden Dateien nicht denselben Inhalt haben. Führe nach Änderungen /em reload aus und prüfe die Ladewarnungen.

Eine .lua-Kraft hat Vorrang vor einer gleichnamigen .yml-Kraft

Wenn ein Boss attack_fire.yml anfordert, sucht EliteMobs zuerst nach einer erfolgreich geladenen attack_fire.lua. Dasselbe gilt für eine .yaml-Anforderung. Alte Verweise bleiben so gültig, wenn der Lua-Ersatz geladen wird. Neue Konfigurationen sollten die .lua-Datei direkt benennen. Beachte die Groß-/Kleinschreibung des registrierten Dateinamens.

Vorgefertigte .lua-Dateien werden einmal geschrieben, bearbeitete Dateien werden nie überschrieben

Jede mitgelieferte Lua-Kraft wird nur geschrieben, wenn unter powers keine passende Datei gefunden wurde. Behebt ein Update einen Fehler in einer mitgelieferten Kraft, führt EliteMobs die Prüfsummen früherer mitgelieferter Versionen. Eine unbearbeitete Kopie, die einer davon entspricht, wird nach plugins/MagmaCore/outdated files/EliteMobs/ verschoben, und die aktuelle Version wird beim selben Start geschrieben. Eine von dir bearbeitete Datei entspricht nie einer dieser Prüfsummen; sie bleibt daher unverändert und erhält keine neueren Korrekturen. Gib veränderten Kopien eigene Dateinamen und vergleiche erhaltene vorgefertigte Dateien mit der Version, die du verwenden möchtest.

Lua-Zonen lösen on_zone_enter / on_zone_leave nicht aus

Beide Hook-Namen werden akzeptiert, aber das Erstellen einer Lua-Zone löst sie nicht aus. Die eingebaute Quelle ist ein EliteScript-Zonen-Listener. Er startet, wenn ein YAML-Skript desselben Bosses ZoneEnterEvent oder ZoneLeaveEvent unter Events: auflistet und eine verwendbare Zone definiert. Diese Ereignisse erreichen alle passenden Kräfte dieses Bosses und geben nicht an, welche YAML-Zone sie ausgelöst hat. Die Hooks auf einem reinen Lua-Boss zu deklarieren reicht nicht aus.

Baue keine Lua-Kraft um diese beiden Hooks herum, sofern du sie nicht bewusst mit einem solchen YAML-Zonenskript kombinierst. Verwende stattdessen context.zones:watch_zone(...) (dessen eigene on_enter-/on_leave-Callbacks direkt aufgerufen werden), einen EliteScript-Zone-Block oder Polling aus on_game_tick. Siehe Hooks & Lebenszyklus und Script-Events.

EliteMobs-Skriptsystem​

Der Rest dieser Seite beschreibt, wie du Elite-Skripte erstellst!

Dies ist eine fortgeschrittene Funktion und erfordert eingehende Kenntnisse von EliteMobs.

Hinweis: Elite-Skripte können als Kraft-Dateien oder in benutzerdefinierten Boss-Dateien hinzugefügt werden! Kraft-Dateien kannst du wie gewohnt als normale Kräfte über die Einstellung powers eines benutzerdefinierten Bosses zuweisen.

Ein EliteScript hinzufügen​

Um ein EliteScript zu einem Boss hinzuzufügen, ergänze die Boss-Datei um folgenden Eintrag:

eliteScript:

Hinweis: Bei den folgenden Angaben sind Groß-/Kleinschreibung und Leerzeichen entscheidend! Achte darauf, dass Leerzeichen, Zeilenumbrüche und die gesamte Formatierung den Beispielen entsprechen!

Nachdem du den Skriptanfang deklariert hast, kannst du dein konkretes Skript hinzufügen. Für dieses Beispiel erstellen wir ein Skript namens Example:

eliteScript:
Example:

EliteScripts haben fünf Abschnitte: Events, Conditions, Zone, Actions und Cooldowns. Gib eine nicht leere Actions-Liste an, damit das Skript etwas ausführt. Für Skripte, die andere Skripte oder Landungs-Callbacks aufrufen, kannst du Events weglassen; ohne Aufrufer läuft ein solches Skript nicht selbstständig. Conditions und Cooldowns sind Schlüssel-Wert-Strukturen, keine Listen.

Sehen wir uns ein einfaches Beispiel an:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20

Bei einem passenden Spielertreffer stößt dieses Skript den Elite nach oben und startet einen lokalen Cooldown von 60 Ticks sowie einen globalen von 20 Ticks. Bei 20 TPS sind das drei Sekunden und eine Sekunde. Der globale Cooldown wirkt nur auf Kräfte, die ihn prüfen; er blockiert nicht jeden Hook oder jede Aktion. Ereignisgesteuerte YAML-Skripte prüfen Cooldowns, wenn ihr lokaler oder ihr globaler Wert positiv ist. Das Verhalten aufgerufener Skripte beschreibt die unten verlinkte Cooldown-Anleitung.

Jetzt kennst du den allgemeinen Aufbau von Skripten. Als Nächstes lernst du, was du mit jedem Abschnitt tun kannst!


Ereignisse

Ereignisse

Klicke auf den obigen Link, um zu erfahren, wie du Ereignisse verwendest!

Ziele

Ziele

Klicke auf den obigen Link, um zu erfahren, wie du Ziele verwendest!

Aktionen

Aktionen

Klicke auf den obigen Link, um zu erfahren, wie du Aktionen verwendest!

Zonen

Zonen

Klicke auf den obigen Link, um zu erfahren, wie du Zonen verwendest!

Bedingungen

Bedingungen

Klicke auf den obigen Link, um zu erfahren, wie du Bedingungen verwendest!

Cooldowns

Cooldowns

Klicke auf den obigen Link, um zu erfahren, wie du Cooldowns verwendest!


Mehrere EliteScripts hinzufügen​

Du kannst mehrere Aktionen für ein Ereignis haben. Wenn du mehrere Skripte für denselben Boss möchtest, erstelle einfach einen neuen Skripteintrag! Erweitern wir das vorherige Beispiel um ein weiteres Skript:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

Example2 setzt den verletzten Spieler mit DIRECT_TARGET für 20 Ticks in Brand. Sein lokaler Cooldown von 200 Ticks verhindert bei 20 TPS zehn Sekunden lang eine erneute ereignisgesteuerte Ausführung dieses Skripts. Sein globaler Cooldown von 60 Ticks wird mit Kräften geteilt, die den Cooldown des Bosses prüfen. Andere Skripte können unabhängig davon weiterhin Feuer anwenden.

Eigenständige Kräfte erstellen​

Lege eigenständige YAML-Kräfte in plugins/EliteMobs/powers ab. Der Block eliteScript enthält das Verhalten; die folgenden optionalen Metadatenfelder steuern Laden, Kategorie, Anzeige und Cooldown-Metadaten. Beispiel:

isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20

isEnabled​

Legt fest, ob die konfigurierte Kraft aktiviert ist; der Standardwert ist true. Bei eigenem Lua verhindert eine deaktivierte zugehörige Metadatendatei die Erkennung dieser Lua-Datei. Eine mitgelieferte Lua-Kraft wird mit einer deaktivierten zugehörigen Datei trotzdem geladen, aber als deaktiviert markiert, wie unten beschrieben.

powerType​

Der Krafttyp liefert Kategorie-Metadaten für Standardlisten und die Einordnung in die Anzeigeringe. Die Werte sind:

  • UNIQUE: Für ausdrückliche Zuweisung vorgesehen. Wird aus automatisch erzeugten gemeinsamen Listen ausgeschlossen, kann aber ausdrücklich in eine Liste natürlicher Kräfte eingetragen werden.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE: Werden zum Erzeugen der passenden gemeinsamen Liste verwendet, wenn diese fehlt. Die Vergabe hängt von den konfigurierten Listen, dem Aktivierungsstatus und dem Mob-Level ab.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST: Diese fünf zählen als Hauptkräfte, alle anderen als Nebenkräfte. Die natürliche Vergabe verwendet die majorPowers-Liste der Entität; zur Laufzeit wird nicht geprüft, ob das Typsuffix zur Entität passt.

Wie powerType natürliche Elites erreicht: EliteMobPowers.yml​

Natürliche Elites würfeln aus plugins/EliteMobs/EliteMobPowers.yml, nicht allein anhand von powerType. Die Datei enthält:

SchlüsselBedeutung
defensivePowersDefensive Kräfte, die natürliche Elites zufällig würfeln können
offensivePowersOffensive Kräfte, die natürliche Elites zufällig würfeln können
miscellaneousPowersSonstige Kräfte, die natürliche Elites zufällig würfeln können
majorPowers.<ENTITY_TYPE>Hauptkräfte, die dieser Entitätstyp zufällig würfeln kann
disabledPowers.<ENTITY_TYPE>Kräfte, die diesem Entitätstyp nach Anwendung der gemeinsamen Listen wieder entzogen werden

Fehlende gemeinsame Listen für defensive, offensive und sonstige Kräfte werden mit geladenen Kräften des passenden Typs befüllt. Die Standard-Hauptkräfte werden ausdrücklich pro Entitätstyp ausgewählt. Vorhandene Listen bleiben erhalten. Eine später hinzugefügte Kraft gelangt daher nicht automatisch hinein; bearbeite die passende Liste selbst. Umgekehrt kann eine eigene Lua-Kraft, die beim Erzeugen einer fehlenden Liste sonstiger Kräfte vorhanden ist, in diesen Standardpool gelangen.

In diesen Listen werden sowohl .lua-Dateinamen als auch alte .yml-Namen akzeptiert; die erzeugten Standardwerte werden mit dem .yml-Alias geschrieben. Ein Name, der zu keiner Kraft aufgelöst werden kann, wird mit einer Konsolenwarnung übersprungen, die Datei und Schlüssel nennt.

Plätze für natürliche Kräfte werden für defensive, offensive, sonstige und Hauptkräfte auf Level 10, 20, 30 beziehungsweise 40 freigeschaltet. Ein zweiter Platz je Kategorie folgt auf Level 50, 60, 70 und 80. Leere oder deaktivierte Listen können zu weniger Kräften führen. Das Bearbeiten der Listen ändert nicht die Einordnung einer Kraft als Haupt- oder Nebenkraft.

effect​

Legt das Material des Gegenstands im umlaufenden Anzeigering der Kraft fest. MAJOR_*-Typen verwenden den Hauptring, andere Typen den Nebenring. Der Wert muss ein Gegenstandsmaterial sein oder ein Partikelname, der keine zusätzlichen Daten benötigt und dann stattdessen als Partikel umläuft. Jeder andere Wert deaktiviert den Effekt und protokolliert Disabled invalid power trail.

Eine Kraft ohne effect oder mit leerem Wert trägt keinen Gegenstand zum Ring bei. Das ist der Standard für eigene Lua-Kräfte ohne effect in ihrer optionalen YAML-Metadatendatei.

Eigenständige YAML-EliteScripts übernehmen diese Metadaten derzeit nicht in ihre Laufzeitspur. effect auf einer solchen YAML-Kraft fügt daher keinen Gegenstand zum Anzeigering hinzu. Eigene Lua-Kräfte übernehmen dagegen effect aus ihrer zugehörigen Datei.

SchlüsselWerteStandard
effectMaterialkeines

powerCooldown​

Legt den Cooldown der Kraft-Metadaten in Ticks fest. YAML-EliteScripts verwenden ihre eigenen Werte Cooldowns.local und Cooldowns.global, die diese Metadatenwerte bei der Skriptinitialisierung ersetzen. Lua-Kräfte müssen die dokumentierte Cooldown-API zum Prüfen und Setzen ihrer Cooldowns verwenden.

SchlüsselWerteStandard
powerCooldownInteger0

globalCooldown​

Legt die globalen Cooldown-Metadaten in Ticks fest. Ein globaler Cooldown blockiert nur Kräfte, die ihn prüfen; er sperrt nicht bedingungslos jeden Hook oder jede Aktion. Konfiguriere bei YAML-Skripten deren eigenen Abschnitt Cooldowns.

SchlüsselWerteStandard
globalCooldownInteger0

Eigenständige Lua-Kräfte erstellen​

Eine eigenständige Lua-Kraft ist eine .lua-Datei in plugins/EliteMobs/powers (einschließlich Unterordnern). Eine YAML-Metadatendatei ist optional.

return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}

Ohne eine .yml-Metadatendatei mit demselben Basisnamen im selben Verzeichnis erhält eine eigene Lua-Kraft folgende Standardwerte:

  • powerType ist MISCELLANEOUS.
  • effect ist nicht gesetzt.

Für eine eigene my_power.lua kannst du daneben my_power.yml mit isEnabled, powerType, effect, powerCooldown und globalCooldown anlegen. Beispielsweise hält powerType: UNIQUE sie aus dem Standardpool sonstiger Kräfte heraus. Eine deaktivierte Metadatendatei verhindert das Laden dieser eigenen Lua-Datei.

Eine .yml- oder .yaml-Datei mit demselben Basisnamen neben einer mitgelieferten vorgefertigten Lua-Kraft gilt ebenfalls für diese. Ihre Werte für isEnabled, effect, powerCooldown und globalCooldown ersetzen die eingebauten Werte, einschließlich der Standardwerte für Schlüssel, die du weglässt; ein fehlendes effect entfernt daher den Gegenstand der Kraft aus dem Anzeigering. powerType ersetzt den eingebauten Typ nur, wenn es gesetzt ist. Eine deaktivierte Datei verhindert das Laden der mitgelieferten Kraft nicht.

Natürliche Elites verwenden die ausdrücklich festgelegten Pools in EliteMobPowers.yml; prüfe diese Listen beim Hinzufügen eigener Kräfte. Füge den .lua-Dateinamen zur Liste powers: eines Bosses hinzu, um die Kraft direkt zuzuweisen.

Für Boss-Lua-Kräfte verfügbare Hooks​

HookWird ausgelöst, wenn
on_spawnDer Boss spawnt
on_game_tickIn jedem Server-Tick, solange die Laufzeitinstanz aktiv und weder pausiert noch unterdrückt ist
on_boss_damagedDer Boss Schaden aus beliebiger Quelle erleidet
on_boss_damaged_by_playerDer Boss Schaden von einem Spieler erleidet
on_reinforcement_damaged_by_playerEine Verstärkung Spielerschaden erleidet; der Hook läuft auf ihrem Beschwörer
on_boss_damaged_by_eliteDer Boss Schaden von einem anderen Elite erleidet
on_player_damaged_by_bossDer Boss einem Spieler Schaden zufügt
on_enter_combatDer Boss in den Kampf eintritt
on_exit_combatDer Boss den Kampf verlässt
on_healDer Boss sich heilt
on_boss_target_changedDas Ereignis für ein Spielerziel eintritt, einschließlich der ersten Zielerfassung; nicht bei jedem Zielwechsel oder Zielverlust
on_deathDer Boss stirbt
on_phase_switchDer Boss die Phase wechselt
on_mind_actionEin nativer Mind eine Aktion von den zugewiesenen Kräften anfordert

on_zone_enter und on_zone_leave werden ebenfalls akzeptiert. Der eingebaute Dispatcher erhält sie von einem EliteScript-Zonen-Listener desselben Bosses, nicht von Lua-Zonenbeobachtern. Siehe die Warnung am Anfang dieser Seite.

Jede zugewiesene Lua-Kraft hat für diesen Boss eine eigene Laufzeitinstanz und einen eigenen Zustand. Das obige Beispiel hat bewusst keinen Cooldown und läuft bei jedem weitergeleiteten passenden Treffer. Ergänze bei Bedarf ausdrückliche Cooldown-Prüfungen und -Zuweisungen; Metadaten allein begrenzen Lua-Hooks nicht. Schaden kann sowohl den allgemeinen als auch einen spezifischeren Hook auslösen. Sind beide definiert, können zwei Handler laufen. Die Lebenszyklus-Anleitung beschreibt Abbruch, Entfernung und Fehlerverhalten.

Was du innerhalb dieser Hooks tatsächlich aufrufen kannst, steht unter Lua: Erste Schritte, Boss-Hooks & Lebenszyklus und Boss & Entitäten.