Первое обновление. Теперь можно выбирать, какой формы будет рестриктор, Шар или Куб.
Для Куба устанавливаются размеры по x,y,z.
Второе обновление. Теперь, в качестве кастом даты, можно указывать ltx файлы, из папки config. Путь указывается таким образом:
local ltx = "scripts\имя_файла.ltx"
Итак. Создаём файл _new_create.script, если такового ещё нет, и добавляем в него нашу функцию:
function create_restr(storid, pos_restr, lvid_restr, gvid_restr, custom_restr, radius_restr, ax_x, ax_y, ax_z)
local obj = alife():create("space_restrictor", pos_restr, lvid_restr, gvid_restr)
local packet = net_packet()
obj:STATE_Write(packet)
----------------------- load ------------------------------
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk1_f32 = packet:r_float()
local cse_alife_object__unk2_u32 = packet:r_u32()
local level_vertex_id = packet:r_u32()
local object_flags = packet:r_u32()
local custom_data = packet:r_stringZ()
local story_id = packet:r_u32()
local spawn_story_id = packet:r_u32()
local shape_count = packet:r_u8()
for i=1,shape_count do
local shape_type = packet:r_u8()
if shape_type == 0 then
local center = packet:r_vec3()
local radius = packet:r_float()
else
local axis_x = packet:r_vec3()
local axis_y = packet:r_vec3()
local axis_z = packet:r_vec3()
local offset = packet:r_vec3()
end
end
local restrictor_type = packet:r_u8()
-------------------------- save -----------------------------
packet:w_begin(game_vertex_id)
packet:w_float(cse_alife_object__unk1_f32)
packet:w_u32(cse_alife_object__unk2_u32)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
if custom_restr ~= nil then
if string.find (custom_restr, '.ltx') ~= nil then
custom_restr = '[logic]\n cfg = '..custom_restr..'\n'
end
packet:w_stringZ(custom_restr)
else
packet:w_stringZ(custom_data)
end
if storid ~= nil then
packet:w_u32(storid)
else
packet:w_u32(story_id)
end
packet:w_u32(spawn_story_id)
packet:w_u8(1)
if radius_restr ~= nil then
packet:w_u8(0)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_float(radius_restr)
elseif radius_restr == nil and ax_x == nil then
packet:w_u8(0)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_float(2.5)
else
packet:w_u8(1)
packet:w_vec3(vector():set(ax_x, 0, 0))
packet:w_vec3(vector():set(0, ax_y, 0))
packet:w_vec3(vector():set(0, 0, ax_z))
packet:w_vec3(vector():set(0, 0, 0))
end
packet:w_u8(restrictor_type)
-----------------------------------------------------
packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end
Вызов спавна будет производиться из других функций, других файлов, таким образом:
для формы Шар:
_new_create.create_restr(sid, pos, lv, gv, ltx, radius)
для Формы Куб:
_new_create.create_restr(sid, pos, lv, gv, ltx, nil, x, y, z)
Где:
sid --стори айди рестриктора (или nil, если не используется)
pos --позиция спавна рестриктора vector():set(x,y,z)
lv --левел вертекс позиции спавна
gv --гейм вертекс позиции спавна
ltx --кастом дата рестриктора
radius --радиус зоны рестриктора (в метрах) (или nil, если используется форма куба)
x,y,z --размеры куба, по x,y,z соответственно.
Теперь разберём такие настройки как, ltx и sid.
---------------------------------
ltx
Кастом дата рестриктора. Тобишь, логика по которой будет работать данный рестриктор.
Чтобы указать логику из статитеского файла ltx, находящегося в папке config, нужно прописать так:
local ltx = "scripts\\имя_файла.ltx"
или
local ltx = "misc\\имя_файла.ltx"
или
local ltx = "имя_файла.ltx"
В зависимости от того, где лежит требуемый файл, относительно папки config.
Если нас статический ltx не устраивает. То можно прописать логику динамически.
Тобишь, в той же функции, от куда и будет вызываться спавн рестриктора.
Итак, пред вызовом спавна создаём локальную переменную ltx, и в значении данной переменной прописываем всю логику нашего рестриктора.
Например, установим эффект активации слота "ножь", при входе ГГ в рестриктор:
local ltx = "[logic]\n"..
"active = sr_idle@in\n"..
"[sr_idle@in]\n"..
"on_actor_inside = %=activate_knife% sr_idle@out\n"..
"[sr_idle@out]\n"..
"on_actor_outside = sr_idle@in\n"
Разберём особенности динамического ltx:
\n -прописать в новой строке, динамического файла ltx.
.. -привязать следующую строку к общей схеме динамического ltx.
Каждая строка, обязательно заключается в кавычки, кроме двоеточия.
В последней строке, двоеточие запрещается ставить категорически.
Если логика рестриктора, не предусмотрена, то вместо неё ставить nil.
-------------------------------------------------------
sid
Стори айди рестриктора. Используется при отслеживании попадания неписей под рестриктор. Если не используется, то ставить значение nil.
-------------------------------------------------------
Есть возможность использовать значения по умолчанию:
_new_create.create_restr(sid, pos, lv, gv, ltx)
или
_new_create.create_restr(sid, pos, lv, gv)
если custom_data не предусматривается.
По умолчанию рестриктор имеет форму Шара, с радиусом 2.5 метра.
Всё. Пробуйте. У меня работает отлично.