IXR Framework (LUA Фреймворк)
IMPORTANT
Статус: Поддерживается
Минимальная версия: 1.4.0
ffx_object_utils: \gamedata\scripts\ixr_framework\utils\ffx_object_utils.script
Утилиты для работы с игровыми (клиентскими) и серверными объектами, включая проверки, преобразования, управление условиями и положение костей:
has_actorse_object_by_id_or_falsese_object_or_falsegame_object_or_falseis_actor_alivesafe_releasereleasecreateget_inv_namesafe_bone_possafe_release_by_idset_condition_by_idset_conditionto_game_objecttest_to_game_object
Описание методов:
lua
--// Проверить, существует ли актёр (с кешированием результата).
has_actor()
args:
(none)
retval: (boolean) - true, если актёр существует, иначе false.
--// Вернуть серверный объект по ID или false, если не найден.
se_object_by_id_or_false(id)
args:
id (number)(required) - ID серверного объекта.
retval: (server_object|false) - серверный объект, если валидный, иначе false.
--// Вернуть серверный объект, если он валидный, иначе false.
se_object_or_false(se_obj)
args:
se_obj (userdata)(required) - серверный объект для проверки.
retval: (server_object|false) - исходный объект, если валидный, иначе false.
--// Вернуть клиентский (игровой) объект, если он валидный, иначе false.
game_object_or_false(g_obj)
args:
g_obj (userdata)(required) - клиентский объект для проверки.
retval: (game_object|false) - исходный объект, если валидный, иначе false.
--// Проверить, жив ли актёр (существует и alive()).
is_actor_alive()
args:
(none)
retval: (boolean) - true, если актёр существует и жив, иначе false.
--// Безопасно освободить серверный объект по таблице с ID. При force = true освобождает сразу, иначе сначала пытается перевести в офлайн.
safe_release(p, force)
args:
p (table)(required) - таблица с ID объекта в индексе 1 (например, {id}).
force (boolean)(optional) - если true, принудительное освобождение; иначе освобождение после перевода в офлайн (по умолчанию false).
retval: (boolean) - true, если объект успешно освобождён или уже освобождён; false, если объект ещё онлайн и не удалось переключить в офлайн.
--// Освободить серверный объект напрямую.
release(se_obj)
args:
se_obj (userdata)(required) - серверный объект для освобождения.
retval: (none)
--// Создать новый объект через систему ALife.
create(tbl)
args:
tbl (table)(required) - таблица с параметрами: {section, позиция_вектор, level_vertex_id, game_vertex_id}.
retval: (none)
--// Получить инвентарное имя для секции (из системного .ini, поле inv_name). Если не найдено, возвращает имя секции.
get_inv_name(section)
args:
section (string)(required) - имя секции.
retval: (string) - локализованное инвентарное имя или имя секции.
--// Безопасно получить позицию указанной кости NPC. Если кость не найдена или объект не сталкер, возвращает позицию над текущей позицией.
safe_bone_pos(npc, bone)
args:
npc (userdata)(required) - клиентский объект (NPC).
bone (string)(optional) - имя кости (по умолчанию "bip01_spine").
retval: (vector) - вектор позиции.
--// Безопасно освободить серверный объект по его ID.
safe_release_by_id(id)
args:
id (number)(required) - ID объекта для освобождения.
retval: (none)
--// Установить состояние (condition) клиентского объекта по его серверному ID. Использует client_spawn_manager для ожидания появления объекта онлайн.
set_condition_by_id(id, float_condition)
args:
id (number)(required) - серверный ID объекта.
float_condition (number)(required) - значение состояния (обрезается до 0..1).
retval: (none)
--// Установить состояние клиентского объекта напрямую, обрезая значение от 0 до 1.
set_condition(gobj_client, float_condition)
args:
gobj_client (userdata)(required) - клиентский объект.
float_condition (number)(required) - значение состояния (обрезается до 0..1).
retval: (none)
--// Преобразовать серверный или клиентский объект в унифицированную обёртку с безопасными методами. Если входной объект невалидный, возвращает фиктивную обёртку, возвращающую значение по умолчанию.
to_game_object(obj, def_value)
args:
obj (userdata|table)(required) - объект (серверный или клиентский) для обёртывания.
def_value (any)(optional) - значение, возвращаемое методами фиктивной обёртки (по умолчанию nil).
retval: (table) - таблица-обёртка с методами: id(), section(), name(), alive(), level_vertex_id(), game_vertex_id(), position(), is_valid(), is_client_object(), is_server_object(), await_online(callback).
--// Тестовая функция для to_game_object; выводит различные свойства обёрнутого объекта. Используется для отладки.
test_to_game_object(_gobj)
args:
_gobj (userdata)(optional) - объект для теста; если не указан, используется актёр.
retval: (none)Примеры использований:
lua
--// Проверка существования актёра
if ffx_object_utils.has_actor() then
SemiLog("Актёр существует")
end
--// Получение серверного объекта по ID
local se_obj = ffx_object_utils.se_object_by_id_or_false(12345)
if se_obj then
SemiLog(string.format("Найден серверный объект ID: %d", se_obj.id))
end
--// Проверка клиентского объекта
local g_obj = ffx_object_utils.game_object_or_false(db.actor)
if g_obj then
SemiLog("Актёр валидный клиентский объект")
end
--// Проверка, жив ли актёр
if ffx_object_utils.is_actor_alive() then
SemiLog("Актёр жив")
end
--// Безопасное освобождение объекта по таблице с ID
local obj_table = { se_obj_id }
ffx_object_utils.safe_release(obj_table, true) --// принудительно
--// Создание нового объекта
local position = vector():set(100, 0, 50)
ffx_object_utils.create({"ammo_5.56x45_ss109", position, 0, 0})
--// Получение инвентарного имени
local inv_name = ffx_object_utils.get_inv_name("wpn_ak74")
SemiLog(string.format("Название: %s", inv_name))
--// Получение позиции кости
local pos = ffx_object_utils.safe_bone_pos(db.actor, "bip01_head")
SemiLog(string.format("Позиция головы: %.2f, %.2f, %.2f", pos.x, pos.y, pos.z))
--// Установка состояния (health) по ID
ffx_object_utils.set_condition_by_id(actor_id, 0.8)
--// Использование унифицированной обёртки to_game_object
local wrapped = ffx_object_utils.to_game_object(db.actor)
if wrapped:is_valid() then
SemiLog(string.format("Объект: %s, ID: %d", wrapped:section(), wrapped:id()))
end
--// Ожидание появления объекта онлайн через await_online
wrapped:await_online(function(gobj)
SemiLog("Объект теперь онлайн")
end)
--// Тестовая функция (для отладки)
ffx_object_utils.test_to_game_object(db.actor)