Overf1rst 1 496 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Зов Припяти. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 18 9 1 1 2 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tolich 14 Опубликовано 9 ноября, 2021 Зов Припяти, Sigerous mod 2.2 (чистый). Хотелось бы в gamedata\configs\text\rus\ui_st_keybinding.xml повесить горячую клавишу на команду "показать-скрыть интерфейс". Кроме level.hide_indicators() и level.hide_indicators_safe() ничего не нашел. Там еще вдобавок убирается ограничение веса рюкзака или добавляется бессмертие. Но мне нужно просто показать-скрыть интерфейс быстрым нажатием, не заходя в настройки игры. Скажите, есть на данный момент определённое решение? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ian98 230 Опубликовано 9 ноября, 2021 Tolich ну по скрывается, не знаю как в сгм, в чистом зп интерфейс как ты и написал level.hide_indicators(). Выдать обратно - level.show_indicators(). А вот как это на клавишу повесить, попробуй найти для себя в этой статье - http://stalkerin.gameru.net/wiki/index.php?title=Назначение_скриптам_горячих_кнопок._Часть_1._Скрипт 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Сергей Шубин 21 Опубликовано 9 ноября, 2021 (изменено) Добрый вечер. В Зове Припяти есть возможность скриптом задать ориентацию ГГ. Что то вроде. db.actor:set_actor_direction(0.035) Для НПС есть такая возможность? Нужно принудительно заставить НПС смотреть в заданном направлении. Логика валкер не подходит, НПС стоит не на сетке. Что нужно прописать в скрипте? Функция вызывается из логики этого самого НПС. Изменено 9 ноября, 2021 пользователем Сергей Шубин Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mad Hikki 342 Опубликовано 9 ноября, 2021 Как использовать исходные кода движков?Куда,зачем,где,как,для чего? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tolich 14 Опубликовано 10 ноября, 2021 (изменено) Зов Припяти, 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 В итоге жажда работает. Но есть косяк, иконка жажды (бутылка в кружочке, на скринах слева, внизу) появляется буквально везде (ниже скрины). Спойлер Добавлю что при загрузке следующего уровня (во время автосейва), иконка так же отображается. При попытке перенести содержимое configs\ui\textures_descr\gunsl_thirst_indicator.xml в configs\ui\textures_descr\ui_actor_hint_wnd.xml получаю ошибку. Изменено 10 ноября, 2021 пользователем Tolich Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hozar_2002 128 Опубликовано 10 ноября, 2021 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 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Tolich 14 Опубликовано 10 ноября, 2021 (изменено) 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 Изменено 10 ноября, 2021 пользователем Tolich Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 11 ноября, 2021 (изменено) В 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 Изменено 11 ноября, 2021 пользователем Paradox27kms Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hozar_2002 128 Опубликовано 11 ноября, 2021 11 часов назад, Tolich сказал: level.inventory_shown()) actor_menu.is_render_ui() level.inventory_shown() нужно заменить на actor_menu.is_render_ui(), а не новую проверку добавлять. Если после этого будут вылеты, пишите в ЛС. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 11 ноября, 2021 (изменено) Paradox27kms как тут только db.actor:give_money(-cost) https://ap-pro.ru/forums/topic/92-cop-modostroy-voprosnica/?do=findComment&comment=124432 Изменено 11 ноября, 2021 пользователем vader_33 1 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
61dimon161 67 Опубликовано 11 ноября, 2021 При загрузке сейва рядом со Скадовском дополнительно спавнятся его обитатели (Борода, Султан, Кардан, Глухарь и тд) и сидят в центре(на смарт_терране). хотя стандартные файлы вроде не трогал. В чем может быть причина? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hunter 2 505 Опубликовано 12 ноября, 2021 Как добавить работающую команду jump_to_level? У меня ЗП 1.6.02. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 (изменено) 11 часов назад, vader_33 сказал: Paradox27kms как тут только db.actor:give_money(-cost) https://ap-pro.ru/forums/topic/92-cop-modostroy-voprosnica/?do=findComment&comment=124432 Благодарю, но есть одно но... скрипт спавнит только те предметы которые есть в рюкзаке ГГ и вдобавок нужно учесть что игрок уходит в минус если у него 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 Изменено 12 ноября, 2021 пользователем Paradox27kms Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 (изменено) 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 Изменено 12 ноября, 2021 пользователем vader_33 1 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 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 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 Paradox27kms добавлять self:RefreshMoneyDisplay() после каждого изменения количества денег В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 8 минут назад, vader_33 сказал: Paradox27kms добавлять self:RefreshMoneyDisplay() после каждого изменения количества денег Я пробовал но почему-то к сожалению изменений нет Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 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 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 (изменено) 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? Такова реализация доступна в мультиплеере но скрипта данного меню в скриптах я не нашел Изменено 12 ноября, 2021 пользователем Paradox27kms Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 (изменено) 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) Изменено 12 ноября, 2021 пользователем vader_33 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 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) а предметом тут что служит? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 Paradox27kms в смысле? Не очень понял В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Paradox27kms 15 Опубликовано 12 ноября, 2021 Только что, vader_33 сказал: Paradox27kms в смысле? Не очень понял ну подгонять...мне же нужен предмет чтобы при клике на него отобразилась его икнока Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
vader_33 1 142 Опубликовано 12 ноября, 2021 (изменено) Paradox27kms имел в виду, подгонять под то, на что крепите иконку (статик или еще что). Не надо просто этот код копипастить, не заработает, он для скролла был. А так, секция предмета нужна (вместо itmsect) Дополнено 19 минуты спустя Paradox27kms наверно, проще будет посмотреть пример в зп-шных спавнерах Изменено 12 ноября, 2021 пользователем vader_33 В беге за рассветом приближаешь свой закат Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hunter 2 505 Опубликовано 13 ноября, 2021 Поможете, нет? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты