Lua-скриптинг: Мир и окружение
Эта страница описывает каждый метод, доступный в context.world, context.vectors, context.settings и context.event. Они позволяют вашим Lua-пауэрам взаимодействовать с миром Minecraft -- спавнить сущности, воспроизводить эффекты, запрашивать блоки и многое другое. Если вы новичок в Lua-пауэрах, начните с Начало работы.
context.world
Таблица world предоставляет методы для спавна сущностей, воспроизведения эффектов, изменения блоков и смены состояния мира. Все методы вызываются с синтаксисом двоеточия (world:method()).
world:spawn_particle_at_location(location, particleSpec)
Порождает частицы в указанном месте. Второй аргумент может быть простой строкой с именем частицы либо полной таблицей спецификации частиц для тонкой настройки.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table | Куда спавнить частицы |
particleSpec | string 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
}
Формат таблицы спецификации частиц
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
particle | string | обязательный | Имя частицы |
amount | int | 1 | Количество частиц |
x, y, z | number | 0 | Разброс/смещение по каждой оси |
speed | number | 0 | Скорость частиц |
red, green, blue | int | 255 | Цвет RGB для DUST и DUST_COLOR_TRANSITION |
toRed, toGreen, toBlue | int | 255 | Целевой цвет перехода для DUST_COLOR_TRANSITION |
Для DUST_COLOR_TRANSITION можно также использовать ключи в snake_case: to_red, to_green, to_blue.
world:play_sound_at_location(location, sound, volume, pitch)
Воспроизводит звук в указанном месте.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table | Где воспроизвести звук | |
sound | string | Minecraft sound key (e.g. "entity.blaze.shoot") или имя перечисления Spigot Sound. Ключи из ресурс-пака тоже работают. | |
volume | number | 1.0 | Громкость |
pitch | number | 1.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)
Бьёт молнией в указанное место (визуально и с уроном).
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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.
| Параметр | Тип | Примечания |
|---|---|---|
entityType | string | Имя типа сущности (например, "FIREBALL", "ARROW") |
location | location table | Где заспавнить |
options | table (optional) | Параметры спавна (см. ниже) |
Параметры спавна сущности
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
velocity | vector table | nil | Начальная скорость {x, y, z} |
effect | string | nil | EntityEffect, проигрываемый при спавне |
duration | int | 0 | Автоудаление через столько тиков (0 = никогда) |
on_land | function | nil | Обратный вызов, когда сущность приземляется |
max_ticks | int | 6000 | Максимум тиков наблюдения до принудительного вызова 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)
Порождает сущность падающего блока.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table | Где заспавнить |
material | string | Имя материала (например, "STONE", "MAGMA_BLOCK") |
options | table (optional) | Параметры спавна (см. ниже) |
Параметры падающего блока
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
velocity | vector table | nil | Начальная скорость {x, y, z} |
drop_item | boolean | false | Выпадает ли блок в виде предмета |
hurt_entities | boolean | false | Наносит ли блок урон сущностям, на которые падает |
on_land | function | nil | Обратный вызов 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 из конфигурационного файла.
| Параметр | Тип | Примечания |
|---|---|---|
filename | string | Имя конфигурационного файла босса (например, "my_boss.yml") |
location | location table | Где заспавнить |
options | table (optional) | Параметры спавна (см. ниже) |
Параметры спавна кастомного босса
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
level | int | уровень босса | Переопределяет уровень заспавненного босса |
silent | boolean | false | Подавляет сообщения о спавне |
velocity | vector table | nil | Начальная скорость |
add_as_reinforcement | boolean | false | Регистрирует как подкрепление текущего босса |
Возвращает таблицу-обёртку сущности либо 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)
Более простой метод спавна босса. Порождает кастомного босса в указанном месте с необязательным уровнем.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
filename | string | Имя конфигурационного файла босса | |
location | location table | местоположение босса | Где заспавнить (необязательно, по умолчанию — местоположение босса) |
level | int | уровень босса | Переопределяет уровень спавна (необязательно) |
Возвращает таблицу-обёртку сущности или 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.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
filename | string | Имя конфигурационного файла босса | |
location | location table | Где заспавнить | |
inheritLevel | int | 0 | Режим наследования уровня (0 = по умолчанию) |
velocity | vector table | nil | Начальная скорость (необязательно) |
Возвращает таблицу-обёртку сущности или 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)
Порождает сущность фейерверка с полным контролем над эффектами.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table | Где заспавнить |
spec | table | Спецификация фейерверка (см. ниже) |
Таблица спецификации фейерверка
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
power | int | 1 | Мощность полёта (высота) |
velocity | vector table | nil | Начальная скорость |
shot_at_angle | boolean | true | Запускается ли фейерверк под углом (используется, когда задана скорость) |
effects | table of tables | nil | Массив спецификаций эффектов фейерверка. Если не указан, спецификация верхнего уровня считается одним эффектом. |
Спецификация эффекта фейерверка
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
type | string | "BALL_LARGE" | "BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER" |
flicker | boolean | true | Эффект мерцания |
trail | boolean | true | Эффект следа |
colors | table | nil | Массив имён цветов или таблиц {red, green, blue} |
fade_colors | table | nil | Массив имён цветов затухания или таблиц {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)
Порождает сущность брошенного взрывного зелья.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table | Где заспавнить |
spec | table | Спецификация зелья (см. ниже) |
Таблица спецификации взрывного зелья
| Ключ | Тип | Примечания |
|---|---|---|
velocity | vector table | Начальная скорость брошенного зелья |
effects | table of tables | Массив спецификаций эффектов зелья |
Спецификация эффекта зелья
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
type | string | обязательный | Имя типа эффекта зелья (например, "SLOWNESS", "POISON") |
duration | int | 0 | Длительность в тиках |
amplifier | int | 0 | Усилитель эффекта (0 = уровень I) |
overwrite | boolean | true | Перезаписывать ли существующие эффекты того же типа |
Возвращает таблицу-ссылку на сущность или 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)
Ставит временный блок, который автоматически возвращается в прежнее состояние по истечении срока.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table | Куда поставить | |
material | string | Имя материала | |
duration | int | 0 | Тиков до возврата блока (0 = навсегда) |
requireAir | boolean | false | Если 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, если хотите, чтобы он вернулся в прежнее состояние.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table | Куда поставить | |
material | string | Имя материала | |
requireAir | boolean | false | Если 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)
Возвращает имя материала блока в указанном месте в виде строки.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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)
Возвращает взрывоустойчивость блока в указанном месте в виде числа.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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, если блок в указанном месте — воздух.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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, если блок в указанном месте проходим (сущности могут пройти сквозь него).
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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, если блок в указанном месте не твёрдый (похоже на проходимость, но на основе проверки твёрдости).
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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, если блок в указанном месте не твёрдый И блок под ним твёрдый (то есть местоположение «стоит на полу»).
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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, если блок непосредственно под указанным местом соответствует заданному материалу.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table | Местоположение для запроса |
material | string | Имя материала для проверки |
Пример
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)
Задаёт время мира. При желании можно передать местоположение, чтобы указать, о каком мире идёт речь.
| Параметр | Тип | Примечания |
|---|---|---|
location | location table (optional) | На какой мир воздействовать. По умолчанию — мир босса. |
time | int | Время мира в тиках (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)
Задаёт погоду в мире босса.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table (optional) | мир босса | На какой мир воздействовать |
weather | string | "CLEAR", "RAIN" (или "PRECIPITATION"), "THUNDER" | |
duration | int | 6000 | Длительность погоды в тиках |
Пример
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 (блоки ломаются и восстанавливаются).
| Параметр | Тип | Примечания |
|---|---|---|
blockLocations | table of location tables | Массив местоположений блоков для «взрыва» |
sourceLocation | location 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)
Выполняет консольную команду от имени сервера.
| Параметр | Тип | Примечания |
|---|---|---|
command | string | Команда для выполнения (без ведущего /) |
Пример
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)
Запускает визуальную задачу усиленной молнии (используется способностями Дракона Края). Создаёт более эффектный удар молнии с дополнительными эффектами.
| Параметр | Тип | Примечания |
|---|---|---|
location | location 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.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
location | location table | Местоположение спавна | |
velocity | vector table | Начальная скорость | |
hasGravity | boolean | false | Действует ли на снаряд гравитация |
Возвращает таблицу фиктивного снаряда с методами: 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)
Обрабатывает урон от таблицы фиктивных снарядов — золотых самородков — по ближайшим сущностям.
| Параметр | Тип | Примечания |
|---|---|---|
projectiles | table | Массив таблиц фиктивных снарядов из 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)
Генерирует добычу для игроков, наносивших урон боссу.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
times | int | 1 | Количество розыгрышей добычи |
Пример
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)
Выдаёт бонусные монеты всем игрокам, внёсшим вклад в нанесение урона боссу.
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
multiplier | number | 2.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)
| Параметр | Тип | Примечания |
|---|---|---|
loc1 | location table | Начальная точка |
loc2 | location table | Конечная точка |
options | table (optional) | Параметры постобработки (см. ниже) |
Параметры вектора
| Ключ | Тип | По умолчанию | Примечания |
|---|---|---|---|
normalize | boolean | false | Нормализовать полученный вектор |
multiplier | number | 1.0 | Масштабировать вектор |
offset | vector table | 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("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)
| Параметр | Тип | Примечания |
|---|---|---|
vec | vector 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)
| Параметр | Тип | Примечания |
|---|---|---|
vec | vector table | Входной вектор |
pitch | number | Поворот вокруг оси X в градусах |
yaw | number | Поворот вокруг оси 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_enabled | boolean | Включены ли предупреждающие визуальные эффекты в настройках боя мобов |
Пример
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_reason | on_spawn | Имя перечисления причины спавна |
event.entity | on_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. Для изменения события используйте хуки событий.
Дальнейшие шаги
- Зоны и выбор целей -- запросы к зонам, наблюдатели и выбор целей-сущностей
- Босс и сущности -- обёртка босса, методы сущностей, методы игроков
- Примеры -- полностью рабочие примеры Lua-способностей
