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

[CS] Ковыряемся в файлах


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

@imcrazyhoudini скинь, конечно, но я доберусь до проверки не ранее, чем в воскресенье, и не гарантирую, что смогу помочь. Нет, чисто со скриптовой точки зрения я проверю, что, например, story_id присваивается правильно и существует далее. А вот с логикой не особо в ладах, вряд ли получится понять, что там может ломаться. С этим к другим специалистам.

  • Спасибо 1
Ссылка на комментарий

@monk привет! Подсказать не сможешь касательно вопроса выше? Может, ещё что-то нужно?

Ибо у тебя такое с Васяном и работает, а я репу чешу...

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

Ссылка на комментарий
2 часа назад, imcrazyhoudini сказал:

Подсказать не сможешь касательно вопроса выше?

Я в скриптах полный ноль, во всём полагаюсь на своего друга-мастера.

Раньше и меня вела дорога приключений, а потом вышел S.T.A.K.E.R 2

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

@monk я в скриптах подсказал и сделал что мог, проверил: story_id назначается как надо, ошибок нет. Однако после присвоения story_id там действительно идёт сбой логики. Вот я и подумал: может, Васяну ты в процессе своих экспериментов что-то в профиле нахимичил, спец. логику, флаги или ещё что-либо, что позволяет ему такое улучшение игнорировать (в хорошем смысле). Я такого не помню, но я-то как раз только в скрипты и лез, оставляя остальное на тебя.

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

Доброго времени суток, коллеги - сталкеры!
Кто нибудь разбирал за что отвечает параметр [forbidden_points] в faction_название_группировки?

Не соответствует. N6260

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

@ZeeK точно ничего не перепутал, есть пример?

Насколько я помню, в классическом ЧН нет такого параметра у группировок. Есть параметр forbidden_point у смартов, который влияет на построение пути отрядов в войне группировок (да, можно запретить посещение точки отрядами определённой группировки), но это smart_terrain и sim_board.

Ссылка на комментарий
16 часов назад, ZeeK сказал:

подглядел в Sky Reclamation Project

Понятно. Это те же яйца, только сбоку.

В SRP взяли тот функционал, что я описал выше, и перенесли в настройки группировок. Так действительно удобней, поскольку для небольшого редактирования достаточно изменить только вынесенный в файлы конфиг группировки, а не пересобирать all.spawn, в котором находятся настройки смартов. Но по своему действию и та и эта реализации практически идентичны: оба параметра влияют на построение путей отрядов при войне группировок.
Единственное, чтобы заработал вариант SRP, потребуются ещё и сопутствующие изменения в симуляционных скриптах, на ванильном ЧН не взлетит.

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

Всем доброго времени суток! 
Хотелось бы узнать 2 вещи: В Славкер моде есть скрипт shoker_anomalies.script он видимо вытащил аномалии которые расположенные на болотах и прикрутил из шокер мода в свой, но как он это сделал я не разобрался, в бинд сталкере не нашел ничего подобного, может кто обьяснить? 

Скрытый текст


local actor = db.actor

function main()
spawn_all()
end

