В данной теме вы можете задавать любые вопросы касательно 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 по основным вопросам моддинга - обращаемся в ЛС.
FantomICW, ты не против если я попробую создать рабочую функцию с перебором типов артов, но не для шок-удара, а для рюкзака (гибрид своей функции и вашей)? Ну попробую, по крайней мере. По идее это не сложно будет.
Вызываю в бинд-сталкере функцию (инклудов там очень много от разных допов). Просто значительно модифицировал вот этот скрипт. Спросил предварительно у автора (на АМК-форуме ранее):
swm_art_rad.art_rad_main()
Ну это пока просто набор функций function art_rad_main() if db.actor:object("af_antigravi") then ..... для каждого вида арта, ну а возможность оптимизировать целый список в пару строчек, согласись, стоит затраченного времени, думаю.
Сообщение отредактировал UX-3000 - Суббота, 01.03.2014, 21:32
UX-3000, например, вызов для списка артов одного типа можно было бы как-то так сократить:
Код
--/Эффект при поднятии артефакта function on_item_take(obj) local art_hit_gravi_table = { [1] = "af_cristall_flower", [2] = "af_night_star", [3] = "af_gravi", [4] = "af_medusa", [5] = "af_vyvert", [6] = "af_gold_fish" } for k,v in pairs(art_hit_gravi_table) do if db.actor:object(v) then this.art_hit_gravitational() end end end
function actor_binder:on_item_take (obj) ...... treasure_manager.get_treasure_manager():on_item_take(obj:id()) ins_arts.on_item_take(obj) end
у меня здесь: function actor_binder:update(delta) ................ --' SWM COP swm_art_rad.art_rad_main() --' SWM COP
Добавлено (01.03.2014, 21:41) --------------------------------------------- Т.е. вызов разный, получается.....
Добавлено (01.03.2014, 21:43) --------------------------------------------- Потому что у Вас апдейт на подбор арта, а у нас - на нахождение в рюкзаке актора.
UX-3000, ну, все логично, понятно, почему у тебя постоянно эффекты воспроизводятся. У нас стоит коллбек поднятия предмета, а у тебя, в данном случае, - коллбек наличия предмета. Не суй функции на апдейт. Никогда не суй. Если это только не постоянный элемент худа, например. Вызов своей функции переноси на on_item_take, как в СВ. Не забудь об аргументе obj.
Попробую сделать компактный вариант скрипта (есть идея сделать удар не через постэффект, а именно как удар в bones руки - где-то видел что-то подобное в моде на отрезание частей тела - там удар ножом наносится в кость (в часть тела мёртвого мутанта - в ногу, в руку и пр.), здесь же можно реализовать настоящий (не фейковый засчёт постэффектов) толчок в руки при подборе арта. Не получится - так хотя бы интересно будет в коде покопаться)). К примеру, взял арт - потерял оружие или детектор или просто замотает.
Если удастся гибрид этих идей собрать - напишу что получилось в итоге.
Добавлено (01.03.2014, 21:52) --------------------------------------------- И спасибо за советы - конечно, многому ещё учиться надо, но лучше учиться на реальном примере.
Сообщение отредактировал UX-3000 - Суббота, 01.03.2014, 21:51
FantomICW, чувак выдача оружия для ГГ прошла успешно, а вот сами функции relocate_item_to_actor и relocate_item_from_actor мне непонятны, как именно с ними обращаться?
Может не получиться, потому что у нас звук счётчика Гейгера и радиация играет и накапливается пока вредный арт в рюкзаке и прекращаются, когда его оттуда выкладывают. Т.е. для сообщения то можно однократно сделать вызов, а уже отдельно сделать накопление радиации или через н-ное время снова напомнить о накоплении радиации. Ну в общем подумаю как грамотно сделать всё, чтобы и было удобно и результат был нужный.
FantomICW, чувак у меня все получилось! Гг теряет предмет. только функция не relocate_item_from_actor а relocate_item_section_from_actor . Спасибо за помощь
local snd = sound_object([[detectors\geiger_8]]) snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)
play_no_feedback - это проигрывание без остановки (зацикливание звука). а как называется однократное проигрывание звука (использовать звук писка ПДА?). Есть у кого-нибудь образец куска кода с однократным писком - сигналом ПДА или название (play_one_time ???)
Ой. дурак.
Нашёл этот кусок в динамических новостях (в старой версии 0.1 которая ещё) от VanoSantauri:
if sound =="news" then player=sound_object([[device\pda\pda_tip]]) -- кажись оно)) elseif sound == "danger" then player=sound_object([[device\pda\pda_alarm]]) elseif sound == nil then player=sound_object([[device\pda\pda_tip]]) end
Сообщение отредактировал UX-3000 - Суббота, 01.03.2014, 22:48
FantomICW, ты уж не обессудь, но по ходу работы возник еще вопрос: как прописать функцию, чтобы ветка диалог появлялся тогда и только тогда, когда у Гг в инвентаре имеется какой-либо предмет необходимый при взаимной передачи предмета?
FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : .... - Зов Припяти\gamedata\scripts\bind_stalker.script:214: attempt to index global 'art_rad' (a nil value)
stack trace:
А скрипт совместил из SWM-AA-Послушника:
--/Эффект песца при поднятии артефакта function on_item_take(obj) if (obj:section()=="af_antigravi" or obj:section()=="af_black_fish" or obj:section()=="af_violet_fish_bad" or obj:section()=="af_electra_degen" or obj:section()=="af_electra_fure" or obj:section()=="af_electra_yellow_bad" or obj:section()=="af_electra_orange_bad" or obj:section()=="af_electra_violet_bad" or obj:section()=="af_electra_black_bad" or obj:section()=="af_cristall_bad" or obj:section()=="af_fireball_bad" or obj:section()== "af_dummy_glassbeads_bad" or obj:section()=="af_antieye" or obj:section()=="af_electra_red_bad" or obj:section()=="af_soul_killer" or obj:section()=="af_baloon_bad" or obj:section()=="af_dummy_pellicle_bad" or obj:section()=="af_ameba_bad" or obj:section()=="af_kaktus_bad" or obj:section()=="af_electra_moondeath" or obj:section()=="af_dummy_fbattery_bad" or obj:section()=="af_gorgona") then art_rad_main() elseif (obj:section()=="af_electra_crazy" then art_rad_main_dead() end end
function art_rad_main() news_manager.send_tip(db.actor, "%c[255,255,128,128]СПРАВОЧНИК АРТЕФАКТОВ:\n%c[default]Вы подняли вредный антиартефакт.\\nНи в коем случае не ложите его в ячейку костюма - это смертельно опасно.\\nНайдите возле аномальной зоны металлический изолирующий контейнер. \\nПоложите антиартефакт во внутрь этого контейнера и он будет изолирован.\\nИ не забудьте принять антирад и возможно подлечиться аптечкой.", nil, nil, 10000) play_snd_at_actor([[device\pda\pda_alarm]]) level.add_pp_effector("radiation.ppe", 1995, false) db.actor.power = - 0.50 db.actor.radiation = - 0.50 level.add_cam_effector("camera_effects\\fusker.anm", 29, false, "") level.add_cam_effector("camera_effects\\shell_shock.anm",118711,false,"") level.add_cam_effector("camera_effects\\earthquake_00.anm",118712,false,"") level.add_pp_effector("snd_shock.ppe",118713,false) else level.remove_pp_effector(1995) level.remove_pp_effector(118713) end function art_rad_main_dead() news_manager.send_tip(db.actor, "%c[255,255,128,128]СПРАВОЧНИК АРТЕФАКТОВ:\n%c[default]Вы подняли смертельно опасный антиартефакт. Внимание! Критический уровень радиации! Опасность! Опасность!.\\Мониторинг жизненных показателей: нитевидная форма пульса.\\Связь прекращена в связи с наступившей гибелью носителя.", nil, nil, 10000) play_snd_at_actor([[device\pda\pda_alarm]]) level.add_pp_effector("radiation.ppe", 1995, false) level.add_cam_effector("camera_effects\\fusker.anm", 29, false, "") level.add_cam_effector("camera_effects\\shell_shock.anm",118711,false,"") level.add_cam_effector("camera_effects\\earthquake_00.anm",118712,false,"") level.add_pp_effector("snd_shock.ppe",118713,false) db.actor:kill(db.actor) --убийство игрока самым сильным антиартефактом и сообщение о наступлении песца else level.remove_pp_effector(1995) level.remove_pp_effector(118713) end
Название скрипта art_rad, в бинде он так записан:
function actor_binder:on_item_take (obj) ---------пропустим --- IMM -------------------------- imm.on_item_take(obj) -- IMM -------------------------- art_rad.on_item_take(obj) end
Добавлено (01.03.2014, 23:55) --------------------------------------------- И даже непохоже, что дело в названии скрипта (может совпадает что-то?) - пробовал с другим названием, та же самая ошибка.....
Сообщение отредактировал UX-3000 - Суббота, 01.03.2014, 23:56
Похоже у тебя не прописан эмбиент подземной локации.... Смотреть надо. Я только по погоде 2-го и 3-го Атмосфира или Смертельной Зоны могу точно сказать - так как работаю на сборках. Нужно видеть папку конфиги или хотя бы файлы настроек погоды.
Возможно ты новую локу подключал и делал для неё погоду и забыл в эмбиенты записать секцию оных из звуков.
Я даже догадываюсь какую локу - не подземку для своего мод- Кордона из билдов или не Кордон от Мятежника изменял?)
Сообщение отредактировал UX-3000 - Воскресенье, 02.03.2014, 00:04