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

Сергей Шубин

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

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

  • Посещение

Сообщения, опубликованные Сергей Шубин


  1. Добрый день.  Возник вопрос.  Есть функция 

    function killed_by_actor(actor, npc)
        local t = db.storage[npc:id()].death
        local killed_by_actor = t ~= nil and t.killer == actor:id()
        printf("_bp: killed_by_actor: %s", if_then_else(killed_by_actor, "true", "false"))
        return killed_by_actor
    end

    В СГМ есть бомбы с дистанционным подрывом.  Я сделал похожие бомбы в чистой игре. Они отлично работают.  Но в зачет не идут.  Как доработать функцию, чтобы она срабатывала на бомбу?  

    Бомба.  У бомбы есть СТОРИ-ИД.


    [remote_explosive_bomb_1]:explosive_grenade
    $spawn                 = "devices\remote_explosive_bomb_1"
    story_id             = remote_explosive_bomb_1
    visual                = dynamics\devices\dev_bomb_c4\bomb_c4.ogf
    explode_particles    = explosions\explosion_barrel
    blast                = 6.5
    blast_r                = 15.0
    frags                = 50
    frags_r                = 25.0
    frag_hit            = 1.5

     

     

     


  2. 23 минуты назад, AziatkaVictor сказал:

    makdm простите, если глупый вопрос, но писать через exclusive вот так?

    
    [exclusive]
    имя_сквада				= путь к логике

    Я правильно понял?

    Нет.

     

    Пример - смарт наемников Тесака из Зова Припяти.

    [smart_terrain];zat_b103_merc_smart
    squad_id = 50
    max_population = 3
    ;safe_restr = zat_b103_sr_safety_zone
    def_restr = zat_b103_sr_def_restr

    [exclusive]
    lost_merc_leader = zaton\zat_b103_lost_merc_leader.ltx
    lost_merc_1 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_2 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_3 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_4 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_5 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_6 = zaton\zat_b103_lost_mercs.ltx
    lost_merc_7 = zaton\zat_b103_lost_mercs.ltx

    В данном смарте 8 эксклюзивных работ для 8 НПС.

    В файлах логики - ссылки выше - логика НПС.

     

    [logic@lost_merc_leader]
    suitable   = {=check_npc_name(zat_b103_lost_merc_leader) !surge_started}
    active     = walker@leader
    prior      = 200
    on_death = death 

    На эту работу встанет НПС с определенным именем.  Если поменяете условие, как выше писал Дмитрий, то на работу встанет НПС из определенного сквада.

     

    • Спасибо 1

  3. В 23.09.2020 в 09:03, Winzor сказал:

    Есть ли мод на потребность сна у ГГ? Желательно на версию 1.6.02

    Я делал так. Взял функции из СГМ.

     

    Спойлер


    _g.scripts

    -- 'Прибавить к pstor-счетчику цифру.
    function Inc_Counter(counter_name,add_value)
        if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end
        if add_value==nil then add_value=1 end
        if Read_Variable(counter_name)~=nil then
            local counter=Read_Variable(counter_name)
            Write_Variable(counter_name,counter+add_value)
        end
    end

    -- 'Отнять от pstor-счетчика цифру.
    function Dec_Counter(counter_name,add_value)
        if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end
        if add_value==nil then add_value=1 end
        if Read_Variable(counter_name)~=nil then
            local counter=Read_Variable(counter_name)
            Write_Variable(counter_name,counter-add_value)
        end
    end

    -- 'Запись pstor переменной.
    function Write_Variable(params_name,value)
        if value==nil then
            Clear_Variable(params_name)
        else
            local opt=Reload_Params(params_name)
            Pstor_Store(db.actor,opt,value)
        end
    end

    -- 'Чтение pstor переменной.
    function Read_Variable(params_name)
        local opt=Reload_Params(params_name)
        return Pstor_Retrieve(db.actor,opt)
    end

    -- 'Удаление pstor переменной.
    function Clear_Variable(params_name)
        local opt=Reload_Params(params_name)
        if db.storage[db.actor:id()].pstor[opt] then
            db.storage[db.actor:id()].pstor[opt]=nil
        end
    end

    function Pstor_Store(obj,varname,val)
        if obj==nil then return nil end
        local sub_id=obj:id()
        if db.storage[sub_id].pstor==nil then
            db.storage[sub_id].pstor={}
        end
        db.storage[sub_id].pstor[varname]=val
    end
    function Pstor_Retrieve(obj,varname)
        if obj==nil then return nil end
        local sub_id=obj:id()
        if db.storage[sub_id].pstor~=nil then
            local val=db.storage[sub_id].pstor[varname]
            if val~=nil then
                return val
            end
        end
        return nil
    end
    function Reload_Params(params)
        return params
    end

    2. bind_stalker.scripts

    Вызов всего процесса.

        self:check_detective_achievement()
        self:check_mutant_hunter_achievement()

        self:actor_universal_binder()

    function actor_binder:actor_universal_binder()
        if self.actor_universal_binder_time == nil then
            self.actor_universal_binder_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.actor_universal_binder_time) > 10 then
            actor_sleep_control()
            self.actor_universal_binder_time = game.get_game_time()
        end
    end

    function actor_sleep_control()
        if Read_Variable("actor_active_time") == nil then
            Write_Variable("actor_active_time",0)
        else
            Inc_Counter("actor_active_time")
        end
        actor_sleep_control2()
    end

    function actor_sleep_control2()
        if Read_Variable("actor_active_time") == nil then
            Write_Variable("actor_active_time",0)
        end
        if Read_Variable("actor_active_time") > 20*60*6 and Read_Variable("actor_active_time") < 21*60*6 then
            local rnd_ppe11=math.random(1,12)
            local rnd_ppe12=math.random(1,12)
            if rnd_ppe11==1 then
                level.add_pp_effector("shock_hit.ppe",91350,false)
            end
            if rnd_ppe12==1 then
                level.add_pp_effector("surge_shock.ppe",331510,false)
            end
            if db.actor.power > 0.8 then db.actor.power = 0.8 - db.actor.power end
        end
        if Read_Variable("actor_active_time") > 21*60*6 and Read_Variable("actor_active_time") < 22*60*6 then
            local rnd_ppe21=math.random(1,10)
            local rnd_ppe22=math.random(1,10)
            if rnd_ppe21==1 then
                level.add_pp_effector("actor_hit.ppe",91350,false)
            end
            if rnd_ppe22==1 then
                level.add_pp_effector("surge_shock.ppe",331510,false)
            end
            if db.actor.power > 0.6 then db.actor.power = 0.6 - db.actor.power end
        end
        if Read_Variable("actor_active_time") > 22*60*6 and Read_Variable("actor_active_time") < 23*60*6 then
            local rnd_ppe31=math.random(1,8)
            local rnd_ppe32=math.random(1,8)
            local rnd_ppe33=math.random(1,8)
            if rnd_ppe31==1 then
                level.add_pp_effector("actor_hit.ppe",510,false)
            end
            if rnd_ppe32==1 then
                level.add_pp_effector("shock_hit.ppe",91350,false)
            end
            if rnd_ppe33==1 then
                level.add_pp_effector("deimos1.ppe",11315,false)
            end
            if db.actor.power > 0.4 then db.actor.power = 0.4 - db.actor.power end
        end
        if Read_Variable("actor_active_time") > 23*60*6 and Read_Variable("actor_active_time") < 24*60*6 then
            local rnd_ppe41=math.random(1,6)
            local rnd_ppe42=math.random(1,6)
            local rnd_ppe43=math.random(1,6)
            if rnd_ppe41==1 then
                level.add_pp_effector("shock_hit.ppe",91350,false)
            end
            if rnd_ppe42==1 then
                level.add_pp_effector("actor_hit.ppe",510,false)
            end
            if rnd_ppe43==1 then
                level.add_pp_effector("deimos1.ppe",11315,false)
            end
            if db.actor.power > 0.2 then db.actor.power = 0.2 - db.actor.power end
        end
        if Read_Variable("actor_active_time") > 24*60*6 then
            xr_effects.disable_ui(db.actor, nil)
            level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback")
            level.add_pp_effector("sleep_fade.ppe", 11, false)
            db.actor:give_info_portion("actor_is_sleeping")
            _G.mus_vol = get_console():get_float("snd_volume_music")
            _G.amb_vol = get_console():get_float("snd_volume_eff")
            get_console():execute("snd_volume_music 0")
            get_console():execute("snd_volume_eff 0")
            surge_manager.resurrect_skip_message()
            Write_Variable("actor_active_time",19*60*6)
        end
    end

    function dream_callback()
        level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback2")
        local hours = math.random(6,10)
        level.change_game_time(0,hours,0)
        level_weathers.get_weather_manager():forced_weather_change()
        surge_manager.get_surge_manager().time_forwarded = true
        if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then
            level.stop_weather_fx()
    --        level_weathers.get_weather_manager():select_weather(true)
            level_weathers.get_weather_manager():forced_weather_change()
        end
        db.actor.power = 1
        printf("dream_callback: time forwarded on [%d]", hours)
        Write_Variable("actor_active_time",0)
    end

    function dream_callback2()
        xr_effects.enable_ui(db.actor, nil)
        get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
        get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
        _G.amb_vol = 0
        _G.mus_vol = 0
        db.actor.power = 1
        db.actor:give_info_portion("tutorial_sleep")
        disable_info("actor_is_sleeping")
        disable_info("sleep_active")
    end

    3. ui_sleep_dialog.scripts

    function dream_callback()
        level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "ui_sleep_dialog.dream_callback2")
        local hours = sleep_control.time_track:GetIValue()
        level.change_game_time(0,hours,0)
        level_weathers.get_weather_manager():forced_weather_change()
        surge_manager.get_surge_manager().time_forwarded = true
        if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then
            level.stop_weather_fx()
    --        level_weathers.get_weather_manager():select_weather(true)
            level_weathers.get_weather_manager():forced_weather_change()
        end
        db.actor.power = 1
        printf("dream_callback: time forwarded on [%d]", hours)
        if Read_Variable("actor_active_time") == nil then
            Write_Variable("actor_active_time",0)
        end
        if hours >= 6 then
            Write_Variable("actor_active_time",0)
        else
            if Read_Variable("actor_active_time") > hours*60*6 then
                Dec_Counter("actor_active_time",hours*60*6)
            else
                Write_Variable("actor_active_time",0)
            end
        end
    end


    4. xr_effects.scripts


    function set_game_time(actor, npc, p)
        local real_hours = level.get_time_hours()
        local real_minutes = level.get_time_minutes()
        local hours = tonumber(p[1])
        local minutes = tonumber(p[2])
        if p[2] == nil then
            minutes = 0
        end
        local hours_to_change = hours - real_hours
        if hours_to_change <= 0 then
            hours_to_change = hours_to_change + 24
        end
        local minutes_to_change = minutes - real_minutes
        if minutes_to_change <= 0 then
            minutes_to_change = minutes_to_change + 60
            hours_to_change = hours_to_change - 1
        elseif hours == real_hours then
            hours_to_change = hours_to_change - 24
        end
        level.change_game_time(0,hours_to_change,minutes_to_change)
        level_weathers.get_weather_manager():forced_weather_change()
        surge_manager.get_surge_manager().time_forwarded = true
        printf("set_game_time: time changed to [%d][%d]", hours_to_change, minutes_to_change)
        if Read_Variable("actor_active_time") == nil then
            Write_Variable("actor_active_time",0)
        end
        Inc_Counter("actor_active_time",hours_to_change*60*6+minutes_to_change*6)
    end

    function forward_game_time(actor, npc, p)
        if not p then
            abort("Insufficient or invalid parameters in function 'forward_game_time'!")
        end

        local hours = tonumber(p[1])
        local minutes = tonumber(p[2])

        if p[2] == nil then
            minutes = 0
        end
        level.change_game_time(0,hours,minutes)
        level_weathers.get_weather_manager():forced_weather_change()
        surge_manager.get_surge_manager().time_forwarded = true
        printf("forward_game_time: time forwarded on [%d][%d]", hours, minutes)
        if Read_Variable("actor_active_time") == nil then
            Write_Variable("actor_active_time",0)
        end
        Inc_Counter("actor_active_time",hours*60*6+minutes*6)
    end

    function sleep(actor, npc)
        local sleep_zones = {
            "zat_a2_sr_sleep",
            "jup_a6_sr_sleep",
            "pri_a16_sr_sleep",
            "actor_surge_hide_2"
        }
        for k,v in pairs (sleep_zones) do
            if utils.npc_in_zone(db.actor, db.zone_by_name[v]) then
                if Read_Variable("actor_active_time") == nil then
                    Write_Variable("actor_active_time",0)
                end
                if Read_Variable("actor_active_time") > 12*60*6 then
                    ui_sleep_dialog.sleep()
                    give_info("sleep_active")
                else
                    game.start_tutorial("actor_no_sleep_use")
                end
            end
        end
    end
     

     

    • Спасибо 1

  4. 1 час назад, Stgs сказал:

    В основном жалуется на несвязанные друг с другом участки нодов:

    Что странно, учитывая то, что подобные места были и на оригинальных локациях трилогии. Крыши со снайперами, например.

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


  5. Stgs 

    Если верить Яндексу

    Спойлер

     

    ! Cannot build GAME path! (object esc_tutorial_wounded0826) !

    CURRENT LEVEL : escape !

    CURRENT game point position : [-146.011078][-20.711269][-147.502380]

    FATAL ERROR [error]Expression : I != levels().end() [error]Function : GameGraph::CHeader::level [error]File : f:\project\home\stalker\borscht\src_engine\xray\xrgame\game_graph_inline.h [error]Line : 153 [error]Description : there is no specified level in the game graph : 205

    Такая ошибка возникла после того, как была прервана компиляция ИИ-сетки. Видимо, испортился игровой граф, нужно перекомпилировать его (xrAI -f)

     

    Проверь, что не так в точках, на которые ругается консоль.

    • Мастер! 1

  6. Igor_Misery 

    В 03.09.2020 в 22:04, Igor_Misery сказал:

    Разработчики на текстуры натянули маску "БУДЕТ УДАЛЕНО", которую не видно, если открыть текстуру. Что делать?

     

    Просматривать текстуры в соответствующей программе.

    0997626001599160892.jpg

    Пример - crete_truba_ch.  Слева текстура из Зова Припяти.  Её украшает желтая надпись.  Справа текстура Чистого Неба - без надписи.  Нужно текстуру Зова Припяти заменить одноименной чистонебовской.

    • Спасибо 1

  7. 7 часов назад, Gerbys сказал:

    Создал файл логики в config/scripts (и в config/scripts/имя_локации пробовал), в spawn_sections прописал custom_data с путём к файлу логики. В чем может быть проблема?

    Не помешало бы сам файл логики выложить.


  8. Ҫвяҭѳӎӹшљ 

    Если воспользуетесь Яндексом, то узнаете, что

    default_to_ruck = false - значит, если при пустой ячейке под автомат, подобрать автомат он будет помещён в ячейку; если true автомат в ячейку помещён не не будет.


  9. Gerbys 

    Это не тот sr_sleep.  Это файл логики спального места.  Раз у вас надпись появляется, значит с логикой всё нормально.  Дальше надо проверять game_tutorial из папки gamedata/configs/ui и xr_effects из папки gamedata/scripts.  В каком то из них сбой.  Предполагаю, что в game_tutorial.  Он, вероятнее всего, не вызывает функцию сна из xr_effects.  Без запятой игра, вероятнее всего, вылетела бы.


  10. 28 минут назад, Gerbys сказал:

     

     local sleep_zones = {
                            "raz_sleep_1"
                            "zat_a2_sr_sleep",

    В функции прямо так и написано?

    "raz_sleep_1"
                            "zat_a2_sr_sleep",

     

    Должна быть запятая

    "raz_sleep_1",
                            "zat_a2_sr_sleep",


  11. 1 час назад, Gerbys сказал:

    Ещё вопрос. Необходимо сделать сквад враждебным после получения определённого инфопоршня. Однако через условия в relationship в настройках сквада этого сделать не получается..

    Как - то так.

    on_info = {+zat_b103_merc_fight}  %=set_squad_goodwill(zat_b103_lost_merc_squad1:enemy)%

    relationship кондлист не поддерживает.

    1 час назад, Gerbys сказал:

    Всё сделал по инструкции, есть надпись "Спать" в этом месте в игре, но при нажатии ничего не происходит

    Видимо, не все. Функция засыпания.

    Спойлер

     

    function sleep(actor, npc)
        local sleep_zones = {
                            "zat_a2_sr_sleep",
                            "jup_a6_sr_sleep",
                            "pri_a16_sr_sleep",
                            "actor_surge_hide_2"
                            }

        for k,v in pairs(sleep_zones) do
            if utils.npc_in_zone(db.actor, db.zone_by_name[v]) then
                ui_sleep_dialog.sleep()
                give_info("sleep_active")
            end
        end

    end

     

     

    • Спасибо 1

  12. 9 часов назад, detoxe сказал:

    Создать предмет - рюкзак ( на основе чего лучше сделать, пока не знаю)

     

    Если не редактировать движок, то есть следующие возможности влиять на грузоподъемность ГГ.

    1. Бустер - энергетик.  Выпили его, грузоподъемность повысилась.  Для рюкзака в принципе подходит.  Время действия ограничено.

    2. Костюм.  У костюма есть параметр, влияющий на переносимый вес.  Тут можно сделать примерно так.  Использовали вы свой рюкзак.  Прошла подмена бронекостюма через скрипт на похожий костюм с повышенной грузоподъемностью.  Будут сложности с переносом апгрейдов с костюма на костюм.

    3. Артефакт, влияющий на вес.  Рюкзак, который можно поставить в слот.  Зато никаких дополнительных проблем.

     

    Выберите один из вариантов и пробуйте.


  13. 5 часов назад, Крим сказал:

    Мне нужно, чтобы группа нпс, бандитов например, не трогала нпс другой группировки - сталкер, например?

    Можно сделать, как в СГМ.  Там даже три группировки бандитов.  Просто бандиты из оригинала - враги сталкерам, нейтралы к игроку.  bandit_enemy - враги ГГ и сталкерам. bandit_alies - нейтралы к сталкерам и ГГ.  Сделайте вашей группе отдельную группировку и пропишите нейтралитет.  


  14. 34 минуты назад, Крим сказал:

    Как убрать начальные заставки AMD, ATI, GSC?

    Заставки прописаны в intro_logo  в game_tutorials.   Они ниоткуда из скриптов не вызываются.  Значит, вызов движковый.

    Можно попробовать закоментировать содержимое intro_logo.  Или попробовать прописать свое.  Но тут нужна аккуратность.  Чтобы избежать вылетов.