--Спавним все аномалии
function spawn_all(respawn)
if load("spawn_anom",false)==false or respawn==true then
-- Болота   121 аномалий\11 артефактов
    create_anom("zone_mine_electric",2,-295.39,1.24,-3.30,1,135)               -- Электра около вышки-смертника 
    create_anom("zone_field_acidic_weak",4,157.57,0.10,-166.98,1,135,"field")  -- Отрава около вышки хуторной 
    create_anom("zone_field_psychic_weak",5,272.07,2.46,-130.03,1,135,"field") -- Пси-аномалия около церкви на кладбище.
    create_anom("zone_field_thermal_weak",2,302.34,0.91,-125.80,1,135,"field")  
    create_anom("zone_field_thermal_weak",3,298.07,0.78,-126.86,1,135,"field") -- Огненые поля у церкви. Суда арт засунь
    create_anom("zone_field_thermal_weak",2,305.80,0.72,-131.74,1,135,"field")
    spawn("af_cristall",vector():set(302.34,0.91,-125.80),1,135)
    create_anom("zone_buzz_average",1,-189.24,0.45,26.55,1,135)-- Ведмин студень на воде, здесь целых 2 арта :)
    create_anom("zone_buzz_average",1,-185.67,0.42,30.73,1,135)
    create_anom("zone_buzz_average",1,-183.06,0.61,27.40,1,135)
    create_anom("zone_buzz_average",1,-184.82,0.36,24.83,1,135)
    create_anom("zone_buzz_average",1,-187.30,0.26,24.21,1,135)
    create_anom("zone_buzz_average",1,-189.01,0.14,22.01,1,135)
    create_anom("zone_buzz_average",1,-186.50,0.24,21.18,1,135)
    create_anom("zone_buzz_average",1,-183.65,0.30,22.05,1,135)
    create_anom("zone_buzz_average",1,-180.98,0.58,25.27,1,135)
    create_anom("zone_buzz_average",1,-180.34,1.10,29.82,1,135)
    create_anom("zone_buzz_average",1,-186.93,0.53,29.80,1,135)
    spawn("af_mincer_meat",vector():set(-189.01,0.14,22.01),1,135)
    spawn("af_blood",vector():set(-184.82,0.36,24.83),1,135)

    create_anom("zone_mincer_average",3,104.08,1.40,-191.35,1,135)  -- Мясорубка у мостика на хутор ЧН (?)

    create_anom("zone_mincer_strong",3,183.07,1.29,-106.17,1,135)   -- Мясорубка у церкви
    create_anom("zone_mincer_average",3,216.67,2.17,-62.82,1,135)   -- Ещё одна мясорубка
    create_anom("zone_zharka_static_weak",2,277.42,5.11,45.27,1,135)  -- Термалки у сгоревшего хутора
    create_anom("zone_zharka_static_average",2,261.25,4.43,72.63,1,135)  
    create_anom("zone_zharka_static_average",2,245.96,4.62,55.25,1,135)  
    create_anom("zone_zharka_static_average",2,259.37,4.08,58.12,1,135)  -- Огненое поле у сгоревшего хутора
    create_anom("zone_zharka_static_average",2,250.41,4.11,90.16,1,135)  
    create_anom("zone_zharka_static_average",2,254.26,4.13,90.47,1,135)  
    create_anom("zone_zharka_static_average",2,253.07,4.09,89.22,1,135)  
    create_anom("zone_zharka_static_average",3,250.84,4.10,87.13,1,135)  
    create_anom("zone_zharka_static_average",2,247.93,4.06,86.21,1,135) 
    spawn("af_fireball",vector():set(250.84,4.20,87.13),1,135)
    spawn("af_dummy_glassbeads",vector():set(247.30,3.96,91.38),1,135)
    create_anom("zone_zharka_static_average",2,244.81,3.99,86.23,1,135)  
    create_anom("zone_zharka_static_average",2,247.30,3.96,91.38,1,135)  
    create_anom("zone_zharka_static_average",2,246.53,4.00,88.34,1,135)  

    create_anom("zone_gravi_zone_strong",3,403.81,4.26,279.23,1,135)  -- Воронка на дороге у моста (север)
    create_anom("zone_gravi_zone_strong",3,479.56,1.65,325.37,1,135)  -- Воронка, механический двор
    create_anom("zone_gravi_zone_strong",3,480.33,1.45,323.05,1,135)  
    create_anom("zone_gravi_zone_strong",3,478.26,1.16,321.00,1,135)
    spawn("af_medusa",vector():set(478.26,1.16,321.00),1,135)       -- Медуза около механизированного двора
    create_anom("zone_gravi_zone_strong",3,477.48,1.34,323.11,1,135)  
    create_anom("zone_field_psychic_weak",7,479.31,1.31,325.55,1,135,"field")  -- Пси-Зона (МД, аномальное поле)
    create_anom("zone_gravi_zone_strong",3,476.14,1.59,324.64,1,135)  
    create_anom("zone_gravi_zone_strong",3,476.95,1.46,321.70,1,135)  
    create_anom("zone_gravi_zone_strong",3,479.07,1.43,318.92,1,135)  
    create_anom("zone_field_thermal_weak",3,532.99,0.63,433.71,1,135,"field") -- Термалка у Механизированного двора
    create_anom("zone_field_psychic_strong",15,563.26,2.93,373.15,1,135,"field")  -- Пси-Поле, ЛЭП)
    create_anom("zone_mine_electric_strong",3,563.26,2.93,373.15,1,135)  -- Электро, ЛЭП)
    spawn("af_cristall_flower",vector():set(563.26,2.93,373.15),1,135)       -- Цветок :)
    spawn("af_electra_moonlight",vector():set(563.26,2.93,373.15),1,135)       -- Лунный свет, я щедрый :)
    create_anom("zone_mine_gravitational_strong",3,483.99,2.55,224.41,1,135,"field")  -- Гравитация, ЛЭП 2)
    create_anom("zone_mosquito_bald_weak",2,480.42,2.55,225.11,1,135)  -- Поле воронок
    create_anom("zone_mosquito_bald_weak",3,482.46,2.71,222.58,1,135)  
    create_anom("zone_mosquito_bald_weak",3,487.74,3.54,220.23,1,135)  
    create_anom("zone_mosquito_bald_weak",3,488.57,3.20,223.41,1,135)  
    create_anom("zone_mosquito_bald_weak",3,489.59,2.81,227.60,1,135)  
    create_anom("zone_mosquito_bald_weak",3,486.51,2.63,230.12,1,135)  
    create_anom("zone_gravi_zone_strong",4,481.34,2.20,231.67,1,135)   -- Главная разрывалка  
    spawn("af_gravi",vector():set(481.34,2.20,231.67),1,135)       -- Грави :)

    create_anom("zone_radioactive_average",5,469.04,1.77,209.11,1,135,"field")    -- Радиация
    create_anom("zone_mosquito_bald_weak",2,457.80,0.48,126.62,1,135)     -- На переходе между речками
    create_anom("zone_zharka_static_average",2,427.39,1.14,160.93,1,135)  -- Жарка в поле
    create_anom("zone_field_acidic_weak",6,419.18,1.36,174.95,1,135,"field")  -- Отрава в кустах
    create_anom("zone_mine_acidic_average",6,409.27,1.73,173.58,1,135,"field")  -- Отрава в кустах с артом
    spawn("af_soul",vector():set(481.34,2.20,231.67),1,135)       -- Душа поэта
    create_anom("zone_field_acidic_weak",6,402.42,1.89,169.73,1,135,"field")  -- Отрава в кустах 2
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  -- Отрава в кустах 3
    
    create_anom("zone_mine_gravitational_weak",3,314.45,2.43,278.61,1,135)  -- Разрывалки на большом мосту
    create_anom("zone_mine_gravitational_weak",3,326.24,2.87,285.10,1,135) 
    create_anom("zone_gravi_zone_strong",3,209.78,2.48,310.32,1,135)        -- Разрывалка на столбе
    create_anom("zone_mine_field_strong",3,-203.74,5.28,521.54,1,135,"field")   -- Мина перед входом в убежище


    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  -- Гипер-Симбион (Химический)
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_field_acidic_weak",6,371.84,1.84,31.12,1,135,"field")  
    create_anom("zone_mine_gravitational_weak",3,371.84,1.84,31.12,1,135) 
    create_anom("zone_mine_gravitational_weak",3,371.84,1.84,31.12,1,135) 
    create_anom("zone_mine_gravitational_weak",3,371.84,1.84,31.12,1,135) 

    create_anom("zone_mine_gravitational_weak",3,-57.03,1.10,450.29,1,135)   -- Разрывалка у перехода на мост :)
    create_anom("zone_mine_gravitational_weak",3,41.22,1.30,423.44,1,135)    -- Разрывалка в кустах
    create_anom("zone_field_thermal_weak",3,-76.91,0.65,269.29,1,135,"field") -- Термальное поле на одном из згоревших домов.
    create_anom("zone_mine_gravitational_weak",3,-100.78,1.21,305.49,1,135)     -- Разрывалка на маленьком мосту
    create_anom("zone_mine_electric",3,-106.51,0.68,331.04,1,135)               -- Электра у деревни (там ещё башня)
    create_anom("zone_field_acidic_weak",6,-152.16,2.01,307.69,1,135,"field")  -- Химическая около деревни
    create_anom("zone_field_thermal_weak",3,-184.42,1.56,399.05,1,135,"field") -- Огненое поле на северо-западной станции
    create_anom("zone_mine_electric",3,-162.84,0.51,367.42,1,135)               -- Электра между камышами
    create_anom("zone_mine_gravitational_weak",3,140.78,1.61,307.07,1,135) 
    create_anom("zone_mine_electric",2,0.02,2.36,44.27,1,135)               -- Электра на насосной станции
    create_anom("zone_field_thermal_weak",2,-0.62,4.09,13.32,1,135,"field") -- Огненое поле внутри НС
    create_anom("zone_mine_gravitational_weak",3,73.45,1.14,35.15,1,135)   -- Гравитация в кустах
    create_anom("zone_gravi_zone_strong",3,269.90,9.85,-163.65,1,135)        -- Разрывалка на башне церкви
    create_anom("zone_gravi_zone_weak",3,431.47,1.95,-175.90,1,135)        -- Разрывалка на мосту к кордону
    create_anom("zone_field_thermal_weak",3,472.79,2.35,-164.45,1,135,"field") -- Термальное поле у перехода на кордон
   
    create_anom("zone_radioactive_average",20,-263.62,1.60,110.02,1,135,"field")    -- Радиационно-Психический симбион
    create_anom("zone_field_psychic_weak",20,-263.62,1.60,110.02,1,135,"field")    
    create_anom("zone_mine_gravitational_weak",3,-263.62,1.60,110.02,1,135)   
    spawn("af_medusa",vector():set(-263.62,1.60,110.02),1,135)

    create_anom("zone_zharka_static_average",2,69.36,1.22,-85.62,1,135)  -- Жарка в кустах
    create_anom("zone_mine_electric",3,143.13,0.10,-62.23,1,135)        -- Электра в воде 1
    create_anom("zone_mine_electric",3,329.97,0.11,-12.59,1,135)        -- Электра в воде 2
    create_anom("zone_gravi_zone_weak",3,124.38,1.49,36.46,1,135)        -- Засасывалка между лодками

    create_anom("zone_mine_gravitational_weak",3,160.81,2.95,-59.27,1,135)   -- Разрывалка в траве
    create_anom("zone_mine_gravitational_weak",3,147.02,1.28,460.31,1,135)   -- Разрывалка в траве
    create_anom("zone_field_acidic_weak",6,186.40,1.93,341.20,1,135,"field")  -- Кислота в кустах
    create_anom("zone_radioactive_average",20,31.12,1.28,267.74,1,135,"field")    -- Радиация на куске воздухопровода
    create_anom("zone_mine_gravitational_weak",3,68.88,0.92,273.27,1,135)   -- Разрывалка у мостика
    create_anom("zone_zharka_static_average",2,72.75,1.03,281.58,1,135)  -- Жарка у куста и моста
    create_anom("zone_mine_gravitational_weak",3,-93.91,1.37,227.44,1,135)   -- Разрывалка у башни

    create_anom("zone_gravi_zone_strong",3,-228.72,19.45,510.81,1,135)        -- Засасывалки на мосте
    create_anom("zone_gravi_zone_strong",3,-226.41,18.10,502.46,1,135)        -- Засасывалки на мосте
    create_anom("zone_field_thermal_weak",2,84.87,2.06,267.09,1,135,"field") -- Огненое поле у башни
    create_anom("zone_zharka_static_average",2,459.02,1.82,-50.17,1,135)  -- Жарка в трупе

    create_anom("zone_mine_gravitational_weak",3,434.90,3.11,99.67,1,135)   -- Разрывалка у башни\ЛЭП
    create_anom("zone_mine_gravitational_weak",3,360.14,1.25,182.89,1,135)   -- Разрывалка между 2 мостами (Мех. Двор)
    create_anom("zone_mine_gravitational_weak",3,221.01,1.56,184.02,1,135)   -- Разрывалка в кустах
    create_anom("zone_mine_gravitational_weak",3,-59.51,1.01,206.02,1,135)   -- Разрывалка у башни
    create_anom("zone_mine_gravitational_weak",3,-98.54,0.97,461.85,1,135)   -- Разрывалка в траве
    create_anom("zone_mine_electric",2,102.33,1.34,144.82,1,135)               -- Электра в траве
    create_anom("zone_mine_gravitational_weak",3,-149.42,1.22,116.88,1,135)   -- Разрывалка в траве
    create_anom("zone_mine_gravitational_weak",3,213.92,1.28,119.21,1,135)   -- Разрывалка в траве
    create_anom("zone_mine_gravitational_weak",3,-115.41,1.29,-82.96,1,135)   -- Разрывалка в траве
    create_anom("zone_zharka_static_average",2,-20.02,1.98,-178.00,1,135)  -- Жарка на холмике

   save("spawn_anom",true)
end
end

function create_anom(section,rad_anom,x,y,z,lv,gv,mode)
        --   con(section)
      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      local p_obj = alife():create(section,vector():set(x,y,z),lv,gv)

      local packet = net_packet()
      packet:w_begin(0)
      p_obj:STATE_Write(packet)
      packet:r_seek(2)

    local game_vertex_id = packet:r_u16()
    local cse_alife_object__unk1_f32 = packet:r_float()
    local cse_alife_object__unk2_u32 = packet:r_s32()
    local level_vertex_id = packet:r_s32()
    local object_flags = packet:r_s32()
    local custom_data = packet:r_stringZ()
    local story_id = packet:r_s32()
    local cse_alife_object__unk3_u32 = packet:r_s32()

    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 box = packet:r_matrix()
        end
    end

    local restrictor_type = packet:r_u8()

    local cse_alife_custom_zone__unk1_f32 = packet:r_float()
    local cse_alife_custom_zone__unk2_u32 = packet:r_s32()
    local on_off_mode_enabled_time = packet:r_s32()
    local on_off_mode_disabled_time = packet:r_s32()
    local on_off_mode_shift_time = packet:r_s32()

    local offline_interactive_radius = packet:r_float()
    local artefact_spawn_places_count = packet:r_u16()
    local cse_alife_anomalous_zone__unk1_u32 = packet:r_s32()

    local last_spawn_time_present = packet:r_u8()

