Сталкер вылетает без лога

Обновлено: 04.07.2024

Если вы столкунулись с вылетом без лога, постарайтесь вспомнить следующее:
1. Что изменяли в последний раз
2. Во время чего вылет произошёл
3. На какой локации
4. Случайно ли он проявляется или только при приближении к определённому месту/объекту
5. Попробуйте отследить имя последнего перешедшего в онлайн объекта
6. Попробуйте поискать в своих правках ошибки, подходящие под нижеперечисленную классификацию.

Известные причины вылетов без лога:

Вылеты, вызванные ошибками в конфигах, партиклах, файлах XML
1. Ошибка в вызове функции из диалога: после имени функции скобки писать не нужно.
При таком написании будет вылет без лога:

Пример правильного написания:

(file - имя файла скрипта, func - имя функции)
Во втором случае вылета не будет даже если функции file.func не существует, НО это справедливо только для тега action.
В теге precondition вызов несуществующей функции

приведёт к вылету без лога.

2. Пустые значения в конфигах. Вылет будет, если оставить значение какого-либо параметра, считываемого движком, пустым. Например, если в конфиге оружия оставить строку такого вида:


3. Попытка прописать несуществующие кости модели в некоторых параметрах. Например, в grenade_bone для оружия. Тут, думаю, всё ясно.

4. Попытка прописать спавн несуществующего предмета в профиль NPC (файлы character_desc_*.xml). Вылет без лога будет, если в секции spawn (тег supplies) прописать название несуществующей секции.

5. Не следует вписывать текст диалога напрямую в тело описания диалога. При превышении определённого количества символов будет вылет без лога. Чтобы обойти это ограничение, пишите текст в текстовом строковом файле и используйте ссылку на него.

6. Партиклы. Вылеты могут быть, если задать слишком высокие параметры при редактровании партикла. Также вылет может случиться, если в данный момент отыгрывается слишком много партиклов. Например, такая ситуация может быть, если в онлайне слишком много аномалий и/или артефактов.

7. Нельзя прописывать наличие подствольника оружию, в классе которого он не предусмотрен. Например, для класса CWeaponLR300 (имя скриптового сета - WP_LR300).

Вылеты, вызванные ошибками в скриптах

1. Неправильный тип данных
Такое случается при попытке чтения (из пакета или ltx-файла) одного типа данных функциями, предназначеными для другого.
Пример: если движок запросил bool-значение (true или false), а вместо него получил nil, число или строку, то игра вылетит с пустым логом.
Также не следует указывать аргументы при вызове движковых функций, не принимающих никаких аргументов.

2. Неправильное использование класса net_packet()
По сути, это частный случай первого пункта.
При сохранении - может возникнуть при попытке сохранить nil-значение с помощью функции для сохранения числа, строки или чего-то ещё.
При загрузке - важно не перепутать написание. В функциях чтения аргументы указывать нельзя.
Пример неправильного написания:

Пример правильного написания:

3. "Самоудаление" объекта. Тут нужно просто запомнить, что вызывать alife():release(self, true) из методов класса самого объекта нельзя, если эти методы вызываются движком. К примеру, есть у нас сталкер и нам нужно его удалить. И если вызов alife():release(self, true) окажется в любом из методов класса se_stalker, вызываемых симуляцией, то случится вылет без лога. То же самое касается всех остальных объектов, у которых перегружен серверный класс.

Обойти этот баг можно с помощью специальной таблицы объектов "к удалению", удаляемых при каждом обновлении игрока.
В bind_stalker.script пишем следующее:

4. Если игра вылетает без лога ещё до главного меню, нужно искать ошибки в скриптах, которые прописаны в параметрах class_registrators, game_type_clsid_factory и ui_type_clsid_factory в конфиге script.ltx. Вылет происходит даже при ошибках синтаксиса в этих скриптах.

5. Неправильные операции с действиями планировщиков (action_planner)
Если при добавлении какого-то действия в планировщик, получаемый методом motivation_action_manager, добавить такое условие

то получим вылет с пустым логом. Такая ошибка возникает из-за вложенности планировщиков. "Внутренние" планировщики (в таблице stalker_ids они обозначены как константы с именами, в которых есть слово "planner") для скриптеров доступны только как обычные действия, а не как планировщики, поскольку функции cast_action_to_planner и cast_planner_to_action были вырезаны, хоть и упоминаются в lua_help. Некоторые свойства, номера которых есть в таблице stalker_ids, для скриптов тоже недоступны, поэтому добавлять их в качестве условий тоже нельзя.

При создании действий (action_base) нужно прописывать им такие условия, чтобы каждому набору условий соответствовало только одно действие, иначе могут быть вылеты или просто глючное поведение NPC. Еще одной причиной вылета могут быть "тупики" - тот случай, когда есть только одно действие, способное в данный момет изменить какое-то свойство (свойство, которое задается методом add_effect), но его выполнение невозможно из-за заданных условий.

6. Переполнение стека. Чаще всего причина таких вылетов - вызов каких-то функций, которые зависают. После нескольких таких вызовов игра вываливается с ошибкой "C stack overflow", указывающей на произвольный скрипт с любым номером строки, хотя иногда бывают и безлоговые вылеты. Например, вызов метода actual из планировщика motivation_action_manager может приводить к таким зависаниям, хоть и не при каждом вызове.

7. При попытке использования функций cse_alife_smart_zone.register_npc() и cse_alife_smart_zone.unregister_npc() появляются "плавающие" (через раз) вылеты. В смартах вызовы этих функций вырезаны разработчиками и не используются, но если вдруг вам захочется поэксперементировать с ними, не забывайте о их глючности.

8. Попытка удаления рестриктора, прописанного какому-либо NPC. Этот баг никак не лечится, но его можно обойти. Для этого нужно для каждого живого объекта в скрипт для серверного класса внести специальную таблицу, в которой прописаны соответствия NPC и прописанных им рестрикторов. При удалении рестриктора нужно пробегаться по этой таблице и убирать его из рестрикторов всех NPC, которым он прописан.

9. В некоторых случаях вылет без лога происходит при использовании функции wounded(bool) для клиентских объектов (game_object). Чтобы этого не происходило, не следует вызывать её слишком рано, например, из функции net_spawn(. ). Также не следует пытаться менять состояние раненности мёртвым NPC.

10. Вылет без лога случается, если установить состояние тела равным move.crouch и ментальное состояние anim.free. Например, вот такой код

вызовет вылет без лога. При установке состояний через state_mgr от оригинальной игры такого вылета не может произойти (установка такой комбинации заблокирована), но если устанавливать состояние напрямую (как показано выше), то вылет будет.

11. Нельзя прописывать недопустимые соответствия серверных и клиентских классов в class_registrator.script. Это может вызвать вылеты без лога, зависания и порчу сохранений. В некоторых случаях могут быть вылеты с логом, в котором упоминаются имена несуществующих секций (в т.ч. содержащие недопустимые символы).

12. Вылет при поытке вызвать level.object_by_id(id), где id > 65535. Подобный вылет возможен и для alife():object(id).

13. Иногда может происходить вылет "Abnormal program termination" (автосохранение при этом оставалось рабочим), предположительно из-за большого количества NPC. У меня такой вылет происходил при переходе с Радара на другую локацию, перед этим на Радаре было заспавнено очень много зомби (около 100). По этому вылету пока что могу посоветовать только уменьшение количества респавна.


Конкретные примеры (вырезки кода, вызывающие вылеты) и советы по устранению вылетов приветствуются.

Всем, у кого установлен патч 1.0006, рекомендуется установить фикс. После установки фикса вылеты без лога скорее всего исчезнут.

Просьба не спрашивать о причинах вылета с логом. С такими вопросами - в "ковырялки".
Также здесь не следует писать про про вылеты, вызванные редактированием движка. Для этого есть соответствующая тема.


Безлоговые вылеты бывают в основном из-за завышенных настроек видео.

Решение:
В папке с игрой открыть папку gamedata, папку config, в ней файл alife, открыть любым текстовым редактором (блокнотом, или лучше word pad'ом) и найти строку switch distance = и изменить значение на 5, сохранить изменения.

Это только одна (не сильно вероятная) причина безлогового вылета.

Ещё одна причина неправильно указано название пути в логике НПС или он полностью отсутствует в файле way_ all.spawn. Вылетать будет когда дойдёт время до спавна этого НПС.(дС)

Если это появилось, значит у Вас ошибка в файле с расширением .ltx (обращаю внимание, не путать с файлами .script), которая находится между [. ] квадратными скобками в файле. Это может быть секция предмета, секция логики, секция пути файла way_, т.е. там, где присутствуют квадратные скобки.







Этот метод может помогать выявить некоторые стабильные или нестабильные (если у вас терпения хватит) безлоговые вылеты. Сам пользуюсь методом, часто помогает. Скажу сразу, этот метод только для скриптеров, остальные не поймут, что в логе написано. Итак, будем изменять функцию printf() в файле _g.script. Смотрим ее и приводим к следующему виду:

Таким образом, в лог принудительно (flush) пишется (execute) вся информация, идущая в консоль в процессе игры.

Запускаем игру и играем/загружаем сейв. Игра будет тормозить, потому что в лог идет очень много информации. Делаем наше черное дело, при котором вылетаем, ну и ловим вылет. Смотрим лог и видим, что в нем осталось последнее действие.

После выявления вылета нам нужно все вернуть обратно, чтобы игра не тормозила и не засоряла лог. Просто закомментируем строки с execute, чтобы было так:

Вот несколько способов решения проблем с вылетами Сталкера.


Запустите exe-файл игры от имени администратора

Если вы столкнулись с ошибкой «Файл XR_3DA не отвечает» – откройте корневую папку с игрой, перейдите в папку bin и запустите файл XR_3DA от имени администратора.


Добавьте папку Сталкера в исключения антивируса

Если пользуетесь антивирусным ПО, попробуйте добавить папку с игрой в исключения. Некоторые антивирусы излишне паранойят и считают файлы игры зловредными.

Естественно, делать это лучше только с лицензионной версией игры.

Надеемся, что эти советы помогут вам решить проблемы с вылетами Сталкера. Если у вас есть другие рекомендации и решения – пишите в комменты.

xrEngine.exe caused ACCESS_VIOLATION at 001B:7400187E

Если вы столкнулись с такой ошибкой при запуске Сталкера, в интернете советуют удалить файл xrRender_R3.dll .

Удаление файла user.ltx

Через поиск Windows найдите файл user.ltx, который лежит внутри папки с вашей версией Сталкера (stalker-shoc – Тень Чернобыля, stalker-stcs – Чистое Небо, а stalker-cop – Зов Припяти). Удалите этот файл (в нем лежат ваши игровые настройки), после чего попробуйте запустить Сталкер. Возможно, вам понадобится сделать еще один перезапуск игры, но после этого у части игроков Сталкер перестает вылетать на старте игры.


Читайте также: