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

Lua-скриптовый движок MagmaCore

MagmaCore предоставляет общий Lua-скриптовый движок, используемый несколькими плагинами Nightbreak. Движок обеспечивает песочницу, планировщик, управление зонами, взаимодействие с миром, таблицы сущностей и пользовательский интерфейс игрока — всё с единым API для всех плагинов.

В настоящее время следующие плагины используют этот движок:

  • EliteMobs — Lua-способности для пользовательских боссов (хуки вроде on_boss_damaged_by_player, on_enter_combat и т.д.)
  • FreeMinecraftModels — Lua-скрипты для пропов и пользовательских предметов (хуки вроде on_right_click, on_left_click, on_equip и т.д.)

Эта страница документирует общие возможности движка. Для хуков, API и рабочих процессов, специфичных для конкретных плагинов, см. страницы плагинов по ссылкам выше.


Краткий учебник по Lua

Если вы совершенно незнакомы с Lua, вот минимальный синтаксис, необходимый для написания скриптов для любого плагина Nightbreak.

Переменные

Используйте local для сохранения значения:

local cooldown_key = "fire_burst"
local damage_multiplier = 1.5

local означает, что переменная принадлежит только этому файлу или блоку.

Функции

Функции — это многоразовые блоки логики:

local function warn_player(player)
player:send_message("&cMove!")
end

Позже вы можете вызвать её:

warn_player(some_player)

Проверки if

Используйте if, когда что-то должно происходить только иногда:

if context.player == nil then
return
end

Это означает «если для этого хука нет игрока, остановиться здесь».

nil

nil означает «нет значения». Это Lua-аналог «здесь ничего нет».

Часто проверяется наличие nil:

if context.event ~= nil then
-- do something with the event
end

~= означает «не равно».

Таблицы

Lua использует таблицы для нескольких целей:

  • Списки
  • Объекты с именованными ключами
  • Финальное определение скрипта, возвращаемое в конце файла

Пример таблицы с именованными ключами:

local particle = {
particle = "FLAME",
amount = 1,
speed = 0.05
}

Возврат определения скрипта

В конце каждого файла скрипта вы возвращаете одну таблицу:

return {
api_version = 1,

on_spawn = function(context)
end
}

Эта возвращаемая таблица и является файлом скрипта.

Комментарии

Используйте -- для написания заметок для людей:

-- This cooldown stops the attack from firing every hit
context.cooldowns:set_local(60, "fire_burst")

Песочница Lua

Все Lua-скрипты выполняются внутри изолированной среды LuaJ. Несколько глобальных переменных, которые могут обеспечить доступ к файловой системе или Java-среде выполнения, удалены. Правила песочницы идентичны для всех плагинов, использующих MagmaCore.

Удалённые глобальные переменные

Следующие стандартные глобальные переменные Lua установлены в nil и не могут использоваться:

УдаленоПричина
debugРаскрывает внутреннее состояние ВМ
dofileДоступ к файловой системе
ioДоступ к файловой системе
loadПроизвольная загрузка кода
loadfileДоступ к файловой системе
luajavaПрямой доступ к Java-классам
moduleСистема модулей (не нужна)
osДоступ к операционной системе
packageСистема модулей (не нужна)
requireСистема модулей / доступ к файловой системе

Доступная стандартная библиотека

Всё остальное из стандартной библиотеки Lua работает нормально:

КатегорияФункции
Mathmath.abs, math.ceil, math.floor, math.max, math.min, math.random, math.sin, math.cos, math.sqrt, math.pi и все остальные функции math.*
Stringstring.byte, string.char, string.find, string.format, string.gsub, string.len, string.lower, string.match, string.rep, string.sub, string.upper и все остальные функции string.*
Tabletable.insert, table.remove, table.sort, table.concat и все остальные функции table.*
Итераторыpairs, ipairs, next
Типыtype, tostring, tonumber, select, unpack
Обработка ошибокpcall, xpcall, error, assert
Прочееprint, rawget, rawset, rawequal, rawlen, setmetatable, getmetatable
Библиотека os недоступна

Библиотека os полностью удалена из песочницы. Если вам нужна информация о времени, используйте context.world:get_time() для игрового времени или сохраняйте метки времени в context.state с помощью счётчиков тиков в on_tick / on_game_tick.

подсказка

print выводит в консоль сервера, но предпочтительнее использовать context.log:info(msg) для вывода. Сообщения лога имеют префикс с именем файла скрипта, что упрощает отслеживание источника сообщения.


Контракт файла

Каждый Lua-скрипт должен возвращать (return) таблицу. Эта таблица намеренно строгая.

Обязательные и необязательные поля верхнего уровня

ПолеОбязательноТипПримечания
api_versionДаNumberВ настоящее время должно быть 1
priorityНетNumberПриоритет выполнения. Меньшие значения выполняются первыми. По умолчанию 0
поддерживаемые ключи хуковНетFunctionДолжны использовать одно из точных имён хуков, поддерживаемых плагином

Правила валидации

  • Файл должен возвращать таблицу.
  • api_version обязателен и в настоящее время должен быть 1.
  • priority должен быть числом, если присутствует.
  • Каждый дополнительный ключ верхнего уровня должен быть поддерживаемым именем хука.
  • Каждый ключ хука должен указывать на функцию.
  • Неизвестные ключи верхнего уровня отклоняются.

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

local ANIMATION_NAME = "idle"

local function do_something(context)
context.log:info("Doing something!")
end

return {
api_version = 1,
priority = 0,

on_spawn = function(context)
do_something(context)
end
}

Синтаксис методов: : vs .

В Lua object:method(arg) — это сокращение для object.method(object, arg). API MagmaCore принимает обе формы, поэтому оба варианта работают:

context.log:info("hello")
context.log.info("hello") -- same thing

Вся документация последовательно использует :.


Бюджет выполнения

Каждый вызов хука и каждый вызов обратного вызова замеряется по времени. Если один вызов занимает более 50 миллисекунд, скрипт отключается с предупреждением в консоли:

[Lua] my_script.lua took 73ms in 'on_game_tick' (limit: 50ms) -- script disabled to prevent lag.

Чтобы оставаться в рамках бюджета:

  • Избегайте неограниченных циклов внутри хуков.
  • Делайте обработчики on_game_tick / on_tick легковесными — они выполняются каждый тик.
  • Используйте context.scheduler:run_repeating(...) для распределения работы по тикам.
  • Переносите дорогостоящую работу за кулдаун на основе состояния или разумный интервал.

context.state

Обычная Lua-таблица, которая сохраняется на протяжении всего времени жизни экземпляра скрипта. Используйте её для хранения флагов, счётчиков, ID задач, состояний переключения и любых данных, которыми нужно делиться между хуками.

on_spawn = function(context)
context.state.is_open = false
context.state.click_count = 0
context.state.task_id = nil
end,

on_right_click = function(context)
context.state.click_count = (context.state.click_count or 0) + 1
end
к сведению

Только context.state сохраняется между вызовами хуков. Все остальные таблицы контекста (context.prop, context.world, context.event и т.д.) пересоздаются каждый раз заново. context.state не пересоздаётся — он существует с момента создания экземпляра скрипта до его уничтожения.


context.log

Методы логирования в консоль. Сообщения в консоли сервера имеют префикс с именем файла скрипта.

МетодПримечания
log:info(message)Информационное сообщение
log:warn(message)Предупреждение
log:error(message)Сообщение уровня предупреждения (логируется на уровне WARN, аналогично log:warn)
log:debug(message)Отладочное сообщение (отображается как info-уровень с префиксом debug)
context.log:info("Script loaded!")
context.log:warn("Something unexpected happened")
context.log:error("Critical failure in zone setup")
context.log:debug("State value: " .. tostring(context.state.counter))

context.cooldowns

Таблица cooldowns управляет временными перезарядками для ваших скриптов. Есть два уровня:

  • Локальные перезарядки привязаны к экземпляру скрипта и идентифицируются строковым ключом. Если ключ не указан, используется имя файла скрипта в качестве ключа по умолчанию.
  • Глобальные перезарядки общие для всех скриптов одного владельца сущности (например, все скрипты одного пропа или все Lua-способности одного босса).

cooldowns:check_local(key?, duration)

Наиболее часто используемый метод. Проверяет, готова ли перезарядка, и если да, запускает её и возвращает true. Если не готова, возвращает false. Это атомарная операция проверки-и-установки — без условий гонки.