--    if packet:r_elapsed() ~= 0 then abort("left=%d", packet:r_elapsed()) end

    packet:w_u16(game_vertex_id)
    packet:w_float(cse_alife_object__unk1_f32)
    packet:w_s32(cse_alife_object__unk2_u32)
    packet:w_s32(level_vertex_id)
    packet:w_s32(object_flags)
    if mode~=nil then custom_data = mode end
    packet:w_stringZ(custom_data)
    packet:w_s32(story_id)
    packet:w_s32(cse_alife_object__unk3_u32)

    packet:w_u8(1)
    packet:w_u8(0)
    local sphere_center = vector()
    sphere_center:set(0, 0, 0)
    packet:w_vec3(sphere_center)
    radius = rad_anom
    packet:w_float(radius)

    packet:w_u8(restrictor_type)

    packet:w_float(cse_alife_custom_zone__unk1_f32)
    cse_alife_custom_zone__unk2_u32 = bit_not(0)
    packet:w_s32(cse_alife_custom_zone__unk2_u32)
    packet:w_s32(on_off_mode_enabled_time)
    packet:w_s32(on_off_mode_disabled_time)
    packet:w_s32(on_off_mode_shift_time)

    packet:w_float(offline_interactive_radius)
    packet:w_u16(artefact_spawn_places_count)
    packet:w_s32(cse_alife_anomalous_zone__unk1_u32)

if mode == nil then

    packet:w_u8(last_spawn_time_present)
end
    p_obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())
  --    add_spot_on_map(p_obj.id,"red_location","Аномалия")


    return p_obj
end


-- Вывод инфы в консоль
function con(msg)
get_console():execute(msg)
end


-- Записываем переменную
function save(variable_name, value)
    xr_logic.pstor_store(db.actor, variable_name, value)
end

-- Загружаем переменную
function load(variable_name, value_if_not_found)
    return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

-- Удаляем переменную
function del(variable_name)
    if db.storage[db.actor:id()].pstor[variable_name] then
        db.storage[db.actor:id()].pstor[variable_name] = nil
    end
end

-- Функция спауна объекта
function spawn(section,pos,lv,gv)
 
--    vector():set(x,y,z) 

      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end

      if section==nil then
      con("Не_указанная_секция")
      else
      return alife():create(section,pos,lv,gv)
      end

end

а второй вопрос ,как из того же шокера вытащить скрипт вертолёта на болотах

Скрытый текст

--[[------------------------------------------------------------------------------------------------
Патрульная схема вертолёта
Автор: Shoker (c)
-- СТОРИ МОДЕ
--------------------------------------------------------------------------------------------------]]


-- Таблица баз для вертолётов (1 зона на уровень), куда они улетают по окончаию
local safe_zones = {
marsh    = vector():set(48, 16, -594),
escape   = vector():set(-35, -34, -1006),
}

local patrol_times = {    -- Часы патруля
        [12] = true,
        [20] = true,
               }

class "heli_patrol"

function heli_patrol:__init( obj, storage )
    self.object     = obj
    self.hobj       = obj:get_helicopter()
    self.a          = storage

      self.hid = self.object:id()
      self.def_rocket_dalay = sm.ltx(obj:section(), "time_between_rocket_attack")
      self.hide_rocket_dalay = self.def_rocket_dalay-13000

      if self.hide_rocket_dalay < 1 then
         self.hide_rocket_dalay = 2600 
         self.def_rocket_dalay  = 2600
      end


   -- Данные для респауна
      sm.save_var("sm_heli_this_id",   obj:id())
      sm.save_var("sm_patrol_started", true)

end


