В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
Здравия вам, коллеги! В скриптах не силён, поэтому вопрос: можно ли в ЗП скриптом убрать вещь из слота (шлем) в инвентарь?
Добавлено (28.05.2013, 03:18) --------------------------------------------- Или может лучше запретить одевать шлем с любым костюмом, кроме одного (Есть мысля одна, но надо чтобы шлем одевался только с одним костюмом)
Wo1fRam, Не уверен в номерах слотов, т.к. с ЗП не работаю, да и под рукой нет, что бы проверить.
function select_item_in_slot() -- на апдейт, для реалистичности local outfit_in_slot = db.actor:item_in_slot(6) -- слот брони local shlem_in_slot = db.actor:item_in_slot(7) -- слот шлема if outfit_in_slot:section() == "броня" and shlem_in_slot:section() ~= "шлем_1" then -- если в слоте 6 броня и в слоте 7 шлем не шлем_1 то delete_shlem(item_in_slot:id()) -- удалим шлем spawn_slem(item_in_slot:id()) -- и заспавним его в инветраре elseif outfit_in_slot:section() == "броня_2" and shlem_in_slot:section() ~= "шлем_2" then --или в слоте 6 броня и в слоте 7 шлем не шлем_1 то delete_shlem(item_in_slot:id()) -- удалим шлем spawn_slem(item_in_slot:id()) -- и заспавним его в инветраре end end
function spawn_slem(section,npc) if npc == nil then npc = db.actor end return alife():create(section, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end
function delete_shlem(iId) if iId then local seObj=alife():object(iId) if seObj then alife():release(seObj,true) end end end
ins33, Спасибо проверим. Только уточнить хочу: получается, что если у меня в слоте шлем поломан или с апгрейдами, то он будет удаляться, а потом заспавнится чистенький новенький шлем без апгрейдов? Кстати, в ЗП слот брони 7, а шлема 12.
ins33, при пустом слоте в который можно разместить только что появившейся в инвентаре предмета, его туда автоматически "запихает" движок. Поэтому в данном скрипте, нужно поменять порядок действий - сначала спавним в инвентарь такой же шлем, а затем удаляем из слота, только так он останется в инвентаре и автоматом не попадёт в слот. Кстати, удалять его прямо из слота я бы не стал. Лучше его сначала выбросить, а потом удалить.
Сообщение отредактировал ColR_iT - Вторник, 28.05.2013, 10:12
ColR_iT, поменял действия местами и повесил таймер. Глянь-ка, так пойдёт?
function select_item_in_slot() -- на апдейт, для реалистичности local outfit_in_slot = db.actor:item_in_slot(7) -- слот брони local helmet_in_slot = db.actor:item_in_slot(12) -- слот шлема if outfit_in_slot:section() ~= "scientific_outfit" and shlem_in_slot:section() == "helm_protective" then -- если в слоте 6 не броня и в слоте 7 шлем то spawn_helmet(item_in_slot:id()) -- и заспавним его в инветраре local time = time_global() local timer = time+100 level.add_call( function () if time_global() > timer then return true end end, function () delete_helmet(item_in_slot:id()) -- удалим шлем end)
end end
function spawn_helmet(section,npc) if npc == nil then npc = db.actor end return alife():create(section, npc:position(), npc:level_vertex_id(), npc:game_vertex_id(), npc:id()) end
function delete_helmet(iId) if iId then local seObj=alife():object(iId) if seObj then alife():release(seObj,true) end end end
Wo1fRam, нет, конкретно этот код работать не будет, т.к. не правильно передаются аргументы в функции. К тому же, совершенно не ясно для чего ты приплёл сюда таймер... Вот, попробуй этот:
Код
--# Функция для синхронизации надетого костюма для конкретного шлема. function SyncOutfitAndHelmet () local actor = db.actor --# Хешируем объект костюма. local outfit = actor:item_in_slot(7) --# Хешируем объект шлема. local helmet = actor:item_in_slot(12) --# А есть ли что сравнивать? if not outfit or not helmet then --# Если один из слотов пустой - выйдем. return end --# Если надет нужный нам шлем и НЕ надет нужный нам костюм, то сбросим шлем в инвентарь. if outfit:section() ~= "scientific_outfit" and helmet:section() == "helm_protective" then --# Выбросим наш шлем из инвентаря. actor:drop_item(helmet) --# Заспавним в инвентарь такой же шлем. --# Т.к. слот путой, то в него автоматом поместиться только что заспавненый шлем. local _tmpHelmet = alife():create(helmet:section(), vector(),0,0,actor:id()) --# Подберём назад выброшенный шлем. --# Поскольку слот уже занят, то наш шлем будет в самом инвентаре. actor:transfer_item(helmet, actor) --# Удалим дублирующий шлем из слота, предварительно выбросив его. actor:drop_item(level.object_by_id(_tmpHelmet.id)) if _tmpHelmet then alife():release(_tmpHelmet,true) end end end --# Все эти махинации нужны для того, чтобы в случае, когда наш шлем не целый, --# то в результате он же и останется в инвентаре, а не будет заспавнен новенький.
На работоспособность не проверял, но должно работать.
Сообщение отредактировал ColR_iT - Вторник, 28.05.2013, 11:48
ColR_iT, Точно, этот момент я упустил. Выбросить? Честно говоря не видел такого ни где, да и смысл этой манипуляции мне не совсем понятен. Wo1fRam, Таймер не нужен, достаточно поменять местами 2 ф-ции: spawn_slem(item_in_slot:id()) -- сначала заспавним его в инветраре delete_shlem(item_in_slot:id()) -- потом удалим шлем
ins33, в целом и без выбрасывания должно всё работать, но в силу особенностей функции release, лучше сделать предмет "свободным", т.е. выбросить его, тем самым его parent будет nil или 0, точно не помню, но уже не актор. Поменять местами два вызова в твоей функции тоже не достаточно. Во-первых, как подметил Wo1fRam, если шлем был повреждён, то в инвентаре будет целый. Во-вторых, у тебя при передаче id в функцию spawn_helmet, будет вылет, т.к. функция должна принимать строку в виде секции спавнящегося предмета. Кстати, ты в функцию даже не id передаёшь. Будет вылет на месте вызова функции спавна, приблизительно таков:
Код
attempt to call method 'id' (a nil value)
Сообщение отредактировал ColR_iT - Вторник, 28.05.2013, 12:11
ColR_iT, Извентиляюсь за (возможно) нубский вопрос, но эту функцию надо регистрировать в bind_stalker.script? Просто только что протестил: надел костюм, надел шлем, потом снял костюм, а шлем так же сидит на голове и слезать оттудова не собирается.
Wo1fRam, вписать ты её можешь в любой файл скриптов, а вызывать - да, нужно на апдейте. А почему он должен "слезать"? Ты задал конкретный вопрос:
Цитата (Wo1fRam)
запретить одевать шлем с любым костюмом, кроме одного
о том, что его нельзя одеть без костюма речь не шла. Так что: каков вопрос - таков ответ.
Добавлено (28.05.2013, 12:20) --------------------------------------------- Wo1fRam, правильно сформулированный вопрос - половина ответа. Прими на вооружение... Вот вариант, когда шлем можно надеть только с конкретным костюмом:
Код
--# Функция для синхронизации надетого костюма для конкретного шлема. function SyncOutfitAndHelmet () local actor = db.actor --# Хешируем объект костюма. local outfit = actor:item_in_slot(7) --# Хешируем объект шлема. local helmet = actor:item_in_slot(12) --# А есть ли что сравнивать? if not helmet then --# Если шлем не надет - выйдем. return end --# Если нет костюма или НЕ надет нужный нам костюм, но шлем пытаемся "напялить", то сбросим шлем в инвентарь. if (not outfit or outfit:section() ~= "scientific_outfit") and helmet:section() == "helm_protective" then --# Выбросим наш шлем из инвентаря. actor:drop_item(helmet) --# Заспавним в инвентарь такой же шлем. --# Т.к. слот путой, то в него автоматом поместиться только что заспавненый шлем. local _tmpHelmet = alife():create(helmet:section(), vector(),0,0,actor:id()) --# Подберём назад выброшенный шлем. --# Поскольку слот уже занят, то наш шлем будет в самом инвентаре. actor:transfer_item(helmet, actor) --# Удалим дублирующий шлем из слота, предварительно выбросив его. actor:drop_item(level.object_by_id(_tmpHelmet.id)) if _tmpHelmet then alife():release(_tmpHelmet,true) end end end --# Все эти махинации нужны для того, чтобы в случае, когда наш шлем не целый, --# то в результате он же и останется в инвентаре, а не будет заспавнен новенький.
Сообщение отредактировал ColR_iT - Вторник, 28.05.2013, 12:24
ColR_iT, Тогда начну издалека Сделал я так, что нельзя есть и пить с надетым противогазом. Вот видео-демонстрация. А если костюм со "встроенным" шлемом (тот же научный комбез), то снимать костюм? Не бред ли? Поэтому решил для таких костюмов сделать "индивидуальный" шлем. И тут столкнулся с проблемой: надо сделать так, чтобы нельзя было надеть шлем "Заслон", если не надет научный комбез (а толку от этого ведра, если надета кожанка?). И наоборот, если надет научный комбез, то нельзя напялить каску или противогаз. Идея - чтобы поесть, надо поднять забрало шлема.
Добавлено (28.05.2013, 12:27) --------------------------------------------- И только что ещё раз протестил: надел другой костюм, а шлем всё равно надевается.
Сообщение отредактировал Wo1fRam - Вторник, 28.05.2013, 12:36