В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
ColR_iT, в том то и дело, что в скриптах не очень разбираюсь, поэтому не знаю куда вписывать.
А вот как я сделал то что на видео: Делал по этой статье
Зарегистрируем нашу функцию в файле bind_stalker.script: Ищем:
function actor_binder:use_inventory_item(obj)
после второго end функции вставляем:
if obj~=nil then новый_скрипт.on_use_item(obj) end
(в конце должно получиться два end)
Далее создаем новый_скрипт.script и вставляем в него такую функцию: function on_use_item(sect) --Тут идет описнаие переменных local actor=db.actor local item_name=sect:section() local actor_pos=db.actor:position() local active_slot=db.actor:active_slot() local active_item=db.actor:active_item() local pistol_in_slot=db.actor:item_in_slot(2) local rifle_in_slot=db.actor:item_in_slot(3) local outfit_in_slot=db.actor:item_in_slot(7) local helm_in_slot=db.actor:item_in_slot(12)
--C переменными закончено, дальше пишем наши колбеки на предметы if item_name=="money_10" then dialogs.relocate_money_to_actor(first_speaker, second_speaker, 100) elseif item_name=="money_50" then dialogs.relocate_money_to_actor(first_speaker, second_speaker, 500) end end
Мой скрипт называется my_havchik.script И вот один из коллбеков оттуда
if item_name=="bread" then if db.actor:item_in_slot(12) then alife():create("bread",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --возвращаем жратву в инвентарь news_manager.send_tip(db.actor, "st_remove_helm_eat_tip", nil, nil, 5000) else alife():create("bread_75",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --спавним неполную alife():create("bread_eat",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) --спавним съедобный хлеб local time = time_global() local timer = time+100 level.add_call( function () if time_global() > timer then return true end end, function () db.actor:eat(db.actor:object("bread_eat")) end) end end
Насколько я понимаю и насколько мне объяснили, при использовании "хлеба" идёт проверка на наличие/отсутствие противогаза в слоте. Если есть противогаз в слоте, то "хлеб" спавним обратно и выдаём сообщение. Если нет противогаза, то спавним "надкушенный_хлеб", потом спавним "съедобный_хлеб" и через долю секунды его съедаем. Естественно, то что мы съедаем в инвентаре является фейком - предмет без эффектов и звуков при использовании. Если же нет противогаза, то при использовании фейка спавнится "настоящий" хлеб и через долю секунды съедается.
Делал это по образцам (разве только саму изощрённую схему сам придумал, только оформление подсматривал). Так вот, к чему я веду... Короче, ColR_iT, не знаю как твою функцию вызвать. Или просто понять не могу, потому что в универе экзамены и мозги и так плавятся...
Сообщение отредактировал Wo1fRam - Вторник, 28.05.2013, 14:21
Wo1fRam, Вызывать её надо из bind_stalker.script В функции function actor_binder:update(delta) имя_скрипта.SyncOutfitAndHelmet ()
Но, сдаётся мне она не много не корректна. Т.К. если не будет броника, то будет вылет. Да и в целом ,что то в ней не так. ColR_iT,
Проверь это:
function drop_second_slot() -- в function actor_binder:update(delta) local actor = db.actor local outfit_in_slot = db.actor:item_in_slot(7) local shlem_in_slot = db.actor:item_in_slot(12) if shlem_in_slot == nil then return end if outfit_in_slot == nil or outfit_in_slot:section() ~= "scientific_outfit" or shlem_in_slot:section() ~= "helm_protective" then db.actor:drop_item(shlem_in_slot)--:id()) local fake_item = alife():create("любой_другой_шлем",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) actor:transfer_item(shlem_in_slot, actor) alife():release(fake_item,true) end end
Я сделал бы в место "любой_другой_шлем" фейковый шлем. Хотя...
Добавлено (28.05.2013, 15:44) --------------------------------------------- Точно! Фейк не нужен. пропиши так: local fake_item = alife():create(shlem_in_slot:section(),db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
Сори она в обратку работает, сейчас исправлю.
Сообщение отредактировал ins33 - Вторник, 28.05.2013, 15:52
Т.К. если не будет броника, то будет вылет. Да и в целом ,что то в ней не так.
Обоснуй.
И чем твоя функция отличается от моей, кроме как по другому названными переменными и убранными комментариями, да ещё и логически не правильной проверкой?
Сообщение отредактировал ColR_iT - Вторник, 28.05.2013, 15:50
mmihaill, можно через alife():create Я в таких случаях создаю отдельный скрипт. В нем пишу
Код
function spawn_all() local level_name=level.name() if level_name=="zaton" then if has_alife_info("первая инфа") and not has_alife_info("вторая инфа") then alife():create("id_нпс",vector():set(x,y,z),lvid,gvid) db.actor:give_info_portion("вторая инфа") end end end
Надо этот скрипт зарегистрировать в bind_stalker.script Где-нибудь в actor_binder:update(delta) нужно пристроить
Код
мой_скрипт.spawn_all()
Сообщение отредактировал FantomICW - Вторник, 28.05.2013, 15:57
И чем твоя функция отличается от моей, кроме как по другому названными переменными и убранными комментариями, да ещё и логически не правильной проверкой?
Она у меня не работала, поэтому и переписал. Согласен отличие минимально. И в чём отсутствие логики? Хотя ф-ция ещё не полная.
function drop_second_slot() local actor = db.actor local outfit_in_slot = db.actor:item_in_slot(6) local shlem_in_slot = db.actor:item_in_slot(2) if shlem_in_slot == nil then return end if outfit_in_slot == nil or outfit_in_slot:section() ~= "protection_outfit" and shlem_in_slot:section() ~= "wpn_vintorez" then db.actor:drop_item(shlem_in_slot) local fake_item = alife():create(shlem_in_slot:section(),db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) actor:transfer_item(shlem_in_slot, actor) alife():release(fake_item,true) end end
работает как надо. Правда на ТЧ. Если прописывал if (not outfin or outfit:section() ~= "scientific_outfit") and helmet:section() == "helm_protective" then то получал вылет.
Сообщение отредактировал ins33 - Вторник, 28.05.2013, 16:03
Камрады, помогите. Захотел подправить Lost world, а там все конфиги находятся в db* файлах, которые не окрываются блокнотом ( он зависает ). Чем их можно открыть?
Сообщение отредактировал kot0797 - Вторник, 28.05.2013, 16:06
В функции function actor_binder:update(delta) имя_скрипта.SyncOutfitAndHelmet ()
Вот что мне надо было
ins33, протестил твою функцию. Шлем одевается только с научным комбезом и не одевается с другими, как и надо. Зато, другой противогаз не одевается, если слот брони вообще пустой. Ладно, с этим постараюсь разобраться.
ColR_iT, попробовал твою функцию вызвать из bind_stalker.script как показал ins33, но в игре почему-то никакого эффекта.
ColR_iT, это уже простая опечатка, не придирайся. С вылетом погоречился, хотя это точно есть.
function drop_second_slot() local actor = db.actor --# Хешируем объект костюма. local outfit = actor:item_in_slot(6) --# Хешируем объект шлема. local helmet = actor:item_in_slot(2) --# А есть ли что сравнивать? if not helmet then --# Если шлем не надет - выйдем. return end --# Если нет костюма или НЕ надет нужный нам костюм, но шлем пытаемся "напялить", то сбросим шлем в инвентарь. if (not outfin or outfit:section() ~= "protection_outfit") and helmet:section() == "wpn_vintorez" 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
FantomICW, да... это я знаю... сделал я иконку маленькой .... но вообще не красиво как то... вот лучше сделать предмет что бы не заходил в слот быстрого действия ... но как?