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_mount | boolean | true si ce wrapper représente une monture de boss |
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éé |
Pour lire des données spécifiques aux elites comme le niveau du boss, utilisez les champs et méthodes de context.boss décrits dans la section context.boss ci-dessous. Pour faire disparaître un elite depuis un script, appelez la méthode entity:remove_elite().
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.log:info("Boss level: " .. context.boss.level)
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()
Renvoie true si l'entité est toujours valide et n'est pas 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()
Renvoie 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()
Renvoie 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()
Renvoie 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()
Renvoie la vélocité actuelle de l'entité sous forme de vector table.
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 de chat à l'entité. Prend en charge le formatage de couleur d'EliteMobs.
| Paramètre | Type | Notes |
|---|---|---|
text | string | Message avec codes de 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 dans la barre d'action de l'entité.
| Paramètre | Type | Notes |
|---|---|---|
message | string | Texte de la barre d'action avec codes de 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 d'apparition |
stay | number | 40 | Ticks de maintien |
fadeOut | number | 10 | Ticks de disparition |
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 barre de boss 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 | vector table | { 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 (1 tick par défaut). Utile pour remplacer le knockback.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
vector | vector table | 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)
Fait en sorte que l'entité se tourne vers un vecteur de direction ou un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
directionOrLocation | vector ou location table | Cible vers laquelle se tourner |
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 de l'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 des 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 ou désactive l'invulnérabilité sur l'entité. Rétablit éventuellement l'état après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'invulnérabilité | |
duration | number | nil | Rétablissement 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 ou désactive l'IA de l'entité. Rétablit éventuellement l'état après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'IA | |
duration | number | nil | Rétablissement 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 de l'entité. Les tags sont suivis par EliteMobs et persistent pendant toute la durée de vie de l'entité.
| Méthode | Paramètre | Notes |
|---|---|---|
add_tag(tag[, duration]) | string, number optionnel | Ajoute le tag, le retire éventuellement automatiquement après des ticks |
remove_tag(tag) | string | Retire le tag |
has_tag(tag) | string | Renvoie 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 par l'entité. Pour les joueurs, elle s'exécute en tant que joueur ; utilisez le texte de la commande sans / au début.
| Paramètre | Type | Notes |
|---|---|---|
command | string | Texte de la commande sans / au début |
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é. Rétablit éventuellement à 1.0 après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
scale | number | Multiplicateur d'échelle | |
duration | number | nil | Rétablissement 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 ou désactive la gravité de l'entité.
| Paramètre | Type | Notes |
|---|---|---|
enabled | boolean | true pour une 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
local player = context.player
player:set_gravity(false)
player:send_message("&dYou begin to float!")
context.scheduler:run_after(60, function()
if player:is_alive() then
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 | Clé de son Minecraft (par exemple, "entity.ender_dragon.growl") | |
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 de play_sound_at_entity. Joue un son à l'emplacement de l'entité.
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 de spécification | |
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é possède 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
}
Méthodes de véhicule et de passager
Les wrappers d'entité vivante exposent également des helpers de véhicule/passager Bukkit. Ils sont utiles pour les montures scriptées, les effets de monte temporaire et pour vérifier si une entité est déjà attachée à une autre entité.
| Méthode | Renvoie | Notes |
|---|---|---|
entity:is_inside_vehicle() | boolean | Vrai si l'entité monte une autre entité. |
entity:has_vehicle() | boolean | Vrai si l'entité a actuellement un véhicule. |
entity:get_vehicle() | wrapper d'entité ou nil | Renvoie le wrapper du véhicule actuel. |
entity:set_vehicle(vehicle) | boolean | Fait monter cette entité sur vehicle. |
entity:leave_vehicle() | boolean | Fait quitter à cette entité son véhicule actuel. |
entity:has_passengers() | boolean | Vrai si cette entité a des passagers. |
entity:get_passenger_count() | number | Nombre de passagers. |
entity:get_passengers() | table | Tableau de wrappers de passagers. |
entity:add_passenger(passenger) | boolean | Ajoute un passager à cette entité. |
entity:remove_passenger(passenger) | boolean | Retire un passager de cette entité. |
entity:eject_passengers() | boolean | Éjecte tous les passagers. |
Exemple
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])
Pousse l'entité à l'écart 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 de 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
local player = context.player
player:set_custom_name("&c&lMarked Target")
player:send_message("&cYou have been marked!")
-- Reset after 5 seconds
context.scheduler:run_after(100, function()
if player:is_alive() then
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 du bloc | |
duration | number | 0 | Ticks avant suppression |
requireAir | boolean | false | Ne place que 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()
Renvoie la hauteur de l'entité en blocs.
entity:is_on_ground()
Renvoie true si l'entité se tient actuellement sur un sol solide.
entity:is_frozen()
Renvoie true si l'entité (lorsqu'elle est suivie comme un boss personnalisé) a le flag « gelé » défini.
entity:set_awareness_enabled(aware[, duration])
Active ou désactive la conscience du mob. N'affecte que les entités de type mob. Rétablit éventuellement l'état après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
aware | boolean | true pour activer la conscience | |
duration | number | nil | Rétablissement automatique après ce nombre de ticks |
entity:is_healing() / entity:set_healing(enabled)
Vérifie ou active/désactive l'état de soin sur une entité elite.
entity:overlaps_box_at_location(center[, halfX][, halfY][, halfZ])
Renvoie true si la boîte englobante 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()
Retire l'entité elite du suivi d'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 le regarde.
| Paramètre | Type | Notes |
|---|---|---|
visible | boolean | true pour toujours visible |
entity:set_equipment(slot, material[, options])
Définit l'équipement de l'entité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
slot | string | Emplacement 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 d'options :
| Clé | Type | Défaut | Notes |
|---|---|---|---|
enchantments | tableau de tables | nil | Chaque entrée : { type = "SHARPNESS", level = 2 } |
unbreakable | boolean | false | Indique si l'item 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 renvoie 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é non vivante
Lorsqu'une entité apparue n'est pas une LivingEntity -- par exemple un bloc qui tombe, un projectile ou une boule de feu -- vous recevez un wrapper de référence plus léger. Ils sont renvoyé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() | Indique si l'entité 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 la puissance d'explosion (Fireball uniquement) |
set_gravity(enabled) | Active ou désactive la gravité |
detonate() | Fait détoner les entités feu d'artifice |
remove() | Retire l'entité du monde |
unregister([reason]) | Désinscrit 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 minuteur. Vérifiez toujours qu'il n'est pas 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 réservés aux joueurs
| Champ | Type | Notes |
|---|---|---|
game_mode | string | Nom du mode de jeu actuel (ex. "SURVIVAL") |
Méthodes réservées aux joueurs
| Méthode | Notes |
|---|---|
send_message(message) | Message de chat avec formatage de couleur d'EliteMobs |
show_action_bar(message) | Texte de la barre d'action |
show_title(title[, subtitle][, fadeIn][, stay][, fadeOut]) | Superposition d'écran de titre |
show_boss_bar(title[, color][, style][, duration]) | Barre de boss temporaire |
run_command(command) | Exécute une commande en tant que joueur (sans / au début) |
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 propriétaire de ce pouvoir Lua. Toujours disponible dans chaque hook.
Le wrapper du boss hérite de toutes les méthodes d'entité communes listées 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 | Indique si l'elite existe encore |
boss.current_location | location table | Position à 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()
Renvoie true si l'entité boss est valide, n'est pas morte et que l'elite existe encore. Utilisez ceci au lieu du champ exists pour les 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()
Renvoie 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()
Renvoie 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 ou désactive l'IA du boss. Rétablit éventuellement l'état après une durée.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
enabled | boolean | true pour activer l'IA | |
duration | number | nil | Rétablissement 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 | vector table | { 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 | Clé de son Minecraft (par exemple, "entity.wither.spawn") | |
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 de spécification | |
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 elle est 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:has_mount() / boss:get_mount()
Vérifie ou renvoie l'entité que ce boss monte actuellement. boss:get_mount() renvoie nil si le boss n'a pas de monture. Lorsqu'une monture est renvoyée, son wrapper a is_mount = true.
Exemple
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()
Monte ou démonte le boss. boss:set_mount(entity) fait monter le boss sur le wrapper d'entité fourni et renvoie true si Bukkit a accepté le changement de passager. boss:clear_mount() et boss:dismount() font tous deux quitter au boss son véhicule actuel.
Exemple
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)
Fait en sorte que le boss se tourne vers une direction ou un emplacement.
| Paramètre | Type | Notes |
|---|---|---|
vectorOrLocation | vector ou location table | Direction vers laquelle se tourner |
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 déplacement |
follow | boolean | false | Suit en continu 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 du 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 de chat à tous les joueurs à proximité.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
message | string | Texte du message avec codes de 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 d'options :
| Clé | Type | Notes |
|---|---|---|
duration | number | Suppression automatique après des 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 | Puissance d'explosion (Fireball) |
persistent | boolean | Indique si le projectile persiste (true par défaut) |
effect | string | Nom EntityEffect à jouer à l'apparition |
incendiary | boolean | Indique si l'explosion est incendiaire |
gravity | boolean | Indique si le projectile a de la gravité |
glowing | boolean | Effet brillant |
invulnerable | boolean | Indique si le projectile est invulnérable |
track | boolean | Indique s'il faut suivre la cible |
spawn_at_origin | boolean | Apparaît à l'origine au lieu d'un 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][, level])
Invoque un boss de renfort à partir d'un fichier de configuration.
| Paramètre | Type | Notes |
|---|---|---|
filename | string | Nom de fichier de config du boss |
zoneOrLocation | location table ou zone | Emplacement d'apparition ou définition de zone optionnel. Par défaut, l'emplacement du boss. |
level | number | Niveau de renfort optionnel. Par défaut 0, ce qui laisse le helper d'invocation hériter/résoudre le niveau normalement. |
Exemple
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()
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)
Renvoie un tableau de wrappers de joueur à 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()
Renvoie le nombre en direct de joueurs ayant infligé des dégâts à ce boss. Contrairement au champ damager_count, ceci effectue une vérification en direct.
boss:get_target_player()
Renvoie la cible actuelle du mob boss sous forme de 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 des effets de particules. Elles nécessitent une zone table en entrée.
boss:get_nearby_players_in_zone(zone)
Renvoie un tableau de wrappers de joueur pour tous les joueurs actuellement à l'intérieur de la zone donnée.
| Paramètre | Type | Notes |
|---|---|---|
zone | zone table | Une définition de forme de zone |
boss:spawn_particles_in_zone(zone, particle, ..., coverage?)
Remplit l'intérieur d'une zone de particules.
| Paramètre | Type | Notes |
|---|---|---|
zone | zone table | 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 de la bordure d'une zone avec des particules.
| Paramètre | Type | Notes |
|---|---|---|
zone | zone table | Forme de zone à contourer |
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 du boss vers une zone.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
zone | zone table | 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 d'une zone vers le boss.
| Paramètre | Type | Défaut | Notes |
|---|---|---|---|
zone | zone table | 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 propre vecteur de vélocité.
| Paramètre | Type | Notes |
|---|---|---|
particles | tableau de tables | Chaque entrée définit une particule avec une position et une direction |
Méthodes de l'Ender Dragon
Ces méthodes ne s'appliquent que lorsque l'entité boss est un Ender Dragon.
boss:get_ender_dragon_phase()
Renvoie le nom de la EnderDragon.Phase actuelle sous forme de chaîne, 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 les mécaniques de pouvoir intégrées d'EliteMobs depuis les scripts Lua.
boss:start_tracking_fireball_system(speed?)
Démarre le système d'IA de boules de feu à tête chercheuse 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 des boules de feu |
boss:handle_spirit_walk_damage(cause)
Gère le comportement de marche spirituelle pour la cause de dégâts donnée. La marche spirituelle rend le boss immunisé contre 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()
Renvoie 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 des dégâts avec le mur de bouclier. Renvoie 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 nécronomicon zombie sur une cible, faisant apparaître des renforts morts-vivants à partir d'un fichier de configuration.
| Paramètre | Type | Notes |
|---|---|---|
target | wrapper d'entité | Entité cible pour le nécronomicon |
file | string | Nom de fichier de config du boss pour les morts-vivants invoqués |
context.players
Helpers de requête de joueur centrés sur le boss. Utilisez-les pour trouver des joueurs sans avoir besoin d'un joueur spécifique issu de l'événement.
| Méthode | Renvoie | Notes |
|---|---|---|
players:current_target() | wrapper de joueur ou nil | Le joueur de l'événement ou la cible du mob boss s'il s'agit d'un joueur |
players:nearby_players(radius) | tableau de wrappers de joueur | Tous les joueurs dans le rayon du boss |
players:all_players_in_world() | tableau de wrappers de joueur | 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 généraux de requête d'entité centrés sur le boss.
| Méthode | Renvoie | Notes |
|---|---|---|
entities:get_nearby_entities(radius[, filter]) | tableau de wrappers d'entité | Entités à proximité autour du boss |
entities:get_entities_in_box(center, halfX, halfY, halfZ[, filter]) | tableau de wrappers d'entité | Entités dans une boîte alignée sur les axes |
entities:get_all_entities([filter]) | tableau de wrappers d'entité | Toutes les entités correspondantes dans le monde du boss |
entities:get_direct_target_entity() | wrapper d'entité ou nil | Cible directe pour l'événement actuel |
entities:get_boss_spawn_location() | location table | L'emplacement d'apparition d'origine du boss |
Filtres valides : living (par 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
}
