Aller au contenu principal

Scripting Lua : monde et environnement

webapp_banner.jpg

Cette page couvre toutes les méthodes disponibles sur context.world, context.vectors, context.settings et context.event. Elles permettent à vos pouvoirs Lua d'interagir avec le monde Minecraft -- faire apparaître des entités, jouer des effets, interroger des blocs, et plus encore. Si vous débutez avec les pouvoirs Lua, commencez d'abord par Getting Started.

EliteMobs boss context

Les pouvoirs de boss d'EliteMobs réutilisent le bac à sable Lua de MagmaCore. Le context.world des boss part de la table world partagée de MagmaCore, si bien que les fonctions utilitaires génériques de coordonnées telles que get_block_at(...), set_block_at(...) et spawn_particle(...) restent disponibles. Cette page se concentre sur les ajouts et les redéfinitions de context.world, context.vectors, context.settings et context.event propres aux boss d'EliteMobs. Pour l'API world générique, consultez MagmaCore Lua Scripting Engine.


context.world

La table world fournit des méthodes pour faire apparaître des entités, jouer des effets, modifier des blocs et changer l'état du monde. Toutes les méthodes s'appellent avec la syntaxe à deux-points (world:method()).


world:spawn_particle_at_location(location, particleSpec)

Fait apparaître des particules à un emplacement. Le second argument peut être une simple chaîne de nom de particule ou une table de spécification de particule complète pour un contrôle avancé.

ParamètreTypeRemarques
locationtable locationOù faire apparaître les particules
particleSpecchaîne ou tableNom de particule ou table de spécification de particule (voir ci-dessous)
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Simple particle by name
context.world:spawn_particle_at_location(context.boss:get_location(), "FLAME")

-- Full particle spec table with red dust
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "DUST",
amount = 10,
x = 0.5,
y = 0.5,
z = 0.5,
speed = 0.02,
red = 255,
green = 0,
blue = 0,
})
end
}

Format de la table de spécification de particule

CléTypeDéfautRemarques
particlechaîneobligatoireNom de particule
amountint1Nombre de particules
x, y, znombre0Dispersion/décalage sur chaque axe
speednombre0Vitesse des particules
red, green, blueint255Couleur RVB pour DUST et DUST_COLOR_TRANSITION
toRed, toGreen, toBlueint255Couleur cible de transition pour DUST_COLOR_TRANSITION
astuce

Pour DUST_COLOR_TRANSITION, vous pouvez aussi utiliser des clés en snake_case : to_red, to_green, to_blue.

attention

Contrairement aux configurations YAML d'EliteScript, les noms de particules Lua ne prennent pas en charge les conversions d'anciens noms de particules. Vous devez utiliser les noms actuels de l'API Spigot (par ex. FIREWORK et non FIREWORKS_SPARK, SMOKE et non SMOKE_NORMAL, DUST et non REDSTONE). Consultez la liste des particules valides pour la liste complète des noms actuels et de leurs équivalents historiques.


world:play_sound_at_location(location, sound, volume, pitch)

Joue un son à un emplacement.

ParamètreTypeDéfautRemarques
locationtable locationOù jouer le son
soundchaîneClé de son Minecraft (par ex. "entity.blaze.shoot") ou nom d'énumération Spigot Sound. Les clés de resource pack fonctionnent aussi.
volumenombre1.0Volume
pitchnombre1.0Hauteur du son
Exemple
return {
api_version = 1,
on_spawn = function(context)
context.world:play_sound_at_location(
context.boss:get_location(),
"entity.wither.spawn",
1.0,
0.5
)
end
}

world:strike_lightning_at_location(location)

Fait tomber la foudre à un emplacement (visuel et infligeant des dégâts).

ParamètreTypeRemarques
locationtable locationOù frapper
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("lightning", 100) then return end
context.world:strike_lightning_at_location(context.player:get_location())
context.player:send_message("&eA bolt of lightning strikes you!")
end
}

world:spawn_entity_at_location(entityType, location, options)

Fait apparaître une entité Minecraft vanilla.

ParamètreTypeRemarques
entityTypechaîneNom de type d'entité (par ex. "FIREBALL", "ARROW")
locationtable locationOù la faire apparaître
optionstable (facultatif)Options d'apparition (voir ci-dessous)

Options d'apparition d'entité

CléTypeDéfautRemarques
velocitytable vectornilVélocité initiale {x, y, z}
effectchaînenilEntityEffect à jouer à l'apparition
durationint0Suppression automatique après ce nombre de ticks (0 = jamais)
on_landfonctionnilRappel lorsque l'entité atterrit au sol
max_ticksint6000Nombre maximal de ticks de surveillance avant de forcer le rappel on_land

Renvoie une table d'encapsulation d'entité.

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_spawn", 100) then return end
-- Spawn a fireball aimed at the player
local boss_loc = context.boss:get_location()
local dir = context.vectors.get_vector_between_locations(boss_loc, context.player:get_location())
dir = context.vectors.normalize_vector(dir)

context.world:spawn_entity_at_location("FIREBALL", boss_loc, {
velocity = { x = dir.x * 2, y = dir.y * 2, z = dir.z * 2 },
duration = 100,
})
end
}
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Spawn a primed TNT with a landing callback
context.world:spawn_entity_at_location("TNT", context.boss:get_location(), {
velocity = { x = 0, y = 1.5, z = 0 },
on_land = function(land_location, entity_ref)
context.world:spawn_particle_at_location(land_location, {
particle = "EXPLOSION_EMITTER",
amount = 1,
})
end,
})
end
}

world:spawn_falling_block_at_location(location, material, options)

Fait apparaître une entité de bloc tombant.

ParamètreTypeRemarques
locationtable locationOù la faire apparaître
materialchaîneNom de matériau (par ex. "STONE", "MAGMA_BLOCK")
optionstable (facultatif)Options d'apparition (voir ci-dessous)

Options de bloc tombant

CléTypeDéfautRemarques
velocitytable vectornilVélocité initiale {x, y, z}
drop_itembooléenfalseIndique si le bloc tombe sous forme d'objet
hurt_entitiesbooléenfalseIndique si le bloc blesse les entités sur lesquelles il atterrit
on_landfonctionnilRappel function(land_location, entity_ref) lorsque le bloc atterrit

Renvoie une table de référence d'entité.

Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Rain magma blocks from above
local loc = context.boss:get_location()
for i = 1, 5 do
local offset_loc = {
x = loc.x + math.random(-3, 3),
y = loc.y + 10,
z = loc.z + math.random(-3, 3),
world = loc.world
}
context.world:spawn_falling_block_at_location(offset_loc, "MAGMA_BLOCK", {
velocity = { x = 0, y = -0.5, z = 0 },
hurt_entities = true,
on_land = function(land_location, entity_ref)
context.world:spawn_particle_at_location(land_location, { particle = "LAVA", amount = 8 })
end,
})
end
end
}

world:spawn_custom_boss_at_location(filename, location, options)

Fait apparaître un custom boss EliteMobs à partir d'un fichier de configuration.

ParamètreTypeRemarques
filenamechaîneNom du fichier de configuration du boss (par ex. "my_boss.yml")
locationtable locationOù le faire apparaître
optionstable (facultatif)Options d'apparition (voir ci-dessous)

Options d'apparition de custom boss

CléTypeDéfautRemarques
levelintniveau du bossRemplace le niveau du boss apparu
silentbooléenfalseSupprime les messages d'apparition
velocitytable vectornilVélocité initiale
add_as_reinforcementbooléenfalseEnregistre l'entité comme renfort du boss actuel

Renvoie une table d'encapsulation d'entité, ou nil si le boss n'a pas pu être créé.

Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local minion = context.world:spawn_custom_boss_at_location(
"skeleton_minion.yml",
context.boss:get_location(),
{ level = 10, add_as_reinforcement = true }
)
if minion ~= nil then
context.boss:send_message("&cMinions, arise!")
end
end
}

world:spawn_boss_at_location(filename, location, level)

Une méthode d'apparition de boss plus simple. Fait apparaître un custom boss à un emplacement avec un niveau facultatif.

ParamètreTypeDéfautRemarques
filenamechaîneNom du fichier de configuration du boss
locationtable locationemplacement du bossOù le faire apparaître (facultatif, correspond par défaut à l'emplacement du boss)
levelintniveau du bossRemplace le niveau d'apparition (facultatif)

Renvoie une table d'encapsulation d'entité, ou nil.

Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.world:spawn_boss_at_location("zombie_guard.yml", context.boss:get_location(), 5)
context.boss:send_message("&cGuards, defend me!")
end
}

world:spawn_reinforcement_at_location(filename, location, level, velocity)

Fait apparaître un renfort suivi par le système de renforts d'EliteMobs.

ParamètreTypeDéfautRemarques
filenamechaîneNom du fichier de configuration du boss
locationtable locationOù le faire apparaître
levelint0Niveau du renfort. 0 laisse l'assistant d'invocation appliquer son comportement de niveau par défaut.
velocitytable vectornilVélocité initiale (facultatif)

Renvoie une table d'encapsulation d'entité, ou nil.

Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.world:spawn_reinforcement_at_location(
"necro_skeleton.yml",
context.boss:get_location(),
0,
{ x = 0, y = 0.5, z = 0 }
)
context.boss:send_message("&5Rise, my servant!")
end
}

world:spawn_fireworks_at_location(location, spec)

Fait apparaître une entité feu d'artifice avec un contrôle complet sur les effets.

ParamètreTypeRemarques
locationtable locationOù le faire apparaître
spectableSpécification du feu d'artifice (voir ci-dessous)

Table de spécification de feu d'artifice

CléTypeDéfautRemarques
powerint1Puissance de vol (hauteur)
velocitytable vectornilVélocité initiale
shot_at_anglebooléentrueIndique si le feu d'artifice est tiré en biais (utilisé lorsque velocity est défini)
effectstable de tablesnilTableau de spécifications d'effets de feu d'artifice. S'il est omis, la spécification de premier niveau est traitée comme un effet unique.

Spécification d'effet de feu d'artifice

CléTypeDéfautRemarques
typechaîne"BALL_LARGE""BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER"
flickerbooléentrueEffet de scintillement
trailbooléentrueEffet de traînée
colorstablenilTableau de noms de couleurs ou de tables {red, green, blue}
fade_colorstablenilTableau de noms de couleurs de fondu ou de tables {red, green, blue}

Noms de couleurs : "WHITE", "SILVER", "GRAY", "BLACK", "RED", "MAROON", "YELLOW", "OLIVE", "LIME", "GREEN", "AQUA", "TEAL", "BLUE", "NAVY", "FUCHSIA", "PURPLE", "ORANGE"

Renvoie une table de référence d'entité. Vous pouvez appeler :detonate() dessus pour forcer une détonation immédiate.

Exemple
return {
api_version = 1,
on_spawn = function(context)
local fw = context.world:spawn_fireworks_at_location(context.boss:get_location(), {
power = 0,
effects = {
{
type = "STAR",
flicker = true,
trail = true,
colors = { "RED", "ORANGE", { red = 255, green = 200, blue = 0 } },
fade_colors = { "YELLOW" },
},
},
})

-- Detonate immediately for a visual burst
context.scheduler:run_after(1, function()
fw:detonate()
end)
end
}

world:spawn_splash_potion_at_location(location, spec)

Fait apparaître une entité de potion jetable lancée.

ParamètreTypeRemarques
locationtable locationOù la faire apparaître
spectableSpécification de la potion (voir ci-dessous)

Table de spécification de potion jetable

CléTypeRemarques
velocitytable vectorVélocité initiale de la potion lancée
effectstable de tablesTableau de spécifications d'effets de potion

Spécification d'effet de potion

