←  Статьи по ковырянию игры

Форум Stalker Simbion Mod

»

Перенос локаций из ЧН в ЗП

фото Larry76 21 июля 2010

Введение:
В связи с появлением простой проги от АМК в сети,подключение локации перестало быть чем-то сложным.
Но к сожалению в туторе: Подключение локаций
Описан метод подключения из ТЧ к ЗП или к ЧН. лично для меня,как для нуба при подключении локи из ЧН к ЗП возникло множество вопросов,несмотря на то,что сделать это гораздо проще(как оказалось :icon_super2:) ,чем подключать локу из ТЧ
В связи с этим я решил поделиться опытом,чтоб повторяющие мой путь не "наступали на те же грабли".
И так начнём.

Подготовка.

Для начала скачаем программы,которые нам понадобятся при подключении.
1. Универсальный распаковщик ресурсов игр Сталкер

2. ActivePerl

3. ggtool

4. ACDC_Cs

5. ACDC_Cop

6. ggEditor_01

При помощи распаковщика распакуем ресурсы ЧН и ЗП (прога имеет интуитивно понятный интерфейс,думаю проблем тут не возникнет)
Устанавливаем active perl.

Создаём папку с программой ggEditor_01.Создаем там папки Cs и Cop.В папке CS создаем папку gamedata.В папке gamedata создаем папку levels и кидаем туда папку с уровнем, который мы хотим портировать. Далее возвращаемся в папку CS и туда кидаем папку с ACDC для CS, туда же кладём all.spawn.Запускаем соответствующий батник для распаковки all.spawn`а.

Далее в папку ggEditor_01\ Cop,распаковываем соответствующий ACDC, опять-же кладем туда all.spawn, распаковываем.

В итоге у нас должно получиться 2 распакованных all.spawn`а и папка с переносимым уровнем.

С приготовлениями всё.

Основная работа.

Запускаем программу ggEditor.Видим там два окошка. В левом открываем graph.bin от ЧН, а в правом — section4.bin от ЗП(они появятся после распаковки all.spawn`а) Нужно выбрать тип файлов для ЧН — graph.bin, а для ЗП — все файлы и открыть в папке с ACDC файл . В окошках мы видим список уровней. В левом окошке находим нужный нам уровень и нажимаем на соответствующую стрелку для переноса уровня в нужный нам граф. Нажимаем в правом окошке «сохранить».После того, как граф сохранился, можно закрыть программу, она нам больше не понадобится. Потом этого шагаем в папку с ACDC для ЗП и удаляем старые файлы section4.bin.Затем переименовываем файл section4.bin.new в section4.bin.

Далее идем в папку с ACDC от ЧН, находим там файл alife_наша_локация и копируем его. Затем шуруем в папку с ACDC от ЗП, вставляем скопированный нами файл. Открываем этот файл, сносим все, оставляем только одну секцию спавна(Лучше всего если это будет какой-нибудь объект,я например всегда оставляю Campfire, костёр.), присваиваем секции номер не меньше 20000, сворачиваем на время этот файл. Далее нужно подогнать вертексы. Для этого запускаем батник ggtool, ждем некоторое время, после чего появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией(в ЗП это скорее всего будет 934).Далее разворачиваем alife_ файл с нашей локацией, ищем там строку «game_vertex_id» и пишем там число которое появилось рядом с нашей локацией при запуске батника ggtool. Далее, в добавляемых потом секциях спавна нужно писать эти числа. Мы подогнали вертексы.

Затем открываем файл all.ltx.Вписываем туда свой alife_ файл локации, way_ файлы не трогаем. Меняем на соответствующее число локации строку level_count.

После этого открываем файл alife_zaton(для ЗП) и ищем там гг по строке «section_name = actor».Нашли?Отлично. Теперь присваиваем этой секции спавна позицию(новую позицию прописываем также в строке "upd:position = ") и вертексы как у единственного предмета в файле alife_новая_локация. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле alife_новая_лока.

Мы почти закончили с пробной сборкой новой локации(пока без перехода).

Осталось только прописать наш новый уровень в файл ACDC Cop\acdccop.pl(для ЗП)

В этом файле ищем такие строки(для ЗП):
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' },
И если у вас число когда мы запускали батник ggtool тоже 934 то прописываем так:
use constant levels_info => (
	{ gvid0 => 934,         name => 'ваша_локация' },
	{ gvid0 => 883,		name => 'jupiter_underground' },
	{ gvid0 => 857,		name => 'labx8' },
	{ gvid0 => 666,		name => 'pripyat' },
	{ gvid0 => 317,		name => 'jupiter' },
	{ gvid0 => 0,		name => 'zaton' },
Всё.Собираем all.spawn.

Сборка геймдаты.

Осталось собрать gamedat`у для игры и смотреть что получилось. Итак, приступим:

В папке с игрой создаем папку gamedata, а в ней папки configs, levels, spawns.В папку spawns ложим получившийся при сборке all.spawn.new(или new.spawn), не забывая переименовать его в all.spawn.В папку levels ложим уровень из ggEditor_01\Soc\gamedata\levels\ваша_локация.

Теперь осталось только прописать уровень в конфигах.Из распакованной геймдаты игры берем файлы configs\game_graphs.ltx, game_levels.ltx, game_maps_single.ltx.

game_graphs.ltx для ЗП должен выглядеть так:
[location_0]
  000          = "..."
  001          = "ваша_локация"
  002          = "sim_smart_2"
  003          = "sim_smart_3"
  004          = "sim_smart_4"
  005          = "sim_smart_5"
  006          = "sim_smart_6"
  007          = "sim_smart_7"
  008          = "sim_smart_8"
  009          = "sim_smart_base"
 
 
 
[location_1]
  000          = "..."
  001          = "ограниченный доступ"
  002		   = "запрещенный доступ"
 
[location_2]
  000          = "..."
  001		   = "не для игрока"
 
[location_3]
  000          = "..."
  ...          . .......................
  112          = "pri_a22_smart_terrain"
  113          = "pri_a25_smart_terrain"
  114          = "pri_a28_arch"
  115          = "pri_a28_base"
  116          = "pri_b28_evac"
  117          = "pri_a28_heli"
  118          = "pri_a28_school"
  119          = "pri_a28_shop"
  120          = "pri_b301"
  121          = "pri_b302"
  122          = "pri_b303"
  123          = "pri_b304_monsters_smart_terrain"
  124          = "pri_b305_dogs"
  125          = "pri_b306"
  126          = "pri_b307"
  127          = "pri_b35_mercs"
  128          = "pri_b35_military"
  129          = "pri_b36_smart_terrain"
  130          = "pri_sim_1"
  131          = "pri_sim_2"
  132          = "pri_sim_3"
  133          = "pri_sim_4"
  134          = "pri_sim_5"
  135          = "pri_sim_6"
  136          = "pri_sim_7"
  137          = "pri_sim_8"
  138          = "pri_sim_9"
  139          = "pri_sim_10"
  140          = "pri_sim_11"
  141          = "pri_sim_12"
  142          = "ваша_локация"
 
 
[graph_points_draw_color_palette]
default				= 0x6000ffff 
000_000_000_000		= 0x60ff00ff

Далее лезем в game_levels.ltx. Там в самом начале, где список уровней, вписываем "level183"(число не менее 183.) Листаем файл до самого конца и в конце пишем следующее:
[level183]
name   = ваша_локация
caption = "ваша_локация"
offset  = 700.0,     1000.0,    -840.0
weathers = [default]
id  = 183
Затем открываем файл game_maps_single.ltx и прописываем свой уровень в секции "[level_maps_single]", а затем создаем примерно такую секцию для нашего уровня:
[ваша_локация]
        global_rect                      = 307.0, 90.0, 717.0, 500.000000
        weathers                         = dynamic_default

Всё.Запускайте игру и пробуйте, что получилось.


Возможные вылеты:
FATAL ERROR

[error]Expression : cross_table().header().level_guid() == level_graph().header().guid()
[error]Function : CAI_Space::load
[error]File : D:\prog_repository\sources\trunk\xrGame\ai_space.cpp
[error]Line : 113
[error]Description : cross_table doesn't correspond to the AI-map
Данный вылет свидетельствует о том,что вы использовали распаковщик ресурсов игры не из этой темы.У вас при распаковке вашего уровня "съехала АИ-сетка"
Лечение: Использовать распаковщик предложенный выше.

[error]Expression : fs
[error]Function : CResourceManager::_CreateVS
[error]File : D:\prog_repository\sources\trunk\Layers\xrRender\ResourceManager_Resources.cpp
[error]Line : 166
[error]Description : shader file doesnt exist
[error]Arguments : c:\program files (x86)\gsc world publishing\s.t.a.l.k.e.r. - Зов Припяти\gamedata\shaders\r2\deffer_impl_flat.vs
Лечение:
В папке gamedata создаёте папки shaders\r2 переносите из ЧН файл deffer_impl_flat_d.vs переименовываете его в deffer_impl_flat.vs

как пример: Локация "агропром " прикрученная к ЗП за полчаса. :be_be:
Агропром

Примечание: На компьютере должен быть обязательно установлен NetFramework версией не ниже 2.0
Это для тех,кто использует старые сборки ХР.
Скачать можно Тут
Ответить

фото Larry76 21 июля 2010

Соединение с остальными уровнями.

Предлагаю вам не терять зря времени просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях:на подключенной и на той на которую вы хотите сделать переход соответственно.На каждой локации нам нужно снять по две координаты(координата самого перехода и координата места в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим.).Cнять координатыможно при помощи скриптика взятого из https://forum.stalke...ndpost&p=125762

Мы отмерили все необходимые нам координаты.

Затем распаковываем сделанный нами ранее all.spawn.Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна:
[1] 
; cse_abstract properties 
section_name = level_changer 
name = escgar_level_changer - уникальное имя
position = 28.060224533081,16.556184768677,685.80151367188 - координаты перехода
direction = 0,0,0 
cse_abstract__unk1_h16 = 0x1 
; cse_alife_object properties 
game_vertex_id = 1142 - геймвертексы
distance = 0
level_vertex_id = 308110 - геймвертексы
object_flags = 0xffffff3e
; cse_shape properties 
shapes = shape0 
shape0:type = box 
shape0:axis_x = 1.25219917297363,0,0 
shape0:axis_y = 0,3.09340000152588,0 
shape0:axis_z = 0,0,1.25219917297363 
shape0:offset = 0,0,0 
; cse_alife_space_restrictor properties 
restrictor_type = 3 
; cse_alife_level_changer properties 
dest_game_vertex_id = 1187 - вертексы локи на которую ведет переход
dest_level_vertex_id = 212769 - вертексы локи на которую ведет переход
dest_position = 39.396331787109,0.48722490668297,-299.7674505469 - позиция куда кидает
dest_direction = 0,0,0 - поворот гг
dest_level_name = l02_garbage - на какую локу кидает
dest_graph_point = start_actor_01
silent_mode = 1 
; se_level_changer properties
Изменяем только те места, которые я прокомментировал, комментарии соответственно, удаляем. Всё готово.Собираем all.spawn и запихиваем в игру.

Да и еще.Если будете переносить секции спавна, то для массовой замены гейм вертексов и левел вертексов можно использовать блокнот: открываем наш файл в блокноте=> правка=> заменить, и пишем что на что заменять.
Ответить

фото zhedya 08 сент. 2010

После этого открываем файл alife_zaton(для ЗП) и ищем там гг по строке «section_name = actor».Нашли?Отлично. Теперь присваиваем этой секции спавна позицию(новую позицию прописываем также в строке "upd:position = ") и вертексы как у единственного предмета в файле alife_новая_локация. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле alife_новая_лока.
-------------------------------------------------------------------------------------------------------------------
что значит присвоить позицию
и как её присвоить
извените - но можно поподробней это обзац (мну очень нужно)
Ответить

фото slayer_kch 09 сент. 2010

zhedya
Что бы актёр появился на новой локации, нужна позиция(место) где появится актёр.
Для этого нужно в alife_новая_локация вписать секцию актёра из alife_zaton и подогнать координаты с учётом изменений на новой локации.
Пример находим координаты любого ящика или костра и прибавляем 934 к game_vertex_id и level_vertex_id
Ящик из родного alife_l01_marsh.ltx ЧН
Ящик
Актёр на новой локе

Почему нужно к старым координатам прибавлять 934
потому что так получилось
смотреть тут
use constant levels_info => (
{ gvid0 => 934, name => 'march' }, это поцепленные Болота
{ gvid0 => 883, name => 'jupiter_underground' },
{ gvid0 => 857, name => 'labx8' },
{ gvid0 => 666, name => 'pripyat' },
{ gvid0 => 317, name => 'jupiter' },
{ gvid0 => 0, name => 'zaton' },
у других подцепленных локаций разница в координатах будет другая я на примере Болот показал
Ответить

фото Larry76 09 сент. 2010

zhedya, А ты начинал что-то делать? Или решил просто чтением всё узнать? Так не бывает.
Если бы ты дошёл опытным путём до этого места,то ТАКИХ вопросов бы не задавал.

Итак ... любой предмет,персонаж имеет координаты нахождения в игре.X,Y,Z
Так же он имеет координаты так называемых вертексов,т.е.координаты на глобальной карте.(это как раз то,о чем написал slayer_kch, )

Если б ты распаковал бы аллспавн(как написано в туторе), и нашёл бы секцию со строкой "section_name = actor"
То увидел бы:
[982]
; cse_abstract properties
section_name = actor
name = zaton_actor
[color="#FF00FF"]position = 256.240051269531,19.8124237060547,550.824279785156[/color]--\\ позиция игрока
direction = -0.0120869996026158,2.81339907646179,-0.0158249996602535
s_flags = 0x29

; cse_alife_object properties
[color="#FF00FF"]game_vertex_id = 292[/color]      --\\ глобальные вертексы.
distance = 38.5
[color="#FF00FF"]level_vertex_id = 1405060[/color] --\\ глобальные вертексы.
object_flags = 0xffffffbf

; cse_visual properties
visual_name = actors\stalker_neutral\stalker_neutral_1

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions = 
dynamic_in_restrictions = 

upd:health = 1
upd:timestamp = 0xc2ba3333
upd:creature_flags = 0x99
upd:position = 256.240051269531,19.8124237060547,550.824279785156
upd:o_model = 0
upd:o_torso = 2.81339907646179,-0.0120869996026158,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0

; cse_alife_trader_abstract properties
money = 15000
trader_flags = 0
character_profile = actor
cse_alife_trader_abstract__unk1_u8 = 1

; cse_ph_skeleton properties

; cse_alife_creature_actor properties

upd:actor_state = 0
upd:actor_accel_header = 0
upd:actor_accel_data = 0
upd:actor_velocity_header = 0
upd:actor_velocity_data = 0
upd:actor_radiation = 0
upd:actor_weapon = 215
upd:num_items = 0

; se_actor properties

Теперь понятно? Вместо текущих координат надо поставить координаты предмета(единственного оставшегося) из подключенной локации и ГГ появится вместо этого предмета.
Теоретически можно в координатах писать 0,0,0 и начальный ]game_vertex_id локации (в нашем случае 934) левел _вертекс не трогаем.НО...
Центр локации не всегда находится на уровне земли.Может получиться заспавнить ГГ под землёй или внутри какойни-будь стены и получить вылет.
Ответить

фото Ate1st 22 сент. 2010

подключил локацию darkvalley, при подходе к базе свободы с любой стороны вылетает с логом:

лог

подскажите че не так, и ~ Level Map 'darkvalley' not registered где не зарегистрирована :)
Ответить

фото Larry76 06 окт. 2010

Просмотреть сообщениеAte1st (22 Сентябрь 2010 - 13:02):

подскажите че не так
Трудно сказать. Залей свою геймдату на народ и дай ссылку.
Ответить

фото slayer_kch 09 окт. 2010

Создание автосейва начала игры на подключенных локациях к Зову Припяти если старт игры перенесён с Затона на другую локу.
Вопрос: почему важно создать хотя бы один автосейв.
Ответ: потому что заработает симуляция на локации все монстры созданные вами сквады НПС с логикой и д т , и всё втанет на свои места.
По Кордону скажу что пока не сделал автосейв начала игры монстры и НПС спавнились не как и где мне надо а непонятно где.
1.Открываем аллспавн создаём спейсрестриктор
В alife_escape.ltx создаём секцию спейсрестриктора
Спейсрестриктор
Создаём логику спейсрестриктора
configs\scripts\escape\esc_a1_logic.ltx
Логика спейсрестриктора
Даём своё название автосейву
configs\text\rus\ui_st_other.xml
<string id="st_save_start_escape">
<text>Прибытие на Кордон</text>
</string>
Ответить

фото Tyber1982 31 дек. 2010

Всем спасибо!Получилось!)))
Ответить

фото TecktonicKiller23 05 апр. 2011

И если у вас число когда мы запускали батник ggtool тоже 934 то прописываем так:
use constant levels_info => (
{ gvid0 => 934, name => 'ваша_локация' },
{ gvid0 => 883, name => 'jupiter_underground' },
{ gvid0 => 857, name => 'labx8' },
{ gvid0 => 666, name => 'pripyat' },
{ gvid0 => 317, name => 'jupiter' },
{ gvid0 => 0, name => 'zaton' },


Всё.Собираем all.spawn.

Помогите с acdc умею работать но тут застрял
Немогу собрать all.spawn!!!
вот что в all.ltx
Скрытый текст

вот что в моей переносимой локации
Скрытый текст
и сама фотка с папкой
Размещенное изображение
почему он выдает такую ошибку,у меня же есть это файл?
Помогите пжл То к поподробней первый раз пытаюсь
Сообщение изменено: TecktonicKiller23 (05 Апрель 2011 - 09:58)
Ответить

фото Larry76 05 апр. 2011

А как называется файл Вашей локации?
О!!Блин..нашел В алл.лтх пропиши название файла не alife_l01_marsh , а alife_l01_marsh.ltx !!!
Расширение файла забыл указать. :be_be:
Ответить

фото TecktonicKiller23 08 апр. 2011

подскажите а тоу меня вылетает вот лог

Скрытый текст


Ответить

фото slayer_kch 11 апр. 2011

TecktonicKiller23
Поподробней если можно что сделал как подключал инфы маловато.
По логу судя не находит подключенную локацию
Ответить

фото Vitaliy1986 29 апр. 2011

Подключил при помощи программы локацию Darkscape из билда 2571 к Тени Чернобыля,при создании новой игры вылет в Windows.Вот лог:
...
Starting engine...
Invalid 'hemi_color' in env_section 'default_weather_01'
Invalid 'hemi_color' in env_section 'yantar_01'
Loading DLL: xrGameSpy.dll
Ответить

фото Lagos 30 апр. 2011

И ещё: как исправить вот-эти глюки?Размещенное изображение(Я переносил с ТЧ на ЧНРазмещенное изображение)
Размещенное изображение

Размещенное изображение

Размещенное изображение

Размещенное изображение


Сообщение изменено: Lagos (30 Апрель 2011 - 21:38)
Ответить

фото Larry76 01 мая 2011

Lagos, По первым трем скринам: У тебя тупо нет текстур бетона,асфальта,домов... Они в ТЧ и ЧН по-разному называются и ТЧ-шные соответственно в ЧН не видно(ну или наоборот)Открой папочку textures,там и там , и сравни.
По последнему скрину:
Ты просто на глобальной карте неправильно прописал координаты новой локации,вот они в кучу и съехали.

Энтож азбука,учи матчасть по-внимательней! :z_offtop:
Ответить

фото Lagos 01 мая 2011

Lagos,

Цитата

По первым трем скринам: У тебя тупо нет текстур бетона,асфальта,домов... Они в ТЧ и ЧН по-разному называются и ТЧ-шные соответственно в ЧН не видно(ну или наоборот)Открой папочку textures,там и там , и сравни.
В ТЧ три текстуры в формате .dds, а в ЧН одна .dds и ещё три .thm.Как переделать,подскажить пожалуйста?


По последнему скрину:
Ты просто на глобальной карте неправильно прописал координаты новой локации,вот они в кучу и съехали.
Как координаты правильно вычислить?
P.S.:извините, что без цитат, у меня просто модем, и он отказывается загружать цитаты.[/size]Размещенное изображение
Ответить

фото Larry76 01 мая 2011

Долго очень объяснять...да и я не профи,чтоб точный ответ дать.
Поищи тут: http://www.amk-team.ru/forum/
и тут http://stalkerin.gam...%B8%D1%86%D0%B0
Ответить

фото Lagos 01 мая 2011


Larry76,спасибо, буду пробовать.


Ну кто мне может помочь?Я нашёл статью, на которую давал ссылки Larry76,вот она:
http://stalkerin.gam...1%82%D0%B0_.thm ,
но у меня ничего не выходит.Кто может мне всё толково объяснить?
Ответить

фото Vitaliy1986 05 мая 2011

Очень полезный тутор.
Но есть несколько вопросов.
1.Подключать новые уровни можно только на лицензионную версию игры, или же они заработают и на пиратке?
P.S.:Я подключил уровень k01_darkscape из билда 2571 к ТЧ согласно руководства.Подправил конфиги,добавил текстуры ,которых не хватало,заменил шейдеры,начал новую игру,и на этапе "Создание новой игры" игра вылетает.В ЛОГе только Loading DLL: xrGameSpy.dll .Игра -пиратка. Потом подключил этот же уровень к ЧН(тоже пиратка).Запускаю игру-Синхронизация-Кэширование-Создание новай игры-"Нет диска.Вставте диск в dvd-привод" При последующих запусках вылазит тупо жук.ЧН у меня 1.5.10 с NoDVD.Может это связанно с тем,что лока из билда 2571,который без эмулятора привода не запускается?
2.В туторе не сказано,что делать с level.spawn'ом переносимого уровня.Если я изменил alife_файл,то и level.spawn тоже нужно редактировать?
Сообщение изменено: Vitaliy1986 (05 Май 2011 - 23:38)
Ответить