AIM TT
StarForce — ClearSky. Вопросы и Ответы
Внимание!!!
Игра «S.T.A.L.K.E.R.: Clear Sky» была защищена с применением технологии «Периодическая Проверка Диска» сроком на 3 дня. Поэтому после первого запуска игры и успешной проверки, больше не требуется наличие оригинального диска в приводе в течение 3х дней. По истечению этого срока защита вновь потребует вставить лицензионный диск и после прохождения проверки, диск снова не потребуется в приводе… и т.д.
Наиболее часто встречающиеся ошибки:
1. Диск не проходит проверку. Сообщение гласит, что диск не лицензионный или его вообще нет в приводе. Особенно часто сообщение встречается с приводами фирмы NEC.
Происходит из-за несовместимости привода или его прошивки и системы защиты.
Советы:
Попробуйте понизить скорость привода с помощью программы Nero Drive Speed до 5-8х и повторить проверку. Иногда помогает смена прошивки на более свежую.
Сайт с прошивками —
Сылка удалена.
2. При проверке диска идет сообщение об обнаруженных эмуляторах. При этом в системе самих эмуляторов может и не быть.
Происходит по причине конфликта драйвера защиты и драйвера эмулятора (если эмулятор есть) и/или конфликта драйвера защиты и драйвера материнской платы, отвечающего за работу дисковой подсистемы компьютера.
Советы:
Удалить эмуляторы из системы. Важно отметить, что после удаления эмулятора в системе остаются драйвера эмуляторов, они находятся в активном состоянии и работают. Виртуальные диски также остаются.
Для удаления драйвера SPTD от эмулятора Deamon Tools, легче всего воспользоваться специальной утилитой SPTDinst (882 Кб):
http://www.duplexsecure.com/downloads
Выберите кнопку Uninstall, после чего компьютер следует перезагрузить.
Если у вас Алкоголь, то можно попробовать отключить в настройках опцию «Игнорировать тип носителя» (Ignore media type) и повторить проверку снова. Если у вас когда-то стоял эмулятор Алкоголь, но вы его удалили, и если данная опция при удалении эмулятора была включена, то драйвер в системе, скорее всего, остался и работает именно с включенной опцией. Можно либо удалить драйвер, либо переустановить сам эмулятор и выключить опцию.
3. При запуске проверки диска система защиты просит ввести ключ, а ключа нигде нет.
Происходит в случае, если оптический дисковод не может корректно считать дисковой ключ, занесенный в область данных диска при изготовлении дисков на заводе.
Советы:
Можно попробовать ввести ключ вручную, считав его с диска с помощью программы readcd.
Пожалуйста, скачайте маленькую утилитку — readcd.exe:
Сылка удалена.
Вставьте диск с игрой в привод, запустите утилиту.
Следуйте указаниям на экране. После окончания работы программы в папке с ней появятся файлы вида — readcd_хх.bin. В файле readcd_16.bin вы найдете дисковой ключ. Введите этот ключ по запросу программы. Либо запустите игру, удерживая клавишу Shift, и вам будет предложено ввести дисковой ключ.
В любом случае, сохраните файл-отчёт ошибки Star-Force и отправте его на support@gsc-game.com
4. При проверке диска система зависает, либо перезагружается, либо появляется синий экран.
Связано с ошибкой в драйвере эмулятора Deamon Tools версий 4.х. Как правило, проявляется при попытке эмулировать лицензионный диск.
Советы:
Необходимо выключить эмулятор и запускать игру, используя лицензионный диск. Если вы точно уверены, что эмуляторов в системе нет, то необходимо отправить в техническую поддержку файл минидампа, который создается при возникновении синего экрана. Минидамп содержит отладочную информацию, которая поможет понять, из-за чего произошла ошибка, и необходим для успешного разрешения проблемы.
Как сделать минидамп:
Удалите все файлы из папки С:WindowsMinidump.
Кликните правой клавишей на иконке «Мой компьютер», выберите «Свойства». Выберите закладку «Дополнительно», в ней раздел «Загрузка и восстановление». В этом разделе нажмите кнопку «Параметры». Уберите галку из пункта «Выполнить автоматическую перезагрузку». В секции «Запись отладочной информации» выберите «Малый дамп памяти (64кб)». Закройте все окна кнопками «ОК».
После очередного возникновения синего экрана компьютер скинет необходимую для понимания проблемы информацию в специальный файл. Вы сможете найти эти файлы тут:
С:WindowsMinidump
Вышлите все файлы в техническую поддержку support@star-force.com
5. Обновление драйверов защиты.
Для обновления драйвера защиты используйте утилиту protect.exe, которая находится в корневой папке игры. В некоторых случаях это поможет избежать определенных проблем.
Подробнее об обновлении драйверов защиты:
Сылка удалена.
Обновления драйвера защиты с помощью protect.exe требует подключение к сети Интернет. Если у вас такого подключения в данный момент нет, то можно воспользоваться подключением у друга/соседа/на работе. Для этого отправьте запрос на электронный адрес нашей технической поддержки и вам пришлют необходимые файлы и инструкцию как все установить.
Если у вас Windows Vista и утилита не отрабатывает нормально – запускайте ее с правами администратора. Соответствующая опция доступна по правой клавише.
6. Игра устанавливается нормально, но не устанавливается драйвер защиты
У вас, скорее всего, Windows Vista. Перед запуском программы отключите User Account Control. В дальнейшем эту опцию можно вновь активировать, так как драйвер ставится только 1 раз перед первым запуском игры.
Для включения/выключения User Account Control зайдите в Панель Управления, выберите User Accounts. Внутри будет опция Turn UserAccount Control on/off.
Взято с сайта www.gsc-game.ru
От себя дабавлю у меня ругался и без эмуляторов, может на картридер, а может и на второй физический DVD.
Помогала переустановка игры или тупо жмешь далее и после двух трех бсодов перестает выбрасывать. Далее выбрасывает уже сама игра -))).
Способ редактирования скрипта без выхода из игры.
Первая проблема решается при помощи двух стандартных функций самого Lua, а именно dofile и pcall.
dofile
resultChunk = dofile("C:\Study\My.script")
Открывает указанный файл и выполняет его содержимое как chunk. Возвращает результат выполнения или же генерирует ошибку.
Chunk — в переводе с английского, порция или блок. В Lua же порция — это любая последовательность операторов Lua.
Здесь важно понять, что такое «последовательность операторов«. function — это тоже порция или другими словами блок операторов. Таким образом, выполняя при помощи dofile какой-либо скрипт, в файле следует писать именно содержимое блока, который нужно выполнить.
pcall
pcall (funcName, arg1, ...)
Вызывает функцию funcName с данными параметрами (arg1, и далее, через запятую необходимое для функции funcName количество параметров) в так называемом защищенном режиме (protected mode).
Это значит, что при возникновении любой ошибки внутри функции funcName она дальше не передается; напротив, pcall перехватывает ошибку и возвращает статус. pcall возвращает сначала статус (тип boolean), который равен true если вызов завершился без ошибок, и все результаты от работы защищённой им функции. В случае возникновения ошибки, pcall возвращает false и сообщение об ошибке.
Может показаться сложным и запутанным, но на деле это не так. Попытаюсь показать Вам на примере.
Имеем простую функцию возвращающая сумму двух чисел:
function Addition (a, b)
return a + b
end
Если вызвать функцию с параметром b отличным от числа (тип number) :
sum = Addition(13, true)
то произойдёт ошибка выполнения следующего содержания:
attempt to perform arithmetic on local 'b' (a boolean value)
Если же задействовать функцию pcall, то результат будет совершенно иным.
status, result = pcall(Addition, 13, true)
Как и говорилось, функция pcall принимает в качестве первого аргумента имя функции, а в качестве последующих — аргументы, которые принимает уже сама вызываемая функция.
Возвращает же два значения. Первое — результат выполнения, статус определяющий возникла ли ошибка (false — если возникла, true — если нет). Второе — результат выполнения функции, если ошибки не возникло, или же сообщение об ошибке, если внутри функции возникла ошибка.
В примере в переменной status будет значение false, а в переменной result — строка «attempt to perform arithmetic on local ‘b’ (a boolean value)«.
При передаче правильных параметров, которые не вызовут ошибку, в переменной status будет значение true, а в result — сумма двух чисел, переданных в качестве этих самых параметров.
В обоих случаях ошибки выполнения, а следовательно и вылета в контексте игры, не будет!
Совместив эти две функции можно получить крайне полезную конструкцию, которая позволит выявлять ошибки не приводя к вылетам игры, и легко выводить описание ошибки непосредственно в лог.
Для этого заведём для себя функцию, где pcall будет вызвать функцию dofile, которая в свою очередь будет выполнять нужный нам файл со скриптом. Выглядеть эта функция будет так:
function ProtectedFunction()
local status, result = pcall(dofile, [[..gamedatascripts__test.script]])
get_console():execute(status and "Successful!" or string.gsub(result, " ", "_"))
end
Всё очень просто. Вызываем pcall, в качестве параметра передаём функцию dofile и аргумент для неё — путь до нашего файла __test.scrip, который нужно предварительно создать в папке scripts.
Опытным путём было установлено, что в ТЧ корневым каталогом Lua считает папку bin, поэтому путь пишем относительно неё. В ЧН и ЗП — это корневая папка установленной игры, поэтому путь для этих частей будет таким: «[[gamedatascripts__test.script]]«
Вторая строка выводит в консоль сообщение «Successful!» если скрипт в файле _test.script выполнился без ошибок или же сообщение ошибки выполнения, если произошла ошибка. Сообщение выводится со знаком подчёркивания вместо пробела. Это необходимая мера для метода execute.
Результат выводить в консоль не имеет смысла, т.к. результат нам покажет сама игра.
Теперь если вызвать функцию ProtectedFunction, то выполнится код написанный в файле __test.script. При этом, сам код в этом файле можно менять не выходя из игры, а просто свернув её.
Поэтому, получив ошибку внутри вызываемого файла — в консоле появится сообщение с описанием данной ошибки. Далее: сворачиваете игру; правите ошибку; восстанавливаете игру; запускаете вызов функции ProtectedFunction по новой; смотрите на результаты работы исправленного скрипта.
Хочу ещё раз обратить Ваше внимание на то, что в файле __test.script должен присутствовать именно блок операторов!
Содержимое файла может быть таким:
function MyFunction ()
db.actor.health = 1
end
При вызове ProtectedFunction не произойдёт ошибки, т.к. её там нет, но и ничего не добавится к здоровью актора, как хотелось бы. Причина в том, что данный код только описывает функцию, но вызова этой функции в файле нет. Поэтому эту функцию нужно вызвать там же, в файле:
function MyFunction ()
db.actor.health = 1
end
MyFunction()
Последняя строка — это и есть вызов функции. Вызов функции это и есть в некотором роде оператор. При таком содержимом файла, функция ProtectedFunction выполнится без ошибок и Вы увидите результат выполнения, в виде пополнения здоровья ГГ до максимального значения.
В процессе игры, не выходя из неё, Вы можете подредактировать файл __test.script, скажем, изменив свойство health на power, тем самым последующий вызов защищённой функции пополнит уже не здоровье, а выносливость.
Важно понимать, что pcall перехватывает ошибки только той функции, которую вызывает, то беж в нашем случае dofile а это, в свою очередь, вызов нашего файла __test.script. Поэтому, если в этом файле будет вызов функции из другого файла и ошибка произойдёт уже в нём (в другом файле), то игра вылетит с логом ошибки другого файла. Тоже самое касается работы движковых функций; если Вы передаёте неверный аргумент, не правильно вызываете какую-нибудь функцию экспортированную в скрипты из движка, то игра вылетит.
В большинстве случаев, допускаются именно ошибки выполнения скрипта, поэтому данная конструкция позволяет избежать большого количества перезапуска игры, что сохранит и время, и нервы.
Что касается второй проблемы, то самым удачным вариантом её решения будет простое нажатие клавиши на клавиатуре, т.е. собственная горячая клавиша.
В качестве наилучшего исключительно скриптового метода горячих клавиш я предлагаю использовать способ предоставленный здесь: ссылка на статью, конкретно интересует действие на нажатие (первый способ).
Ключевым звеном данного способа является команда консоли bind_cosole. Команда позволяет назначить выполнение другой консольной команды на любую клавишу на клавиатуре. Её синтаксис выглядит так:
bind_cosole <Имя консольной команды> <Значение для команды> <Код клавиши>
Например:
bind_cosole save 1 knumpad1
Таким образом, при нажатии на единицу на цифровой клавиатуре, в консоле будет вызвана команда «save 1«, что приведёт к сохранению игры под именем «1».
Есть команды консоли, которые сохраняют в себе переданное ей значение, например «mm_net_player_name«. Команда изменяет/возвращает имя игрока в мультиплеере, соответственно в одиночной игре она не задействована, и именно по этому автор остановил свой выбор на ней.
В скриптах, есть возможность получения значений команд консоли, при помощи методов объекта консоли CConsole, в игре такой объект можно получить с помощью функции глобального пространства имён get_console.
Вот такой код:
local mmPlayrName = get_console():get_string("mm_net_player_name")
Запишет в переменную имя игрока в сетевой игре.
Такой тандем из из команды bind_cosole и метода get_string, позволяют при нажатии на клавишу задать для команды «mm_net_player_name» значение имени функции, которую нужно выполнить, и в нужный момент получить имя этой функции для того, чтобы её вызвать.
В этом и состоит весь принцип работы горячих клавиш данного способа.
Изначально мы проходимся по файлу в поисках функций с именем, которое совпадает с перечислением имён класса DIK_keys, только написанное строчными литерами. Присваиваем соответствующей этому имени клавише команду консоли «mm_net_player_name <имя функции>«. Таким образом при нажатии на такую клавишу, данному параметру будет присвоено имя функции. Отлавливаем значение данной команды с помощью метода get_string, если это имя функция, которая находится в текущем файле, то вызовем её, и тут же присвоим команде значение по умолчанию, чтобы функция не вызывалась в дальнейшем. При повторном нажатии на клавишу, команде снова присвоится значение с именем функции, которое отловится на ближайшем апдейте. И так по кругу.
Перед запуском игры, Вам нужно определится какую из не задействованных клавиш Вы будете использовать как «горячую».
Список клавиш в Сталкере, которые можно задействовать под это дело, можно посмотреть здесь: DIK_keys. Это перечисление констант класса DIK_keys, имена которых используются в качестве имени функций для горячих клавиш.
Я выберу клавишу Scroll Lock, чтобы хоть как-то оправдать её присутствие на клавиатуре. Код этой клавиши — dik_scroll, именно так и должна называться функция, которую будет вызывать выбранная мной клавиша.
Имена функций, которые непосредственно будет вызывать Ваши горячие клавиши, должны быть написаны строчными литерами (маленькими буквами).
Теперь, всё что остаётся сделать, это написать функцию с именем dik_scroll в файле, в котором находится функция update горячих клавиш. Выглядеть она будет так:
function dik_scroll()
local status, result = pcall(dofile, [[..gamedatascripts__test.script]])
get_console():execute(status and "Successful!" or string.gsub(result, " ", "_"))
end
Как видите, в тело функции я написал содержимое нашей «защищённой функции», а не вызывал отдельно её — зачем лишний раз без необходимости плодить код?
Всё, друзья мои!
Теперь, зайдя в игру и загрузив сохранение (или начав её заново), Вы можете полюбопытствовать работой нашей конструкции. Нажимаете Scroll Lock (или другую выбранную Вами клавишу) и видите запуск содержимого в файле __test.script. Если в файле не было ошибок, то в консоле вы увидите надпись «Successful!» или же сообщение об ошибке. Попытайтесь не выходя из игры, свернуть её при помощи комбинации Alt+Tab, изменить содержимое файла, а затем в восстановленной игре опять нажать горячую клавишу — как Вы сами убедитесь, результат будет основываться на изменённых данных.
Готовую мини-gamedat’у, можно скачать здесь: Яндекс.Диск
Всё, что Вам потребуется сделать — поместить два скрипта в вашу рабочую папку scripts и прописать в апдейте актора следующую строку:
bind_keys.update()
Зайти в игру и нажать на клавишу Scroll Lock.
Привет всем! Игра S.T.A.L.K.E.R., а конкретно сам движок X-Ray довольно капризный, и зачастую как в процессе модификации, так и во время игры игра «вылетает». Чтобы мы знали причину вылета, движок нам оставляет лог вылета. Лог вылета можно посмотреть несколькими способами:
- В текстовом редакторе нажать Ctrl+V (Вставить)
- Посмотреть лог игры включая лог вылета в файле xray_имя_пользователя.log в папке C:Documents and SettingsAll UsersДокументыSTALKER-***logs
- Посмотреть непосредственно в окне багтрекера (только в ЧН и ЗП).
Ну приступим. Начнём с простых:
Expression : wave&&wave->length() Function : CSoundRender_Source::LoadWave File : E:stalkerpatch_1_0004xrSoundSoundRender_Source_loader.cpp Line : 65 Description : Can't open wave file: Arguments : d:stalkergamedatasoundsmusicsound.ogg
Здесь игра не может открыть звуковой OGG-файл под названием sound в папке d:stalkergamedatasoundsmusic
Expression : fatal error Function : CRender::texture_load File : E:stalkerpatch_1_0004xr_3daxrRenderTexture.cpp Line : 295 Description : <no expression> Arguments : Can't find texture 'actact_corp_monolit'
Не может найти текстуру act_corp_monolit из папки texturesact
Expression : fatal error Function : CModelPool::Instance_Load File : E:stalkerpatch_1_0004xr_3daxrRenderModelPool.cpp Line : 111 Description : <no expression> Arguments : Can't find model file 'physicsmesh.ogf'.
Не найдена трёхмерная OGF-модель mesh.ogf из папки meshesphysics.
Expression : SG Function : CRender::model_CreateParticles File : E:stalkerpatch_1_0004xr_3daxrRender_R2r2.cpp Line : 330 Description : Particle effect or group doesn't exist Arguments : hit_fxhit_water_00
Не найдена система частиц (партикл) hit_water_00 в директории hit_fx файла particles.xr (подробно опишу позже).
Expression : !m_bAutoRemove Function : CParticlesObject::Init File : D:prog_repositorysourcestrunkxrGameParticlesObject.cpp Line : 50 Description : Can't set auto-remove flag for looped particle system. Arguments : snow_stepsstep
Не установлен интервал (время) проигрывания группы/эффекта партиклов. В Particle Group -> End Time(s) укажите время, через которое частицы должны исчезнуть. Заодно проверьте particle effect -> Kill Old -> Age limit.
Expression : fatal error Function : CResourceManager::_GetBlender File : E:stalkerpatch_1_0004xr_3daResourceManager.cpp Line : 49 Description : <no expression> Arguments : Shader 'modelsantigas_glass' not found in library.
Не найден шейдер modelsantigas_glass в библиотеке шейдеров.
Expression : fs Function : CResourceManager::_CreateVS File : E:stalkerpatch_1_0004xr_3daResourceManager_Resources.cpp Line : 185 Description : shader file doesnt exist Arguments : d:stalkergamedatashadersr2deffer_impl_flat.vs
Тут проблема вся в том, что неправильно закомпилился шейдер, при компиляции уровня на качестве, более высоком чем Draft. Нужно скачивать исправление шейдеров от товарища Haron.
Для ЗП (ЧН) это может ещё быть из-за отсутствия thm-ок для текстур террейна уровня!
Expression : fatal error Function : out_of_memory_handler File : D:prog_repositorysourcestrunkxrCorexrDebugNew.cpp Line : 336 Description : <no expression> Arguments : Out of memory. Memory request: 55965 K
Нехватка оперативной памяти.
[error]Expression : assertion failed [error]Function : CBuild::Load [error]File : .Build_Load.cpp [error]Line : 98 [error]Description : B.dwMaterialGame<65536
Неправильно настроены шейдеры. В настройках шейдера, во вкладке R2-A поставьте текстуру, которая вдальнейшем будет накладываться
на террейн.
Expression : fatal error Function : CInifile::r_string File :E:stalkersourcestrunkxrCoreXr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable ammo_mag_size in [wpn_addon_grenade_launcher]
Не найдена переменная ammo_mag_size в секции [wpn_addon_grenade_launcher].
Expression : fatal error Function : CScriptEngine::lua_error File : D:xray-svnxr_3daxrGamescript_engine.cpp Line : 74 Description : <no expression> Arguments : LUA error: C stack overflow
Переполнение стека. Смотрим внимательно: lua_error. Ошибка, возможно, в скриптах.
Expression : vertex || show_restrictions(m_object) Function : CPatrolPathManager::select_point File : E:stalkersourcestrunkxr_3daxrGamepatrol_path_manager.cpp Line : 155 Description : any vertex in patrol path [sniper_3_walk] in inaccessible for object [stalker_0002]
Какая то вершина (вейпоинт) пути sniper_3_walk стоит в неположенном месте (например не на аи-сетке). Объект stalker_0002 (в данном случае сталкер) который якобы двигался по пути sniper_3_walk попал на эту точку, а заодно ушёл за аи-сетку. Этого движок не терпит.
То же самое произойдет если координаты(вейпоинт) пути sniper_3_walk совпадет с координатами места, где НПС запрещено находиться, будь то рестриктор или аномалия в схеме обхода аномалий.
Также этот вылет наблюдается при попытке отправить НПС за пределы места работ параметр out_rest = «имя_рестриктора» в файле загрузки работ гулага. Попробуйте любого сталкера из лагеря новичков отправить, допустим, к остановке — получите этот самый вылет.
Expression : e_entity Function : xrServer::Process_event_reject File : E:stalkersourcestrunkxr_3daxrGamexrServer_process_event_reject.cpp Line : 12 Description : entity not found. id_parent=7540 id_entity=44047 frame=2075050
Возникают иногда произвольно при смерти неписей. Причина — движок, отрабатывая лут, изредка теряет серверный объект уничтожаемой вещи, в итоге происходит вылет.
Expression : fatal error Function : CScriptEngine::lua_error File : D:xray-svnxr_3daxrGamescript_engine.cpp Line : 74 Description : <no expression> Arguments : LUA error: e:stalkergamedatascripts_g.script:20: bad argument #2 to 'format' (string expected, got no value)
Ошибка распространённая. На первый взгляд кажется, что ошибка как раз в скриптах, но всё может быть иначе. В одной из пиратских версий игры этот вылет наблюдается особенно часто из-за криво модифицированного файла «XR_3DA.exe». Если же вы уверены, что у вас лицензионная версия игры, можно попробовать сделать так: открываем файл _g.script блокнотом, закомменчиваем 20 строку (ставим перед строкой —) и идём к тому месту где поймали вылет. Так мы получим более развёрнутый ответ.
Участник: Призрак: Автор прав в том что вылет очень распространен, но так его исправлять нельзя, так как nil передается в эту функцию только при каком-то форс-мажоре. Поэтому необходимо перейти в _g.script в функцию printf и перед log1(string.format(fmr,..)) дописать: get_console():execute(«load «..fmt). После этого запустить еще раз игру и посмотреть при передачи какой строки игра вылетает. Потом найти эту строку в скриптах игры и прикинуть почему аргумент (у нас это аргумент №2 (bad argument #2)) равен nil. Возможность такового вылета из — за слишком быстрой скорости актера, слишком высокому прыжку. (Редактировать: config/creatures/actor.ltx)
Expression : assertion failed Function : _VertexStream::Lock File : E:stalkerpatch_1_0004xr_3daR_DStreams.cpp Line : 44 Description : (bytes_need<=mSize) && vl_Count
Проблема возникает при убийстве НПСмутанта. Типичный вылет по нехватке ресурсов. Встречается в основном на больших локациях. Но не на всех. На болотах из ЧН такой вылет встречается, а вот с локации aver от Кости V такого вылета нет. Однако для данного вылета есть таблетка, в виде правленого экзешника. Искать на АМК-форуме.
Expression : fatal error Function : IRender_Visual::Load File : E:stalkerpatch_1_0004xr_3daFBasicVisual.cpp Line : 58 Description : <no expression> Arguments : Invalid visual
Неправильный визуал (модель) НПС.
Expression : !phrase_dialog->m_PhraseVector.empty() Function : CPhraseDialog::SayPhrase File : E:stalkerpatch_1_0004xr_3daxrGamePhraseDialog.cpp Line : 140 Description : No available phrase to say, dialog[esc_dialog]
В диалоге esc_dialog нет доступной для отображения фразы (скажем, все заткнуты инфопоршенами).
Expression : motion_ID.valid() Function : CKinematicsAnimated::ID_Cycle File : D:prog_repositorysourcestrunkLayersxrRenderSkeletonAnimated.cpp Line : 210 Description : ! MODEL: can't find cycle: Arguments : death_init
Игра не нашла в модели трёхмерную анимацию с именем death_init.
Expression : fatal error Function : CScriptEngine::lua_error File : E:stalkerpatch_1_0004xr_3daxrGamescript_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...hadow of chernobylgamedatascriptsxr_danger.script:116: attempt to index field 'ignore_types' (a nil value)
Причина вылета в том что игра не понимает значения 0 в danger_ignore.Проще говоря в логике какого то персонажа параметр danger_ignore = 0 либо в минусовом значении. Либо его вообще нету
P.S. Также может быть причина в том, что в логике у какого-то АИ что-то неправильно указано. Для исправления рекомендую вставить строчку перед 116: get_console():execute(self.object:name()). То имя в логе, которое будет последним после вылета, указывает на персонажа с кривой логикой.
Expression : fatal error Function : CInifile::r_string File : E:stalkerpatch_1_0004xrCoreXr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable class in [test_no_klass_npc]
Не найден класс персонажа. Возможно, НПС не прописан под своим классом в gamedatanpc_profile.xml, либо в creaturesspawn_section.ltx, либо в gameplaycharacter_desc.xml
Expression : fatal error Function : CInifile::r_section File : E:stalkerpatch_1_0004xrCoreXr_ini.cpp Line : 342 Description : <no expression> Arguments : Can't open section 'bandage_test_kick1'
Игра не может найти секцию. Это может быть предмет, НПС и многое другое. Возможно, вы написали название с ошибками. Либо когда добавляли его в: продажу, скрипт, НПС , выпадение из НПС, а в редких случаях это может быть иммунитет чего либо(определить потом трудно). Часто такое бывает связано с названием секции.
Expression : fatal error Function : CInifile::r_string File : E:stalkerpatch_1_0004xrCoreXr_ini.cpp Line : 352 Description : <no expression> Arguments : Can't find variable remove_time in [vehicle_btr]
Не найдена переменная remove_time в секции [vehicle_btr]. А в данном случае ошибка в том что если вы делали предмет как физическую модель(то бишь, которую нельзя использовать, говорить и вообще он похож на декорации типа деревьев, столов и прочего хлама) то необходимо указывать remove_time в его секции.
Expression : fatal error Function : CScriptEngine::lua_error File : E:stalkerpatch_1_0004xr_3daxrGamescript_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...dow of chernobylgamedatascriptstest_kick.script:34: attempt to call method 'section' (a nil value)
Метод обращения в игре не предусмотрен. Возможно, стоит пересмотреть подход к тому или иному скрипту.
Expression : rpoints[0].size() Function : game_sv_Deathmatch::Create File : D:prog_repositorysourcestrunkxrGamegame_sv_deathmatch.cpp Line : 99 Description : rpoints for players not found
На мультиплеерной карте не найдены точки респавна игроков. В SDK должен быть красный пацанчик. Настроить Team = 0
Expression : fatal error Function : xrServer::Process_update File : E:stalkerpatch_1_0004xr_3daxrGamexrServer_process_update.cpp Line : 37 Description : <no expression> Arguments : Beer from the creator of 'WP_SHOTG'
Такое иногда бывает, когда ты (ГГ) или НПС заряжает дробовик или другое оружие со значением tri_state_reload = true.
Это глюк. в игре что-то сбивается, и когда у дробовика максимальное количество заряженных патронов скажем 6, он заряжается за 6 и дальше.. дальше.. дальше.. и так пока не произойдёт вылет с вышеуказанным логом. вылет не значительный и редкий, но если он случается слишком часто, можно в конфигах всех дробовиков и ружей поменять значение tri_state_reload = true на tri_state_reload = false.
Expression : fatal error Function : CInifile::r_string File : D:prog_repositorysourcestrunkxrCoreXr_ini.cpp Line : 477 Description : <no expression> Arguments : Can't find variable bound_rect in [level_map]
Такой лог бывает когда подключаешь локацию из ТЧ в ЗП. Причина проста — в ЗП уровнях файл строчка bound_rect пишется в файле gamedatalevelsимя_уровняlevel.ltx, а в ТЧ строка bound_rect для каждого уровня непосредственно в файле gamedataconfiggame_maps_single.ltx …
Исправить просто, нужно изменить файл gamedatalevelsимя_уровняlevel.ltx в подключенной локации, просто перенести строку bound_rect из game_maps_single.ltx в level.ltx перед строчкой texture.
Expression : hGame Function : CEngineAPI::Initialize File : E:stalkerpatch_1_0004xr_3daEngineAPI.cpp Line : 65 Description : Game DLL raised exception during loading or there is no game DLL at all
Случается когда одна из dll некорректна. Например такой вылет бывает если подсунуть в ТЧ 1.0004 xrGame от 6 патча.
Expression : assertion failed Function : CInventory::Eat File : E:stalkersourcestrunkxr_3daxrGameInventory.cpp Line : 892 Description : pIItem->m_pCurrentInventory==this
Вылет встречается только на 6 патче при попытке хаванья из трупа. Ищите, исправленную Kolmogor’om, xrGame.dll в Интернете
[error]Expression : error handler is invoked! [error]Function : invalid_parameter_handler [error]File : E:stalkersourcestrunkxrCorexrDebugNew.cpp [error]Line : 804 [error]Description :
Данный вылет бывает когда у какого либо из объектов установлено некорректное значение (читал, сам не получал его)
Или же если данный вылет происходит при вызове класса, то проблема в том что в методе __init() класса прописано super()
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:prog_repositorysourcestrunkxrServerEntitiesscript_storage.cpp Line : 748 Description : d:stalker copgamedatascriptsbind_stalker.script:231: attempt to index global 'ИМЯ_ФАЙЛА' (a nil value)
Вылет происходит в двух случаях — когда скрипт пытается вызвать функцию из несуществующего файла или когда в файле допущена синтаксическая ошибка.
Expression : fatal error Function : CScriptEngine::lua_error File : E:stalkersourcestrunkxr_3daxrGamescript_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: attempt to call a nil value
Происходит при попытке вызвать класс, которого не существует
Небольшой пример из практики по определению ошибки в особых случаях(для начинающих):
Игра зависла, картинка на экране не меняется, на Ctrl + Alt+ Delete не реагирует. Только «Холодная перезагрузка» reset. Но при этом обычно в логе нет записи и обычным Ctrl + V ошибку не увидеть.
Я пользуюсь программой Punto Switcher. Есть в ней опция «дневник», она ведёт запись всех нажатий клавиш и по нажатию сочетаний клавиш содержимое памяти может записывать в дневник.
теперь когда игра зависла и картинка на экране не меняется, нажимаете Ctrl + Alt+ Delete. Внешне ничего не изменится, но ОС будет реагировать
на клавиши, нажимаете сочетание клавиш «записать в дневник». Делаете перезагрузку, открываете дневник — Ваша ошибка записана.
«дядя Саша»
Expression : bone_id!=BI_NONE Function : SArtefactDetectorsSupport::SetVisible File : D:prog_repositorysourcestrunkxrGameArtefact.cpp Line : 525 Description : link
Возникает при создании или добавлении чужих артефактов. В artefacts.ltx, в секции af_base есть параметр particles_bone=link. Это имя косточки, которая принимается за центр при проигрывании партикла. Если кость в артефакте называется по иному, например joint2, и это не указанно в секции нового арта, которая наследуется от базовой и подразумевает естественно наличие link, получаем вылет. Решается конвертированием модели арта в .object, просмотром в sdk и выяснением имени косточки с занесением в конфиг.
Expression : error handler is invoked! Function : invalid_parameter_handler File : D:prog_repositorysourcestrunkxrCorexrDebugNew.cpp Line : 815 Description : bad argument #3 to 'format' (string expected, got no value)
Вылет заканчивающийся строкой, то что выше не указываю роли не играет, здесь роль играет только «bad argument #3». Если это появилось значит у Вас ошибка в файле с расширением .ltx (обращаю внимание, не путать с файлами .script), которая находится между [….] квадратными скобками в файле. Это может быть секция предмета, секция логики, секция пути файла way_, т.е. там где присутствуют квадратные скобки.
Expression : cross_table().header().level_guid() == level_graph().header().guid() Function : CAI_Space::load File : D:prog_repositorysourcestrunkxrGameai_space.cpp Line : 113 Description : cross_table doesn't correspond to the AI-map
Скорее всего, отсутствует файл level.ai. Возможно после правки уровня в SDK и компиляции AI, вы забыли его скопировать в папку уровня. Важно помнить, что level.ai нужно обновлять для всех уровней, а не только для тех, которые подвергались правке.
Безлоговый вылет
Вылет, при котором лог отсутствует. Причины такого вылета:
1. Безлоговые вылеты бывают в основном из-за завышенных настроек видео.
Решение:
В папке с игрой открыть папку gamedata, папку config, в ней файл alife, открыть любым текстовым редактором (блокнотом, или лучше word pad’ом) и найти строку switch distance = и изменить значение на 5, сохранить изменения. Это только одна (не сильно вероятная) причина безлогового вылета. если вы знаете ещё одну причину, пожалуйста напишите здесь.
2. Вторая причина неправильно указано название пути в логике НПС или он полностью отсутствует в файле way_ all.spawn. Вылетать будет когда дойдёт время до спавна этого НПС.
3. Также, безлоговые вылеты происходят из-за ошибок в диалогах.
- Автор статьи — Pihan13
- Дополнительный справочник «вылетов» игры
Не стесняемся — дополняем, если знаем о чём идёт речь.
Продолжаем разговор:
sys_ini = system_ini() global_time_ms, game_time_ms, game_time_sec, game_time_time = 0, 0, 0, 0 game_time_start, game_time_base = 0, 0 -- игровое время на начало игры, игровое время при загрузке dist_sw_online = 150 dist_sw_offline = 180 IAmAStalker, IAmAMonster = {}, {} -- obsolete IAmAWeapon, IAmAWeaponFireOnly = {}, {} -- obsolete c_npc = false c_actor = false c_mob = {} c_ai = {} c_trader = false c_ibox = false c_wpn = {} c_arms = {} mob_online = {} -- табличка принудительного on/off-line для монстров force_offline = {} -- принудительный оффлайн для неписей и тайников function printf() end function print_table() end function trim( s ) return string_match( s, "^%s*(.*%S)" ) end -- обрезаем пробелы function Parse_StrToTbl( s, div, mode ) -- ( строка, разделитель, [true|число|nil для строк] ) local t = {} local pattern if div then pattern = "%s*([^" .. sDiv .. "]+)%s*" else pattern = "[_%w]+" end if mode then if mode == true then for v in string_gmatch( s, pattern ) do t[v] = true end -- таблица вида [значение] = true elseif type( mode ) == "number" then -- таблица вида [idx] = число for v in string_gmatch( s, pattern ) do table_insert( t, tonumber( v ) or v ) end else abort( "Parse_StrToTbl, ivalid mode: %s", tostring( mode ) ) end else for v in string_gmatch( s, pattern ) do table_insert( t, v ) end end return t end function parse_custom_data( str ) -- комментарии в профилях и cd не использовать ! Сохраняются в cd как есть ! local t = {} if str then --log( "info", "parse_custom_data: [" .. string_sub( str, 1, 150 ) .. "]" ) local ts for sect, data in string_gfind( str, "%s*%[([^%]]*)%]%s*([^%[%z]*)%s*" ) do --log( "info", "parse_custom_data, sect: [" .. sect .. "], data: [" .. string_sub( data or "nil", 1, 120 ) .. "]" ) ts = {} t[sect] = ts for s in string_gfind( data or "", "([^n]*)n*" ) do if string_find( s, "=" ) then for k, v in string_gfind( s, "([^=]-)%s*=%s*(.*)" ) do --log( "info", "parse_custom_data, " .. k .. " = " .. string_sub( v or "nil", 1, 120 ) ) if v then k = string_match( k, "^%s*(.*%S)" ) if k and k ~= "" then ts[k] = string_match( v, "^%s*(.*%S)" ) end end end else local k = string_match( s, "^%s*(.*%S)" ) if k and k ~= "" then ts[k] = "<<no_value>>" end end end end end return t end function gen_custom_data( t ) local s = "" for k, v in pairs( t ) do s = s .. "[" .. k .. "]n" for kk, vv in pairs( v ) do if vv ~= "<<no_value>>" then s = s .. kk .. " = " .. vv .. "n" else s = s .. kk .. "n" end end end return s end function parse_names( s ) local t, n = {}, 0 for name in string_gfind( s, "([%w%-%._\]+)[%,%s]*" ) do n = n + 1; t[n] = name end return t end function parse_key_value( s ) if s then local t = {} local k for n in string_gfind( s, "([%w%-%._\]+)[%,%s]*" ) do if k then t[k] = n; k = nil else k = n end end return t end end function parse_nums( s ) local t, n = {}, 0 for entry in string_gfind( s, "([%d%.]+)%,*" ) do n = n + 1; t[n] = tonumber( entry ) end return t end
sys_ini = system_ini() — файлы в винде вообще открываются ОЧЕНЬ медленно. А сам сталкер еще и что-то с ними делает, тоже мееедленно, и печально.
Отсюда и загрузка солянки по 2 минуты. Так что открываем все один раз, и так в открытом состоянии и держим.
global_time_ms, game_time_ms, game_time_sec, game_time_time = 0, 0, 0, 0
game_time_start, game_time_base = 0, 0 — игровое время на начало игры, игровое время при загрузке
В общем, вместо времени 64 бит с многочисленными преобразованиями в таблицы и обратно я использую везде 32.
Ага, 31 мая, 32 мая, и т.д. Чтобы такого не было — время всегда считается не от НИ, а от загрузки. И сохраняется дельта. А месяц топтаться на одной оркации без единого сэйва — вряд-ли кто будет.
Ну и наконец, вместо медленного вызова функций и пересчета используем быстрое обращение к переменной. А обновляются они раз в 200ms — вполне достаточно, я считаю.
dist_sw_online = 150
dist_sw_offline = 180
Опять же, чтобы не перечитывать и не пересчитывать постоянно — переменные. А из alife.ltx берем только при загрузке.
IAmAStalker, IAmAMonster = {}, {} — obsolete
IAmAWeapon, IAmAWeaponFireOnly = {}, {} — obsolete
c_npc = false
c_actor = false
c_mob = {}
c_ai = {}
c_trader = false
c_ibox = false
c_wpn = {}
c_arms = {}
— то, которое устарело — это была одна из солянковских оптимизаций. Устарело. Просто не от всюду еще дочистил. Добавлены константы и таблички с классами. Инициализируются при старте, когда отработает class_regisrator и появится alife().
mob_online = {} — табличка принудительного on/off-line для монстров
force_offline = {} — принудительный оффлайн для неписей и тайников
Как бы понятно из названия. Единые таблицы для ВСЕХ скриптов, где применяется такой фокус. Хотя вообще-то на самом деле это плохой, негодный фокус, и он не нужен, но это уже другая тема. А так — в amk было переодевание и тайники, использовавшее convert_npc={}, еще где-то — need_be_online={} в se_monster, не знаю, зачем… Тысячи их. Все снести, где реально надо — заменить на единые глобальные.
printf() и print_table() — затычки для недовычищенного и прочих разных гибридизаций ежа с ужом через 50 скриптов, гордо именуемых «адаптациями».
И, наконец, преобразования разных забавных строк в разные забавные таблицы, и обратно. Часть — была и в оригинале, часть — во вножестве экземпляров в разных скриптах, и оригинальных, и которые см. про «адаптацию».
Все собрано в одном месте и переписано.
Тут важно понимать, что в LUA НЕТ инлайна, а следовательно, все равно все это будет работать медленно и печально, и прежде чем использовать какую-нибудь функцию преобразования чего-попало во что-нибудь еще, особенно, в цикле или апдейте — подумайте, а надо ли ?
Ибо нет ничего более нелепого, и вызывающего содрогание, чем конструкция вида:
local s = «1, 2, 3»
local t = parse_nums( s )
local n1, n2, n3
for k, v in pairs( t ) do if k == 1 then n1 = v end; if k == 2 then n2 = v end; if k == 3 then n3 = v end; end
Изменено 23 Ноября 2014 пользователем Dennis_Chikin
Модостроение. Редактирование и создание скриптов |
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|
|