CléTypeDéfautRemarques
typechaîneobligatoireNom de type d'effet de potion (par ex. "SLOWNESS", "POISON")
durationint0Durée en ticks
amplifierint0Amplificateur de l'effet (0 = niveau I)
overwritebooléentrueIndique s'il faut écraser les effets existants du même type

Renvoie une table de référence d'entité, ou nil.

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("potion_throw", 200) then return end

local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
dir = context.vectors.normalize_vector(dir)

context.world:spawn_splash_potion_at_location(context.boss:get_location(), {
velocity = { x = dir.x * 1.5, y = 0.5, z = dir.z * 1.5 },
effects = {
{ type = "SLOWNESS", duration = 100, amplifier = 1 },
{ type = "WEAKNESS", duration = 60, amplifier = 0 },
},
})
end
}

world:place_temporary_block_at_location(location, material, duration, requireAir)

Place un bloc temporaire qui revient automatiquement à son état d'origine après une certaine durée.

ParamètreTypeDéfautRemarques
locationtable locationOù le placer
materialchaîneNom de matériau
durationint0Ticks avant que le bloc ne revienne à son état d'origine (0 = permanent)
requireAirbooléenfalseSi true, ne place le bloc que si l'emplacement est actuellement de l'air
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Create a temporary ice floor under the boss
local loc = context.boss:get_location()
for dx = -2, 2 do
for dz = -2, 2 do
context.world:place_temporary_block_at_location(
{ x = loc.x + dx, y = loc.y - 1, z = loc.z + dz, world = loc.world },
"PACKED_ICE",
100,
false
)
end
end
end
}

world:set_block_at_location(location, material, requireAir)

Définit un bloc de façon permanente. Utilisez place_temporary_block_at_location si vous voulez qu'il revienne à son état d'origine.

ParamètreTypeDéfautRemarques
locationtable locationOù le placer
materialchaîneNom de matériau
requireAirbooléenfalseSi true, ne place le bloc que si l'emplacement est actuellement de l'air
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Place fire at the boss's location
context.world:set_block_at_location(context.boss:get_location(), "FIRE", true)
end
}

world:get_block_type_at_location(location)

Renvoie le nom de matériau du bloc situé à un emplacement, sous forme de chaîne.

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local block_type = context.world:get_block_type_at_location(context.boss:get_location())
if block_type == "WATER" then
context.boss:send_message("&bThe boss is empowered by water!")
context.boss:apply_potion_effect("SPEED", 200, 1)
end
end
}

world:get_highest_block_y_at_location(location)

Renvoie la coordonnée Y du bloc non vide le plus haut à la position X/Z donnée.

ParamètreTypeRemarques
locationtable locationEmplacement à interroger (X et Z sont utilisé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("skyport", 200) then return end
local loc = context.player:get_location()
local ground_y = context.world:get_highest_block_y_at_location(loc)
-- Teleport the player to the surface
context.player:teleport_to_location({
x = loc.x, y = ground_y + 1, z = loc.z, world = loc.world
})
context.player:send_message("&eYou are teleported to the surface!")
end
}

world:get_blast_resistance_at_location(location)

Renvoie la résistance aux explosions du bloc situé à un emplacement, sous forme de nombre.

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local resistance = context.world:get_blast_resistance_at_location(context.boss:get_location())
context.log:info("Blast resistance at boss: " .. resistance)
end
}

world:is_air_at_location(location)

Renvoie true si le bloc situé à cet emplacement est de l'air.

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local above = { x = loc.x, y = loc.y + 2, z = loc.z, world = loc.world }
if context.world:is_air_at_location(above) then
-- There is space above the boss, launch upward
context.boss:set_velocity_vector({ x = 0, y = 1.5, z = 0 })
end
end
}

world:is_passable_at_location(location)

Renvoie true si le bloc situé à cet emplacement est traversable (les entités peuvent le traverser).

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
if context.world:is_passable_at_location(context.boss:get_location()) then
context.log:info("Boss is in a passable block")
end
end
}

world:is_passthrough_at_location(location)

Renvoie true si le bloc situé à cet emplacement n'est pas solide (semblable à traversable, mais basé sur la vérification de solidité).

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local above = { x = loc.x, y = loc.y + 1, z = loc.z, world = loc.world }
if context.world:is_passthrough_at_location(above) then
context.log:info("Boss can move upward")
end
end
}

world:is_on_floor_at_location(location)

Renvoie true si le bloc situé à cet emplacement n'est pas solide ET que le bloc situé en dessous est solide (autrement dit, l'emplacement « repose sur le sol »).

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
if context.world:is_on_floor_at_location(context.boss:get_location()) then
context.boss:send_message("&aThe boss slams the ground!")
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "CLOUD",
amount = 30,
})
end
end
}

world:is_standing_on_material(location, material)

Renvoie true si le bloc situé directement sous l'emplacement correspond au matériau donné.

ParamètreTypeRemarques
locationtable locationEmplacement à interroger
materialchaîneNom de matériau à vérifier
Exemple
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
if context.world:is_standing_on_material(context.player:get_location(), "SOUL_SAND") then
context.player:send_message("&8The soul sand saps your strength!")
context.player:apply_potion_effect("SLOWNESS", 60, 2)
end
end
}

world:set_world_time(time) / world:set_world_time(location, time)

Définit l'heure du monde. Vous pouvez facultativement passer un emplacement pour préciser quel monde est concerné.

ParamètreTypeRemarques
locationtable location (facultatif)Quel monde affecter. Correspond par défaut au monde du boss.
timeintHeure du monde en ticks (0 = aube, 6000 = midi, 13000 = nuit, 18000 = minuit)
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Set to midnight when combat starts
context.world:set_world_time(18000)
context.boss:send_message("&8Darkness falls...")
end
}

world:set_world_weather(weather, duration) / world:set_world_weather(location, weather, duration)

Définit la météo dans le monde du boss.

ParamètreTypeDéfautRemarques
locationtable location (facultatif)monde du bossQuel monde affecter
weatherchaîne"CLEAR", "RAIN" (ou "PRECIPITATION"), "THUNDER"
durationint6000Durée de la météo en ticks
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Start a thunderstorm for 200 ticks
context.world:set_world_weather("THUNDER", 200)
context.boss:send_message("&eA storm gathers!")
end
}

world:generate_fake_explosion(blockLocations, sourceLocation)

Crée un effet visuel de fausse explosion à l'aide du système de régénération d'explosions d'EliteMobs (les blocs se cassent puis se régénèrent).

ParamètreTypeRemarques
blockLocationstable de tables locationTableau des emplacements de blocs à « faire exploser »
sourceLocationtable location (facultatif)Source de l'explosion pour les calculs directionnels
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
local loc = context.boss:get_location()
local blocks = {}
for dx = -1, 1 do
for dz = -1, 1 do
table.insert(blocks, { x = loc.x + dx, y = loc.y, z = loc.z + dz, world = loc.world })
end
end
context.world:generate_fake_explosion(blocks, loc)
end
}

world:run_console_command(command)

Exécute une commande console en tant que serveur.

ParamètreTypeRemarques
commandchaîneLa commande à exécuter (sans le / initial)
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.world:run_console_command("say The boss has entered phase 2!")
end
}

world:run_empowered_lightning_task_at_location(location)

Exécute la tâche visuelle de foudre renforcée (utilisée par les pouvoirs de l'Ender Dragon). Cela produit un éclair plus spectaculaire assorti d'effets supplémentaires.

ParamètreTypeRemarques
locationtable locationOù frapper
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
context.world:run_empowered_lightning_task_at_location(context.boss:get_location())
context.boss:send_message("&eFeel the power of the storm!")
end
}

world:spawn_fake_gold_nugget_at_location(location, velocity, hasGravity)

Fait apparaître un faux projectile de pépite d'or utilisé par le système de bullet hell.

ParamètreTypeDéfautRemarques
locationtable locationEmplacement d'apparition
velocitytable vectorVélocité initiale
hasGravitybooléenfalseIndique si le projectile est soumis à la gravité

Renvoie une table de faux projectile dotée des méthodes : get_location(), set_gravity(bool), remove(), is_removed().

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("nugget", 60) then return end

local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
dir = context.vectors.normalize_vector(dir)

context.world:spawn_fake_gold_nugget_at_location(
context.boss:get_location(),
{ x = dir.x, y = dir.y, z = dir.z }
)
end
}

world:run_fake_gold_nugget_damage(projectiles)

Traite les dégâts d'une table de faux projectiles de pépite d'or contre les entités proches.

ParamètreTypeRemarques
projectilestableTableau de tables de faux projectiles issues de spawn_fake_gold_nugget_at_location
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
-- Spawn some projectiles and store them
context.state.active_projectiles = {}
local loc = context.boss:get_location()
for i = 1, 5 do
local angle = (i / 5) * math.pi * 2
local nugget = context.world:spawn_fake_gold_nugget_at_location(
loc,
{ x = math.cos(angle) * 0.5, y = 0.3, z = math.sin(angle) * 0.5 }
)
table.insert(context.state.active_projectiles, nugget)
end

-- Process damage each tick for 3 seconds
local task_id
task_id = context.scheduler:run_every(1, function(tick_context)
tick_context.world:run_fake_gold_nugget_damage(tick_context.state.active_projectiles)
end)
context.scheduler:run_after(60, function(later_context)
later_context.scheduler:cancel_task(task_id)
end)
end
}

world:generate_player_loot(times)

Génère du butin pour les joueurs ayant blessé le boss.

ParamètreTypeDéfautRemarques
timesint1Nombre de tirages de butin
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("bonus_loot") then
context.boss:add_tag("bonus_loot")
context.world:generate_player_loot(2)
context.boss:send_message("&6Bonus loot drops!")
end
end
}

world:drop_bonus_coins(multiplier)

Fait tomber des pièces bonus pour tous les joueurs ayant contribué à blesser le boss.

ParamètreTypeDéfautRemarques
multipliernombre2.0Multiplicateur du montant de pièces
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.25 and not context.boss:has_tag("bonus_coins") then
context.boss:add_tag("bonus_coins")
context.world:drop_bonus_coins(3.0)
context.boss:send_message("&6Gold spills everywhere!")
end
end
}

context.vectors

Fonctions utilitaires de calcul vectoriel. Elles s'appellent comme des fonctions ordinaires (syntaxe à point), et non comme des méthodes.

MéthodeRenvoieRemarques
vectors.get_vector_between_locations(loc1, loc2[, options])table vectorDirection de loc1 vers loc2
vectors.normalize_vector(vec)table vectorRenvoie un vecteur de longueur unitaire
vectors.rotate_vector(vec, pitch, yaw)table vectorFait pivoter un vecteur de tant de degrés en pitch et en yaw

Toutes les tables vector possèdent les champs x, y, z.

vectors.get_vector_between_locations(loc1, loc2, options)

ParamètreTypeRemarques
loc1table locationPoint de départ
loc2table locationPoint d'arrivée
optionstable (facultatif)Options de post-traitement (voir ci-dessous)

Options de vecteur

CléTypeDéfautRemarques
normalizebooléenfalseNormalise le vecteur résultant
multipliernombre1.0Met le vecteur à l'échelle
offsettable vectornilAjoute un vecteur de décalage
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("dash", 100) then return end
-- Compute a normalized direction from boss to player, scaled to speed 2
local dir = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location(),
{ normalize = true, multiplier = 2.0 }
)
-- Launch the boss toward the player
context.boss:set_velocity_vector(dir)
end
}

vectors.normalize_vector(vec)

ParamètreTypeRemarques
vectable vectorVecteur d'entrée
Exemple
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.player == nil then return end
local raw = context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
local unit = context.vectors.normalize_vector(raw)
context.log:info("Direction: " .. unit.x .. ", " .. unit.y .. ", " .. unit.z)
end
}

vectors.rotate_vector(vec, pitch, yaw)

ParamètreTypeRemarques
vectable vectorVecteur d'entrée
pitchnombreRotation autour de l'axe X en degrés
yawnombreRotation autour de l'axe Y en degré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("spread_shot", 100) then return end
local forward = context.vectors.normalize_vector(
context.vectors.get_vector_between_locations(
context.boss:get_location(),
context.player:get_location()
)
)
-- Fire three fireballs in a spread pattern
for _, yaw_offset in ipairs({ -30, 0, 30 }) do
local dir = context.vectors.rotate_vector(forward, 0, yaw_offset)
context.boss:summon_projectile(
"FIREBALL",
context.boss:get_eye_location(),
{
x = context.boss:get_location().x + dir.x * 10,
y = context.boss:get_location().y + dir.y * 10,
z = context.boss:get_location().z + dir.z * 10,
world = context.boss:get_location().world
},
1.0
)
end
end
}
astuce

Vous pouvez construire un éventail de directions en faisant pivoter un vecteur de base dans une boucle :

local base = context.vectors.normalize_vector(
context.vectors.get_vector_between_locations(boss_loc, target_loc)
)
for angle = 0, 360, 30 do
local dir = context.vectors.rotate_vector(base, 0, angle)
-- Use dir for spawning projectiles in a ring
end

context.settings

Accès en lecture seule aux valeurs de configuration liées aux pouvoirs.

MéthodeRenvoieRemarques
settings:warning_visual_effects_enabled()booléenIndique si les effets visuels d'avertissement sont activés dans les réglages de combat des mobs
Exemple
return {
api_version = 1,
on_enter_combat = function(context)
if context.settings:warning_visual_effects_enabled() then
context.world:spawn_particle_at_location(context.boss:get_location(), {
particle = "DUST",
amount = 20,
red = 255, green = 0, blue = 0,
})
end
end
}

context.event

Données d'événement pour le hook en cours. Les champs disponibles dépendent du hook qui a déclenché l'appel.

Champ ou méthodeDisponibilitéRemarques
event.damage_amountHooks de dégâtsLe montant de dégâts actuel (instantané au moment de l'appel)
event.damage_causeHooks de dégâtsNom d'énumération Bukkit DamageCause (par ex. "ENTITY_ATTACK")
event.cancel_event()Événements annulablesAnnule l'événement
event.set_damage_amount(value)Hooks basés sur EliteDamageEventDéfinit directement les dégâts
event.multiply_damage_amount(multiplier)Hooks basés sur EliteDamageEventMultiplie les dégâts actuels
event.damagerÉvénements de dégâts comportant une entité agresseurEncapsulation de référence d'entité pour l'agresseur
event.projectileÉvénements de dégâts où l'agresseur est un projectileEncapsulation de référence d'entité de projectile
event.spawn_reasonon_spawnNom d'énumération de la raison d'apparition
event.entityon_death, événements de zoneL'encapsulation d'entité concernée

Exemple : diviser par deux les dégâts entrants

Exemple
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.event ~= nil then
local dmg = context.event.damage_amount
context.log:info("Boss took " .. dmg .. " damage, halving it")
context.event.multiply_damage_amount(0.5)
end
end
}

Exemple : annuler les dégâts des projectiles

Exemple
return {
api_version = 1,
on_boss_damaged_by_player = function(context)
if context.event ~= nil and context.event.damage_cause == "PROJECTILE" then
context.event.cancel_event()
if context.player ~= nil then
context.player:send_message("&cThe boss deflects your projectile!")
end
end
end
}

Exemple : lire la cause des dégâts

Exemple
return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.event ~= nil then
context.log:info("Damage cause: " .. (context.event.damage_cause or "unknown"))
end
end
}
remarque
  • damage_amount est un instantané. Il ne se met pas à jour automatiquement après un appel à set_damage_amount() ou multiply_damage_amount().
  • À l'intérieur des rappels planifiés, context.event vaut nil. Utilisez les hooks d'événement pour modifier les événements.

Étapes suivantes