serega-gamer 0 Опубликовано 9 Марта 2011 Поделиться Опубликовано 9 Марта 2011 (изменено) Доброго времени суток всем.Народ помогите пожалуйста вот такое у меня дело,я скачал и одаптировал к своему моду АИ вертолётов в нём есть такая штука как ПЗРК дак вот суть проблемы в том что в скрипте ПЗРК можно указать только одну секцию оружия а мне нужно несколько в общем около 20 я пытался зделать это сам вот посмотрите что я сделал не так function get_dir_to_obj(self_pos,obj_pos) return obj_pos:sub(self_pos):normalize() end function get_dir_to_obj_2d(self_pos,obj_pos) self_pos.y = 0 obj_pos.y = 0 return obj_pos:sub(self_pos):normalize() end function get_sun_dir() --читаем погоду из конфига. local h = level.get_time_hours() -- игровое вчеря, Ч local m = level.get_time_minutes() -- игровое время, М if h >= 22 or h < 5 then return vector():set(0,-1,0) -- если ночь, считаем, что солнце прямо внизу. Вертолетов там точно не летает, мешать наведению не будет. end local ini = system_ini() local weather = level.get_weather() -- тип погоды local weather_sect = ini:r_string("weathers", weather) -- секция погоды, соответствующая типу local h1 = h + 1 if string.find(weather,"indoor") or weather == "sarkofag" or (weather == "yantar" and not ini:section_exist(yantar_06)) then h = 0 h1 = 12 end local weather_time, time_sect, sun_dir, split, sav, sah, sav1, sah1 if h < 10 then weather_time = "0"..tostring(h)..":00:00" else weather_time = tostring(h)..":00:00" end -- какой час погоды в текущей секции if weather_time == "24:00:00" then weather_time = "00:00:00" end time_sect = ini:r_string(weather_sect, weather_time) -- секция текущей погоды на данный час sun_ang = ini:r_string(time_sect,"sun_dir") split = string.find(sun_ang,",") sav = tonumber(string.sub(sun_ang,1,split-1)) sah = tonumber(string.sub(sun_ang,(split+1),string.len(sun_ang))) if h1 < 10 then weather_time = "0"..tostring(h1)..":00:00" else weather_time = tostring(h1)..":00:00" end if weather_time == "24:00:00" then weather_time = "00:00:00" end time_sect = ini:r_string(weather_sect, weather_time) -- секция текущей погоды на данный час sun_ang = ini:r_string(time_sect,"sun_dir") split = string.find(sun_ang,",") sav1 = tonumber(string.sub(sun_ang,1,split-1)) sah1 = tonumber(string.sub(sun_ang,(split+1),string.len(sun_ang))) if sah1 > 180 and sah < 180 then sah1 = sah1 - 360 end local sun_ang_v = sav + m*(sav1-sav)/60 local sun_ang_h = sah + m*(sah1-sah)/60 local s = vector():set(0,0,-1) local hdir = vector_rotate_y (s, sun_ang_h) local vdir = math.tan(sun_ang_v* -0.017453292519943295769236907684886) local sun_dir = vector():set(hdir.x,vdir,hdir.z) --:normalize() return sun_dir end function see_target(obj,target) return obj:see(target) end function lock_heli_actor() local sun_dir = get_sun_dir() local self_pos = db.actor:position() local self_dir = device().cam_dir local heli_pos, heli_actor_dir local heli_sun_angle, heli_actor_angle local actor_sun_angle = yaw_degree3d(sun_dir,self_dir) local lock_priority, lock_id = 0,nil if actor_sun_angle <= 20 then --захват солнца в любом случае return "sun" end for k,v in pairs(db.heli) do --if see_target(db.actor,v) then --если вертолет виден, разбираемся дальше, нет - и говорить не о чем. if v:get_helicopter():isVisible(db.actor) then --если вертолет виден, разбираемся дальше, нет - и говорить не о чем. local target_info = get_target_info(v:section()) heli_pos = v:position() heli_pos.y = heli_pos.y + target_info.engine_h heli_actor_dir = get_dir_to_obj(self_pos,heli_pos) heli_actor_angle = yaw_degree3d(heli_actor_dir,self_dir) if heli_actor_angle <= 10/target_info.evu then -- если ПЗРК смотрит в сторону вертолета, иначе точно не захватится heli_sun_angle = yaw_degree3d(heli_actor_dir,sun_dir) local lp = 1000/(heli_pos:distance_to(self_pos))*(math.cos(heli_actor_angle*0.017453292519943295 769236907684886))^2/target_info.evu if heli_sun_angle > 20 then -- если вертолет не под солнцем, то его можно захватить, иначе потеряется на фоне солнца if lp > lock_priority then lock_priority = lp lock_id = v:id() end end end end end return tostring(lock_id) end function check_lock(missile,self_pos,self_dir,sun_dir) -- local sun_dir = get_sun_dir() -- local self_pos = db.actor:position() -- local self_dir = device().cam_dir local heli_pos, heli_missile_dir local heli_sun_angle, heli_missile_angle local missile_sun_angle = yaw_degree3d(sun_dir,self_dir) local lock_priority, lock_id = 0,nil if missile_sun_angle <= 20 then --захват солнца в любом случае return "sun" end for k,v in pairs(db.heli) do --if see_target(db.actor,v) then --если вертолет виден, разбираемся дальше, нет - и говорить не о чем. if missile:isVisible(v) then --если вертолет виден, разбираемся дальше, нет - и говорить не о чем. local target_info = get_target_info(v:section()) heli_pos = v:position() heli_pos.y = heli_pos.y + target_info.engine_h heli_missile_dir = get_dir_to_obj(self_pos,heli_pos) heli_missile_angle = yaw_degree3d(heli_missile_dir,self_dir) if heli_missile_angle <= 20/target_info.evu then -- если вертолет в поле зрения ГСН, иначе точно не захватится. Угол обзора снижается при наличии ЭВУ heli_sun_angle = yaw_degree3d(heli_missile_dir,sun_dir) local lp = (heli_pos:distance_to_sqr(self_pos))*(math.cos(heli_missile_angle*0.017453292519 943295769236907684886))^2/target_info.evu if heli_sun_angle > 20 then -- если вертолет не под солнцем, то его можно захватить, иначе потеряется на фоне солнца if lp > lock_priority then lock_priority = lp lock_id = v:id() end end end end end return tostring(lock_id) end function get_target_info(section) local target_info = {} target_info.evu = read_string(section, "evu", 1) -- экранно-выхлопное устройство, цифра - во сколько раз снижается заметность target_info.lipa = read_string(section, "lipa", 0) -- станция помех "Липа", max расстояние, на к-рое исказится позиция. target_info.flares = read_string(section, "flares", 0) -- система выброса тепловых ловушек target_info.engine_h = read_string(section, "engine_h", 2.7) -- высота двигателя return target_info end function launch_actor() local target = lock_heli_actor() if target ~= "nil" then spawn.missile(db.actor:position().x,db.actor:position().y,db.actor:position().z, db.actor:level_vertex_id(),db.actor:game_vertex_id(),target ) end end local pzrk_status = 0 local pzrk_active_timer = nil local beep = 0 --local snd_lock = xr_sound.get_safe_sound_object([[material\$500]]) local snd_lock = xr_sound.get_safe_sound_object([[detectors\contact_8]]) local snd_lock_length = snd_lock:length() local snd_launch = xr_sound.get_safe_sound_object([[weapons\rpg7_shoot]]) local snd_power = xr_sound.get_safe_sound_object([[weapons\generic_close]]) local launch_time = nil local empty = nil local ammo_total = 0 --db.actor:object("hunters_toz") function update() local wpn_tab = {"wpn_igla","wpn_nan2_igla"} local wpn = weapon:section() if string.find(wpn,wpn_tab[name]) then sect = wpn_tab[name] -- break -- end -- end -- if device().fov < 35 then local pos = db.actor:position() local dir = db.actor:direction() pos.x = pos.x + 0.1*dir.z pos.z = pos.z - 0.1*dir.x pos.y = pos.y + 1.85 local target = lock_heli_actor() if target ~= "nil" and pzrk_status == 2 then if time_global() > beep then snd_lock:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) beep = time_global() + snd_lock_length end else end if pzrk_status == 0 and wpn:get_ammo_in_magazine() == 1 then --до подготовки к пуску ammo_total = wpn:get_ammo_total() -- пока не пытались готовиться к пуску, смотрим, сколько было боеприпасов. elseif pzrk_status == 0 and wpn:get_ammo_in_magazine() == 0 then --первый выстрел - подготовка к пуску --запуск системы охлаждения ГСН и гироскопа происходит в ЛЮБОМ случае, независимо от наличия захвата цели. wpn:set_ammo_elapsed(1) pzrk_status = 1 pzrk_active_timer = time_global() + 40000 -- время работы источника питания не менее 40 с. snd_power:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) elseif pzrk_status == 1 then --ждем 5 с, пока ракета готовится к пуску if wpn:get_ammo_in_magazine() == 0 then --пуск невозможен wpn:set_ammo_elapsed(1) end if time_global() > (pzrk_active_timer - 35000) then --через 5 с ракета раскочегарилась, переходим в следующий режим pzrk_status = 2 end if wpn:get_ammo_total() == ammo_total + 1 then --к-во боеприпасов увеличилось на 1, значит пытались разрядить, а не активировать. --qqq("unloaded") wpn:set_ammo_elapsed(0) pzrk_status = 5 launch_time = time_global() end elseif pzrk_status == 2 and wpn:get_ammo_in_magazine() == 0 then --второй выстрел - пуск if target ~= "nil" then -- если есть захват, блокировка пуска снимается -- local pos = device().cam_pos -- local dir = device().cam_dir local sun_dir = get_sun_dir() if target == "sun" then target_pos = vector() target_pos.x = pos.x + 5000*sun_dir.x target_pos.y = pos.y + 5000*sun_dir.y target_pos.z = pos.z + 5000*sun_dir.z else target_obj = level.object_by_id(tonumber(target)) target_pos = target_obj:position() end spawn.missile(pos,db.actor:level_vertex_id(),db.actor:game_vertex_id(),target,0, target_pos,dir,sun_dir) snd_launch:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) pzrk_status = 3 launch_time = time_global() else wpn:set_ammo_elapsed(1) end elseif pzrk_status == 2 and wpn:get_ammo_in_magazine() == 1 then -- если источник питания сдох, а ракета так и не выпущена, она пропадает if time_global() > pzrk_active_timer then --qqq("timer_up") wpn:set_ammo_elapsed(0) pzrk_status = 3 launch_time = time_global() end elseif pzrk_status == 3 and time_global() > launch_time + 2100 then --empty = alife():create("igla_tube_empty",vector():set(db.actor:position().x,db.actor:position().y+2,db.actor:positi on().z+2),db.actor:level_vertex_id(),db.actor:game_vertex_id()) empty = alife():create("igla_tube_empty",pos,db.actor:level_vertex_id(),db.actor:game_vertex_id()) snd_power:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) pzrk_status = 4 pzrk_active_timer = nil elseif pzrk_status == 4 then local tube = level.object_by_id(empty.id) if tube then tube:set_const_force(vector():set(dir.z,0,-dir.x), 300, 150) pzrk_status = 5 end elseif pzrk_status == 5 and wpn:get_ammo_in_magazine() == 1 then pzrk_status = 0 end -- end --qqq("pzrk: status = "..pzrk_status.." active_timer = "..tostring(pzrk_active_timer).." time = "..time_global()) end end function read_string(section, value, default) if system_ini():line_exist(section,value) then return system_ini():r_float(section,value) else return default end end function dir_front(dir) return dir:normalize() end function dir_right(dir) return vector():set(dir.z,0,-1*dir.x):normalize() end function dir_up(dir) local dir_xz = vector():set(dir.x,0,dir.z):magnitude() -- проекция вектора dir на горизонтальную плоскость local dir_xz1 = vector():set((-1*dir.x) ,0,(-1*dir.z)):set_length(dir.y) return vector():set(dir_xz1.x ,dir_xz,dir_xz1.z):normalize() end function offset_to_global(pos,dir,off) local dir_front = dir_front(dir) local dir_up = dir_up(dir) local dir_right = dir_right(dir) pos.x = pos.x + dir_right.x*off.x + dir_up.x*off.y + dir_front.x*off.z pos.y = pos.y + dir_right.y*off.x + dir_up.y*off.y + dir_front.y*off.z pos.z = pos.z + dir_right.z*off.x + dir_up.z*off.y + dir_front.z*off.z return pos end я сменил это local wpn = db.actor:item_in_slot(db.actor:active_slot()) if wpn and wpn:section() == "wpn_igla" then на это local wpn_tab = {"wpn_igla","wpn_nan2_igla"} local wpn = weapon:section() if string.find(wpn,wpn_tab[name]) then sect = wpn_tab[name] кто что знает помогите плиззззз!!!!! Строгое предупреждение от модератора Куфзук Пишем грамотно, без запятых читать это - весьма проблематично!!! И про спойлеры не забываем! Кстате, суть проблемы друдно улавима! Ты лишь написал, что ты криво адаптировал АИ вертолетов, ну, а что не вышло или вышло ты же упустил. Ко всему, есть тема: AI вертолетов, где ты уже бывал, т.е. о ней знаешь. Ты чего - издеваешься!? Нарушение пунктов правил: 2.1.2 и 2.5 Добавлено через 14 мин.: Я написал что адапртировал я нормально просто мне секций несколько прописать надо и всё!!!!!!! Изменено 9 Марта 2011 пользователем Куфзук Реклама любых модов бесплатно на моём сайте писать в личку Ссылка на комментарий
_Призрак_ 11 Опубликовано 9 Марта 2011 Поделиться Опубликовано 9 Марта 2011 Все гораздо проще: local wpn = db.actor:item_in_slot(db.actor:active_slot()) if wpn and (wpn:section() == "wpn_igla" or wpn:section() == "wpn_pm" or wpn:section() == "wpn_knife") then Freedom Ссылка на комментарий
@"StreloK" 2 Опубликовано 9 Марта 2011 Поделиться Опубликовано 9 Марта 2011 (изменено) Люди может кто помочь с логикой? Нужно сделать что бы НПС требовал у ГГ убрать оружие из рук, а в случае неубора в течении 10 секунд начинал в него стрелять, после того как ГГ его убирает переходил в другое состояние (после убора НЕПись бьёт ГГ прикладом). Я начал делать так - [smart_terrains] none = true [logic] active = remark@base meet = meet [remark@base] anim = threat_heli no_move = true target = actor meet = meet on_actor_dist_ge_nvis = 8|walker on_info = {+info_ybral}remark@ybral [meet] meet_state = 10|threat_heli meet_state_wpn = 10|threat_heli victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true [remark@ybral] anim = punch snd = cit_jail_guard_sneer meet = meet@punch target = actor on_signal = sound_end| %=run_cam_effector(fatigue)% on_actor_dist_ge_nvis = 8|walker [meet@punch] meet_state = 10|threat_heli meet_state_wpn = 10|threat_heli victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true [walker] path_walk = agr_soldier_sniper_1_walk path_look = agr_soldier_sniper_1_look Но незнаю как собственно реализовать требование убрать оружие. Может кто помочь? Глянь на вики: >>Click Me<< Куфзук Добавлено через 133 мин.: Куфзук можешь подсказать что не так? Сделал вот такую логику, а НПСу а он вообще ничего неделает (только по валк-пути ходит) и на то есть оружие у ГГ или нет ему до фени. [smart_terrains] none = true [logic] active = walker@base combat_ignore = combat_ignore [walker@base] path_walk = agr_soldier_spesnaz_1_walk path_look = agr_soldier_spesnaz_1_look meet = meet on_actor_dist_ge_nvis = 80|walker on_info = {+info_ybral}remark@ybral [meet] meet_state = 50| {+info_yberi} threat_fire %=killactor%, walk@ {+info_yberi} talk_abuse, wait | 10 | walk %+info_yberi%; wait | 2 | threat;state meet_state_wpn = 50| {+info_yberi} threat_fire %=killactor%, threat@ {+info_yberi} talk_abuse, wait victim = 10|actor victim_wpn = 10|actor use = false use_wpn = false [remark@ybral] anim = punch snd = cit_jail_guard_sneer meet = meet@punch target = actor on_signal = sound_end| %=run_cam_effector(fatigue)% on_actor_dist_ge_nvis = 8|walker [meet@punch] meet_state = 10|threat_heli meet_state_wpn = 10|threat_heli victim = 10|actor victim_wpn = 10|actor use = false use_wpn = false [walker] path_walk = agr_soldier_spesnaz_1_walk path_look = agr_soldier_spesnaz_1_look [combat_ignore] combat_ignore_cond = always А инфопоршень info_ybral, ты как выдаешь? Ты здесь возможно ошибку допустил, у тебя в мите выдаеться инфопоршень info_yberi. Сообщение от модератора Куфзук Без дабл постов, пожалуйста! А может кто подсказать-как можно сделать чтобы НПС про получении инфопоршня подбегали к ГГ? Изменено 10 Марта 2011 пользователем Куфзук Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
STARTS 0 Опубликовано 9 Марта 2011 Поделиться Опубликовано 9 Марта 2011 (изменено) Доброго времени суток! Столкнулся с проблемой в ЗП! self.kBackGround = CUIStatic() self.kBackGround:SetWindowName("kBackGround") self.kBackGround:SetAutoDelete(true) self.kBackGround:InitTexture("ui\\amk_transmutator") self.kBackGround:SetTextureRect(Frect():set(3,7,531,262)) self.kBackGround:Init(3,7,531,262) self:AttachChild(self.kBackGround) В ЗП нет self.kBackGround:Init(3,7,531,262) как его заменить? --------------------------------------------------------------- serega-gamer, попробуй так local wpn = db.actor:item_in_slot(db.actor:active_slot()) tab = {"wpn_1", "wpn_2", "дальше_веапоны"} for k,v in pairs (tab) do if wpn and wpn:section()== v then sect = v end end Не уверен что правильно, но мысль ты уловил)) Изменено 9 Марта 2011 пользователем STARTS Ссылка на комментарий
serega-gamer 0 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 (изменено) Ага STARTS спасибо Строгое предупреждение от модератора Куфзук За нежелание придерживаться ОБЩИХ правил форума - рид на трое суток. Изменено 10 Марта 2011 пользователем Куфзук Реклама любых модов бесплатно на моём сайте писать в личку Ссылка на комментарий
midichs 1 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 (изменено) Подскажите, что это такое: Specified story object is already in the Story registry! ???(появилось после добавления точки перехода в спавн) Появилося в логе? Если да, то где же лог? А так вообще, то у тебя story_id, который ты присвоил своему переходу, просто занят. Куфзук Изменено 10 Марта 2011 пользователем Куфзук Ссылка на комментарий
stunder 12 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 midichs, данный SID уже используется Мод "Жесть" В команду Two Team ("Жесть") требуется моделлер. Ссылка на комментарий
midichs 1 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 Вот лог, наверное конфликт с модом проводники? [error]Expression : no_assert [error]Function : CALifeStoryRegistry::add [error]File : D:\xray-svn\xr_3da\xrGame\alife_story_registry.cpp [error]Line : 30 [error]Description : Specified story object is already in the Story registry! Ссылка на комментарий
stunder 12 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 midichs, тебе же уже ответили. Скорее всего, ибо какой-то SID используется несколько раз. Мод "Жесть" В команду Two Team ("Жесть") требуется моделлер. Ссылка на комментарий
ColR_iT 171 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 @"StreloK", ну для начала скажу, что инфопоршни доступны только для actora. Ну а вообще, тебе как это сделать нужно, какая ситуация? Ссылка на комментарий
@"StreloK" 2 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 Изменяюсь за даблпост. Ситуация-ГГ входит в рестриктор то выдаёт инфопоршень, непись появляется за углом (в онлайне) и подбегает к ГГ. Можно-ли такое сделать? Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
stunder 12 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 Да, возможно. Ставь условие спавна на инфопоршень. http://www.stalkerin.gameru.net/wiki/index...8.D1.8F_spawner Мод "Жесть" В команду Two Team ("Жесть") требуется моделлер. Ссылка на комментарий
@"StreloK" 2 Опубликовано 10 Марта 2011 Поделиться Опубликовано 10 Марта 2011 stunder как делать спавн при получении инфопоршеня я знаю. А как сделать чтобы он (нпс) подошёл к ГГ? Prefiero morir de pie, que vivir siempre arrodillado. Ссылка на комментарий
Gandifil 0 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 1 вопрос: Люди скажите, как исправить двойной вызов функции? А то у меня какая-то ерунда. Если я использую спальный мешок: 1)Если меченный хочет спать то окошко появляется два раза. 2)Если не хочет спать, то появляется два сообщения и спавнится в инвентарь два мешка. Так же с модом медленных аптечек тоже самое: 1)Если Меченный не хавал до этого аптечки, то он излечивается и 1 раз появляется сообщение что "меченный не может лечится двумя аптечками". Спавниться одна аптечка(то есть без расстраты). 2)Если хавал, то два сообщения и две аптечки в инвентарь(то есть уже излишек) Что с этим делать? Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки. Ссылка на комментарий
Painter 3 379 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 @"StreloK", это уже в all.spawn лезть нужно. Портфолио Ссылка на комментарий
STARTS 0 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 Gandifil Код для начала кинь, а потом уже люди посмотрят и скажут) Ссылка на комментарий
=VENOM= 50 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 Jurok, для того, чтобы непись подошёл к игроку в "олспон" лезть ни к чему. Это исключительно настройка логики. Подскажу - юзайте схему follower, а для @"StreloK" - схема и соответствующая модификация xr_attendant практически готова - только отшлифую ещё пару функций, и в ЛС отбарабаню . Ссылка на комментарий
Gandifil 0 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 Вот мои скрипты Вот моя папка со скриптами. Только укажите в чем моя ошибка - там такое кол-во модов....Мог че нибудь и пропустить. Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки. Ссылка на комментарий
AKKK1 6 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 =VENOM= Подошел в смысле на конкретную точку где гг кабы должен быть ? Или туда где гг находтся в данный момент ? ( на другой локе к примеру). Ссылка на комментарий
=VENOM= 50 Опубликовано 11 Марта 2011 Поделиться Опубликовано 11 Марта 2011 Нет, это для сценок нападения на игрока - онлайн. Схема follower всё обсчитывает автоматически, её нужно только чуть-чуть подрихтовать. Поэтому непись пойдёт не туда, где игрок "должен быть", а прямо к игроку, даже если пытаться уйти от непися. Ну, а дельше всё зависит от фантазии разработчика ... Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти