Просто немного запутано получается: Некоторые моды считытвание прописывают в function actor_binder:net_spawn(data), некоторые в function actor_binder:update(delta). Тот же Artefact_respawner_COP прописан и в save, и в load, и в update. правда, не работает нифига правильно.
Мм, не знаю насчёт считывания данных в actor_binder:net_spawn(data) - этот метод вызывается во время спавна ГГ. update - для постоянного апдейта (мониторинга) чего-то и выполнения каких-то действий. В общем, в подписи у меня есть ссылка на разбор биндера, можете почитать. Каждый метод имеет конкретную цель и место применения
Всё, что я добавил в файл bind_stalker.script выделено как makdm_start и makdm_end Вставишь в свой файл bind_stalker.script по аналогии и будет тебе счастье.
В файле art_sp_mgr.script всё расписано. Установлена 10 % вероятность рождения артов в аномалиях и время рождения артов через каждые 6 часов. Правишь под себя как нужно.
Я вот тут на досуге потратил минут 40 времени и написал простенький скрипт по рождению артефактов в аномалиях для CoP.
Вот за это спасибище!!! Я его по диагонали просмотрел. Там, вроде, в таблицу айдишников должны же попадать все аномалии? То есть, если добавятся ещё аномалии, типа динамических, то в них тоже арты смогут появляться?
Добавлено (10.08.2015, 15:59) --------------------------------------------- C динамическими аномалиями - засада. Один мод нашёл, но он фэйком оказался. Но навёл на ARS mod. Типа, оттуда выдрано. Но в этом ARS моде вызов аномалий прописан в десятке мест по разным скриптами. Честно пытался разобраться, что зачем и для чего вызывается, но так и не получилось ничего... Но есть мод - Статические аномалии. В нём аномалии спавнятся через all.spawn. В связи с чем - просьба: объясните кто-нибудь популярно "на пальцах", как правильно перенести изменения из одного all.spawn в другой (в UnP 0.8 правленый all.spawn, вот в него и нужно добавить)
Добавлено (10.08.2015, 18:27) --------------------------------------------- Если что, разобрать-собрать all.spawn я могу. Проблема только, что куда прописывать, чтобы глюков не получить...
Добавлено (14.08.2015, 16:34) --------------------------------------------- makdm, Прикрутил респавнер к сборке. Всё отлично работает, спавн идёт и в оригинальных, и в динамических аномалиях.
Нужна ещё помощь. Существует мод, отображающий метки объектов, типа сталкеров, монстров, аномалий, на экране, ака HUD. В нём есть функция, рассчитывающая местположение метки на экране, но она нормально работает только при FOV = 55. Если FOV поменять, то метки будут на месте, только если смотреть непосредственно на объект, отмеченный меткой. Если начать отворачиваться от объекта, то метка уплывает с него. Автор мода дал примерное место внесения поправки. Собственно, функция, где собираются параметры, и считаются поправки
Код
function update_mark() --Базовые параметры о ГГ act_pos = db.actor:position() act_dir = device().cam_dir cam_pos = device().cam_pos hud = get_hud()
--Убрать все метки если проигрывается катсцена или есть инфопорция "hide_all_ui_mark" hide_all_mark = false if not db.actor:object("detector_fenix") or (act_pos:distance_to_sqr(cam_pos) > 4) or (has_alife_info("hide_all_ui_mark")) then hide_all_mark = true end
--Коэффициент растягивания изображения меток по горизонтали (3:4 = 1, 9:16 = 0,75 ) rise = (device().height*1024)/(device().width*768)
--Функции обновления меток на экране update_npc() update_anom() update_art() update_monstr() end
И функция расчёта положения и вывода метки. Для других объектов - аналогично
Код
function update_npc() local index_mark = 1
--Обновление/добавление меток НПС if not hide_all_mark then for id_base, npc_base_pos in pairs(npc_base_table) do local dist = act_pos:distance_to_sqr(npc_base_pos) if dist < 900 then local npc_pos = vector():set(npc_base_pos.x,npc_base_pos.y,npc_base_pos.z) local npc_dir = npc_pos:sub(act_pos) local yaw = yaw_degree3d(act_dir, npc_dir) if yaw < 35 then if index_mark < 33 then anglI = math.atan2(act_dir.z, act_dir.x) - math.atan2(npc_dir.z, npc_dir.x) anglII = math.atan2(math.sqrt(npc_dir.x*npc_dir.x+npc_dir.z*npc_dir.z), npc_dir.y) - math.atan2(math.sqrt(act_dir.x*act_dir.x+act_dir.z*act_dir.z), act_dir.y) Xcoord = math.floor(512 + 512*math.tan(anglI)/math.cos(anglII)*512/360*rise) Ycoord = math.floor(384 + 384*math.tan(anglII)*384/200) if index_mark > npc_last_mark then hud:AddCustomStatic("npc_hud_mark_"..tostring(index_mark)) npc_mark_table[index_mark] = hud:GetCustomStatic("npc_hud_mark_"..tostring(index_mark)):wnd() end npc_mark_table[index_mark]:SetWndRect(Frect():set(Xcoord-8,Ycoord-8,Xcoord+8,Ycoord+8)) index_mark = index_mark + 1 end end end end end
npc_last_mark = index_mark - 1
--Удаление лишних меток НПС if index_mark < 33 then for i=index_mark,32 do if npc_mark_table[i] then hud:RemoveCustomStatic("npc_hud_mark_"..tostring(i)) npc_mark_table[i] = nil end end end
--Очистка таблицы НПС if index_mark == 1 then npc_nul_mark_time = npc_nul_mark_time + 1 if npc_nul_mark_time > 100 then npc_base_table = {} npc_nul_mark_time = 0 end else npc_nul_mark_time = 0 end
end
Автор мода советует вносить поправку в переменную rise. Я экспериментально выяснил, что при rise = 0.55 метка находится на своём месте. Только не могу сообразить, как этого добиться при различном FOV. Может, кто свежими мозгами глянет, как этот самый FOV учесть? Тут больше математики, на самом деле, чем скриптования...
Автор мода, к сожалению, не имеет больше желания им заниматься.
Добавлено (19.08.2015, 18:06) --------------------------------------------- Переделал немного скрипт. Добавил функцию point_projection(point) по совету Zander_driver с форума AMK
Код
---"Функция проекции точки на экран"
function point_projection(point) --[[ взято с амк-форума ]] local dev = device() local scr_w = dev.width local scr_h = dev.height
local fov2 = (dev.fov/2) * (math.pi/180) local scr_dist = 0.5 * scr_h / math.tan(fov2)
local ppp = vector():sub(point, dev.cam_pos) local dp = dev.cam_dir:dotproduct(ppp)
local x = 512 + dev.cam_right:dotproduct(ppp) * scr_dist / dp * (1024/scr_w) local y = 384 - dev.cam_top:dotproduct(ppp) * scr_dist / dp * (768/scr_h)
return {x, y} end --Функция учитывает возможное разрешение экрана, режим зума и то, что камера может наклоняться. Можно использовать в различных целеуказателях.
и переписал функции вывода меток
Код
function update_mark() --Базовые параметры о ГГ local cam_pos = device().cam_pos local act_pos = db.actor:position() local act_dir = device().cam_dir local hud = get_hud()
--Убрать все метки если проигрывается катсцена или есть инфопорция "hide_all_ui_mark" local hide_all_mark = false if not db.actor:object("detector_fenix") or (act_pos:distance_to_sqr(cam_pos) > 4) or (has_alife_info("hide_all_ui_mark")) then hide_all_mark = true end
--Угол обзора ГГ local fov = math.floor(device().fov+0.02)
function update_npc( act_pos, act_dir, fov, hud, hide_all_mark) local index_mark = 1
--Обновление/добавление меток НПС if not hide_all_mark then for id_base, npc_base_pos in pairs(npc_base_table) do local dist = act_pos:distance_to_sqr(npc_base_pos) if dist < 900 then local npc_pos = vector():set(npc_base_pos.x,npc_base_pos.y,npc_base_pos.z) local npc_dir = npc_pos:sub(act_pos) local yaw = yaw_degree3d(act_dir, npc_dir) if yaw < fov then if index_mark < 33 then
local p_coord = point_projection(npc_base_pos) local Xcoord = p_coord[1] local Ycoord = p_coord[2]
if index_mark > npc_last_mark then hud:AddCustomStatic("npc_hud_mark_"..tostring(index_mark)) npc_mark_table[index_mark] = hud:GetCustomStatic("npc_hud_mark_"..tostring(index_mark)):wnd() end npc_mark_table[index_mark]:SetWndRect(Frect():set(Xcoord-16,Ycoord-384,Xcoord+16,Ycoord-352)) index_mark = index_mark + 1 end end end end end
npc_last_mark = index_mark - 1
--Удаление лишних меток НПС if index_mark < 33 then for i=index_mark,32 do if npc_mark_table[i] then hud:RemoveCustomStatic("npc_hud_mark_"..tostring(i)) npc_mark_table[i] = nil end end end
--Очистка таблицы НПС if index_mark == 1 then npc_nul_mark_time = npc_nul_mark_time + 1 if npc_nul_mark_time > 100 then npc_base_table = {} npc_nul_mark_time = 0 end else npc_nul_mark_time = 0 end
end
В принципе, всё работает, но для НПС и монстряков нужно учесть рост/высоту. Да и аномалии бы помечать надо на уровне высоты камеры. Пока же, метки отображаются на уровне земли. Пытаюсь сообразить, как это сделать. Пробовал разные подстановки, но пока безуспешно. По идее, высоту вывода метки нужно учесть во время расчёта точки в point_projection(point), только пока не соображу, как...
Добавлено (20.08.2015, 14:45) --------------------------------------------- Всем спасибо, разобрался. Окончательный вариант теперь выглядит так Функция point_projection
Код
function point_projection(point, cfix) --[[ взято с амк-форума ]] local dev = device() local scr_w = dev.width local scr_h = dev.height
local fov2 = (dev.fov/2) * (math.pi/180) local scr_dist = 0.5 * scr_h / math.tan(fov2)
local ppp = vector():sub(point, dev.cam_pos) ppp.y = ppp.y + cfix -- поправка на высоту объекта local dp = dev.cam_dir:dotproduct(ppp)
local x = 512 + dev.cam_right:dotproduct(ppp) * scr_dist / dp * (1024/scr_w) local y = 384 - dev.cam_top:dotproduct(ppp) * scr_dist / dp * (768/scr_h)
return {x, y} end --Функция учитывает возможное разрешение экрана, режим зума и то, что камера может наклоняться. Можно использовать в различных целеуказателях.
Функция update_mark
Код
function update_mark() --Базовые параметры о ГГ local cam_pos = device().cam_pos local act_pos = db.actor:position() local act_dir = device().cam_dir local hud = get_hud()
--Убрать все метки если проигрывается катсцена или есть инфопорция "hide_all_ui_mark" local hide_all_mark = false if not db.actor:object("detector_fenix") or (act_pos:distance_to_sqr(cam_pos) > 4) or (has_alife_info("hide_all_ui_mark")) then hide_all_mark = true end
--Угол обзора ГГ local fov = math.floor(device().fov+0.02)
function update_npc( act_pos, act_dir, fov, hud, hide_all_mark) local index_mark = 1 local cfix = 1.7 -- поправка на высоту объекта
--Обновление/добавление меток НПС if not hide_all_mark then for id_base, npc_base_pos in pairs(npc_base_table) do local dist = act_pos:distance_to_sqr(npc_base_pos) if dist < 900 then local npc_pos = vector():set(npc_base_pos.x,npc_base_pos.y,npc_base_pos.z) local npc_dir = npc_pos:sub(act_pos) local yaw = yaw_degree3d(act_dir, npc_dir) if yaw < fov then if index_mark < 33 then
local p_coord = point_projection(npc_base_pos, cfix) local Xcoord = math.floor(p_coord[1]) local Ycoord = math.floor(p_coord[2])
if index_mark > npc_last_mark then hud:AddCustomStatic("npc_hud_mark_"..tostring(index_mark)) npc_mark_table[index_mark] = hud:GetCustomStatic("npc_hud_mark_"..tostring(index_mark)):wnd() end npc_mark_table[index_mark]:SetWndRect(Frect():set(Xcoord-8,Ycoord-8,Xcoord+8,Ycoord+8)) index_mark = index_mark + 1 end end end end end
npc_last_mark = index_mark - 1
--Удаление лишних меток НПС if index_mark < 33 then for i=index_mark,32 do if npc_mark_table[i] then hud:RemoveCustomStatic("npc_hud_mark_"..tostring(i)) npc_mark_table[i] = nil end end end
--Очистка таблицы НПС if index_mark == 1 then npc_nul_mark_time = npc_nul_mark_time + 1 if npc_nul_mark_time > 100 then npc_base_table = {} npc_nul_mark_time = 0 end else npc_nul_mark_time = 0 end
end
Сообщение отредактировал Romz - Четверг, 20.08.2015, 14:47