Kräfte erstellen
Zwei Wege, eine Kraft zu schreiben
Jede Kraft liegt in ~/plugins/EliteMobs/powers (Unterordner werden ebenfalls durchsucht), und es gibt zwei Formate:
| Format | Datei | Wofür du es verwendest |
|---|---|---|
| Lua | *.lua | Alles Neue. Vollwertige Skriptsprache, alle Boss-Hooks, Schleifen und State. Das verwenden auch die mitgelieferten Kräfte. |
| EliteScript | *.yml | Das deklarative Event-/Aktions-Format, das auf dem Rest dieser Seite dokumentiert ist. Weiterhin vollständig unterstützt. |
Fast alle 68 mit EliteMobs ausgelieferten Kräfte sind inzwischen Lua. Nur bonus_coins.yml, custom_summon.yml und elite_script.yml verbleiben als YAML-gestützte Java-Kräfte. Wenn du eine neue Kraft von Grund auf schreibst, ist Lua der Weg mit den meisten Möglichkeiten dahinter — beginne bei Lua: Erste Schritte und Boss-Hooks & Lebenszyklus.
Beide Formate werden von einem Boss auf dieselbe Weise referenziert, über die powers-Liste.
.lua power supersedes a same-named .yml powerWenn ein Boss nach attack_fire.yml fragt, sucht EliteMobs zuerst nach attack_fire.lua und verwendet diese, falls sie existiert. Deshalb funktionieren alte Boss-Konfigurationen, die gegen die Kraftnamen aus der Zeit vor Lua geschrieben wurden, unverändert weiter — du musst deine powers:-Listen nicht umschreiben. Neue Konfigurationen sollten die .lua-Datei direkt benennen.
.lua files are written once, never overwrittenJede mitgelieferte Lua-Kraft wird nur dann in den powers-Ordner geschrieben, wenn diese Datei noch nicht existiert. Sobald du eine bearbeitest, überschreibt EliteMobs deine Version bei einem Update nicht — du erhältst dann aber auch keine Upstream-Korrekturen mehr dafür. Wenn du eine modifizierte Kopie willst, gib ihr lieber einen neuen Dateinamen.
on_zone_enter / on_zone_leave are not fired by Lua zonesBeide Hook-Namen werden vom Boss-Skript-Provider akzeptiert und lösen keinen Ladefehler aus, aber nichts in einer Lua-Kraft kann sie auslösen. Sie werden ausschließlich vom Zonen-Listener von EliteScript versendet, der gestartet wird, wenn ein YAML-eliteScript: auf demselben Boss ZoneEnterEvent oder ZoneLeaveEvent in seinen Events: auflistet. Ein Boss mit ausschließlich Lua-Kräften lädt eine Datei mit diesen Hooks und ruft sie dann nie auf.
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-Scripting-System
Die folgende Seite beschreibt, wie man Elite-Skripte erstellt!
Dies ist eine fortgeschrittene Funktion und erfordert eingehende Kenntnisse von EliteMobs.
Hinweis: Elite-Skripte können als Kraft-Dateien oder zu benutzerdefinierten Boss-Dateien hinzugefügt werden! Bei Verwendung als Kraft-Dateien können Sie diese wie gewohnt als normale Kräfte zu Bossen hinzufügen, indem Sie die Konfigurationseinstellung powers der benutzerdefinierten Bosse verwenden.
Ein EliteScript hinzufügen
Um ein EliteScript zu einem Boss hinzuzufügen, fügen Sie den folgenden Eintrag zur Boss-Datei hinzu:
eliteScript:
Hinweis: Die folgenden Angaben sind extrem empfindlich gegenüber Groß-/Kleinschreibung und Leerzeichen! Stellen Sie sicher, dass Ihre Leerzeichen, Zeilenumbrüche und die allgemeine Formatierung mit den Beispielen übereinstimmen!
Nachdem Sie den Skriptstart deklariert haben, können Sie Ihr spezifisches Skript hinzufügen. Für dieses Beispiel erstellen wir ein Skript namens Example:
eliteScript:
Example:
EliteScripts haben 5 verschiedene Abschnitte: Events, Conditions, Zones, Actions und Cooldowns. Nur Actions ist obligatorisch.
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
Dieses Skript bewirkt, dass ein Elite nach oben gestoßen wird, wenn er von einem Spieler getroffen wird, und dies 3 Sekunden lang nicht erneut tut (und andere Kräfte aufgrund der Einstellungen im Cooldowns-Abschnitt 1 Sekunde lang nicht ausgelöst werden).
Nachdem Sie das allgemeine Format der Skriptstruktur kennen, ist es an der Zeit zu lernen, was Sie mit jedem Abschnitt tun können!
Events
Klicken Sie auf den obigen Link, um zu erfahren, wie Events verwendet werden!
Targets
Klicken Sie auf den obigen Link, um zu erfahren, wie Targets verwendet werden!
Actions
Klicken Sie auf den obigen Link, um zu erfahren, wie Actions verwendet werden!
Zones
Klicken Sie auf den obigen Link, um zu erfahren, wie Zones verwendet werden!
Conditions
Klicken Sie auf den obigen Link, um zu erfahren, wie Conditions verwendet werden!
Cooldowns
Klicken Sie auf den obigen Link, um zu erfahren, wie Cooldowns verwendet werden!
Mehrere EliteScripts hinzufügen
Sie können mehrere Aktionen für ein Event haben, aber was, wenn Sie mehrere Skripte für denselben Boss möchten? Das ist so einfach wie das Erstellen eines neuen Skripteintrags! Erweitern wir das vorherige Beispiel und fügen ein weiteres Skript hinzu:
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
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60
In diesem Beispiel haben wir ein zweites Skript namens Example2 hinzugefügt. Example2 wird den Spieler in Brand setzen, der vom Boss beschädigt wird, da der targetType auf DIRECT_TARGET gesetzt ist.
Der Cooldown für dieses Skript ist auf 200 Ticks eingestellt, was bedeutet, dass der Boss nur alle 10 Sekunden Spieler in Brand setzen kann.
Eigenständige Kräfte erstellen
Eigenständige Kräfte bestehen fast vollständig aus dem Elite-Skript. Es gibt nur zwei optionale Felder. Vergessen Sie nicht, dass eigenständige Kräfte im Ordner ~plugins/EliteMobs/powers platziert werden müssen, damit sie funktionieren.
Beispiel für eine eigenständige Kraft:
isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20
isEnabled
Wie überall im Plugin, legt fest, ob die Kraft aktiviert ist.
powerType
Der Krafttyp bestimmt, wie die Kraft zugewiesen wird. Die Werte sind:
UNIQUE: Die Kraft wird nur auf benutzerdefinierte Bosse angewendet, bei denen die Kraft im Kräfte-Abschnitt festgelegt ist.DEFENSIVE/MISCELLANEOUS/OFFENSIVE: JEDER Elite kann diese Kräfte erhalten, und sie zählen zu einer bestimmten Unterkategorie von Kräften.MAJOR_ZOMBIE,MAJOR_SKELETON,MAJOR_BLAZE,MAJOR_ENDERMAN,MAJOR_GHAST: Nur Elites des entsprechenden Entitätstyps können natürlich mit diesen Kräften spawnen, und sie zählen zu den Hauptkräften.
Wie powerType natürliche Elites erreicht: EliteMobPowers.yml
powerType allein stellt eine Kraft noch keinem natürlichen Elite zur Verfügung. Woraus natürliche Elites tatsächlich würfeln, ist ~/plugins/EliteMobs/EliteMobPowers.yml mit diesen Listen:
| Schlüssel | Bedeutung |
|---|---|
defensivePowers | Defensive Kräfte, die natürliche Elites zufällig würfeln können |
offensivePowers | Offensive Kräfte, die natürliche Elites zufällig würfeln können |
miscellaneousPowers | Sonstige 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 |
Bei der ersten Erzeugung wird jede Liste mit allen geladenen Kräften des passenden powerType befüllt. Danach ist die Datei maßgeblich und wird nie neu befüllt, sodass eine später hinzugefügte Kraft — einschließlich jeder .lua-Datei, die du in den powers-Ordner legst — erst dann bei natürlichen Elites auftaucht, wenn du sie selbst in die entsprechende Liste einträgst.
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.
effect
Legt den visuellen Effekt oder das Material fest, das von der Kraft verwendet wird. Dies wird von einigen fest codierten Kräften verwendet, um ihren visuellen Partikel- oder Materialeffekt zu definieren.
| Schlüssel | Werte | Standard |
|---|---|---|
effect | String | none |
powerCooldown
Legt den Cooldown in Ticks für die einzelne Kraft fest. Dies steuert, wie oft diese bestimmte Kraft ausgelöst werden kann.
| Schlüssel | Werte | Standard |
|---|---|---|
powerCooldown | Integer | 0 |
globalCooldown
Legt den globalen Cooldown in Ticks fest, der von allen Kräften geteilt wird. Nachdem diese Kraft ausgelöst wurde, kann keine andere Kraft ausgelöst werden, bis der globale Cooldown abgelaufen ist.
| Schlüssel | Werte | Standard |
|---|---|---|
globalCooldown | Integer | 0 |
Eigenständige Lua-Kräfte erstellen
Eine eigenständige Lua-Kraft ist einfach eine .lua-Datei in ~/plugins/EliteMobs/powers (Unterordner eingeschlossen — der Ordner wird rekursiv durchsucht). Es gibt keinen YAML-Wrapper und keine Konfigurationsschlüssel: Die Datei ist die Kraft.
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
}
Da es keinen YAML-Kopf gibt, aus dem sie gelesen werden könnten, erhält eine so entdeckte Lua-Kraft feste Metadaten:
powerTypeistMISCELLANEOUS. Du kannst es aus der Datei heraus nicht aufUNIQUEsetzen. (Die mit EliteMobs ausgelieferten Lua-Kräfte tragen ihren Typ in Java, weshalb sieUNIQUE,OFFENSIVE,MAJOR_*und so weiter sein können.)effectist nicht gesetzt.
In der Praxis gelangt deine Kraft dadurch nicht auf zufällige Elites, weil die Würfelpools für natürliche Elites aus EliteMobPowers.yml stammen und diese Datei nach ihrer Erzeugung nicht neu befüllt wird — siehe oben. Füge die Kraft der powers:-Liste eines Bosses hinzu, um sie zu verwenden.
Für Boss-Lua-Kräfte verfügbare Hooks
| Hook | Wird ausgelöst, wenn |
|---|---|
on_spawn | Der Boss spawnt |
on_game_tick | In jedem Server-Tick |
on_boss_damaged | Der Boss Schaden aus beliebiger Quelle erleidet |
on_boss_damaged_by_player | Der Boss Schaden von einem Spieler erleidet |
on_boss_damaged_by_elite | Der Boss Schaden von einem anderen Elite erleidet |
on_player_damaged_by_boss | Der Boss einem Spieler Schaden zufügt |
on_enter_combat | Der Boss in den Kampf eintritt |
on_exit_combat | Der Boss den Kampf verlässt |
on_heal | Der Boss sich heilt |
on_boss_target_changed | Der Boss das Ziel wechselt |
on_death | Der Boss stirbt |
on_phase_switch | Der Boss die Phase wechselt |
on_zone_enter und on_zone_leave werden vom Parser ebenfalls akzeptiert, aber nichts in einer Lua-Kraft kann sie auslösen — sie werden ausschließlich von einem EliteScript-Zonen-Listener auf demselben Boss versendet. Siehe die Warnung am Anfang dieser Seite.
Was du innerhalb dieser Hooks tatsächlich aufrufen kannst, steht unter Lua: Erste Schritte, Boss-Hooks & Lebenszyklus und Boss & Entitäten.
