Lua-Scripting: Boss & Entitäten
Diese Seite behandelt alles rund um Boss- und Entitäts-Wrapper in EliteMobs-Lua-Powers: context.boss, context.player, context.players, context.entities und die Entitäts-Wrapper-Tabellen, die sie zurückgeben. Wenn du neu bei Lua-Powers bist, beginne zuerst mit Erste Schritte.
Entitäts-Wrapper
Wenn du über die Lua-API auf Entitäten zugreifst – sei es über context.boss, context.player, Abfrageergebnisse wie context.players:nearby_players() oder Event-Felder – erhältst du immer Wrapper-Tabellen. Dies sind keine rohen Bukkit-Objekte. Jeder Wrapper stellt eine Reihe von Feldern (Snapshot-Werte, die zum Erstellungszeitpunkt erfasst werden) und Methoden (Live-Aufrufe, die auf den Server zugreifen) bereit.
Diese Seite beschreibt die nativen Wrapper für EliteMobs-Boss-Powers. Gemeinsame MagmaCore-Helfer wie context.world:get_entity(uuid) können andere Wrapper mit erst beim Zugriff gelesenen Live-Feldern und anderen Signaturen liefern. Dafür gilt die gemeinsame API-Referenz. Native Methoden akzeptieren Doppelpunkt oder Punkt ohne explizites self-Argument. Eine Feldzuweisung ändert nur die Lua-Tabelle; verwende eine Methode, um die Entität zu ändern.
Zwei Regeln zum Merken:
- Felder wie
health,current_locationundmaximum_healthsind Snapshots. Sie spiegeln den Zustand zum Zeitpunkt der Wrapper-Erstellung wider und aktualisieren sich nicht automatisch. - Methoden wie
get_location(),get_health()undis_alive()führen bei jedem Aufruf eine Live-Überprüfung durch.
Gemeinsame Entitätsfelder
Jeder Living-Entity-Wrapper enthält diese Felder.
| Feld | Typ | Hinweise |
|---|---|---|
entity.name | string | Anzeigename |
entity.uuid | string | UUID als Text |
entity.entity_type | string | Bukkit-EntityType-Name (z. B. "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true für Spieler |
entity.is_elite | boolean | true, wenn EliteMobs diese Entität als Elite verfolgt |
entity.is_mount | boolean | true, wenn dieser Wrapper ein Boss-Reittier darstellt |
entity.is_monster | boolean | true für Monster-Entitäten |
entity.health | number | Aktuelle Gesundheit (Snapshot) |
entity.maximum_health | number | Maximale Gesundheit (Snapshot) |
entity.current_location | location-Tabelle | Position zum Zeitpunkt der Wrapper-Erstellung |
entity.is_valid | boolean | Bukkit-Gültigkeit bei der Erstellung des Wrappers (Snapshot) |
is_valid ist bei lebenden Entitäten ein Feld, keine MethodeBei Wrappern lebender Entitäten (einschließlich context.player und context.boss) ist is_valid ein einfacher Boolean, der beim Erstellen des Wrappers festgehalten wurde. Ein Aufruf von entity:is_valid() löst attempt to call a boolean value aus und deaktiviert die Kraft.
- Lies den Snapshot mit
entity.is_valid(Punkt). - Für eine Live-Prüfung rufe stattdessen
entity:is_alive()auf -- diese Methode fragt den Server jedes Mal neu ab.
is_valid() ist eine echte Methode bei den leichteren Referenz-Wrappern für nicht-lebende Entitäten, die von summon_projectile, spawn_falling_block_at_location und Ähnlichem zurückgegeben werden. Genau diese Wrapper speicherst du am ehesten über mehrere Ticks hinweg, und dort ist die Live-Prüfung wichtig.
Um Elite-spezifische Daten wie das Boss-Level zu lesen, verwende die Felder und Methoden von context.boss, die im Abschnitt context.boss weiter unten beschrieben werden. Um einen Elite aus einem Script zu despawnen, rufe die Methode entity:remove_elite() auf.
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
end
}
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local target = context.players:current_target()
if target ~= nil then
context.log:info("Target: " .. target.name .. " HP: " .. target.health)
end
end
}
Gemeinsame Entitätsmethoden
Die folgenden Methoden greifen live auf den Server zu. Bewegung, Gesundheit, Ausrüstung und Effekte gehören zu Wrappern lebender Entitäten. Chat, Action Bars, Titel, Boss-Leisten und Spielerbefehle benötigen einen Player-Wrapper. context.boss:send_message(...) ist eine separate Boss-Methode für Nachrichten an nahe Spieler. Sofern kein Rückgabewert dokumentiert ist, geben verändernde Methoden nil zurück, keine Erfolgsbestätigung.
Änderungen an KI, Wahrnehmung, Unverwundbarkeit und Skalierung gehören der Power, die sie vorgenommen hat. Jede speichert den Wert, den sie ersetzt hat: Eine positive Dauer stellt diesen Wert nach den angegebenen Ticks wieder her, und das Schließen des Scripts stellt jede noch aktive Änderung wieder her. Ändern mehrere Powers dieselbe Eigenschaft, stellt das Ende einer Änderung die jüngste verbleibende Änderung wieder her oder, wenn keine mehr übrig ist, den ursprünglichen Wert. Ändert zwischenzeitlich ein anderes Plugin oder ein Befehl die Eigenschaft, bleibt dessen Wert erhalten. Das Pausieren des Scripts macht diese Änderungen nicht rückgängig. Dauern von Tags, verzögerte Stöße und Spieler-Boss-Leisten verwenden unabhängige Aufgaben der Spieluhr, die nach dem Schließen des Scripts weiterlaufen. Andere Änderungen an Entitäten werden nicht rückgängig gemacht.
entity:is_alive()
Gibt true zurück, wenn die Entität noch gültig und nicht tot ist.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:is_alive() then
context.player:send_message("&aYou're still standing!")
end
end
}
entity:get_location()
Gibt den aktuellen Live-Standort als location-Tabelle zurück.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.world:play_sound_at_location(loc, "entity.experience_orb.pickup")
end
}
entity:get_eye_location()
Gibt den Standort auf Augenhöhe als location-Tabelle zurück.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local eye = context.player:get_eye_location()
context.world:spawn_particle_at_location(eye, "FLAME")
end
}
entity:get_health() / entity:get_maximum_health()
Gibt die aktuelle bzw. maximale Live-Gesundheit zurück.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local pct = context.player:get_health() / context.player:get_maximum_health()
if pct < 0.25 then
context.player:send_message("&cYou're running low!")
end
end
}
entity:get_velocity()
Gibt die aktuelle Geschwindigkeit der Entität als Vektor-Tabelle zurück.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local vel = context.player:get_velocity()
context.log:info("Player speed Y: " .. vel.y)
end
}
entity:send_message(text)
Sendet eine Chat-Nachricht an einen Spieler. Unterstützt die EliteMobs-Farbformatierung.
| Parameter | Typ | Hinweise |
|---|---|---|
text | string | Nachricht mit Farbcodes |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&6[Boss] &fPrepare yourself!")
end
}
entity:show_action_bar(message)
Sendet eine Action-Bar-Nachricht an einen Spieler über die Lua-Quelle von EliteMobs. Diese nimmt an der gemeinsamen Zusammenstellung der Action Bar teil und reserviert die Anzeige nicht für dieses Script.
| Parameter | Typ | Hinweise |
|---|---|---|
message | string | Action-Bar-Text mit Farbcodes |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:show_action_bar("&c&lDANGER ZONE")
end
}
entity:show_title(title[, subtitle][, fadeIn][, stay][, fadeOut])
Sendet einem Spieler einen Titel und optionalen Untertitel mit EliteMobs-Farben. Zeitangaben sind ganzzahlige Ticks.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
title | string | Titeltext | |
subtitle | string | "" | Untertiteltext |
fadeIn | number | 10 | Einblend-Ticks |
stay | number | 40 | Anzeigedauer in Ticks |
fadeOut | number | 10 | Ausblend-Ticks |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_title("&4PHASE 2", "&7The boss is enraged!", 10, 40, 10)
end
end
}
entity:show_boss_bar(title[, color][, style][, duration])
Erstellt über die Verwaltung der Boss-Leistenreihenfolge eine neue Leiste für einen Spieler. Farb- und Stilnamen ignorieren Groß- und Kleinschreibung; unbekannte Werte verwenden WHITE und SOLID. Eine positive Dauer plant eine unabhängige Entfernung. Nichtpositive Werte fügen keinen Timer hinzu, und die Methode liefert weder Referenz noch Schlüssel zur späteren Entfernung. Verwende eine positive Dauer. Diese Signatur unterscheidet sich von der gemeinsamen MagmaCore-API mit Leisten-Schlüsseln.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
title | string | Titeltext der Leiste | |
color | string | "WHITE" | BarColor-Wert |
style | string | "SOLID" | BarStyle-Wert |
duration | number | 40 | Dauer in Ticks |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, p in ipairs(nearby) do
p:show_boss_bar("&cIncoming Attack!", "RED", "SOLID", 100)
end
end
}
entity:teleport_to_location(location)
Fordert einen Bukkit-Teleport an und gibt nil zurück, ohne dessen Erfolg zu melden. Die native Standortkonvertierung akzeptiert x, y, z, optional yaw/pitch, den Namen einer geladenen world oder eine verschachtelte current_location-Tabelle. Fehlende Koordinaten werden 0; ohne Weltangabe gilt die Welt des ausführenden Bosses, nicht zwingend die der Zielentität. Eine ausdrücklich unbekannte Welt lässt die Konvertierung fehlschlagen. nil oder ein Wert ohne Tabellenformat verwendet die Boss-Position. Es gibt keine zusätzliche Prüfung auf sichere Ziele oder Regionsschutz.
| Parameter | Typ | Hinweise |
|---|---|---|
location | location-Tabelle | Ziel |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("teleport_pull", 200) then return end
context.player:teleport_to_location(context.boss:get_location())
context.player:send_message("&cThe boss pulls you in!")
end
}
entity:set_velocity_vector(vector)
Setzt die Geschwindigkeit der Entität sofort.
| Parameter | Typ | Hinweise |
|---|---|---|
vector | Vektor-Tabelle | { x, y, z } oder { x = 0, y = 1, z = 0 } |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("launch", 100) then return end
context.player:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
context.player:send_message("&cYou are launched into the air!")
end
}
entity:apply_push_vector(vector[, additive][, delay])
Wendet einen gespeicherten Geschwindigkeitsvektor nach standardmäßig 1 Tick an. Der unabhängige Timer prüft, ob die Entität noch gültig ist. Mit additive = true addiert er den Vektor zur Geschwindigkeit zum Ausführungszeitpunkt; andernfalls ersetzt er sie. Pausieren oder Schließen des Scripts bricht den Stoß nicht ab.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
vector | Vektor-Tabelle | Richtung und Stärke | |
additive | boolean | false | Zur bestehenden Geschwindigkeit hinzufügen, statt sie zu ersetzen |
delay | number | 1 | Verzögerung in Ticks vor der Anwendung |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("push_up", 100) then return end
context.player:apply_push_vector({ x = 0, y = 2.0, z = 0 })
context.player:send_message("&cUpward blast!")
end
}
entity:face_direction_or_location(directionOrLocation)
Richtet die Entität durch einen Teleport an ihre aktuelle Position mit neuer Drehung aus. Eine Tabelle mit einem world-String oder verschachteltem current_location gilt als Zielort und muss in der Welt der Entität liegen. Eine reine x/y/z-Tabelle gilt als Richtungsvektor. Ein Nullvektor ändert nichts.
| Parameter | Typ | Hinweise |
|---|---|---|
directionOrLocation | Vektor- oder location-Tabelle | Ziel, auf das geblickt werden soll |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:face_direction_or_location(context.boss:get_location())
context.player:send_message("&cThe boss forces you to look at it!")
end
}
entity:set_fire_ticks(ticks)
Setzt die Bukkit-Feuerticks auf den angegebenen Wert. Die Richtlinie für Instanzeffekte prüft das Ziel bei jedem Aufruf erneut. Spieler müssen online, am Leben und in der Quellwelt sein; in einer Instanz müssen sie zur aktiven Partie und deren Teilnehmerliste gehören. Andere lebende Ziele müssen gültig sein. Dies garantiert keinen Feuerschaden.
| Parameter | Typ | Hinweise |
|---|---|---|
ticks | number | Branddauer in Ticks (20 Ticks = 1 Sekunde) |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ignite", 100) then return end
context.player:set_fire_ticks(60)
context.player:send_message("&cYou catch fire!")
end
}
entity:add_visual_freeze_ticks([ticks])
Erhöht die tatsächlichen Bukkit-Freeze-Ticks unter derselben Richtlinie für Instanzeffekte wie set_fire_ticks. Trotz des Namens ist dies kein reines Paket-Overlay und stoppt weder KI noch Bewegung direkt. Das normale Gefrierverhalten von Minecraft kann wirken.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
ticks | number | 1 | Anzahl der Freeze-Ticks |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("freeze", 200) then return end
context.player:add_visual_freeze_ticks(100)
context.player:send_message("&bYou feel a chilling frost!")
end
}
entity:apply_potion_effect(effect, duration[, amplifier])
Wendet nach derselben Instanzprüfung wie set_fire_ticks einen Bukkit-Trankeffekt an. Namen ignorieren Groß- und Kleinschreibung; unbekannte Namen erzeugen eine Warnung ohne Effekt. Bukkits Regeln zum Ersetzen von Effekten gelten; vorhandene Effekte werden nicht pauschal überschrieben.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
effect | string | PotionEffectType-Name | |
duration | number | Dauer in Ticks | |
amplifier | number | 0 | Effektstärke (0 = Stufe I) |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("slow", 200) then return end
context.player:apply_potion_effect("SLOWNESS", 60, 1)
context.player:send_message("&7You feel sluggish...")
end
}
remove_potion_effect(effect) ist auf nativen EliteMobs-Boss-Power-Wrappern nicht verfügbar. Es existiert auf gemeinsamen MagmaCore-Wrappern. Wähle beim Anwenden eine passende Effektdauer; ein Effekt mit Dauer null entfernt einen vorhandenen Effekt nicht zuverlässig.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Übergibt Schaden an Bukkit. Alle drei Methoden geben nil zurück; die angeforderte Menge bestätigt keinen Gesundheitsverlust. Kampfregeln und spätere Listener können den Treffer ändern oder abbrechen.
| Methode | Hinweise |
|---|---|
deal_damage(amount) | Ruft Bukkit-Schaden ohne ausdrücklichen Verursacher auf |
deal_custom_damage(amount) | Verwendet BossCustomAttackDamage mit dem ausführenden Boss; lehnt Selbsttreffer, unverwundbare oder tote Ziele und Spieler außerhalb von Survival/Adventure ab, übergibt einen benutzerdefinierten Treffer und löscht danach den nativen Schadens-Cooldown |
deal_damage_from_boss(amount) | Ruft Bukkit-Schaden mit dem ausführenden Boss als Verursacher auf; die normale EliteMobs-Kampfverarbeitung kann greifen |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(10)
for _, p in ipairs(nearby) do
p:deal_custom_damage(10)
p:send_message("&cThe boss unleashes a shockwave!")
end
end
}
entity:restore_health(amount)
Ruft für registrierte Elites die EliteMobs-Heilung mit dem abbrechbaren EliteMobHealEvent auf. Andere lebende Entitäten werden direkt bis zum Basiswert ihres Attributs für maximale Gesundheit geheilt. Dieser kann vom effektiven Maximum aus get_maximum_health() abweichen. Übergib eine nichtnegative Menge; der Helfer ist keine Schadens-API mit automatischer Eingabebegrenzung.
| Parameter | Typ | Hinweise |
|---|---|---|
amount | number | Menge der Heilung |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
-- Heal the player slightly when they hit the boss
context.player:restore_health(5)
context.player:send_message("&aYou drain life from the boss!")
end
}
entity:set_invulnerable(enabled[, duration])
Setzt die Unverwundbarkeit der Entität und speichert den ersetzten Wert. Eine positive Dauer stellt diesen Wert nach den angegebenen Ticks wieder her; andernfalls bleibt die Änderung bestehen, bis diese Power beendet wird, was den Wert ebenfalls wiederherstellt. Ein erneuter Aufruf aus derselben Power ersetzt deren frühere Änderung.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
enabled | boolean | true, um Unverwundbarkeit zu aktivieren | |
duration | number | 0 | Stellt den ersetzten Wert nach diesen Ticks wieder her; 0 behält die Änderung bei, bis die Power beendet wird |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("shield", 200) then return end
context.player:set_invulnerable(true, 40)
context.player:send_message("&6A brief shield protects you!")
end
}
entity:set_ai_enabled(enabled[, duration])
Setzt die KI der Entität und speichert den ersetzten Wert. Eine positive Dauer stellt diesen Wert nach den angegebenen Ticks wieder her; andernfalls bleibt die Änderung bestehen, bis diese Power beendet wird, was den Wert ebenfalls wiederherstellt. Ein Aufruf von set_ai_enabled(true), während diese Power eine KI-Änderung hält, beendet diese Änderung und stellt den ersetzten Wert wieder her, statt eine neue anzuwenden.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
enabled | boolean | true, um die KI zu aktivieren | |
duration | number | 0 | Stellt den ersetzten Wert nach diesen Ticks wieder her; 0 behält die Änderung bei, bis die Power beendet wird |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Disable boss AI for 3 seconds at combat start
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned!")
end
}
entity:add_tag(tag[, duration]) / entity:remove_tag(tag) / entity:has_tag(tag)
Verwaltet EliteMobs-Tags mit Beachtung der Groß- und Kleinschreibung auf registrierten Elites und Spielern mit geladenen EliteMobs-Inventardaten. Normale, nicht registrierte Mobs speichern diese Tags nicht. Es sind keine Bukkit-Scoreboard-Tags. Eine positive Dauer plant eine unabhängige Entfernung; erneutes Hinzufügen desselben Tags bricht seinen alten Timer nicht ab.
| Methode | Parameter | Hinweise |
|---|---|---|
add_tag(tag[, duration]) | string, optionale number | Fügt einen Tag hinzu, entfernt ihn optional automatisch nach Ticks |
remove_tag(tag) | string | Entfernt den Tag |
has_tag(tag) | string | Gibt true zurück, wenn der Tag vorhanden ist |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.player:has_tag("marked") then
context.player:add_tag("marked", 200)
context.player:send_message("&cYou have been marked!")
end
end
}
entity:run_command(command)
Führt sofort einen Befehl als Spieler mit dessen Berechtigungen aus. Verwende Text ohne führenden /. Diese reine Spielermethode gibt nil zurück, meldet keinen Befehlserfolg und ersetzt keine Platzhalter.
| Parameter | Typ | Hinweise |
|---|---|---|
command | string | Befehlstext ohne führenden / |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("curse_cmd", 200) then return end
context.player:run_command("say I have been cursed!")
end
}
entity:set_scale(scale[, duration])
Setzt den Basiswert des Skalierungsattributs, sofern vorhanden, und speichert den ersetzten Wert. Eine positive Dauer stellt diesen Wert nach den angegebenen Ticks wieder her; andernfalls bleibt die Änderung bestehen, bis diese Power beendet wird, was den Wert ebenfalls wiederherstellt. Attributmodifikatoren können die effektive Größe verändern.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
scale | number | Skalierungsmultiplikator | |
duration | number | 0 | Stellt die ersetzte Skalierung nach diesen Ticks wieder her; 0 behält die Änderung bei, bis die Power beendet wird |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss grows to double size for 5 seconds
context.boss:set_scale(2.0, 100)
context.boss:send_message("&4The boss grows in size!")
end
}
entity:set_gravity(enabled)
Schaltet die Schwerkraft um. Beim Schließen des Scripts wird sie nicht automatisch wiederhergestellt. Ein verzögerter Script-Callback läuft nach dem Schließen möglicherweise nie; verlass dich bei überlebenden Entitäten nicht auf ihn als garantierte Wiederherstellung.
| Parameter | Typ | Hinweise |
|---|---|---|
enabled | boolean | true für normale Schwerkraft |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("levitate", 200) then return end
-- Change the boss's gravity; the callback runs only while this script stays active.
context.boss:set_gravity(false)
context.scheduler:run_after(60, function(tick_context)
if tick_context.boss.exists then
tick_context.boss:set_gravity(true)
end
end)
end
}
entity:play_sound_at_entity(sound[, volume][, pitch])
Spielt einen Sound am Standort der Entität ab.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
sound | string | Minecraft-Sound-Key wie "entity.ender_dragon.growl" oder ein Spigot-Sound-Enum-Name. Resource-Pack-Keys funktionieren ebenfalls. | |
volume | number | 1.0 | Lautstärke |
pitch | number | 1.0 | Tonhöhe |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:play_sound_at_entity("entity.ender_dragon.growl", 1.0, 0.5)
end
}
entity:play_sound_at_self(sound[, volume][, pitch])
Alias für play_sound_at_entity. Spielt einen Sound am Standort der Entität ab.
entity:spawn_particle_at_self(particleOrSpec[, count])
Erzeugt Partikel am aktuellen Standort der Entität. Verwendet dieselbe Partikelspezifikation wie der native Welt-Helfer. Das amount einer Tabelle überschreibt den Ersatzwert count; Namen werden in Großbuchstaben umgewandelt. Nicht unterstützte Partikel mit zusätzlichen Daten erzeugen eine Warnung statt Partikel.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
particleOrSpec | string oder Tabelle | Partikelname oder Spezifikations-Tabelle | |
count | number | 1 | Anzahl der Partikel |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:spawn_particle_at_self("HEART", 5)
end
}
entity:spawn_particles_at_location(location, particle[, count])
Erzeugt Partikel an einem bestimmten Standort.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
location | location-Tabelle | Zielstandort | |
particle | string | Name des Partikeltyps | |
count | number | 1 | Anzahl der Partikel |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local loc = context.player:get_location()
context.player:spawn_particles_at_location(loc, "FLAME", 10)
end
}
entity:play_model_animation(name)
Fordert eine Animation nur an, wenn EliteMobs die Entität als Custom Boss mit Custom Model registriert hat. Die Methode gibt nil zurück, wartet nicht auf das Ende und meldet nicht, ob der Animationsname existiert. Eine beliebige Entität mit Modell reicht für diesen nativen Helfer nicht aus.
| Parameter | Typ | Hinweise |
|---|---|---|
name | string | Name der Animation |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
Methoden für Fahrzeuge und Passagiere
Wrapper lebender Entitäten bieten auch Bukkit-Helfer für Fahrzeuge und Passagiere. Wrapper-Argumente werden über die Bukkit-UUID aufgelöst; reine UUID-Strings sind hier nicht erlaubt. Aufsitzen lehnt fehlende, identische oder ungültige Entitäten ab, umgeht vorübergehend den EliteMobs-Schutz gegen Reittier-Exploits und gibt Bukkits Annahmeergebnis zurück. Diese Methoden registrieren keine Transportroute und planen keine Bereinigung beim Schließen des Scripts.
| Methode | Gibt zurück | Hinweise |
|---|---|---|
entity:is_inside_vehicle() | boolean | True, wenn die Entität auf einer anderen Entität reitet. |
entity:has_vehicle() | boolean | True, wenn die Entität derzeit ein Fahrzeug hat. |
entity:get_vehicle() | Entitäts-Wrapper oder nil | Gibt den aktuellen Fahrzeug-Wrapper zurück. |
entity:set_vehicle(vehicle) | boolean | Lässt diese Entität auf vehicle reiten. |
entity:leave_vehicle() | boolean | Lässt diese Entität ihr aktuelles Fahrzeug verlassen. |
entity:has_passengers() | boolean | True, wenn diese Entität Passagiere hat. |
entity:get_passenger_count() | number | Anzahl der Passagiere. |
entity:get_passengers() | Tabelle | Array von Passagier-Wrappern. |
entity:add_passenger(passenger) | boolean | Fügt dieser Entität einen Passagier hinzu. |
entity:remove_passenger(passenger) | boolean | Entfernt einen Passagier von dieser Entität. |
entity:eject_passengers() | boolean | Wirft alle Passagiere ab. |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.player:has_vehicle() then
context.player:leave_vehicle()
end
end
}
entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])
Ersetzt sofort die Geschwindigkeit durch den normalisierten Versatz von der Quelle zur Entität, multipliziert mit strength, und addiert die Versätze entlang der Weltachsen. Identische Positionen erhalten trotzdem die Zusatzversätze. Ein Wrapper liefert sein gespeichertes current_location; verwende bei Bedarf source:get_location() für die aktuelle Position. Der Helfer vergleicht keine Welten, daher dürfen nur Positionen derselben Welt verwendet werden.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
source | location oder Wrapper | Ursprung des Stoßes | |
strength | number | 1.0 | Stärkemultiplikator des Stoßes |
xOffset | number | 0 | Zusätzlicher X-Versatz |
yOffset | number | 0 | Zusätzlicher Y-Versatz |
zOffset | number | 0 | Zusätzlicher Z-Versatz |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("knockback", 60) then return end
context.player:push_relative_to(context.boss:get_location(), 2.0, 0, 0.5, 0)
context.player:send_message("&cThe boss knocks you back!")
end
}
entity:set_custom_name(name) / entity:reset_custom_name()
Setzt den benutzerdefinierten Bukkit-Namen mit Farbformatierung. Das Zurücksetzen verwendet den konfigurierten Namen eines registrierten Elites; bei nicht registrierten Entitäten verwendet es deren aktuelles getName(), keinen gespeicherten Originalnamen. Weder der Kontoname eines Spielers noch das Snapshot-Feld des Wrappers wird geändert.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("mark", 200) then return end
context.boss:set_custom_name("&c&lEnraged Boss")
context.boss:send_message("&cThe boss is enraged!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function(tick_context)
if tick_context.boss:is_alive() then
tick_context.boss:reset_custom_name()
end
end)
end
}
entity:place_temporary_block(material[, duration][, requireAir])
Platziert einen temporären Block am aktuellen Standort der Entität und gibt nil zurück, auch wenn requireAir die Platzierung verhindert. Eine positive Dauer stellt die gespeicherten Blockdaten, keine Behälterinhalte, wieder her, wenn der Timer endet, wenn der Chunk oder die Welt entladen wird oder wenn das Plugin heruntergefahren wird, allerdings nur, solange an der Stelle noch der temporäre Block steht. Eine erneute Platzierung auf demselben temporären Block startet dessen Timer neu. Blöcke mit Blockentitäten, etwa Truhen, und Blöcke, die ein anderer Besitzer temporärer Blöcke hält, werden übersprungen. Das Abbauen des Blocks lässt nichts fallen. Eine nichtpositive Dauer platziert den Block dauerhaft und ohne Verfolgung. Verwende ein Blockmaterial und prüfe Schutzregeln selbst.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
material | string | Name des Blockmaterials | |
duration | number | 0 | Positive Ticks bis zur Wiederherstellung; nichtpositive Werte platzieren den Block dauerhaft |
requireAir | boolean | false | Nur platzieren, wenn der Block derzeit Luft ist |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("ice_trap", 200) then return end
context.player:place_temporary_block("ICE", 60, true)
context.player:send_message("&bIce forms at your feet!")
end
}
entity:get_height()
Gibt die Höhe der Entität in Blöcken zurück.
entity:is_on_ground()
Gibt Bukkits aktuelles isOnGround()-Flag zurück. Führt keine neue Block- oder Kopffreiheitsprüfung aus.
entity.is_valid
Bei einem Wrapper für eine lebende Entität speichert dieses boolesche Feld die Bukkit-Gültigkeit zum Erstellungszeitpunkt. Lies es mit einem Punkt (entity.is_valid); ein Methodenaufruf führt zu einem Fehler.
Da es sich um einen Snapshot handelt, veraltet der Wert und ersetzt keine Live-Prüfung. Verwende entity:is_alive(), wenn du den aktuellen Zustand brauchst, und is_valid() (die Methode) bei Referenz-Wrappern für nicht-lebende Entitäten, die du über mehrere Ticks hinweg gespeichert hast.
entity:is_frozen()
Gibt true zurück, wenn die Entität (sofern sie als Custom Boss verfolgt wird) das Frozen-Flag gesetzt hat.
entity:set_awareness_enabled(aware[, duration])
Setzt die Wahrnehmung des Mobs und speichert den ersetzten Wert. Wirkt nur auf Mob-Entitäten. Eine positive Dauer stellt diesen Wert nach den angegebenen Ticks wieder her; andernfalls bleibt die Änderung bestehen, bis diese Power beendet wird, was den Wert ebenfalls wiederherstellt. Ein Aufruf mit true, während diese Power eine Wahrnehmungsänderung hält, beendet diese Änderung, statt eine neue anzuwenden.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
aware | boolean | true, um die Wahrnehmung zu aktivieren | |
duration | number | 0 | Stellt den ersetzten Wert nach diesen Ticks wieder her; 0 behält die Änderung bei, bis die Power beendet wird |
entity:is_healing() / entity:set_healing(enabled)
Liest oder setzt das Heilungsflag eines registrierten Elites. Das heilt nicht selbst und startet keinen Heilungstimer. set_healing(true) markiert den Elite als heilend, sofern er es noch nicht ist; set_healing(false) entfernt nur eine Heilung, die diese Power gesetzt hat. Wird die Power beendet, entfernt sie jedes Heilungsflag, das ihr noch gehört. Nicht registrierte Entitäten liefern beim Lesen false und bleiben beim Setzen unverändert.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Gibt true zurück, wenn die Bounding Box der Entität die numerische achsenparallele Box überschneidet. Welten werden nicht verglichen; übergib einen Mittelpunkt in der Welt der Entität. Ein nicht auflösbarer Mittelpunkt ergibt false.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
center | location-Tabelle | Mittelpunkt der Testbox | |
halfX | number | 0.5 | Halbe Breite auf der X-Achse |
halfY | number | wie halfX | Halbe Höhe auf der Y-Achse |
halfZ | number | wie halfX | Halbe Breite auf der Z-Achse |
entity:remove_elite()
Entfernt die Elite-Entität aus dem EliteMobs-Tracking. Ist die Entität ein Elite, despawnt dies sie ordnungsgemäß über EliteMobs.
entity:remove()
Entfernt eine einfache lebende Entität, die ein Skript gespawnt hat, etwa einen Rüstungsständer. Gibt true zurück, wenn sie entfernt wurde. Spieler und Elites werden mit false abgelehnt; despawne Elites mit remove_elite().
entity:set_invisible(enabled) und entity:set_silent(enabled)
set_invisible blendet den Körper der Entität aus; getragene und gehaltene Gegenstände bleiben sichtbar. set_silent schaltet die eigenen Geräusche der Entität stumm.
entity:set_marker(enabled)
Nur für Rüstungsständer. Diese vier Methoden gibt es bei Rüstungsständer-Wrappern; bei jeder anderen Entität fehlen sie.
| Methode | Wirkung |
|---|---|
set_marker(enabled) | Ein Marker-Ständer hat keine Hitbox; er kann nicht getroffen werden, und nichts kollidiert mit ihm |
set_small(enabled) | Ständer in halber Größe |
set_base_plate(enabled) | Zeigt oder verbirgt die steinerne Bodenplatte |
set_arms(enabled) | Zeigt oder verbirgt die Arme |
Für ein rein visuelles schwebendes Item oder einen Block verwende bevorzugt world:spawn_display_at_location, das nichts davon benötigt.
entity:set_custom_name_visible(visible)
Legt fest, ob der benutzerdefinierte Name der Entität immer sichtbar ist oder nur, wenn man sie ansieht.
| Parameter | Typ | Hinweise |
|---|---|---|
visible | boolean | true für immer sichtbar |
entity:set_equipment(slot, material[, options])
Ersetzt den gewählten Slot durch ein neues Item des Materials. Slot-, Material- und Verzauberungsnamen ignorieren Groß- und Kleinschreibung. Unbekannte Slots oder Materialien ändern nichts; unbekannte Verzauberungen werden übersprungen, bekannte ohne normale Levelbeschränkungen angewendet. Dies lädt keine Custom-Item-Datei und bewahrt keine Metadaten des vorherigen Items. Gibt nil zurück.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
slot | string | Ausrüstungs-Slot: "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Materialname (z. B. "DIAMOND_SWORD", "IRON_HELMET") | |
options | Tabelle | {} | Optionale Einstellungen (siehe unten) |
Options-Tabelle:
| Key | Typ | Default | Hinweise |
|---|---|---|---|
enchantments | Array von Tabellen | nil | Jeder Eintrag: { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Ob das Item unzerstörbar ist |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Give the boss a glowing diamond sword
context.boss:set_equipment("HAND", "DIAMOND_SWORD", {
unbreakable = true,
enchantments = {
{ type = "SHARPNESS", level = 5 }
}
})
end
}
entity:damage_equipment(slot, amount)
Beschädigt das Item in HAND, OFF_HAND, HEAD, CHEST, LEGS oder FEET und gibt den tatsächlich angewendeten Haltbarkeitsschaden zurück. Fordere pro Aufruf 1 bis 64 Punkte an. Fehlende, nicht beschädigbare oder unzerstörbare Items liefern 0.
Bei Spielern wird PlayerItemDamageEvent ausgelöst; Abbruch und geänderte Schadensmenge werden berücksichtigt. Ein Listener kann die Menge über die ursprüngliche Anfragengrenze von 64 Punkten erhöhen; sie bleibt durch die verbleibende Haltbarkeit begrenzt. Erreicht ein Item seinen maximalen Schaden, wird der gesamte Stack aus dem Slot entfernt und PlayerItemBreakEvent ausgelöst. Metadaten für benutzerdefinierten Maximalschaden werden berücksichtigt. Die Methode berechnet selbst keine Unbreaking-Reduktion. Ungültige Slots oder Anfragen außerhalb von 1..64 lösen einen Lua-Argumentfehler aus.
entity:is_ai_enabled()
Gibt true zurück, wenn die KI aktiviert ist. Bei registrierten Elites liest sie den logischen KI-Zustand von EliteMobs einschließlich der Verwaltung nativen Verhaltens, statt sich nur auf Bukkits zugrunde liegendes KI-Flag zu verlassen.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.boss:is_ai_enabled() then
context.log:info("Boss AI is active")
else
context.log:info("Boss AI is disabled (stunned?)")
end
end
}
Referenz-Wrapper für nicht-lebende Entitäten
Wenn eine gespawnte Entität keine LivingEntity ist – zum Beispiel ein fallender Block, ein Projektil oder ein Feuerball –, erhältst du einen leichteren Referenz-Wrapper. Diese werden von Methoden wie context.world:spawn_falling_block_at_location() oder context.boss:summon_projectile() zurückgegeben.
Snapshot-Felder: name, uuid, entity_type, is_player (immer false), is_elite (immer false), is_mount (normalerweise false; boss:get_mount() setzt es auf true), current_location.
Methoden:
| Methode | Hinweise |
|---|---|
is_valid() | Live-Gültigkeitsprüfung. Anders als bei Wrappern lebender Entitäten ist dies hier wirklich eine Methode |
get_location() | Aktueller Live-Standort |
get_velocity() | Aktueller Geschwindigkeitsvektor |
is_on_ground() | Ob auf dem Boden |
teleport_to_location(location) | Teleportiert die Entität |
set_velocity_vector(vector) | Setzt die Geschwindigkeit |
set_direction_vector(vector) | Setzt die Richtung (nur Fireball) |
set_yield(value) | Setzt die Explosionsstärke (nur Fireball) |
set_gravity(enabled) | Schaltet die Schwerkraft um |
detonate() | Fordert die Zündung von Firework-Entitäten an; ohne Wirkung auf andere Typen |
remove() | Entfernt die Entität aus der Welt |
unregister([reason]) | Führt für erkannte registrierte Entitäten die EliteMobs-Tracker-Entfernung aus; nicht registrierte Entitäten bleiben unverändert |
Diese Wrapper bieten auch alle Fahrzeug- und Passagiermethoden, etwa is_inside_vehicle(), get_vehicle(), set_vehicle(v), add_passenger(p) und eject_passengers(). Damit kann ein Boss auf einer nicht lebenden Entität reiten.
unregister akzeptiert einen Entfernungsgrund ohne Beachtung der Groß- und Kleinschreibung und verwendet standardmäßig OTHER; es ist keine boolesche Erfolgsabfrage. Wrapper-Methoden behalten die Referenz auf die Entität. Prüfe daher is_valid(), bevor du eine gespeicherte Referenz verwendest. Eine durch die Lua-Instanz verzögerte Entfernung wird beim Schließen der Instanz abgebrochen. Verwende eine passende native Dauer oder die Registrierung beim Besitzer, wenn die Bereinigung das Script überleben muss.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
local fb = context.boss:summon_projectile("FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5
)
if fb == nil then return end
-- fb is a non-living reference wrapper; remove it after 5 seconds if still alive
context.scheduler:run_after(100, function()
if fb:is_valid() then
fb:remove()
end
end)
end
}
context.player
Verfügbar, wenn das direkte Ziel oder der Akteur des Events ein Spieler ist, unter anderem in on_boss_damaged_by_player und on_player_damaged_by_boss. Player-Wrapper enthalten die gemeinsamen Methoden lebender Entitäten. Methoden, die einen registrierten Elite oder Custom Boss erfordern, bleiben bei normalen Spielern wirkungslos. Die folgenden Extras sind nur für Spieler verfügbar.
context.player ist nil in Hooks, die keinen zugeordneten Spieler haben, etwa on_spawn, geplanten Callbacks und Timer-Hooks. Prüfe vor der Verwendung immer auf nil.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}
Nur Spieler betreffende Felder
| Feld | Typ | Hinweise |
|---|---|---|
game_mode | string | Snapshot des Spielmodus in Großbuchstaben (z. B. "SURVIVAL") |
Nur Spieler betreffende Methoden
| Methode | Hinweise |
|---|---|
send_message(message) | Chat-Nachricht mit EliteMobs-Farbformatierung |
show_action_bar(message) | Action-Bar-Text |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Titelbildschirm-Overlay |
show_boss_bar(title[, color][, style][, duration]) | Temporäre Boss-Leiste |
run_command(command) | Führt einen Befehl als Spieler aus (ohne führenden /) |
Beispiel
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then return end
local hp_pct = context.player:get_health() / context.player:get_maximum_health()
if hp_pct < 0.3 then
context.player:show_title("&4LOW HEALTH", "&7Find cover!", 5, 30, 10)
context.player:show_boss_bar("&cBoss Enrage Incoming", "RED", "SEGMENTED_6", 80)
end
end
}
context.boss
Der Boss-Wrapper für den Elite-Mob, dem diese Lua-Power gehört. In jedem Hook immer verfügbar.
Solange eine lebende Entität zugrunde liegt, erbt der Boss-Wrapper die gemeinsamen Methoden lebender Entitäten, darunter push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self und overlaps_box_at_location. Er erbt keine reine Spieleroberfläche oder Spielerbefehle. Die folgenden Methoden sind boss-spezifisch oder verwenden die EliteEntity-Schicht. Fehlt die zugrunde liegende Entität, existiert die Tabelle weiterhin, aber nicht zwingend mit allen geerbten Methoden.
Boss-Felder
| Feld | Typ | Hinweise |
|---|---|---|
boss.name | string | Anzeigename |
boss.uuid | string | UUID des Boss-Elites |
boss.entity_type | string | Bukkit-EntityType-Name |
boss.is_monster | boolean | true, wenn die zugrunde liegende Entität ein Monster ist |
boss.level | number | Elite-Level |
boss.health | number | Aktuelle Gesundheit (Snapshot) |
boss.maximum_health | number | Maximale Gesundheit (Snapshot) |
boss.damager_count | number | Anzahl der Verursacher (Snapshot) |
boss.is_in_combat | boolean | Snapshot des Kampfzustands |
boss.exists | boolean | Ob der Elite beim Aufbau dieser Tabelle existierte |
boss.current_location | location-Tabelle | Position bei der Wrapper-Erstellung (Snapshot) |
Beispiel
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Boss-Methoden
Patrouillen-Bewegungsmethoden
Bosse mit konfigurierter Patrouille stellen patrol_pause(), patrol_resume(), walk_to(x, y, z), hold(x, y, z) und teleport(x, y, z) bereit. Koordinaten sind Versätze vom Spawnpunkt; jede Methode meldet, ob die Anfrage angenommen wurde. walk_to setzt die Route bei Ankunft fort, hold wartet auf patrol_resume(), und lange Wege nutzen den automatischen Löser.
boss:is_alive()
Gibt true zurück, wenn die Boss-Entität gültig und nicht tot ist und der Elite noch existiert. Verwende dies anstelle des Feldes exists für Live-Prüfungen.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.boss:is_alive() then return end
context.boss:send_message("&cI still live!")
end
}
boss:get_location()
Gibt den aktuellen Live-Standort des Bosses als location-Tabelle zurück.
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
context.world:spawn_particle_at_location(loc, "FLAME")
end
}
boss:get_eye_location()
Gibt den Standort des Bosses auf Augenhöhe zurück.
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local eye = context.boss:get_eye_location()
context.world:spawn_particle_at_location(eye, "SMOKE")
end
}
boss:set_ai_enabled(enabled[, duration])
Setzt die KI des Bosses nach denselben Regeln für eigene Änderungen wie entity:set_ai_enabled: Eine positive Dauer stellt den ersetzten Wert wieder her, und das Schließen der Power stellt jede noch aktive Änderung wieder her.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
enabled | boolean | true, um die KI zu aktivieren | |
duration | number | 0 | Stellt den ersetzten Wert nach diesen Ticks wieder her; 0 behält die Änderung bei, bis die Power beendet wird |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("stun", 200) then return end
context.boss:set_ai_enabled(false, 60)
context.boss:send_message("&7The boss is stunned for 3 seconds!")
end
}
boss:teleport_to_location(location)
Fordert mit den oben beschriebenen nativen Standortregeln einen Bukkit-Teleport an. Gibt nil zurück, keine Erfolgsbestätigung. Die Methode verschiebt weder den konfigurierten Spawnpunkt noch setzt sie ein Patrouillenziel.
| Parameter | Typ | Hinweise |
|---|---|---|
location | location-Tabelle | Ziel |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("retreat", 300) then return end
local spawn = context.entities:get_boss_spawn_location()
context.boss:teleport_to_location(spawn)
context.boss:send_message("&7The boss retreats to its lair!")
end
}
boss:set_velocity_vector(vector)
Setzt die Geschwindigkeit des Bosses sofort.
| Parameter | Typ | Hinweise |
|---|---|---|
vector | Vektor-Tabelle | { x, y, z } oder { x = 0, y = 1, z = 0 } |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Boss leaps into the air at combat start
context.boss:set_velocity_vector({ x = 0, y = 2.0, z = 0 })
context.boss:send_message("&cThe boss leaps!")
end
}
boss:restore_health(amount)
Ruft die EliteMobs-Heilung mit dem abbrechbaren EliteMobHealEvent auf. Die Gesundheit wird auf den kleineren Wert aus EliteMobs-Maximum und Basiswert des Bukkit-Maximalgesundheitsattributs begrenzt. Gibt nil zurück; ein Event-Abbruch kann die Heilung verhindern.
| Parameter | Typ | Hinweise |
|---|---|---|
amount | number | Menge der Heilung |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("heal", 200) then return end
context.boss:restore_health(20)
context.boss:send_message("&aThe boss regenerates!")
context.boss:spawn_particle_at_self("HEART")
end
}
boss:play_sound_at_self(sound[, volume][, pitch])
Spielt einen Sound am Standort des Bosses ab.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
sound | string | Minecraft-Sound-Key wie "entity.wither.spawn" oder ein Spigot-Sound-Enum-Name. Resource-Pack-Keys funktionieren ebenfalls. | |
volume | number | 1.0 | Lautstärke |
pitch | number | 1.0 | Tonhöhe |
Beispiel
return {
api_version = 1,
on_spawn = function(context)
context.boss:play_sound_at_self("entity.wither.spawn", 1.0, 0.8)
end
}
boss:spawn_particle_at_self(particleOrSpec[, count])
Erzeugt Partikel am Standort des Bosses.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
particleOrSpec | string oder Tabelle | Partikelname oder Spezifikations-Tabelle | |
count | number | 1 | Anzahl der Partikel |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:spawn_particle_at_self("SMOKE", 20)
context.boss:send_message("&8Smoke billows from the boss!")
end
}
boss:play_model_animation(name)
Spielt, falls verfügbar, eine Custom-Model-Animation am Boss ab.
| Parameter | Typ | Hinweise |
|---|---|---|
name | string | Name der Animation |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:has_mount() / boss:get_mount()
Prüft oder gibt die Entität zurück, auf der dieser Boss derzeit reitet. boss:get_mount() gibt nil zurück, wenn der Boss kein Reittier hat. Wird ein Reittier zurückgegeben, hat dessen Wrapper is_mount = true.
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local mount = context.boss:get_mount()
if mount ~= nil then
context.log:info("Boss is mounted on " .. mount.entity_type)
end
end
}
boss:set_mount(entity) / boss:clear_mount() / boss:dismount()
Setzt den Boss auf ein Reittier oder steigt ab. boss:set_mount(entity) lässt den Boss auf dem übergebenen Entitäts-Wrapper reiten und gibt true zurück, wenn Bukkit die Passagieränderung akzeptiert hat. boss:clear_mount() und boss:dismount() lassen den Boss beide sein aktuelles Fahrzeug verlassen.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if not context.cooldowns:check_local("mount_check", 100) then return end
if context.boss:has_mount() then
context.boss:dismount()
end
end
}
boss:face_direction_or_location(vectorOrLocation)
Lässt den Boss in eine Richtung oder zu einem Standort blicken.
| Parameter | Typ | Hinweise |
|---|---|---|
vectorOrLocation | Vektor- oder location-Tabelle | Richtung, in die geblickt werden soll |
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.boss:face_direction_or_location(context.player:get_location())
end
}
boss:navigate_to_location(location[, speed][, forceTeleport][, timeout])
Verwendet die Wegfindung, um den Boss zu einem Standort laufen zu lassen. Funktioniert nur mit benutzerdefinierten Bossen.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
location | location-Tabelle | Ziel | |
speed | number | 1.0 | Bewegungsgeschwindigkeitsmultiplikator |
forceTeleport | boolean | false | Den Boss zum Ziel teleportieren, wenn timeout vor seiner Ankunft abläuft |
timeout | number | 0 | Wartezeit bis zum Abbruch in Ticks. 0 verwendet den Standard von 100 Ticks (5 Sekunden) |
Die Navigation endet auch, wenn der Boss sich dem Ziel auf weniger als einen Block nähert, nicht mehr existiert oder die Zielwelt verlässt. Eine neue Navigation beendet die zuvor auf diesem Boss laufende Navigation. Sie verwendet eine unabhängige Bukkit-Aufgabe und wird durch Pausieren oder Schließen der Lua-Instanz nicht abgebrochen. Die Methode gibt nil zurück, kein Ankunftsergebnis; das Ziel wird beim Aufruf gespeichert.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("charge", 200) then return end
context.boss:navigate_to_location(context.player:get_location(), 1.5)
context.boss:send_message("&cThe boss charges at you!")
end
}
boss:add_tag(tag[, duration]) / boss:remove_tag(tag) / boss:has_tag(tag)
Verwaltet Tags am Boss.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.5 and not context.boss:has_tag("phase2") then
context.boss:add_tag("phase2")
context.boss:send_message("&4Entering Phase 2!")
end
end
}
boss:send_message(message[, range])
Sendet eine formatierte Chat-Nachricht an alle Spieler im kugelförmigen 3D-Radius in der Welt des Bosses. Spielmodus, Sichtlinie, Kampfteilnahme und Instanzzugehörigkeit werden nicht gefiltert.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
message | string | Nachrichtentext mit Farbcodes | |
range | number | 20 | Radius in Blöcken |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:send_message("&4You dare challenge me?!")
end
}
boss:summon_projectile(entityType, origin, destination[, speed][, options])
Erzeugt eine Entität und gibt ihren nativen Wrapper zurück, oder nil bei nicht auflösbarer Position oder unbekanntem Entitätstyp. Erkannte, aber nicht erzeugbare Typen können weiterhin fehlschlagen. Normale Bukkit-Projektile starten beim Boss, sofern nicht spawn_at_origin = true gesetzt ist; der angegebene Ursprung bestimmt trotzdem die Richtung zum Ziel. Beide Positionen müssen in derselben Welt liegen, da der Helfer dies nicht prüft. Andere Entitätstypen erscheinen am angegebenen Ursprung und erhalten den passenden lebenden oder nicht lebenden Wrapper.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
entityType | string | Entitätstyp (z. B. "FIREBALL", "ARROW") | |
origin | location-Tabelle | Startposition | |
destination | location-Tabelle | Zielposition | |
speed | number | 1.0 | Projektilgeschwindigkeit |
options | Tabelle | {} | Siehe Optionen unten |
Options-Tabelle:
| Key | Typ | Hinweise |
|---|---|---|
duration | number | Positive Werte planen eine unabhängige Entfernung nach diesen Ticks; nichtpositive Werte fügen keinen Timer hinzu |
max_ticks | number | Grenze der Landeüberwachung; standardmäßig 6000 |
custom_damage | number | Metadaten für benutzerdefinierten Projektilschaden, kein garantierter Gesundheitsverlust |
detonation_power | string | Power-Dateiname als Metadatum für explosive Projektile, keine numerische Explosionsstärke |
yield | number | Explosionsstärke (Fireball) |
persistent | boolean | Setzt bei Angabe die Bukkit-Persistenz; überschreibt weder Dauer noch Kollision oder Entfernung durch den Besitzer |
effect | string | EntityEffect-Name, der beim Spawn abgespielt wird |
incendiary | boolean | Ob die Explosion Brände auslöst |
gravity | boolean | Ob das Projektil Schwerkraft hat |
glowing | boolean | Leuchteffekt |
invulnerable | boolean | Ob das Projektil unverwundbar ist |
track | boolean | Standard true: registriert das Projektil bei EliteMobs; bewirkt keine Zielverfolgung. |
spawn_at_origin | boolean | Standard false: normale Projektile starten beim Boss. Mit true werden sie am angegebenen Ursprung erzeugt. |
direction_only | boolean | Setzt bei Feuerbällen mit explizitem Ursprung die Richtung ohne zusätzliche Geschwindigkeitszuweisung |
on_land | function | Callback (landing_location, spawned_entity) bei Bodenkontakt, Ungültigkeit oder Überschreiten von max_ticks; nicht nur bei einem Aufprall |
direction_only betrifft Feuerbälle, die ausdrücklich am angegebenen Ursprung erzeugt werden. Es überspringt die zusätzliche Geschwindigkeitszuweisung nach dem Setzen der Richtung. Das Ziel bestimmt weiterhin die Richtung. Bukkit-Projektile erhalten den Boss als Schützen. Mit track = true wird ein Projektil bei EliteMobs registriert und an den Lebenszyklus der Boss-Verstärkungen gebunden. Dies gilt nicht für andere Entitätstypen. track = false deaktiviert diese Besitzerbereinigung; plane dann eine andere Entfernung.
Die on_land-Überwachung gehört zur Lua-Instanz und endet beim Schließen. Sie ruft (landing_location, spawned_entity) einmal bei Bodenkontakt, Ungültigkeit oder überschrittenem Zähler auf, ohne die Entität selbst zu entfernen. Ein positiver duration-Timer ist unabhängig und überlebt das Schließen. Der Callback beweist daher keinen tatsächlichen Treffer.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if not context.cooldowns:check_local("fireball", 100) then return end
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
context.player:get_location(),
1.5,
{
custom_damage = 10,
on_land = function(loc, entity)
context.world:spawn_particle_at_location(loc, "EXPLOSION")
end
}
)
end
}
boss:summon_reinforcement(filename[, zoneOrLocation][, duration])
Beschwört ohne Ankündigung eine Verstärkung aus einer Custom-Boss-Datei, registriert den Beschwörer und übernimmt normalisierten Kampf, wenn der beschwörende Custom Boss ihn verwendet. Die eigene Konfiguration und die Regeln für dynamische Level bestimmen das Level der Verstärkung. Eine Zone wählt einen zufälligen abgetasteten Standort oder ihren Mittelpunkt, wenn keine Standorte vorhanden sind. Ein nicht auflösbares Ergebnis verwendet den Boss-Standort. Gibt den Wrapper der lebenden Entität zurück, oder nil, wenn keine lebende Verstärkung entstand.
| Parameter | Typ | Hinweise |
|---|---|---|
filename | string | Dateiname der Boss-Konfiguration |
zoneOrLocation | location-Tabelle oder Zone | Optionaler Spawn-Standort oder Zonendefinition. Standardmäßig der Boss-Standort. |
duration | number | Optionale positive Zeit bis zur Flucht in Ticks. Standard 0 fügt keinen Timer hinzu; dies überschreibt nicht das Level. |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 0)
context.boss:send_message("&cMinions, come to my aid!")
end
}
boss:despawn()
Entfernt den Boss über EliteMobs mit dem Grund OTHER. boss:remove() ist ein Alias mit demselben Ablauf. Dies ist weder ein Schadenstreffer noch eine normale Anfrage nach Todesbelohnungen.
Beispiel
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
local pct = context.boss:get_health() / context.boss:get_maximum_health()
if pct < 0.1 then
context.boss:send_message("&7The boss vanishes into thin air!")
context.boss:despawn()
end
end
}
boss:get_nearby_players(range)
Gibt Player-Wrapper im kugelförmigen 3D-Radius in der Welt des Bosses zurück. Filtert weder Spielmodus noch Sichtlinie oder Instanzteilnahme und sortiert nicht nach Entfernung.
| Parameter | Typ | Hinweise |
|---|---|---|
range | number | Radius in Blöcken |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local players = context.boss:get_nearby_players(30)
for _, p in ipairs(players) do
p:show_action_bar("&cThe boss sees you!")
end
end
}
boss:get_damager_count()
Gibt die aktuelle Größe des gespeicherten Angreiferverzeichnisses zurück. Anders als damager_count ist dies eine Live-Abfrage; sie zählt nicht nur nahe oder aktuell verbundene Kampfteilnehmer.
boss:get_nearby_elites(radius)
Gibt bis zu 32 lebende, registrierte Elites in der Boss-Welt zurück, ohne den Boss selbst. Der Radius muss endlich, größer als 0 und höchstens 64 Blöcke sein. Die Ergebnisse sind Wrapper lebender Entitäten, nach Entfernung und bei Gleichstand nach Elite-UUID sortiert. Diese Abfrage allein bestätigt nicht, dass ein Effekt jedes Ergebnis treffen darf.
boss:get_target_player()
Gibt das aktuelle Mob-Ziel des Bosses als Player-Wrapper zurück oder nil, wenn das Ziel kein Spieler ist oder nicht gesetzt ist.
Zonen- & Partikelmethoden
Diese Methoden kombinieren Zonen mit Partikeleffekten. Sie benötigen eine Zonen-Tabelle als Eingabe.
boss:get_nearby_players_in_zone(zone)
Gibt Wrapper der Spieler zurück, deren Entitäten die native Zonenform in der Boss-Welt erfüllen. Filtert weder Spielmodus noch Instanzteilnahme. Dies ist eine neue Abfrage, keine dauerhafte Überwachung.
| Parameter | Typ | Hinweise |
|---|---|---|
zone | Zonen-Tabelle | Eine Definition einer Zonenform |
boss:spawn_particles_in_zone(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
Füllt das Innere einer Zone mit Partikeln. Die Argumente werden der Reihe nach übergeben; eine Spezifikationstabelle wird hier nicht akzeptiert.
| Parameter | Typ | Standard | Hinweise |
|---|---|---|---|
zone | Zonen-Tabelle | Native Zonenform mit kind; siehe Zonen und Ziele | |
particle | string | Name des Partikeltyps | |
amount | number | 1 | Partikel pro ausgewähltem Standort |
x, y, z | number | 0 | Streuung oder Richtung, wenn amount gleich 0 ist |
speed | number | 0 | Partikelgeschwindigkeit |
coverage | number | 1.0 | Unabhängige Auswahlwahrscheinlichkeit pro Standort, begrenzt auf 0.01–1.0; eine nicht leere Menge liefert mindestens einen Standort |
boss:spawn_particles_in_zone_border(zone, particle[, amount][, x][, y][, z][, speed][, coverage])
Wie oben, verwendet jedoch Standorte am Rand der Zone statt im Inneren.
boss:get_particles_from_self_toward_zone(zone, particle[, speed])
Gibt Partikelspezifikationen zurück, die an ausgewählten Zonenpositionen liegen und vom Boss weg zeigen. Erzeugt keine Partikel am Boss und animiert keine Reise von dort. Übergib das Ergebnis an boss:spawn_particles_with_vector(...).
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
zone | Zonen-Tabelle | Zielzone | |
particle | string | Name des Partikeltyps | |
speed | number | 0.1 | In jede Spezifikation geschriebene Partikelgeschwindigkeit |
Jeder Eintrag hat die Form { location = ..., particle = ..., amount = 0, x/y/z = <unit direction>, speed = ... }. Jede Zonenposition hat eine Auswahlwahrscheinlichkeit von 20 %, wobei aus einer nicht leeren Menge mindestens eine gewählt wird. Danach werden Positionen übersprungen, die mit der Boss-Position identisch sind. Das tatsächliche Richtungsverhalten hängt vom Partikeltyp ab.
boss:get_particles_toward_self(zone, particle, speed)
Dasselbe mit umgekehrter Richtung; jedes Partikel zeigt von seiner Zonenposition zum Boss. Gibt ebenfalls das Array zurück, statt Partikel zu erzeugen.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
zone | Zonen-Tabelle | Quellzone | |
particle | string | Name des Partikeltyps | |
speed | number | Einen expliziten Wert wie 0.1 übergeben; sonst wird der Partikelname als Zahl gelesen und der Aufruf schlägt fehl. |
boss:spawn_particles_with_vector(particles)
Erzeugt ein Array gerichteter Partikel, jeweils mit eigener Position und eigenem Geschwindigkeitsvektor.
| Parameter | Typ | Hinweise |
|---|---|---|
particles | Array von Tabellen | Jeder Eintrag definiert ein Partikel mit Position und Richtung |
Ender-Dragon-Methoden
Diese Methoden gelten nur, wenn die Boss-Entität ein Ender Dragon ist.
boss:get_ender_dragon_phase()
Gibt den aktuellen EnderDragon.Phase-Namen als String zurück oder nil, wenn der Boss kein Ender Dragon ist.
boss:set_ender_dragon_phase(phase)
Setzt die Phase des Ender Dragons.
| Parameter | Typ | Hinweise |
|---|---|---|
phase | string | EnderDragon.Phase-Name (z. B. "CIRCLING", "CHARGE_PLAYER") |
Methoden zur Unterstützung spezieller Kräfte
Diese Methoden unterstützen integrierte EliteMobs-Kraftmechaniken aus Lua-Scripts.
boss:start_tracking_fireball_system(speed?)
Startet für diese Power einen Controller auf einem Monster-Boss. Bei seinem ersten Lauf im nächsten Tick und danach alle 8 Sekunden startet er zielverfolgende Feuerbälle auf Survival- und Adventure-Spieler im Umkreis von 20 Blöcken auf jeder Achse, solange das Monster ein Ziel hat. Ein Lauf ohne Ziel stoppt den Controller, auch der erste Lauf; ein neuer Aufruf kann ihn erneut starten. Wiederholte Aufrufe während des Betriebs ändern die Geschwindigkeit nicht. Der Controller gehört zum Script der Power: Pausieren des Scripts pausiert ihn, Schließen des Scripts stoppt ihn. Startet der Aufruf einen Controller, muss die Geschwindigkeit endlich und positiv sein, sonst löst der Aufruf einen Fehler aus.
Die Feuerbälle haben Explosionsstärke 3 und sind brandstiftend. Die Verfolgungsaufgabe jedes Feuerballs ist unabhängig vom Script. Sie endet nach ungefähr 3 Minuten oder bei ungültigem Kontext, entfernt aber den Feuerball nicht selbst. Ein nicht abgebrochener Treffer gegen einen registrierten Feuerball wechselt dessen Verfolgung zwischen Spieler und Beschwörer.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
speed | number | 0.5 | Feuerball-Geschwindigkeit; muss endlich und positiv sein |
boss:handle_spirit_walk_damage(cause)
Übergibt eine Schadensursache an den Spirit-Walk-Helfer. Feuer, Feuerticks, Gift, Wither, Dornen und Flächenangriffe erhöhen dessen Zähler nicht. Ertrinken und Ersticken starten sofort eine Flucht; andere akzeptierte Ursachen lösen sie bei jedem neunten Treffer aus. Der Helfer sucht ein nahes gültiges Ziel und animiert die Bewegung dorthin mit vorübergehender Unverwundbarkeit. Er bricht das übergebene Schadensevent nicht ab und garantiert keine Position hinter dem Angreifer.
| Parameter | Typ | Hinweise |
|---|---|---|
cause | string | Bukkit-DamageCause-Name (z. B. "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Gibt das Aktivitätsflag des Schild-Controllers zurück. Dies garantiert keine positive Schildreserve in einer bestimmten Richtung.
boss:initialize_shield_wall(openingDirection?)
Initialisiert richtungsabhängige Schildreserven und Anzeigen, sofern noch keine Wand aktiv ist. Jede geschützte Richtung beginnt mit Gesundheit in Höhe des Boss-Levels. Das Argument wählt die ungeschützte Öffnung, keine Ladungszahl. Die Lua-Methode gibt nil zurück und installiert keinen Handler für Schadensevents.
| Parameter | Typ | Default | Hinweise |
|---|---|---|---|
openingDirection | number | 1 | 1 = Norden, 2 = Osten, 3 = Süden, 4 = Westen; andere Ganzzahlen schützen alle vier Seiten |
boss:shield_wall_absorb_damage(player, damage)
Prüft die Position des Angreifers relativ zum Boss und zieht den angegebenen Schaden von der Schildreserve dieser Richtung ab. Gibt true zurück, wenn die Reserve vor dem Abzug positiv war, auch wenn der Treffer sie übersteigt. Fehlende Spieler oder Zustände, andere Welten sowie offene oder erschöpfte Richtungen ergeben false. Die Methode bricht das Schadensevent nicht ab. Bei true muss dein Schadens-Hook context.event.cancel_event() aufrufen, um den Treffer zu blockieren. Übergib eine nichtnegative Schadensmenge.
| Parameter | Typ | Hinweise |
|---|---|---|
player | Player-Wrapper | Der angreifende Spieler |
damage | number | Zu absorbierende Schadensmenge |
boss:deactivate_shield_wall()
Stoppt die unabhängige Anzeigeaufgabe der Wand und entfernt ihren Zustand sowie die Schild-Rüstungsständer. Das Schließen der Lua-Instanz ruft diese Methode nicht auf; deaktiviere die Wand ausdrücklich, wenn die Mechanik endet.
boss:start_zombie_necronomicon(target, chant)
Startet den Necronomicon-Controller mit einem lebenden Ziel und einem durchlaufenden Beschwörungstext. Das zweite Argument ist Anzeigetext, kein Boss-Dateiname. Verwendet die festen Dateien necronomicon_zombie.yml mit 80 % und necronomicon_skeleton.yml mit 20 % Wahrscheinlichkeit auf dem Level des Beschwörers, eine Beschwörung alle 60 Ticks. Eine neue Aktivierung wird nur bei höchstens neun registrierten Verstärkungen und ohne aktiven Controller angenommen. Der laufende Controller füllt bis auf elf auf, aktiviert bei voller Gruppe die KI und beschwört weiter, wenn die Zahl sinkt.
Während des Beschwörens wird die Boss-KI deaktiviert und der Anzeigename geändert; Warnanzeigen beachten die Einstellung für Warneffekte. Das Ziel muss gültig, in derselben Welt und innerhalb von 30 Blöcken bleiben. Ungültiger Kontext oder Besitzerentfernung stoppt die Controller, stellt die Darstellung wieder her und entfernt ihre Verstärkungen. Diese Bukkit-Aufgaben sind unabhängig; das Schließen von Lua allein beendet sie nicht. Die Methode gibt nil zurück.
| Parameter | Typ | Hinweise |
|---|---|---|
target | Entitäts-Wrapper | Zielentität für das Necronomicon |
chant | string | Durchlaufender Anzeigetext; leerer Text verwendet den Boss-Namen, kurzer Text wird aufgefüllt |
context.players
Helfer für Spielerabfragen, die sich am Boss orientieren. Verwende diese, um Spieler zu finden, ohne einen bestimmten Spieler aus dem Event zu benötigen.
Diese Abfragen filtern weder Spielmodus, Sichtlinie, Überleben, Kampfteilnahme noch Instanzzugehörigkeit und sortieren nicht nach Entfernung. current_target() bevorzugt den Event-Akteur; context.player bevorzugt dagegen das direkte Ziel. Ein frischer geplanter Kontext hat keinen Event-Akteur und verwendet deshalb das aktuelle Mob-Ziel.
| Methode | Gibt zurück | Hinweise |
|---|---|---|
players:current_target() | Player-Wrapper oder nil | Der Event-Spieler oder das Mob-Ziel des Bosses, sofern es ein Spieler ist |
players:nearby_players(radius) | Array von Player-Wrappern | Alle Spieler innerhalb des Radius um den Boss |
players:all_players_in_world() | Array von Player-Wrappern | Alle Spieler in der Welt des Bosses |
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
local nearby = context.players:nearby_players(20)
for _, player in ipairs(nearby) do
player:send_message("&cThe boss is enraged!")
player:apply_potion_effect("GLOWING", 60, 0)
end
end
}
Beispiel
return {
api_version = 1,
on_spawn = function(context)
-- Warn everyone in the world
local everyone = context.players:all_players_in_world()
for _, p in ipairs(everyone) do
p:show_title("&4WARNING", "&7A world boss has spawned!", 10, 60, 20)
end
end
}
context.entities
Allgemeine Helfer für Entitätsabfragen, die sich am Boss orientieren.
| Methode | Gibt zurück | Hinweise |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | Array von Entitäts-Wrappern | Entitäten in der Nähe rund um den Boss |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | Array von Entitäts-Wrappern | Lebende Entitäten mit Fußposition innerhalb der einschließlich geprüften Boxgrenzen in der Welt des Mittelpunkts; keine Bounding-Box-Überschneidungsprüfung |
entities:get_all_entities([filter]) | Array von Entitäts-Wrappern | Alle passenden Entitäten in der Boss-Welt |
entities:get_direct_target_entity() | Entitäts-Wrapper oder nil | Direktes Ziel für das aktuelle Event |
entities:get_boss_spawn_location() | location-Tabelle | Der ursprüngliche Spawn-Standort des Bosses |
Gültige Filter: living (Standard), player / players, elite / elites, mob / mobs, all / entities
Nur get_nearby_entities berücksichtigt all / entities. Dies schließt nicht lebende Entitäten wie fallengelassene Items und Projektile ein, die als leichtere Referenz-Wrapper zurückgegeben werden. Lebende Ergebnisse behalten ihre vollständigen Wrapper. Dieser Filter sucht in einer achsenparallelen Box mit dem angegebenen Radius auf jeder Achse; die Filter für lebende Entitäten verwenden kugelförmige Entfernung. In anderen Abfragen fällt all / entities auf living zurück. Der Boss selbst ist immer ausgeschlossen.
Filter ignorieren Groß- und Kleinschreibung; unbekannte Filter verwenden ebenfalls living. mob meint jede lebende Entität außer Spielern, nicht nur feindliche Monster. Die Abfragen haben keinen automatischen Instanzteilnehmerfilter, keine Ergebnisgrenze und keine Entfernungssortierung. Breite Abfragen durchlaufen die geladenen lebenden Entitäten der Welt; verwende einen begrenzten Radius und vermeide unnötige Wiederholungen. get_direct_target_entity() verwendet das direkte Event-Ziel und kann nil sein; es greift nicht auf das aktuelle Kampfziel des Mobs zurück.
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Damage all nearby elites
local elites = context.entities:get_nearby_entities(10, "elites")
for _, elite in ipairs(elites) do
elite:deal_damage(5)
end
end
}
Beispiel
return {
api_version = 1,
on_enter_combat = function(context)
-- Find players in a box area
local center = context.boss:get_location()
local players = context.entities:get_entities_in_box(center, 10, 5, 10, "players")
for _, p in ipairs(players) do
p:send_message("&eYou are in the danger zone!")
end
end
}
