В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
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
Ребята, как сделать предмет так что бы не выходил в окошки для быстро использование ( ЗП ) , ну , я сделал предмет, и надо делать маленькую иконку что бы можно было туда его засунуть, ну что бы вылета не было... так, может есть другой вариант ?? ну, сделать так что бы можно было закинуть и итем размером более 1х1 ?? либо сделать так что бы не использовался в окно быстро действия ...ну ф1,ф2,ф3,ф4 ... помогите плииизз.. с меня + )