Scripting Lua : Boss et Entités
Cette page couvre tout ce qui concerne les wrappers de boss et d'entités dans les pouvoirs Lua EliteMobs : context.boss, context.player, context.players, context.entities, et les tables wrapper d'entité qu'ils retournent. Si vous êtes nouveau aux pouvoirs Lua, commencez d'abord par Démarrage.
Wrappers d'entité
Lorsque vous accédez aux entités via l'API Lua -- que ce soit depuis context.boss, context.player, des résultats de requête comme context.players:nearby_players(), ou des champs d'événement -- vous recevez toujours des tables wrapper. Ce ne sont pas des objets Bukkit bruts. Chaque wrapper fournit un ensemble de champs (valeurs de snapshot capturées au moment de la création) et de méthodes (appels en direct qui atteignent le serveur).
Deux règles à retenir :
- Les champs comme
health,current_location, etmaximum_healthsont des snapshots. Ils reflètent l'état au moment où le wrapper a été créé et ne se mettent pas à jour automatiquement. - Les méthodes comme
get_location(),get_health(), etis_alive()effectuent une vérification en direct à chaque appel.
Champs d'entité communs
Chaque wrapper d'entité vivante inclut ces champs.
| Champ | Type | Notes |
|---|---|---|
entity.name | string | Nom d'affichage |
entity.uuid | string | UUID sous forme de texte |
entity.entity_type | string | Nom Bukkit EntityType (ex. "ZOMBIE", "PLAYER") |
entity.is_player | boolean | true pour les joueurs |
entity.is_elite | boolean | true si EliteMobs le suit en tant qu'elite |
entity.is_custom_boss | boolean | true si l'entité est un Boss personnalisé (régional, instancié, etc.) |
entity.is_significant_boss | boolean | true pour les Boss personnalisés avec un multiplicateur de santé supérieur à 1 (c.-à-d. les boss majeurs, pas les renforts mineurs) |
entity.is_monster | boolean | true pour les entités de type monstre |
entity.is_valid | boolean | Flag de validité du snapshot |
entity.health | number | Santé actuelle (snapshot) |
entity.maximum_health | number | Santé max (snapshot) |
entity.current_location | location table | Position au moment où le wrapper a été créé |
entity.elite | table ou nil | Sous-table réservée aux elites ; présente uniquement quand entity.is_elite vaut true et qu'EliteMobs dispose de données d'elite pour l'entité. Voir Sous-table Elite ci-dessous. |
Sous-table Elite
Lorsqu'une entité est un elite EliteMobs, le wrapper possède une table supplémentaire entity.elite avec des champs et méthodes spécifiques aux elites. Sur les non-elites, ce champ est absent (nil).
| Champ / Méthode | Type | Notes |
|---|---|---|
entity.elite.level | number | Le niveau de l'elite |
entity.elite.name | string ou nil | Le nom d'affichage configuré de l'elite |
entity.elite.health | number | Snapshot de la santé actuelle (même valeur que entity.health) |
entity.elite.max_health | number | Snapshot de la santé max (même valeur que entity.maximum_health) |
entity.elite.is_custom_boss | boolean | Si l'elite est un Boss personnalisé |
entity.elite.health_multiplier | number | Multiplicateur de santé configuré sur le Boss personnalisé (1.0 pour les elites normaux) |
entity.elite.damage_multiplier | number | Multiplicateur de dégâts configuré sur le Boss personnalisé (1.0 pour les elites normaux) |
entity.elite:remove() | méthode | Supprime l'elite (en utilisant la raison de suppression OTHER). Utilisez ceci pour des despawns propres depuis les scripts. |
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
if context.boss.elite ~= nil then
context.log:info("Boss level: " .. context.boss.elite.level)
context.log:info("Health x" .. context.boss.elite.health_multiplier)
end
end
}
Exemple
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
}
Méthodes d'entité communes
Chaque wrapper d'entité vivante prend en charge ces méthodes. Chaque méthode effectue un appel en direct au serveur.
entity:is_alive()
Retourne true si l'entité est toujours valide et non morte.
Exemple
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()
Retourne l'emplacement actuel en direct sous forme de location table.
Exemple
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()
Retourne l'emplacement au niveau des yeux sous forme de location table.
Exemple
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()
Retourne la santé actuelle ou maximale en direct.
Exemple
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()
Retourne la vélocité actuelle de l'entité sous forme de table vecteur.
Exemple
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)
Envoie un message dans le chat à l'entité. Prend en charge le formatage couleur EliteMobs.
| Paramètre | Type | Notes |
|---|---|---|
text | string | Message avec codes couleur |
Exemple
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)
Envoie un message d'action bar à l'entité.
| Paramètre | Type | Notes |
|---|---|---|
message | string | Texte de l'action bar avec codes couleur |
Exemple
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])
Envoie un titre et un sous-titre optionnel à l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
title | string | Texte du titre | |
subtitle | string | "" | Texte du sous-titre |
fadeIn | number | 10 | Ticks de fondu entrant |
stay | number | 40 | Ticks d'affichage |
fadeOut | number | 10 | Ticks de fondu sortant |
Exemple
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])
Affiche une boss bar temporaire à l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
title | string | Texte du titre de la barre | |
color | string | "WHITE" | Valeur BarColor |
style | string | "SOLID" | Valeur BarStyle |
duration | number | 40 | Durée en ticks |
Exemple
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)
Téléporte l'entité vers un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
location | location table | Destination |
Exemple
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)
Définit immédiatement la vélocité de l'entité.
| Paramètre | Type | Notes |
|---|---|---|
vector | table vecteur | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemple
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])
Applique une poussée de vélocité après un court délai (par défaut 1 tick). Utile pour passer outre le knockback.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
vector | table vecteur | Direction et puissance | |
additive | boolean | false | Ajoute à la vélocité existante au lieu de la remplacer |
delay | number | 1 | Délai en ticks avant application |
Exemple
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)
Oriente l'entité vers un vecteur de direction ou un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
directionOrLocation | table vecteur ou location | Cible à orienter |
Exemple
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)
Met l'entité en feu pour la durée donnée.
| Paramètre | Type | Notes |
|---|---|---|
ticks | number | Durée du feu en ticks (20 ticks = 1 seconde) |
Exemple
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])
Ajoute des ticks de gel visuel à l'entité (l'effet de superposition bleue).
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
ticks | number | 1 | Quantité de ticks de gel |
Exemple
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])
Applique un effet de potion à l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
effect | string | Nom PotionEffectType | |
duration | number | Durée en ticks | |
amplifier | number | 0 | Niveau d'effet (0 = niveau I) |
Exemple
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) n'est pas disponible dans les pouvoirs Lua EliteMobs. Il n'existe que dans Magmacore/FMM. Utilisez apply_potion_effect avec une durée de 0 comme solution de contournement, ou concevez votre pouvoir sans avoir besoin de retirer les effets.
entity:deal_damage(amount) / entity:deal_custom_damage(amount) / entity:deal_damage_from_boss(amount)
Inflige des dégâts à l'entité. Trois variantes sont disponibles.
| Méthode | Notes |
|---|---|
deal_damage(amount) | Source de dégâts générique |
deal_custom_damage(amount) | Utilise BossCustomAttackDamage du boss |
deal_damage_from_boss(amount) | L'entité boss est définie comme l'attaquant |
Exemple
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)
Soigne l'entité jusqu'à sa santé maximale.
| Paramètre | Type | Notes |
|---|---|---|
amount | number | Quantité à soigner |
Exemple
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])
Active/désactive l'invulnérabilité sur l'entité. Restaure éventuellement après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'invulnérabilité | |
duration | number | nil | Restauration automatique après ce nombre de ticks |
Exemple
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])
Active/désactive l'IA sur l'entité. Restaure éventuellement après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'IA | |
duration | number | nil | Restauration automatique après ce nombre de ticks |
Exemple
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)
Gère les tags sur l'entité. Les tags sont suivis par EliteMobs et persistent pendant la durée de vie de l'entité.
| Méthode | Paramètre | Notes |
|---|---|---|
add_tag(tag[, duration]) | string, number optionnel | Ajoute le tag, retire automatiquement après ticks |
remove_tag(tag) | string | Retire le tag |
has_tag(tag) | string | Retourne true si le tag est présent |
Exemple
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)
Fait exécuter une commande à l'entité. Pour les joueurs, cela s'exécute en tant que joueur ; utilisez le texte de la commande sans / initial.
| Paramètre | Type | Notes |
|---|---|---|
command | string | Texte de la commande sans / initial |
Exemple
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])
Définit l'attribut generic_scale de l'entité. Restaure éventuellement à 1.0 après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
scale | number | Multiplicateur d'échelle | |
duration | number | nil | Restauration automatique après ce nombre de ticks |
Exemple
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)
Active/désactive la gravité sur l'entité.
| Paramètre | Type | Notes |
|---|---|---|
enabled | boolean | true pour gravité normale |
Exemple
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
-- Disable player gravity briefly and re-enable after 3 seconds
context.player:set_gravity(false)
context.player:send_message("&dYou begin to float!")
context.scheduler:run_after(60, function()
if context.player ~= nil and context.player:is_alive() then
context.player:set_gravity(true)
end
end)
end
}
entity:play_sound_at_entity(sound[, volume][, pitch])
Joue un son à l'emplacement de l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
sound | string | Nom Bukkit Sound | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Hauteur |
Exemple
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 pour play_sound_at_entity. Joue un son à l'emplacement de l'entité. Les deux noms fonctionnent de manière identique.
entity:spawn_particle_at_self(particleOrSpec[, count])
Fait apparaître des particules à l'emplacement de l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
particleOrSpec | string ou table | Nom de particule ou table spec | |
count | number | 1 | Nombre de particules |
Exemple
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])
Fait apparaître des particules à un emplacement spécifique.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
location | location table | Emplacement cible | |
particle | string | Nom du type de particule | |
count | number | 1 | Nombre de particules |
Exemple
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)
Joue une animation de modèle personnalisé si l'entité a un modèle personnalisé qui la prend en charge.
| Paramètre | Type | Notes |
|---|---|---|
name | string | Nom de l'animation |
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("attack_swing")
end
}
entity:push_relative_to(source[, strength][, xOffset][, yOffset][, zOffset])
Pousse l'entité loin d'un emplacement source ou d'un wrapper d'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
source | location ou wrapper | Origine de la poussée | |
strength | number | 1.0 | Multiplicateur de puissance de poussée |
xOffset | number | 0 | Décalage X supplémentaire |
yOffset | number | 0 | Décalage Y supplémentaire |
zOffset | number | 0 | Décalage Z supplémentaire |
Exemple
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()
Définit ou réinitialise le nom d'affichage personnalisé de l'entité. Prend en charge les codes couleur.
Exemple
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.player:set_custom_name("&c&lMarked Target")
context.player:send_message("&cYou have been marked!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function()
if context.player ~= nil and context.player:is_alive() then
context.player:reset_custom_name()
end
end)
end
}
entity:place_temporary_block(material[, duration][, requireAir])
Place un bloc temporaire à l'emplacement actuel de l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
material | string | Nom du matériau de bloc | |
duration | number | 0 | Ticks avant suppression |
requireAir | boolean | false | Place uniquement si le bloc est actuellement de l'air |
Exemple
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()
Retourne la hauteur de l'entité en blocs.
entity:is_on_ground()
Retourne true si l'entité est actuellement debout sur un sol solide.
entity:is_frozen()
Retourne true si l'entité (lorsqu'elle est suivie en tant que boss personnalisé) a le flag frozen défini.
entity:set_awareness_enabled(aware[, duration])
Active/désactive la conscience du mob. N'affecte que les entités de type mob. Restaure éventuellement après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
aware | boolean | true pour activer la conscience | |
duration | number | nil | Restauration automatique après ce nombre de ticks |
entity:is_healing() / entity:set_healing(enabled)
Vérifie ou bascule l'état healing sur une entité elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Retourne true si la bounding box de l'entité chevauche une boîte alignée sur les axes à l'emplacement donné.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
center | location table | Centre de la boîte de test | |
halfX | number | 0.5 | Demi-largeur sur l'axe X |
halfY | number | identique à halfX | Demi-hauteur sur l'axe Y |
halfZ | number | identique à halfX | Demi-largeur sur l'axe Z |
entity:remove_elite()
Supprime l'entité elite du suivi EliteMobs. Si l'entité est un elite, cela la fait disparaître correctement via EliteMobs.
entity:set_custom_name_visible(visible)
Définit si le nom personnalisé de l'entité est toujours visible ou seulement lorsqu'on la regarde.
| Paramètre | Type | Notes |
|---|---|---|
visible | boolean | true pour toujours visible |
entity:set_equipment(slot, material[, options])
Définit l'équipement sur l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
slot | string | Slot d'équipement : "HEAD", "CHEST", "LEGS", "FEET", "HAND", "OFF_HAND" | |
material | string | Nom du matériau (ex. "DIAMOND_SWORD", "IRON_HELMET") | |
options | table | {} | Paramètres optionnels (voir ci-dessous) |
Table options :
| Clé | Type | Défaut | Notes |
|---|---|---|---|
enchantments | tableau de tables | nil | Chaque entrée : { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Si l'objet est incassable |
Exemple
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.is_ai_enabled
Une méthode qui retourne true si l'entité a actuellement l'IA activée.
Exemple
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
}
Wrappers de référence d'entités non-vivantes
Lorsqu'une entité apparue n'est pas une LivingEntity -- par exemple un bloc tombant, projectile, ou boule de feu -- vous recevez un wrapper de référence plus léger. Ceux-ci sont retournés par des méthodes comme context.world:spawn_falling_block_at_location() ou context.boss:summon_projectile().
Champs : name, uuid, entity_type, is_player, is_elite, current_location
Méthodes :
| Méthode | Notes |
|---|---|
is_valid() | Vérification de validité en direct |
get_location() | Emplacement actuel en direct |
get_velocity() | Vecteur de vélocité actuel |
is_on_ground() | Si elle est au sol |
teleport_to_location(location) | Téléporte l'entité |
set_velocity_vector(vector) | Définit la vélocité |
set_direction_vector(vector) | Définit la direction (Fireball uniquement) |
set_yield(value) | Définit le yield d'explosion (Fireball uniquement) |
set_gravity(enabled) | Active/désactive la gravité |
detonate() | Fait détoner les entités firework |
remove() | Retire l'entité du monde |
unregister([reason]) | Désenregistre du tracker d'entités |
Exemple
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
)
-- 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
Disponible dans les hooks où un joueur est directement impliqué (on_boss_damaged_by_player, on_player_damaged_by_boss, etc.). Les wrappers de joueur incluent tous les champs et méthodes d'entité communs listés ci-dessus, plus les extras ci-dessous.
context.player vaut nil dans les hooks qui n'ont pas de joueur associé, tels que on_spawn, les callbacks planifiés et les hooks de minuterie. Vérifiez toujours nil avant utilisation.
Exemple
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
context.player:send_message("&cHello!")
end
}
Champs propres aux joueurs
| Champ | Type | Notes |
|---|---|---|
game_mode | string | Nom du mode de jeu actuel (ex. "SURVIVAL") |
Méthodes propres aux joueurs
| Méthode | Notes |
|---|---|
send_message(message) | Message de chat avec formatage couleur EliteMobs |
show_action_bar(message) | Texte d'action bar |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Superposition d'écran de titre |
show_boss_bar(title[, color][, style][, duration]) | Boss bar temporaire |
run_command(command) | Exécute une commande en tant que joueur (sans / initial) |
Exemple
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
Le wrapper du boss pour l'elite mob qui possède ce pouvoir Lua. Toujours disponible dans chaque hook.
Le wrapper boss hérite de chaque méthode d'entité commune listée ci-dessus (ex. push_relative_to, apply_push_vector, set_gravity, set_scale, set_invulnerable, spawn_particle_at_self, overlaps_box_at_location, etc.). Les méthodes documentées dans cette section sont soit spécifiques au boss, soit ont un comportement différent via la couche EliteEntity.
Champs du boss
| Champ | Type | Notes |
|---|---|---|
boss.name | string | Nom d'affichage |
boss.uuid | string | UUID de l'elite boss |
boss.entity_type | string | Nom Bukkit EntityType |
boss.is_monster | boolean | true si l'entité sous-jacente est un Monster |
boss.level | number | Niveau de l'elite |
boss.health | number | Santé actuelle (snapshot) |
boss.maximum_health | number | Santé max (snapshot) |
boss.damager_count | number | Nombre d'attaquants (snapshot) |
boss.is_in_combat | boolean | État de combat |
boss.exists | boolean | Si l'elite existe encore |
boss.current_location | location table | Position au moment de la création du wrapper (snapshot) |
Exemple
return {
api_version = 1,
on_spawn = function(context)
context.log:info(context.boss.name .. " level " .. context.boss.level)
end
}
Méthodes du boss
boss:is_alive()
Retourne true si l'entité boss est valide, non morte, et que l'elite existe encore. Utilisez ceci au lieu du champ exists pour des vérifications en direct.
Exemple
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()
Retourne l'emplacement actuel en direct du boss sous forme de location table.
Exemple
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()
Retourne l'emplacement au niveau des yeux du boss.
Exemple
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])
Active/désactive l'IA sur le boss. Restaure éventuellement après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'IA | |
duration | number | nil | Restauration automatique après ce nombre de ticks |
Exemple
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)
Téléporte le boss vers un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
location | location table | Destination |
Exemple
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)
Définit immédiatement la vélocité du boss.
| Paramètre | Type | Notes |
|---|---|---|
vector | table vecteur | { x, y, z } ou { x = 0, y = 1, z = 0 } |
Exemple
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)
Soigne le boss jusqu'à sa santé maximale.
| Paramètre | Type | Notes |
|---|---|---|
amount | number | Quantité à soigner |
Exemple
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])
Joue un son à l'emplacement du boss.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
sound | string | Nom Bukkit Sound | |
volume | number | 1.0 | Volume |
pitch | number | 1.0 | Hauteur |
Exemple
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])
Fait apparaître des particules à l'emplacement du boss.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
particleOrSpec | string ou table | Nom de particule ou table spec | |
count | number | 1 | Nombre de particules |
Exemple
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)
Joue une animation de modèle personnalisé sur le boss si disponible.
| Paramètre | Type | Notes |
|---|---|---|
name | string | Nom de l'animation |
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:play_model_animation("slam")
end
}
boss:face_direction_or_location(vectorOrLocation)
Oriente le boss vers une direction ou un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
vectorOrLocation | table vecteur ou location | Direction à orienter |
Exemple
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][, follow][, timeout])
Utilise le pathfinding pour faire marcher le boss vers un emplacement.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
location | location table | Destination | |
speed | number | 1.0 | Multiplicateur de vitesse de mouvement |
follow | boolean | false | Suit continuellement la cible |
timeout | number | nil | Annule la navigation après ce nombre de ticks |
Exemple
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)
Gère les tags sur le boss.
Exemple
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])
Envoie un message dans le chat à tous les joueurs à proximité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
message | string | Texte du message avec codes couleur | |
range | number | 20 | Rayon en blocs |
Exemple
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])
Lance une entité de type projectile depuis le boss.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
entityType | string | Type d'entité (ex. "FIREBALL", "ARROW") | |
origin | location table | Position de lancement | |
destination | location table | Position cible | |
speed | number | 1.0 | Vitesse du projectile |
options | table | {} | Voir les options ci-dessous |
Table options :
| Clé | Type | Notes |
|---|---|---|
duration | number | Suppression automatique après ticks |
max_ticks | number | Ticks max à surveiller pour l'atterrissage |
custom_damage | number | Dégâts à l'impact |
detonation_power | string | Puissance d'explosion à l'impact |
yield | number | Yield d'explosion (Fireball) |
persistent | boolean | Si le projectile persiste (défaut true) |
effect | string | Nom EntityEffect à jouer à l'apparition |
incendiary | boolean | Si l'explosion est incendiaire |
gravity | boolean | Si le projectile a la gravité |
glowing | boolean | Effet de brillance |
invulnerable | boolean | Si le projectile est invulnérable |
track | boolean | S'il suit la cible |
spawn_at_origin | boolean | Apparition à l'origine au lieu du décalage |
direction_only | boolean | Utilise uniquement la direction, ignore la cible |
on_land | function | Callback (landing_location, spawned_entity) |
Exemple
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])
Invoque un boss de renfort depuis un fichier de configuration.
| Paramètre | Type | Notes |
|---|---|---|
filename | string | Nom de fichier de configuration du boss |
zoneOrLocation | location table ou zone | Emplacement d'apparition ou définition de zone |
duration | number | Despawn automatique optionnel après ticks |
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.boss:summon_reinforcement("my_minion.yml", context.boss:get_location(), 200)
context.boss:send_message("&cMinions, come to my aid!")
end
}
boss:despawn()
Retire le boss du monde.
Exemple
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)
Retourne un tableau de wrappers de joueurs à portée du boss.
| Paramètre | Type | Notes |
|---|---|---|
range | number | Rayon en blocs |
Exemple
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()
Retourne le nombre en direct de joueurs qui ont infligé des dégâts à ce boss. Contrairement au champ damager_count, cela effectue une vérification en direct.
boss:get_target_player()
Retourne la cible mob actuelle du boss en tant que wrapper de joueur, ou nil si la cible n'est pas un joueur ou n'est pas définie.
Méthodes de zone et de particules
Ces méthodes combinent les zones avec les effets de particules. Elles nécessitent une table de zone en entrée.
boss:get_nearby_players_in_zone(zone)
Retourne un tableau de wrappers de joueurs pour tous les joueurs actuellement à l'intérieur de la zone donnée.
| Paramètre | Type | Notes |
|---|---|---|
zone | table zone | Une définition de forme de zone |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Remplit l'intérieur d'une zone avec des particules.
| Paramètre | Type | Notes |
|---|---|---|
zone | table zone | Forme de zone à remplir |
particle | string | Nom du type de particule |
... | Paramètres de particule supplémentaires | |
coverage | number (optionnel) | Facteur de couverture de densité des particules |
boss:spawn_particles_in_zone_border(zone, particle, ..., coverage?)
Trace le contour d'une zone avec des particules.
| Paramètre | Type | Notes |
|---|---|---|
zone | table zone | Forme de zone à tracer |
particle | string | Nom du type de particule |
... | Paramètres de particule supplémentaires | |
coverage | number (optionnel) | Facteur de couverture de densité des particules |
boss:get_particles_from_self_toward_zone(zone, particle, speed?)
Fait apparaître des particules directionnelles qui voyagent depuis le boss vers une zone.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
zone | table zone | Zone cible | |
particle | string | Nom du type de particule | |
speed | number | nil | Vitesse de déplacement des particules |
boss:get_particles_toward_self(zone, particle, speed?)
Fait apparaître des particules directionnelles qui voyagent depuis une zone vers le boss.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
zone | table zone | Zone source | |
particle | string | Nom du type de particule | |
speed | number | nil | Vitesse de déplacement des particules |
boss:spawn_particles_with_vector(particles)
Fait apparaître un tableau de particules directionnelles, chacune avec sa propre position et son vecteur de vélocité.
| Paramètre | Type | Notes |
|---|---|---|
particles | tableau de tables | Chaque entrée définit une particule avec position et direction |
Méthodes Ender Dragon
Ces méthodes ne s'appliquent que lorsque l'entité boss est un Ender Dragon.
boss:get_ender_dragon_phase()
Retourne le nom actuel de EnderDragon.Phase sous forme de string, ou nil si le boss n'est pas un Ender Dragon.
boss:set_ender_dragon_phase(phase)
Définit la phase de l'Ender Dragon.
| Paramètre | Type | Notes |
|---|---|---|
phase | string | Nom EnderDragon.Phase (ex. "CIRCLING", "CHARGE_PLAYER") |
Méthodes de support de pouvoirs spéciaux
Ces méthodes prennent en charge des mécaniques de pouvoirs intégrés à EliteMobs depuis des scripts Lua.
boss:start_tracking_fireball_system(speed?)
Démarre le système IA de boules de feu traquantes sur le boss. Le boss lancera périodiquement des boules de feu qui suivent sa cible.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
speed | number | 0.5 | Vitesse de la boule de feu |
boss:handle_spirit_walk_damage(cause)
Gère le comportement spirit walk pour la cause de dégâts donnée. Spirit walk rend le boss immunisé à certains types de dégâts et le téléporte derrière l'attaquant.
| Paramètre | Type | Notes |
|---|---|---|
cause | string | Nom Bukkit DamageCause (ex. "ENTITY_ATTACK", "PROJECTILE") |
boss:shield_wall_is_active()
Retourne true si le boss a actuellement un mur de bouclier actif.
boss:initialize_shield_wall(charges?)
Active un mur de bouclier sur le boss qui peut absorber les dégâts entrants.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
charges | number | 1 | Nombre de coups que le bouclier peut absorber |
boss:shield_wall_absorb_damage(player, damage)
Tente d'absorber les dégâts avec le mur de bouclier. Retourne true si les dégâts ont été absorbés, false si le bouclier est inactif ou épuisé.
| Paramètre | Type | Notes |
|---|---|---|
player | wrapper de joueur | Le joueur attaquant |
damage | number | Quantité de dégâts à absorber |
boss:deactivate_shield_wall()
Désactive le mur de bouclier du boss, retirant toutes les charges restantes.
boss:start_zombie_necronomicon(target, file)
Démarre le pouvoir zombie necronomicon sur une cible, faisant apparaître des renforts morts-vivants depuis un fichier de configuration.
| Paramètre | Type | Notes |
|---|---|---|
target | wrapper d'entité | Entité cible pour le necronomicon |
file | string | Nom de fichier de configuration du boss pour les morts-vivants invoqués |
context.players
Helpers de requête de joueurs centrés sur le boss. Utilisez ceux-ci pour trouver des joueurs sans avoir besoin d'un joueur spécifique de l'événement.
| Méthode | Retourne | Notes |
|---|---|---|
players:current_target() | wrapper de joueur ou nil | Le joueur de l'événement ou la cible mob du boss s'il s'agit d'un joueur |
players:nearby_players(radius) | tableau de wrappers de joueurs | Tous les joueurs dans le rayon autour du boss |
players:all_players_in_world() | tableau de wrappers de joueurs | Tous les joueurs dans le monde du boss |
Exemple
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
}
Exemple
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
Helpers de requête d'entités générales centrés sur le boss.
| Méthode | Retourne | Notes |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | tableau de wrappers d'entités | Entités à proximité autour du boss |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | tableau de wrappers d'entités | Entités dans une boîte alignée sur les axes |
entities:get_all_entities([filter]) | tableau de wrappers d'entités | Toutes les entités correspondantes dans le monde du boss |
entities:get_direct_target_entity() | wrapper d'entité ou nil | Cible directe de l'événement actuel |
entities:get_boss_spawn_location() | location table | L'emplacement d'apparition d'origine du boss |
Filtres valides : living (défaut), player / players, elite / elites, mob / mobs, all / entities
Exemple
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
}
Exemple
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
}