ПараметрТипПримечания
keystring (необязательно)Идентификатор перезарядки. По умолчанию — имя файла скрипта.
durationintДлительность перезарядки в тиках (20 = 1 секунда)
on_right_click = function(context)
-- Only allow this action once every 3 seconds
if not context.cooldowns:check_local("interact", 60) then
return
end
-- ... do the action
end

cooldowns:local_ready(key?)

Возвращает true, если локальная перезарядка истекла (или никогда не была установлена), false, если ещё активна.

cooldowns:local_remaining(key?)

Возвращает количество оставшихся тиков локальной перезарядки, или 0, если готова.

cooldowns:set_local(duration, key?)

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

ПараметрТипПримечания
durationintДлительность в тиках. Передайте 0 или отрицательное значение для очистки.
keystring (необязательно)Идентификатор перезарядки. По умолчанию — имя файла скрипта.

cooldowns:global_ready()

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

cooldowns:set_global(duration)

Устанавливает глобальную перезарядку.

ПараметрТипПримечания
durationintДлительность в тиках
Глобальные перезарядки EliteMobs

В скриптах способностей EliteMobs global_ready() и set_global() используют встроенную систему перезарядки способностей босса, которая является общей для всех Lua-способностей одного босса. Локальные перезарядки в EliteMobs также общие для всех способностей одной сущности босса (идентифицируются выбранным вами строковым ключом).


context.scheduler

Планировщик позволяет запускать отложенные и повторяющиеся задачи. Все задачи принадлежат экземпляру скрипта и автоматически отменяются при уничтожении экземпляра скрипта (например, при удалении пропа или смерти босса).

scheduler:run_later(ticks, callback)

Запускает обратный вызов один раз после задержки. Возвращает числовой ID задачи.

ПараметрТипПримечания
ticksintЗадержка в серверных тиках (20 тиков = 1 секунда)
callbackfunctionВызывается со свежим context по истечении задержки
context.scheduler:run_later(40, function(delayed_context)
delayed_context.log:info("2 seconds have passed!")
end)

scheduler:run_repeating(delay, interval, callback)

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

ПараметрТипПримечания
delayintНачальная задержка в тиках перед первым запуском
intervalintТики между каждым последующим запуском
callbackfunctionВызывается со свежим context каждый интервал
context.state.particle_task = context.scheduler:run_repeating(0, 20, function(tick_context)
tick_context.log:info("Another second passed!")
end)

scheduler:cancel(taskId)

Отменяет запланированную задачу по её ID.

ПараметрТипПримечания
taskIdintID задачи, возвращённый run_later или run_repeating
Всегда отменяйте повторяющиеся задачи

Если вы запускаете повторяющуюся задачу, всегда отменяйте её в хуке очистки (on_destroy для пропов, on_exit_combat / on_death для боссов, on_unequip для предметов). Забывание отменить оставляет фоновую задачу работающей до уничтожения экземпляра скрипта, что тратит производительность и может вызвать ошибки.

Обратные вызовы получают свежий контекст

Запланированные обратные вызовы получают свежий контекст в качестве параметра. Всегда используйте аргумент контекста самого обратного вызова, а не внешний context из хука, который создал обратный вызов. Внешний контекст может содержать устаревшие ссылки.


context.world

Таблица мира предоставляет методы для запросов и взаимодействия с миром Minecraft. Она строится из текущего мира сущности.

Расширения для конкретных плагинов

EliteMobs расширяет context.world дополнительными методами для спавна боссов, подкреплений, падающих блоков, фейерверков, зелий-брызг и временных блоков. Полный расширенный API см. в Мир и окружение EliteMobs. Описанные здесь методы доступны во всех плагинах.

world.name

Строковое поле, содержащее имя мира.


world:get_block_at(x, y, z)

Возвращает имя материала блока по заданным координатам в виде строки нижнего регистра (например, "stone", "air").

ПараметрТипПримечания
xintX-координата блока
yintY-координата блока
zintZ-координата блока

world:set_block_at(x, y, z, material)

Устанавливает блок по заданным координатам. Выполняется в главном потоке.

ПараметрТипПримечания
xintX-координата блока
yintY-координата блока
zintZ-координата блока
materialstringИмя Bukkit Material, нижний регистр (например, "stone", "air", "oak_planks")

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


world:spawn_particle(particle, x, y, z, count, dx, dy, dz, speed)

Создаёт частицы в указанном местоположении.

ПараметрТипПо умолчаниюПримечания
particlestringобязательноИмя перечисления Bukkit Particle, ВЕРХНИЙ_РЕГИСТР (например, "FLAME", "DUST")
xnumberобязательноX-координата
ynumberобязательноY-координата
znumberобязательноZ-координата
countint1Количество частиц
dxnumber0Разброс/смещение по X
dynumber0Разброс/смещение по Y
dznumber0Разброс/смещение по Z
speednumber0Скорость частиц
Частицы, требующие данных

Некоторые типы частиц требуют данных о блоке или предмете, которые не поддерживаются этим простым API. BLOCK_CRACK, FALLING_DUST, BLOCK_DUST и ITEM_CRACK не будут работать или не будут давать видимого эффекта. Используйте альтернативы, не требующие данных: CLOUD, SMOKE, CAMPFIRE_COSY_SMOKE, SNOWFLAKE, FLAME, DUST и т.д.


world:play_sound(sound, x, y, z, volume, pitch)

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

ПараметрТипПо умолчаниюПримечания
soundstringобязательноИмя перечисления Bukkit Sound, ВЕРХНИЙ_РЕГИСТР (например, "ENTITY_EXPERIENCE_ORB_PICKUP")
xnumberобязательноX-координата
ynumberобязательноY-координата
znumberобязательноZ-координата
volumenumber1.0Громкость
pitchnumber1.0Тональность

world:strike_lightning(x, y, z)

Ударяет молнией в указанном местоположении (визуально и с нанесением урона).

ПараметрТипПримечания
xnumberX-координата
ynumberY-координата
znumberZ-координата

world:get_time()

Возвращает текущее время мира в тиках.


world:set_time(ticks)

Устанавливает время мира.

ПараметрТипПримечания
ticksintВремя мира (0 = рассвет, 6000 = полдень, 13000 = ночь, 18000 = полночь)

world:get_nearby_entities(x, y, z, radius)

Возвращает массив таблиц-обёрток сущностей для всех сущностей в пределах ограничивающего параллелепипеда с центром в указанных координатах.

ПараметрТипПримечания
xnumberЦентр X
ynumberЦентр Y
znumberЦентр Z
radiusnumberРадиус поиска (используется как полуразмер по всем трём осям)
предупреждение

Возвращает ВСЕ сущности в радиусе, включая неживые сущности (стойки для брони, выброшенные предметы и т.д.). Всегда проверяйте if entity.damage then перед вызовом методов живых сущностей.


world:get_nearby_players(x, y, z, radius)

Возвращает массив таблиц-обёрток игроков для всех игроков в пределах ограничивающего параллелепипеда с центром в указанных координатах.

ПараметрТипПримечания
xnumberЦентр X
ynumberЦентр Y
znumberЦентр Z
radiusnumberРадиус поиска

world:spawn_entity(entity_type, x, y, z)

Создаёт ванильную сущность Minecraft в указанном местоположении.

ПараметрТипПримечания
entity_typestringИмя типа сущности Bukkit, нижний регистр (например, "zombie", "skeleton", "pig")
xnumberX-координата
ynumberY-координата
znumberZ-координата

Возвращает таблицу сущности для созданной сущности (с методами живой сущности, если применимо) или nil, если тип сущности недействителен.


world:get_highest_block_y(x, z)

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

ПараметрТипПримечания
xintX-координата блока
zintZ-координата блока

world:raycast(from_x, from_y, from_z, dir_x, dir_y, dir_z, [max_distance])

Бросает луч из точки в направлении и возвращает информацию о том, во что он попал.

ПараметрТипПо умолчаниюПримечания
from_xnumberобязательноX начала
from_ynumberобязательноY начала
from_znumberобязательноZ начала
dir_xnumberобязательноX-компонент направления
dir_ynumberобязательноY-компонент направления
dir_znumberобязательноZ-компонент направления
max_distancenumber50Максимальное расстояние луча

Возвращает таблицу со следующими полями:

ПолеТипПримечания
hit_entityтаблица сущности или nilПервая сущность, в которую попал луч, или nil, если ни одна
hit_locationтаблица местоположения или nilТочная точка, где луч во что-то попал
hit_blockтаблица или nil{x, y, z, material} блока, в который попал луч, или nil, если блок не был задет

world:spawn_firework(x, y, z, colors, [type], [power])

Создаёт фейерверк в указанном местоположении.

ПараметрТипПо умолчаниюПримечания
xnumberобязательноX-координата
ynumberобязательноY-координата
znumberобязательноZ-координата
colorstableобязательноМассив строк цветов, например {"RED", "BLUE", "WHITE"}
typestring"BALL"Форма фейерверка: "BALL", "BALL_LARGE", "STAR", "BURST", "CREEPER"
powerint1Мощность полёта, 0-127
-- Example: red and gold firework burst
context.world:spawn_firework(loc.x, loc.y, loc.z, {"RED", "GOLD"}, "BURST", 2)

world:place_temporary_block(x, y, z, material, [ticks], [require_air])

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

ПараметрТипПо умолчаниюПримечания
xintобязательноX-координата блока
yintобязательноY-координата блока
zintобязательноZ-координата блока
materialstringобязательноИмя Bukkit Material (например, "stone", "ice")
ticksint0Длительность в тиках до возврата блока. 0 означает постоянный.
require_airbooleanfalseЕсли true, размещает блок только если целевая позиция — воздух

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


world:drop_item(x, y, z, material, [amount])

Создаёт выброшенный предмет в указанном местоположении с естественным разбросом.

ПараметрТипПо умолчаниюПримечания
xnumberобязательноX-координата
ynumberобязательноY-координата
znumberобязательноZ-координата
materialstringобязательноИмя Bukkit Material
amountint1Размер стопки

Возвращает таблицу сущности для выброшенного предмета, или nil, если материал недействителен.


context.zones

Таблица зон позволяет создавать пространственные зоны и отслеживать вход/выход игроков. Зоны привязаны к экземпляру скрипта и автоматически очищаются при уничтожении экземпляра скрипта.

zones:create_sphere(x, y, z, radius)

Создаёт сферическую зону с центром в указанных координатах. Возвращает числовой дескриптор зоны.

ПараметрТипПримечания
xnumberЦентр X
ynumberЦентр Y
znumberЦентр Z
radiusnumberРадиус сферы

zones:create_cylinder(x, y, z, radius, height)

Создаёт цилиндрическую зону. Возвращает числовой дескриптор зоны.

ПараметрТипПримечания
xnumberЦентр X
ynumberЦентр Y (основание)
znumberЦентр Z
radiusnumberРадиус цилиндра
heightnumberВысота цилиндра

zones:create_cuboid(x, y, z, xSize, ySize, zSize)

Создаёт кубоидную зону. Возвращает числовой дескриптор зоны.

ПараметрТипПримечания
xnumberЦентр X
ynumberЦентр Y
znumberЦентр Z
xSizenumberПолуразмер по X
ySizenumberПолуразмер по Y
zSizenumberПолуразмер по Z

zones:watch(handle, onEnterCallback, onLeaveCallback)

Начинает отслеживание зоны на предмет входа/выхода игроков. Когда игрок входит или выходит из зоны, срабатывает соответствующий обратный вызов (и, если определены, хуки on_zone_enter / on_zone_leave).

ПараметрТипПримечания
handleintДескриптор зоны из вызова create_*
onEnterCallbackfunction или nilВызывается, когда игрок входит в зону
onLeaveCallbackfunction или nilВызывается, когда игрок покидает зону

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

к сведению

Наблюдения за зонами проверяются каждый серверный тик для всех игроков в том же мире. Держите количество зон разумным, чтобы избежать влияния на производительность.


zones:unwatch(handle)

Останавливает наблюдение за зоной и очищает её ресурсы.

ПараметрТипПримечания
handleintДескриптор зоны для остановки наблюдения

Пример: зона срабатывания по приближению

return {
api_version = 1,

on_spawn = function(context)
local loc = context.prop.current_location -- or context.boss:get_location()
if loc == nil then return end

local handle = context.zones:create_sphere(loc.x, loc.y, loc.z, 5)

context.zones:watch(
handle,
function(player)
context.log:info("Player entered zone!")
end,
function(player)
context.log:info("Player left zone!")
end
)

context.state.zone_handle = handle
end,

on_destroy = function(context)
if context.state.zone_handle then
context.zones:unwatch(context.state.zone_handle)
end
end
}

context.event

Таблица event присутствует, когда текущий хук был вызван игровым событием (например, on_right_click, on_zone_enter). Она не присутствует во время on_tick или запланированных обратных вызовов.

Поле / МетодТипПримечания
is_cancelledbooleanОтменено ли событие
cancel()methodОтменяет событие (предотвращает поведение по умолчанию)
uncancel()methodСнимает отмену ранее отменённого события
playerentity tableИгрок, участвующий в событии, если есть
on_right_click = function(context)
if context.event then
context.event:cancel() -- prevent the default right-click interaction
end
end
Таблица событий EliteMobs

Скрипты способностей EliteMobs имеют более подробную таблицу событий с объёмами урона, причинами урона, ссылками на атакующего и методами модификации урона. См. Справочник Lua API для полных полей событий EliteMobs.


Пространство имён em

Таблица em доступна во время загрузки файла (до запуска любого хука). Она предоставляет вспомогательные конструкторы для создания таблиц местоположений, таблиц векторов и определений зон, используемых во всём API.

ФункцияНазначение
em.create_location(x, y, z [, world, yaw, pitch])Создать таблицу местоположения с необязательным именем мира, yaw и pitch. Возвращаемая таблица также имеет метод .add(dx, dy, dz), который смещает местоположение на месте и возвращает себя для цепочки вызовов.
em.create_vector(x, y, z)Создать таблицу вектора
em.zone.create_sphere_zone(radius)Создать определение сферической зоны
em.zone.create_dome_zone(radius)Создать определение купольной зоны
em.zone.create_cylinder_zone(radius, height)Создать определение цилиндрической зоны
em.zone.create_cuboid_zone(x, y, z)Создать определение кубоидной зоны
em.zone.create_cone_zone(length, radius)Создать определение конусной зоны
em.zone.create_static_ray_zone(length, thickness)Создать определение зоны статического луча
em.zone.create_rotating_ray_zone(length, point_radius, animation_duration)Создать определение зоны вращающегося луча
em.zone.create_translating_ray_zone(length, point_radius, animation_duration)Создать определение зоны перемещающегося луча

Конструкторы зон возвращают цепочечные таблицы с :set_center(loc) (или :set_origin(loc) / :set_destination(loc) в зависимости от типа зоны):

-- At file scope: create a reusable zone shape
local blast_zone = em.zone.create_sphere_zone(5)

return {
api_version = 1,

on_spawn = function(context)
-- Anchor the zone at call time
blast_zone:set_center(context.boss:get_location())
local entities = context.zones:get_entities_in_zone(blast_zone)
-- ...
end
}
к сведению

Пространство имён em особенно полезно в EliteMobs, где определения зон используются с context.zones:get_entities_in_zone() и context.script. В FreeMinecraftModels методы context.zones:create_sphere(...) / create_cylinder(...) / create_cuboid(...) чаще используются для простых зон на основе наблюдения.


Таблицы сущностей

Таблицы сущностей возвращаются из запросов мира, данных событий и обратных вызовов зон. Они предоставляют многоуровневый набор полей и методов в зависимости от типа сущности.

Базовые поля сущности

ПолеТипПримечания
uuidstringUUID сущности
entity_typestringТип сущности (например, "player", "zombie", "skeleton", "villager")
is_validbooleanДействительна ли ссылка на сущность
is_deadbooleanМертва ли сущность
is_playerbooleanЯвляется ли сущность игроком
is_hostilebooleanЯвляется ли сущность враждебным мобом (зомби, скелет и т.д.)
is_passivebooleanЯвляется ли сущность мирным мобом (корова, свинья, курица и т.д.)
current_locationтаблица местоположенияТекущая позиция сущности (x, y, z, world, yaw, pitch)
worldstringИмя мира, в котором находится сущность

Базовые методы сущности

МетодВозвращаетПримечания
teleport(location_table)voidТелепортирует сущность. Таблица местоположения должна содержать поля x, y, z, world; yaw и pitch необязательны.
remove()voidУдаляет сущность из мира. Действует только если сущность всё ещё действительна.
set_silent(flag)voidПодавляет или восстанавливает звуки сущности.
set_invulnerable(flag)voidДелает сущность неуязвимой или уязвимой к урону.
set_gravity(flag)voidВключает или отключает гравитацию для сущности.
set_glowing(flag)voidПереключает эффект светящегося контура на сущности.

Поля живой сущности

Живые сущности (игроки, мобы и т.д.) имеют все базовые поля сущности плюс:

ПолеТипПримечания
healthnumberТекущее здоровье
maximum_healthnumberМаксимальное здоровье
namestringОтображаемое имя
is_alivebooleanЖива ли сущность

Методы живой сущности

МетодВозвращаетПримечания
damage(amount)voidНаносит указанное количество урона сущности
push(x, y, z)voidПрименяет импульс скорости
set_facing(x, y, z)voidУстанавливает направление взгляда сущности
add_potion_effect(effect, duration, amplifier)voidДобавляет эффект зелья. effect — строка (например, "speed", "slowness", "regeneration"). duration — в тиках. amplifier — уровень эффекта минус 1 (0 = уровень I).
remove_potion_effect(effect)voidУдаляет эффект зелья по имени
предупреждение

Не все сущности, возвращаемые get_nearby_entities(), являются живыми сущностями. Вы можете использовать entity.is_player, entity.is_hostile или entity.is_passive для фильтрации по категории, или проверять if entity.damage then перед вызовом методов живых сущностей, таких как damage(), push() или add_potion_effect().


Поля интеграции с плагинами

Таблицы сущностей автоматически включают поля для обнаружения и взаимодействия с сущностями, управляемыми другими плагинами Nightbreak. Эти поля заполняются только при установленном соответствующем плагине — иначе они имеют значения false / nil без дополнительных затрат.

Поля EliteMobs

Доступны при установленном EliteMobs.

ПолеТипПримечания
is_elitebooleanЯвляется ли сущность элитой EliteMobs
is_custom_bossbooleanЯвляется ли сущность пользовательским боссом EliteMobs (также доступно в подтаблице elite)
is_significant_bossbooleanЯвляется ли сущность пользовательским боссом с множителем здоровья больше 1 (т.е. спроектированной встречей, а не рядовой элитой)
elitetable или nilПодтаблица информации об элите (см. ниже). nil, если сущность не является элитой.

Подтаблица elite содержит:

ПолеТипПримечания
elite.levelintУровень элиты
elite.namestringОтображаемое имя элиты
elite.healthnumberТекущее здоровье
elite.max_healthnumberМаксимальное здоровье
elite.is_custom_bossbooleanЯвляется ли пользовательским боссом (в отличие от природной элиты)
elite.health_multipliernumberМножитель здоровья из конфигурации
elite.damage_multipliernumberМножитель урона из конфигурации
elite:remove()voidУдаляет элиту через надлежащий конвейер удаления EliteMobs (очищает отслеживание, добычу и т.д.)
Пример: Нанесение разного урона элитам
local entities = context.world:get_nearby_entities(x, y, z, 5)
for _, entity in ipairs(entities) do
if entity.is_elite then
-- Deal double damage to elites
entity:damage(20)
context.log:info("Hit elite: " .. entity.elite.name .. " (level " .. entity.elite.level .. ")")
elseif entity.is_hostile then
entity:damage(10)
end
end

Поля FreeMinecraftModels

Доступны при установленном FreeMinecraftModels.

ПолеТипПримечания
is_modeledbooleanИмеет ли сущность присоединённую модель FMM (DynamicEntity или PropEntity)
is_propbooleanЯвляется ли сущность пропом FMM (статическая декоративная сущность)
modeltable или nilПодтаблица информации о модели (см. ниже). nil, если сущность не имеет модели.

Подтаблица model содержит:

ПолеТипПримечания
model.model_idstringID чертежа модели (например, "torch_01")
model:play_animation(name, [blend], [loop])booleanВоспроизводит именованную анимацию. blend по умолчанию false, loop по умолчанию false. Возвращает true, если анимация найдена.
model:stop_animations()voidОстанавливает все текущие анимации модели.
model:remove()voidУдаляет моделированную сущность через надлежащий конвейер удаления FMM.
Различия мост vs проп

