Это популярное сообщение. Dennis_Chikin 3 658 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
ted.80 278 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @юлий мунин, Привет в логе конкретно написано ошибка в bind_stalker.script:192 строка скинь свой скрипт и bind_stalker.script будем посмотреть Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
юлий мунин 0 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @ted.80, Вот bind_stalker.script: Скрытый текст function init (obj) xr_motivator.AddToMotivator(obj) end function actor_init (npc) npc:bind_object(actor_binder(npc)) end local game_difficulty_by_num = { [0] = "gd_novice", [1] = "gd_stalker", [2] = "gd_veteran", [3] = "gd_master" } lasthealth = 0 lasttime = 0 post_process = 0 local weapon_hide = false ---------------------------------------------------------------------------------------------------------------------- class "actor_binder" (object_binder) ---------------------------------------------------------------------------------------------------------------------- function actor_binder:__init (obj) super(obj) self.bCheckStart = false self.weather_manager = level_weathers.WeatherManager() self.actor_detector = xr_detector.actor_detector() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_spawn(data) printf("actor net spawn") level.show_indicators() self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг. if object_binder.net_spawn(self,data) == false then return false end db.add_actor(self.object) if self.st.disable_input_time == nil then level.enable_input() end self.weather_manager:reset() -- game_stats.initialize () if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end --' Загружаем настройки дропа death_manager.init_drop_settings() return true end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object) sr_light.clean_up () 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.use_object, nil) --self.object:set_callback(callback.actor_sleep, 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) if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy() sr_psy_antenna.psy_antenna = false end xr_sound.stop_all_sound_object() 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.next_restrictors_update_time = -10000 self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_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.use_object, self.use_object, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end treasure_manager.take_item_from_box(box, story_id) --[[ local respawner = se_respawn.get_respawner_by_parent(story_id) if respawner == nil then return end --' Необходимо уменьшить счетчик в респавнере respawner:remove_spawned(item:id()) local smart_terrain = db.strn_by_respawn[respawner:name()] if smart_terrain == nil then return end local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position()) if npc ~= nil then xr_sound.set_sound_play(npc, "reac_box") xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor) end ]] end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_enter(npc, info_id) self.actor_detector:actor_enter() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_exit(npc, info_id) self.actor_detector:actor_exit() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id) printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) --' Сюжет level_tasks.proceed(self.object) -- Отметки на карте level_tasks.process_info_portion(info_id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_trade (item, sell_bye, money) if sell_bye == true then game_stats.money_trade_update (money) else game_stats.money_trade_update (-money) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:article_callback(npc, group, name) --printf("article_callback [%s][%s]", group, name) if device().precache_frame >1 then return end if group == "Diary" then news_manager.send_encyclopedy("diary", group) else news_manager.send_encyclopedy("encyclopedy", group) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) --game_stats.update_take_item (obj, self.object) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_object (obj) sound.use_snd (obj) end ----------------------------------------------------------------------------------------------------------------------- function actor_binder:task_callback(_task, _objective, _state) task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state) if _objective:get_idx() == 0 then if _state == task.fail then news_manager.send_task(db.actor, "fail", _task, _objective) elseif _state == task.completed then task_manager.reward_by_task(_task) news_manager.send_task(db.actor, "complete", _task, _objective) else news_manager.send_task(db.actor, "new", _task, _objective) end else if _task:get_objective(0):get_state() == task.in_progress then news_manager.send_task(db.actor, "update", _task, _objective) end end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:map_location_added_callback(spot_type_str, object_id) if (false==app_ready()) or (device().precache_frame>1) then return end --'news_manager.send_task(db.actor, "new") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update() local time = time_global() game_stats.update (delta, self.object) -- апдейт погоды self.weather_manager:update() -- апдейт схемы детектора self.actor_detector:update() -- апдейт звуковой схемы актера xr_sound.update_actor() --' Проверка потери жизни --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime) lasthealth = self.object.health lasttime = game.time() end ]] -- Обновление отключения ввода с клавиатуры. 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.st.sleep_relocate_time ~= nil and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then self.object:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) self.object:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end -- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta) self.next_restrictors_update_time = time + 200 task_manager.actor_update() end -- обновление постпроцессов if post_process ~= 0 then if post_process:update () == true then post_process = 0 end end -- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --' Вывод сообщения о большой радиации if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end if self.bCheckStart then printf("SET DEFAULT INFOS") if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") end -- if not has_alife_info("encyclopedy") then -- self.object:give_info_portion("encyclopedy") -- end if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end level_tasks.add_lchanger_location() self.bCheckStart = false end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) local save_treasure_manager = true printf("actor_binder:save(): self.object:name()='%s'", self.object:name()) object_binder.save(self, packet) --' Сохраняем уровень сложности if save_treasure_manager == true then packet:w_u8(level.get_game_difficulty() + 128) else packet:w_u8(level.get_game_difficulty()) end --' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packer: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) sr_psy_antenna.save( packet ) if save_treasure_manager == true then treasure_manager.save(packet) end task_manager.save(packet) self.actor_detector:save(packet) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) printf("actor_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name()) --' Загружаем уровень сложности local game_difficulty = reader:r_u8() local load_treasure_manager = false if game_difficulty >= 128 then game_difficulty = game_difficulty - 128 load_treasure_manager = true end get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) if reader:r_eof() then abort("SAVE FILE IS CORRUPT") 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) sr_psy_antenna.load(reader) if load_treasure_manager == true then treasure_manager.load(reader) end task_manager.load(reader) self.actor_detector:load(reader) end ---------------------------------------------------------------------------------------------------------------------- --старт префетча звуков --if string.find(command_line(), "-noprefetch") == nil then -- sound_prefetch.prefetch_sounds() --end -- Weapon functions function hide_weapon() weapon_hide = true end function restore_weapon() weapon_hide = false end // this is test for section iteration /** local function test_section_iteration(file_name, section_name) printf ("file : %s",file_name) printf ("section : %s",section_name) local file = ini_file(file_name) local n = file:line_count(section_name) printf ("lines : %d",n) local id, value = "", "", result for i=0,n-1 do result, id, value = file:r_line(section_name,i,"","") printf ("line %d : %s = %s",i,id,value) end end test_section_iteration("system.ltx","space_restrictor") /**/ А вот sound.script Скрытый текст function use_snd(obj) local obj_sect = obj:section() local snd if obj_sect == 'synth' then snd = [[mus\sinth]] elseif obj_sect == 'rock_guitar' then snd = [[mus\git]] elseif obj_sect == 'tamal' then snd = [[mus\new]] end if snd then local snd_obj = xr_sound.get_safe_sound_object(snd) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end end Ссылка на комментарий
ted.80 278 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @юлий мунин, замени код в sound Скрытый текст function use_snd(obj) local obj_sect = obj:section() local snd if obj_sect == "synth" then snd = [[mus\sinth]] elseif obj_sect == "rock_guitar" then snd = [[mus\git]] elseif obj_sect == "tamal" then snd = [[mus\new]] end if snd then local snd_obj = xr_sound.get_safe_sound_object(snd) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end end когда сравниваешь секцию if obj_sect == "synth" саму секцию пиши через "двойной апостроф" чтобы игра понимала что это строка эту функцию перенеси в низ файла перед "-- Weapon functions" Скрытый текст ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_object(obj) if sound then sound.use_snd(obj) else db.actor:give_game_news("В файле Sound ошибка или он отсутствует!!!", "ui\\ui_iconsTotal", Frect():set(913,235,83,47), 0, 30000) end end ---------------------------------------------------------------------------------------------------------------------- И пробуй Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
UriZzz 1 004 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @юлий мунин вот тебе рабочая функция Скрытый текст -- Звуки юза шамовки, медикоментов, напитков, by Nazgool, гопыч function use_snd(obj) local obj_sect = obj:section() local snd -- Медикоменты if obj_sect == 'medkit' then snd = [[interface\inv_medkit]] elseif obj_sect == 'medkit_army' then snd = [[interface\inv_medkit]] elseif obj_sect == 'medkit_scientic' then snd = [[interface\inv_medkit]] elseif obj_sect == 'bandage' then snd = [[interface\inv_bandage]] elseif obj_sect == 'antirad' then snd = [[interface\inv_pills]] -- Еда elseif obj_sect == 'bread' then snd = [[interface\inv_food]] elseif obj_sect == 'kolbasa' then snd = [[interface\inv_food]] elseif obj_sect == 'conserva' then snd = [[interface\inv_food]] -- Напитки elseif obj_sect == 'vodka' then snd = [[interface\inv_vodka]] elseif obj_sect == 'energy_drink' then snd = [[interface\inv_softdrink]] -- elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]] end if snd then local snd_obj = xr_sound.get_safe_sound_object(snd) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end end Для озвучки юза я её использую, проблем ни каких, измени только итемы и пути к звукам. Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
юлий мунин 0 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @ted.80, Сделал всё точно так же, как вы и сказали. Апострофами секции отметил, строку перенёс. Теперь игра воет точно так же, но только другая строка. Lua error...bind_stalker.script:426: attempt to call field 'use_snd' (a nil value) Ссылка на комментарий
ted.80 278 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 (изменено) 13 минут назад, юлий мунин сказал: bind_stalker.script:426 что в этой строке? погоди, а звуки вообще лежат по нужному пути? и откуда звуки? Изменено 25 Апреля 2020 пользователем ted.80 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
юлий мунин 0 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @ted.80, в строке 426 написано: sound.use_snd (obj) Звуки лежат как положено в директории игры \gamedata\sounds\mus\(звук.ogg) Звуки свои, отконвертированные в sdk. Ссылка на комментарий
UriZzz 1 004 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 (изменено) @юлий мунин, синтаксическая ошибка в коде. Братья - сталкеры, тут проблема возникла, пытаюсь добавить болт на худ на статик патронов, он отображается но почему то постоянно и под статиком патронов а не на нём, как прочие иконки. Скрытый текст local bolt = db.actor:active_slot(5) function bolt_na_hud() if bolt then get_hud():AddCustomStatic("hud_bolt", true) else get_hud():RemoveCustomStatic("hud_bolt") end end Скрытый текст <hud_bolt x="921" y="711" width="38" height="38"> <texture x="850" y="950" width="50" height="50">ui\ui_icon_equipment</texture> </hud_bolt> Блин, что я упускаю? Изменено 25 Апреля 2020 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
ted.80 278 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @юлий мунин, попробуй сменить имя файла, на допустим my_sound и ссылку поправь 1 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
юлий мунин 0 Опубликовано 25 Апреля 2020 Поделиться Опубликовано 25 Апреля 2020 @ted.80, ого. Представляете: заработало! Возможно, игра сначала не понимала, что от неё хотят, думала, что sound-не имя, а действие. Буду знать теперь. @ted.80, а вы случайно не знаете, как присвоить несколько звуков одному предмету, например, рации? Надо отдельный фаил создавать? 1 Ссылка на комментарий
nasar75 3 868 Опубликовано 26 Апреля 2020 Поделиться Опубликовано 26 Апреля 2020 Есть мод Тайные Тропы 2 на движке OGSR Engine x64. В ём есть проблема - в подземке Агропрома в одном месте идет страшная просадка фпс: Измененные файлы уровня: level.gct level.graph level.spawn level.gct.raw level_sectors.ai Я так понимаю, что просадка происходит из-за света. НО совершенно не понимаю, куда копать..... AMD Athlon II X2 250, NVIDIA GTS 450, RAM 8.0 GB, WIN 7/64 правки Золотой Шар Ссылка на комментарий
ted.80 278 Опубликовано 26 Апреля 2020 Поделиться Опубликовано 26 Апреля 2020 12 часов назад, юлий мунин сказал: как присвоить несколько звуков одному предмету, например, рации? Скрытый текст local Radio = { [[Radio_1]], [[Radio_2]], [[Radio_3]], [[Radio_4]] } if obj_sect == "radio" then snd = Radio[math.random(#Radio)] 1 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
юлий мунин 0 Опубликовано 26 Апреля 2020 Поделиться Опубликовано 26 Апреля 2020 @ted.80, а куда эту функцию вписывать? Я сделал отдельный скрипт с этими строками-опробовал рацию-игра молчит. Ссылка на комментарий
ted.80 278 Опубликовано 26 Апреля 2020 Поделиться Опубликовано 26 Апреля 2020 @юлий мунин, Замени код в своём скрипте Скрытый текст local Radio = { [[characters_voice\scenario\yantar\ghost_pda]], [[characters_voice\scenario\yantar\vasiliev_pda]], [[characters_voice\scenario\yantar\professor_to_actor_pda_4]], [[characters_voice\scenario\yantar\professor_to_actor_pda_2]], [[characters_voice\scenario\yantar\professor_to_actor_pda_3]], [[characters_voice\scenario\yantar\professor_to_actor_pda_5]] } function use_snd(obj) local obj_sect = obj:section() local snd if obj_sect == "synth" then snd = [[mus\sinth]] elseif obj_sect == "rock_guitar" then snd = [[mus\git]] elseif obj_sect == "tamal" then snd = [[mus\new]] elseif obj_sect == "СЕКЦИЯ_РАЦИИ" then snd = Radio[math.random(#Radio)] end if snd then local snd_obj = xr_sound.get_safe_sound_object(snd) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end end 1 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
Вася Сапля 4 Опубликовано 27 Апреля 2020 Поделиться Опубликовано 27 Апреля 2020 (изменено) Господа, кто мне скажет почему в ванильном аутфит лтх иммунитеты у костюмов прописаны на 0.0001, при этом все костюмы изнашиваются если этот файл не закидывать в папку с игрой. Если закинуть тогда понятно износ пропадает. Почему так происходит и как это всё работает - не могу понять. И ещё, кто нибудь знает каким образом можно у Петрухи убрать бинокль из продажи? У сталкера на свалке на кладбище такой проблемы не наблюдается. А, и ещё, никто не знает что ли как научить неписей пользоваться автоматическими пистолетами и винтарями? Недавно спрашивал , никто не ответил. Изменено 27 Апреля 2020 пользователем Вася Сапля Ссылка на комментарий
phalcor 60 Опубликовано 27 Апреля 2020 Поделиться Опубликовано 27 Апреля 2020 Здравствуйте! Будьте добры, подскажите, где можно почитать о формате файла fsgame.ltx - за что отвечает каждый из параметров в строке. А то везде только разрозненную информацию нахожу. Ссылка на комментарий
KoteikovichKoteikin 0 Опубликовано 28 Апреля 2020 Поделиться Опубликовано 28 Апреля 2020 Доброго времени суток, недавно решил познать дзен модостроения на ТЧ, но вот незадача, уже месяц не могу найти информации по созданию квеста на "убийство определённой группы сталкеров". Может кто-то может подсказать где найти именно эту информацию поточнее или подкинуть ссылку на какой-то учебный материал. Ссылка на комментарий
AndrewMor 527 Опубликовано 28 Апреля 2020 Поделиться Опубликовано 28 Апреля 2020 Камрады, просветите: после сна ГГ не сразу резкость наводит, скажем так, шатает его, короче (типа, он поднимается с кровати). Это в движке прописано, или где-то в конфиге? Сталкер - наше всё! Ссылка на комментарий
ted.80 278 Опубликовано 28 Апреля 2020 Поделиться Опубликовано 28 Апреля 2020 2 минуты назад, AndrewMor сказал: после сна ГГ не сразу резкость наводит Ну в ванили сна нет, значит ты в мод играешь, вопрос - какой? 1 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
Капрал Хикс 534 Опубликовано 28 Апреля 2020 Поделиться Опубликовано 28 Апреля 2020 25 минут назад, ted.80 сказал: Ну в ванили сна нет А как же обмороки ГГ по сюжету? Я полагаю, это имелось в виду? Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти