- Список аддонов: MLR 5.4, STCoP (2.9), Advanced Weapon Repair 0.3, DoctorX Questlines, DoctorX Dynamic Anomalies 1.3, Axebeards FieldCraft v1d, Old Ammo, FightCry, NanoCell Inventory, Outfit Addon Extended Edition 0.2, Outfit Marauder, Fast Travel, Immersive fast travel 1.0, Campfire Cooking 0.45, TRX - Zone FM (v.2), Randomized Mutant Looting Sounds, TRX: Fixes & Improvements, Hand_Crank_Generator_0.1, Smart Artefact Spawn, Deployable Tent F Build, DK Changes, Companions Quick Menu 1.0, Loot money, No ammo hud, Маскхалат из Misery 2.2, Работа Проводником 4.2, Радио Тридогнайт, Симуляция Жажды, Метки Отрядов, Пси шлем, Плеер с чатом, Физический Облик Денег, Опасные НПС, Взрыв поврежденного оружия
- Также добавлено: Более 60 новых визуалов, 34 Артефакта, 21 Старо/Новых Мутантов, 20 Совершенно Новых Костюмов, 17 Медикаментов, 10 Частей Монстров, 6 Мощных Прикладных Модулей, Аномальный Рюкзак, Топор из TAZ 1.7.4, Опции Atmosfear, Тайники из ТЧ и ЧН, Анимированные детекторы, Статические Новости, Новости о Выбросе, Сообщение о Смерти Сталкеров и Выбросах
- Прочие изменения: Полный перенос на 1.4.22, Инвентарь, графика, звуки, параметры из Misery 2.2, Некоторые фишки из CoC 1.5, Новые разделы в пда, Некоторые фишки из MLR 6.2, Уменьшен расход батареек на электронику, Изменен звук шагов, Многочисленные правки в описаниях предметов, Изменено стартовое снаряжение, Ценовые правки, Ночное видение для всех научных костюмов, Музыка из Misery, Костюмы со своим уникальным описанием, Более индивидуальные показатели защиты всех костюмов, Большое количество стартовых мест, Добавлена система разделения NPC по рангам, Усложнены условия для достижений, Для повышения ранга нужно больше очков, Озвучка грызунам, Звукам добавлены нехватающие теги, Новый инвентарь, Новая/старая симуляция, Уникальное меню и экран загрузки, Новые иконки, Незначительные правки каменного и многое другое…
- В менеджере аддонов: DRX CoC Dynamic Anomalies 1.3, Eugenium Hazardous Anomalies, HD модели сталкеров (Оптимизированы), Taunts, Бартер с NPC, Игра в 21 очко, Динамическое отношение группировок, Autumn Misery, Autumn Range 1.1, SWTC Advanced, White Power 1.0 и многое другое! (122 шт. адонов/правок)
Где скачать? Ответ: Скачать актуальную версию игры можно в нашем официальном сообществе. Внимание! Скачивать с других источников не рекомендуется. Ссылки на скачивание находятся в разделе "Информация". Выберете подходящий вам файлообменник. (Яндекс Диск или Гугл Диск)
Как установить игру? Ответ: Вам нужно распаковать архив в удобное вам место. В архиве уже содержатся сама игра актуальной версии.
Как установить патч? Ответ: Вам нужно распаковать архив патча в папку где находится игра. С заменой файлов соглашайтесь.
В чем отличая от оригинального Call of Misery? Ответ: Вся подробная информация есть в нашем гугл документе.
Будет ссылка на Torrent? Ответ: Нет не будет. У нас нет возможности стоять на раздаче.
У меня не запускается игра, что мне делать? Ответ: Скорее всего отсутствует запись в реестре. Вам нужно скачать архив и открыть папку x32 или x64, в зависимости от разрядности вашей системы, запустить приложение, которое находится внутри и установить его. Теперь игра будет запускаться.
Как включить спавнер? Ответ: Разместите ярлык игры на рабочий стол. Правой кнопкой мыши щелкните на ярлык и выберете свойства. В открытом окне найдите строчку "объект" и в самом конце после кавычек пропишите "-dbg". Должно получиться вот так: "D:\S.T.A.L.K.E.R\S.T.A.L.K.E.R. Last Day 1.1\Stalker-CoC.exe" -dbg". Что бы вызвать спавнер, нужно в меню игры нажать клавишу "S".
Что за новые файлы в папке с игрой? Ответ: Это специальные батники улучшающие работоспособность. Нужный батник должен соответствовать количеству ядер на вашем ПК. Если у вас 2 ядра то нужно запускать батник для 2, если 4 соответственно для 4. Внимание! Не рекомендуется запускать батники с большим количеством ядер чем у вашего ПК. P.s Запуск с батников на ваше усмотрение, можно играть и через обычный ярлык.
Почему в папке "gamedata" нет привычных мне файлов? Ответ: Большая часть файлов игры запакована в db архивы. Сделано это для экономии места и большей производительности игры. Внимание! Не рекомендуем распаковывать db архивы.
Я могу установить сторонний аддон? Ответ: Можете, но мы не рекомендуем ставить что либо. (Установка сторонних аддонов на свой страх и риск) Проверенный список работающих аддонов находится в специальной теме.
Какие коэффициенты спавна являются рекомендуемыми? Ответ: Те что стоят по умолчанию. А именно мутанты 0.75, сталкеры 0.5.
На каком освещении стоит играть? (DX) Ответ: Если у вас слабый компьютер то не выше DX8, для средних советуем только DX9 и для мощных не выше DX10. P.s DX11 считается забагованым, при его использовании замечается частые вылеты.
Какой FOV является рекомендуемым? Ответ: 67.5, 40.
Есть ли в сборке разбор оружия и брони? Ответ: Есть. Что бы разобрать автомат или дробовик нужно перетянуть лом или молот на нужное вам оружие. Для разборка пистолетов нужен швейцарский нож. Броня разбирается также ломом и молотом, а противогазы швейцарским ножом.
ГГ погибает моментально после загрузки, как быть? Ответ: Не рекомендуется сохраняться перед выбросом или во время выброса. Как вариант – временно включить бессмертие. Для этого нужно запустить игру в debug-режиме (к ярлыку игры дописать -dbg), после чего в самой игре в консоли прописать g_god 1. Чтобы выключить бессмертие – g_god 0.
Почему важные NPC группировок не дают новых заданий? Ответ: Новые задания появляются через несколько дней. Попробуйте заняться пока чем-нибудь другим или выполнять задания у других группировок.
Вылет при переходе на Кладбище техники, ошибка «...Out of memory» или ошибка «stack trace:» как исправить? Ответ: Загрузить austosave после перехода на локацию, если не помогло, то снизить настройки графики, закрыть фоновые приложения.
Не получается сдать задание, NPC не хочет разговаривать, как быть? Ответ: Загрузка последнего сохранения и быстрое последовательное нажатие клавиш «Использовать» («Говорить») и «1» («Задание выполнено»). Попробовать перейти на другую локацию и вернуться; подождать, пока NPC станет лидером отряда естественным (либо искусственным, тайком убив лидера) путём.
Взял квест на уничтожение логова мутантов, всех убил, а задание не выполняется?! Ответ: Вероятнее всего, один из мутантов убежал с точки, он будет помечен на карте как «Неизвестный враг». Обычно так делают крысы и тушканы. Возможно, что по ночам квестовые мутанты не появляются, то есть идти на точку необходимо днём.
Как решить проблему с квестом на спасение заложника, который почти всегда оказывается на участке между локациями? Ответ: Бросить к нему дымовую гранату или в debug-режиме (к ярлыку игры дописать -dbg) ввести команду консоли demo_record 1, подлететь к нему и нажать клавишу «Enter».
Где Шустрый? Ответ: На Скадовске.
Где папка с сохранениями? Ответ: appdata\savedgames.
Скриншоты и где они хранятся? Ответ: На клавишу «F12», хранятся в appdata\screenshots.
Где найти инструменты? Ответ: В тайниках (случайно), если тайник помечен зелёной меткой – шансы ощутимо выше. Также один полный комплект инструментов спрятан по трём локациям. P. S. Лесник в Рыжем лесу и военный на Янтаре делает апгрейд без инструментов, но за большую плату.
Почему на северных локациях мало сталкеров? Ответ: Необходимо отключить пси-установку в лаборатории X-10 и пси-установку в лаборатории X-16.
Есть ли в игре проводники? Ответ: Да.
Где взять детектор «Сварог»? Ответ: Данный детектор продаётся исключительно у Германа в бункере учёных и только при дружественной репутации у группировки «Экологи».
Если оставить в случайном ящике вещи, они пропадут? Ответ: Нет, даже если вам дадут наводку на этот тайник.
Сделал свой тайник из рюкзака, куда он пропал? Ответ: Провалился под текстуры, не делайте свои тайники на крышах.
Как включить «Тайна Зоны»? Ответ: При новой игре включить «Сюжетный режим».
Для чего реализовано несколько ножей и охотничий набор? Ответ: Чем сильнее мутант, тем лучше нужен нож для его разделки. Охотничий набор даёт больший шанс выпадения частей мутантов и значительно снижает время срезания.
Где искать Болотного Доктора? Ответ: На базе «Чистого Неба», у вышки на северо-западе от базы или в пещере под разрушенным мостом на северо-западе Болот, иногда он просто гуляет по окрестностям Болот. Также он может погибнуть.
Как используется универсальное зарядное устройство? Ответ: Его состояние показывает текущий запас энергии, которая расходуется на предметы: КПК. Крайне малое энергопотребление Налобный фонарик. Малое энергопотребление Детекторы. Энергопотребление зависит от типа детектора – от малого до высокого Прикладные модули артефактов. Крайне малое энергопотребление Прибор ночного видения. Среднее энергопотребление Если кончился заряд – не будет возможности пользоваться вышеперечисленными устройствами.
Как работает пси-шлем? Ответ: Со шлемом пропадают иллюзии-клоны, которые появляются от живых мутантов. Также, шлем спасает от пси-воздействия в лаборатории. Работает, находясь в инвентаре.
Слишком много/мало живности в игре, что делать? Ответ: Изменить коэффициенты спавна в настройках игры, перезапустить игру и перезайти на локацию.
Почему не находятся артефакты? Ответ: Они появляются после выброса, другие сталкеры тоже охотятся за ними.
Как попасть в Военную лабораторию? Ответ: При включенной «Тайне Зоны» завершить сбор всех квестовых документов + взять декодер из квартиры в Припяти, код от основной двери – 26041986.
Почему не получается предложить сталкерам присоединиться к ГГ в отряд? Ответ: Необходимо иметь к ним отношение «Друг». Выполнять второстепенные задания, помогать раненым, повышать репутацию.
Нет в продаже таких костюмов, как: «Сева» и экзоскелет. Что делать? Ответ: У каждой группировки есть задания. Выполняя эти задания вы получаете 50 «Очков Отношения» группировки за каждое. Когда «Отношение» перевалит за 800 – появится в продаже «Сева» и «Тяжелый костюм группировки» в продаже у основного торговца группировки. Если отношение больше 1000 – появляется экзоскелет. За каждое проваленное задание отнимается 25 «Очков Отношения» с группировкой работодателя.
Как лечиться? Здоровье само по себе не восстанавливается! Аптечки стоят крайне дорого! Ответ: У медиков и учёных цены на медикаменты ощутимо ниже. Кроме того, медики и сами за сносную цену могут полностью вылечить или вывести радиацию. Если повезло найти Болотного Доктора – он поправит здоровье бесплатно.
Приходится тратить много времени и патронов на тушканов, что с этим делать? Ответ: Тушканов и крыс можно пинать нажатием на клавишу «Использовать».
Как допрашивать раненых? Ответ: С некоторой вероятностью, раненый встанет на колени и заложит руки за голову, тогда с ним можно поговорить. Избегайте раненых фанатиков, которые взрываются во славу своего идола, лишь бы не попасть в плен.
У меня есть: вопрос, вылет, баг или предложение, что мне делать? Ответ: По вопросам на тему сборки есть специальная тема. Если у вас возник вылет или баг то сообщите нам об этом в специальной теме. Также существуют другие темы. Внимание! Не нужно ломиться сломя голову к разработчику в ЛС. На крайний случай у нас доступна функция "Сообщения сообщества".
Полезная информация
Влияние настроек графики на FPS Дальность видимости. Среднее влияние на производительность; Детализация объектов. Практически нет влияния на производительность. Разница может оказаться заметна на старых видеокартах; Качество текстур. Есть влияние на производительность, если мало видеопамяти и «железо» поддерживает только DX8. Если иконки в инвентаре или другие элементы интерфейса отображаются неправильно, рекомендуется поднять качество как можно выше; Фильтрация текстур. Практически нет влияния на производительность; Сглаживание (выбор 2x-4x-8x). Сильное влияние на производительность; Сглаживание (ползунок-полоска). На производительность не влияет; Плотность травы (r2_detail_density). Влияние на производительность по экспоненте; Дистанция травы (r2_detail_radius). Среднее влияние на производительность; Высота травы. Влияние на производительность ниже среднего. Низкие и средние значения на производительности почти не скажутся, а высокие – скажутся заметно; Тень от солнца. Сильное влияние на производительность; Тень травы. Влияние на производительность ниже среднего; Тень от игрока. Отсутствует влияние на производительность; Дальность освещения. Влияние на производительность ниже среднего; Качество теней. Среднее влияние на производительность; Свет фонариков NPC. Для современных карт влияние на производительность отсутствует; Детальный рельеф. Для современных карт влияние на производительность отсутствует; Steep parallax. Для современных карт влияние на производительность отсутствует; Качество солнца. Влияние на производительность ниже среднего; Солнечные лучи. Среднее влияние на производительность; Интенсивность лучей. Отсутствует влияние на производительность; Интенсивность блеска. Отсутствует влияние на производительность; Режим SSAO. Среднее влияние на производительность. Для AMD рекомендуется HDAO, для NVIDIA – HBAO; Качество SSAO. Среднее влияние на производительность. Сглаживает затенение, делая его более точным. Спорный момент, может показаться так, что с лучшей опцией графика становится хуже; Мягкая вода. Отсутствует влияние на производительность; Мягкие частицы. Рекомендуется отключить. Должны смягчать края эффектов, делая их более приятными глазу. На деле – некоторые детали, например, искры от выстрела, пропадают совсем; Глубина резкости. Отсутствует влияние на производительность; Объемный свет. Отсутствует влияние на производительность; Намокание плоскостей. Слабое влияние на производительность; Вертикальная синхронизация. Влияние на производительность зависит от видеокарты; Частота 60 Гц. Отсутствует влияние на производительность.
Примечания:
«Слабое» влияние на производительность – 1-3 FPS «Среднее» влияние на производительность – 5-7 FPS. «Сильное» влияние на производительность – 10+ FPS.
Дальнейшая разработка Last Day прекращена по желанию автора - Xameleon201
Сообщение отредактировал X_A_M_E_L_E_O_N - Пятница, 07.09.2018, 23:42
Сегодня выложу версию 1.1b моей правки на прицелы - будет в подписи. Если тебе это интересно - можешь адаптировать в 1.3.
Вообще, покопавшись в STCoP WP, такого поувидел.... много иконок в апгрейдах с другого оружия, хотя реально в *.dds-файлах есть все необходимые иконки, которые подходят к соответствующим апгрейдам. Куча стволов с величиной базовой кратности прицелов, которая не соответствует тому, что написано в описании самого ствола. Апгрейды на кратность - почти нигде не совпадали с тем, что на них написано. И много чего другого, что можно было бы исправить/изменить. Но всё это "вылизать" - это слишком долго. Может когда-нибудь, но наврядле
Сообщение отредактировал AnyKey - Четверг, 14.12.2017, 20:51
Немного информации по поводу вылета, из поста Sinigr:
Пока было свободное время, провел некоторое "исследование" данной проблемы. Для тех, кто не захочет читать всю "простыню" моих изысканий, скажу сразу - непосредственная причина вылета в трех НПС с ID 22361, 22362 и 22371. Если выразиться точнее, то, вылет возникает при попытке загрузки данных НПС. Подробнее об этом ниже. Проблемные НПС - это 2 типа зомби - zombi_babka_2 и zombi_x3. При распаковке scoc-файл, в который, с помощью библиотеки Marshal, сериализованы данные сохранения в CoC Store, то, среди прочего, можно увидеть следующие таблицы:
Интересный момент в том, что десериализация проходит через раз, и часто вылетает по переполнению памяти, которая, похоже, выделена для LUA-интерпретатора в очень ограниченном объеме. Изначальный размер сериализованного scoc файла - 860кб, после десериализации 541кб. Около 60Кб этого объема, занимают таблицы fonswong-а, с историей чата (можно удалить из PDA). Если удалить ранее указанные ID, через увод в оффлайн и последующий release, то загрузка проходит без ошибок, как после убийства химеры, так и прочих НПС в округе, например, идущих зомби (кстати, убийство их на том сейве, так же вызовет вылет). Самый тривиальный пример "удаления":
Цитата
function r() local t = { 22361,22362,22371 }
for _,k in ipairs(t) do alun_utils.switch_offline(k) local se_obj = alife():object(k) if se_obj then alife():release(se_obj,true) end end end
Указанные 3 НПС идут в 2 сквадах (жирным выделены НПС, их смарты и рестрикторы):
Цитата
rad_zombied1:7590:ON_REGISTER start pick_section_from_condlist start rad_zombied1:7590:load_jobs nil Before rad_zombied1:load_jobs nil After simulation_board:init_smart rad_zombied1 simulation_board:assign_squad_to_smart simulation_zombie22360 smart_id=7590 simulation_zombie22360:assign_smart rad_zombied1 rad_zombied1:7590:register_npc zombi_x322361 rad_zombied1:7590:fill_npc_info zombi_x322361 rad_zombied1:select_npc_job nil rad_zombied1:7590:register_npc zombi_babka_222362 rad_zombied1:7590:fill_npc_info zombi_babka_222362 rad_zombied1:select_npc_job nil sim_squad_scripted:get_script_target pick_section_from_condlist start pick_section_from_condlist end 3 rad_zombied1:7590:fill_npc_info zombi_x322361 rad_zombied1:7590:fill_npc_info zombi_babka_222362 rad_zombied1:7590:ON_REGISTER END rad_zombied2:7591:ON_REGISTER start pick_section_from_condlist start rad_zombied2:7591:load_jobs nil Before rad_zombied2:load_jobs nil After simulation_board:init_smart rad_zombied2 simulation_board:assign_squad_to_smart simulation_zombie22370 smart_id=7591 simulation_zombie22370:assign_smart rad_zombied2 rad_zombied2:7591:register_npc zombi_x322371 rad_zombied2:7591:fill_npc_info zombi_x322371 rad_zombied2:select_npc_job nil sim_squad_scripted:get_script_target pick_section_from_condlist start pick_section_from_condlist end 3 simulation_board:assign_squad_to_smart zombied_sim_squad_veteran26510 smart_id=7591 zombied_sim_squad_veteran26510:assign_smart rad_zombied2 rad_zombied2:7591:register_npc sim_default_zombied_426511 sim_squad_scripted:get_script_target pick_section_from_condlist start pick_section_from_condlist end 3 rad_zombied2:7591:fill_npc_info zombi_x322371 rad_zombied2:7591:fill_npc_info sim_default_zombied_426511 rad_zombied2:7591:ON_REGISTER END
Рестрикторы в all.spawn:
Цитата
[2930]
; cse_abstract properties section_name = space_restrictor name = rad_after_all_fake_gunfire_sound_restricor position = 283.011688232422, -43.2851104736328, 41.0064544677734 direction = 0.103543996810913, -0.00242200004868209, 0.0234290007501841 id = 65535 version = 128 cse_abstract__unk1_u16 = 0x1 script_version = 12 spawn_id = 7590
Лог нормальной загрузки(без вылета, без изменений) для данных НПС выглядит так:
Цитата
se_monster:STATE_Read zombi_x322361 START se_monster:STATE_Read zombi_x322361 END
start generic_object_binder:reload(): self.object:name()='zombi_x322361' section=zombi_x3 --------zombi_x322361:reload START --------zombi_x322361:reload END end generic_object_binder:reload(): self.object:name()='zombi_x322361' section=zombi_x3 zombi_x322361re_init() Start zombi_x322361re_init() End generic_object_binder:load_state zombi_x322361 BEFORE generic_object_binder:load_state zombi_x322361 AFTER
se_monster:STATE_Read zombi_babka_222362 START se_monster:STATE_Read zombi_babka_222362 END
start generic_object_binder:reload(): self.object:name()='zombi_babka_222362' section=zombi_babka_2 --------zombi_babka_222362:reload START --------zombi_babka_222362:reload END end generic_object_binder:reload(): self.object:name()='zombi_babka_222362' section=zombi_babka_2 zombi_babka_222362re_init() Start zombi_babka_222362re_init() End generic_object_binder:load_state zombi_babka_222362 BEFORE generic_object_binder:load_state zombi_babka_222362 AFTER
se_monster:STATE_Read zombi_x322371 START se_monster:STATE_Read zombi_x322371 END
start generic_object_binder:reload(): self.object:name()='zombi_x322371' section=zombi_x3 --------zombi_x322371:reload START --------zombi_x322371:reload END end generic_object_binder:reload(): self.object:name()='zombi_x322371' section=zombi_x3 zombi_x322371re_init() Start zombi_x322371re_init() End generic_object_binder:load_state zombi_x322371 BEFORE generic_object_binder:load_state zombi_x322371 AFTER
Отловить момент вылета через обертку из protected mode на различные функции, которые вызываются походу загрузки, не вышло, но сдается мне, что происходит он в районе метода load_state класса generic_object_binder из скрипта bind_monster, и судя по логу, непосредственной причиной вылета является вызов какого-то движкового метода класса object_binder. Сам метод load_state не вызывается точно, но, при этом, методы reload и reinit отрабатывают, или, во всяком случае, не вызывают немедленного краша. К сожалению, на дальнейшие изыскания моего времени уже не хватило. Возможно, это поможет кому-то решить данный вылет, или, возможно, при наличии нескольких подобных сохранений, и мне самому, если будет время.
Скачал сборку, разархивировал, увидел фишечку сталкера - батники, которые "добавляют многоядерность игре". Залез в их псевдокод - просто задают соответствие ядрам процессора. Вопрос: зачем их применять? Где-то есть обсуждение целесообразности их использования? Есть кто-то, кому запуск игры через батники изменил фпс не в пределах погрешности?
Как программист с 3-летним стажем, прекрасно понимаю, что никакой батник не сделает выполнение программы параллельным, если это не предусмотрено разработчиком. Батники вручную задают соответствие определённым ядрам процессора и винде приходится равномерно распределять между ними нагрузку. Но винда и без этого справляется с распределением загрузки самым выгодным для неё образом. Выполнение любой программы разбито на маленькие кванты времени. При запуске через exe каждый квант будет выполнен на ядре №0, если сильно упростить. При запуске через батник, в случае с 4-х ядерным процессором(соответствие задано на 3 ядра), первый квант будет выполнен на ядре №0, затем, когда он выполнится, второй квант будет выполнен на ядре №1. Затем, когда выполнится второй квант, будет выполнен третий квант на ядре №2. И так далее по кругу, пока не завершится программа. Т.е. выполнение происходит всё так же последовательно и каждое из ядер в данном случае не может быть загружено игрой более, чем на треть и в сумме их загрузка не может превышать 100% загрузки одного ядра. Если рассмотреть секунду выполнения игры, то с 0 до 333 миллисекунд её выполняет первое ядро, с 333мс до 666мс её выполняет второе ядро, с 666мс до 1с выполняет 3 ядро. В остальное время ядра простаивают(когда программа написана для многоядерного проца и использует параллельные вычисления - каждое ядро работает плюс-минус всю секунду и выполняет вычисления). В итоге мы с батником получаем только равномерное размазывание нагрузки по всем ядрам. И иногда тратим процессорное время на внеплановое переключение контекстов(на смену ядер, если понятным языком). Если винде надо будет размазать нагрузку, допустим, если вы запустите браузер, то она сама это сделает. Тогда, когда ей надо будет, а не принудительно. Зачем использовать батники, которые запускают игру через потенциально опасный PsExec? Где в данной схеме я не понимаю сакрального смысла батников? Или может где-то ошибаюсь? Форумчане, направьте на обсуждение или статью, в которой объясняется смысл использования батников. Или это просто кто-то крикнул "многоядерность" и так и повелось? Мне действительно очень интересно с этим разобраться. p.s. У меня задание соответствия ядрам на проце xeon e5440(аналог core 2 quad) абсолютно не изменило фпс
X_A_M_E_L_E_O_N, проголосовал Кстати, я все-таки нашел причину вылета по скваду simulation_zombi на янтаре и радаре. Решение есть, но фактически - это костыль. Немного подробнее ниже:
После продолжительных попыток выйти на вызов сбойной функции с помощью xpcall и debug.traceback, я решил немного покопать в сторону методов сохранения\загрузки для класса cse_alife_monster_base. Консольная отладка пакетов ничего стоящего, к сожалению, не показала, а, поскольку, управление в этот момент на движке, то и в логах отладки ничего стоящего не возникло. Исходя из тех данных, что у меня уже были, можно предположить, что вылет спровоцирован выходом за пределы допустимого размера нет-пакета при чтении или записи. Фактически, данное предположение оказалось верным, но определить конкретную причину я так и не смог. Вот те данные, которые были определены:
- Вылет происходит на моменте чтения state-части нет-пакета серверного объекта, унаследованного от cse_alife_monster_base в методе STATE_Read класса se_monster. Данная часть пакета имеет 2 составляющие типа stringZ - old_lvid и active_section. Непосредственно сам краш вызван попыткой получить данные из active_section; - Отладка записи этих данных в методе net_destroy() биндера, показала, что и LVID и секция записываются корректно; - С увеличением количества сохранений, позиция чтения (r_tell()) для некоторых объектов в данном методе, экспоненциально увеличивается. Для примера: при чтении пакета для m_controller_normal222359 с полученным размером 183, текущая позиция при чтении в начале - 298, после чтения - 306. Для некоторых мобов, и в том числе, зомби (SM_ZOMBIE), размер 178, текущая позиция чтения достигала 2000. При этом, если прочитать пакет данного НПС через stpk_utils, получив полностью state-часть нет-пакета, то, размер при чтении будет соответствовать 178, а сам пакет будет выглядеть совершенно нормально:
Как видно из содержимого пакета, все данные в нормальном состоянии, за исключением off_level_vertex_id, который содержит в себе некие "беспорядочные" данные. Насколько я знаю, в ООП языках с динамической типизацией переменные являются только ссылками, и проинициализированные переменные без непосредственного присвоения в любом случае будут равны nil, в отличии от тех же Сей (в некоторых случаях), но, возможно, я что-то упустил. В hex-представлении данная строка выглядит как 'C3BFC3BFC3BFC3BFC3BF01', при этом, чем больше сохранений было сделано, тем больше C3BF будет в начале. Если вручную присвоить пакету значение, например 12345, то при последующем чтении через stpk_utils, значения поля будет равно C3BFC3BF12345; - Замена сквадов simulation_zombi на любые другие сквады, исключала данные вылеты, даже при высоком спавне (насколько это было возможно для моего пк)
В ходе моделирования, было определено, что данный вылет актуален как для версий LD 1.0\1.1\1.2, так и для CoC 1.4.22. В случае с последним, сквад был прописан вручную, поскольку в исходном варианте, ни на одной локации данный вид зомби не использовался (и, возможно, не просто так). Дальнейшие манипуляции по отладке привели к относительному решению: Присвоение данных пакета было перенесено из условий исключения, дабы избежать получения значения LVID, оставшегося ранее в db.offline_objects[self.id].level_vertex_id, а также добавлено исключение для всех zombi, при чтении active_section. За исключением отладки(закомментирована), функция вида:
Код
function se_monster:STATE_Read(packet, size) --if size then alun_utils.debug_write('\nSIZE = '..size) end --alun_utils.debug_write("se_monster:STATE_Read "..self:name().." START") cse_alife_monster_base.STATE_Read (self, packet, size) --pcall(function() alun_utils.debug_write("STATE_Read, size="..packet:r_tell()) end) if self.script_version > 10 then
db.offline_objects[self.id] = db.offline_objects[self.id] or {} db.offline_objects[self.id].level_vertex_id = tonumber(packet:r_stringZ())
if not (self:name():match('zombie_')) and not (self:name():match('zombi_')) then local a_sec = packet:r_stringZ() db.offline_objects[self.id].active_section = a_sec ~= "nil" and a_sec ~= "" and a_sec or nil else db.offline_objects[self.id].level_vertex_id = nil end end --alun_utils.debug_write("se_monster:STATE_Read "..self:name().." END\n") end
После данных изменений, вылетов по zombi, на янтаре, больше смоделировать не удалось. На радаре, с данными правками, стало возможно загрузить "битый" сейв. Но, на мой взгляд, решение это все же актуально как временное, нежели постоянное. Безусловно, потеря общей логики от самрта для зомби не являются большой потерей, но данные вылеты возникли не просто так, и пока точная причина не установлена, сложно сказать, проявит ли она себя каким-либо другим образом. Можно было бы предположить, что причина исключительно в классе SM_ZOMBIE, но в этом я не уверен. С другой стороны, наши коллеги по цеху из CoC, вероятно, не просто так исключили из спавна НПС с данным классом. Для более точных результатов, вероятно, нужна движковая или совмещенная отладка, но данное мероприятие, к сожалению, выйдет за мои временные рамки свободного времени, поэтому оставлю ее всем желающим Удачи!
Немного о "кривых" вещах в 1.2 ( или уже не актуально? ). На блок посте долга ( на свалке, переход в бар ) спавнятся бандосы, как бы не критично ибо долг пафосно их выносит. И не работающие сундуки: на свалке при переходе с кордона возле Урала и за Ворониным.