В данной теме вы можете задавать любые вопросы касательно S.T.A.L.K.E.R. моддинга.
Не флудить
Предварительно просматривайте раздел. Ответ на ваш вопрос может быть там.
В своем вопросе указывайте платформу моддинга - Тень Чернобыля, Чистое небо или Зов Припяти.
1. Какая стоит игра, с каким патчем? 2. Какой мод, версия мода? 3. Что правили своими ручками? 4. Конфиг компа. 5. Лог вылета и последние 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 - содержит секции конфигов уникального оружия и костюмов.
У кого есть желание, создать FAQ по основным вопросам моддинга - обращаемся в ЛС.
function actor_have_tail(first_speaker, second_speaker) local item_section = { [1] = "mutant_krovosos_jaw", [2] = "mutant_boar_leg", [3] = "mutant_dog_tail", [4] = "mutant_flesh_eye", [5] = "mutant_psevdodog_tail", [6] = "mutant_snork_leg" } local needed = 1 local count = 0 local function calc(temp, item) if item:section() == item_section then count = count + 1 end end for k,v in pairs(item_section) do item_section = v get_story_object("actor"):iterate_inventory(calc, actor) end return count >= needed end
function actor_transfer_tail(first_speaker, second_speaker) local npc = dialogs.who_is_npc(first_speaker, second_speaker) local actor = dialogs.who_is_actor(first_speaker, second_speaker) local i = 1 local j = 0 local item_section = { [1] = "mutant_krovosos_jaw", [2] = "mutant_boar_leg", [3] = "mutant_dog_tail", [4] = "mutant_flesh_eye", [5] = "mutant_psevdodog_tail", [6] = "mutant_snork_leg" } local function transfer_object_item(temp, item) if (item:section() == section and i ~= 0) then actor:transfer_item(item, npc) i = i - 1 end end for k,v in pairs(item_section) do section = v j = i actor:iterate_inventory(transfer_object_item, nil) if ((j - i) ~= 0) then news_manager.relocate_item(actor, "out", section, j - i) end end end
6) xr_conditions.script: function marsh_tail(actor, npc, p) return (geonezis.actor_have_tail(actor, npc)) or (has_alife_info("holod_quest_tail_end")) end
Сообщение отредактировал Arist - Суббота, 24.11.2012, 00:23
"Фаршированный ящик". Почему не посмотреть пример из игры? Взять аналогичную секцию изменить содержимое, координаты, имя и запаковать? Вот тебе пример:
Code
[3293] ; cse_abstract properties section_name = physic_destroyable_object name = dar_surprise_box_002_0009 position = 41.7326965332031,-6.24649143218994,-36.4640274047852 direction = 0,-1.60919749736786,0
; cse_alife_object_physic properties physic_type = 0x3 mass = 10
Дроп в ящиках обрабатывается файлом xr_box.script, пяти минутный его анализ, даст ясно понять, что помимо параметра items требуется ещё и community. Секция logic к данному виду объектов вообще не нужна!
ins33
Чуть дополню по поводу итерации pairs. По мимо него есть ещё один ipairs. Между ними есть существенные отличия. Чтобы стало более понятнее - небольшое вступление... Таблицы это набор из двух составляющих: ключ и значение. В Lua, по сути, есть два вида таблиц: простой массив и хеш-таблицы. Массив - это таблица в которой ключи задаются по умолчанию и задавать их явно необязательно, а нужно указывать только значения. Например:
Code
tbl1 = {"stalker", "dolg", "bandit"}
Это массив из трёх строковых элементов. Для каждого значения присвоен ключ по умолчанию - для первого элемента это единица, для второго двойка и так по возрастающей. Т.е. ключи по умолчанию будут выглядеть так:
Здесь уже в качестве ключей используются строки, а в качестве значения, для примера, их отношение к главному герою, также в виде строки. В хеш-таблицах не обязательно указывать ключи для всех значений. Вот для такой таблицы:
для значений first и third ключи указаны явно, а для second и fourth - по умолчанию, т.е. один и два соответственно. Эквивалентная таблица с явно прописанными ключами будет выглядеть так:
Теперь касательно функций pairs и ipairs. ipairs Данная функция-итератор (итерация - это когда определённые действия повторяются многократно) будет перебирать значения таблицы только (!) по целочисленным индексам, т.е. работать будет только с массивами (звучит достаточно категорично, но применять её для хеш-таблиц - не целесообразно). Рассмотрим принцип работы на таблице tbl3:
Code
local tbl3 = {["one"] = "first", "second", ["three"] = "third", "fourth"} for k, v in ipairs (tbl3) do print ("Ключ = " .. k .. ". Значение = " .. v .. ".") end
Выведет вот такой результат:
Code
Ключ = 1. Значение = second. Ключ = 2. Значение = fourth.
Как видно, ключи заданные не по умолчанию просто игнорируются.
pairs А вот эта функция-итератор как раз будет перебирать все (!) значения в таблице не взирая на ключи. На примере той же таблицы:
Code
local tbl3 = {["one"] = "first", "second", ["three"] = "third", "fourth"} for k, v in pairs (tbl3) do print ("Ключ = " .. k .. ". Значение = " .. v .. ".") end
Выведет нам уже вот это:
Code
Ключ = 1. Значение = third. Ключ = 2. Значение = fourth. Ключ = one. Значение = first. Ключ = two. Значение = second.
Видно, что перебор произошёл по всем ключам. Причём сначала итерация проходит по ключам по умолчанию, а затем уже по остальным.
Что касается конструкции самой записи:
Code
for k, v in pairs (tbl3) do end
То здесь всё просто: for in do end - это синтаксис самого языка Lua. k, v - это переменные, которым будут присваиваться ключ и значение во время итерации по таблице. Вообще это сокращение от key, value, но никто не мешает тебе писать свои имена, для большей читабельности. pairs (tbl3) - это, собственно, вызов функции с указанным аргументом таблицей.
LaRento
Quote
1)Это происходит только, если ГГ в зоне пси-излучения
Могу порекомендовать поставить твою функцию зомбирования непосредственно в зоны пси-воздействия. Пси-зоны это рестрикторы, в них с лёгкостью можно добавить свои условия посредством параметра on_actor_in_zone. Да, это несколько напряжно в плане прописать каждой зоне. Но таким образом ты посредственно избавишься от кучи проверок повешенных на апдейт актора. ИМХО.
alex5773
Мдя... На АМК тебе же объяснили в какую сторону копать, ты решил подонимать здешних жителей, авось кто готовое подкинет...
strchi
"Выстрел из неоткуда". Самым просты вариантом для тебя будет в нужный момент нанести НПС смертельный хит. Вот пример самой функции хита:
Code
function sniper_shoots(actor, npc) --# Cоздание объекта класса hit. hit = hit() --# Направление действия. hit.direction = vector():set(x,y,z) --# Кто нанёс урон. В данном случае актор. hit.draftsman = db.actor --# Величина хита. hit.power = 1.45 --# Импульс. hit.impulse = 600 --# Тип урона. В данном случае это выстрел. hit.type = 2 --# Хит приходится в голову. hit:bone("bip01_head") --# Наносим хит по НПС. npc:hit(hit) end
Поэкспериментируй со значениями для direction, чтобы подобрать нужное направление, power, чтобы наверняка, impulse, для толчка сильнее/слабее. Вызывать функцию нужно либо из логики (что лучше), либо из диалога, но тут нужно пробовать.
Сообщение отредактировал ColR_iT - Суббота, 24.11.2012, 00:43
можно ли привязать к одним и тем же моделям, разных текстуры, чтобы кто=то носил залатанный комбез, грязный, а у кого-то чистый и так далее? если можно, то как?
Ghost_7_62x54R , нет. Одной модели может соответствовать одна текстура. Хотя команда NLC недавно демонстрировала видео в котором было ясно, что им удалось добиться динамической смены текстур. Тебе же остаётся только "плодить" модели и прописывать им разные текстуры, если ты конечно не уговоришь команду NLC поделиться разработкой.