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

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

 
 
12 минут назад, vader_33 сказал:

в этой?

Как выложили кусок кода для изменения, так я и ответил

  Скрыть контент

 

 

 

Да, именно  этой

Спойлер

local section = item.sect_item alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())

Нужно зарегистрировать данный параметр в ui_mm_mod:FillListOther() по логике...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms всё точно также, как и с удалением, добавить в init списка self.sect_item = sect, передавать секцию _itm = mod_main_menu(22, секция), также получать сначала local item = self.list_other:GetSelectedItem() потом уже local section = item.sect_item


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

TMM team в зп псевдособака из окна кбо вылетает. Вроде она pri_b303_screaming_dog

  • Лайк 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 минуты назад, vader_33 сказал:

в зп псевдособака из окна кбо вылетает. Вроде она pri_b303_screaming_dog

опа, напомнил, спасибище. 


IMG-37f2f96c0f50da877397935e4895dd7a-V.j

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Tolich ну по скрывается, не знаю как в сгм, в чистом зп интерфейс как ты и написал level.hide_indicators(). Выдать обратно - level.show_indicators(). А вот как это на клавишу повесить, попробуй найти для себя в этой статье - http://stalkerin.gameru.net/wiki/index.php?title=Назначение_скриптам_горячих_кнопок._Часть_1._Скрипт

  • Лайк 1

76561198152189716.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Добрый вечер.

В Зове Припяти есть возможность скриптом задать ориентацию ГГ.  Что то вроде.

db.actor:set_actor_direction(0.035)

 

Для НПС есть такая возможность?  Нужно принудительно заставить НПС смотреть в заданном направлении.  Логика валкер не подходит, НПС стоит не на сетке.

 

Что нужно прописать в скрипте?  Функция вызывается из логики этого самого НПС.

Изменено пользователем Сергей Шубин

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Как использовать исходные кода движков?Куда,зачем,где,как,для чего?


973993194_.png.976c126d2bdec0c06760be6027acfaff.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Зов Припяти, 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  получаю ошибку.
 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Tolich Короче делай так. Сначала открываешь actor_menu.script, там вначале где нибудь создаешь local current_mode = 0. Потом в функцию function actor_menu_mode(mode) в самое начало пишешь current_mode = mode. Затем где нибудь в файле (вне функций) создаешь новую функцию

function is_render_ui()
   return current_mode == 0
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

Затем заменяешь

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

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

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

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

  • Лайк 1

Еще один злодей!
6 ГБ ОЗУ DDR3 1094 мГц (Разносорт) Процессор Intel Xeon E5420 4/4 2.57 ГГц (OC)
Видеокарта Gigabyte Radeon RX 580 8192 МБ GDDR5 (Micron) DirectX v12.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
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


 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
В 06.11.2021 в 20:28, vader_33 сказал:

Paradox27kms if db.actor:money() < число then и дальше действие

Приветствую, спасибо. В данном клике нужно реализовать чтобы при клике на предмет уходила денюжка из рюкзака ГГ по цене выбранной секции. Тобишь хочу реализовать продажу предметов ГГ. 

Спойлер

function ui_mm_mod:OnButton_buy_clicked()
     if self.list_shop:GetSize()==0 then return end

     local item = self.list_shop:GetSelectedItem()
                  if item == nil then
                      return
     end

         local section = item.sect_item
         if db.actor:money() <= 0 then -- если у ГГ совсем нету денег то появится табличка что нет денег
     self.message_box:InitMessageBox("message_box_not_money")
     self.message_box:ShowDialog(true)
         else
         alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
         end

     local id
     if self.check:GetCheck() then
         id = db.actor:id()
     else
         id = -1
     end
end

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
11 часов назад, Tolich сказал:

 level.inventory_shown()) actor_menu.is_render_ui()

 level.inventory_shown() нужно заменить на actor_menu.is_render_ui(), а не новую проверку добавлять. Если после этого будут вылеты, пишите в ЛС.


Еще один злодей!
6 ГБ ОЗУ DDR3 1094 мГц (Разносорт) Процессор Intel Xeon E5420 4/4 2.57 ГГц (OC)
Видеокарта Gigabyte Radeon RX 580 8192 МБ GDDR5 (Micron) DirectX v12.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms как тут только db.actor:give_money(-cost) https://ap-pro.ru/forums/topic/92-cop-modostroy-voprosnica/?do=findComment&comment=124432

 

Изменено пользователем vader_33
  • Лайк 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

При загрузке сейва рядом со Скадовском дополнительно спавнятся его обитатели (Борода, Султан, Кардан, Глухарь и тд) и сидят в центре(на смарт_терране). хотя стандартные файлы вроде не трогал. В чем может быть причина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Как добавить работающую команду jump_to_level? У меня ЗП 1.6.02.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

 

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

Благодарю, но есть одно  но... скрипт спавнит только те предметы которые есть в рюкзаке ГГ и вдобавок нужно учесть что игрок уходит в минус если у него 0 рублей.

Спойлер

         local section = item.sect_item
         local obj = db.actor:object(section)
     if obj then
     local sobj = alife():object(obj:id())
     local cost = tonumber(system_ini():r_string(section, "cost"))            
         alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
     db.actor:give_money(-cost)
     end

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms так не надо всё переносить, только считывание цены  и отбирание денег. Вот это local obj = db.actor:object(section) if obj then и добавляет проверку на наличие предмета в рюкзаке гг, это не надо. Просто 

local section = item.sect_item

local cost = tonumber(system_ini():r_string(section, "cost"))            
alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
db.actor:give_money(-cost)

8 часов назад, Paradox27kms сказал:

игрок уходит в минус если у него 0 рублей

тогда надо делать проверку не на 0 рублей, а <=  cost

Изменено пользователем vader_33
  • Мастер! 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, vader_33 сказал:

Paradox27kms так не надо всё переносить, только считывание цены  и отбирание денег. Вот это local obj = db.actor:object(section) if obj then и добавляет проверку на наличие предмета в рюкзаке гг, это не надо. Просто 

local section = item.sect_item

local cost = tonumber(system_ini():r_string(section, "cost"))            
alife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
db.actor:give_money(-cost)

тогда надо делать проверку не на 0 рублей, а <=  cost

Большое спасибо! По вопросу списков у меня всё, однако я брал скрипты по отображению денег у ГГ из Повелителя Зоны, проблема в том что перенес я их так что они отображают стартовую сумму но не обновлются. Вот затронутые скрипты

Спойлер

function ui_mm_mod:InitControls()
self:SetWndRect(Frect():set(0,0,1024,768))         
local xml, ctrl = CScriptXmlInit(), CUIWindow()
xml:ParseFile("ui_mm_mod.xml")

if db.actor ~= nil then actor_money = db.actor:money() else actor_money = 0 end
self:RefreshMoneyDisplay()

function ui_mm_mod:RefreshMoneyDisplay()
    local am = comma_value(actor_money)
    local st_rubles = "st_rubles"
    local ru = game.translate_string(st_rubles)
    if ru == st_rubles then ru = "RU" end
    local thsep = game.translate_string("ui_ch_thousand_separator_in_quotes")
    if string.len(thsep) == 3 then
        thsep = string.sub(thsep, 2, 2)
        am = string.gsub(am, ",", thsep)
    end
    self.cap_rubel_currently:TextControl():SetText(am .. " " .. ru)
end

function comma_value(amount)
  local formatted = amount
  while true do  
    formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
    if (k==0) then
      break
    end
  end
  return formatted
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms добавлять self:RefreshMoneyDisplay() после каждого изменения количества денег


В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
8 минут назад, vader_33 сказал:

Paradox27kms добавлять self:RefreshMoneyDisplay() после каждого изменения количества денег

Я пробовал но почему-то к сожалению изменений нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms эта переменная где прописана actor_money = db.actor:money() ? Попробуйте в function ui_mm_mod:RefreshMoneyDisplay() заменить     local am = comma_value(actor_money) на     local am = comma_value(db.actor:money())

  • Лайк 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, vader_33 сказал:

Paradox27kms эта переменная где прописана actor_money = db.actor:money() ? Попробуйте в function ui_mm_mod:RefreshMoneyDisplay() заменить     local am = comma_value(actor_money) на     local am = comma_value(db.actor:money())

Спасибо, я просто забыл прописать в функцию if db.actor ~= nil then actor_money = db.actor:money() else actor_money = 0 end


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

Дополнено 16 минуты спустя
2 часа назад, vader_33 сказал:

Paradox27kms эта переменная где прописана actor_money = db.actor:money() ? Попробуйте в function ui_mm_mod:RefreshMoneyDisplay() заменить     local am = comma_value(actor_money) на     local am = comma_value(db.actor:money())

Как реализовать чтобы при клике на секцию предмета отобразилась его иконка из ui_icons_equipments? Такова реализация доступна в мультиплеере но скрипта данного меню в скриптах я не нашел

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms пример (просто пример, как иконку достать, подгонять надо под то, на что добавляете)

Спойлер

    self.list_2_icon = self.xml:InitStatic("list_2:list_2_icon",nil)
    local ini = system_ini()
    local x = ini:r_float(itmsect, "inv_grid_x")*50    
    local y = ini:r_float(itmsect, "inv_grid_y")*50    
    local width = ini:r_float(itmsect, "inv_grid_width")*50
    local height = ini:r_float(itmsect, "inv_grid_height")*50
    self.list_2_icon:InitTexture("ui\\ui_icon_equipment")
    self.list_2_icon:SetTextureRect(Frect():set(x,y, x + width,y + height))
    self.list_2_icon:SetWndSize(vector2():set(width,height))
    self.scroll:AddWindow(self.list_2_icon, true)

 

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

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
12 минут назад, vader_33 сказал:

Paradox27kms пример (просто пример, как иконку достать, подгонять надо под то, на что добавляете)

  Скрыть контент

    self.list_2_icon = self.xml:InitStatic("list_2:list_2_icon",nil)
    local ini = system_ini()
    local x = ini:r_float(itmsect, "inv_grid_x")*50    
    local y = ini:r_float(itmsect, "inv_grid_y")*50    
    local width = ini:r_float(itmsect, "inv_grid_width")*50
    local height = ini:r_float(itmsect, "inv_grid_height")*50
    self.list_2_icon:InitTexture("ui\\ui_icon_equipment")
    self.list_2_icon:SetTextureRect(Frect():set(x,y, x + width,y + height))
    self.list_2_icon:SetWndSize(vector2():set(width,height))
    self.scroll:AddWindow(self.list_2_icon, true)

 

а предметом тут что служит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms в смысле? Не очень понял


В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   2 пользователя онлайн