Перейти к содержанию

frankenshtayn

Сталкеры
  • Публикаций

    56
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные frankenshtayn


  1. В 05.12.2023 в 21:13, tau сказал:

    сори за спам, но как это можно реализовать?

    В ТЧ это делается достаточно просто:

    На координатах НПС ставится рестриктор с логикой выдачи инфопрошня, ну например proba_dial

    (Важно!!!! - размер рестриктора ставить 2 !!!)

    НПС добавить такую логику:

    [walker@g]
    path_walk = byk_walk3
    path_look = byk_look3
    on_actor_dist_le = 2| nil {+proba_dial} %=on_talk%
    meet = meet

    Ну, в общем-то и всё)

    https://www.youtube.com/watch?v=cCxoY-n3imM

     


  2. 22 часа назад, StrawFlux сказал:

    И еще такой вопросик, как запарсить в скрипте строку типа: нужное_значение = тру из лтх файла, именно что бы проверить тру оно или нет, read_if_exists? желательно написать сразу пример функции где идет проверка, а то что-то котелок совсем не варит...

    Я делал так:

    function check_actor( actor, obj )
    	local ltx = system_ini()
    		if ( ltx:r_float("actor_condition","max_walk_weight") ~= 60 ) then
    			return true
    		end
    			if ( ltx:r_float("actor","jump_speed") ~= 6.0 ) then
    			return true
    		end
    	return false
    end

    Проверял вес и прыжок ГГ в actor.ltx - если параметры не совпадали с оригиналом, то функция возвращает true

    В скрипте указывается секция (actor_condition) и проверяемый параметр из секции (max_walk_weight)

    19 часов назад, Pepel сказал:

    решил иначе - скопировал папки со скриптами, конфигами и текстурами в бэкап, потом удалил геймдату и скопировал ее из оригинала, закинул из бэкапа свои наработки. Всё заработало:u1F607:

    Тоже вариант!)

    13 часов назад, Stalkervernite сказал:

    В чем ошибка ? при спавне спавн елемента ошибка такая ---------------------------
    Level Editor
    ---------------------------
    External exception 80000003.
    ---------------------------
    ОК   
    ---------------------------

    1. Ошибки в СДК

    2. Отсутствие каких либо библиотек (винду вроде переустанавливал?)

    3. Ошибки в редактировании локации

    4. Не подходящая фаза Луны). Это не шутка) Иногда (закономерность не обнаружил, но...) после работы в какой-то сторонней программе, чтения новостей в интернете и т.д. и т.п. бывает что СДК на стадии открытия локации зависает наглухо с такой же ошибкой и помогает только диспетчер задач...  И это еще не всё - в это же время не запускается Сталкер - т.е. абсолютно любое сохранение и НИ на первой секунде входа в игру виснет намертво без лога и спасает опять же "кантрол+шифт+делейт".

    Что характерно - после непродолжительных танцев с бубном, то бишь пары перезагрузок компьютера, или оставление оного в покое например на сутки, всё возвращается в норму - и СДК загружается и работает нормально и Сталкер грузит любое сохранение...

    • Лайк 1

  3. В 24.09.2023 в 08:55, Paracetamol сказал:

    Как сделать, чтобы нпс шёл за актёром, аля компаньён.

    Вот так:

    Спойлер

    Значит так, чтобы не заморачиваться с изменениями, создай скрипт с именем rx_karavan.script (в принципе можно создать и свой скрипт, но тогда в «модулях» нужно будет исправить на имя своего скрипта) в него вставь вот этот код:

    ----------------------------------------------

    class "evaluator_end" (property_evaluator)

    function evaluator_end:__init(name,storage) super (nil,name)

                self.st = storage

    end

    function evaluator_end:evaluate()

                return not xr_logic.is_active(self.object,self.st)

    end

    class "evaluator_karavan" (property_evaluator)

    function evaluator_karavan:__init(name,storage) super (nil, name)

      self.st = storage

    end

    function evaluator_karavan:evaluate()

                return db.actor and xr_logic.is_active(self.object,self.st) and self.st.enabled == true

    end

    class "action_karavan" (action_base)

    function action_karavan:__init(name,storage) super (nil, name)

                self.st = storage

    end

    function action_karavan:initialize()

                action_base.initialize(self)

                local npc = self.object

                npc:set_desired_position()

                npc:set_desired_direction()

                npc:set_detail_path_type(move.curve)

                npc:set_path_type(game_object.level_path)

                self.offset = vector():set(math.random()*6-3,0,math.random()*6-3)

                self.offset:normalize()

    end

    function action_karavan:execute()

                action_base.execute(self)

                local npc = self.object

                if xr_logic.try_switch_to_another_section(npc,self.st,db.actor) then

                            return

                end

                local dist = db.actor:position():distance_to(npc:position())

                local state,look,anim = state_mgr.get_state(npc)

                if dist <= self.st.radius then

                            state,look,anim = self.st.close_state,nil,true

                elseif dist < self.st.close_dist then

                            state,look,anim = self.st.close_state,nil,true

                elseif dist >= self.st.faraway_dist then

                            state,look,anim = self.st.wait_state,nil,true

                elseif dist < self.st.near_dist then

                            state,look,anim = self.st.near_state,nil,true

                elseif not (state and state_lib.states[state].movement == move.stand) then

                            state,look,anim = self.st.faraway_state,nil,true

                end     

                if self.st.look == true and state_lib.states[state].movement == move.stand then

                            look = true

                end

                if look == true then

                            look = {look_object = db.actor}

                end

                if anim == true then

                            anim = {animation = true}

                end

                if state then

                            state_mgr.set_state(npc,state,nil,nil,look,anim)

                end

                if state_lib.states[state].movement ~= move.stand then

                            local vertex_id = level.vertex_in_direction(db.actor:level_vertex_id(),self.offset,self.st.radius)

                            utils.send_to_nearest_accessible_vertex(npc,vertex_id)

                end

    end

    function action_karavan:finalize()

                self.object:clear_animations()

    end

     

    prop_karavan = 9651

    prop_end = prop_karavan+1

    act_karavan = prop_karavan

     

    function add_to_binder(object,char_ini,scheme,section,st)

                local manager = object:motivation_action_manager()

                manager:add_evaluator(prop_karavan,evaluator_karavan("evaluator_karavan",st))

                local action = action_karavan("action_karavan",st)

                action:add_precondition(world_property(stalker_ids.property_alive,true))

                action:add_precondition(world_property(stalker_ids.property_enemy,false))

                action:add_precondition(world_property(stalker_ids.property_danger,false))

        xr_motivator.addCommonPrecondition(action)

                if watcher_act then

                            action:add_precondition(world_property(watcher_act.evid_near_stuff,false))

                            action:add_precondition(world_property(watcher_act.evid_see_body,false))

                            action:add_precondition(world_property(watcher_act.evid_see_stuff,false))                  

                end

                action:add_precondition(world_property(prop_karavan,true))

                action:add_effect(world_property(prop_karavan,false))

                manager:add_action(act_karavan,action)

                local atbl = {xr_actions_id.alife}

                for i,id in ipairs(atbl) do

                            action = manager:action(id)

                            if action then

                                       action:add_precondition(world_property(prop_karavan,false))

                            end

                end

    end

     

    function set_scheme(npc,ini,scheme,section,gulag_name)

                local st = xr_logic.assign_storage_and_bind(npc,ini,scheme,section)

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

                st.close_dist = utils.cfg_get_number(ini,section,"close_dist",npc,false) or 7

                st.near_dist = utils.cfg_get_number(ini,section,"near_dist",npc,false) or 14

                st.faraway_dist = utils.cfg_get_number(ini,section,"faraway_dist",npc,false) or 32

                st.close_state = utils.cfg_get_string(ini,section,"close_state",npc,false,"") or "guard"

                st.near_state = utils.cfg_get_string(ini,section,"near_state",npc,false,"") or "patrol"

                st.faraway_state = utils.cfg_get_string(ini,section,"faraway_state",npc,false,"") or "rush"

                st.wait_state = utils.cfg_get_string(ini,section,"wait_state",npc,false,"") or "hide"

                st.look = utils.cfg_get_bool(ini,section,"look_on_actor",npc,false)

                st.radius = utils.cfg_get_number(ini,section,"radius",npc,false) or 4

                st.no_loot = utils.cfg_get_bool(ini,section,"no_loot",npc,false)

                if st.no_loot ~= true then

                            st.no_loot = nil

                end

                st.enabled = true

    end

    function disable_scheme(npc,scheme)

                rx_ai.printf("disable")

                local st = db.storage[npc:id()][scheme]

                if st then

                            st.enabled = false

                end

    end

    далее, открой скрипт modules.script и под строками

    ----------------------------------------------------------------------

    -- Загрузка модулей сталкеров:

    ----------------------------------------------------------------------

    if watcher_act then

            load_scheme("watcher_act",    "watcher_act",      stype_stalker)

    end

    вставь такую строчку:

    load_scheme("rx_karavan",        "karavan",      stype_stalker)

    со скриптами все...

    Ну и собственно логика персонажа будет выглядеть так:

     [smart_terrains]

    none = true  

    [logic]

    active = karavan

    [karavan]

    close_dist = 2

    near_dist = 10

    faraway_dist = 31

    close_state = guard

    near_state = rush

    faraway_state = sprint

    wait_state = rush

    look_on_actor = false

    radius = 1

    combat_ignore_cond = {=fighting_dist_ge(40)} always

    no_loot = true

    в принципе здесь чувак с самого начала будет бегать за ГГ...Но, если нужно не сразу, а в нужный момент. то логику можно построить примерно так:

     [smart_terrains]

    none = true

    [logic]

    active = walker

    [walker] ;пока чувак нам не нужен, ходит под валкером по своим путям(стоит, сидит...)

    path_walk = snip_naym_walk1

    path_look = snip_naym_look1

    on_info = {+info} karavan ;при получении инфопоршня, переходим в "караван" и бегим за ГГ

    [karavan]

    close_dist = 2

    near_dist = 10

    faraway_dist = 31

    close_state = guard

    near_state = rush

    faraway_state = sprint

    wait_state = rush

    look_on_actor = false

    radius = 1

    combat_ignore_cond = {=fighting_dist_ge(40)} always

    no_loot = true

    on_info = {+info1} walker@prshli ;дошли до места, получили поршень, перешли в другой валкер(стоим, сидим и т.д.)

    [walker@prishli]

    path_walk = snip_naym_walk2

    path_look = snip_naym_look2

    Взято из НС, расписано подробнее некуда, кому надо - дерзайте)

    • Лайк 1
    • Хабар 1

  4. В 28.09.2023 в 17:24, RicoNRT сказал:

    Хочу сделать такой квест.По условию на актере должен быть одет определённый костюм(например куртка бандита.)В чём прикол.Я поставил рестриктор,но от должен работать только в том случае,если на актере надета та самая куртка,в ином же случае, при входе в рестриктор ничего не сработает.

    Как то так:

    [logic]
    active = sr_idle
    
    [sr_idle]
    on_actor_inside = {-zashel} %+zashel% sr_idle@in  - зашел ГГ, переходим в sr_idle@in
    
    [sr_idle@in]
    on_info = {=check_outfit} sr_idle@da, {!check_outfit} sr_idle@net  - проверяем одет нужный костюм или нет, если одет идем в sr_idle@da, если нет идем в sr_idle@net 
    
    [sr_idle@da]
    on_info = {+zashel} %+vidayem_info% sr_idle@tm  - если одет нужный костюм, выдаем инфо и переходим в схему таймера (выдается инфо vidayem_info из него запускается смс-ка и спавнится бюрер)
    
    [sr_idle@net]
    on_actor_outside = %-zashel% sr_idle  - если костюм не одет, ничего не происходит, и при выходе рестриктор возвращается в исходное состояние
     
    [sr_idle@tm]
    type = dec
    start_value = 60000            -запускаем таймер(время регулируем по себя)
    on_actor_outside = nil %+slabak%   -если вышел до окончания таймера, выдается инфо на провал задания
    on_value = 0 | sr_idle@tm_da    - если гг в рестрикторе и таймер закончился переходим в sr_idle@tm_da
    
    [sr_idle@tm_da]
    on_actor_inside = nil %+molodec%   - по окончании таймера и присутствии гг в рестрикторе выдается инфопоршень, по которому делается остальное: засчитывается задание, отбираетс и выдается костюм и т.д. и т.п.

    Функция проверки костюма должна лежать в xr_conditions.script и выглядеть так:

    function check_outfit()
    		local outfit = db.actor:get_current_outfit()
            if outfit and outfit:section() == "name_outfit" then 	
           return true
       else
            return false
        end
    end

     


    Дополнено 5 минуты спустя
    В 29.09.2023 в 20:22, RicoNRT сказал:

    Всем привет.На днях переустанавливал виндоус.До переустановки сдк работал прекрасно и без сбоев.Сегодня опять скачал сдк.Как только закидываю геймдату выдаёт ошибку.В чём проблема,геймдата таже.

    проверь библиотеки, вроде ругается на KernelBase.dll

     

    • Жму руку 1

  5. В 16.09.2023 в 18:04, RicoNRT сказал:

    Всем привет.Написал функцию,что бы при поднятии предмета выдавался НОВЫЙ квест. Сама функция работает т.к игра не вылетает и не жалуется. На квестовый предмет игра тоже не жалуется т.к я его спокойно подбираю без функции и поршней. Но как только я пытаюся активировать ту самую функцию,вылазит такая ошибка(смотреть фото).В чём может быть проблема.

    Зачем такие сложности и замусоривание апдейта?

    Можно ведь сделать проще, тем более, что любой мод одним найденным/поднятым предметом явно не обойдется.

    Итак, идем в тот же бинд_сталкер, ищем функцию on_item_take и приводим её в такой вид:

    local my_info_table = {
      item_odin = "info_odin",
      item_dva = "info_dva",
      item_tri = "info_tri",
    -------еще пара итем-инфопоршень----------
    -------еще пара итем-инфопоршень----------
    -------------и так далее------------------
      item_stopitsot = "info_stopitsot"
    }
    function actor_binder:on_item_take (obj)
        level_tasks.proceed(self.object)
        --game_stats.update_take_item (obj, self.object)
         if my_info_table[obj:section()] then
           db.actor:give_info_portion( my_info_table[obj:section()])  
         end 
    end

    Что мы имеем?

    Здесь, при взятии  item_odin получаем инфопоршень "info_odin", при взятии  item_dva получаем инфопоршень "info_dva", и так далее в соответствии с таблицей, которую можно заполнять практически бесконечно. Естественно инфопоршни необходимо регистрировать в соответствующем файле info_локация, а уж с выданным инфопоршнем можно творить что угодно - запускать функцию: <action>скрипт.функция</action>, выдавать инфопоршень: <give_info>инфопоршень</give_info>, выдавать задание: <task>идентификатор_задания</task>, и прочее, и почее, и прочее...


    Дополнено 19 минуты спустя
    В 16.09.2023 в 02:00, Pepel сказал:

    так выходит это всё-таки из-за аи сетки? а как я теперь ее верну в первоначальное состояние,

    блин, просто напросто в свою локацию из оригинальной переместить файлы level.ai, level.gct, level.graf, конечно при условии, что в остальных локациях эти файлы оригинальные, и game.graf тоже


  6. В 06.08.2023 в 00:36, ian98 сказал:

    можно ли отследить урон полученный именно от падения или сам факт приземления?

    Ну, как вариант, поставить в нужном месте рестрикор с необходимыми размерами и высотой, ограничить его срабатывание каким либо условием, например инфопоршнем выдаваемым перед тем, как ГГ полезет туда откуда может шмякнутся, и при попадании в него ГГ выполнять то, что нужно. Как-то так:

    [logic]
    active = sr_idle
     
    [sr_idle]
    on_actor_inside = {+gg_polez_kudato} %+gg_shmyaknulsya%

    Еще вариант, поставить на апдейт и активировать в нужное время функцию такого плана:

    if has_alife_info("gg_polez_kuda_to") 
    and (not has_alife_info("gg_shmyaknulsya"))then
    actor_position=db.actor:position()
    if level.name() == "имя_локации" then
    if actor_position.y < -8 then  ---координата ''y'' стоящего на земле ГГ в месте вероятного падения
    script.function()                        

     


    Дополнено 1 минуту спустя
    14 минут назад, imcrazyhoudini сказал:

    ночная-дневная работа собственно

    Так о чем я и говорил с самого начала).


    Дополнено 24 минуты спустя
    В 05.08.2023 в 13:22, Stalkervernite сказал:

    Расскажите, как сделать анимацию для камеры

    первый спойлер Level Editor пункт 9 "Облет камеры"

     

    • Спасибо 1

  7. В 02.08.2023 в 09:51, imcrazyhoudini сказал:

    а переход из одного состояния в другое сейчас происходит штатно

    Гм... Хотелось бы для общего развития узнать, как в таком коде:

    t = { section = "logic@esc_atp_bandit_kamp1"
    
    idle = 0,
    prior = 9, state = {0,1},
    in_rest = "", out_rest = "",
    }

    со ссылкой на одну логику происходит переход из одного состояния в другое. Нет, в принципе это несложно, если в логике  сделать например так:

    [logic]
    active = kamp
    
    [kamp]
    center_point = kamp_center_pusto
    radius = 1
    meet = meet
    anim = sit_knee
    on_info = {=is_day} remark@slip
    
    [remark@slip]
    anim = wait
    no_move = true
    target = actor
    on_info2 = {!is_day} kamp

    НПС будет днем отрабатывать одну логику, а ночью другую, но смысл городить огород?

     


    Дополнено 0 минут спустя
    23 часа назад, Stalkervernite сказал:

    Привет всем, смотрите. Создал смарт для бандитов на Свалке, ну и вообщем написал логику для бандита, когда написал, вылет с ошибкой combat ignore, мол пишит dulicate combat ignore, но до это го я писал логику , ( без смарта, сразу в custom date) было все нормально. Но когда я создал смарт и в gulag garbage написал такую же логику, то вылет. В чем проблема?

    чудес не бывает, нужно искать дубликат секции  combat ignore


  8. 16 минут назад, imcrazyhoudini сказал:

    да а с этим то какие проблемы? всё как в оригинале, 3 одинаковые логики использует и всё отлично работать, зачем кучу дубликатов создавать

    Так чтобы не путаться) Ну в принципе моё дело предложить, я не настаиваю)

    21 минуту назад, imcrazyhoudini сказал:

    пример с оригинала например: гулаг esc_specnaz

    Гм... И? Если мне память не отшибает, то у них у всех всего одно состояние, и они все кемперы, то бишь тусуются кучкой вокруг одной общей точки.


  9. 7 минут назад, N42 сказал:

    frankenshtayn у тебя самого на скрине в db0 4 папки только


    Дополнено 0 минут спустя

    Оригинальный этот архив посмотри

    Так эти 4 папки и весят 678 мГ, так же как и архив db0


  10. 13 минут назад, imcrazyhoudini сказал:

    да у меня такой же код
    ещё раз попробовал - уже в оффлайн никто не уходит, странная херня

    Разве? В скрипте для обоих состояний одна и та же логика, причем секции дублируются, например 

    t = { section = "logic@esc_atp_bandit_kamp1"
    
    idle = 0,
    prior = 9, state = {0,1},
    in_rest = "", out_rest = "",
    }
    
    t = { section = "logic@esc_atp_bandit_kamp1"
    
    idle = 0,
    prior = 9, state = {0,1},
    in_rest = "", out_rest = "",
    }

    Чем они отличаются? Для чего это дублирование? Почему для обоих состояний 0 и 1 одна и та же логика?

    По идее тут должен быть вылет, ибо игра вряд ли может понять "кто есть кто", и кто что должен делать.

    Посмотри внимательнее, как сделано у меня - для каждого НПС в скрипте отдельный код для каждого состояния с ссылкой на РАЗНУЮ секцию логики, соответственно в конфиге для каждого НПС две секции логики для каждого состояния. Представь себе - работает)))


  11. 21 минуту назад, N42 сказал:

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

    Папки есть везде, не пустые.

     

    архивы.jpg


  12. В 31.07.2023 в 16:42, imcrazyhoudini сказал:

    по идеи нпс должен переходить в другое состояние (день-ночь, ночью спит, днём охраняет), но вместо того чтобы перейти в другое состояние он уходит в оффлайн как править?

    Ну может быть задать для каждого состояния то, что он должен делать? Т.е. Для состояния 0 - одна логика, для состояния 1 другая?

    Как пример простейшего гулага с двумя состояниями:

    гулаг.скрипт:

    Спойлер

     

    local t = {}

    function load_job(sj, gname, type, squad, groups)
    --'--------------------------------------------------------------------------    
    --' GARBAGE
    --'--------------------------------------------------------------------------    
        

    -------------------------------------------------------------------------------------------

    ----------первый--------------

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker1",
    idle = 0,
    prior = 5, state = {0},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_kamp1",
    idle = 0,
    prior = 5, state = {1},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    ----------второй-----------

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker2",
    idle = 0,
    prior = 5, state = {0},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_kamp2",
    idle = 0,
    prior = 5, state = {1},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    ------третий-------------

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker3",
    idle = 0,
    prior = 5, state = {0},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_sleeper",
    idle = 0,
    prior = 5, state = {1},
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end
        
        
    end


    function load_states(gname, type)
    if type == "sv_st_smart_terrain" then
    return function(gulag)
    if db.actor ~= nil then
    if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 22 ) then
    return 0 -- день
    else
    return 1 -- ночь
    end
    else
    return gulag.state
    end
    end
    end
        
        
    end

    --------------------------------------------------------------------------
    -- Dynamic ltx
    --------------------------------------------------------------------------
    function load_ltx(gname, type)
        return nil
    end

    function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
        
        
        ---------
        
        if gulag_type == "sv_st_smart_terrain" then
    return npc_community == "stalker"
    end

        
        return false
    end

    function checkMonster(npc_community, gulag_type)
            if gulag_type == "gar_boars_nest2" then
                return npc_community == "boar"
            end
            
            if gulag_type == "gar_boars_nest" then
                return npc_community == "boar"
            end
            
            if gulag_type == "gar_nest_flesh" then
                return npc_community == "flesh"
            end
            
            if gulag_type == "gar_dogs_nest" then
                return npc_community == "dog"
            end
            
            if gulag_type == "gar_dogs_nest2" then
                return npc_community == "dog"
            end
        return false
    end

     

    гулаг.лтх:

    Спойлер

     

    ;;;--------------------------------------------------- 
    ;;;-- сталкер1 walker 0, днем)
    [logic@sv_st_smart_terrain_walker1]
    active = walker@odin_hodit
    on_hit = hit_w 

    [hit_w]
    on_info = %=zasada_spawn%

     
    [walker@odin_hodit]
    path_walk         = odin_walk
    danger            = danger_condition
    def_state_moving1 = patrol
    def_state_moving2 = patrol
    def_state_moving3 = patrol
    meet = meet
     
    ;;;-- сталкер1 kamp 1, ночью)
    [logic@sv_st_smart_terrain_kamp1]
    active = kamp@odin_sidit
    on_hit = hit_k 

    [hit_k]
    on_info = %=zasada_spawn%
     
    [kamp@odin_sidit]
    center_point = pole_kamp
    meet = no_meet
     ;;;----------------------------------------------------------------
    ;;;-- сталкер2 walker 0, днем)
    [logic@sv_st_smart_terrain_walker2]
    active = walker@dva_hodit
     
    [walker@dva_hodit]
    path_walk         = dva_walk
    danger            = danger_condition
    def_state_moving1 = patrol
    def_state_moving2 = patrol
    def_state_moving3 = patrol
    meet = meet
     
    ;;;-- сталкер2 kamp 1, ночью)
    [logic@sv_st_smart_terrain_kamp2]
    active = kamp@dva_sidit
     
    [kamp@dva_sidit]
    center_point = pole_kamp
    meet = no_meet
     ;;;----------------------------------------------------------------------------
     ;;;-- сталкер3 walker 0, днем)
    [logic@sv_st_smart_terrain_walker3]
    active = kamp@tri_sidit
     
    [kamp@tri_sidit]
    center_point = pole_kamp
    meet = meet 
     
     
    ;-- сталкер3 sleeper 1, ночью)
    [logic@sv_st_smart_terrain_sleeper]
    active = sleeper@tri_slip
     
    [sleeper@tri_slip]
    path_main = moy_sleep
    wakeable  = false
    meet = no_meet

     

    И всё нормально работает:

     


  13. В 30.07.2023 в 15:22, N42 сказал:

    он разбивает архивы? В самом первом есть папка sounds?

    sounds есть в 4 и 5 архиве. Проблема не в этом, повторю "условие задачи загадки"):

    - При наличии в корне игры папки gamedata, и отсутствии db-архивов (gamedata.db0-gamedata.dbb удалены, их нет в корне игры) - всё нормально, игра запускается, работает. Проблема начинается после упаковки геймдаты в db-архивы. Причем поисковик показывает, что эти файлы присутствуют по указанному в вылетах пути.

    В 31.07.2023 в 03:01, CiberZold сказал:

    frankenshtayn для распаковки и запаковки ТЧ архивов самый лучший это проверенный временем конвертер от Бардака, всё остальное дилетантская васня)

    Так с него и начинал) А вообще,  пробовал разными конвертерами.

    ПС. Вообще склоняюсь в сторону "криворукости", хотя не понимаю каким образом - если кидаю свои звуки, модели, шейдеры в геймдату и упаковываю её в архивы, а скрипты, конфиги, аллспавн и т.д. в отдельный архив, то начинаются танцы с вылетами по 

    [error]Description   : Can't open wave file:
    [error]Arguments     : d:\game\stalker\s.t.a.l.k.e.r. - shadow of hernobyl\gamedata\sounds\material\human\step\tmp_default4.ogg

    А вот если оригинал (урезанный) упаковать отдельно, а мои все файлы отдельно, то всё работает.

     


  14. 5 часов назад, Mass сказал:

    Решение напрашивается само собой. Поменять распаковщик, делово то

    Смутил тот момент, что если не трогать архивы ТЧ, а тупо упаковать геймдату с изменениями, обозвать типа *.dbz, (Во вносимых изменениях есть и добавленные звуки), и добавить в корень игры, то почему-то всё работает)

    Возможно конечно и распаковщик, однако для распаковки после возникновения проблемы пробовал и STALKER_Data_Unpacker_RU и S.T.A.L.K.E.R. UE и Распаковщик + Упаковщик db архивов XrCompress от 11.02.2016 для ТЧ, ЧН, ЗП. В общем пока загадка)

    58 минут назад, N42 сказал:

    посмотри, может у упаковщика есть конфиг, и там прописаны ogg в исключения

    [options] 
    exclude_exts = *.log,*.old,*.back
    bytes = 2
    
    [include_folders]
    .\ = true
    ai = true
    anims = true
    configs = true
    levels = true
    meshes = true
    scripts = true
    shaders = true
    sounds = true
    spawns = true
    textures = true
    
    [exclude_folders]
    
    [include_files]
    .\ = true
    game.graph = true
    gamemtl.xr = true
    lanims.xr = true
    particles.xr = true
    resource.h = true
    senvironment.xr = true
    shaders.xr = true
    shaders_xrlc.xr = true
    stalkergame.inf = true
    
    [header]
    auto_load    = true
    level_name   = single
    level_ver    = 1.0
    entry_point  = $fs_root$\gamedata\
    creator      = "gsc game world"
    link         = "www.gsc-game.com"

    Это файл datapack.ltx в упаковщике.

     


  15. [error]Expression    : wave&&wave->length()
    [error]Function      : CSoundRender_Source::LoadWave
    [error]File          : E:\stalker\patch_1_0004\xrSound\SoundRender_Source_loader.cpp
    [error]Line          : 65
    [error]Description   : Can't open wave file:
    [error]Arguments     : d:\game\stalker\s.t.a.l.k.e.r. - shadow of hernobyl\gamedata\sounds\material\human\step\tmp_default4.ogg

    Файл tmp_default4.ogg имеется в db-архиве.

    Делалось - распаковывались архивы, в папку gamedata вносились изменения, добавление нужного и удаление лишнего. Распакованная геймдата работает (при этом из корня удалены все оригинальные db-архивы), вылет происходит только после упаковки геймдаты. 

    ПС. Причем не упаковываются только звуки, т.к. при добавлении в корень игры папки gmedata/sounds со звуками, всё работает.

    ПС. Пользовался Распаковщик + Упаковщик db архивов XrCompress от 11.02.2016 для ТЧ, ЧН, ЗП


  16. В 20.07.2023 в 06:54, *lusky* сказал:

    Интересует вот какой вопрос. Хочу изменить квестовый предмет, например оружие которое нужно найти. В файле all.spawn я изменил его визуальное отображение. И когда я его нахожу визуал изменился, а описание и иконка остались прежними. Где править чтобы поменялось описание и иконка?

    Найти в gamedata\config\weapons секцию необходимого оружия (например wpn_bm16). В этой секции найти строки 

    description					= enc_weapons1_wpn-bm16

    скопировать enc_weapons1_wpn-bm16 и идти по пути gamedata\config\text\rus и через поисковик найти нужный файл (это наверняка будет enc_weapons1_wpn-bm16) в этом файле так же через поиск найти описание нужного девайса, например enc_weapons1_wpn-bm16 в оригинале находится в файле enc_weapons1_wpn-bm16 в строке под номером 270:

    Цитата

        <string id="enc_weapons1_wpn-bm16">
            <text>Обрез охотничьего ружья ВМ 17. Значительно компактней и легче новой двустволки, но эффективен только в ближнем бою. Один из самых распространённых видов оружия у новичков.\n Боеприпасы:\n 12х70 дробь,\n 12x76 жекан,\n 12x76 дротик.</text>
        </string>

    За иконку девайса отвечают строки:

    inv_grid_width                = 3
    inv_grid_height                = 1
    inv_grid_x                    = 6
    inv_grid_y                    = 1

    в конфиге оружия. Это ссылка на ддс-файл ui_icon_equipment по пути gamedata\textures\ui\

    Следовательно надо создать свою иконку, добавить её в файл ui_icon_equipment.dds и в конфиг оружия вставить  нужные координаты, по примеру обреза (3 и 1 это количество "клеток" занимаемым иконкой в файле, 6 и 1 это начало координат иконки в файле):

     

    иконка.jpg


  17. Здравствуйте. Образовалась проблема. Возникла необходимость немного изменить ограждение локации. Взял файл локация_fake.obgect, перегнал в ogg, открыл в Милке, где-то чутка увеличил, где-то слегка передвинул, ничего не удалял и не добавлял, экспортировал в .object. Загрузил локацию, скомпилировал сектор, порталы, сбилдил, запустил компиляцию (на драфте для "посмотреть"). На стадии Converting to OGFs... возникли две ошибки такого плана:

    FATAL ERROR
     
    [error]Expression    : assertion failed
    [error]Function      : OGF::Optimize
    [error]File          : I:\xray-svn\xrLC\OGF_Face.cpp
    [error]Line          : 153
    [error]Description   : x_faces.size() == faces.size()

    ошибки пока проигнорировал, локация скомпилировалась, но... в игре происходит бяка, причем постоянно в одном и том же месте:

    Спойлер


    1.jpg

    2.jpg

     

     

    Что это? Что-то с сектором или порталами? Почему только здесь? Как с этим бороться?


  18. В 12.07.2023 в 13:30, imcrazyhoudini сказал:

    Stalkervernite у логики есть минус, она работает в пределах алайфа, то есть если тебе надо нпс перегнать с одной части локацию в противоположную, то надо чтобы он в онлайне был, но это тоже решаемо

    Не совсем верно, вот часть кода НПС из аллспавна:

    [1820]
    ; cse_abstract properties
    section_name = stalker_0012
    name = tirpic
    position = -19.1746063232422,15.5646266937256,-147.488845825195
    direction = -0.489549994468689,0,-0.871975004673004
    
    ; cse_alife_trader_abstract properties
    money = 5000
    character_profile = npc_tirpic
    
    ; cse_alife_object properties
    game_vertex_id = 2119
    distance = 3.5
    level_vertex_id = 80698
    object_flags = 0xffffff7b
    custom_data = <<END

    Все зависит от флага, например в указанном примере у НПС установлен флаг:

    object_flags = 0xffffff7b

    И этот НПС прекрасно отрабатывает логику (именно логику, а не смарт) даже в оффлайне. Т.е. можно на одном конце локации поговорить с ним, выдать поршень на переход в другую схему логики, отправляющую его на противоположный край, и смело отправляться туда куда он должен прийти, оставив его далеко позади и в оффлайне. Через некоторое время он придет в нужное место самостоятельно.


    Дополнено 38 минуты спустя
    В 12.07.2023 в 13:32, Stalkervernite сказал:

    imcrazyhoudini Насчет того что ты щас сказал я знал) Но она как минимум лучше смарта со смарта, хочу сделать сцену в моде, который щас в разработке, типо нпс с одной точке, перебираются в другую. А грамотна не получается сделать.

    Всё достаточно просто. Например есть простейшая логика логика:

    [logic] 
    active = walker@tirpic_stroy  ;;;;   обьявляем активную секцию логики
    combat_ignore = combat_ignore
    
    
    [walker@tirpic_stroy]   ;;;;      активная секция логики
    path_walk = tirpic_walk  ;;;     нпс стоит в этой точке
    path_look = tirpic_look   ;;;    нпс смотрит в эту точку
    combat_ignore_cond = always   ;;;;     игнорирует любую опасность (это не обязательно))) можно в него даже стрелять, не ответит
    danger = danger_condition
    show_spot = false  ;;; не отображается на миникарте
    on_info = {+mogno_topat} walker@go_tochka_a   ;;;;   при получении инфопоршня "+mogno_topat" нпс переходит в секцию логики "walker@go_tochka_a"
    
    
    [walker@go_tochka_a]   ;;;;        перешли сюда
    path_walk = tirpic_go_walk  ;;;;       топает в эту точку
    path_look = tirpic_go_look   ;;;;       смотрим в эту точку
    meet = no_meet
    combat_ignore_cond = always
    on_signal = tirpic_mesto| %+s_pribitiem% walker@tirpic_na_a  ;;;;  при получении сигнала (прописывается либо в точках ***_walk, либо в точках ***_look "tirpic_mesto" выдается инфопоршень "s_pribitiem" и нпс переходит в секцию логики "walker@tirpic_na_a"
    
    [walker@tirpic_na_a]  ;;;;  перешли сюда
    path_walk = tirpic_sid_walk  ;;;;  дотопали в эту точку 
    path_look = tirpic_sid_look    ;;;;  смотрит в эту точку
    combat_ignore_cond = always
    meet = meet
    on_info = {+vtoroy_tochka_da} walker@tirpic_tochka_b   ;;;; при получении инфопоршня "vtoroy_tochka_da" переходим в секцию логики "walker@tirpic_tochka_b"
    
    [walker@tirpic_tochka_b]  ;;;; перешли сюда
    path_walk = tirpic_walk_b  ;;;;;  дотопали в эту точку
    path_look = tirpic_look_b    ;;;;  смотрим в эту точку
    combat_ignore_cond = always
    on_actor_dist_le_nvis = 7|remark@talk   ;;;;  при приближении гг на 7 метров к нпс он переходит в секцию логики "remark@talk"
    meet = no_meet
    
    [remark@talk]     ;;;;   перешли сюда
    anim = wait_trade   ;;;;   нпс отыгрывает анимацию
    target = actor     ;;;;   нпс смотрит на гг
    meet = meet
    on_actor_dist_ge = 7|walker@tirpic_tochka_b   ;;;;   при отходе гг от нпс на 7 метров, он возвращается в секцию логики "walker@tirpic_tochka_b"

    В общем, немного знаний и упорства, и с нпс можно творить практически всё, что угодно - заставить его ходить или сидеть, бегать или играть на гитаре, есть, пить, отыгрывать анимации и т.д. и т.п. 


     

    • Спасибо 1

  19. Я давал ссылочку на  вики, там можно найти всё, что угодно. Но как пример.....

    Аллспавн алайф_локация:

    Спойлер

     

    [14]
    ; cse_abstract properties
    section_name = smart_terrain
    name = sv_st_smart_terrain
    position = 217.50959777832,-1.94939196109772,176.110565185547
    direction = 0,0,0

    ; cse_alife_object properties
    game_vertex_id = 378
    distance = 24.5
    level_vertex_id = 354113
    object_flags = 0xffffff3e
    custom_data = <<END
    [smart_terrain]
    type = sv_st_smart_terrain
    capacity = 3
    END

    ; cse_shape properties
    shapes = shape0
    shape0:type = sphere
    shape0:offset = 0,0,0
    shape0:radius = 3.71439838409424

    ; cse_alife_space_restrictor properties
    restrictor_type = 3

    ; se_smart_terrain properties


    [15]
    ; cse_abstract properties
    section_name = stalker
    name = sv_st_smart_terrain00
    position = 218.50959777832,-1.94939196109772,177.110565185547
    direction = -0.327957004308701,0,0.944693028926849

    ; cse_alife_trader_abstract properties
    money = 5000
    character_profile = esc_stalker_novice

    ; cse_alife_object properties
    game_vertex_id = 378
    distance = 4.19999980926514
    level_vertex_id = 354113
    object_flags = 0xffffffbf
    custom_data = <<END
    [smart_terrains]
    sv_st_smart_terrain = true 
    END

    ; cse_visual properties
    visual_name = actors\novice\green_stalker_2

    ; cse_alife_creature_abstract properties
    g_team = 0
    g_squad = 0
    g_group = 0
    health = 1
    dynamic_out_restrictions = 
    dynamic_in_restrictions = 

    upd:health = 1
    upd:timestamp = 0
    upd:creature_flags = 0
    upd:position = 218.50959777832,-1.94939196109772,177.110565185547
    upd:o_model = 0
    upd:o_torso = 0.533530831336975,-0.000744261255022138,0
    upd:g_team = 0
    upd:g_squad = 0
    upd:g_group = 0

    ; cse_alife_monster_abstract properties

    upd:next_game_vertex_id = 65535
    upd:prev_game_vertex_id = 65535
    upd:distance_from_point = 0
    upd:distance_to_point = 0

    ; cse_alife_human_abstract properties
    predicate5 = 1,0,0,2,1
    predicate4 = 1,1,0,1

    ; cse_ph_skeleton properties

    upd:start_dialog = 

    ; se_stalker properties


    [16]
    ; cse_abstract properties
    section_name = stalker
    name = sv_st_smart_terrain01
    position = 219.50959777832,-1.94939196109772,178.110565185547
    direction = -0.327957004308701,0,0.944693028926849

    ; cse_alife_trader_abstract properties
    money = 5000
    character_profile = esc_stalker_novice

    ; cse_alife_object properties
    game_vertex_id = 378
    distance = 4.19999980926514
    level_vertex_id = 354113
    object_flags = 0xffffffbf
    custom_data = <<END
    [smart_terrains]
    sv_st_smart_terrain = true 
    END

    ; cse_visual properties
    visual_name = actors\novice\green_stalker_2

    ; cse_alife_creature_abstract properties
    g_team = 0
    g_squad = 0
    g_group = 0
    health = 1
    dynamic_out_restrictions = 
    dynamic_in_restrictions = 

    upd:health = 1
    upd:timestamp = 0
    upd:creature_flags = 0
    upd:position = 219.50959777832,-1.94939196109772,178.110565185547
    upd:o_model = 0
    upd:o_torso = 0.533530831336975,-0.000744261255022138,0
    upd:g_team = 0
    upd:g_squad = 0
    upd:g_group = 0

    ; cse_alife_monster_abstract properties

    upd:next_game_vertex_id = 65535
    upd:prev_game_vertex_id = 65535
    upd:distance_from_point = 0
    upd:distance_to_point = 0

    ; cse_alife_human_abstract properties
    predicate5 = 1,0,0,2,1
    predicate4 = 1,1,0,1

    ; cse_ph_skeleton properties

    upd:start_dialog = 

    ; se_stalker properties


    [17]
    ; cse_abstract properties
    section_name = stalker
    name = sv_st_smart_terrain02
    position = 220.50959777832,-1.94939196109772,179.110565185547
    direction = -0.327957004308701,0,0.944693028926849

    ; cse_alife_trader_abstract properties
    money = 5000
    character_profile = esc_stalker_novice

    ; cse_alife_object properties
    game_vertex_id = 378
    distance = 4.19999980926514
    level_vertex_id = 354113
    object_flags = 0xffffffbf
    custom_data = <<END
    [smart_terrains]
    sv_st_smart_terrain = true 
    END

    ; cse_visual properties
    visual_name = actors\novice\green_stalker_2

    ; cse_alife_creature_abstract properties
    g_team = 0
    g_squad = 0
    g_group = 0
    health = 1
    dynamic_out_restrictions = 
    dynamic_in_restrictions = 

    upd:health = 1
    upd:timestamp = 0
    upd:creature_flags = 0
    upd:position = 220.50959777832,-1.94939196109772,179.110565185547
    upd:o_model = 0
    upd:o_torso = 0.533530831336975,-0.000744261255022138,0
    upd:g_team = 0
    upd:g_squad = 0
    upd:g_group = 0

    ; cse_alife_monster_abstract properties

    upd:next_game_vertex_id = 65535
    upd:prev_game_vertex_id = 65535
    upd:distance_from_point = 0
    upd:distance_to_point = 0

    ; cse_alife_human_abstract properties
    predicate5 = 1,0,0,2,1
    predicate4 = 1,1,0,1

    ; cse_ph_skeleton properties

    upd:start_dialog = 

    ; se_stalker properties

     

    Аллспавн вай_локация:

    Спойлер

     

    [sv_st_smart_terrain_dva_walk]
    points = p0,p1
    p0:name = wp00
    p0:position = 220.283889770508,-2.02869510650635,175.384140014648
    p0:game_vertex_id = 378
    p0:level_vertex_id = 355513
    p0:links = p1(1)

    p1:name = wp01
    p1:position = 232.254119873047,-1.04941594600677,167.089828491211
    p1:game_vertex_id = 381
    p1:level_vertex_id = 368817
    p1:links = p0(1)


    [sv_st_smart_terrain_moy_sleep]
    points = p0,p1
    p0:name = wp00
    p0:position = 214.50959777832,-1.94939196109772,173.110565185547
    p0:game_vertex_id = 378
    p0:level_vertex_id = 354113

    p1:name = wp01
    p1:position = 214.50959777832,-1.94939196109772,172.110565185547
    p1:game_vertex_id = 378
    p1:level_vertex_id = 354113
    p1:links = p0(1)


    [sv_st_smart_terrain_odin_walk]
    points = p0,p1,p2
    p0:name = wp00
    p0:position = 216.906387329102,-1.92757797241211,175.720275878906
    p0:game_vertex_id = 378
    p0:level_vertex_id = 353756
    p0:links = p1(1)

    p1:name = wp01
    p1:position = 203.708618164063,-1.05473899841309,171.603408813477
    p1:game_vertex_id = 378
    p1:level_vertex_id = 345806
    p1:links = p2(1)

    p2:name = wp02
    p2:position = 204.927429199219,-2.01750707626343,180.354019165039
    p2:game_vertex_id = 378
    p2:level_vertex_id = 346710
    p2:links = p0(1)


    [sv_st_smart_terrain_pole_kamp]
    points = p0
    p0:name = wp00|s=state
    p0:position = 216.50959777832,-1.94939196109772,175.110565185547
    p0:game_vertex_id = 378
    p0:level_vertex_id = 354113

     


     

    gulag_локация.script:

    Спойлер

     

    local t = {}

    function load_job(sj, gname, type, squad, groups)
    --'--------------------------------------------------------------------------    
    --' GARBAGE
    --'--------------------------------------------------------------------------    

    -----первый---------
     if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker1",
    idle = 0,
    prior = 5, state = {0}, ---работа днем первого нпс--------
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_kamp1",
    idle = 0,
    prior = 5, state = {1},     ---работа ночью первого нпс---
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    ----------второй-----------

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker2",
    idle = 0,
    prior = 5, state = {0},  ----работа днем второго нпс----
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_kamp2",
    idle = 0,
    prior = 5, state = {1},   ----работа ночью второго нпс -----
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    ------третий-------------

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_walker3",
    idle = 0,
    prior = 5, state = {0},        --- работа  днем третьего нпс----
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end

    if type == "sv_st_smart_terrain" then
    t = { section = "logic@sv_st_smart_terrain_sleeper",
    idle = 0,
    prior = 5, state = {1},  ---работа ночью третьего нпс---
    online = true,
    in_rest = "", out_rest = "",
    }
    table.insert(sj, t)
    end
        
        
    end


    function load_states(gname, type)
        
        
        -----
        
    if type == "sv_st_smart_terrain" then
    return function(gulag)
    if db.actor ~= nil then
    if ( level.get_time_hours() >= 5 and level.get_time_hours() <= 22 ) then
    return 0 -- день
    else
    return 1 -- ночь
    end
    else
    return gulag.state
    end
    end
    end
        
        
    end

    --------------------------------------------------------------------------
    -- Dynamic ltx
    --------------------------------------------------------------------------
    function load_ltx(gname, type)
        return nil
    end

    function checkStalker(npc_community, gulag_type, npc_rank, se_obj)
        
        
        ------------
        
        if gulag_type == "sv_st_smart_terrain" then
    return npc_community == "stalker"
    end

        
        return false
    end

     

    gulag_локация.ltx в config/misc

    Спойлер

     

    ;-- сталкер1 walker первый -> состояние 0, днем)
    [logic@sv_st_smart_terrain_walker1]
    active = walker@odin_hodit
    on_hit = hit_w 

    [hit_w]
    on_info = %=zasada_spawn%

     
    [walker@odin_hodit]
    path_walk         = odin_walk
    danger            = danger_condition
    def_state_moving1 = patrol
    def_state_moving2 = patrol
    def_state_moving3 = patrol
    meet = meet
     
    ;-- сталкер1 kamp первый -> состояние 1, ночью)
    [logic@sv_st_smart_terrain_kamp1]
    active = kamp@odin_sidit
    on_hit = hit_k 

    [hit_k]
    on_info = %=zasada_spawn%
     
    [kamp@odin_sidit]
    center_point = pole_kamp
    meet = no_meet
     ----------------------------------------------------------------
    ;-- сталкер2 walker второй -> состояние 0, днем)
    [logic@sv_st_smart_terrain_walker2]
    active = walker@dva_hodit
     
    [walker@dva_hodit]
    path_walk         = dva_walk
    danger            = danger_condition
    def_state_moving1 = patrol
    def_state_moving2 = patrol
    def_state_moving3 = patrol
    meet = meet
     
    ;-- сталкер2 kamp второй -> состояние 1, ночью)
    [logic@sv_st_smart_terrain_kamp2]
    active = kamp@dva_sidit
     
    [kamp@dva_sidit]
    center_point = pole_kamp
    meet = no_meet
     ----------------------------------------------------------------------------
     ;-- сталкер3 walker третий -> состояние 0, днем)
    [logic@sv_st_smart_terrain_walker3]
    active = kamp@tri_sidit
     
    [kamp@tri_sidit]
    center_point = pole_kamp
    meet              = meet 
     
     
    ;-- сталкер3 sleeper третий -> состояние 1, ночью)
    [logic@sv_st_smart_terrain_sleeper]
    active = sleeper@tri_slip
     
    [sleeper@tri_slip]
    path_main = moy_sleep
    wakeable  = false
    meet = no_meet

     

    В принципе всё. Соответственно либо создать своих новых нпс, либо использовать имеющихся. 

    Настойчиво повторяю просьбу - изучить материалы на сталкер-вики, там всё достаточно подробно расписано, а вот если что-то не получается, то можно и спросить, а не требовать всё готовое)


  20. 40 минут назад, Stalkervernite сказал:

    Привет всем.Кто знает как после диалога нпс нас вел куда-то?отгрывал инфопоршень и нпс шел куда-то.

    Так отправить его куда нужно, делов-то...

    Как пример:

    [logic] 
    active = walker@ts0 
    
    [walker@ts0]           
    path_walk = ts0_walk  ;;; -изначально непись находится в схеме walker@ts0 и стоит (лежит, сидит, поёт и т.д.) на своем месте в точке ts0_walk 
    path_look = ts0_look 
    on_info = {+dead_ser} walker@ts1  ;;;;  - после получения инфопоршня dead_ser переходит в схему walker@ts1
    
    [walker@ts1]             ;;; - после перехода в эту схему непись топает в точку ts1_walk
    path_walk = ts1_walk  
    path_look = ts1_look 

    а вообще можно сходить на вики  http://stalkerin.gameru.net/wiki/index.php?title=Настройка_логики._Часть_0 и почитать, там много интересного, а если что непонятно то и спросить можно)

     


  21. 34 минуты назад, РСФСР сказал:

    не, не работает - сталкер не появляется онлайн. У тебя работы как выглядят? Оффлайн работа есть?

    Да, есть и все нормально работают. 

    Спойлер

     

    
    --' Вояки 
    
    -------------------ходуны-------------------------
    
    if type == "voin_tochka_n" then	
    	t = { section = "logic@pri_voin_avto_walker_3",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_4",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_5",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
                table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_6",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    
    -------------------------сидячие------------------------------
    
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    	    prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    		prior = 5, state = {0,1},
    			online = true,
    		in_rest = "voin_baza_stop", out_rest = ""
    	}
    	table.insert(sj, t)
    	
    	--------------патруль------------------
    
    
    		t = { section = "logic@pri_voin_avto_raid1",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid11",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid12",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid2",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid21",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid22",
    			idle = 0,
    			prior = 10, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid13",
    			idle = 0,
    			prior = 10, state = {1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid23",
    			idle = 0,
    			prior = 10, state = {1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)		
    		t = { section = "logic@pri_voin_avto_sonja1",
    			idle = 0,
    			prior = 7, state = {0,1},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_sonja2",
    			idle = 0,
    			prior = 10, state = {0},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_sonja3",
    			idle = 0,
    			prior = 10, state = {0},
    			online = true,
    			in_rest = "voin_baza_stop", out_rest = ""
    		}
    		table.insert(sj, t)
    		
    --------------оффлайн-----------------------
    
            	t = { section = "logic@pri_voin_avto_walker_3",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_4",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_5",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
                table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_walker_6",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    
    -------------------------сидячие------------------------------
    
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    	    prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    	t = { section = "logic@pri_voin_avto_kamp_sidim",
    		idle = 0,
    		prior = 5, state = {2},
    			online = false,
    		in_rest = "", out_rest = ""
    	}
    	table.insert(sj, t)
    	
    	--------------патруль------------------
    
    
    		t = { section = "logic@pri_voin_avto_raid1",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid11",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid12",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid2",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid21",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid22",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid13",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_raid23",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)		
    		t = { section = "logic@pri_voin_avto_sonja1",
    			idle = 0,
    			prior = 7, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_sonja2",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		t = { section = "logic@pri_voin_avto_sonja3",
    			idle = 0,
    			prior = 10, state = {2},
    			online = false,
    			in_rest = "", out_rest = ""
    		}
    		table.insert(sj, t)
    		
    	end

     

     

     

    Попробуй для начала оставить здеь один инфопоршень и проверить сам гулаг, может что-то тут не сходится:

    if not has_alife_info("tutorial_wounded_end") or not has_alife_info("tutorial_wounded_die") or not has_alife_info("tutorial_wounded_death") or has_alife_info("agroprom_military_case_have") then

  22. В 02.07.2023 в 14:56, N42 сказал:

    frankenshtayn

      Показать контент

    function est_npc()
        local tbl_npc_sid = {
                            441,
                            442,
                            443,
                            444,
                            445,
                            446
                        }
                        

        local est_npc = false

        for i,v in ipairs(tbl_npc_sid) do
            local npc = alife():story_object(v)
                if npc then
                    est_npc = true
                        break
                end
        end

            return est_npc
    end

    Вернет true если есть нпс с сидом из таблички

     

    Спасибо, попробую)

    3 часа назад, РСФСР сказал:

    В ТЧ создал гулаг с одним сталкером, 

    Я уже точно не помню, но вроде return 0 - переключает на  день, return 1 - на ночь, а return 2 в оффлайн. Во всяком случае у меня гулаг работает нормально вот с таким кодом:

        if type == "voin_tochka_n" then
            return function(gulag)
                local actor = db.actor
                if not actor then
                    return gulag.state
                end
                if not has_alife_info("start_gl_voin") then
                    return 2 -- offline
                else
                if ( level.get_time_hours() >= 6 and level.get_time_hours() <= 22 ) then
                     return 0 -- день
                     else
                     return 1 -- ночь            
                end
                return gulag.state
            end    
            end    
            end

     


  23. 21 минуту назад, Stalkervernite сказал:

    frankenshtayn В том то и дело,как саму функцию вызвать,можешь скрипт написать

    Любым удобным способом. Можно из рестриктора, из другой функции, при выдаче инфопоршня и т.д...

    из рестриктора, при попадании в него гг:

    [logic]
    active = sr_idle
     [sr_idle]
    on_actor_inside = %=game_credits%

    из инфопрошня (выдать инфо любым удобным способом):

    <info_portion id="game_over">                    
    <action>xr_effects.game_credits</action>
    </info_portion>

    из другой функции:

    local pos_rem = vector():set(913.599975585938,-0.100000001490116,-353.950012207031)
    local particle_rem = particles_object([[anomaly2\teleport_out_00]])
    function par_aes_remont()
    particle_rem:play_at_pos(pos_rem)
    xr_effects.game_credits()
    end

     

    • Лайк 1

  24. 21 час назад, N42 сказал:

    frankenshtayn я правильно понял, есть 6 равнозначных нпс, и если осталось 2 любых - они удаляются? 

    Есть 6 нпс, двое из них с увеличенным иммунитетом. По сюжету гг с этими нпс проходит определенный маршрут с несколькими боёвками, затем переходят на другую локацию, затем после дохождения до нужной точки все телепортируются.

    Соответственно в зависимости от прохождения, на локацию где все телепортируются могут дойти как все шесть, так и пять, и четыре и три и два (двое доходят обязательно). Далее, после диалога со всеми дошедшими они идут в телепорт и удаляются.

    После того, как все нпс удалены необходимо, запустить функцию. Т.е. отследить, есть ли на локации эти нпс, и если их нет, то запускаем нужную функцию.

    В принципе всё это реализовано и работает, но как я уже говорил, хотелось бы сделать проверку отсутствия этих нпс на локации одной функцией.


    Дополнено 10 минуты спустя
    38 минут назад, Stalkervernite сказал:

    Привет всем,знаете как после выдачи инфопоршня нас перебрасывала в титры

    Нужно вызвать функцию game_credits из xr_effects.script и запустятся титры

    • Лайк 1