В данной теме вы можете задавать любые вопросы касательно 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 - содержит секции конфигов уникального оружия и костюмов.
NewValveCom, Для этого придется в апдейте bind_stalker.script проверять количество патронов в магазине оружия:
Код
local active_slot = db.actor:active_slot() local weapon_in_slot = db.actor:item_in_slot(active_slot) if weapon_in_slot ~= nil then local current_ammo = weapon_in_slot:get_ammo_in_magazine() if current_ammo < слишком мало then game.start_tutorial("Имя туториала") else if game.has_active_tutorial() then game.stop_tutorial() end end end
Цитатаur3icf ()
Не посоветуете где можно поискать информацию по данному вопросу?
А какую информацию вы хотите найти?
Сообщение отредактировал denis2000 - Понедельник, 22.08.2016, 20:59
Для этого придется в апдейте bind_stalker.script проверять количество патронов в магазине оружия:
Наверно эффективней будет повесить это дело на отлов нажатия ЛКМ, и если патронов меньше указанного запустить game.start_tutorial("Имя туториала") через апдейт используя xr_s.script
А в чем собственно проблема? Каким скриптом пользуетесь?
Необходимо заспавнить сриптом аномалию, а потом её благополучно удалить. Думал, по id её удалить, но черт знает как его прописать. Скрипт длинный. За спавн отвечают эти строки:
Код
function spawn() local p=vector(),lv,gv p.x=db.actor:position().x+1 p.y=db.actor:position().y p.z=db.actor:position().z lv=db.actor:level_vertex_id() gv=db.actor:game_vertex_id() sobj = this.create_anom("campfire",p,lv,gv,1,0.1) end
И вроде бы и id выдается, но как-то неясно:
Код
function get_story_id_not_replay() local ST ST = xr_logic.pstor_retrieve(db.actor, "ScriptAnomId", 0) if type(ST) ~= "number" or ST == nil then ST = 9000 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end if type(ST) == "number" or ST ~= nil then ST = ST + 1 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end return tonumber(ST) end
function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom) local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)
Сообщение отредактировал mmihaill - Вторник, 23.08.2016, 04:14
Наверно эффективней будет повесить это дело на отлов нажатия ЛКМ
Это безусловно эффективнее, но не соответствует техническому заданию: Когда в магазине остаются мало патронов, появляется надпись "Перезарядка". В любом случае - это всего лишь примерная реализация, как будет реализовывать функцию спросивший мне не известно.
Цитатаmmihaill ()
Скрипт длинный.
Вообще-то этот скрипт спавна крайне короткий и некоректный (спавниться объект с дефолтными параметрами). Ищите правильную реализацию и задавайте в ней необходимые параметры.
Сообщение отредактировал denis2000 - Вторник, 23.08.2016, 09:56
Вообще-то этот скрипт спавна крайне короткий и некоректный
Вообще-то я сбросил лишь отрывок. Остальные параметры скрипта корректируют все неточности, то есть, в моём случае, аномалия появляется рядом с актером. Вот весь скрипт:
Код
function use_inventory_item(section,self) local item_name=section:section() if item_name == "spichki" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:give_info_portion("actor_use_item") spichki.spawn() end end
function timer_use_item(self) local time_to_use = 60 --Игровые секунды, время использования предмета if db.actor:has_info("actor_use_item") then if (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use) then db.actor:disable_info_portion("actor_use_item") end end end
function spawn() local p=vector(),lv,gv p.x=db.actor:position().x+1 p.y=db.actor:position().y p.z=db.actor:position().z lv=db.actor:level_vertex_id() gv=db.actor:game_vertex_id() sobj = this.create_anom("campfire",p,lv,gv,1,0.1) end
-----------------------------------Так как костер это разновидность аномалии, то это нужно для спавна скриптом-----------------------------------
function get_story_id_not_replay() local ST ST = xr_logic.pstor_retrieve(db.actor, "ScriptAnomId", 0) if type(ST) ~= "number" or ST == nil then ST = 9000 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end if type(ST) == "number" or ST ~= nil then ST = ST + 1 xr_logic.pstor_store(db.actor, "ScriptAnomId", ST) end return tonumber(ST) end
function create_anom(name_anom, posit_anom, lvid_anom, gvid_anom, radius_anom, power_anom) local obj = alife():create(name_anom, posit_anom, lvid_anom, gvid_anom)
-----------------------write---------------------- local packet = net_packet() obj:STATE_Write(packet)
-----------------------load----------------------- -- cse_alife_object local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_u32() local level_vertex_id = packet:r_u32() local object_flags = packet:r_u32() local custom_data = packet:r_stringZ() local story_id = packet:r_u32() local spawn_story_id = packet:r_u32()
-- cse_shape local shape_count = packet:r_u8() for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then -- sphere local center = packet:r_vec3() local radius = packet:r_float() else -- box local box = packet:r_matrix() end end
-- cse_alife_space_restrictor local restrictor_type = packet:r_u8()
-- cse_alife_custom_zone local max_power = packet:r_float() local owner_id = packet:r_u32() local enabled_time = packet:r_u32() local disabled_time = packet:r_u32() local start_time_shift = packet:r_u32()
-- cse_alife_anomalous_zone local offline_interactive_radius = packet:r_float() local artefact_spawn_count = packet:r_u16() local artefact_position_offset = packet:r_u32()
-- se_zone_anom local last_spawn_time_present = packet:r_u8()
if (string.find (name_anom, 'zone_zharka_static') ~= nil or string.find (name_anom, 'zone_witches_galantine') ~= nil or string.find (name_anom, 'zone_mosquito_bald') ~= nil or string.find (name_anom, 'zone_mincer') ~= nil or string.find (name_anom, 'zone_gravi_zone') ~= nil or string.find (name_anom, 'zone_buzz') ~= nil ) and packet:r_elapsed() ~= 0 then abort("left=%d", left) end
-- cse_shape packet:w_u8(1) -- количество фигур packet:w_u8(0) -- тип фигуры: сфера packet:w_vec3(vector():set(0, 0, 0)) if radius_anom ~= nil then packet:w_float(radius_anom) else packet:w_float(1.0) end
-- cse_alife_custom_zone if power_anom ~= nil then packet:w_float(power_anom) else packet:w_float(max_power) end packet:w_u32(owner_id) packet:w_u32(enabled_time) packet:w_u32(disabled_time) packet:w_u32(start_time_shift)
Поставил в СДК смарт, и неписей в нем. Платформа - ТЧ 1.0006. Настроил все это дело, но НПС никак не хотят быть в смарте, а просто уходят куда-то. Вот все параметры
Как это выглядит в целом Параметры смарта Параметры НПС Параметры вэйпоинтов Код из gulag_escape.script
Код
if type == "esc_blockpost" then t = { section = "logic@esc_blockpost1", idle = 0, prior = 20, state = {0,1}, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@esc_blockpost2", idle = 0, prior = 40, state = {0,1}, in_rest = "", out_rest = "" } table.insert(sj, t) t = { section = "logic@esc_blockpost3", idle = 0, prior = 60, state = {0,1}, in_rest = "", out_rest = "" } table.insert(sj, t) end
--------------------
if gulag_type == "esc_bloсkpost" then return npc_community == "military" end
--------------------
if type == "esc_bloсkpost" then return function(gulag) if level.get_time_hours() >= 6 and level.get_time_hours() <= 22 then return 0 -- день else return 1 -- ночь end end end
Секции их gulag_escape.ltx
Код
[logic@esc_blockpost1] active = walker@esc_blockpost_walker1
Всем привет. Пара вопросов по структуре НПС: 1. для чего служит тег <map_icon x="0" y="0"></map_icon> 2. для чего служит тег <team>Killer_sniper</team>. Что-то связанно с командой. откуда брать значение. 3. какие значения можно применять к <critical_wound_weights>75,25,25</critical_wound_weights> и почему здесь 3 значения. 4. какие значения можно применять к <panic_treshold>0</panic_treshold> 5. имеет ли значение положение #include? 5.1. (могу ли я к примеру: #include "gameplay\character_food.xml" разместить вне тега <supplies>) 6. и что за фактор попадания? <hit_probability_factor>1.5</hit_probability_factor>
Добавлено (23.08.2016, 14:37) --------------------------------------------- Ну не получается у меня восполнить самостоятельно пробел по не знанию системы сюжетной информации. Можете более подробно объяснить все теги (структуру) в инфопоршне? К примеру на основе этой странички.:
local id_anom= xr_logic.pstor_retrieve( db.actor, "ScriptAnomId", 65536 ) local s_obj = alife():object( id_anom ) if s_obj then alife():release( s_obj, true ) end
DarkSatellite, В ЗП все НПС спавнятся скриптом. Причем все НПС входят в сквады ( отряды ). Даже один НПС - это сквад. Спавнить через all.spawn - пережиток ТЧ. В "топку".
"Столкнулся я со следующей проблемой: для одного небольшого мода мне понадобился агропром, конкретно вот этот (http://ap-pro.ru/load/zov_pipjati/mody/nii_medbor_bild_1851_dlja_zp/16-1-0-1769) когда дело дошло да спавна нпс я обнаружил, что в all.spawn запакован файл alife_zaton. Собственно проблема моя очевидна. Как спавнить что либо на этой локации?"
DiMaN43ru, Если это самопальная лока или переделанная то тебе ее надо декомпилироват в СДК, ОБЯЗАТЕЛЬНО! Дело в том что мапер не обязан расставлять точки графа, он может поставить минимум, 2 точки. С таким набором локу не заселить НПСами. Надо самому удостоверится в том что все необходимое есть, нажать мейк гейм и скомпилировать свой алл_спавен на эту одну локу. Файла alife_zaton больше там не увидишь.