Overf1rst 1 499 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Зов Припяти. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 19 9 1 1 2 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gerbys 7 Опубликовано 22 сентября, 2020 41 минуту назад, WolfHeart сказал: Все что угодно. Лог вылета предоставь, тогда можно будет о чем то думать. Если бы был лог - сразу бы предоставил. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
WolfHeart 924 Опубликовано 22 сентября, 2020 3 минуты назад, Gerbys сказал: Если бы был лог - сразу бы предоставил. 47 минут назад, Gerbys сказал: Декомпилировал локацию из стандартного ЗП, при попытке открыть в Level Editor - мгновенный вылет Ты пытаешся открыть локу в Level Editor, а это значит, что LE у тебя запущен, а раз так, то лог обязан быть. AMD FX-8370 (8 X 4.35GHz); RAM 16Gb; MSI GTX 1070 (8Gb). Windows -10 PRO (х64) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gerbys 7 Опубликовано 22 сентября, 2020 (изменено) 4 минуты назад, WolfHeart сказал: Ты пытаешся открыть локу в Level Editor, а это значит, что LE у тебя запущен, а раз так, то лог обязан быть. Сразу всё закрывается. Если открыть лог в Editor,е последняя строка, перед которой происходит вылет: "Loading objects..." Изменено 22 сентября, 2020 пользователем Gerbys Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
WolfHeart 924 Опубликовано 22 сентября, 2020 Значит ты что то не так декомпельнул. Ты уверен, что конвертер отработал без ошибки? Что было написано в конце коммандной строки? AMD FX-8370 (8 X 4.35GHz); RAM 16Gb; MSI GTX 1070 (8Gb). Windows -10 PRO (х64) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Gerbys 7 Опубликовано 22 сентября, 2020 (изменено) 6 минут назад, WolfHeart сказал: Значит ты что то не так декомпельнул. Ты уверен, что конвертер отработал без ошибки? Что было написано в конце коммандной строки? Спойлер D:\x_ray_sdk\editors\converter>converter -level collector22 -out collector22 -mode le -with_lods log started (console and converter.log) level name: collector22 loading level.ltx loading level.geom loading level ...visuals ...shaders/textures ...sectors ...portals ...lights ...glows loading level.cform loading level.ai loading level.game loading level.spawn bad section reference '' at prefetch_mp.ltx:129 ignoring trailing garbage at m_dog.ltx:402 ignoring trailing garbage at m_pseudodog.ltx:323 ignoring trailing garbage at m_poltergeist.ltx:352 ignoring trailing garbage at w_sig550_up.ltx:183 ignoring trailing garbage at w_vintorez_up.ltx:100 loading level.wallmarks loading level.env_mod loading level.fog_vol loading build.lights loading gamemtl.xr scene name: collector22 substituting shaders/textures re-indexing shaders/textures building sector.part selected sector #0 (of 1) as default building portal.part building scene_object.part calculating subdivisions calculating external meshes collecting subdivisions collecting external meshes compacting 908122 verts, 819282 faces got 454698 points, 167258 normals, 107025 uvs in 0.573s cleaning geometry removed 0 duplicate faces in 0.102s removed 6299 back faces in 0.235s cleaning cform mapping 422924 CFORM verts to 454698 visual got 422894 matches matching edges/faces propagating game materials restoring fake colliders separating models (by merged edge-linked groups) building edge-connected submeshes immediate fake/MU joins: 0 submeshes (MU): 0 submeshes (fake): 5 submeshes (regular): 12770 reordering faces accounting submeshes creating collision models (MU) creating collision models (fake) merging fake/MU submeshes non-fake (residue) submeshes: 0 cross-merging fake submeshes assigning contact groups (fake) total groups (fake): 5 creating collision models (regular) merging submeshes (regular) contacts (with redundancy): 42712 assigning contact groups (regular) total groups (regular): 717 building regular models merging 6 orphan(s) nearest: 16 (0.00) nearest: 5 (0.00) nearest: 161 (0.00) nearest: 5 (0.00) nearest: 278 (0.00) nearest: 306 (0.00) exporting visuals materials\fake -> prop\prop_fake_kollision, def_shaders\def_vertex, def_shaders\def_kolizion saving error list building ai_map.part found 122 (of 5414) no-return nodes building glow.part building light.part building wallmark.part building spawn.part (entities) saving scene total time: 21.381s D:\x_ray_sdk\editors\converter>pause Для продолжения нажмите любую клавишу . . . Попробовал декомпельнуть другой левел (не из оригинала) - то же самое. Изменено 22 сентября, 2020 пользователем Gerbys Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AziatkaVictor 3 926 Опубликовано 22 сентября, 2020 Gerbys для вопросов по СДК есть специальная тема, пишите туда, пожалуйста: 1 Как оформить тему Правила форума Вопросы по сайту Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 23 сентября, 2020 Есть ли мод на потребность сна у ГГ? Желательно на версию 1.6.02 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Kalambur 25 Опубликовано 23 сентября, 2020 (изменено) Del Дополнено 2 минуты спустя Подскажите пожалуйста, как Запретить выбросить придмет из инвентаря Изменено 23 сентября, 2020 пользователем Kalambur Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Chiliaz 165 Опубликовано 23 сентября, 2020 Kalambur в секции предмета прописать quest_item = true 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Chiliaz 165 Опубликовано 25 сентября, 2020 Можно ли посмотреть количество заспавненых в игре объектов через скрипты? Вроде такого только без сохранения * Saving spawns... * Saving objects... * 23631 objects are successfully saved Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Overf1rst 1 499 Опубликовано 25 сентября, 2020 Первое, что приходит в голову, так это перебрать все объекты: function get_spawn_objects_count() local count = 0 for i = 0, 65535 do if alife():object(i) ~= nil then count = count + 1 end end return count end Потести. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Chiliaz 165 Опубликовано 25 сентября, 2020 Overfirst сейчас так и делаю, но это удар по производительности. Хотелось бы знать точное число, чтобы не молотить скрипты в пустоту. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Overf1rst 1 499 Опубликовано 25 сентября, 2020 Можно перебирать таблицу db.storage, но она хранит только онлайновые объекты и только те, у которых есть биндер. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Chiliaz 165 Опубликовано 25 сентября, 2020 15 минут назад, Overfirst сказал: Можно перебирать таблицу db.storage, но она хранит только онлайновые объекты Нет, нужны все объекты, даже за пределами уровня. А вообще у всех них есть story_id с space_restrictor в названии. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 953 Опубликовано 25 сентября, 2020 (изменено) Chiliaz Такие объекты попадают в таблицу db.zone_by_name Изменено 25 сентября, 2020 пользователем denis2000 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Сергей Шубин 21 Опубликовано 25 сентября, 2020 (изменено) В 23.09.2020 в 09:03, Winzor сказал: Есть ли мод на потребность сна у ГГ? Желательно на версию 1.6.02 Я делал так. Взял функции из СГМ. Спойлер _g.scripts -- 'Прибавить к pstor-счетчику цифру. function Inc_Counter(counter_name,add_value) if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end if add_value==nil then add_value=1 end if Read_Variable(counter_name)~=nil then local counter=Read_Variable(counter_name) Write_Variable(counter_name,counter+add_value) end end -- 'Отнять от pstor-счетчика цифру. function Dec_Counter(counter_name,add_value) if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end if add_value==nil then add_value=1 end if Read_Variable(counter_name)~=nil then local counter=Read_Variable(counter_name) Write_Variable(counter_name,counter-add_value) end end -- 'Запись pstor переменной. function Write_Variable(params_name,value) if value==nil then Clear_Variable(params_name) else local opt=Reload_Params(params_name) Pstor_Store(db.actor,opt,value) end end -- 'Чтение pstor переменной. function Read_Variable(params_name) local opt=Reload_Params(params_name) return Pstor_Retrieve(db.actor,opt) end -- 'Удаление pstor переменной. function Clear_Variable(params_name) local opt=Reload_Params(params_name) if db.storage[db.actor:id()].pstor[opt] then db.storage[db.actor:id()].pstor[opt]=nil end end function Pstor_Store(obj,varname,val) if obj==nil then return nil end local sub_id=obj:id() if db.storage[sub_id].pstor==nil then db.storage[sub_id].pstor={} end db.storage[sub_id].pstor[varname]=val end function Pstor_Retrieve(obj,varname) if obj==nil then return nil end local sub_id=obj:id() if db.storage[sub_id].pstor~=nil then local val=db.storage[sub_id].pstor[varname] if val~=nil then return val end end return nil end function Reload_Params(params) return params end 2. bind_stalker.scripts Вызов всего процесса. self:check_detective_achievement() self:check_mutant_hunter_achievement() self:actor_universal_binder() function actor_binder:actor_universal_binder() if self.actor_universal_binder_time == nil then self.actor_universal_binder_time = game.get_game_time() end if game.get_game_time():diffSec(self.actor_universal_binder_time) > 10 then actor_sleep_control() self.actor_universal_binder_time = game.get_game_time() end end function actor_sleep_control() if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) else Inc_Counter("actor_active_time") end actor_sleep_control2() end function actor_sleep_control2() if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) end if Read_Variable("actor_active_time") > 20*60*6 and Read_Variable("actor_active_time") < 21*60*6 then local rnd_ppe11=math.random(1,12) local rnd_ppe12=math.random(1,12) if rnd_ppe11==1 then level.add_pp_effector("shock_hit.ppe",91350,false) end if rnd_ppe12==1 then level.add_pp_effector("surge_shock.ppe",331510,false) end if db.actor.power > 0.8 then db.actor.power = 0.8 - db.actor.power end end if Read_Variable("actor_active_time") > 21*60*6 and Read_Variable("actor_active_time") < 22*60*6 then local rnd_ppe21=math.random(1,10) local rnd_ppe22=math.random(1,10) if rnd_ppe21==1 then level.add_pp_effector("actor_hit.ppe",91350,false) end if rnd_ppe22==1 then level.add_pp_effector("surge_shock.ppe",331510,false) end if db.actor.power > 0.6 then db.actor.power = 0.6 - db.actor.power end end if Read_Variable("actor_active_time") > 22*60*6 and Read_Variable("actor_active_time") < 23*60*6 then local rnd_ppe31=math.random(1,8) local rnd_ppe32=math.random(1,8) local rnd_ppe33=math.random(1,8) if rnd_ppe31==1 then level.add_pp_effector("actor_hit.ppe",510,false) end if rnd_ppe32==1 then level.add_pp_effector("shock_hit.ppe",91350,false) end if rnd_ppe33==1 then level.add_pp_effector("deimos1.ppe",11315,false) end if db.actor.power > 0.4 then db.actor.power = 0.4 - db.actor.power end end if Read_Variable("actor_active_time") > 23*60*6 and Read_Variable("actor_active_time") < 24*60*6 then local rnd_ppe41=math.random(1,6) local rnd_ppe42=math.random(1,6) local rnd_ppe43=math.random(1,6) if rnd_ppe41==1 then level.add_pp_effector("shock_hit.ppe",91350,false) end if rnd_ppe42==1 then level.add_pp_effector("actor_hit.ppe",510,false) end if rnd_ppe43==1 then level.add_pp_effector("deimos1.ppe",11315,false) end if db.actor.power > 0.2 then db.actor.power = 0.2 - db.actor.power end end if Read_Variable("actor_active_time") > 24*60*6 then xr_effects.disable_ui(db.actor, nil) level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback") level.add_pp_effector("sleep_fade.ppe", 11, false) db.actor:give_info_portion("actor_is_sleeping") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") surge_manager.resurrect_skip_message() Write_Variable("actor_active_time",19*60*6) end end function dream_callback() level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback2") local hours = math.random(6,10) level.change_game_time(0,hours,0) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then level.stop_weather_fx() -- level_weathers.get_weather_manager():select_weather(true) level_weathers.get_weather_manager():forced_weather_change() end db.actor.power = 1 printf("dream_callback: time forwarded on [%d]", hours) Write_Variable("actor_active_time",0) end function dream_callback2() xr_effects.enable_ui(db.actor, nil) get_console():execute("snd_volume_music "..tostring(_G.mus_vol)) get_console():execute("snd_volume_eff "..tostring(_G.amb_vol)) _G.amb_vol = 0 _G.mus_vol = 0 db.actor.power = 1 db.actor:give_info_portion("tutorial_sleep") disable_info("actor_is_sleeping") disable_info("sleep_active") end 3. ui_sleep_dialog.scripts function dream_callback() level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "ui_sleep_dialog.dream_callback2") local hours = sleep_control.time_track:GetIValue() level.change_game_time(0,hours,0) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then level.stop_weather_fx() -- level_weathers.get_weather_manager():select_weather(true) level_weathers.get_weather_manager():forced_weather_change() end db.actor.power = 1 printf("dream_callback: time forwarded on [%d]", hours) if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) end if hours >= 6 then Write_Variable("actor_active_time",0) else if Read_Variable("actor_active_time") > hours*60*6 then Dec_Counter("actor_active_time",hours*60*6) else Write_Variable("actor_active_time",0) end end end 4. xr_effects.scripts function set_game_time(actor, npc, p) local real_hours = level.get_time_hours() local real_minutes = level.get_time_minutes() local hours = tonumber(p[1]) local minutes = tonumber(p[2]) if p[2] == nil then minutes = 0 end local hours_to_change = hours - real_hours if hours_to_change <= 0 then hours_to_change = hours_to_change + 24 end local minutes_to_change = minutes - real_minutes if minutes_to_change <= 0 then minutes_to_change = minutes_to_change + 60 hours_to_change = hours_to_change - 1 elseif hours == real_hours then hours_to_change = hours_to_change - 24 end level.change_game_time(0,hours_to_change,minutes_to_change) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true printf("set_game_time: time changed to [%d][%d]", hours_to_change, minutes_to_change) if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) end Inc_Counter("actor_active_time",hours_to_change*60*6+minutes_to_change*6) end function forward_game_time(actor, npc, p) if not p then abort("Insufficient or invalid parameters in function 'forward_game_time'!") end local hours = tonumber(p[1]) local minutes = tonumber(p[2]) if p[2] == nil then minutes = 0 end level.change_game_time(0,hours,minutes) level_weathers.get_weather_manager():forced_weather_change() surge_manager.get_surge_manager().time_forwarded = true printf("forward_game_time: time forwarded on [%d][%d]", hours, minutes) if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) end Inc_Counter("actor_active_time",hours*60*6+minutes*6) end function sleep(actor, npc) local sleep_zones = { "zat_a2_sr_sleep", "jup_a6_sr_sleep", "pri_a16_sr_sleep", "actor_surge_hide_2" } for k,v in pairs (sleep_zones) do if utils.npc_in_zone(db.actor, db.zone_by_name[v]) then if Read_Variable("actor_active_time") == nil then Write_Variable("actor_active_time",0) end if Read_Variable("actor_active_time") > 12*60*6 then ui_sleep_dialog.sleep() give_info("sleep_active") else game.start_tutorial("actor_no_sleep_use") end end end end Изменено 25 сентября, 2020 пользователем Сергей Шубин 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 28 сентября, 2020 Как прочитать иконку предмета, показать её в размерах не превыщающих 83х47? (Хочу сделать так, чтобы при появлении сообщения вместо иконки ui_inGame2_Predmet_otdan была иконка предмета, которая уменьшается\увеличивается до размеров 83х47. В ОП 2.1 видел подобное, поискал в файлах, я не нашёл функции get_item_icon, наверное, функция в движке.) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 953 Опубликовано 28 сентября, 2020 Winzor Да функция get_item_icon явно движковая, но никто не мешает создать иконки предметов нужных размеров и отображать их скриптово. Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 28 сентября, 2020 3 часа назад, denis2000 сказал: Winzor Да функция get_item_icon явно движковая, но никто не мешает создать иконки предметов нужных размеров и отображать их скриптово. Но это же так долго, и так много. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doloremque 527 Опубликовано 28 сентября, 2020 Парни, как в логику рестриктора вписать проверку на N предмет. У меня записка лежит, надо чтобы после ее подбора пришло сообщение секунд через 30 на ПДА. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
molodoy_chelovek 124 Опубликовано 28 сентября, 2020 detoxe =actor_has_item(секция_айтема) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Hoperise 210 Опубликовано 28 сентября, 2020 Добрый вечер! Существует ли функция на подсчет найденных игроком артефактов (таблица с проверкой перечня артефактов (и если есть способ туда затащить в исключения квестовые предметы)), то есть проверка на то, что каждый артефакт побывал в инвентаре у гг хотя бы раз? П.С. идеально бы привести какой-либо пример, пошло бы полегче. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 953 Опубликовано 28 сентября, 2020 4 часа назад, Winzor сказал: Но это же так долго, и так много. Согласен, лучше править движек. Дополнено 4 минуты спустя 3 часа назад, Hoperise сказал: Существует ли функция на подсчет найденных игроком артефактов xr_statistic.inc_founded_artefacts_counter(art_id) 3 часа назад, Hoperise сказал: таблица с проверкой перечня артефактов xr_statistic.taken_artefacts Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 28 сентября, 2020 Я создал кнопку на GUI, но если на неё не нажимать, то ничего не происходит. Но я добавил кнопку относительно self.oBackground (это окно). GUI вызывается при нажатии кнопки в настройках игры. Код под спойлером. Спойлер class "CSelectHudWindow" (CUIScriptWnd) function CSelectHudWindow:__init() super() self:InitControls() self:InitCallBacks() end function CSelectHudWindow:__finalize() end function CSelectHudWindow:InitControls() local oCXml = CScriptXmlInit() oCXml:ParseFile("ui_mm_select_hud_wnd.xml") self.oBackground = oCXml:InitStatic("background",self) self.oBtnQuit = oCXml:Init3tButton("background:btn_quit",self.oBackground) self:Register (self.oBtnQuit, "OnBtnQuit") self.oHudBtn1 = oCXml:Init3tButton("background:button_1_default",self.oBackground) self:Register (self.oHudBtn1, "OnBtn1Clicked") self.oPicture = oCXml:InitStatic("background:picture",self.oBackground) self.bWide = utils.is_widescreen() end function CSelectHudWindow:InitCallBacks() self:AddCallback("OnBtnQuit", ui_events.BUTTON_CLICKED, self.OnQuit, self) self:AddCallback("OnBtn1Clicked", ui_events.BUTTON_CLICKED, self.OnBtn1Clicked, self) end function CSelectHudWindow:OnBtn1Clicked() local oSelectedItem = self.oListItem:GetSelectedItem() if not oSelectedItem then return end self.oPicture:Show(true) self.oPicture:InitTexture("ui_mm_hud_default") if self.bWide then self.oPicture:SetWndPos(vector2():set(264,159)) else self.oPicture:SetWndPos(vector2():set(265,159)) end end function CSelectHudWindow:OnKeyboard(dik, keyboard_action) CUIScriptWnd.OnKeyboard(self, dik, keyboard_action) if keyboard_action==ui_events.WINDOW_KEY_PRESSED then if dik==DIK_keys.DIK_ESCAPE then self:OnQuit() end end return true end function CSelectHudWindow:OnQuit() self.oPicture:Show(false) self:HideDialog() end Также и ui файл: Спойлер <background x="102" y="0" width="819" height="768" stretch="1"> <texture>ui_inGame2_Mp_screen_main_window</texture> <btn_quit x="472" y="17" width="86" height="25"> <text align="c" font="letterica16">ui_mm_back</text> <texture>ui_inGame2_button</texture> <text_color> <e r="210" g="210" b="210"/> </text_color> </btn_quit> <button_1_default x="156" y="430" width="101" height="27"> <text align="c" font="letterica16">ui_mm_default</text> <texture>ui_inGame2_button</texture> <text_color> <e r="210" g="210" b="210"/> </text_color> </button_1_default> <picture x="422" y="200" width="256" height="128" stretch="1"> <texture width="256" height="128">ui\ui_noise</texture> </picture> </background> Я из спойлера убрал <w>, </w> Как решить эту проблему? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doloremque 527 Опубликовано 29 сентября, 2020 Написал такую логику. При входе в рестриктор должно приходить сообщение на ПДА. Ловлю вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : d:\games\farthest edge\gamedata\scripts\_g.script:489: bad argument #2 to 'format' (string expected, got nil) [logic] active = sr_idle [sr_idle] on_actor_inside = sr_tip [sr_tip] name = story_talk_tihiy_1 type = tips cond = {+pok_sotka_dialog_done} sender = default on_actor_inside = nil timeout = 100000 showtime = 10000 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты