Перейти к контенту

Рекомендуемые сообщения

Доброго времени суток всем.Народ помогите пожалуйста вот такое у меня дело,я скачал и одаптировал к своему моду АИ вертолётов в нём есть такая штука как ПЗРК дак вот суть проблемы в том что в скрипте ПЗРК можно указать только одну секцию оружия а мне нужно несколько в общем около 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 мин.:

Я написал что адапртировал я нормально просто мне секций несколько прописать надо и всё!!!!!!!

Изменено пользователем Куфзук

Реклама любых модов бесплатно на моём

сайте писать в личку

Ссылка на комментарий

Все гораздо проще:

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

Ссылка на комментарий

Люди может кто помочь с логикой?

Нужно сделать что бы НПС требовал у ГГ убрать оружие из рук, а в случае неубора в течении 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.

 

Сообщение от модератора Куфзук
Без дабл постов, пожалуйста!

А может кто подсказать-как можно сделать чтобы НПС про получении инфопоршня подбегали к ГГ?

Изменено пользователем Куфзук

Prefiero morir de pie, que vivir siempre arrodillado.
 

Ссылка на комментарий

Доброго времени суток!

Столкнулся с проблемой в ЗП!

    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

Не уверен что правильно, но мысль ты уловил))

Изменено пользователем STARTS

 

Ссылка на комментарий

Ага STARTS спасибо

Строгое предупреждение от модератора Куфзук
За нежелание придерживаться ОБЩИХ правил форума - рид на трое суток.
Изменено пользователем Куфзук

Реклама любых модов бесплатно на моём

сайте писать в личку

Ссылка на комментарий

Подскажите, что это такое: Specified story object is already in the Story registry! ???(появилось после добавления точки перехода в спавн)

 

Появилося в логе? Если да, то где же лог?

А так вообще, то у тебя story_id, который ты присвоил своему переходу, просто занят. Куфзук

Изменено пользователем Куфзук
Ссылка на комментарий

Вот лог, наверное конфликт с модом проводники?

[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!

Ссылка на комментарий

midichs, тебе же уже ответили.

Скорее всего, ибо какой-то SID используется несколько раз.

Мод "Жесть"

В команду Two Team ("Жесть") требуется моделлер.

Ссылка на комментарий
@"StreloK", ну для начала скажу, что инфопоршни доступны только для actora. Ну а вообще, тебе как это сделать нужно, какая ситуация?
Ссылка на комментарий

Изменяюсь за даблпост.

Ситуация-ГГ входит в рестриктор то выдаёт инфопоршень, непись появляется за углом (в онлайне) и подбегает к ГГ.

Можно-ли такое сделать?

Prefiero morir de pie, que vivir siempre arrodillado.
 

Ссылка на комментарий

Да, возможно.

Ставь условие спавна на инфопоршень.

http://www.stalkerin.gameru.net/wiki/index...8.D1.8F_spawner

Мод "Жесть"

В команду Two Team ("Жесть") требуется моделлер.

Ссылка на комментарий
stunder как делать спавн при получении инфопоршеня я знаю. А как сделать чтобы он (нпс) подошёл к ГГ?

Prefiero morir de pie, que vivir siempre arrodillado.
 

Ссылка на комментарий

1 вопрос:

Люди скажите, как исправить двойной вызов функции? А то у меня какая-то ерунда. Если я использую спальный мешок:

1)Если меченный хочет спать то окошко появляется два раза.

2)Если не хочет спать, то появляется два сообщения и спавнится в инвентарь два мешка.

Так же с модом медленных аптечек тоже самое:

1)Если Меченный не хавал до этого аптечки, то он излечивается и 1 раз появляется сообщение что "меченный не может лечится двумя аптечками". Спавниться одна аптечка(то есть без расстраты).

2)Если хавал, то два сообщения и две аптечки в инвентарь(то есть уже излишек)

Что с этим делать?

 

Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки.

Ссылка на комментарий

Jurok, для того, чтобы непись подошёл к игроку в "олспон" лезть ни к чему. Это исключительно настройка логики. Подскажу - юзайте схему follower, а для

@"StreloK" - схема и соответствующая модификация xr_attendant практически готова - только отшлифую ещё пару функций, и в ЛС отбарабаню ;).

Ссылка на комментарий

Вот мои скрипты

Вот моя папка со скриптами. Только укажите в чем моя ошибка - там такое кол-во модов....Мог че нибудь и пропустить.

Дурак знает как затеять драку, умный знает как победить в драке, мудрец знает как избежать драки.

Ссылка на комментарий

=VENOM=

 

Подошел в смысле на конкретную точку где гг кабы должен быть ?

Или туда где гг находтся в данный момент ? ( на другой локе к примеру).

Ссылка на комментарий

Нет, это для сценок нападения на игрока - онлайн. Схема follower всё обсчитывает автоматически, её нужно только чуть-чуть подрихтовать. Поэтому непись пойдёт не туда, где игрок "должен быть", а прямо к игроку, даже если пытаться уйти от непися. Ну, а дельше всё зависит от фантазии разработчика :)...

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти

AMK-Team.ru

×
×
  • Создать...