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

Tolich

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

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

  • Посещение

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


  1. Как добавить новые предметы торговцам? Стандартный вариант дописать новые предметы в gamedata\configs\misc\trade\trade_jup_b202_stalker_barmen.ltx и trade_zat_b30_stalker_trader.ltx вроде не работает. На примере даже тех же батареек, дописал их в продажу, но они не появляются.


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

    Насколько реально добавить в gamedata\configs\mfs_team\mfs_weather_params.ltx  "Базовую дальность тумана для каждого уровня"?  По аналогии "[lowland_fog_params] ;Базовые высоты тумана в низинах для каждого уровня".

    Размер локаций на Кордоне, Свалке...  (т.е. в ранних уровнях STALKER) меньше, чем на Затоне и т.п. (т.е. в уровнях Зова Припяти) и настройки дальности тумана для Затона, не подходят для Кордона - горизонт будет четко выделяться.


  2. 10 часов назад, play375dimaj сказал:

    как сделать что бы сыч торговался биноклем и ножом в зп

    Добавить в gamedata\configs\misc\trade\trade_zat_b30_stalker_trader.ltx 
    нож - wpn_knife и бинокль - wpn_binoc  в соответствующие разделы.


  3. Как вариант, новый подвид зомби - слепые зомби. Вместо глаз, чёрные впадины. Появляются только ночью, обладают телепортацией. Как только они ощущают ваше присутствие вдалеке, они растворяются в воздухе и появляются рядом у вас за спиной. Голос зомби может быть изменен - внутренний, гортанный (в аудиоредакторе типа adobe audition делается не сложно).
    Можно вместо физического воздействия, сделать типа пси воздействие или что то подобное, главное атака на расстоянии.
    При появлении их в темноте, слышен характерный звук (наподобие Silent Hill), возможно это будет особый детектор или счётчик гейгера, главное звук характерный, отличающийся от других. Можно попробовать ещё добавить помигивание вашего фонарика, при их присутствии где то рядом.

    Спойлер

    4__1.thumb.jpg.45d08c27c266506dc75aca5b44148e68.jpg1_3.thumb.jpg.b90df94e80ab198bc1d9fd859eb64e6b.jpg

     


  4. Если не ошибаюсь, то до сих пор в зоне не реализованы мутанты комары. В камышах на локациях тишь да гладь. А ведь комаров много именно в камышах или на болотах.  Их сильная активность начинается перед заходом солнца и так на пол часа - час (проверено на азовском море и не раз). 

    Предполагаю такую реализацию: ГГ идет сквозь камыши, появляются характерные комариные звуки и экран начинает окрашиваться в красный цвет, падает шкала здоровья.  ГГ нужно использовать что то вроде крема против комаров или быстро пробежать-покинуть камыши (что то вроде этого).
    Чем не хоррор? ))

    • Жму руку 1

  5. 2 часа назад, ian98 сказал:

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

    Так и есть, 100% чистая правда ))    Я со своим модом ношусь уже несколько лет (не скажу сколько), кроме меня он и нахрен никому не нужен. Иногда прошу помощи, если "повезёт", то что то решается.. но в основном самому приходится искать-химичить-лепить ))

    • Мастер! 1
    • Спасибо 1

  6. Попытался адаптировать SGM 2.2 + G.S.W.R.   Загрузка доходит почти до конца "Клиент синхронизация" и чёрный экран.  Ошибка в логе..

    Спойлер

    * WARNING: player not logged in
    ! default LevelMap used for level[digger_stash]
    ! default LevelMap used for level[l04u_labx18]
    * phase time: 7076 ms
    * phase cmem: 577381 K
    * phase time: 18 ms
    * phase cmem: 577377 K
    * [win32]: free[3023704 K], reserved[172496 K], committed[998040 K]
    * [ D3D ]: textures[1749644 K]
    * [x-ray]: crt heap[577377 K], process heap[577377 K], game lua[83931 K], render[345 K]
    * [x-ray]: economy: strings[77324 K], smem[95595 K]
    ! Unknown command:  dump_infos
    ! Missing ogg-comment, file:  d:\stalker sigerous 2.2 - gswr\gamedata\sounds\radio_music\megafon_7.ogg
    stack trace:

    0023:0C2659CB XrGame.dll, CDialogHolder::`vftable'()
    0023:0BFBC5B8 XrGame.dll, CDialogHolder::CDialogHolder()
     

    Особенно важны последние две строчки. Это самая минимальная ошибка, которую мне удалось добиться. Просто обидно  (((
    Уже вроде всё что можно перелопатил в плане скрещивания. То что в G.S.W.R. внедрена погодная составляющая  Atmosfear - это супер! Причем урезанная: удалены секции для dark_ medium_ bright_ - они и нафиг не нужны.. короче оставлен один и назван gswr_

    Но догадываюсь, что адаптация у меня упирается в gamedata\scripts\bind_stalker.script  и в частности в фрагремнт

    Спойлер

        if not(primary_objects_filled) then
            pda.fill_primary_objects()
            primary_objects_filled = true
        end
        pda.fill_sleep_zones()
        --M.F.S. Team 
        --SWE
        --swe_debug.update() --Вкл\выкл swe_debug
    end

    Если после pda.fill_sleep_zones()  вставлять строки из любых других модов, то видимо происходит конфликт и чёрный экран. 
    Так же не получилось скрестить fallout_manager.script из SGM c G.S.W.R.  там разная скриптовая составляющая (извиняюсь, если не правильно выражаюсь.. я в скриптах только копи-паст).

    В общем печальный результат. ((   Но пока сборку SGM-G.S.W.R. у себя не удаляю, надеюсь может кто то ещё осилит. 
     


  7. Доброго дня!  Редактор погоды - просто шикарная вещь!!.  Эх.. такую бы фишку, да на лет эдак 4-5 назад. ))   

    Но я так понимаю, что секции погоды корректно редактируются, которые идут в процессе (в данный момент) и плюс на 3-5 часов вперед или назад.  Самому выбрать (по желанию) любую секцию и редактировать в игре не получится?.

    Ещё бы (желательно) добавить возможность при активации панелек (определённого цветового параметра), переводить ползунок не только мышью, но стрелками влево-вправо (типа нажал мышью на нужную панельку и стрелки паралельно с мышью активны). Особенно это актуально для тумана на низинах (там небольшая погрешность в цветовой гаме - и "фасон уже не тот").
    Ну и также (немного неудобно) остановить-вернуть время именно в стандартное (игровое). Мышкой не получается (так и хочется стрелками влево-вправо добить нужные цифры).

    Это так, вроде пожеланий.  Удачи Вам в дальнейшем совершенствовании и улучшении, да и в жизни в общем! :))

    • Спасибо 1

  8. Siderous mod 2.2 +Atmosfear 3 (адаптация под SGM 2.2). 
    Вопрос такой: При выбросе..
    1. Резко меняется небо. Происходит резкий переход на другой скайбокс, другой секции погоды, но не на скайбокс начала выброса (из Atmosfear 3).
    2. Далее всё как обычно (как и в Atmosfear 3): звук сирены, предупреждение сталкеров...
    3. Далее начинается выброс и идёт оранжево-красная волна (как и в Atmosfear 3).

    При этом скайбоксы секции погоды не меняются. Солнце или луна стоят на небе (в Atmosfear 3 они всегда "убегают" перед началом выброса). В итоге до конца выброса, скайбоксы из папки gamedata\textures\sky\af3_blowout\..   так и не подгружаются.

    В чём может быть причина и есть ли решение? Может кто нибудь сталкивался с подобным?

    Записал коротенький фрагмент. Там видно, как солнце начинает перемещаться (согласно Atmosfear 3) и потом резко оставливается чуть правее. В итоге скайбоксы выброса не подгружаются.

    Спойлер

     

     


  9. Всем привет! У меня стоит Siderous mod 2.2 +Atmosfear 3 (адаптация под SGM 2.2).  Вопрос такой: При выбросе..
    1. Резко меняется небо. Происходит резкий скачёк на любой другой скайбокс другого состояния погоды, но не на скайбокс начала выброса из Atmosfear 3.
    2. Далее всё как обычно (как и в Atmosfear 3): звук сирены, предупреждение сталкеров...
    3. Далее начинается выброс и идёт оранжево-красная волна (как и в Atmosfear 3).

    При этом скайбоксы обычной погоды не меняются. Солнце или луна стоят на небе (в Atmosfear 3 они всегда "убегают" перед началом выброса). В итоге до конца выброса, скайбоксы из папки gamedata\textures\sky\af3_blowout\..   так и не появляются.

    В чём может быть причина и есть ли решение? Может кто нибудь сталкивался с подобным?


  10. 11 часов назад, yavaso сказал:

    Можно без правки в ЗП сделать такой лого загрузки?

    Тестура файла загрузки уровня, находится по адресу gamedata\textures\ui\textures\ui\ui_actor_loadgame_screen.dds  Вот и смотри что там тебе нужно править.

    11 часов назад, yavaso сказал:

    Как можно убрать 100 советов ?

    "Советы" находятся по адресу gamedata\configs\text\rus\ui_st_loadscreen.xml  Править можно блокнотом.

    11 часов назад, yavaso сказал:

    Есть ли улита для редактирования погоды прям в игре? 

    Открываешь папку gamedata\configs\environment\weathers\..  например default_clear.ltx (ясная погода)  и редактируешь настройки погоды на каждый час. Править можно блокнотом.
    Настроки частоты ясной погоды, дождливой, тумана и т.д.  по адресу  gamedata\configs\environmentdynamic_weather_graphs.ltx

    • Лайк 1

  11. В 01.11.2021 в 11:51, Tolich сказал:

    Есть у кого детекторы как бы в "пластиковых" корпусах? В игре они как бы в затертом алюминиевом корпусе.  Может кто то пробовал рисовать в фотошопе или эта идея уже реализована где то в модах.  Оттенок корпуса не важен, главное как бы "пластиковые" .bump текстуры.
     

    В общем как бы для себя решил этот вопрос..

    Спойлер

    Посмотрел на просторах инета моды на детекторы и остановился на моде анимационные детекторы из Diad Air от автора Ferr-um. Немного допилил под себя: поменял цветовую гамму детекторов (в более бледных тонах, ближе к окружению), цвета индикаторов и озвучку сканеров. Детекторы (кроме Отклика) в итоге в пластиковых корпусах.

    А  потом "Остапа понесло" ))  Захотелось цветовые варианты для каждой модели оставить в игре, решил сделать по три варианта для "Самодельного детектора", для "Отклик" и "Медведь".  Например три варианта детектора "Отклик" (название ДО от Детектор Отклик):
    ДО-1 обнаруживает самые простые арты (как у "Отклика" и есть по умолчанию),
    ДО-2 обнаруживает арты второго уровня (от детектора Медведь),
    ДО-3 редкие арты (от детектора Велес).

    Тогда бы сканирование отличалось не самой как бы моделью детектора (устаревший - не устаревший), а удобством самого сканирования. Например с детекторами Медведь ДМ-3, Отклик ДО-3 можно было бы искать редкие арты, бегая с пищалкой по локациям.  А почему бы и нет?!. ))

    Но у меня в итоге "что то пошло не так"..
    ДМ-3 и ДО-3 никак не хотят определять редкие арты и пришлось для них оставить увеличенную дальность сканирования (чем то они должны же отличаться от ДМ-1 и ДО-1) и оригинальное звучание для сканера (т.е. теперь звуки при обнаружении одного и того же арта, для каждой модели детекторов разные).

    13.thumb.jpg.fdf27682fcee0d9efde4216ab77d1bab.jpg14.thumb.jpg.a38aa9962bc84d1b536799ec4954fa05.jpg18.thumb.jpg.7c61f766413e26385fbb7c1608339ece.jpg

    Тестовый ролик можно посмотреть тут 


    Тестил в Sigerous 2.2. Может чего то там в gamedata\configs\misc\..  не досмотрел?!.  Попробую ещё потестить в Зове Припяти и ещё раз попробую прикрутить детекторы одной модели (например ДО-1, ДО-2, ДО-3) к разным видам артов.

     

     

     

     


  12. Зов Припяти? Sigeroud mod 2.2
    Как добавить в инвентарь шкалу выносливости (Чуть выше здоровья). Примерно так..

    Спойлер

    24_2.thumb.jpg.a644442f1f5f9d5f0e08c021db7eed20.jpg


    Править видимо надо gamedata\configs\ui\actor_menu_16.xml  и видимо код должен быть подобный как для шкалы здоровья, только перекрашено в синий.

    Спойлер

    <health_state x="11" y="31" width="171" height="16">
                <hint_text delay="800">st_ui_health_sensor</hint_text>
                <state_progress x="0" y="0" width="171" height="16" horz="1" min="0" max="1" pos="0">
                    <progress stretch="1">
                        <texture r="194" g="8" b="8" a="200">ui_inGame2_inventory_health_bar</texture>
                    </progress>
                </state_progress>
            </health_state>


    1. Не могли бы мне подсказать полный кусок кода и куда его ставить (в actor_menu_16.xml)? 
    2. Может ещё какие файлы в этом должны быть задействованы?

    По идее это должно помочь играть с чистым экраном (без худа), не считая оружия. Когда заглядываешь в рюкзак, видишь полоску здоровья, не хватает ещё выносливости.
     


  13. 4 часа назад, Hozar_2002 сказал:

    По идее это все что можно сделать (На вскидку)


    При загрузке новой игры получил вылет

    Спойлер

    [error]Expression    : !m_error_code
    [error]Function      : raii_guard::~raii_guard
    [error]File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
    [error]Line          : 748
    [error]Description   : ...call of pripyat\gamedata\scripts\bind_stalker.script:66: attempt to index global 'gunsl_thirst' (a nil value)


    То что я дописал в actor_menu.script

    Спойлер

    local last_mode = 0
    local current_mode = 0
    xr_meet_dialog_closed = false
    xr_meet_trade_closed = false
    xr_meet_upgrade_closed = false
    dead_body_searching = false
    function actor_menu_mode(mode)
            current_mode = mode
        if(mode==0) then
            if(last_mode==1) then
                inventory_wnd_closed()
            elseif(last_mode==2) then
                trade_wnd_closed()
            elseif(last_mode==3) then
                upgrade_wnd_closed()
            elseif(last_mode==4) then
                dead_body_search_wnd_closed()
            end
            last_mode = 0
        elseif(mode==1) then
            last_mode = 1
            inventory_wnd_opened()
        elseif(mode==2) then
            last_mode = 2
            trade_wnd_opened()
        elseif(mode==3) then
            last_mode = 3
            upgrade_wnd_opened()
        elseif(mode==4) then
            last_mode = 4
            dead_body_search_wnd_opened()
        elseif(mode==10) then
            dialog_wnd_showed()
        elseif(mode==11) then
            dialog_wnd_closed()
        end
    end

    function inventory_wnd_opened()
            give_info("inventory_wnd_opened")
        printf("---:>Inventory opened")
    end

    function inventory_wnd_closed()
            disable_info("inventory_wnd_opened")
        printf("---:>Inventory closed")
    end

    function trade_wnd_opened()
            give_info("inventory_wnd_opened")
        xr_meet_dialog_closed = false
        printf("---:>Trade opened")
    end

    function trade_wnd_closed()
            disable_info("inventory_wnd_opened")
        printf("---:>Trade closed")
        xr_meet_trade_closed = true
    end

    function upgrade_wnd_opened()
            give_info("inventory_wnd_opened")
        xr_meet_dialog_closed = false
        printf("---:>Upgrade opened")
    end

    function upgrade_wnd_closed()
            disable_info("inventory_wnd_opened")
        printf("---:>Upgrade closed")
        xr_meet_upgrade_closed = true
    end

    function dead_body_search_wnd_opened()
            give_info("inventory_wnd_opened")
        printf("---:>DeadBodySearch opened")
        dead_body_searching = true
    end

    function dead_body_search_wnd_closed()
            disable_info("inventory_wnd_opened")
        printf("---:>DeadBodySearch closed")
        dead_body_searching = false
    end

    function dialog_wnd_showed()
            give_info("inventory_wnd_opened")
        printf("---:>Talk Dialog show")
    end

    function dialog_wnd_closed()
            disable_info("inventory_wnd_opened")
        printf("---:>Talk Dialog hide")
        xr_meet_dialog_closed = true
    end

    function is_render_ui()
       if db.actor then
         local active = db.actor:active_item()
           if active and active:weapon_is_scope() 
              and db.actor:accuracy() * 1000 < 1 then
                 return false
           end
       end
       return current_mode == 0
    end


    .. и в gunsl_thirst.script

    Спойлер

    --gunsl_thirst.script
    --Description: реализация жажды и всего, что с ней связано
    --Creator: Sin!
    --Last Edit: 07 Mar 2020

    local PSTOR_THIRST_PARAM_NAME = "gunsl_thirst"

    local idle_decrement        =    0.00001    --уменьшение состояния в игровую секунду при идле; 0.00001 - хватит на 27.77 часов
    local move_decrement        =    0.00003    --при ходьбе, хватит примерно на 9 часов 
    local sprint_decrement        =    0.0001    --при беге, 2.7 часа

    local max_delta_time        =    5400    --время между двумя апдейтами не больше этого
    local sleep_decrement         =     0.3        --при сне более max_delta_time
    local teleport_decrement     =     0.15    --при телепорте/проводнике со сдвигом времени

    local bleeding_koef            =    0.0001    --дополнительное уменьшение состояние при кровотечении равном 1

    local health_decrement        =    0.00043 --минимальная величина, на которую будет уменьшаться здоровье за секунду в случае сильной жажды
    local power_decrement        =    0.00350    --минимальная величина, на которую будет уменьшаться выносливость за секунду в случае сильной жажды

    local ppe_rem_time            =    10000    --время, через которое удалится постэффект


    local ini = system_ini()
    local aid = db.actor:id()

    local lasttime
    local lastpos
    local thirst_indicator
    local thirst_ppe
    local pp_start_time
    local pp_startrem_time

    function OnItemUsed(sect)
        --Тут проверяем, является ли использованный предмет утолителем жажды. Если является - то улучшаем состояние актора.
        db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
        if ini:line_exist(sect, "thirst_factor") then
            local factor = ini:r_float(sect, "thirst_factor")
            db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] + factor
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]>1 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=1 end
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]<-0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=-0.15 end        
        end
    end

    function UpdateState(delta1)
        --вызывается из апдейта актора, тут анализируем его текущее состояние и в зависимости от него уменьшаем количество воды в организме.
        
        --убеждаемся, что количество воды в организме и последние данные корректны
        db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
        lasttime = lasttime or game.get_game_time()
        lastpos = lastpos or db.actor:position()
        
        local newtime = game.get_game_time()    
        local delta = newtime:diffSec(lasttime)
        local hit_allowed = true
        if delta>max_delta_time then
            --ограничиваем время - чтобы не убивало при сне/переходах
            delta = max_delta_time
            hit_allowed = false
        end
        local newpos = db.actor:position()
        local speed = newpos:distance_to(lastpos)/delta1
        speed = math.ceil(speed*10000)
        
        --уменьшаем количество воды, учитывая прошедшее время и состояние перемещения актора    
        if speed<6 then
            --сейчас мы в идле
            if hit_allowed then
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - idle_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement 
            end
        elseif speed<50 then
            --мы идём
            if hit_allowed then
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - move_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
            end
        else
            --мы бежим
            if hit_allowed then 
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sprint_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - teleport_decrement
            end
        end
        if db.actor.bleeding>0.005 then
            db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - bleeding_koef*db.actor.bleeding*delta
        end
        
        --проверим, не достигнуто ли критическое состояние
        if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < -0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = -0.15 end
        
        --Теперь будем назначать всякие нехорошие эффекты, если у нас критически малое содержание жидкости в организме
        if (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0.2) and hit_allowed then        
            --назначаем постпроцесс жажды/меняем его интенсивность в зависимости от её степени
            if thirst_ppe == nil then
                thirst_ppe = 13
                --level.add_pp_effector("contrast.ppe", thirst_ppe, true)
                level.add_pp_effector("black.ppe", thirst_ppe, true)
                level.set_pp_effector_factor(thirst_ppe, 0.001)
                pp_start_time = device():time_global()
            else
                local pp_factor = (1-((db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]+0.15)/0.35)^3)/2.5
                local pp_dt = device():time_global() - pp_start_time
                
                local phase = (math.sin(pp_dt / 1000)-0.66) * 5;
                if phase < 0 then 
                    phase = 0
                end;

                pp_factor = pp_factor * phase
                level.set_pp_effector_factor(thirst_ppe, pp_factor, 0.8)
            end
            
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0 then
                --Уменьшаем здоровье актора
                local hlth_factor = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * health_decrement*delta
                if db.actor.health+hlth_factor<0.005 then
                    if db.actor.health>0.004 then
                        db.actor.health = 0.004-db.actor.health                
                    end
                else
                    db.actor.health = hlth_factor            
                end
                
                db.actor.power = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * power_decrement*delta
            end
        else
            --Состояние улучшилоcь, удаляем постпроцесс
            if thirst_ppe~=nil then
                if pp_startrem_time==nil then
                    pp_startrem_time = device():time_global()
                    level.set_pp_effector_factor(thirst_ppe, 0, 0.4)
                end
                if device():time_global()-ppe_rem_time>pp_startrem_time then            
                    level.remove_pp_effector(thirst_ppe)
                    thirst_ppe = nil
                    pp_startrem_time = nil
                end
            end
        end

        --messenger.gwr_messenger(tostring(db.actor.bleeding), 100)
        --messenger.gwr_messenger(tostring(db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]), 100)
        
        lasttime = newtime
        lastpos = newpos    
    end

    function on_netspawn()
        thirst_indicator = gunsl_thirst_indicator()
        level.add_dialog_to_render(thirst_indicator)
    end

    function on_netdestroy()
        level.remove_dialog_to_render(thirst_indicator)
        thirst_indicator = nil    
    end

    --Индикатор жажды
    class "gunsl_thirst_indicator" (CUIScriptWnd)
    function gunsl_thirst_indicator:__init() super()
        local xml = CScriptXmlInit()
        xml:ParseFile("ui_gunsl_thirst_indicator.xml")
        self.main_static = xml:InitStatic("main_static", self)
    end

    function gunsl_thirst_indicator:Update()
        --Проверяем, надо ли вообще показывать что-то
        local curstate = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]
        if curstate==nil then 
            return
        end
        
        local hd = get_console():get_bool("hud_draw")
        
        local curfov = device().fov
        
        --log1(curfov) level.is_ui_shown() and need_hide_indicators
        
        --if (db.actor~=nil) and db.actor:alive() and level.is_ui_shown() and hd and level.get_game_difficulty()<game_difficulty.master and curfov>50 and xr_effects.ui_active_slot~=0 and travel_manager.init_time==nil and curstate < 0.7 then        
        if (db.actor~=nil) and db.actor:alive() and hd and (level.get_game_difficulty()<game_difficulty.master or  level.inventory_shown()) actor_menu.is_render_ui() and curstate < 0.7 then
            --Надо показывать
            self.main_static:Show(true)
            
            --***********************************************************************************
            --т.к. непонятно, как отловить скриптовое сокрытие движковых индикаторов худа, 
            --то просто покажем их принудительно
            --level.show_indicators()
            --***********************************************************************************        
            
            --Назначим текстуру в зависимости от текущего состояния
            if curstate > 0.5 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_green")
            elseif curstate > 0.3 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_yellow")
            elseif curstate > 0.1 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_orange")            
            else
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_red")
            end            
        else
            self.main_static:Show(false)
        end
    end


    Мой bind_stalker.script  (еще раз, на всякий случай)

    Спойлер

    function init(obj)
    xr_motivator.AddToMotivator(obj)
    end
    function actor_init(npc)
    npc:bind_object(actor_binder(npc))
    end
    game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }
    local weapon_hide = {}
    local primary_objects_filled = false
    ------------------------------------>
    class "actor_binder" (object_binder)
    ------------------------------------>
    function actor_binder:__init (obj) super(obj)
        self.bCheckStart = false
        self.weather_manager = level_weathers.get_weather_manager()
        self.surge_manager = surge_manager.get_surge_manager()
        self.last_level_name = nil
        self.deimos_intensity = nil
        self.loaded_active_slot = 3
        self.loaded_slot_applied = false
        self.last_detective_achievement_spawn_time     = nil
        self.last_mutant_hunter_achievement_spawn_time    = nil
        -- AtmosFear
        self.atmosfear=atmosfear.get_atmosfear()
        self.fallout_manager = fallout_manager.get_fallout_manager()

    end
    ------------------------------------>
    function actor_binder:net_spawn(data)
        level.show_indicators()
        self.bCheckStart = true
        self.weapon_hide = false
        self.weapon_hide_in_dialog = false
        weapon_hide = {}
        if object_binder.net_spawn(self,data) == false then
            return false
        end
        db.add_actor(self.object)
        db.actor.deimos_intensity = self.deimos_intensity
        self.deimos_intensity = nil
        if self.st.disable_input_time == nil then
            level.enable_input()
        end
        xr_s.on_game_load()
    --VSm
        VScallback.OnGameLoad()
    --VSm
        self.weather_manager:reset()
        death_manager.init_drop_settings()
        self.task_manager = task_manager.get_task_manager()
        self.spawn_frame = device().frame
        self.already_jumped = false
        self.loaded = false
        benchmark.main()                                      --' Distemper 06.2008 --
        
        ts_mod_cop.ts_on_net_spawn()    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_game_load()
            --/ SGM out
        --Gunslinger mod
        gunsl_thirst.on_netspawn()
        return true
    end
    ------------------------------------>
    function actor_binder:net_destroy()
        
        --Gunslinger mod
        gunsl_thirst.on_netdestroy()
        
        xr_sound.stop_sounds_by_id(self.object:id())
        local board_factions = sim_board.get_sim_board().players
        if(board_factions) then
                for k,v in pairs (board_factions) do
                        xr_sound.stop_sounds_by_id(v.id)
                end
        end
        if(actor_stats.remove_from_ranking~=nil)then
            actor_stats.remove_from_ranking(self.object:id())
        end
        level.show_weapon(true)
        db.del_actor(self.object)
        self.object:set_callback(callback.inventory_info, nil)
        self.object:set_callback(callback.article_info, nil)
        self.object:set_callback(callback.on_item_take, nil)
        self.object:set_callback(callback.on_item_drop, nil)
        self.object:set_callback(callback.task_state, nil)
        self.object:set_callback(callback.level_border_enter, nil)
        self.object:set_callback(callback.level_border_exit, nil)
        self.object:set_callback(callback.take_item_from_box, nil)
        self.object:set_callback(callback.use_object, nil)
        log("--------->"..tostring(_G.amb_vol))
        log("--------->"..tostring(_G.mus_vol))
        if(_G.amb_vol~=0) then
            get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
            _G.amb_vol = 0
        end
        if(_G.mus_vol~=0) then
            get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
            _G.mus_vol = 0
        end
        if sr_psy_antenna.psy_antenna then
            sr_psy_antenna.psy_antenna:destroy()
            sr_psy_antenna.psy_antenna = false
        end
        xrs_dyn_music.finish_theme()
        xr_s.on_actor_destroy()
        object_binder.net_destroy(self)
    end
    ------------------------------------>
    function actor_binder:reinit()
        object_binder.reinit(self)
        local npc_id = self.object:id()
        db.storage[npc_id] = { }
        self.st = db.storage[npc_id]
        self.st.pstor = nil
        self.object:set_callback(callback.inventory_info, self.info_callback, self)
        self.object:set_callback(callback.on_item_take, self.on_item_take, self)
        self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
        self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
        self.object:set_callback(callback.task_state, self.task_callback, self)
        self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
        self.object:set_callback(callback.use_object, self.use_inventory_item, self)
    end
    ------------------------------------>
    function actor_binder:take_item_from_box(box, item)
            --/ SGM in
        local box_name = box:name()
        ts_mod_cop.ts_on_item_take(item)    --TS_MOD--
            sgm_callbacks.on_take_item_from_box(box,item)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:info_callback(npc, info_id)
        printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
            --/ SGM in
            sgm_callbacks.on_enterring_info(npc,info_id)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:on_trade(item,sell_bye,money)
            --/ SGM in
        if sell_bye == true then
               sgm_callbacks.on_trade(item,money,1)
               game_stats.money_trade_update(money)
        else
               sgm_callbacks.on_trade(item,money,2)
           game_stats.money_trade_update(-money)
        end
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:article_callback(npc, group, name)
    end
    ------------------------------------>
    function actor_binder:on_item_take (obj)
        printf("on_item_take [%s]", obj:name())
        if isArtefact(obj) then
            local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
            if anomal_zone ~= nil then
                anomal_zone:on_artefact_take(obj)
            else
                bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
            end
            local artefact = obj:get_artefact()
            artefact:FollowByPath("NULL",0,vector():set(500,500,500))
            xr_statistic.inc_founded_artefacts_counter(obj:id())
        end
        treasure_manager.get_treasure_manager():on_item_take(obj:id())
        
        ts_mod_cop.ts_on_item_take(obj)    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_item_take(obj)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:on_item_drop (obj)
        ts_mod_cop.ts_on_item_drop(obj)    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_item_drop(obj)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:use_inventory_item(obj)
        if(obj) then
               local item_name=obj:section()
               local s_obj = alife():object(obj:id())
               if (s_obj) and (s_obj:section_name()=="drug_anabiotic") then
                  xr_effects.disable_ui_only(db.actor, nil)
                  level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
                  level.add_pp_effector("surge_fade.ppe", 11, false)
                  give_info("anabiotic_in_process")
                  _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")
               end
           -- AtmosFear Booster Check
            if (s_obj) and (s_obj:section_name() == "drug_psy_blockade" or s_obj:section_name() == "drug_radioprotector" or s_obj:section_name() == "drug_antidot") then
            local boost_time = system_ini():r_float(s_obj:section_name(),"boost_time")
            xr_logic.pstor_store(db.actor,s_obj:section_name().."_expiration",atmosfear.CTimeAddSec(game.get_game_time(),boost_time*level.get_time_factor()))
            end
           -- End AtmosFear Booster Check
            --******************************GWR****************************************
            local sect = obj:section()
            gunsl_thirst.OnItemUsed(sect)
            --*****************************/GWR****************************************
               --/ SGM in
               sgm_callbacks.on_use_item(obj)
               if find_in_string(item_name,"dv_") and find_in_string(item_name,"_case") then
                  sgm_callbacks.on_use_deserve(obj)
               end
               if find_in_string(item_name,"skill_book") then
                  sgm_callbacks.on_use_skill_book(obj)
               end
               if find_in_string(item_name,"sleeping_bag") then
                  sgm_callbacks.on_use_sleeping_bag(obj)
               end
               --/ SGM out
        end
    end
    ------------------------------------>
    function anabiotic_callback()
            --/ SGM in
            sgm_flags.is_ui_disabled=true
            --/ SGM out
        level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
        local rnd = math.random(35,45)
        local m = surge_manager.get_surge_manager()
        if(m.started) then
            local tf = level.get_time_factor()
            local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
                if(rnd>(m.surge_time-diff_sec)*tf/60) then
                m.time_forwarded = true
                m.ui_disabled = true
                m:kill_all_unhided()
                m:end_surge()
            end
        end
            --/ SGM in
            sgm_callbacks.on_forward_game_time(0,rnd)
            --/ SGM out
        level.change_game_time(0,0,rnd)
        level_weathers.get_weather_manager():forced_weather_change()
    end
    ------------------------------------>
    function anabiotic_callback2()
            --/ SGM in
            sgm_flags.is_ui_disabled=false
            --/ SGM out
        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
        disable_info("anabiotic_in_process")
    end
    ------------------------------------>
    function actor_binder:task_callback(_task, _state)
        if _state ~= task.fail then
            if _state == task.completed then
                news_manager.send_task(db.actor, "complete", _task)
            else
                news_manager.send_task(db.actor, "new", _task)
            end
        end
        task_manager.task_callback(_task, _state)
    end
    ------------------------------------>
    function actor_binder:update(delta)
        object_binder.update(self, delta)
        if string.find(command_line(), "-designer") then
            return
        end
        if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
            jump_level.try_to_jump()
            self.already_jumped = true
            return
        end
        -- Вызов апдейта переноса игрока проводником
        if travel_func ~= nil then
            travel_func()
        end
        -- DEBUG slowdown
        --slowdown.update()
        local time = time_global()
        game_stats.update (delta, self.object)
        -- апдейт погоды
        self.weather_manager:update()
        self:check_detective_achievement()
        self:check_mutant_hunter_achievement()
    -----------------------makdm
        self:check_weapon_help_achievement()
    ----------------------------        
        --' Апдейт саундменеджера
        xr_sound.update(self.object:id())
        -- Обновление отключения ввода с клавиатуры.
        if self.st.disable_input_time ~= nil and
            game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
            then
            level.enable_input()
            self.st.disable_input_time = nil
        end
        -- Апдейт прятание оружия игрока во время диалога
        if self.object:is_talking() then
            if self.weapon_hide_in_dialog == false then
                self.object:hide_weapon()
                printf("hiding weapon!!!")
                self.weapon_hide_in_dialog = true
            end
        else
            if self.weapon_hide_in_dialog == true then
                printf("restoring weapon!!!")
                self.object:restore_weapon()
                self.weapon_hide_in_dialog = false
            end
        end
        -- Апдейт прятание оружия игрока в зоне sr_no_weapon
        if check_for_weapon_hide_by_zones() == true then
            if self.weapon_hide == false then
                printf("hiding weapon!!!")
                self.object:hide_weapon()
                self.weapon_hide = true
            end
        else
            if self.weapon_hide == true then
                printf("restoring weapon!!!")
                self.object:restore_weapon()
                self.weapon_hide = false
            end
        end
        if sr_psy_antenna.psy_antenna then
            sr_psy_antenna.psy_antenna:update(delta)
        end
        if self.bCheckStart then
            printf("SET DEFAULT INFOS")
            if dont_has_alife_info("global_dialogs") then
                self.object:give_info_portion("global_dialogs")
            end
            if dont_has_alife_info("level_changer_icons") then
                self.object:give_info_portion("level_changer_icons")
            end
            self.bCheckStart = false
        end
        if not self.loaded_slot_applied then
            self.object:activate_slot(self.loaded_active_slot)
            self.loaded_slot_applied = true
        end
        xr_s.on_actor_update(delta)
    --VSm
        VScallback.OnActorUpdate(self,delta)
    --VSm
        if(self.surge_manager) then
            if(self.f_surge_manager_loaded ~= true) then
                self.surge_manager:initialize()
                self.f_surge_manager_loaded = true
            end
            if(self.surge_manager.levels_respawn[level.name()]) then
                self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
            end
            self.surge_manager:update()
        end
        -- AtmosFear
        if(self.fallout_manager) then
            self.fallout_manager:update()
        end
        if(self.atmosfear) then
            self.atmosfear:update()
        end
        if not db.actor:has_info("atmosfear_default_console_settings_loaded") then
            self.atmosfear:loadDefaultConsoleSettings()
            db.actor:give_info_portion("atmosfear_default_console_settings_loaded")
        end
        -- End AtmosFear
        simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())
        if not self.loaded then
            get_console():execute("dump_infos")
            self.loaded = true
        end
        treasure_manager.get_treasure_manager():update()
        if not(primary_objects_filled) then
            pda.fill_primary_objects()
            primary_objects_filled = true
        end
        pda.fill_sleep_zones()

        gunsl_thirst.UpdateState(delta)
            --/ SGM in
            if mod_update() then
               sgm_loader.sigerous_mod_main()
            end
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:save(packet)
            --/ SGM in
            if get_game_unique_id() then
               data_param_save_all()
            end
            --/ SGM out
        set_save_marker(packet, "save", false, "actor_binder")
        object_binder.save(self, packet)
        packet:w_u8(level.get_game_difficulty())
        if self.st.disable_input_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.st.disable_input_time)
        end
        xr_logic.pstor_save_all(self.object, packet)
        self.weather_manager:save(packet)
        release_body_manager.get_release_body_manager():save(packet)
        -- AtmosFear
        self.atmosfear:save(packet)    
        self.fallout_manager:save(packet)    
        -- End AtmosFear
        self.surge_manager:save(packet)
            --/ SGM in
        sgm_loader.save(packet)
            --/ SGM out
        sr_psy_antenna.save( packet )
        packet:w_bool(sim_board.get_sim_board().simulation_started)
        xr_sound.actor_save(packet)
        packet:w_stringZ(tostring(self.last_level_name))
        xr_statistic.save(packet)
        treasure_manager.get_treasure_manager():save(packet)
        local n = 0
        for k,v in pairs(db.script_ids) do
            n = n + 1
        end
        packet:w_u8(n)
        for k,v in pairs (db.script_ids) do
            packet:w_u16(k)
            packet:w_stringZ(v)
        end
        task_manager.get_task_manager():save(packet)
        packet:w_u8(self.object:active_slot())
        local deimos_exist = false
        for k,v in pairs(db.zone_by_name) do
            if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
                deimos_exist = true
                packet:w_bool(true)
                packet:w_float(db.storage[v:id()].sr_deimos.intensity)
            end
        end
        if not deimos_exist then
            packet:w_bool(false)
        end
        if self.last_detective_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
        end
        if self.last_mutant_hunter_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
        end
    -------------------------------makdm
        if self.last_weapon_help_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_weapon_help_achievement_spawn_time)
        end    
    -------------------------------------    
        set_save_marker(packet, "save", true, "actor_binder")
    end
    ------------------------------------>
    function actor_binder:load(reader)
        set_save_marker(reader, "load", false, "actor_binder")
        object_binder.load(self, reader)
        local game_difficulty = reader:r_u8()
            if game_difficulty~=nil and game_difficulty>=0 and game_difficulty<=3 then
           get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
            else
               mod_abort("SGM: cохранение накрылось кармой. Попробуйте загрузится c раннего сохранения.")
           get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
            end
        local stored_input_time = reader:r_u8()
        if stored_input_time == true then
            self.st.disable_input_time = utils.r_CTime(reader)
        end
        xr_logic.pstor_load_all(self.object, reader)
        self.weather_manager:load(reader)
        release_body_manager.get_release_body_manager():load(reader)
        -- AtmosFear
        self.atmosfear:load(reader)
        self.fallout_manager:load(reader)
        -- End AtmosFear
        self.surge_manager:load(reader)
            --/ SGM in
        sgm_loader.load(reader)
            --/ SGM out
        self.f_surge_manager_loaded = true
        sr_psy_antenna.load(reader)
        sim_board.get_sim_board().simulation_started = reader:r_bool()
        xr_sound.actor_load(reader)
        local n = reader:r_stringZ()
        if(n~="nil") then
            self.last_level_name = n
        end
        xr_statistic.load(reader)
        treasure_manager.get_treasure_manager():load(reader)
        n = reader:r_u8()
        for i = 1,n do
            db.script_ids[reader:r_u16()] = reader:r_stringZ()
        end
        task_manager.get_task_manager():load(reader)
        self.loaded_active_slot = reader:r_u8()
        self.loaded_slot_applied = false
        local b = reader:r_bool()
        if(b) then
            self.deimos_intensity = reader:r_float()
        end
        local stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
        end
        stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
        end
    ----------------------------makdm
        stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_weapon_help_achievement_spawn_time = utils.r_CTime(reader)
        end
    ---------------------------------    
        set_save_marker(reader, "load", true, "actor_binder")
    end
    local detective_achievement_items = {"medkit","antirad","bandage"}
    local mutant_hunter_achievement_items = {"ammo_5.45x39_ap","ammo_5.56x45_ap","ammo_9x39_ap","ammo_5.56x45_ap","ammo_12x76_zhekan"}
    ----------------------------------------------------makdm
    local weapon_help_achievement_items = {"af_fire","af_gravi","af_gold_fish","af_baloon","af_glass"}
    ---------------------------------------------------------
    local function spawn_achivement_items(items_table, count, inv_box_story_id)
        local inv_box = alife():object(get_story_object_id(inv_box_story_id))
        for i = 1,count do
        alife():create(items_table[math.random(#items_table)],inv_box.position,inv_box.m_level_vertex_id,inv_box.m_game_vertex_id,inv_box.id)
        end
    end
    function actor_binder:check_detective_achievement()
        if dont_has_alife_info("detective_achievement_gained") then
            return
        end
        if self.last_detective_achievement_spawn_time == nil then
            self.last_detective_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
            spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
            self.last_detective_achievement_spawn_time = game.get_game_time()
        end
    end
    function actor_binder:check_mutant_hunter_achievement()
        if dont_has_alife_info("mutant_hunter_achievement_gained") then
            return
        end
        if self.last_mutant_hunter_achievement_spawn_time == nil then
            self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
            spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
            self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
        end

    end
    -------------------------------------------makdm
    function actor_binder:check_weapon_help_achievement()
        if dont_has_alife_info("pri_a17_actor_has_gauss_rifle") then
            return
        end
        if self.last_weapon_help_achievement_spawn_time == nil then
            self.last_weapon_help_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_weapon_help_achievement_spawn_time) > 43200 then
            spawn_achivement_items(weapon_help_achievement_items, 2, "pri_a16_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_weapon_help_news","got_artefact"})
            self.last_weapon_help_achievement_spawn_time = game.get_game_time()
        end

    end
    --------------------------------------------------
    ------------------------------------>
    function check_for_weapon_hide_by_zones()
        for k,v in pairs(weapon_hide) do
            if v == true then
                return true
            end
        end
        return false
    end
    -- Weapon functions
    function hide_weapon(zone_id)
        --/printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
        weapon_hide[zone_id] = true
    end

    function restore_weapon(zone_id)
        --/printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
        weapon_hide[zone_id] = false
    end


     

     


  14. Зов Припяти, Sigerous mod 2.2, как сделать чтобы иконка "жажды" отображалась только в hud (как и остальные иконки)?
    Попробовал вставить "жажду" в мод. Мне помог товарищь на соседнем форуме выдернуть её из Sigerous-Gunslinger mod  (я в скриптах ноль, только копи-паст).  Ниже метод переноса..

    Спойлер

    1. Добавляем в мод файлы с описанием статика:
        configs\ui\ui_gunsl_thirst_indicator.xml
        configs\ui\ui_gunsl_thirst_indicator_16.xml

    2. Добавляем описание текстур для статика:
        configs\ui\textures_descr\gunsl_thirst_indicator.xml

     3. Добавляем файл скрипта, обрабатывающий жажду:
        scripts\gunsl_thirst.script

        Строка 184, удалить это:
        and level.indicators_shown()

     4. Прописываем вызов функций скрипта в файл:
        scripts\bind_stalker.script
      Функций всего четыре:
        gunsl_thirst.on_netspawn()
        gunsl_thirst.on_netdestroy()
        gunsl_thirst.OnItemUsed(sect)
        gunsl_thirst.UpdateState(delta)
      Прописаны они в соответствующих функциях bind_stalker:
        actor_binder:net_spawn(data)
        actor_binder:net_destroy()
        gunsl_thirst.OnItemUsed(sect)
        gunsl_thirst.UpdateState(delta)

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


    На всякий случай мой bind_stalker.script с "жаждой".

    Спойлер

    function init(obj)
    xr_motivator.AddToMotivator(obj)
    end
    function actor_init(npc)
    npc:bind_object(actor_binder(npc))
    end
    game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }
    local weapon_hide = {}
    local primary_objects_filled = false
    ------------------------------------>
    class "actor_binder" (object_binder)
    ------------------------------------>
    function actor_binder:__init (obj) super(obj)
        self.bCheckStart = false
        self.weather_manager = level_weathers.get_weather_manager()
        self.surge_manager = surge_manager.get_surge_manager()
        self.last_level_name = nil
        self.deimos_intensity = nil
        self.loaded_active_slot = 3
        self.loaded_slot_applied = false
        self.last_detective_achievement_spawn_time     = nil
        self.last_mutant_hunter_achievement_spawn_time    = nil
        -- AtmosFear
        self.atmosfear=atmosfear.get_atmosfear()
        self.fallout_manager = fallout_manager.get_fallout_manager()

    end
    ------------------------------------>
    function actor_binder:net_spawn(data)
        level.show_indicators()
        self.bCheckStart = true
        self.weapon_hide = false
        self.weapon_hide_in_dialog = false
        weapon_hide = {}
        if object_binder.net_spawn(self,data) == false then
            return false
        end
        db.add_actor(self.object)
        db.actor.deimos_intensity = self.deimos_intensity
        self.deimos_intensity = nil
        if self.st.disable_input_time == nil then
            level.enable_input()
        end
        xr_s.on_game_load()
    --VSm
        VScallback.OnGameLoad()
    --VSm
        self.weather_manager:reset()
        death_manager.init_drop_settings()
        self.task_manager = task_manager.get_task_manager()
        self.spawn_frame = device().frame
        self.already_jumped = false
        self.loaded = false
        benchmark.main()                                      --' Distemper 06.2008 --
        
        ts_mod_cop.ts_on_net_spawn()    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_game_load()
            --/ SGM out
        --Gunslinger mod
        gunsl_thirst.on_netspawn()
        return true
    end
    ------------------------------------>
    function actor_binder:net_destroy()
        
        --Gunslinger mod
        gunsl_thirst.on_netdestroy()
        
        xr_sound.stop_sounds_by_id(self.object:id())
        local board_factions = sim_board.get_sim_board().players
        if(board_factions) then
                for k,v in pairs (board_factions) do
                        xr_sound.stop_sounds_by_id(v.id)
                end
        end
        if(actor_stats.remove_from_ranking~=nil)then
            actor_stats.remove_from_ranking(self.object:id())
        end
        level.show_weapon(true)
        db.del_actor(self.object)
        self.object:set_callback(callback.inventory_info, nil)
        self.object:set_callback(callback.article_info, nil)
        self.object:set_callback(callback.on_item_take, nil)
        self.object:set_callback(callback.on_item_drop, nil)
        self.object:set_callback(callback.task_state, nil)
        self.object:set_callback(callback.level_border_enter, nil)
        self.object:set_callback(callback.level_border_exit, nil)
        self.object:set_callback(callback.take_item_from_box, nil)
        self.object:set_callback(callback.use_object, nil)
        log("--------->"..tostring(_G.amb_vol))
        log("--------->"..tostring(_G.mus_vol))
        if(_G.amb_vol~=0) then
            get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
            _G.amb_vol = 0
        end
        if(_G.mus_vol~=0) then
            get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
            _G.mus_vol = 0
        end
        if sr_psy_antenna.psy_antenna then
            sr_psy_antenna.psy_antenna:destroy()
            sr_psy_antenna.psy_antenna = false
        end
        xrs_dyn_music.finish_theme()
        xr_s.on_actor_destroy()
        object_binder.net_destroy(self)
    end
    ------------------------------------>
    function actor_binder:reinit()
        object_binder.reinit(self)
        local npc_id = self.object:id()
        db.storage[npc_id] = { }
        self.st = db.storage[npc_id]
        self.st.pstor = nil
        self.object:set_callback(callback.inventory_info, self.info_callback, self)
        self.object:set_callback(callback.on_item_take, self.on_item_take, self)
        self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
        self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
        self.object:set_callback(callback.task_state, self.task_callback, self)
        self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
        self.object:set_callback(callback.use_object, self.use_inventory_item, self)
    end
    ------------------------------------>
    function actor_binder:take_item_from_box(box, item)
            --/ SGM in
        local box_name = box:name()
        ts_mod_cop.ts_on_item_take(item)    --TS_MOD--
            sgm_callbacks.on_take_item_from_box(box,item)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:info_callback(npc, info_id)
        printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
            --/ SGM in
            sgm_callbacks.on_enterring_info(npc,info_id)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:on_trade(item,sell_bye,money)
            --/ SGM in
        if sell_bye == true then
               sgm_callbacks.on_trade(item,money,1)
               game_stats.money_trade_update(money)
        else
               sgm_callbacks.on_trade(item,money,2)
           game_stats.money_trade_update(-money)
        end
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:article_callback(npc, group, name)
    end
    ------------------------------------>
    function actor_binder:on_item_take (obj)
        printf("on_item_take [%s]", obj:name())
        if isArtefact(obj) then
            local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
            if anomal_zone ~= nil then
                anomal_zone:on_artefact_take(obj)
            else
                bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
            end
            local artefact = obj:get_artefact()
            artefact:FollowByPath("NULL",0,vector():set(500,500,500))
            xr_statistic.inc_founded_artefacts_counter(obj:id())
        end
        treasure_manager.get_treasure_manager():on_item_take(obj:id())
        
        ts_mod_cop.ts_on_item_take(obj)    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_item_take(obj)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:on_item_drop (obj)
        ts_mod_cop.ts_on_item_drop(obj)    --TS_MOD--
            --/ SGM in
            sgm_callbacks.on_item_drop(obj)
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:use_inventory_item(obj)
        if(obj) then
               local item_name=obj:section()
               local s_obj = alife():object(obj:id())
               if (s_obj) and (s_obj:section_name()=="drug_anabiotic") then
                  xr_effects.disable_ui_only(db.actor, nil)
                  level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
                  level.add_pp_effector("surge_fade.ppe", 11, false)
                  give_info("anabiotic_in_process")
                  _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")
               end
           -- AtmosFear Booster Check
            if (s_obj) and (s_obj:section_name() == "drug_psy_blockade" or s_obj:section_name() == "drug_radioprotector" or s_obj:section_name() == "drug_antidot") then
            local boost_time = system_ini():r_float(s_obj:section_name(),"boost_time")
            xr_logic.pstor_store(db.actor,s_obj:section_name().."_expiration",atmosfear.CTimeAddSec(game.get_game_time(),boost_time*level.get_time_factor()))
            end
           -- End AtmosFear Booster Check
            --******************************GWR****************************************
            local sect = obj:section()
            gunsl_thirst.OnItemUsed(sect)
            --*****************************/GWR****************************************
               --/ SGM in
               sgm_callbacks.on_use_item(obj)
               if find_in_string(item_name,"dv_") and find_in_string(item_name,"_case") then
                  sgm_callbacks.on_use_deserve(obj)
               end
               if find_in_string(item_name,"skill_book") then
                  sgm_callbacks.on_use_skill_book(obj)
               end
               if find_in_string(item_name,"sleeping_bag") then
                  sgm_callbacks.on_use_sleeping_bag(obj)
               end
               --/ SGM out
        end
    end
    ------------------------------------>
    function anabiotic_callback()
            --/ SGM in
            sgm_flags.is_ui_disabled=true
            --/ SGM out
        level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
        local rnd = math.random(35,45)
        local m = surge_manager.get_surge_manager()
        if(m.started) then
            local tf = level.get_time_factor()
            local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
                if(rnd>(m.surge_time-diff_sec)*tf/60) then
                m.time_forwarded = true
                m.ui_disabled = true
                m:kill_all_unhided()
                m:end_surge()
            end
        end
            --/ SGM in
            sgm_callbacks.on_forward_game_time(0,rnd)
            --/ SGM out
        level.change_game_time(0,0,rnd)
        level_weathers.get_weather_manager():forced_weather_change()
    end
    ------------------------------------>
    function anabiotic_callback2()
            --/ SGM in
            sgm_flags.is_ui_disabled=false
            --/ SGM out
        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
        disable_info("anabiotic_in_process")
    end
    ------------------------------------>
    function actor_binder:task_callback(_task, _state)
        if _state ~= task.fail then
            if _state == task.completed then
                news_manager.send_task(db.actor, "complete", _task)
            else
                news_manager.send_task(db.actor, "new", _task)
            end
        end
        task_manager.task_callback(_task, _state)
    end
    ------------------------------------>
    function actor_binder:update(delta)
        object_binder.update(self, delta)
        if string.find(command_line(), "-designer") then
            return
        end
        if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
            jump_level.try_to_jump()
            self.already_jumped = true
            return
        end
        -- Вызов апдейта переноса игрока проводником
        if travel_func ~= nil then
            travel_func()
        end
        -- DEBUG slowdown
        --slowdown.update()
        local time = time_global()
        game_stats.update (delta, self.object)
        -- апдейт погоды
        self.weather_manager:update()
        self:check_detective_achievement()
        self:check_mutant_hunter_achievement()
    -----------------------makdm
        self:check_weapon_help_achievement()
    ----------------------------        
        --' Апдейт саундменеджера
        xr_sound.update(self.object:id())
        -- Обновление отключения ввода с клавиатуры.
        if self.st.disable_input_time ~= nil and
            game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
            then
            level.enable_input()
            self.st.disable_input_time = nil
        end
        -- Апдейт прятание оружия игрока во время диалога
        if self.object:is_talking() then
            if self.weapon_hide_in_dialog == false then
                self.object:hide_weapon()
                printf("hiding weapon!!!")
                self.weapon_hide_in_dialog = true
            end
        else
            if self.weapon_hide_in_dialog == true then
                printf("restoring weapon!!!")
                self.object:restore_weapon()
                self.weapon_hide_in_dialog = false
            end
        end
        -- Апдейт прятание оружия игрока в зоне sr_no_weapon
        if check_for_weapon_hide_by_zones() == true then
            if self.weapon_hide == false then
                printf("hiding weapon!!!")
                self.object:hide_weapon()
                self.weapon_hide = true
            end
        else
            if self.weapon_hide == true then
                printf("restoring weapon!!!")
                self.object:restore_weapon()
                self.weapon_hide = false
            end
        end
        if sr_psy_antenna.psy_antenna then
            sr_psy_antenna.psy_antenna:update(delta)
        end
        if self.bCheckStart then
            printf("SET DEFAULT INFOS")
            if dont_has_alife_info("global_dialogs") then
                self.object:give_info_portion("global_dialogs")
            end
            if dont_has_alife_info("level_changer_icons") then
                self.object:give_info_portion("level_changer_icons")
            end
            self.bCheckStart = false
        end
        if not self.loaded_slot_applied then
            self.object:activate_slot(self.loaded_active_slot)
            self.loaded_slot_applied = true
        end
        xr_s.on_actor_update(delta)
    --VSm
        VScallback.OnActorUpdate(self,delta)
    --VSm
        if(self.surge_manager) then
            if(self.f_surge_manager_loaded ~= true) then
                self.surge_manager:initialize()
                self.f_surge_manager_loaded = true
            end
            if(self.surge_manager.levels_respawn[level.name()]) then
                self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
            end
            self.surge_manager:update()
        end
        -- AtmosFear
        if(self.fallout_manager) then
            self.fallout_manager:update()
        end
        if(self.atmosfear) then
            self.atmosfear:update()
        end
        if not db.actor:has_info("atmosfear_default_console_settings_loaded") then
            self.atmosfear:loadDefaultConsoleSettings()
            db.actor:give_info_portion("atmosfear_default_console_settings_loaded")
        end
        -- End AtmosFear
        simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())
        if not self.loaded then
            get_console():execute("dump_infos")
            self.loaded = true
        end
        treasure_manager.get_treasure_manager():update()
        if not(primary_objects_filled) then
            pda.fill_primary_objects()
            primary_objects_filled = true
        end
        pda.fill_sleep_zones()

        gunsl_thirst.UpdateState(delta)
            --/ SGM in
            if mod_update() then
               sgm_loader.sigerous_mod_main()
            end
            --/ SGM out
    end
    ------------------------------------>
    function actor_binder:save(packet)
            --/ SGM in
            if get_game_unique_id() then
               data_param_save_all()
            end
            --/ SGM out
        set_save_marker(packet, "save", false, "actor_binder")
        object_binder.save(self, packet)
        packet:w_u8(level.get_game_difficulty())
        if self.st.disable_input_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.st.disable_input_time)
        end
        xr_logic.pstor_save_all(self.object, packet)
        self.weather_manager:save(packet)
        release_body_manager.get_release_body_manager():save(packet)
        -- AtmosFear
        self.atmosfear:save(packet)    
        self.fallout_manager:save(packet)    
        -- End AtmosFear
        self.surge_manager:save(packet)
            --/ SGM in
        sgm_loader.save(packet)
            --/ SGM out
        sr_psy_antenna.save( packet )
        packet:w_bool(sim_board.get_sim_board().simulation_started)
        xr_sound.actor_save(packet)
        packet:w_stringZ(tostring(self.last_level_name))
        xr_statistic.save(packet)
        treasure_manager.get_treasure_manager():save(packet)
        local n = 0
        for k,v in pairs(db.script_ids) do
            n = n + 1
        end
        packet:w_u8(n)
        for k,v in pairs (db.script_ids) do
            packet:w_u16(k)
            packet:w_stringZ(v)
        end
        task_manager.get_task_manager():save(packet)
        packet:w_u8(self.object:active_slot())
        local deimos_exist = false
        for k,v in pairs(db.zone_by_name) do
            if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
                deimos_exist = true
                packet:w_bool(true)
                packet:w_float(db.storage[v:id()].sr_deimos.intensity)
            end
        end
        if not deimos_exist then
            packet:w_bool(false)
        end
        if self.last_detective_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
        end
        if self.last_mutant_hunter_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
        end
    -------------------------------makdm
        if self.last_weapon_help_achievement_spawn_time == nil then
            packet:w_bool(false)
        else
            packet:w_bool(true)
            utils.w_CTime(packet, self.last_weapon_help_achievement_spawn_time)
        end    
    -------------------------------------    
        set_save_marker(packet, "save", true, "actor_binder")
    end
    ------------------------------------>
    function actor_binder:load(reader)
        set_save_marker(reader, "load", false, "actor_binder")
        object_binder.load(self, reader)
        local game_difficulty = reader:r_u8()
            if game_difficulty~=nil and game_difficulty>=0 and game_difficulty<=3 then
           get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
            else
               mod_abort("SGM: cохранение накрылось кармой. Попробуйте загрузится c раннего сохранения.")
           get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
            end
        local stored_input_time = reader:r_u8()
        if stored_input_time == true then
            self.st.disable_input_time = utils.r_CTime(reader)
        end
        xr_logic.pstor_load_all(self.object, reader)
        self.weather_manager:load(reader)
        release_body_manager.get_release_body_manager():load(reader)
        -- AtmosFear
        self.atmosfear:load(reader)
        self.fallout_manager:load(reader)
        -- End AtmosFear
        self.surge_manager:load(reader)
            --/ SGM in
        sgm_loader.load(reader)
            --/ SGM out
        self.f_surge_manager_loaded = true
        sr_psy_antenna.load(reader)
        sim_board.get_sim_board().simulation_started = reader:r_bool()
        xr_sound.actor_load(reader)
        local n = reader:r_stringZ()
        if(n~="nil") then
            self.last_level_name = n
        end
        xr_statistic.load(reader)
        treasure_manager.get_treasure_manager():load(reader)
        n = reader:r_u8()
        for i = 1,n do
            db.script_ids[reader:r_u16()] = reader:r_stringZ()
        end
        task_manager.get_task_manager():load(reader)
        self.loaded_active_slot = reader:r_u8()
        self.loaded_slot_applied = false
        local b = reader:r_bool()
        if(b) then
            self.deimos_intensity = reader:r_float()
        end
        local stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
        end
        stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
        end
    ----------------------------makdm
        stored_achievement_time = reader:r_bool()
        if stored_achievement_time == true then
            self.last_weapon_help_achievement_spawn_time = utils.r_CTime(reader)
        end
    ---------------------------------    
        set_save_marker(reader, "load", true, "actor_binder")
    end
    local detective_achievement_items = {"medkit","antirad","bandage"}
    local mutant_hunter_achievement_items = {"ammo_5.45x39_ap","ammo_5.56x45_ap","ammo_9x39_ap","ammo_5.56x45_ap","ammo_12x76_zhekan"}
    ----------------------------------------------------makdm
    local weapon_help_achievement_items = {"af_fire","af_gravi","af_gold_fish","af_baloon","af_glass"}
    ---------------------------------------------------------
    local function spawn_achivement_items(items_table, count, inv_box_story_id)
        local inv_box = alife():object(get_story_object_id(inv_box_story_id))
        for i = 1,count do
        alife():create(items_table[math.random(#items_table)],inv_box.position,inv_box.m_level_vertex_id,inv_box.m_game_vertex_id,inv_box.id)
        end
    end
    function actor_binder:check_detective_achievement()
        if dont_has_alife_info("detective_achievement_gained") then
            return
        end
        if self.last_detective_achievement_spawn_time == nil then
            self.last_detective_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
            spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
            self.last_detective_achievement_spawn_time = game.get_game_time()
        end
    end
    function actor_binder:check_mutant_hunter_achievement()
        if dont_has_alife_info("mutant_hunter_achievement_gained") then
            return
        end
        if self.last_mutant_hunter_achievement_spawn_time == nil then
            self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
            spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
            self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
        end

    end
    -------------------------------------------makdm
    function actor_binder:check_weapon_help_achievement()
        if dont_has_alife_info("pri_a17_actor_has_gauss_rifle") then
            return
        end
        if self.last_weapon_help_achievement_spawn_time == nil then
            self.last_weapon_help_achievement_spawn_time = game.get_game_time()
        end
        if game.get_game_time():diffSec(self.last_weapon_help_achievement_spawn_time) > 43200 then
            spawn_achivement_items(weapon_help_achievement_items, 2, "pri_a16_actor_treasure")
            xr_effects.send_tip(db.actor, nil, {"st_weapon_help_news","got_artefact"})
            self.last_weapon_help_achievement_spawn_time = game.get_game_time()
        end

    end
    --------------------------------------------------
    ------------------------------------>
    function check_for_weapon_hide_by_zones()
        for k,v in pairs(weapon_hide) do
            if v == true then
                return true
            end
        end
        return false
    end
    -- Weapon functions
    function hide_weapon(zone_id)
        --/printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
        weapon_hide[zone_id] = true
    end

    function restore_weapon(zone_id)
        --/printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
        weapon_hide[zone_id] = false
    end


     


    .. и мой gunsl_thirst.script

    Спойлер

    --gunsl_thirst.script
    --Description: реализация жажды и всего, что с ней связано
    --Creator: Sin!
    --Last Edit: 07 Mar 2020

    local PSTOR_THIRST_PARAM_NAME = "gunsl_thirst"

    local idle_decrement        =    0.00001    --уменьшение состояния в игровую секунду при идле; 0.00001 - хватит на 27.77 часов
    local move_decrement        =    0.00003    --при ходьбе, хватит примерно на 9 часов 
    local sprint_decrement        =    0.0001    --при беге, 2.7 часа

    local max_delta_time        =    5400    --время между двумя апдейтами не больше этого
    local sleep_decrement         =     0.3        --при сне более max_delta_time
    local teleport_decrement     =     0.15    --при телепорте/проводнике со сдвигом времени

    local bleeding_koef            =    0.0001    --дополнительное уменьшение состояние при кровотечении равном 1

    local health_decrement        =    0.00043 --минимальная величина, на которую будет уменьшаться здоровье за секунду в случае сильной жажды
    local power_decrement        =    0.00350    --минимальная величина, на которую будет уменьшаться выносливость за секунду в случае сильной жажды

    local ppe_rem_time            =    10000    --время, через которое удалится постэффект


    local ini = system_ini()
    local aid = db.actor:id()

    local lasttime
    local lastpos
    local thirst_indicator
    local thirst_ppe
    local pp_start_time
    local pp_startrem_time

    function OnItemUsed(sect)
        --Тут проверяем, является ли использованный предмет утолителем жажды. Если является - то улучшаем состояние актора.
        db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
        if ini:line_exist(sect, "thirst_factor") then
            local factor = ini:r_float(sect, "thirst_factor")
            db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] + factor
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]>1 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=1 end
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]<-0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=-0.15 end        
        end
    end

    function UpdateState(delta1)
        --вызывается из апдейта актора, тут анализируем его текущее состояние и в зависимости от него уменьшаем количество воды в организме.
        
        --убеждаемся, что количество воды в организме и последние данные корректны
        db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
        lasttime = lasttime or game.get_game_time()
        lastpos = lastpos or db.actor:position()
        
        local newtime = game.get_game_time()    
        local delta = newtime:diffSec(lasttime)
        local hit_allowed = true
        if delta>max_delta_time then
            --ограничиваем время - чтобы не убивало при сне/переходах
            delta = max_delta_time
            hit_allowed = false
        end
        local newpos = db.actor:position()
        local speed = newpos:distance_to(lastpos)/delta1
        speed = math.ceil(speed*10000)
        
        --уменьшаем количество воды, учитывая прошедшее время и состояние перемещения актора    
        if speed<6 then
            --сейчас мы в идле
            if hit_allowed then
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - idle_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement 
            end
        elseif speed<50 then
            --мы идём
            if hit_allowed then
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - move_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
            end
        else
            --мы бежим
            if hit_allowed then 
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sprint_decrement*delta 
            else
                db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - teleport_decrement
            end
        end
        if db.actor.bleeding>0.005 then
            db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - bleeding_koef*db.actor.bleeding*delta
        end
        
        --проверим, не достигнуто ли критическое состояние
        if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < -0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = -0.15 end
        
        --Теперь будем назначать всякие нехорошие эффекты, если у нас критически малое содержание жидкости в организме
        if (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0.2) and hit_allowed then        
            --назначаем постпроцесс жажды/меняем его интенсивность в зависимости от её степени
            if thirst_ppe == nil then
                thirst_ppe = 13
                --level.add_pp_effector("contrast.ppe", thirst_ppe, true)
                level.add_pp_effector("black.ppe", thirst_ppe, true)
                level.set_pp_effector_factor(thirst_ppe, 0.001)
                pp_start_time = device():time_global()
            else
                local pp_factor = (1-((db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]+0.15)/0.35)^3)/2.5
                local pp_dt = device():time_global() - pp_start_time
                
                local phase = (math.sin(pp_dt / 1000)-0.66) * 5;
                if phase < 0 then 
                    phase = 0
                end;

                pp_factor = pp_factor * phase
                level.set_pp_effector_factor(thirst_ppe, pp_factor, 0.8)
            end
            
            if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0 then
                --Уменьшаем здоровье актора
                local hlth_factor = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * health_decrement*delta
                if db.actor.health+hlth_factor<0.005 then
                    if db.actor.health>0.004 then
                        db.actor.health = 0.004-db.actor.health                
                    end
                else
                    db.actor.health = hlth_factor            
                end
                
                db.actor.power = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * power_decrement*delta
            end
        else
            --Состояние улучшилоcь, удаляем постпроцесс
            if thirst_ppe~=nil then
                if pp_startrem_time==nil then
                    pp_startrem_time = device():time_global()
                    level.set_pp_effector_factor(thirst_ppe, 0, 0.4)
                end
                if device():time_global()-ppe_rem_time>pp_startrem_time then            
                    level.remove_pp_effector(thirst_ppe)
                    thirst_ppe = nil
                    pp_startrem_time = nil
                end
            end
        end

        --messenger.gwr_messenger(tostring(db.actor.bleeding), 100)
        --messenger.gwr_messenger(tostring(db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]), 100)
        
        lasttime = newtime
        lastpos = newpos    
    end

    function on_netspawn()
        thirst_indicator = gunsl_thirst_indicator()
        level.add_dialog_to_render(thirst_indicator)
    end

    function on_netdestroy()
        level.remove_dialog_to_render(thirst_indicator)
        thirst_indicator = nil    
    end

    --Индикатор жажды
    class "gunsl_thirst_indicator" (CUIScriptWnd)
    function gunsl_thirst_indicator:__init() super()
        local xml = CScriptXmlInit()
        xml:ParseFile("ui_gunsl_thirst_indicator.xml")
        self.main_static = xml:InitStatic("main_static", self)
    end

    function gunsl_thirst_indicator:Update()
        --Проверяем, надо ли вообще показывать что-то
        local curstate = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]
        if curstate==nil then 
            return
        end
        
        local hd = get_console():get_bool("hud_draw")
        
        local curfov = device().fov
        
        --log1(curfov) level.is_ui_shown() and need_hide_indicators
        
        --if (db.actor~=nil) and db.actor:alive() and level.is_ui_shown() and hd and level.get_game_difficulty()<game_difficulty.master and curfov>50 and xr_effects.ui_active_slot~=0 and travel_manager.init_time==nil and curstate < 0.7 then        
        if (db.actor~=nil) and db.actor:alive() and hd and (level.get_game_difficulty()<game_difficulty.master or  level.inventory_shown()) and curstate < 0.7 then
            --Надо показывать
            self.main_static:Show(true)
            
            --***********************************************************************************
            --т.к. непонятно, как отловить скриптовое сокрытие движковых индикаторов худа, 
            --то просто покажем их принудительно
            --level.show_indicators()
            --***********************************************************************************        
            
            --Назначим текстуру в зависимости от текущего состояния
            if curstate > 0.5 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_green")
            elseif curstate > 0.3 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_yellow")
            elseif curstate > 0.1 then
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_orange")            
            else
                self.main_static:InitTexture("ui_gunsl_thirst_indicator_red")
            end            
        else
            self.main_static:Show(false)
        end
    end

     
    В итоге жажда работает. Но есть косяк, иконка жажды (бутылка в кружочке, на скринах слева, внизу) появляется буквально везде (ниже скрины). 

    Спойлер

    28.thumb.jpg.b35c1543627081ff83bb862fc4cbfbc2.jpg29.thumb.jpg.4f3de237b33e7f5d9a219e64b5f9e24b.jpg30.thumb.jpg.e488bb3fc9ccad0fec3ee7e4f79fa06d.jpg

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

    При попытке перенести содержимое configs\ui\textures_descr\gunsl_thirst_indicator.xml  в configs\ui\textures_descr\ui_actor_hint_wnd.xml  получаю ошибку.
     


  15. Зов Припяти, Sigerous mod 2.2 (чистый). Хотелось бы в gamedata\configs\text\rus\ui_st_keybinding.xml  повесить горячую клавишу на команду "показать-скрыть интерфейс". 
    Кроме level.hide_indicators() и level.hide_indicators_safe()  ничего не нашел. Там еще вдобавок убирается ограничение веса рюкзака или добавляется бессмертие.  Но мне нужно просто показать-скрыть интерфейс быстрым нажатием, не заходя в настройки игры.

    Скажите, есть на данный момент определённое решение?


  16. В 07.11.2021 в 15:30, TMM team сказал:

    какое-то здания которого нет

    Возможно оно есть в файле level_lods.dds  (смотрим gamedata\levels\  выбираем папку с соответствующей локацией)

    • Лайк 1

  17. 57 минут назад, TMM team сказал:

    Что отвечает за дальность прорисовки мира? Как в атмосфере?

    Папка gamedata\configs\environment\weathers\    там файлы пораметров погоды. По умолчанию смотрим af3_slight_  например af3_slight_clear_4 и т.д.  
    Для каждого часа смотрим параметры far_plane и fog_distance

    Дальность (fog_distance): при тумане обычно 150-300, в ясную 800-1000

     

    57 минут назад, TMM team сказал:

    Что это за текстура призрак на фото?

    Вот чего не понял, где там призрак отображен?  Или ты имеешь ввиду как бы эффект линзы (шестигранника) от солнца?
     


    Дополнено 2 минуты спустя
    14 минут назад, TMM team сказал:

    спасибо за ответ, буду искать

    Да искать особо не надо. Открой любой скай-бокс, (для начала) ясную погоду, в дневное время (папка af3_clear) и посмотри фотошопом в самом низу любого фрагмента.


    Дополнено 49 минуты спустя
    19 часов назад, Hoperise сказал:

    но стеклянный шкаф на базе ученых (именно стекла) сместились со своих мест

    Скрин хоть покажи..


  18. 39 минут назад, TMM team сказал:

    Какие текстуры отвечают за ЧАЭС на горизонте ( в небе типо )?

    Это нарисовано на самом скай-боксе, которые разделены по часам. Для каждого скай-бокса, свой рисунок ЧАЭС и пр. того что отображается на горизонте. 


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

    Редактировать движок...

    Ну это понятно, что функции зашиты в движок ))   Я имел ввиду скриптовую часть. Собственно вопрос был к знающим в скриптописании.  На положительный ответ особо не надеялся. Мысль была, может кто то уже пробовал это реализовать.
     


  20. Всем привет! Пара вопросов по детекторам..

    1. Есть у кого детекторы как бы в "пластиковых" корпусах? В игре они как бы в затертом алюминиевом корпусе.  Может кто то пробовал рисовать в фотошопе или эта идея уже реализована где то в модах.  Оттенок корпуса не важен, главное как бы "пластиковые" .bump текстуры.

    2. Как "заставить" детекторы veres, svarog, omega  издавать звуки при обнаружении артов, как это реализовано в отклике и медведь?  Мне не важен сам тон звучания, главное что бы они это делали.

    Прописывание в gamedata\configs\misc\devices.ltx   для каждого из трех детекторов параметров типа
    af_class_1        = af_cristall
    af_sound_1_        = detectors\art_beep1
    и т.д. (для нужных артов) ни к чему не привели, детекторы продолжают молчать и отображают на дисплее обнаруженные арты.
     


  21. 53 минуты назад, MrSol0 сказал:

    вот скрин их папки

    Да, всё верно. Эту папку надо периодически чистить вручную.

     

    46 минут назад, KERIXFIX337X сказал:

    нету такого мода

    То же пробовал разные варианты, что находил в инете.. не помогает. У меня 8 ядер и 16 оперативки. Вылеты только из за движка. Только чаще сохранятся или чистить мод от всяких примочек, наподобие оригинального Sigerous 2.2 

    Хотя, как вариант.. можно попробовать распаковать все .db архивы и по новой запаковать уже вместе с модом, без лишних оригинальных файлов Зова Припяти.  Может поможет. Ведь игра при загрузке читает оригинальные архивы, а потом gamedata с модом. И так каждый раз, при загрузке следующей локации.

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек. Оставаясь на сайте, вы подтверждаете свое согласие на их использование. Политика конфиденциальности | Условия использования