Типичные ошибки и методы их устранения
Одна (или множество) нод не соединены с остальной ИИ-сеткой. Не допускайте создания отдельных островков нод, всегда соединяйте их с основной ИИ-сеткой, и удаляйте отдельно стоящие и вырожденные ноды (в ЛЕ выделяются красным) нажатием кнопки Select 0-Link на панели AI Map и клавиши Delete на клавиатуре.
[error]Expression : F [error]Function : xrLoad [error]File : .\compiler_load.cpp [error]Line : 272 [error]Description : x:\gamedata\levels\escape\build.aimap
В папке с уровнем gamedata\level\escape отсутствует build.aimap Нужно экспортировать ИИ-карту из LevelEditor: Compile->Make AI Map
[error]Expression : assertion failed [error]Function : CGameGraphBuilder::save_cross_table [error]File : .\game_graph_builder.cpp [error]Line : 351 [error]Description : graph().header().vertex_count() > tCrossTableCell.tGraphIndex
На карте отсутствуют точки графа. Нужно добавить хотя бы одну: Spawn Element -> AI\graph point и экспортировать level.game: Compile -> Make Game
! Cannot build GAME path! (object esc_tutorial_wounded0826) ! CURRENT LEVEL : escape ! CURRENT game point position : [-146.011078][-20.711269][-147.502380] FATAL ERROR [error]Expression : I != levels().end() [error]Function : GameGraph::CHeader::level [error]File : f:\project\home\stalker\borscht\src_engine\xray\xrgame\game_graph_inline.h [error]Line : 153 [error]Description : there is no specified level in the game graph : 205
Такая ошибка возникла после того, как была прервана компиляция ИИ-сетки. Видимо, испортился игровой граф, нужно перекомпилировать его (xrAI -f)
[error]Expression : assertion failed [error]Function : CVertexAllocatorFixed::CDataStorage::DataStoragePath::VertexManager::SingleLinkedList::DoubleLinkedList::BucketList,struct CVertexManagerFixed,struct CVertexAllocatorFixed,1,struct CVertexPath,struct AStar::_Vertex::_vertex,struct CBuilderAllocatorConstructor,struct CManagerBuilderAllocatorConstructor,struct CDataStorageConstructor,unsigned int>::_Vertex>::_vertex>::_vertex>::_vertex>::_vertex>::_vertex>::create_vertex [error]File : x:\clearsky\src\engine\utils\xrai\vertex_allocator_fixed_inline.h [error]Line : 51 [error]Description : m_vertex_count < reserved_vertex_count - 1
Эту ошибку можно обойти ключом -no_separator_check
По какой причине она вообще возникает и не допустить её возникновения?
[error]Expression : !m_border.empty() [error]Function : CSpaceRestrictorWrapper::build_border [error]File : .\space_restrictor_wrapper.cpp [error]Line : 215 [error]Description : space restrictor has no border [error]Arguments : esc_zone_mine_gravitational_weak_0009
Аномалия расположена не на ИИ-сетке.
[error]Expression : assertion failed [error]Function : CGraphMerger::CGraphMerger [error]File : xr_graph_merge.cpp [error]Line : 621 [error]Description : M != (*K).second->m_tVertexMap.end()
Одной из точек графа для перехода между уровнями задана связь с другой, несуществующей (или с несуществующим именем). При возникновении такой ошибки в первую очередь стоит проверить наличие собственно точки графа на уровне через Object List в режиме Spawn, затем наличие ИИ-сетки под ней, и уж в последнюю очередь настройки.
Красные строки в логе
! level_path().failed() during navigation
Путь непися пролегает через пространство, где неадекватно соединены ноды ИИ-сетки. Нужно правильно соединить ноды.
Редакторы
Expression : assertion failed Function : IReader::advance File : x:\clearsky\src\engine\xrcore\FS.h Line : 276 Description : (Pos<=Size) && (Pos>=0)
Такой вылет был, когда в папке с СДК оказался левый .xdb-архив.
Игра
[error]Expression : false [error]Function : CXml::Load [error]File : xrXMLParser.cpp [error]Line : 87 [error]Description : XML file:text\rus\st_quests_escape.xml value: errDescr:Error reading end tag.
В указанном файле ошибка синтаксиса: где-то не закрыт тег.
Expression : m_attack_animation.valid() Function : CVisualZone::net_Spawn File : E:\priquel\sources\engine\xrGame\ZoneVisual.cpp Line : 34 Description : object[esc_burning_fluff_strong]: cannot find attack animation[] in model[dynamics\anomalies\burning_fluff_01]
На карте присутствует динамическая модель, у которой предусмотрена, но не задана анимация атаки. Нужно задать её в LevelEditor'е в свойствах спаун-объекта в поле Attack animation.
[error]Expression : motion_ID.valid() [error]Function : CKinematicsAnimated::ID_Cycle [error]File : ..\xrRender\SkeletonAnimated.cpp [error]Line : 208 [error]Description : ! MODEL: can't find cycle: [error]Arguments : death_init
Не найдена анимация с именем death_init. Возможно, к модели не подключен нужный .omf
[error]Expression : BI_NONE!=f_bones.back() [error]Function : P_build_Shell [error]File : C:\projects\xray15\xray\xrGame\PhysicsShell.cpp [error]Line : 136 [error]Description : wrong fixed bone
Имя кости, используемой для фиксации модели, отличается от указанного в соответствующем поле LE. Например, в модели кость носит имя link1, а для физического объекта в редакторе уровней было указано имя link.
[error]Expression : fatal error [error]Function : CScriptEngine::lua_pcall_failed [error]File : C:\projects\xray15\xray\xrServerEntities\script_engine.cpp [error]Line : 192 [error]Description : [error]Arguments : LUA error: x:\gamedata\scripts\ph_door.script:36: attempt to index field 'joint' (a nil value)
Ошибка возникла, когда в модели двери все кости имели тип rigid. Но для двери или ворот хотя бы одна кость должна иметь тип joint, чтобы дверь могла открываться.
Expression : fs Function : CResourceManager::_CreateVS File : E:\priquel\sources\engine\Layers\xrRender\ResourceManager_Resources.cpp Line : 203 Description : shader file doesnt exist Arguments : x:\gamedata\shaders\r2\deffer_impl_lmh_bump-hq.vs Expression : R Function : CResourceManager::_CreatePS File : E:\priquel\sources\engine\Layers\xrRender\ResourceManager_Resources.cpp Line : 309 Description : x:\gamedata\shaders\r2\deffer_impl_lmh_bump.ps
Конкретно эти ошибки вылезают в ЧН при попытке запуска на втором рендере, если геометрия уровня скомпилирована на низких настройках. Чтобы игра не валилась, нужно подсунуть те файлы, что она хочет. Доподлинно неизвестно, что должно было быть в этих шейдерах, так что по ссылке .ps/.vs с обычными инклюдами внутри.
[error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\priquel\sources\engine\xrServerEntities\script_engine.cpp [error]Line : 180 [error]Description : [error]Arguments : LUA error: x:\gamedata\scripts\_g.script:973: bad argument #2 to 'format' (string expected, got nil)
Самый мерзкий и жопошный вылет, который указывает только на то, что игра вылетела, но не на причину креша. Возникает потому, что в релизной версии игры разрабы отрубили команды log и assert. В качестве костыля можно использовать такие решения: [1], [2]
[error]Expression : !save_guid || (*save_guid == header().guid()) || ignore_save_incompatibility() [error]Function : CALifeSpawnRegistry::load [error]File : E:\priquel\sources\engine\xrGame\alife_spawn_registry.cpp [error]Line : 110 [error]Description : Saved game doesn't correspond to the spawn : DELETE SAVED GAME!
Файл сохранения не соответствует спавну, нужно пересобрать спавн. Можно обойти ключом -ignore_save_incompatibility , в таком случае спавн будет соответствовать учтённому в сохранении.
[error]Expression : cross_table().header().level_guid() == level_graph().header().guid() [error]Function : CAI_Space::load [error]File : ai_space.cpp [error]Line : 110 [error]Description : cross_table doesn't correspond to the AI-map
Аналогично предыдущему вылету: данные из спавна не соответствуют новой ИИ-сетке. Нужно пересобрать спавн.
Expression : fatal error Function : out_of_memory_handler File : .\xrDebugNew.cpp Line : 318 Description : Arguments : Out of memory. Memory request: 3506347 K
Движок пытается прочесть какой-то левый архив или просто файл с расширением сталкирского архива (*.db, *.xdb). Подробности тут
Симуляция
[error]Expression : m_path [error]Function : CPatrolPathParams::CPatrolPathParams [error]File : patrol_path_params.cpp [error]Line : 19 [error]Description : There is no patrol path [error]Arguments : esc_hit_point
! [LUA][ERROR] ERROR: There is no kamp path in smart[esc_pigsty_ruins_st_01]
В лагере отсутствуют точки пути с постфиксом _kamp_N. Нужно добавить как минимум одну _kamp_N и _kamp_N_task, где N — порядковый номер от 1.
! [LUA][ERROR] ERROR: Insufficient smart_terrain jobs test_smartterrain
В лагере трётся слишком много народу. Нужно либо уменьшить количество групп (faction_*.ltx), либо уменьшить количество персонажей в группе (squad_descr_*.ltx), либо (что правильнее) создать в смарте дополнительные работы, чтобы бездельники смогли их занять.
[error]Expression : vertex || show_restrictions(m_object) [error]Function : CPatrolPathManager::select_point [error]File : patrol_path_manager.cpp [error]Line : 155 [error]Description : any vertex in patrol path [esc_south_checkpoint_st_patrol_2_walk] is inaccessible for object [sim_default_military_00323]
Похоже, что точки пути patrol находятся вне рестриктора, накрывающего смарт, и неписи не могут попасть на работу. Нужно расширить рестриктор, чтобы он накрывал эти точки.
! [LUA][ERROR] ERROR: 'Attempt to read a non-existant string field 'npc' in section 'esc_flesh_generic'
Не очень вразумительный лог, который в одном из случаев указывал на то, что в faction_monster.ltx в секции [start_position] указано имя, которое не существует в squad_descr_*.ltx.
[error]Expression : vertex || show_restrictions(m_object) [error]Function : CPatrolPathManager::select_point [error]File : patrol_path_manager.cpp [error]Line : 155 [error]Description : any vertex in patrol path [esc_granary_st_kamp_1_task] is inaccessible for object [sim_default_bandit_00413]
Такая ошибка была, когда одной из аномалий в пределах смарта задали тип рестриктора OUT. При этом путь esc_granary_st_kamp_1_task состоит из одной точки, и совершенно точно не входит в шейп аномалии. Нужно объяснение.
! [LUA][ERROR] ERROR: object 'esc_wolf' configuration file [logic\esc\wolf.ltx] NOT FOUND or section [logic] isn't assigned
В конфиге персонажа отсутствует секция [logic], или же отсутствует сам конфиг. Однако была ситуация, когда такой вылет возникал из-за того, что в настройках смарта дублировалась ссылка на этот конфиг в секции эксклюзивных работ.
[error]Expression : fatal error [error]Function : CScriptEngine::lua_pcall_failed [error]File : ..\xrServerEntities\script_engine.cpp [error]Line : 192 [error]Description : [error]Arguments : LUA error: x:\gamedata\scripts\sim_faction_brain_mutant.script:90: attempt to index field '?' (a nil value)
[error]Expression : level_graph->valid_vertex_id(m_level_vertex_id) [error]Function : CPatrolPoint::verify_vertex_id [error]File : C:\xray\xrGame\patrol_point.cpp [error]Line : 46 ! Patrol point wp00 in path esc_atp_st_guard_4_walk is not on the level graph vertex!
Точка пути находится не на ИИ-сетке. Необходимо либо подвинуть точку, либо проложить ноды ИИ-сетки под ней. Такую ошибку можно увидеть лишь в отладочной сборке, в релизной же выдаётся лог ниже.
[error]Expression : !object->used_ai_locations() || ai().level_graph().valid_vertex_id(object->m_tNodeID) [error]Function : CALifeSwitchManager::add_online [error]File : X:\xray\xrGame\alife_switch_manager.cpp [error]Line : 64 [error]Description : Invalid vertex for object [error]Arguments : sim_default_military_1_sniper1561
Сам по себе лог малоинформативен и указывает лишь на то, что персонаж оказался вне ИИ-сетки. Причиной этого вылета может быть то, что точка пути (вейпойнт), на которой заспавнился персонаж, находится не на ИИ-сетке. См. описание выше.
Сетевая игра
[error]Expression : rpoints[0].size() [error]Function : game_sv_Deathmatch::Create [error]File : game_sv_deathmatch.cpp [error]Line : 101 [error]Description : rpoints for players not found
На карте отсутствуют точки респавна для игроков.