Перейти к основному содержимому

Lua-скриптинг: Мир и окружение

webapp_banner.jpg

Эта страница описывает каждый метод, доступный в context.world, context.vectors, context.settings и context.event. Они позволяют вашим Lua-пауэрам взаимодействовать с миром Minecraft -- спавнить сущности, воспроизводить эффекты, запрашивать блоки и многое другое. Если вы новичок в Lua-пауэрах, начните с Начало работы.


context.world

Таблица world предоставляет методы для спавна сущностей, воспроизведения эффектов, изменения блоков и смены состояния мира. Все методы вызываются с синтаксисом двоеточия (world:method()).


world:spawn_particle_at_location(location, particleSpec)

Порождает частицы в указанном месте. Второй аргумент может быть простой строкой с именем частицы либо полной таблицей спецификации частиц для тонкой настройки.

ПараметрТипПримечания
locationlocation tableКуда спавнить частицы
particleSpecstring or tableИмя частицы или таблица спецификации частиц (см. ниже)
Пример
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
}

Формат таблицы спецификации частиц

КлючТипПо умолчаниюПримечания
particlestringобязательныйИмя частицы
amountint1Количество частиц
x, y, znumber0Разброс/смещение по каждой оси
speednumber0Скорость частиц
red, green, blueint255Цвет RGB для DUST и DUST_COLOR_TRANSITION
toRed, toGreen, toBlueint255Целевой цвет перехода для DUST_COLOR_TRANSITION
подсказка

Для DUST_COLOR_TRANSITION можно также использовать ключи в snake_case: to_red, to_green, to_blue.


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

Воспроизводит звук в указанном месте.

ПараметрТипПо умолчаниюПримечания
locationlocation tableГде воспроизвести звук
soundstringMinecraft sound key (e.g. "entity.blaze.shoot") или имя перечисления Spigot Sound. Ключи из ресурс-пака тоже работают.
volumenumber1.0Громкость
pitchnumber1.0Высота тона
Пример
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)

Бьёт молнией в указанное место (визуально и с уроном).

ПараметрТипПримечания
locationlocation tableКуда бить
Пример
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)

Порождает ванильную сущность Minecraft.

ПараметрТипПримечания
entityTypestringИмя типа сущности (например, "FIREBALL", "ARROW")
locationlocation tableГде заспавнить
optionstable (optional)Параметры спавна (см. ниже)

Параметры спавна сущности

КлючТипПо умолчаниюПримечания
velocityvector tablenilНачальная скорость {x, y, z}
effectstringnilEntityEffect, проигрываемый при спавне
durationint0Автоудаление через столько тиков (0 = никогда)
on_landfunctionnilОбратный вызов, когда сущность приземляется
max_ticksint6000Максимум тиков наблюдения до принудительного вызова on_land

Возвращает таблицу-обёртку сущности.

Пример
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
}
Пример
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)

Порождает сущность падающего блока.

ПараметрТипПримечания
locationlocation tableГде заспавнить
materialstringИмя материала (например, "STONE", "MAGMA_BLOCK")
optionstable (optional)Параметры спавна (см. ниже)

Параметры падающего блока

КлючТипПо умолчаниюПримечания
velocityvector tablenilНачальная скорость {x, y, z}
drop_itembooleanfalseВыпадает ли блок в виде предмета
hurt_entitiesbooleanfalseНаносит ли блок урон сущностям, на которые падает
on_landfunctionnilОбратный вызов function(land_location, entity_ref) при приземлении блока

Возвращает таблицу-ссылку на сущность.

Пример
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)

Порождает кастомного босса EliteMobs из конфигурационного файла.

ПараметрТипПримечания
filenamestringИмя конфигурационного файла босса (например, "my_boss.yml")
locationlocation tableГде заспавнить
optionstable (optional)Параметры спавна (см. ниже)

Параметры спавна кастомного босса

КлючТипПо умолчаниюПримечания
levelintуровень боссаПереопределяет уровень заспавненного босса
silentbooleanfalseПодавляет сообщения о спавне
velocityvector tablenilНачальная скорость
add_as_reinforcementbooleanfalseРегистрирует как подкрепление текущего босса

Возвращает таблицу-обёртку сущности либо nil, если босса создать не удалось.

Пример
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)

Более простой метод спавна босса. Порождает кастомного босса в указанном месте с необязательным уровнем.

ПараметрТипПо умолчаниюПримечания
filenamestringИмя конфигурационного файла босса
locationlocation tableместоположение боссаГде заспавнить (необязательно, по умолчанию — местоположение босса)
levelintуровень боссаПереопределяет уровень спавна (необязательно)

Возвращает таблицу-обёртку сущности или nil.

Пример
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, inheritLevel, velocity)

Порождает подкрепление, отслеживаемое системой подкреплений EliteMobs.

ПараметрТипПо умолчаниюПримечания
filenamestringИмя конфигурационного файла босса
locationlocation tableГде заспавнить
inheritLevelint0Режим наследования уровня (0 = по умолчанию)
velocityvector tablenilНачальная скорость (необязательно)

Возвращает таблицу-обёртку сущности или nil.

Пример
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)

Порождает сущность фейерверка с полным контролем над эффектами.

ПараметрТипПримечания
locationlocation tableГде заспавнить
spectableСпецификация фейерверка (см. ниже)

Таблица спецификации фейерверка

КлючТипПо умолчаниюПримечания
powerint1Мощность полёта (высота)
velocityvector tablenilНачальная скорость
shot_at_anglebooleantrueЗапускается ли фейерверк под углом (используется, когда задана скорость)
effectstable of tablesnilМассив спецификаций эффектов фейерверка. Если не указан, спецификация верхнего уровня считается одним эффектом.

Спецификация эффекта фейерверка

КлючТипПо умолчаниюПримечания
typestring"BALL_LARGE""BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER"
flickerbooleantrueЭффект мерцания
trailbooleantrueЭффект следа
colorstablenilМассив имён цветов или таблиц {red, green, blue}
fade_colorstablenilМассив имён цветов затухания или таблиц {red, green, blue}

Имена цветов: "WHITE", "SILVER", "GRAY", "BLACK", "RED", "MAROON", "YELLOW", "OLIVE", "LIME", "GREEN", "AQUA", "TEAL", "BLUE", "NAVY", "FUCHSIA", "PURPLE", "ORANGE"

Возвращает таблицу-ссылку на сущность. У неё можно вызвать :detonate(), чтобы принудительно вызвать немедленный взрыв.

Пример
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)

Порождает сущность брошенного взрывного зелья.

ПараметрТипПримечания
locationlocation tableГде заспавнить
spectableСпецификация зелья (см. ниже)

Таблица спецификации взрывного зелья

КлючТипПримечания
velocityvector tableНачальная скорость брошенного зелья
effectstable of tablesМассив спецификаций эффектов зелья

Спецификация эффекта зелья

КлючТипПо умолчаниюПримечания
typestringобязательныйИмя типа эффекта зелья (например, "SLOWNESS", "POISON")
durationint0Длительность в тиках
amplifierint0Усилитель эффекта (0 = уровень I)
overwritebooleantrueПерезаписывать ли существующие эффекты того же типа

Возвращает таблицу-ссылку на сущность или nil.

Пример
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)

Ставит временный блок, который автоматически возвращается в прежнее состояние по истечении срока.

ПараметрТипПо умолчаниюПримечания
locationlocation tableКуда поставить
materialstringИмя материала
durationint0Тиков до возврата блока (0 = навсегда)
requireAirbooleanfalseЕсли true, ставит только если блок сейчас воздух
Пример
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)

Устанавливает блок навсегда. Используйте place_temporary_block_at_location, если хотите, чтобы он вернулся в прежнее состояние.

ПараметрТипПо умолчаниюПримечания
locationlocation tableКуда поставить
materialstringИмя материала
requireAirbooleanfalseЕсли true, ставит только если блок сейчас воздух
Пример
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)

Возвращает имя материала блока в указанном месте в виде строки.

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает координату Y самого высокого невоздушного блока в заданной позиции X/Z.

ПараметрТипПримечания
locationlocation tableМестоположение для запроса (используются X и Z)
Пример
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)

Возвращает взрывоустойчивость блока в указанном месте в виде числа.

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает true, если блок в указанном месте — воздух.

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает true, если блок в указанном месте проходим (сущности могут пройти сквозь него).

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает true, если блок в указанном месте не твёрдый (похоже на проходимость, но на основе проверки твёрдости).

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает true, если блок в указанном месте не твёрдый И блок под ним твёрдый (то есть местоположение «стоит на полу»).

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
Пример
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)

Возвращает true, если блок непосредственно под указанным местом соответствует заданному материалу.

ПараметрТипПримечания
locationlocation tableМестоположение для запроса
materialstringИмя материала для проверки
Пример
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)

Задаёт время мира. При желании можно передать местоположение, чтобы указать, о каком мире идёт речь.

ПараметрТипПримечания
locationlocation table (optional)На какой мир воздействовать. По умолчанию — мир босса.
timeintВремя мира в тиках (0 = рассвет, 6000 = полдень, 13000 = ночь, 18000 = полночь)
Пример
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)

Задаёт погоду в мире босса.

ПараметрТипПо умолчаниюПримечания
locationlocation table (optional)мир боссаНа какой мир воздействовать
weatherstring"CLEAR", "RAIN" (или "PRECIPITATION"), "THUNDER"
durationint6000Длительность погоды в тиках
Пример
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)

Создаёт визуальный эффект фиктивного взрыва с помощью системы восстановления после взрывов EliteMobs (блоки ломаются и восстанавливаются).

ПараметрТипПримечания
blockLocationstable of location tablesМассив местоположений блоков для «взрыва»
sourceLocationlocation table (optional)Источник взрыва для расчёта направления
Пример
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)

Выполняет консольную команду от имени сервера.

ПараметрТипПримечания
commandstringКоманда для выполнения (без ведущего /)
Пример
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)

Запускает визуальную задачу усиленной молнии (используется способностями Дракона Края). Создаёт более эффектный удар молнии с дополнительными эффектами.

ПараметрТипПримечания
locationlocation tableКуда бить
Пример
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)

Порождает фиктивный снаряд — золотой самородок, используемый системой bullet hell.

ПараметрТипПо умолчаниюПримечания
locationlocation tableМестоположение спавна
velocityvector tableНачальная скорость
hasGravitybooleanfalseДействует ли на снаряд гравитация

Возвращает таблицу фиктивного снаряда с методами: get_location(), set_gravity(bool), remove(), is_removed().

Пример
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)

Обрабатывает урон от таблицы фиктивных снарядов — золотых самородков — по ближайшим сущностям.

ПараметрТипПримечания
projectilestableМассив таблиц фиктивных снарядов из spawn_fake_gold_nugget_at_location
Пример
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)

Генерирует добычу для игроков, наносивших урон боссу.

ПараметрТипПо умолчаниюПримечания
timesint1Количество розыгрышей добычи
Пример
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)

Выдаёт бонусные монеты всем игрокам, внёсшим вклад в нанесение урона боссу.

ПараметрТипПо умолчаниюПримечания
multipliernumber2.0Множитель количества монет
Пример
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

Помощники для векторной математики. Они вызываются как обычные функции (через точку), а не как методы.

МетодВозвращаетПримечания
vectors.get_vector_between_locations(loc1, loc2[, options])vector tableНаправление от loc1 к loc2
vectors.normalize_vector(vec)vector tableВозвращает вектор единичной длины
vectors.rotate_vector(vec, pitch, yaw)vector tableПоворачивает вектор на заданные градусы тангажа и рысканья

У всех таблиц векторов есть поля x, y, z.

vectors.get_vector_between_locations(loc1, loc2, options)

ПараметрТипПримечания
loc1location tableНачальная точка
loc2location tableКонечная точка
optionstable (optional)Параметры постобработки (см. ниже)

Параметры вектора

КлючТипПо умолчаниюПримечания
normalizebooleanfalseНормализовать полученный вектор
multipliernumber1.0Масштабировать вектор
offsetvector tablenilДобавить вектор смещения
Пример
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)

ПараметрТипПримечания
vecvector tableВходной вектор
Пример
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)

ПараметрТипПримечания
vecvector tableВходной вектор
pitchnumberПоворот вокруг оси X в градусах
yawnumberПоворот вокруг оси Y в градусах
Пример
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
}
подсказка

Веер направлений можно построить, поворачивая базовый вектор в цикле:

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

Доступ только для чтения к значениям конфигурации, связанным со способностями.

МетодВозвращаетПримечания
settings.warning_visual_effects_enabledbooleanВключены ли предупреждающие визуальные эффекты в настройках боя мобов
Пример
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

Данные события для текущего хука. Доступные поля зависят от того, какой хук вызвал обращение.

Поле или методКогда доступноПримечания
event.damage_amountХуки уронаТекущая величина урона (снимок на момент вызова)
event.damage_causeХуки уронаИмя перечисления Bukkit DamageCause (например, "ENTITY_ATTACK")
event.cancel_event()Отменяемые событияОтменяет событие
event.set_damage_amount(value)EliteDamageEvent-based hooksЗадаёт урон напрямую
event.multiply_damage_amount(multiplier)EliteDamageEvent-based hooksУмножает текущий урон
event.damagerСобытия урона с сущностью, наносящей уронОбёртка-ссылка на сущность, нанёсшую урон
event.projectileСобытия урона, где урон наносит снарядОбёртка-ссылка на сущность-снаряд
event.spawn_reasonon_spawnИмя перечисления причины спавна
event.entityon_death, события зонСоответствующая обёртка сущности

Пример: уменьшение входящего урона вдвое

Пример
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
}

Пример: отмена урона от снарядов

Пример
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
}

Пример: чтение причины урона

Пример
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
}
примечание
  • damage_amount — это снимок. Он не обновляется автоматически после вызова set_damage_amount() или multiply_damage_amount().
  • Внутри запланированных обратных вызовов context.event равен nil. Для изменения события используйте хуки событий.

Дальнейшие шаги