Как подключить локацию в S.T.A.L.K.E.R. Зов Припяти
Когда я начинал моддить, я смотрел много туторов, обучений и прочего. Честно говоря, почти ничего не понял по подключению локаций, кроме того, что нужно скачать программу от АМК и что-то в ней сотворить, а потом возиться с конфигами. Так что разбираться пришлось по большей части самому. Поэтому я решил написать свой тутор по подключению локаций. На этом примере мы будем подключать Кордон. Итак, начнём. Во-первых, нам понадобятся распакованные ЗП и ТЧ.
Распаковать все игры серии можно прогой SUExtractor. После распаковки в корневых папках игр появятся папки gamedataUE с распакованными файлами игр.
Сначала нужно скачать программу от АМК для изменения гейм графа (не пугайтесь этого слова, потом поймёте, что оно значит ). Так же необходимо распаковать all.spawn от ЗП.
Сначала скачайте программу ACDC. Распакуйте архив с прогой. Теперь зайдите в папку gamedata\spawns от ЗП. В этой папке должен лежать только один файл — all.spawn. Копируйте его и вставляйте в папку, в которой у вас лежит распакованный ACDC. После этого запустите decompile.bat. Подождите некоторое время. Программа распакует all.spawn. И у вас в папке должны появиться такие файлы: ‘alife_***.ltx’, ‘all.ltx’, ‘way_***.ltx’, где ‘***’ — названия уровней (zaton, pripyat и т.п.). Всё, вы распаковали all.spawn.
Теперь делаем вот что: создаём две папки: ‘ЗП’ и ‘ТЧ’. В обеих создаём пустые папки ‘gamedata’. В папку gamedata в ЗП кидаете папку ‘spawns’ и в неё кидаем распакованный all.spawn от ЗП (именно распакованные файлы, а не папку с распакованными файлами — то есть файлы ‘alife_***’, ‘way_***’ и прочие, которые распаковались, должны лежать прямо в папке spawns). В gamedat-е от ТЧ создаём папку ‘levels’ и кидаем в неё папку с локацией из ТЧ, которую хотим подключить — то есть в нашем случае, папку ‘l01_escape’. И туда же, в ТЧ\gamedata кидаете файл game.graph от ТЧ. Потом запускаем программу. В левом окне выбираем файл ТЧ\gamedata\game.graph, в правом ставим фильтр типа ‘все файлы’ и выбираем файл ЗП\gamedata\spawns\section4.bin (он есть в распакованном all.spawn от ЗП). И потом в левом окне выбираем ‘l01_escape’ и нажимаем на ‘>’. Локация переносится в правое окошко, нажимаем кнопку ‘сохранить’ под правым окном и выходите из программы. Теперь идём в папку ЗП\gamedata\spawns — тут появился новый файл graph4.bin.new. Удаляем отсюда файл graph4.bin и graph4.bin.new переименовываем в graph4.bin. После этого идём в папку ТЧ\gamedata\levels\l01_escape. Тут у нас появился новый файл level.ai10. Удаляем файл level.ai и level.ai10 переименовываем в level.ai. Первый этап подходит к концу. Теперь создаём в корневой папке с установленным Зовом Припяти чистую папку gamedata. В ней будет лежать мод с нашей подключённой локацией. Сразу же переписываем в эту геймдату папку spawns из нашей папки ЗП\gamedata (переписываем её со всеми файлами). И ещё переписываем в неё всю папку levels (с папкой l01_escape) из нашей папки ТЧ\gamedata. На этом первый этап закончен. Теперь наши две созданные папки ЗП и ТЧ можно удалить вообще, они нам больше не нужны. Теперь нам нужно разобраться с распакованным all.spawn. Идём в нагу новую gamedat-у, в папку spawns. И делаем вот что: создаём в неё абсолютно чистые файлы alife_l01_escape.ltx и way_l01_escape.ltx. После этого заходим в файл all.ltx и ставим после ‘alife_jupiter_underground.ltx’ запятую и на следующей строке пишем ‘alife_l01_escape.ltx’. И, соответственно, после ‘way_zaton.ltx’ ставим запятую и на следующей строке пишем ‘way_l01_escape.ltx’. Сохраняем изменённый all.ltx. Однако нам надо сделать так, чтобы наш ГГ начинал игру прямо с Кордона (чтобы протестировать его), а не с Затона. Чтобы это сделать, открываем файл alife_zaton.ltx и ищем поиском такую сточку: ‘section_name = actor’. Он её должен найти. Дальше вырезаем всю секцию all.spawn-а, в которой находится эта строка. Вот пример этой секции, у вас могут быть другие числа, но слова те же
Code
[82] ; cse_abstract properties section_name = actor name = zaton_actor position = -247.79,-24.79,-134.35 direction = 0,0,0 s_flags = 0x29
И переносим эту секцию в файл alife_l01_escape.ltx. В alife_zaton обязательно не забудьте её удалить! Однако, если так и оставить, то вы появитесь на новой локации непонятно где и, скорее всего, вывалитесь за её пределы. А для того, чтобы узнать координаты на новой локации, где можно появиться, нужно на неё попасть. На самом деле решение довольно простое. Открываем alife_l01_escape.ltx в распакованном all.spawn от ТЧ и ищем там по той же строке спаун актёра. И просто копируем все координаты. Ведь все координаты на подключённой локации остались прежними! Для тех, у кого нет распакованного all.spawn от ТЧ или прото лень это делать, вот почти готовая секция спавна актёра для ЗП:
Code
[10008082] ; cse_abstract properties section_name = actor name = zaton_actor position = -247.79,-24.79,-134.35 direction = 0,0,0 s_flags = 0x29
Заметьте, координаты в position и upd:position должны совпадать. Казалось бы, всё. Но нет. На самом деле, ещё одна проблема есть — это гейм вертекс (game_vertex). У каждой локации свой диапазон неповторяющихся гейм вертексов. И в ЗП и ТЧ гейм вертексы некоторых локаций могут пересекаться. Проще говоря, что нужно сделать: ищем в папке с нашим распакованным all.spawn (который лежит в папке spawns в gamedat-е) файл acdccop.pl. Открываем его текстовым редактором и ищем такую строку: ‘{ gvid0 => 0, name => ‘zaton’ }’. И там, где мы её найдём видим такой код:
Code
use constant levels_info => ( { gvid0 => 934, }, { gvid0 => 883, name => ‘jupiter_underground’ }, { gvid0 => 857, name => ‘labx8’ }, { gvid0 => 666, name => ‘pripyat’ }, { gvid0 => 317, name => ‘jupiter’ }, { gvid0 => 0, name => ‘zaton’ },
И что мы в нём видим? Слева пишется начальный геймвертекс дипазона локации, а справа сама локация. То есть геймвертексы Затона начинаются с нуля, геймвертексы Юпитера — с 317 и т.д. А геймвертексы путепровода (jupiter_underground) начинаются с 883. И после этого стоит ещё один геймвертекс начальный, но к нему нет локации. Соответственно, меняем код на такой:
Code
use constant levels_info => ( { gvid0 => 934, name => ‘l01_escape’ }, { gvid0 => 883, name => ‘jupiter_underground’ }, { gvid0 => 857, name => ‘labx8’ }, { gvid0 => 666, name => ‘pripyat’ }, { gvid0 => 317, name => ‘jupiter’ }, { gvid0 => 0, name => ‘zaton’ },
То есть начальный геймвертекс нашей новой локации как раз будет 934. Сохраняем acdccop.pl. Собсвтенно, это нам и нужно было узнать. Теперь смотрим в спаун Кордона из ТЧ и видим, что его начальный геймвертекс равен нулю. 934-0=934. Значит, в ЗП все геймвертексы Кордона должны увеличиться ровно на 934. Однако, мы пока не стали переписывать всеь спаун Кордона из ТЧ в ЗП. Пока что у нас там только спаун ГГ. Возвращаемся немного назад и смотрим на game_vertex секции его спавна. В ТЧ он спавнился с геймвертекстом, равным 4-м. Значит, теперь его геймвертекс будет равен 938 (934+4, для тех, кто ещё не понял). Значит, теперь секция спавна ГГ будет выглядеть вот так:
Code
[10082] ; cse_abstract properties section_name = actor name = zaton_actor position = -247.79,-24.79,-134.35 direction = 0,0,0 s_flags = 0x29
Да, и заметьте — я поставил номер секции вместо [82] аж [10082]. Сделайте то же самое. Это нужно, чтобы номера секций где-нибудь не повторились. Собственно, с all.spawn-ом всё. Теперь компилируем его. Для этого нажимаем compile.bat и ждём некоторое время. Вскоре в папке появится файл new.spawn. Теперь создаём какую-нибудь стороннюю папку, не в папке с игрой и переписываем в неё абсолютно всё из нашей папки spawns, кроме новосозданного new.spawn. Остаться должен только он. И теперь переименовываем его в all.spawn. Второй этап закончен. Теперь начинается этап №3. Это подключение локации в конфигах. Создаём в нашей gamedat-е папку configs. И кидаем в неё три файла из конфигов gamedataUE (это папка с распакованной игрой): game_graphs.ltx, game_levels.ltx и game_maps_single.ltx. И теперь начнём их изменять. Сначала откроем game_graphs.ltx. Здесь мы видим в самом начале такие строки:
Всё, на этом третий этап закончен. В принципе, локация уже должна запускаться и нормально работать… Но остались ещё кое-какие мелочи. Эти мелочи, собственно, и есть четвёртый этап нашего подключения. И не самый сложный. Во-первых, локация у нас, скорее всего, вылетит с руганью на шейдеры. Поэтому, чтобы не повторять чужие ошибки (и мои в том числе ) перепишем шейдеры. Заходим в папку с распакованной ТЧ, копируем целиком папку shaders и вставляем в gamedat-у нашего мода. Всю папку целиком. Возможно, какие-то из них и не нужны, но — во-первых, переписывать по одному — это какой-то садизм будет, а во-вторых, при подключении другой локации у вас может не оказаться каких-то шейдеров, который не использовались на первой подключённой локаци и придётся снова переписывать по одному шейдеры… Короче, легче переписать их все и не заморачиваться. К тому же весят они не так уж и много. Так, с шейдерами теперь порядок. Но будет ещё одна проблема — партиклы. Во-первых, найдём в распакованном ЗП файл particles.xr и перепишем в нашу геймдату. Теперь самое трудное — надо объединить партиклы ТЧ и ЗП. Для начала надо скачать программу Particle Editor Tools. Распаковываем архив. Видим две папки: Particles EDITOR и Particle Editor Tool. Сразу копируем вторую папку сюда же. И переименуем. Пусть перва будет называться ‘Particle Editor Tool ЗП’, ну а вторая — ‘Particle Editor Tool ТЧ’. Заходим в первую (ЗП). Видим папку ‘src_trunc’. В неё мы и кладём наш particles.xr от ЗП. Теперь запускаем PEToolGui.exe. В появившимся окне выбираем ‘Декомпилировать’. Ждём немного. После этого у нас в папке src_trunc должно появиться много других папок и в них много файлов формата pe. Это хорошо. Теперь выходим из Particle Editor Tool ЗП и заходим в Particle Editor Tool ТЧ. Собственно, тут проводим абсолютно те же операции, только в src_trunc кладём particles.xr не из ЗП, а из ТЧ. Он нам тоже всё распакует. Теперь копируем все папки из src_trunc в Particle Editor Tool ТЧ и вставляем их без замены в src_trunc в Particle Editor Tool ЗП. Таким образом, мы объединили партиклы ТЧ и ЗП. Теперь из надо только скомпилировать. Заходим в PEToolGui.exe и нажимаем ‘Скомпилировать’. В появившемся окошке выбираем игру — ‘Зов Припяти’ и ждём, пока он скомпилирует. По завершении у нас в папке output появится новый particles.xr, который должен весить больше, чем старый. И этот новый particles.xr мы переписываем в геймдату с нашим модом. Всё, партиклы на месте. Собственно, четвёртый этап закончен. Теперь локация подключена и играбельна. Теперь можете попробовать запустить игру. Если вы всё делали один в один, как тут написано, то вы должны стартовать игру на Кордоне. Причём не заселённом. Кстати, вполне возможно, что при запуске игра у вас вылетит, потому что не будет некоторых текстур или моделей. Тогда просто смотрите лог (папка с игрой\users\logs\xray_имя_пользователя.log). И там у вас будет написано что-то типа:
Code
Can`t find texture /название и путь до текстуры/
И таких надписей в логе скорее всего будет много. Просто последовательно переписывайте все текстуры, которых не хватает, из распакованного ТЧ в нашу геймдату. Собственно, с подключением всё.
Теперь хочу скачать насчёт спавна. Радость подключения омрачает одно: локация не заселена вообще, мы же снесли весь спаун. Так вот, помните, я говорил, что все координаты остаются прежними и надо изменять только геймвертексы при переводе спавна локации из ТЧ в ЗП. Но там огромное количество секций спавна! И вручную увеличивать каждую — это бред. И для этого дела есть специальная прога от kalinin11 — Spawn Parser. Скачайте и поставьте. Там в принципе есть интсрукция, но для тех, кто не читает инструкции из принципа пишу здесь: 1. в папку src кидаем файл спавна нужной нам локации (alife_***.ltx). 2. В папке vertex создаём bat-файл с таким текстом:
Теперь объясняю — сначала пишется название файла, который нужно переделать, потом название файла на выходе (после обработки) и последняя цифра — это на сколько нужно увеличить game_vertex_id. Естественно, его мжно и уменьшить, для этого нужно просто перед числом поставить минус . И потом запускайте этот батник, после обработки у вас в папке vertex появится файл alife_l01_escape2.ltx (или какой вы указали) с изменёнными геймвертексами. Сразу скажу — лично у меня прога при обработке спавна Кордона ругнулась на какое-то большое число (что-то типа 65535). Я не стал заморачиваться и просто тупо удалил в исходном файле все строки, в которых было это число. И после этого программа нормально обработала файл. Программа обработает файл, однако после этого проблемы со спавном ещё не закончатся — проблемв в том, что в ЗП нет многих секций, параметром, объектов, которые используются в ТЧ. Поэтому со спавном вы провозитесь ещё долго. Точно знаю, что надо удалить все секции спавна, в которых употребляются такие знаки, как ‘{‘ и ‘%’. Но нужно будет ещё какие-то удалять… Скорее всего, ACDC даже не скомпилирует такой файл, пока вы его не переделаете, удалив многие непоходящие секции. Так что перевод спавна — это отдельная долгая и муторная работа. Так что подумайте — может легче прочитать статьи по спавну в ЗП и создать спавн на локации самому?