Мост модели (доступный для любой сущности) по умолчанию устанавливает blend и loop в false. Таблица пропа play_animation по умолчанию устанавливает оба в true, потому что пропы обычно используют смешанные зацикленные анимации.

Пример: Фильтрация сущностей по типу
local entities = context.world:get_nearby_entities(x, y, z, 10)
for _, entity in ipairs(entities) do
if entity.is_prop then
-- Skip props
elseif entity.is_player then
entity:damage(5)
elseif entity.entity_type == "villager" then
-- Don't hurt villagers
elseif entity.is_elite then
entity:damage(20)
elseif entity.is_hostile then
entity:damage(10)
end
end

Поля, специфичные для игрока

Сущности игроков имеют все поля сущности и живой сущности плюс:

ПолеТипПримечания
game_modestringРежим игры игрока ("creative", "survival", "adventure", "spectator")

Методы, специфичные для игрока

МетодВозвращаетПримечания
send_message(msg)voidОтправляет сообщение в чат игроку. Поддерживает цветовые коды &.
get_held_item()table или nilВозвращает {type, amount, display_name} для предмета в основной руке игрока, или nil, если пусто
consume_held_item(amount?)voidПотребляет предметы из основной руки игрока. amount по умолчанию 1
has_item(material, amount?)booleanВозвращает true, если у игрока есть хотя бы amount (по умолчанию 1) указанного материала где-либо в инвентаре
get_target_entity([range])таблица сущности или nilВозвращает сущность, на которую смотрит игрок через raycast, или nil, если нет. Дальность по умолчанию 50.
get_eye_location()таблица местоположенияВозвращает таблицу местоположения на уровне глаз игрока
get_look_direction()tableВозвращает вектор направления {x, y, z}, куда смотрит игрок
send_block_change(x, y, z, material, [ticks])voidОтправляет фальшивый блок, видимый только этому игроку. Если указаны ticks, фальшивый блок автоматически сбрасывается после этой длительности.
reset_block(x, y, z)voidСбрасывает фальшивый блок обратно к реальному для этого игрока
sleep(x, y, z)voidЗаставляет игрока выполнить анимацию сна в кровати по указанным координатам. Блок автоматически восстанавливается, когда игрок перестаёт спать.
wake_up()voidБудит спящего игрока.

Методы UI игрока

Эти методы доступны для любой таблицы сущности игрока и предоставляют способы отображения информации через встроенные элементы интерфейса Minecraft.

player:show_boss_bar(text, [color], progress, [ticks])

Показывает полосу босса игроку.

ПараметрТипПо умолчаниюПримечания
textstringобязательноОтображаемый текст. Поддерживает цветовые коды &.
colorstring"WHITE"Цвет полосы. Один из: "RED", "BLUE", "GREEN", "YELLOW", "PURPLE", "PINK", "WHITE"
progressnumberобязательноУровень заполнения от 0.0 (пусто) до 1.0 (полно)
ticksintnilНеобязательная задержка автоскрытия в тиках. Если не указано, полоса остаётся до ручного скрытия.

player:hide_boss_bar()

Убирает полосу босса с экрана игрока. Не принимает параметров.

player:show_action_bar(text, [ticks])

Показывает текст в области панели действий (над хотбаром).

ПараметрТипПо умолчаниюПримечания
textstringобязательноОтображаемый текст. Поддерживает цветовые коды &.
ticksintnilНеобязательная длительность в тиках. Если указана, сообщение повторно отправляется каждые 40 тиков, чтобы оставаться видимым в течение полной длительности.

player:show_title(title, [subtitle], fade_in, stay, fade_out)

Показывает экран заголовка игроку.

ПараметрТипПо умолчаниюПримечания
titlestringобязательноОсновной текст заголовка. Поддерживает цветовые коды &.
subtitlestring""Текст подзаголовка под основным заголовком. Необязательно.
fade_inintобязательноДлительность появления в тиках
stayintобязательноКак долго заголовок остаётся на экране в тиках
fade_outintобязательноДлительность исчезновения в тиках

Следующие шаги

Для хуков, API и рабочих процессов, специфичных для плагинов: