В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга
• Не флудить • Предварительно просматривайте раздел, ведь ответ на ваш вопрос может быть там • В своем вопросе указывайте платформу моддинга — Тень Чернобыля, Чистое небо или Зов Припяти
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Лог вылета и последние 25 строк (помещать под спойлер).
Структура папок и файлов в корневом каталоге игры:
...\S.T.A.L.K.E.R\gamedata\anims – папка содержит исполнительные файлы эффектов (например от ПНВ).
...\S.T.A.L.K.E.R\gamedata\config – папка содержит основные конфигурационные файлы (т. е. большинство настроек игры)
...\S.T.A.L.K.E.R\gamedata\meshes – содержит модели игровых предметов и персонажей...
...\S.T.A.L.K.E.R\gamedata\scripts – папка со скриптами (рабочими файлами содержащими в себе наборы функций) – основная папка, отвечающая за ответные действия игры и действия производимых игроком в игре.
...\S.T.A.L.K.E.R\gamedata\shaders – папка содержит в себе конфигурационные файлы шейдеров.
...\S.T.A.L.K.E.R\gamedata\sounds – здесь находятся все звуки игры (разложены по своим каталогам и папкам)
...\S.T.A.L.K.E.R\gamedata\spawns – содержит файл спавна – очень важный файл – не трогать без нужды!!!
...\S.T.A.L.K.E.R\gamedata\textures – содержит разложенные по каталогам и папкам текстуры используемые в игре.
Теперь разберем папки в каталоге «config»
...\S.T.A.L.K.E.R\gamedata\config\creatures - содержит массу конфигурационных файлов, в основном отвечающих за взаимодействие Главного героя игры (в дальнейшем ГГ) и прочего окружения в игре и ТТХ самого ГГ.
...\S.T.A.L.K.E.R\gamedata\config\gameplay – содержит конфиг. файлы персонажей игры (НПС) отвечающие за внешний вид, статус, снаряжение. Файлы: character_desc_ххх (где ххх – название локации) и character_desc_general (отвечает за зомбированного персонажа). Также содержит файлы диалогов и профилей НПС.
…\S.T.A.L.K.E.R\gamedata\config\misc – конфиг.файлы торговцев (папки с именами торговцев), артефактов, брони, квестовых предметов, уникальных предметов, файл отвечающий за награды за автозадания, файл эффектов (алкоголизма, ранения, ПНВ и прочих)...
…\S.T.A.L.K.E.R\gamedata\config\mp – среди прочих содержит важный файл mp_ranks – отвечающий за выпадение оружия и патронов из рук ГГ и НПС – без прописывания добавляемого в игру оружия в этот файл при выпадении нового оружия из рук ГГ\НПС будут следовать вылеты.
…\S.T.A.L.K.E.R\gamedata\config\text\rus – содержит файлы описаний всего и вся находящегося в игре (брони, артефактов, оружия, предметов и прочего).
…\S.T.A.L.K.E.R\gamedata\config\weapons – содержит конфиг.файлы оружия и боеприпасов используемых в игре.
…\S.T.A.L.K.E.R\gamedata\config\weathers – содержит конфиг.файлы настройки погоды на локациях.
Теперь немного подробнее о файлах.
...\S.T.A.L.K.E.R\gamedata\config\misc:
Папка shop_ххх (ххх – имя торговца) – содержит конфиг.файлы ассортимента торговца.
outfits – содержит секции конфигов костюмов.
artefacts - содержит секции конфигов артефактов.
items - содержит секции конфигов предметов.
monster_items - содержит секции конфигов частей монстров
postprocess - содержит секции конфигов пост. процессов (например: ПНВ).
quest_items - содержит секции конфигов квестовых предметов.
task_manager - содержит секции наград за автоквесты.
unique_items - содержит секции конфигов уникального оружия и костюмов.
denis2000, Я, возможно, буду не прав, но описание костра в файле zone_kampfire на 70-80% идентично описанию аномалии в тех же файлах :zone_gravi, zone_mincer и др. То есть костёр можно считать в тч "псевдо_аномалией"?
random_anomaly_id = {} -- здесь будем хранить ID аномалий. created_afs = {} -- массив созданных аномалиями артефактов
local ini = ini_file("misc\\dynamics_anomaly.ltx")
---------------------------------------------вызывается из логики рестриктора
function remove_taken_af(af_id) if created_afs[af_id] ~= nil then created_afs[af_id] = nil end end
function control_random_anomaly( flag )
local anomaly = {} -- массив аномалий local zone_off = {} -- массив офф-зон
if flag == "release" then
for k,v in pairs( random_anomaly_id ) do local se_obj = alife():object( v ) if se_obj then alife():release( se_obj, true ) end end random_anomaly_id = {}
for k,v in pairs( created_afs ) do local af = alife():object( v ) if af then alife():release( af, true ) end end created_afs = {}
elseif flag == "spawn" then
local radius = 3 local level_name = level.name() local gv_id = 0 local lv_id = 0 while game_graph():valid_vertex_id( gv_id ) do
local level = alife():level_name( game_graph():vertex( gv_id ):level_id() ) if level == level_name then lv_id = game_graph():vertex( gv_id ):level_vertex_id() break end gv_id = gv_id + 1 end
for level in game_graph():levels() do location = alife():level_name(level.id) if ini:section_exist(location) and level_name == location then count_anom = ini:r_s32(location, "anomaly_count") -- читаем количество аномалий для локации pos_x_min = ini:r_s32(location, "pos_x_min") pos_x_max = ini:r_s32(location, "pos_x_max") pos_z_min = ini:r_s32(location, "pos_z_min") pos_z_max = ini:r_s32(location, "pos_z_max") anom_list = ini:r_string(location, "anomaly_list") anom_in_list = ini:line_count(anom_list)
local result, anom_name, field_name, afs = "", "", "", ""
for i=0,anom_in_list-1 do -- записываем все указанные в конфиге аномалии в таблицу result, anom_name, afs = ini:r_line(anom_list, i, "", "") table.insert(anomaly,anom_name) end
result, field_name, zone_off_list = ini:r_line(location, 6) -- читаем офф-зоны local zone_off_ind = 1 zone_off_list = parse_names(zone_off_list) while zone_off_list[zone_off_ind] ~= nil do -- записываем офф-зоны в таблицу table.insert(zone_off,zone_off_list[zone_off_ind]) zone_off_ind = zone_off_ind + 1 end end end
for i = 1,count_anom do local section = anomaly[ math.random( #anomaly ) ] pos_r_x = math.random( pos_x_min, pos_x_max ) pos_r_z = math.random( pos_z_min, pos_z_max ) local pos = vector():set( pos_r_x, 0, pos_r_z ) local vert = level.vertex_id( pos ) local position = level.vertex_position( vert )
local right_position = true for k,v in pairs( zone_off ) do local zone = db.zone_by_name[ v ] if zone then if zone:inside( position ) then right_position = false end end end
if right_position == true then --[[local del_zone if level.name() == "escape" then del_zone = db.zone_by_name["esc_anomaly_del"] elseif level.name() == "marsh" then del_zone = db.zone_by_name["mar_anomaly_del"] else del_zone = nil end if (del_zone == nil) or (del_zone ~= nil and not del_zone:inside(position)) then]] local s_obj = create_anomaly( section, radius, position, lv_id, gv_id ) random_anomaly_id[ s_obj.id ] = s_obj.id local line_num = nil for k=0,anom_in_list-1 do -- получаем номер строки в конфиге данной аномалии result, anom_name, afs = ini:r_line(anom_list, k, "", "") if anom_name == section then line_num = k end end if line_num ~= nil then result, anom_name, afs = ini:r_line(anom_list, line_num, "", "") -- читаем в листе аномалий параметры <имя аномалии>:{массив артефактов для данной аномалии и вероятность спавна - нечетный:четный индекс - имя артефакта:вероятность спавна} afs = parse_names(afs) local j = 1 local rnd while afs[j] ~= nil do -- проходим по всем записанным артефактам rnd = math.random(1, 100) if rnd <= tonumber(afs[j+1]) then local af_obj = alife():create(afs[j],position,lv_id,gv_id) -- спаним артефакт с заданной вероятностью created_afs[af_obj.id] = af_obj.id end j = j + 2 end end --end end
end
end
end
-------------Запись/загрузка ключевых параметров при сохранении/загрузке игры
function save( packet ) i = 0 for k,v in pairs( random_anomaly_id ) do i = i + 1 end packet:w_u16( i ) for k,v in pairs( random_anomaly_id ) do packet:w_u32( k ) end i = 0 for k,v in pairs(created_afs) do i = i + 1 end packet:w_u16(i) for k,v in pairs(created_afs) do packet:w_u32(k) end end
function load( reader ) random_anomaly_id = {} n = reader:r_u16() for i = 1,n do local k = reader:r_u32() random_anomaly_id[ k ] = k end created_afs = {} n = reader:r_u16() for i = 1,n do local k = reader:r_u32() created_afs[k] = k end end
function create_anomaly( zone_name, zone_radius, position, lv, gv )
local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local spawn_story_id = packet:r_s32() local shape_count = packet:r_u8() for i = 1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local box = packet:r_matrix() end end local restrictor_type = packet:r_u8() local max_power = packet:r_float() local owner_id = packet:r_s32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32() local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_s32() local last_spawn_time = packet:r_u8()
------------------------------------------Меняем данные пакета
_S_k_i_F_, Игра Сталкер (точнее ее движек) построен на концепции сервер-клиентского взаимодействия, поэтому некоторые объекты имеют два экземпляра - один на серверной стороне другой на клиентской. Соответственно методы взаимодействия с этими объектами различны. Объекты доступные в клиентской части иначе называют объектами находящимися в онлайне, а объекты не доступные соотвественно в оффлайне.
Сообщение отредактировал denis2000 - Пятница, 06.10.2017, 10:42
Подскажите пожалуйста как правильно экспортировать из 3Ds Max анимации idle для Call of Pripyat\Call of Chernobyl? Для каких костей, сколько в ней должно быть кадров? Делаю явно что-то не то, экспортируемые мной анимации имеют гораздо больший размер чем оригинальные, в SDK ActorEditor анимации воспроизводятся, а в игре движутся только руки, оружие стоит на месте. Большое спасибо, разобрался, wpn_body был приделан к lead_gun как-то неправильно, но сколько кадров и почему такие больше файлы анимайи всё ещё не ясно...
Сообщение отредактировал sinaps - Пятница, 06.10.2017, 12:29