--' Обновление схемы при смене логики
function heli_patrol:reset_scheme( loading )
      self.engine_sound = self.a.engine
      self.hobj:TurnEngineSound( self.engine_sound )
      self.smarts = self.a.smarts
      self.ways_cnt = table.getn(self.smarts)
      self.alert_dist_def = self.a.alert_d_def
      self.alert_dist = self.a.alert_d

    if loading then        -- вызывается раз при загрузке сейва (но не при создании)
            self.way_point      = sm.load_obj(self.hid, "sm_way_point", 1)
            self.combat_timer   = sm.load_obj(self.hid, "sm_combat_timer", 0)
            self.pos_timer      = sm.load_obj(self.hid, "sm_pos_timer", 0)
            self.fire_timer     = sm.load_obj(self.hid, "sm_fire_timer", 0)
            self.fire_mode      = sm.load_obj(self.hid, "sm_fire_mode", true)
            self.heli_state     = sm.load_obj(self.hid, "sm_heli_state", "patrol")
            self.alert_dist     = sm.load_obj(self.hid, "sm_alert_dist",  self.alert_dist)
    else
            self.way_point      = 1 
            self.combat_timer = 0
            self.pos_timer    = 0
            self.fire_timer      = 0
            self.fire_mode    = true 
            self.heli_state   = "patrol"
      end

end

function heli_patrol:save()
  sm.save_obj(self.hid, "sm_alert_dist", self.alert_dist) 
  sm.save_obj(self.hid, "sm_way_point", self.way_point)
  sm.save_obj(self.hid, "sm_combat_timer", self.combat_timer)
  sm.save_obj(self.hid, "sm_pos_timer", self.pos_timer)
  sm.save_obj(self.hid, "sm_fire_timer", self.fire_timer)
  sm.save_obj(self.hid, "sm_fire_mode", self.fire_mode)
  sm.save_obj(self.hid, "sm_heli_state", self.heli_state)
end


local dead_id = 0
function heli_patrol:update( delta )
 if xr_logic.try_switch_to_another_section(self.object, self.a, db.actor) then
     return
 end
    
local smart_name = self.smarts[self.way_point]
local smart, sp

 if smart_name=="base" then
    sp = safe_zones[level.name()]
 else
    smart = db.zone_by_name[smart_name]
    sp = smart:position()
 end

local dta = self.object:position():distance_to(db.actor:position())
local hobj = self.hobj 

if hobj.m_dead then
  if dead_id~=self.hid then
  self:dead_callback(self.object, hobj)
  dead_id = self.hid
  end
end

if self.fire_timer<=time_global() then
  hobj.m_use_mgun_on_attack   = self.fire_mode
                     
  if self.fire_mode == true then  --' перерыв в стрельбе пулемётом
   self.fire_mode = false
  self.fire_timer = time_global()+8000
  else
   self.fire_mode = true
   self.fire_timer = time_global()+12000
  end  

end

if dta<=self.alert_dist and  db.actor:alive() then
-------------------------------------
  if hobj:isVisible( db.actor ) then
  ------------------------------------------
   hobj.m_time_between_rocket_attack = self.def_rocket_dalay
   hobj.m_syncronize_rocket = false

   self.alert_dist  = self.alert_dist + 30 -- увеличиваем радиус обнаружения врага
   self.heli_state = "war"
   self.combat_timer = (time_global()+35000) 
   hobj:LookAtPoint( db.actor:position(), true )
   hobj:SetEnemy( db.actor )
   hobj.m_use_rocket_on_attack = true
  
  
   if self.pos_timer<=time_global() then
    local p = db.actor:position()
    local x = p.x + math.random(25, 35)
    local y = p.y+30  local z = p.z + math.random(25, 35)
    hobj:SetDestPosition(vector():set(x, y, z))
    hobj:LookAtPoint( db.actor:position(), true )
    self.pos_timer=time_global()+15000
   end
   ----------------------------------------
       else
   ----------------------------------------
   if self.heli_state=="war" then
      local c = db.actor:position()
      c.y = c.y+30

      hobj.m_time_between_rocket_attack = self.hide_rocket_dalay
      hobj.m_syncronize_rocket = true
      hobj:GoPatrolByRoundPath(c , 40, self.object:direction())
      hobj:LookAtPoint( db.actor:position(), true )

       if self.combat_timer<=time_global() then
         self.heli_state = "patrol"  -- забываем ГГ
       end
   end
  ------------------------------------------
  end

else

  self.heli_state="patrol"

end


if self.heli_state=="patrol" then
--------------------------------------
hobj:ClearEnemy()
self.alert_dist  =  self.alert_dist_def
self.combat_timer = 0

hobj:SetDestPosition(vector():set(sp.x, sp.y+30, sp.z))
hobj:LookAtPoint(vector():set(sp.x, sp.y+30, sp.z), true)


if self.object:position():distance_to(sp)<=35 then
 -- переключаемся на новый путь
 local cw2 = self.way_point+1
 if cw2>self.ways_cnt then
 cw2 = 1 
 self:end_callback()
 end

 self.way_point = cw2
end

--------------------------------------
end

end

--" Колбек на проход последней точки патруля
function heli_patrol:end_callback()
-- Данные для респауна
sm.save_var("sm_heli_this_id",   "nil")
sm.save_var("sm_patrol_started", false)

local sobj = alife():object(self.hid)
alife():release(sobj, true)

sm.timer_r("sm_surge_hides", 6)
 
sm.call("sm_tips","send_tip", sm.get_text("st_heli_patrol_end"), nil,nil,10)
end

--/ Смена карты
function on_level_change()
 local id = sm.load_var("sm_heli_this_id",   "nil")

 if id~="nil" then
  local heli = alife():object(tonumber(id))
  -- Данные для респауна
  sm.save_var("sm_heli_this_id",   "nil")
  sm.save_var("sm_patrol_started", false)
  alife():release(heli, true)

  sm.timer_r("sm_surge_hides", 6)
  
  sm.timer_g("sm_spawn_helicopters", 0, 1, 5, level.name(), true)
 end
end


--/ Колбек, если ГГ спал во время патруля
function check_sleep()
 sm.call("sm_tips","send_tip", sm.get_text("st_heli_patrol_sleep"),nil,5,10)
 sm.save_var("sm_heli_spawned", true)
 sm.timer_r("sm_surge_hides", 6)
 sm.timer_g("sm_spawn_helicopters", 0, 1, 5, level.name(), true)
end

--/ Колбек на смерть
function heli_patrol:dead_callback( obj, hobj )
-- Данные для респауна
sm.save_var("sm_heli_this_id",   "nil")
sm.save_var("sm_patrol_started", false)

sm.timer_r("sm_surge_hides", 6)

sm.timer_g("sm_spawn_helicopters", 0, 1, 5, level.name(), true)
end

--/ Новый патруль начался, новый вертолёт ещё не доступен
function on_new_patrol()
 local id = sm.load_var("sm_heli_this_id",   "nil")

 if id~="nil" then    -- если уже есть вертолёт - сносим его
  local heli = alife():object(tonumber(id))
  
  if heli then
    alife():release(heli, true)
  end
  
  -- Данные для респауна
  sm.save_var("sm_heli_this_id",   "nil")
  sm.save_var("sm_patrol_started", false)
 end
end

function add_to_binder( npc, ini, scheme, section, storage )
    printf( "DEBUG: add_to_binder: npc:name()='%s', scheme='%s', section='%s'", npc:name(), scheme, section )

    local new_action = heli_patrol( npc, storage )

    -- Зарегистрировать все actions, в которых должен быть вызван метод reset_scheme при изменении настроек схемы:
    xr_logic.subscribe_action_for_events( npc, storage, new_action )
end

function set_scheme( npc, ini, scheme, section )
      local a = xr_logic.assign_storage_and_bind( npc, ini, scheme, section )

      a.logic = xr_logic.cfg_get_switch_conditions( ini, section, npc )

      local smarts        = utils.cfg_get_string(ini, section, "smarts",     npc, false, "", nil)
      a.smarts            = utils.parse_names(smarts)
      a.engine            = utils.cfg_get_string( ini, section, "engine_sound", npc, false, "", true)
      a.alert_d           = utils.cfg_get_number( ini, section, "alert_distance", npc, false, 70)
      a.alert_d_def       = a.alert_d

end

--/ Спавним вертолёт
function spawn_heli()
 if not safe_zones[level.name()] then return end
 
 if not sm.readCfg( "heli_enabled", "bol" ) then return end
 if sm.load_var("sm_heli_spawned", false) == true then return end
 if patrol_times[level.get_time_hours()]  == nil  then return end
 
 if not sm.IsSurge() and not sm.isStoryMode() and not sm.isStoryMode("heli") then
      on_new_patrol()
      
      if sm.call("m_sleep", "active")==true then
       check_sleep()
       return
      end
      
      sm.call("sm_tips","send_tip", sm.get_text("st_heli_patrol_start"), nil,nil,10)
      sm.call("m_hides", "Start")
    
      if level.name()=="marsh" then
        spawn_marsh_heli()
      end

      if level.name()=="escape" then
        spawn_escape_heli()
      end
      
      sm.timer_g("sm_spawn_helicopters", 0, 1, 5, level.name(), true)
      sm.save_var("sm_heli_spawned", true)
 end

end

function spawn_marsh_heli()
 local heli = sm.spawn("heli_marsh", safe_zones["marsh"], 1, 135)
 local t = sm_net_utils.Get_Data_Helicopter(heli)
 t.custom_data = "[logic]\ncfg = scripts\\shoker\\heli_marsh.ltx"
 t.startup_animation = "idle" --/ дефолтно: [$editor]
 t.engine_sound = "vehicles\\helicopter\\helicopter"
 sm.save_obj(heli.id, "i_am_special", true)
 sm_net_utils.Set_Data_Helicopter(t,heli)
end

function spawn_escape_heli()
 local heli = sm.spawn("heli_marsh", safe_zones["escape"], 1, 472)
 local t = sm_net_utils.Get_Data_Helicopter(heli)
 t.custom_data = "[logic]\ncfg = scripts\\shoker\\heli_escape.ltx"
 t.startup_animation = "idle" --/ дефолтно: [$editor]
 t.engine_sound = "vehicles\\helicopter\\helicopter"
 sm.save_obj(heli.id, "i_am_special", true)
 sm_net_utils.Set_Data_Helicopter(t,heli)
end

Если кто поможет буду очень признателен, осваиваю сейчас чн.

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

@лщыыня 
1.

Скрытый текст
function spawn_all(respawn)
--* проверяем условия для спауна
if load("spawn_anom",false)==false or respawn==true then
--* создаём все нужные нам аномалии по заданным координатам.
    create_anom("zone_mine_electric",2,-295.39,1.24,-3.30,1,135)
--* и артефакты.
    spawn("af_cristall",vector():set(302.34,0.91,-125.80),1,135)
...
--* устанавливаем переменную проверки условия спауна
   save("spawn_anom",true)
end
end
--* функция для создания объекта типа "аномалия" с учётом содержимого его нетпакета, вызывается в функции выше spawn_all -> create_anom(...).
function create_anom(section,rad_anom,x,y,z,lv,gv,mode)
...
end
-- Вывод инфы в консоль
function con(msg)
get_console():execute(msg)
end
--* фунции для работы с хранилищем актора, сохраняем/читаем/удаляем переменую, вызывается в функции выше spawn_all -> load(...) / save(...)
function save(variable_name, value)
...
end
function load(variable_name, value_if_not_found)
...
end
function del(variable_name)
...
end
--* функция для создания объекта, вызывается в функции выше spawn_all -> spawn(...) - для артефактов.
function spawn(section,pos,lv,gv)
--    vector():set(x,y,z)
      if gv==nil then gv=db.actor:game_vertex_id() end
      if lv==nil then lv=db.actor:level_vertex_id() end
      if pos==nil then pos=db.actor:position() end
      if section==nil then
      con("Не_указанная_секция")
      else
      return alife():create(section,pos,lv,gv)
      end
end

 


Вызывается на апдейте биндера группировок bind_faction.script -> update()

Скрытый текст
function faction_binder:update(delta)
    object_binder.update(self, delta)
    self.faction:update()
      shoker_anomalies.main() --* почему именно здесь, лучше не спрашивать.
end

 

2. Можно, но потребуется, как минимум, интеграция авторских "вставок" (ООП, однако): тех функций, вызов которых в коде начинается на "sm."... (sm.ltx, sm.save_var, sm.load_obj / sm.save_obj, sm.timer_r / sm.timer_g, sm.call, sm_net_utils... ещё что-то). Либо разобраться, за что они отвечают (работа с переменными, таймеры, нетпакеты) и переписать их на имеющиеся аналоги.

 

  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

@Купер Спасибо за помощь, Еще хотелось бы узнать за один вылет на болотах, толком в инете нет инфы может вы знаете: 
 

Скрытый текст

* Detected CPU: AuthenticAMD , F15/M0/S0, 3590.00 mhz, 31-clk 'rdtsc'
* CPU Features: RDTSC, MMX, SSE, SSE2

Initializing File System...
using fs-ltx fsgame.ltx
FS: 30804 files cached 33 archives, 4747Kb memory used.
Init FileSystem 0.507367 sec
'xrCore' build 3795, Jun 25 2009

Initializing Engine...
Starting INPUT device...
Loading DLL: xrRender_R2.dll
Loading DLL: xrRender_R3.dll
refCount:m_pAdapter 1
command line 
Executing config-script "user.ltx"...
[d:\s.t.a.l.k.e.r Чистое Небо\_appdata_\user.ltx] successfully loaded.
Loading DLL: xrRender_R3.dll
Loading DLL: xrGame.dll
! Unable to find Software\GSC Game World\STALKER-STCS\ in registry
! Player name registry key (InstallUserName) not found !
* [win32]: free[4046300 K], reserved[55144 K], committed[92796 K]
* [ D3D ]: textures[0 K]
* [x-ray]: crt heap[8473 K], process heap[2970 K], game lua[0 K], render[0 K]
* [x-ray]: economy: strings[4017 K], smem[0 K]
SOUND: OpenAL: enumerate devices...
SOUND: OpenAL: EnumerationExtension Present
devices Generic Hardware
SOUND: OpenAL: system  default SndDevice name is Generic Hardware
SOUND: OpenAL: default SndDevice name set to Generic Software
SOUND: OpenAL: All available devices:
1. Generic Software, Spec Version 1.1 (default) eax[0] efx[no] xram[no]
2. Generic Software, Spec Version 1.1 (default) eax[0] efx[no] xram[no]
Executing config-script "user.ltx"...
Executing config-script "d:\s.t.a.l.k.e.r Чистое Небо\gamedata\configs\rspec_extreme.ltx"...
[d:\s.t.a.l.k.e.r Чистое Небо\gamedata\configs\rspec_extreme.ltx] successfully loaded.
[d:\s.t.a.l.k.e.r Чистое Небо\_appdata_\user.ltx] successfully loaded.
SOUND: Selected device is Generic Software
* sound: EAX 2.0 extension: absent
* sound: EAX 2.0 deferred: absent
* sound : cache: 65537 kb, 4856 lines, 13820 bpl
Starting RENDER device...
* GPU [vendor:10DE]-[device:2208]: NVIDIA GeForce RTX 3080 Ti
* CREATE: DeviceREF: 4
*     Texture memory: 3072 M
* GPU shading: vs(0/4.0/40), ps(0/4.0/40)
* GPU vertex cache: unrecognized, 24
* NVidia MGPU: Logical(1), Physical(1)
* Starting rendering as 2-GPU.
* DVB created: 1536K
* DIB created: 512K
! Renderer doesn't support blender 'effects\shadow_world'
* HWDST/PCF supported and used
- r__tf_aniso 16
- r2_tf_mipbias 0.
Starting engine...
! Unable to find Software\GSC Game World\STALKER-STCS\ in registry
! Player name registry key (InstallUserName) not found !
! Unable to find Software\GSC Game World\STALKER-STCS\ in registry
Loading DLL: xrGameSpy.dll
! Invalid ogg-comment version, file:  d:\s.t.a.l.k.e.r Чистое Небо\gamedata\sounds\music\wasteland2.ogg
refCount:pBaseZB 1
refCount:pBaseRT 1
* DVB created: 1536K
* DIB created: 512K
- r__tf_aniso 16
- r2_tf_mipbias 0.
* GPU shading: vs(0/4.0/40), ps(0/4.0/40)
* GPU vertex cache: unrecognized, 24
* NVidia MGPU: Logical(1), Physical(1)
* Starting rendering as 2-GPU.
*** RESET [4338 ms]
"d:\s.t.a.l.k.e.r Чистое Небо\bin\xrengine.exe" 
* phase time: 0 ms
* phase cmem: 130493 K
Кэширование объектов...
Loading objects...
Loading models...
* [prefetch] time:    1820 ms
* [prefetch] memory:  0Kb
! Unable to find Software\GSC Game World\STALKER-STCS\ in registry
! Player name registry key (InstallUserName) not found !
* phase time: 1885 ms
* phase cmem: 121411 K
Сервер: Старт...
* phase time: 66 ms
* phase cmem: 108278 K
Сервер: Загрузка симуляции жизни...
* phase time: 1 ms
* phase cmem: 108278 K
Загрузка игры "marsh_2011-09-10_0921.sav"...
* Loading spawn registry...
* 11404 spawn points are successfully loaded
* Loading objects...
* 20823 objects are successfully loaded
* Game marsh_2011-09-10_0921 is successfully loaded from file 'd:\s.t.a.l.k.e.r Чистое Небо\_appdata_\savedgames\marsh_2011-09-10_0921.sav' (1.153s)
* phase time: 1152 ms
* phase cmem: 165068 K
Сервер: Соединение...
* phase time: 21 ms
* phase cmem: 165113 K
Клиент: Соединение с localhost...
* client : connection accepted - <>
* phase time: 11 ms
* phase cmem: 165145 K
Открытие потока...
* phase time: 2 ms
* phase cmem: 165145 K
Загрузка формы объектов...
* phase time: 2266 ms
* phase cmem: 276093 K
Загрузка шейдеров...
* phase time: 371 ms
* phase cmem: 277614 K
Загрузка геометрии...
* [Loading VB] 65533 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65506 verts, 2047 Kb
* [Loading VB] 56742 verts, 1773 Kb
* [Loading VB] 65531 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65533 verts, 2047 Kb
* [Loading VB] 65522 verts, 2047 Kb
* [Loading VB] 65530 verts, 2047 Kb
* [Loading VB] 65525 verts, 2047 Kb
* [Loading VB] 65517 verts, 2047 Kb
* [Loading VB] 65528 verts, 2047 Kb
* [Loading VB] 65516 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65513 verts, 2047 Kb
* [Loading VB] 65534 verts, 2047 Kb
* [Loading VB] 65507 verts, 2047 Kb
* [Loading VB] 65510 verts, 2047 Kb
* [Loading VB] 65515 verts, 2047 Kb
* [Loading VB] 65501 verts, 2046 Kb
* [Loading VB] 65534 verts, 2047 Kb
* [Loading VB] 65534 verts, 2047 Kb
* [Loading VB] 65533 verts, 2047 Kb
* [Loading VB] 11053 verts, 345 Kb
* [Loading VB] 65533 verts, 2047 Kb
* [Loading VB] 65533 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65534 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 65535 verts, 2047 Kb
* [Loading VB] 50268 verts, 1570 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 741387 indices, 1448 Kb
* [Loading VB] 65533 verts, 767 Kb
* [Loading VB] 65533 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65533 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65535 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65534 verts, 767 Kb
* [Loading VB] 65532 verts, 767 Kb
* [Loading VB] 22720 verts, 266 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 1048575 indices, 2047 Kb
* [Loading IB] 466236 indices, 910 Kb
* phase time: 505 ms
* phase cmem: 277799 K
Загрузка базы пространств...
* phase time: 36 ms
* phase cmem: 289189 K
Загрузка детальных объектов...
* [DETAILS] VertexConsts(256), Batch(61)
* [DETAILS] 22936 v(20), 11468 p
* [DETAILS] Batch(61), VB(447K), IB(67K)
* phase time: 22 ms
* phase cmem: 289230 K
Загрузка секторов и порталов...
* Loading HOM: d:\s.t.a.l.k.e.r Чистое Небо\gamedata\levels\marsh\level.hom
* phase time: 8 ms
* phase cmem: 289541 K
Загрузка ИИ объектов...
* phase time: 2 ms
* phase cmem: 289541 K
Клиент: Создание...
* phase time: 12 ms
* phase cmem: 289541 K
Загрузка текстур...
* t-report - base: 951, 466069 K
* t-report - lmap: 11, 11265 K
* phase time: 12585 ms
* phase cmem: 326974 K
Клиент: Синхронизация...
* phase time: 4 ms
* phase cmem: 326974 K
* [win32]: free[2621920 K], reserved[108264 K], committed[1464056 K]
* [ D3D ]: textures[631310 K]
* [x-ray]: crt heap[326971 K], process heap[47707 K], game lua[64550 K], render[222 K]
* [x-ray]: economy: strings[13820 K], smem[4015 K]
* MEMORY USAGE: 394906 K
* End of synchronization A[1] R[1]
* Saving spawns...
* Saving objects...
* 20824 objects are successfully saved
* Game marsh_2011-09-10_1028.sav is successfully saved to file 'd:\s.t.a.l.k.e.r Чистое Небо\_appdata_\savedgames\marsh_2011-09-10_1028.sav'
stack trace:

0023:053DA96A xrGame.dll

Вылет происходит когда я пытаюсь вернутся с проводником на базу ЧН, пробовал разные варианты, сразу после начала игры могу вернутся, после тестов выяснилось что вылет появляется только после того как Лебедев говорит пора ударить главную базу ренегатов "МехДвор", то есть группировка ЧН набралась достаточно сил и привысила ренегатовские пысы: В начале я думал что поломал игру модом который изменяет награду за Мех двор но нет,буду признателен за ответ(вычитал в сети только то что сам xrGame.dll может быть битый или не знаю).

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

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

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

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

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

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

Войти

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

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...