FantomICW 678 Опубликовано 11 Мая 2013 (изменено) Создание инвентарного комплекса в чистом ЗП Файл с отработанным примером Урок (Показать) Перед тем, как начать урок, я хочу сказать, что скриптовой частью я обязан товарищу Ховану и Николаю Болтову. Именно благодаря их скриптам я нашел способ сделать подобную вещь! Огромное им спасибо! А теперь перейдем к уроку. Файлы, которые нам потребуются: - configs/misc/items.ltx - configs/text/rus/st_items_equipment.ltx - scripts/_g.script - scripts/bind_stalker.script - scripts/my_callbacks.script Возможно, вы когда-нибудь задумывались над вопросом создания предмета, из при использовании которого в инвентарь будут выпадать сразу несколько других, как, например, универсальный медкомплект. Долго думая, я понял, что такого эффекта можно достичь используя коллбеки на использовании предметов. Что такое "коллбек"? Если коротко, - это что-то в роде скрипта инфопорции. Однако, коллбек может работать как единожды, так и постоянно: при подборе предметов, при их использовании, при выстреле, при попадению по нпс и так далее. Нас интересует коллбек использования предмета, который будет работать постоянно. 1. Откроем items.ltx и скопируем секцию какого-нибудь бустера. Вставим новую секцию где-нибудь в это-же файле. 2. Настроим его так, как нам этого захочется. [medkit_complex]:booster $spawn = "food and drugs\medkit_complex" visual = dynamics\devices\dev_aptechka\dev_aptechka_mid.ogf description = st_medkit_complex_desc inv_name = st_medkit_complex inv_name_short = st_medkit_complex inv_weight = 1.8 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 10 inv_grid_y = 27 cost = 30000 attach_angle_offset = 0.440521, 1.378287, -0.644026 attach_position_offset = 0.104196, -0.010821, 0.076969 attach_bone_name = bip01_r_hand auto_attach = false bone_name = bip01_r_hand position_offset = 0.0,0.0,0.0 angle_offset = 1.570790,1.570790,3.92699 use_sound = interface\inv_medkit[medkit_complex]:booster $spawn = "food and drugs\medkit_complex" visual = dynamics\devices\dev_aptechka\dev_aptechka_mid.ogf description = st_medkit_complex_desc inv_name = st_medkit_complex inv_name_short = st_medkit_complex inv_weight = 1.8 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 10 inv_grid_y = 27 cost = 30000 attach_angle_offset = 0.440521, 1.378287, -0.644026 attach_position_offset = 0.104196, -0.010821, 0.076969 attach_bone_name = bip01_r_hand auto_attach = false bone_name = bip01_r_hand position_offset = 0.0,0.0,0.0 angle_offset = 1.570790,1.570790,3.92699 use_sound = interface\inv_medkit Долго здесь зацикливаться не будем. Все элементарно. Могу только сказать, что при использовании будет проигрываться звук аптечки, а модель взяли армейской аптечки. 3. В st_items_equipment.ltx создаем описание и название предмета <string id="st_medkit_complex"> <text>Универсальный медкомплект</text> </string> <string id="st_medkit_complex_desc"> <text>Специальный медкомплект, разработанный для спецслужб в Зоне. Включает в себя все основные медикаменты.</text> </string><string id="st_medkit_complex"> <text>Универсальный медкомплект</text> </string> <string id="st_medkit_complex_desc"> <text>Специальный медкомплект, разработанный для спецслужб в Зоне. Включает в себя все основные медикаменты.</text> </string> На этом с конфигами все. 4. Руководствуясь материалом, взятым из сборника модостроения от Хована, мы создаем файл my_callbacks.script в папке scripts. 5. Наполняем его следующим образом 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) --Коллбеки if item_name=="medkit_complex" then give_object_to_actor("drug_anabiotic") give_object_to_actor("antirad") give_object_to_actor("bandage") give_object_to_actor("drug_radioprotector") give_object_to_actor("drug_antidot") give_object_to_actor("drug_psy_blockade") give_object_to_actor("drug_coagulant") give_object_to_actor("drug_booster") end endfunction 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) --Коллбеки if item_name=="medkit_complex" then give_object_to_actor("drug_anabiotic") give_object_to_actor("antirad") give_object_to_actor("bandage") give_object_to_actor("drug_radioprotector") give_object_to_actor("drug_antidot") give_object_to_actor("drug_psy_blockade") give_object_to_actor("drug_coagulant") give_object_to_actor("drug_booster") end end give_object_to_actor - как-раз и есть скрипт выдачи ГГ предмета, опираясь на коллбек. В скобках название предмета. Вообщем, продолжаем так-же, и добавляем, что хотим. Надеюсь, принцип ясен. 6. Зарегистрируем наш файл в bind_stalker.script. Там находим функцию function actor_binder:use_inventory_item(obj) и под вторым end прописываем if obj~=nil then my_callbacks.on_use_item(obj) endif obj~=nil then my_callbacks.on_use_item(obj) end В целом выглядит так: function actor_binder:use_inventory_item(obj) if(obj) then local s_obj = alife():object(obj:id()) if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then xr_effects.disable_ui_only(db.actor, nil) level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback") level.add_pp_effector("surge_fade.ppe", 11, false) give_info("anabiotic_in_process") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") end end if obj~=nil then my_callbacks.on_use_item(obj) end endfunction actor_binder:use_inventory_item(obj) if(obj) then local s_obj = alife():object(obj:id()) if(s_obj) and (s_obj:section_name()=="drug_anabiotic") then xr_effects.disable_ui_only(db.actor, nil) level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback") level.add_pp_effector("surge_fade.ppe", 11, false) give_info("anabiotic_in_process") _G.mus_vol = get_console():get_float("snd_volume_music") _G.amb_vol = get_console():get_float("snd_volume_eff") get_console():execute("snd_volume_music 0") get_console():execute("snd_volume_eff 0") end end if obj~=nil then my_callbacks.on_use_item(obj) end end 7. Осталось добавить глобальную функцию give_object_to_actor в _g.script. Внизу пишем: -- 'Создание предмета в рюкзаке ГГ. function give_object_to_actor(obj,count) if count==nil then count=1 end for i=1, count do alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end-- 'Создание предмета в рюкзаке ГГ. function give_object_to_actor(obj,count) if count==nil then count=1 end for i=1, count do alife():create(obj,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end end На этом урок заканчивается. Осталось только прописать пак ГГ и протестировать! Изменено 11 Мая 2013 пользователем FantomICW 2 2 Поделиться этим сообщением Ссылка на сообщение
FantomICW 678 Опубликовано 25 Июля 2014 (изменено) Квест на убийство мутанта через туториал ("Press F To Win")Платформа: Сталкер Зов Припяти 1.6.02Автор: FantomICW, использованы наработки для Смерти ВопрекиУровень сложности: средний (не для самых зелёных новичков) Весь урок (Показать) Введение Текст (Показать) Приветствую! К своему Дню рождения (26.07) я хотел бы преподнести Сталкер-сообществу еще один небольшой подарок. В этот раз мое внимание привлекла тема, недавно затронутая в "Вопроснице"...Относительно недавно пользователь ap-pro Telnov1996 задал один вопрос:Можно ли организовать скриптовые сцены борьбы с мутантами, работающие по принципу 'Press "F" to win'?К обсуждению подключились уважаемый Dorian23Grey и, собственно, я сам. Ситуация выходит следующая:1. Во-первых, на X-Ray сцены с анимациями в стиле CoD, Metro и т. д. делать не очень удобно, как таковые.2. Требуется иметь отличные умения в анимации объектов.3. Нужно настроить взаимодействие логики с таймерами и анимации.На данный момент такое мало кто реализовывал. Однако, вариант, когда ГГ подходит к мутанту, запускается туториал с последующим выполнением убийства, - вполне реализуемая фишка. Сегодня об этом и пойдет речь.Пускай, на Затоне в пределах Северного озера поселился уникальный болотный псевдогигант, которому совершенно плевать на пули сталкеров. Единственный быстрый способ его устранить - активировать гравитационный артефакт. Когда ГГ подойдет к мутанту с артефактом, запустится туториал с надписью "Активировать артефакт". При нажатии F, запустится функция, которая создаст на месте мутанта партикл разрыва от грави-аномалии. Подготовка к действу Инструментарий (Показать) - Paint Net, Adobe Photoshop или другой редактор текстур (если кто-то будет создавать мутанту уникальную текстуру)- Notepad++ Текстура (Показать) Опять же, если желаете сделать для своего мутанта уникальную текстуру, пожалйста. Как по мне, то новую модель или текстуру стоит сделать, ибо супер-крутой псевдогиг должен как-то выделяться среди своих сородичей. Я сделал условный "ретекстур" (в кавычках, потому что ляпнуть чуток крови и "узеленить" текстуру - ретекстуром назвать нельзя) монстра под болото.:Если кому нужна текстура, ловите (бамп подключен стандартный). Партиклы (Показать) Для хорошего эффекта разрыва тела в аномалии, я буду использовать некоторые партиклы от АМК: amk\\blow_body amk\\zomb_explodeamk\\blow_body amk\\zomb_explode У кого они есть (или есть альтернативный вариант) - супер, отлично. У кого их нету - не волнуйтесь, чуть позже я загружу готовый particles.xr, а пока приложу два варианта таблицы партиклов для обоих случаев. Координаты (Показать) Если вы работаете не в СДК, а с ACDC, то вам нужно будет снять координаты для места, где будет сидеть мутант. Само место действия (примерно) показвыаю на карте:Я прошел немного вперед к воде, снял координаты: -19.00901222229,-7.0012526512146,526.37811279297,907875,47-19.00901222229,-7.0012526512146,526.37811279297,907875,47 Практика Часть I - Конфиги диалогов (Показать) 1. В configs/gameplay/dialogs_zaton.xml добавим два новых диалога: <dialog id="zat_super_psevdogig_take_task_dialog"> <!--Взятие квеста--> <dont_has_info>psevdogig_task_dialog_done</dont_has_info> <phrase_list> <phrase id="0"> <text>zat_super_psevdogig_take_task_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_super_psevdogig_take_task_dialog_1</text> <next>2</next> </phrase> <phrase id="2"> <text>zat_super_psevdogig_take_task_dialog_2</text> <next>3</next> </phrase> <phrase id="3"> <text>zat_super_psevdogig_take_task_dialog_3</text> <next>4</next> </phrase> <phrase id="4"> <text>zat_super_psevdogig_take_task_dialog_4</text> <next>5</next> </phrase> <phrase id="5"> <text>zat_super_psevdogig_take_task_dialog_5</text> <give_info>psevdogig_task_dialog_done</give_info> <action>dialogs_zaton.give_super_psevdogig_task</action> <!--Выдаем задание и артефакт--> </phrase> </phrase_list> </dialog> <dialog id="zat_super_psevdogig_task_end_dialog"> <has_info>zat_super_psevdogig_af_activation</has_info> <dont_has_info>psevdogig_task_finished</dont_has_info> <phrase_list> <phrase id="0"> <text>zat_super_psevdogig_task_end_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_super_psevdogig_task_end_dialog_1</text> <give_info>psevdogig_task_finished</give_info> <action>dialogs_zaton.give_super_psevdogig_task_reward</action> <!--Выдаем награду--> </phrase> </phrase_list> </dialog><dialog id="zat_super_psevdogig_take_task_dialog"> <!--Взятие квеста--> <dont_has_info>psevdogig_task_dialog_done</dont_has_info> <phrase_list> <phrase id="0"> <text>zat_super_psevdogig_take_task_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_super_psevdogig_take_task_dialog_1</text> <next>2</next> </phrase> <phrase id="2"> <text>zat_super_psevdogig_take_task_dialog_2</text> <next>3</next> </phrase> <phrase id="3"> <text>zat_super_psevdogig_take_task_dialog_3</text> <next>4</next> </phrase> <phrase id="4"> <text>zat_super_psevdogig_take_task_dialog_4</text> <next>5</next> </phrase> <phrase id="5"> <text>zat_super_psevdogig_take_task_dialog_5</text> <give_info>psevdogig_task_dialog_done</give_info> <action>dialogs_zaton.give_super_psevdogig_task</action> <!--Выдаем задание и артефакт--> </phrase> </phrase_list> </dialog> <dialog id="zat_super_psevdogig_task_end_dialog"> <has_info>zat_super_psevdogig_af_activation</has_info> <dont_has_info>psevdogig_task_finished</dont_has_info> <phrase_list> <phrase id="0"> <text>zat_super_psevdogig_task_end_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_super_psevdogig_task_end_dialog_1</text> <give_info>psevdogig_task_finished</give_info> <action>dialogs_zaton.give_super_psevdogig_task_reward</action> <!--Выдаем награду--> </phrase> </phrase_list> </dialog> 2. Пропишем их Бороде (секция zat_a2_stalker_barmen, файл character_desc_zaton.xml): <actor_dialog>zat_super_psevdogig_take_task_dialog</actor_dialog> <actor_dialog>zat_super_psevdogig_task_end_dialog</actor_dialog><actor_dialog>zat_super_psevdogig_take_task_dialog</actor_dialog> <actor_dialog>zat_super_psevdogig_task_end_dialog</actor_dialog> 3. В configs/text/rus/st_dialogs_zaton.xml поместим текстовку диалогов: <string id="zat_super_psevdogig_take_task_dialog_0"> <text>Как дела, Борода? Есть новости какие-то?</text> </string> <string id="zat_super_psevdogig_take_task_dialog_1"> <text>Здравствуй. Новость-не новость, а у нас на Северном озере поселился какой-то убер-псевдогигант, который не дает сталкерам (да и псевдоплотям, что уж тут говорить) покоя...Тварь неубиваемая какая-то. Посоветовавшись с Гонтой, решили попробовать его (я про псевдогиганта) активацией артефакта ликвидировать. Подходящий артефакт у меня вот есть, а смельчака для этого задания найти не можем...</text> </string> <string id="zat_super_psevdogig_take_task_dialog_2"> <text>Знаешь, я мог бы вам помочь.</text> </string> <string id="zat_super_psevdogig_take_task_dialog_3"> <text>Ты с Цементного завода рухнул? Да эта хрень тебя может в псевдочебурек превратить...А кто мне будет все те же арты таскать? На ком Лоцман зарабатывать будет? Короче, ты уверен?</text> </string> <string id="zat_super_psevdogig_take_task_dialog_4"> <text>Уверен. Мне скучно, прост)00)).</text> </string> <string id="zat_super_psevdogig_take_task_dialog_5"> <text>Ну, окей, удачи. Вот тебе "Грави" для активации. Будь аккуратен.</text> </string> <string id="zat_super_psevdogig_task_end_dialog_0"> <text>Все, старик. Нету больше твоего убер-псевдогигабайта.</text> </string> <string id="zat_super_psevdogig_task_end_dialog_1"> <text>Вах, слушай, молодец какой! Молоток! Возьми себе печеньку.</text> </string><string id="zat_super_psevdogig_take_task_dialog_0"> <text>Как дела, Борода? Есть новости какие-то?</text> </string> <string id="zat_super_psevdogig_take_task_dialog_1"> <text>Здравствуй. Новость-не новость, а у нас на Северном озере поселился какой-то убер-псевдогигант, который не дает сталкерам (да и псевдоплотям, что уж тут говорить) покоя...Тварь неубиваемая какая-то. Посоветовавшись с Гонтой, решили попробовать его (я про псевдогиганта) активацией артефакта ликвидировать. Подходящий артефакт у меня вот есть, а смельчака для этого задания найти не можем...</text> </string> <string id="zat_super_psevdogig_take_task_dialog_2"> <text>Знаешь, я мог бы вам помочь.</text> </string> <string id="zat_super_psevdogig_take_task_dialog_3"> <text>Ты с Цементного завода рухнул? Да эта хрень тебя может в псевдочебурек превратить...А кто мне будет все те же арты таскать? На ком Лоцман зарабатывать будет? Короче, ты уверен?</text> </string> <string id="zat_super_psevdogig_take_task_dialog_4"> <text>Уверен. Мне скучно, прост)00)).</text> </string> <string id="zat_super_psevdogig_take_task_dialog_5"> <text>Ну, окей, удачи. Вот тебе "Грави" для активации. Будь аккуратен.</text> </string> <string id="zat_super_psevdogig_task_end_dialog_0"> <text>Все, старик. Нету больше твоего убер-псевдогигабайта.</text> </string> <string id="zat_super_psevdogig_task_end_dialog_1"> <text>Вах, слушай, молодец какой! Молоток! Возьми себе печеньку.</text> </string> С диалогами все. Здесь все просто, поэтому детально рассказывать о них не буду. Если же эта часть показалась Вам сложной, то, простите, этот урок не совсем для Вашего уровня знаний. Часть II - Конфиг квеста (Показать) 1. В configs/misc/tm_zaton.ltx добавим секция квеста: [zat_super_psevdogig_task] icon = ui_inGame2_Logovo_krovososov prior = 10 storyline = false title = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2, zat_super_psevdogig_task_1 descr = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2_text, at_super_psevdogig_task_1_text target = {+zat_super_psevdogig_af_activation} zat_a2_stalker_barmen, zat_super_psevdogig_squad condlist_0 = {+psevdogig_task_finished} complete[zat_super_psevdogig_task] icon = ui_inGame2_Logovo_krovososov prior = 10 storyline = false title = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2, zat_super_psevdogig_task_1 descr = {+zat_super_psevdogig_af_activation} zat_super_psevdogig_task_2_text, at_super_psevdogig_task_1_text target = {+zat_super_psevdogig_af_activation} zat_a2_stalker_barmen, zat_super_psevdogig_squad condlist_0 = {+psevdogig_task_finished} complete Немного разбора:- иконка стоит от миссии на устранение логова кровососов- задание имеет две стадии: часть на устранение мутанта и часть, которая требует поговорить с Бородой (на эту часть обновление происходит при получении инфопорции zat_super_psevdogig_af_activation, мы к ней вернемся позже)- в первой части метка задания падает на сквад мутанта (его story_id - zat_super_psevdogig_squad), во второй - на Бороду- квест заканчивается при получении инфы psevdogig_task_finished, которая выдается в уже созданном нами диалогеКак видите, квест по структуре очень простой.2. Прописываем в configs/text/rus/st_quests_zaton.xml его текстовую часть: <string id="zat_super_psevdogig_task_1"> <text>Помощь криворуким: устранить убер-псевдогиганта</text> </string> <string id="zat_super_psevdogig_task_1_text"> <text>Я оказался прав: все сталкеры на Затоне - криворукие болваны. Теперь мне нужно за них устранить очень крутого мутанта на Северном озере.</text> </string> <string id="zat_super_psevdogig_task_2"> <text>Помощь криворуким: сломать Бороде нос</text> </string> <string id="zat_super_psevdogig_task_2_text"> <text>Хочу сказать пару ласковых слов Бороде. Какого фига это барыго в экзе не сказало мне, что меня на озере ждет не убер-псевдогигант, а жирная зеленая Гидра Затонская?</text> </string> <string id="zat_super_psevdogig_task_1"> <text>Помощь криворуким: устранить убер-псевдогиганта</text> </string> <string id="zat_super_psevdogig_task_1_text"> <text>Я оказался прав: все сталкеры на Затоне - криворукие болваны. Теперь мне нужно за них устранить очень крутого мутанта на Северном озере.</text> </string> <string id="zat_super_psevdogig_task_2"> <text>Помощь криворуким: сломать Бороде нос</text> </string> <string id="zat_super_psevdogig_task_2_text"> <text>Хочу сказать пару ласковых слов Бороде. Какого фига это барыго в экзе не сказало мне, что меня на озере ждет не убер-псевдогигант, а жирная зеленая Гидра Затонская?</text> </string> Переходим к конфигам мутанта. Часть III - Конфиги мутанта (Показать) 1. Файл configs/creatures/m_giant.ltx. Сделаем секцию нашего уникального псевдогиганта. Она будет почти аналогичная обычному гиганту: [super_psevdogig]:m_gigant_e $spawn = "monsters\gigants\super_psevdogig" visual = monsters\psevdogigant\psevdogigant_uber ;Это моя новая модель corpse_visual = monsters\psevdogigant\psevdogigant_uber_dead ;Это тоже rank = 50 ;Увеличим ранг spec_rank = strong ;Псевдик Стронг! radiation_pp_effector_name = postprocess_acidic ;Выставим кислотный постпроцесс attack_params = super_psevdogig_attack_params ;Новая секция параметрво атаки [super_psevdogig_attack_params] ;Тут усилен импульс ;-------------------------------------------------------------------------------------------------------------------------------------------- - ; anim | time[0..1] | hit_power | impulse | impulse_dir (x,y,z) | Field of hit_test (left,right, top, bottom) | Test Dist ;-------------------------------------------------------------------------------------------------------------------------------------------- - ;Bite stand_attack_0 = 0.25, 0.9, 200, 0.5, 1.0, 0.5, -0.8, 0.8, -1.8, 1.8, 2.6 ;Left leg Strike stand_attack_1 = 0.40, 0.9, 150, 5.0, 2.5, 4.0, -0.6, 0.6, -1.8, 1.8, 3.2 ;Bite2 stand_attack_2 = 0.25, 0.9, 200, 0.5, 1.0, 5.0, -0.8, 0.8, -1.8, 1.8, 2.6 stand_attack_run_0= 0.5, 0.9, 600, 0.5, 1.0, 5.0, -0.6, 1.3, -1.8, 1.8, 3.3 jump_attack_1 = 0.1, 2.00, 1600, 0.5, 1.0, 5.0, -1.0, 1.3, -1.6, 1.6, 5.5[super_psevdogig]:m_gigant_e $spawn = "monsters\gigants\super_psevdogig" visual = monsters\psevdogigant\psevdogigant_uber ;Это моя новая модель corpse_visual = monsters\psevdogigant\psevdogigant_uber_dead ;Это тоже rank = 50 ;Увеличим ранг spec_rank = strong ;Псевдик Стронг! radiation_pp_effector_name = postprocess_acidic ;Выставим кислотный постпроцесс attack_params = super_psevdogig_attack_params ;Новая секция параметрво атаки [super_psevdogig_attack_params] ;Тут усилен импульс ;-------------------------------------------------------------------------------------------------------------------------------------------- - ; anim | time[0..1] | hit_power | impulse | impulse_dir (x,y,z) | Field of hit_test (left,right, top, bottom) | Test Dist ;-------------------------------------------------------------------------------------------------------------------------------------------- - ;Bite stand_attack_0 = 0.25, 0.9, 200, 0.5, 1.0, 0.5, -0.8, 0.8, -1.8, 1.8, 2.6 ;Left leg Strike stand_attack_1 = 0.40, 0.9, 150, 5.0, 2.5, 4.0, -0.6, 0.6, -1.8, 1.8, 3.2 ;Bite2 stand_attack_2 = 0.25, 0.9, 200, 0.5, 1.0, 5.0, -0.8, 0.8, -1.8, 1.8, 2.6 stand_attack_run_0= 0.5, 0.9, 600, 0.5, 1.0, 5.0, -0.6, 1.3, -1.8, 1.8, 3.3 jump_attack_1 = 0.1, 2.00, 1600, 0.5, 1.0, 5.0, -1.0, 1.3, -1.6, 1.6, 5.5 2. Дальше требуется создать мутанту сквад в configs/misc/squad_descr_zaton.xml: [zat_super_psevdogig_squad]:online_offline_group faction = monster_special npc = super_psevdogig ;НПС в скваде - наш псевдогигант target_smart = zat_sim_2 ;Целевой смарт - полуостров на Северном озере spawn_point = zat_sim_2_giant_home ;Спавн поинт - поинт "логова" для мутанта story_id = zat_super_psevdogig_squad ;Sid совпадает с названием секции (ваш Кэп)[zat_super_psevdogig_squad]:online_offline_group faction = monster_special npc = super_psevdogig ;НПС в скваде - наш псевдогигант target_smart = zat_sim_2 ;Целевой смарт - полуостров на Северном озере spawn_point = zat_sim_2_giant_home ;Спавн поинт - поинт "логова" для мутанта story_id = zat_super_psevdogig_squad ;Sid совпадает с названием секции (ваш Кэп) Часть IV - Логика мутанта (Показать) 1. Прежде всего, открываем файл логики смарта полуострова - configs/scripts/zaton/smart/zat_sim_2.ltx, и внизу добавляем секцию exclusive с ссылкой на эксклюзивную логику гиганта: [exclusive] giant = zaton\zat_sim_2_super_psevdogig.ltx[exclusive] giant = zaton\zat_sim_2_super_psevdogig.ltx Итак, логика нашего мутанта называется giant.2. Переходим к самой логике. Создаем файл zaton\zat_sim_2_super_psevdogig.ltx. Заполняем его: [logic@giant] ;Название логики - giant (смотрите выше) suitable = {=target_squad_name(zat_super_psevdogig_squad)} true ;Логика доступна только для монстра из нашего сквада monster_job = true prior = 200 active = mob_home@giant [mob_home@giant] on_info = %=restore_health% ;Здоровье мутанта постоянно пополняется ;Если дистаниция до ГГ меньше 7 метров, в наличии есть квестовый артефакт, а активного туториала нету, то запускается туториал убийства: on_info2 = {=dist_to_actor_le(7) =actor_has_item(super_psevdogig_af_gravi) !has_active_tutorial} %=run_tutorial(zat_super_psevdogig_af_tutor)% ;Если дистаниция до ГГ больше 7 метров, в наличии есть квестовый артефакт, а туториал запущен, то запускается туториал убийства: on_info3 = {=dist_to_actor_ge(7) =actor_has_item(super_psevdogig_af_gravi) =has_active_tutorial} %=stop_tutorial% ;При получении инфы "zat_super_psevdogig_af_activation", убиваем НПС функцией "kill_npc" из xr_effects.script: on_info4 = {+zat_super_psevdogig_af_activation} %=kill_npc% ;При получении инфы "zat_super_psevdogig_af_activation_begin", удаляем НПС вообще и запускаем партиклы аномалии/разрыва новой функцией on_info5 = {+zat_super_psevdogig_af_activation_begin} %=zat_super_psevdogig_explode_2% path_home = giant_home ;В way_zaton.ltx это - zat_sim_2_giant_home ("логово") ;Настройки охраны "логова": home_min_radius = 20 home_max_radius = 50 aggressive = true[logic@giant] ;Название логики - giant (смотрите выше) suitable = {=target_squad_name(zat_super_psevdogig_squad)} true ;Логика доступна только для монстра из нашего сквада monster_job = true prior = 200 active = mob_home@giant [mob_home@giant] on_info = %=restore_health% ;Здоровье мутанта постоянно пополняется ;Если дистаниция до ГГ меньше 7 метров, в наличии есть квестовый артефакт, а активного туториала нету, то запускается туториал убийства: on_info2 = {=dist_to_actor_le(7) =actor_has_item(super_psevdogig_af_gravi) !has_active_tutorial} %=run_tutorial(zat_super_psevdogig_af_tutor)% ;Если дистаниция до ГГ больше 7 метров, в наличии есть квестовый артефакт, а туториал запущен, то запускается туториал убийства: on_info3 = {=dist_to_actor_ge(7) =actor_has_item(super_psevdogig_af_gravi) =has_active_tutorial} %=stop_tutorial% ;При получении инфы "zat_super_psevdogig_af_activation", убиваем НПС функцией "kill_npc" из xr_effects.script: on_info4 = {+zat_super_psevdogig_af_activation} %=kill_npc% ;При получении инфы "zat_super_psevdogig_af_activation_begin", удаляем НПС вообще и запускаем партиклы аномалии/разрыва новой функцией on_info5 = {+zat_super_psevdogig_af_activation_begin} %=zat_super_psevdogig_explode_2% path_home = giant_home ;В way_zaton.ltx это - zat_sim_2_giant_home ("логово") ;Настройки охраны "логова": home_min_radius = 20 home_max_radius = 50 aggressive = true 3. Настало время использовать ранее снятые координаты. Распаковываем all.spawn с ACDC или же используем СДК Левел Эдитор, чтоб создать точку для монстра в way_zaton.ltx: [zat_sim_2_giant_home] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -19.00901222229,-7.0012526512146,526.37811279297 p0:game_vertex_id = 47 p0:level_vertex_id = 907875[zat_sim_2_giant_home] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -19.00901222229,-7.0012526512146,526.37811279297 p0:game_vertex_id = 47 p0:level_vertex_id = 907875 Собираем спавн. Часть V - Конфиг квестового артефакта и туториала (Показать) 1. В логике мы уже упомянули предмет super_psevdogig_af_gravi. Это секция квестового артефакта, который мы якобы будем активировать. Открываем configs/misc/quest_items.ltx, и добавляем туда его: [super_psevdogig_af_gravi]:device_pda visual = dynamics\artefacts\af_gravi.ogf description = st_af_gravi_descr inv_name = st_af_gravi_name inv_name_short = st_af_gravi_name inv_weight = 0.5 inv_grid_x = 15 inv_grid_y = 0 cost = 12000 can_trade = false ;Нельзя продать quest_item = true ;Нельзя выбросить story_id = super_psevdogig_af_gravi[super_psevdogig_af_gravi]:device_pda visual = dynamics\artefacts\af_gravi.ogf description = st_af_gravi_descr inv_name = st_af_gravi_name inv_name_short = st_af_gravi_name inv_weight = 0.5 inv_grid_x = 15 inv_grid_y = 0 cost = 12000 can_trade = false ;Нельзя продать quest_item = true ;Нельзя выбросить story_id = super_psevdogig_af_gravi Стандартная секция квестового предмета с "родителем" device_pda.2. Также в логике мы объявили запуск туториала: %=run_tutorial(zat_super_psevdogig_af_tutor)%%=run_tutorial(zat_super_psevdogig_af_tutor)% Все туториалы игры прописываются в configs/ui/game_tutorials.xml. Вам, вполне возможно, секция ниже может показаться какой-то странной штукой. На самом деле, там все просто, но, считаю, это лучше разбирать в отдельных уроках по худу и гуи, поэтому сейчас можете не забивать голову. Самые важные параметры я укажу: <zat_super_psevdogig_af_tutor> <!--Название--> <global_wnd/> <item> <disabled_key>quit</disabled_key> <length_sec/> <!--При нажатии F, запускается функция xr_effects.zat_super_psevdogig_explode_1--> <action id="use" finalize="1">xr_effects.zat_super_psevdogig_explode_1</action> <guard_key>use</guard_key> <!----Ниже уже другие параметры--> <grab_input>0</grab_input> <main_wnd> <!--Всякие параметры текста. Я задал 32 шрифт и красный цвет по RGB. Секция текста - st_tutor_af_activation--> <auto_static start_time="0" length_sec="5000" x="512" y="660" width="300" height="60" alignment="c" stretch="1"la_cyclic="1" la_texture="1" la_alpha="1"> <text font="graffiti32" r="225" g="36" b="36" a="255" align="c">st_tutor_af_activation</text> </auto_static> </main_wnd> </item> </zat_super_psevdogig_af_tutor> <!--Тут секция туториала заканчивается--><zat_super_psevdogig_af_tutor> <!--Название--> <global_wnd/> <item> <disabled_key>quit</disabled_key> <length_sec/> <!--При нажатии F, запускается функция xr_effects.zat_super_psevdogig_explode_1--> <action id="use" finalize="1">xr_effects.zat_super_psevdogig_explode_1</action> <guard_key>use</guard_key> <!----Ниже уже другие параметры--> <grab_input>0</grab_input> <main_wnd> <!--Всякие параметры текста. Я задал 32 шрифт и красный цвет по RGB. Секция текста - st_tutor_af_activation--> <auto_static start_time="0" length_sec="5000" x="512" y="660" width="300" height="60" alignment="c" stretch="1"la_cyclic="1" la_texture="1" la_alpha="1"> <text font="graffiti32" r="225" g="36" b="36" a="255" align="c">st_tutor_af_activation</text> </auto_static> </main_wnd> </item> </zat_super_psevdogig_af_tutor> <!--Тут секция туториала заканчивается--> 3. Дальше добавим секцию текста st_tutor_af_activation, к примеру, в ui_st_screen.xml: <string id="st_tutor_af_activation"> <text>Активировать артефакт ($$ACTION_USE$$)</text> </string><string id="st_tutor_af_activation"> <text>Активировать артефакт ($$ACTION_USE$$)</text> </string> $$ACTION_USE$$ означает клавишу "Использовать". Это F по умолчанию Часть VI - Скрипты всего и вся (Показать) 1. Начнем с диалогов. В каждом из двух мы запускаем по одной функции. Обе функции в dialogs_zaton.script. Первая: function give_super_psevdogig_task(first_speaker, second_speaker) dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "super_psevdogig_af_gravi") --Выдаем "Грави" task_manager.get_task_manager():give_task("zat_super_psevdogig_task") --Выдаем задание xr_effects.create_squad(nil, nil, {"zat_super_psevdogig_squad", "zat_sim_2"}) --Спавним сквад монстра на смарте "zat_sim_2" endfunction give_super_psevdogig_task(first_speaker, second_speaker) dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "super_psevdogig_af_gravi") --Выдаем "Грави" task_manager.get_task_manager():give_task("zat_super_psevdogig_task") --Выдаем задание xr_effects.create_squad(nil, nil, {"zat_super_psevdogig_squad", "zat_sim_2"}) --Спавним сквад монстра на смарте "zat_sim_2" end Во второй будем выдавать награду: function give_super_psevdogig_task_reward(first_speaker, second_speaker) local items_pack = { {item = "energy_drink", amount = 2}, {item = "medkit_army", amount = 3}, {item = "antirad", amount = 2}, {item = "vodka", amount = 1}, {item = "conserva", amount = 3}, } for k,v in pairs(items_pack) do dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount) end dialogs.relocate_money_to_actor(first_speaker, second_speaker, 3000) endfunction give_super_psevdogig_task_reward(first_speaker, second_speaker) local items_pack = { {item = "energy_drink", amount = 2}, {item = "medkit_army", amount = 3}, {item = "antirad", amount = 2}, {item = "vodka", amount = 1}, {item = "conserva", amount = 3}, } for k,v in pairs(items_pack) do dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount) end dialogs.relocate_money_to_actor(first_speaker, second_speaker, 3000) end Используем условно сложную таблицу items_pack. Каждый ее элемент состоит из двух пунктов:item - секция предметаamount - количество, которое нужно выдатьДалее некий цикл в виде стандартногоfor k,v in pairs(название_таблицы) doЭто означает, что функция ниже может выполниться для каждого элемента таблицы (v). У нас это: dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount)dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, v.item, v.amount) Обратите внимание на v.item и v.amount.Ну, а в выдаче денег не вижу ничего сложного.2. Последнее, что нам нужно сделать, - это две функции: одна выдается при использовании туториала, а вторая - из логики. В xr_effects.script добавляем первую функцию: function zat_super_psevdogig_explode_1(actor, npc) db.actor:give_info_portion("zat_super_psevdogig_af_activation_begin") --Выдаем инфу remove_item(actor, npc, {"super_psevdogig_af_gravi"}) --Забираем у ГГ артефакт (он же активируется) endfunction zat_super_psevdogig_explode_1(actor, npc) db.actor:give_info_portion("zat_super_psevdogig_af_activation_begin") --Выдаем инфу remove_item(actor, npc, {"super_psevdogig_af_gravi"}) --Забираем у ГГ артефакт (он же активируется) end Опять же, ничего сложного. Два простых действия. Единственное, замечу, что remove_item - это тоже функция из xr_effects.script. Теперь добавляем вторую: function zat_super_psevdogig_explode_2(actor, npc) local fx_table_1 = { [1] = {particle = particles_object("anomaly2\\gravity_blast_final00")}, [2] = {particle = particles_object("anomaly2\\gravity_blast_03")}, [3] = {particle = particles_object("anomaly2\\gravity_blast_05")}, } local npc_position = npc:position() for i = 1,3 do fx_table_1[i].particle:play_at_pos(npc_position) end db.actor:give_info_portion("zat_super_psevdogig_af_activation") remove_squad(nil, nil, {"zat_super_psevdogig_squad"}) local fx_table_2 = { [1] = {particle = particles_object("anomaly2\\body_tear_00")}, [2] = {particle = particles_object("amk\\blow_body")}, [3] = {particle = particles_object("amk\\zomb_explode")}, } for i = 1,3 do fx_table_2[i].particle:play_at_pos(npc_position) end endfunction zat_super_psevdogig_explode_2(actor, npc) local fx_table_1 = { [1] = {particle = particles_object("anomaly2\\gravity_blast_final00")}, [2] = {particle = particles_object("anomaly2\\gravity_blast_03")}, [3] = {particle = particles_object("anomaly2\\gravity_blast_05")}, } local npc_position = npc:position() for i = 1,3 do fx_table_1[i].particle:play_at_pos(npc_position) end db.actor:give_info_portion("zat_super_psevdogig_af_activation") remove_squad(nil, nil, {"zat_super_psevdogig_squad"}) local fx_table_2 = { [1] = {particle = particles_object("anomaly2\\body_tear_00")}, [2] = {particle = particles_object("amk\\blow_body")}, [3] = {particle = particles_object("amk\\zomb_explode")}, } for i = 1,3 do fx_table_2[i].particle:play_at_pos(npc_position) end end У нас есть две таблицы. Каждая имеет три партикла (каждый партикл в функциях ниже объявляется так: таблица.particle). Зачем нужно было делить из на две таблицы? Просто лучше, чтоб партиклы грави-аномалии начали играться чуть раньше партиклов разрыва тела. Цикл здесь задан немного по-другому: for i = 1,3 dofor i = 1,3 do Гляньте на пронумерованные элементы таблиц, и все станет с этим циклом ясно.Также надо заметить, что, поскольку функция вызывается прямо из логики НПС, мы можем задать удобную локальную переменную для объявления позиции данного НПС в реальном времени: local npc_position = npc:position()local npc_position = npc:position() Кто не понял, вот это npc, после которого двоеточие, - это и есть псевдогигант. Гляньте на аргументы функции:(actor, npc)Итак, мы используем локальную переменную для выполнения функции с циклом/таблицей: fx_table_1[i].particle:play_at_pos(npc_position)fx_table_1[i].particle:play_at_pos(npc_position) Задействована движковая функция play_at_pos, предназначенная конкретно для партиклов.Если у Вас нету партиклов АМК, то вторую таблицу изменяем: local fx_table_2 = { [1] = {particle = particles_object("anomaly2\\body_tear_00")}, [2] = {particle = particles_object("anomaly2\\body_tear_01")}, [3] = {particle = particles_object("anomaly2\\body_tear_02")}, }local fx_table_2 = { [1] = {particle = particles_object("anomaly2\\body_tear_00")}, [2] = {particle = particles_object("anomaly2\\body_tear_01")}, [3] = {particle = particles_object("anomaly2\\body_tear_02")}, } Вот и все, со всем разобрались. Смотрим результат. Результат Видео (Показать) Чуть позже я также дополню материал, чтоб при ликвидации псевдогиганта игрались некоторые звуки аномалий и его самого...Итого, ничего сверхсложного или особенного мы не сделали, но...Представьте, что мы можем использовать такую схему в связке с анимационной схваткой с химерой или сосычем. Основы есть, есть и то, к чему нужно стремиться. На самом деле, мы еще не успели перелопатить весь моддинг, не так ли? На этом урок закончен. Всем большое спасибо! Изменено 25 Июля 2014 пользователем Murarius 4 1 Поделиться этим сообщением Ссылка на сообщение
FantomICW 678 Опубликовано 22 Декабря 2014 (изменено) Список шрифтов для UI Платформа: Сталкер Зов Припяти 1.6.02Автор: FantomICW ВведениеВсем привет. Пожалуй, есть вопросы по модостроению, которые мучили меня месяцами. Один из них - список доступных для использования игровых шрифтов. Некоторые ресурсы в гугле предлагают открыть файл configs/fonts.ltx, но я так и не понял, каким образом эта вещь читается движком: названия "фонтов" не совпадают с тем, что используются в интерфейсе. Итого, данный вопрос будет пока что раскрыт наполовину. Тем не менее, благодаря исходникам движка 1.6.02, мне удалось докопаться до того самого места, где "регистрируются" реально работающие шрифты!Предлагаю ознакомиться с этим небольшим справочником Справочная информация Регистрация шрифтов (Показать) Собственно, "регистрация" шрифтов проходит в файле UIXmlInit.cpp. Строки 29-43 содержат определение переменных для большой части названий шрифтов (чуть ниже мы увидим, как эти переменные используются):#define ARIAL_FONT_NAME "arial" #define MEDIUM_FONT_NAME "medium" #define SMALL_FONT_NAME "small" #define GRAFFITI19_FONT_NAME "graffiti19" #define GRAFFITI22_FONT_NAME "graffiti22" #define GRAFFITI32_FONT_NAME "graffiti32" #define GRAFFITI50_FONT_NAME "graffiti50" #define LETTERICA16_FONT_NAME "letterica16" #define LETTERICA18_FONT_NAME "letterica18" #define LETTERICA25_FONT_NAME "letterica25" #define DI_FONT_NAME "di"#define ARIAL_FONT_NAME "arial" #define MEDIUM_FONT_NAME "medium" #define SMALL_FONT_NAME "small" #define GRAFFITI19_FONT_NAME "graffiti19" #define GRAFFITI22_FONT_NAME "graffiti22" #define GRAFFITI32_FONT_NAME "graffiti32" #define GRAFFITI50_FONT_NAME "graffiti50" #define LETTERICA16_FONT_NAME "letterica16" #define LETTERICA18_FONT_NAME "letterica18" #define LETTERICA25_FONT_NAME "letterica25" #define DI_FONT_NAME "di" Структура: #define ПЕРЕМЕННАЯ "название"#define ПЕРЕМЕННАЯ "название" Сама "регистрация" проходит в этом же файле, в функции InitFont: bool CUIXmlInit::InitFont(CUIXml &xml_doc, LPCSTR path, int index, u32 &color, CGameFont *&pFnt) { color = GetColor (xml_doc, path, index, 0xff); LPCSTR font_name = xml_doc.ReadAttrib(path, index, "font", NULL); if(!font_name) { pFnt = NULL; return false; }else { if(!xr_strcmp(font_name, GRAFFITI19_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti19Russian; } else if(!xr_strcmp(font_name, GRAFFITI22_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti22Russian; } else if(!xr_strcmp(font_name, GRAFFITI32_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti32Russian; } else if(!xr_strcmp(font_name, GRAFFITI50_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti50Russian; } else if(!xr_strcmp(font_name, "arial_14")) { pFnt = UI().Font().pFontArial14; } else if(!xr_strcmp(font_name, MEDIUM_FONT_NAME)) { pFnt = UI().Font().pFontMedium; } else if(!xr_strcmp(font_name, SMALL_FONT_NAME)) { pFnt = UI().Font().pFontStat; } else if(!xr_strcmp(font_name, LETTERICA16_FONT_NAME)) { pFnt = UI().Font().pFontLetterica16Russian; } else if(!xr_strcmp(font_name, LETTERICA18_FONT_NAME)) { pFnt = UI().Font().pFontLetterica18Russian; } else if(!xr_strcmp(font_name, LETTERICA25_FONT_NAME)) { pFnt = UI().Font().pFontLetterica25; } else if(!xr_strcmp(font_name, DI_FONT_NAME)) { pFnt = UI().Font().pFontDI; }else { R_ASSERT3(0,"unknown font",font_name); pFnt = NULL; } } return true; }bool CUIXmlInit::InitFont(CUIXml &xml_doc, LPCSTR path, int index, u32 &color, CGameFont *&pFnt) { color = GetColor (xml_doc, path, index, 0xff); LPCSTR font_name = xml_doc.ReadAttrib(path, index, "font", NULL); if(!font_name) { pFnt = NULL; return false; }else { if(!xr_strcmp(font_name, GRAFFITI19_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti19Russian; } else if(!xr_strcmp(font_name, GRAFFITI22_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti22Russian; } else if(!xr_strcmp(font_name, GRAFFITI32_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti32Russian; } else if(!xr_strcmp(font_name, GRAFFITI50_FONT_NAME)) { pFnt = UI().Font().pFontGraffiti50Russian; } else if(!xr_strcmp(font_name, "arial_14")) { pFnt = UI().Font().pFontArial14; } else if(!xr_strcmp(font_name, MEDIUM_FONT_NAME)) { pFnt = UI().Font().pFontMedium; } else if(!xr_strcmp(font_name, SMALL_FONT_NAME)) { pFnt = UI().Font().pFontStat; } else if(!xr_strcmp(font_name, LETTERICA16_FONT_NAME)) { pFnt = UI().Font().pFontLetterica16Russian; } else if(!xr_strcmp(font_name, LETTERICA18_FONT_NAME)) { pFnt = UI().Font().pFontLetterica18Russian; } else if(!xr_strcmp(font_name, LETTERICA25_FONT_NAME)) { pFnt = UI().Font().pFontLetterica25; } else if(!xr_strcmp(font_name, DI_FONT_NAME)) { pFnt = UI().Font().pFontDI; }else { R_ASSERT3(0,"unknown font",font_name); pFnt = NULL; } } return true; } Что можно вынести интересного:- знакомые переменные- arial_14 не использует переменную, как другие шрифты- есть функция R_ASSERT: R_ASSERT3(0,"unknown font",font_name); pFnt = NULL;R_ASSERT3(0,"unknown font",font_name); pFnt = NULL; Чистый список всех возможных шрифтов (Показать) "arial_17" "medium" "small" "graffiti19" "graffiti22" "graffiti32" "graffiti50" "letterica16" "letterica18" "letterica25""arial_17" "medium" "small" "graffiti19" "graffiti22" "graffiti32" "graffiti50" "letterica16" "letterica18" "letterica25" Надеюсь, информация пригодится! Спасибо за внимание и удачи! Изменено 22 Декабря 2014 пользователем FantomICW 1 4 1 3 Поделиться этим сообщением Ссылка на сообщение
FantomICW 678 Опубликовано 16 Июня 2016 (изменено) [CoP] Пресеты Custom Data для SDK Добрый день! Предлагаю небольшую шпаргалку для тех, кто работает с заселением в SDK LE и более-менее понимает, для чего, вообще, нужен данный код. Фактически создано для копипаста и экономии времени. Для новичков, может, тоже будет не лишним почитать. Что необходимо учесть: 1. Я привык разбивать логику различных групп объектов по подпапкам (smart, anomaly, npc_logic, monsters_logic и другие). Это не есть обязательным, но рекомендую действовать таким же образом. Практика показывает, что другим модмейкерам, в этом случае, будет легче ориентироваться в файлах логики Вашего мода. 2. Каждый пресет является среднестатистическим набором для логики. Вы, само собой, можете убирать/добавлять дополнительные секции в роде collide, story_object. 3. Вместо location, в пути прописываете название локации. Удачи! ;) Для Custom Data в SDK Smart Terrain (Показать) [smart_terrain] cfg = scripts\location\smart\smart_name.ltx[smart_terrain] cfg = scripts\location\smart\smart_name.ltx Anomal Zone (Показать) [anomal_zone] cfg = scripts\location\anomaly\anomal_zone.ltx[anomal_zone] cfg = scripts\location\anomaly\anomal_zone.ltx Camp (Показать) [camp] cfg = scripts\camp.ltx[camp] cfg = scripts\camp.ltx Space Restrictor (Показать) [story_object] story_id = restr_story_id [logic] cfg = scripts\location\restrictors_logic\restr.ltx[story_object] story_id = restr_story_id [logic] cfg = scripts\location\restrictors_logic\restr.ltx Sleep Zone (Показать) [logic] cfg = scripts\sr_sleep.ltx[logic] cfg = scripts\sr_sleep.ltx Physic Objects and Quest Items (Показать) [story_object] story_id = object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\object.ltx [physics_common] ;Альтернатива параметру fixed_bones, используется для квестовых айтемов device_pda и т. д. fixed_bones = link[story_object] story_id = object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\object.ltx [physics_common] ;Альтернатива параметру fixed_bones, используется для квестовых айтемов device_pda и т. д. fixed_bones = link Animated Object (Показать) [story_object] story_id = anim_object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\anim_object.ltx [animated_object][story_object] story_id = anim_object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\anim_object.ltx [animated_object] Inventory Box (Показать) [story_object] story_id = box_story_id [logic] cfg = scripts\location\inventory_box\box.ltx[story_object] story_id = box_story_id [logic] cfg = scripts\location\inventory_box\box.ltx Actor Inventory Box (Показать) [story_object] story_id = actor_box_story_id [logic] cfg = scripts\actor_inventory_box.ltx [level_spot] actor_box[story_object] story_id = actor_box_story_id [logic] cfg = scripts\actor_inventory_box.ltx [level_spot] actor_box Door (Показать) [logic] cfg = scripts\door.ltx[logic] cfg = scripts\door.ltx Другое Exclusive logic for Smart config (Показать) [exclusive] monster = location\monsters_logic\monster_l.ltx npc = location\npc_logic\npc_l.ltx[exclusive] monster = location\monsters_logic\monster_l.ltx npc = location\npc_logic\npc_l.ltx Все в одном коде (Показать) ;==============================For SDK and logic==============================; ;------------------------------------------- ;Smart Terrain ;------------------------------------------- [smart_terrain] cfg = scripts\location\smart\smart_name.ltx ;------------------------------------------- ;Anomal Zone ;------------------------------------------- [anomal_zone] cfg = scripts\location\anomaly\anomal_zone.ltx ;------------------------------------------- ;Camp ;------------------------------------------- [camp] cfg = scripts\camp.ltx ;------------------------------------------- ;Space Resctrictor ;------------------------------------------- [story_object] story_id = restr_story_id [logic] cfg = scripts\location\restrictors_logic\restr.ltx ;------------------------------------------- ;Sleep Zone ;------------------------------------------- [logic] cfg = scripts\sr_sleep.ltx ;------------------------------------------- ;Physic Objects and Quest Items ;------------------------------------------- [story_object] story_id = object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\object.ltx [physics_common] fixed_bones = link ;------------------------------------------- ;Anim Object ;------------------------------------------- [story_object] story_id = anim_object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\anim_object.ltx [animated_object] ;------------------------------------------- ;Inventory Box ;------------------------------------------- [story_object] story_id = box_story_id [logic] cfg = scripts\location\inventory_box\box.ltx ;------------------------------------------- ;Actor Inventory Box ;------------------------------------------- [story_object] story_id = actor_box_story_id [logic] cfg = scripts\sr_sleep.ltx [level_spot] actor_box ;------------------------------------------- ;Door ;------------------------------------------- [logic] cfg = scripts\door.ltx ;==============================For Smart Configs==============================; [exclusive] monster = location\monsters_logic\monster_l.ltx npc = location\npc_logic\npc_l.ltx;==============================For SDK and logic==============================; ;------------------------------------------- ;Smart Terrain ;------------------------------------------- [smart_terrain] cfg = scripts\location\smart\smart_name.ltx ;------------------------------------------- ;Anomal Zone ;------------------------------------------- [anomal_zone] cfg = scripts\location\anomaly\anomal_zone.ltx ;------------------------------------------- ;Camp ;------------------------------------------- [camp] cfg = scripts\camp.ltx ;------------------------------------------- ;Space Resctrictor ;------------------------------------------- [story_object] story_id = restr_story_id [logic] cfg = scripts\location\restrictors_logic\restr.ltx ;------------------------------------------- ;Sleep Zone ;------------------------------------------- [logic] cfg = scripts\sr_sleep.ltx ;------------------------------------------- ;Physic Objects and Quest Items ;------------------------------------------- [story_object] story_id = object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\object.ltx [physics_common] fixed_bones = link ;------------------------------------------- ;Anim Object ;------------------------------------------- [story_object] story_id = anim_object_story_id [collide] ignore_static ignore_small_objects [logic] cfg = scripts\location\physic_objects\anim_object.ltx [animated_object] ;------------------------------------------- ;Inventory Box ;------------------------------------------- [story_object] story_id = box_story_id [logic] cfg = scripts\location\inventory_box\box.ltx ;------------------------------------------- ;Actor Inventory Box ;------------------------------------------- [story_object] story_id = actor_box_story_id [logic] cfg = scripts\sr_sleep.ltx [level_spot] actor_box ;------------------------------------------- ;Door ;------------------------------------------- [logic] cfg = scripts\door.ltx ;==============================For Smart Configs==============================; [exclusive] monster = location\monsters_logic\monster_l.ltx npc = location\npc_logic\npc_l.ltx Изменено 15 Декабря 2017 пользователем Murarius 2 6 Поделиться этим сообщением Ссылка на сообщение