ModoStroitel 3 Опубликовано 11 Июля 2016 Поделиться Опубликовано 11 Июля 2016 (изменено) Наткнулся на такую вот обучалочку по восстановлению вырезанных мутантов в зове припяти: Новые монстры ВведениеМногие часто сталкиваются с тем, что при попытке добавления монстров не попавшими в финальную версию игра может вылетать. Попробую рассказать, как это дело можно исправить.Для примера возьму кошек (уж очень они мне нравятся)Добавить их можно отредактировать файл all.spawn, либо динамически создать в игре через функцию alife:create().Вылет при появленииОбычно сопровождается сообщением в логе:Arguments : Can't open section 'cat_weak'Это значит, что монстр у нас не до конца описан. В файле конфигурации идет секция[m_cat_e]:monster_baseНо для создания разных по силе конфигураций монстров обычно используется такая штука. Создается секция вида[cat_weak]:m_cat_eто есть ссылка на основную конфигурацию, а потом указываются параметры, которые отличаются от нее. Например сила, здоровье, угол обзора и тд. Мы пока ограничимся просто добавлением этой секции. В файле config\creatures\m_cat.ltx в конце допишем [cat_weak]:m_cat_e. Запускаем, добавляем кошку, вылетаем с ошибкой:Arguments : Can't find variable smart_terrain_choose_interval in [cat_weak]Что ж, добавим и этот параметр. Посмотрим, какой он у собак, и сделаем также:smart_terrain_choose_interval = 00:15:00Запускаем, вылетаем с ошибкой:Arguments : Can't find variable satiety_threshold in [cat_weak]Вобщем, добавляем параметры, по кошка не станет нормально появлятся. Такие ошибки легко локализуются и исправляются.Ну, на всякий случай, нужно добавить еще две строчки:critical_wound_threshold = 0.4critical_wound_decrease_quant = 0.После этого кошка появляется, бегает, с 30 метров бежит нас кушать. Мы этого не хотим, стреляем в нее, и у нас происходитВылет при убийствеЭто знаменитая ошибка:Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20 ........Самое просто и неправильное решение - закоментировать 20-ю строку скрипта _g.script, вылет исчезнет, но ошибка никуда не денется. Я не могу сказать с уверенностью, к чему игнорирование этого факта может привести, так как исправлял причину, а не следствие.Путем нехитрых логических размышлений решение было найдено. Вернее тупым перебором всего, что относилось к делу, криками на форумах, битьем головой о стенку... Потом пришло озарение, вместе с сакраментальным вопросом "что происходит после смерти?" А происходит добавление в статистику убитого объекта (монстра, нпс-а). Поэтому лезем в скрипт xr_statistic.script. В самом начале видим объявление переменнойlocal killCountProps = {...}в которой кошек нет. Поэтому добавляем их туда (например, в конец), для начисления очков опыта:cat_weak = 1, cat_normal = 2, cat_strong = 3,Хотя мы сделали только cat_weak, но на будущее добавим и остальных. Затем идет перечисление используемых классов монстров:monster_classes = {кошек нет и здесь, добавляем:[clsid.cat_s] = "cat",Смотрим дальше, видим функцию addKillCount(npc), которая определяет сообщество (community) убитого. Функция вызывает getNpcType(npc), которая находится в этом же скрипте. А там идет обращение к функции IsStalker(npc), и возвращает сообщество и ранг убиенного.Но тут про мостров ни слова, а значит идем дальше. Функция IsStalker(npc) обнаруживается в скрипте _g.script. Просматривая его обнаруживаем следующие интересующие нас функции:· is_object_monster(obj)кошек нет, добавляем рядом с собаками:otype == clsid.cat or· IsMonster (object, class_id)кошки есть, ничего не трогаем.Для страховки проверим еще одни файл, class_registrator.script. Находим в нем строкуcs_register (object_factory, "CCat", "se_monster.se_monster", "SM_CAT_S", "cat_s")и успокаиваемся на этом. Запускаем, убиваем, подходим, пытаемся обыскать - вылетаем. Потому что случилсяВылет при обыскеНу тут уже проще. Вспоминаем, что у нас показывается в инвентаре убитого? Иконка растерзанного трупа. Проверяем m_cat.ltx - действительно, параметр icon отсутствует. Тут появляется два пути.Первый - нарисовать новую иконку, вставить ее в файл ui_npc_monster.dds, определить координаты и добавить их в xml-описатель ui_npc_monster.xml. И так для каждого нового монстра.Второй - использовать общую иконку для всех монстров, у которых отсутствует этот параметр. Мы им и воспользуемся, так как для тестовых целей сойдет, а для серьезного применения все равно необходимо иметь хоть какие-то художественные навыки (если кто видел мой тестовый мод "15 кошек", то помнят тот ужас вместо иконки кошки )Для этого отредактируем файл defines.ltx , так как именно в нём содержится секция monster_base, общая для всех монстров. Открываем, ищем секцию, и вставляемicon = ui_frame_error_sign_redЭто будет такой красный крест в круге. Запускаем, убиваем, обыскиваем и не вылетаем.Итак, свежедобавленный монстр бегает, живет, нападает. Однако та же кошка по умолчанию невероятно сильна, убивает с одного удара, поэтому для нормальной жизни необходимо подредактировать секцию атаки.Внимание!!!Огромный минус в том, что убитое животное не попадает в статистику, хотя мы вроде все для этого сделали. С этим предлагаю разобраться самим. Подсказка: в энциклопедии кошек тоже нет Изменено 18 Августа 2016 пользователем HellRatz Ссылка на комментарий
Expropriator 2 118 Опубликовано 3 Сентября 2016 Поделиться Опубликовано 3 Сентября 2016 (изменено) Два подобных урока по распаковке ресурсов Крайэнгине. Смотреть на облаке. Прошу не ругать за не совсем сталкеровскую тему, но это поможет подготовить модели и текстуры к работе в редакторах. Ну, и пара уроков для Сталкера. Изменено 3 Сентября 2016 пользователем Дизель Ссылка на комментарий
sheva. 0 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 (изменено) СОЗДАНИЕ РАДИО ДЛЯ ЗОВ ПРИПЯТИ . Этот метод работает на всех версиях ЗП а также и в модификациях ЗП .Работа в Level Editore( sdk-07)1.Открываем локацию и камерой ищем место для приёмника(радио)2.В Level Editore жмём вкладку spawn element , ищем пункт elektrotexnika и в этом пункте ищем priemnik_gorizont.Жмём мышкой на priemnik_gorizont, потом мышкой на чайник который находится в верхнем левом углу Level Editor, когда нажали чайник потом мышкой жмём на то место где должен стоять приёмник , нажали и он появился и нажимаем клавишу enter , откроются опции приёмника.В опциях приёмника в разделе Custom data , пишем ссылку на логику радио.[logic]cfg=scripts\mar_baz_mafon.ltxА также в опциях приёмника в разделе Fixed bones , выбрать (link) это означает что приёмник не движим.И так приёмник поставили и прописали в Level Editore работа оканчена , жмём save потом жмём MakeGame и соберётся спавн и на этом LevelEditor закрываем.Потом батник компиляции спавна запускаем и когда он отработал надо скопировать спавн локации и вставить в игру и переименовать в all.spawn.Создаём файл логики для нашего приёмника (радио).1.Открываем папки (или создаём) gamedata\configs\scripts:Вот в папке scripts и создаём файл логики:mar_baz_mafon.ltx. Создали и открываем и пишем ему логику , день \ночь тоесть днём играют дневные мелодии а ночью ночьные, этоСделано для того что днём играет весёлая и.т.дА ночью спокойная ведь спят сталкера.Открыли файл (mar_baz_mafon.ltx)И пишем.[logic]active=sr_idle@day[sr_idle@day]on_info = ℅=play_sound(day_muzic_baz)%on_info = sound_end| {!is_day}sr_idle@nightactive = sr_idle@night[sr_idle@night]on_info = %=play_sound(night_music_baz)%on_signal = sound_end| {=is_day}sr_idle@dayВот и написали логику ,сохраняем файл и закрываем.Регистрируем мелодии.Открываем папки (или создаём)gamedata\configs\misc:Открываем папку misc и ищем файл script_sound.ltx (если нет его, то можно его взять из оригинала игры ,gamedataUE)Открываем файл script_sound.ltx и вверху допишем ссылку на файл#include"script_sound_имя вашей локации.ltx"Потом после строчки wait пишем имя наших файловwaitday_muzic_baznight_music_bazПотом ниже пишем вот это[day_music_baz]type = 3dpath = music\day_music_baz_shuffle = rndidle = 0,0,100[night_music_baz]type = 3dpath = music\night_music_baz_shuffle = rndidle = 0,0,100В папке misc:Открываем файл script_sound_имя вашей локации.ltx (или создаём и открываем)И пропишем количество ваших милодийВот так и пишем:[list_script_sound_имя вашей локации]day_music_baz_1day_music_baz_2day_music_baz_3night_music_baz_1night_music_baz_2night_music_baz_3Открываем папки gamedata\sounds\music: (или создаём)Вот в папку music и надо вставить ваши музыкальные файлы в формате (ogg)Открыли папку music и вставили файлыday_music_baz_1.oggday_music_baz_2.oggday_music_baz_3.oggЭто и есть дневные файлы мелодийnight_music_baz_1.oggnight_music_baz_2.oggnight_music_baz_3.oggЭто и есть ночьные файлы мелодийДобавить можно сколько захотите , главное соблюдать номерацию 1,2,3,4,5,6 и.т.дВсё заходим в игру и слушаем радио . Изменено 31 Января 2017 пользователем BFG Добавлено BFG, 31 Января 2017 Под спойлер такие посты !!! Ссылка на комментарий
Это популярное сообщение. HellRatz 2 850 Опубликовано 27 Мая 2017 Это популярное сообщение. Поделиться Опубликовано 27 Мая 2017 Создание действительно бессмертных НПС. Делал на ТЧ, как в ЧН/ЗП не знаю. Возможно, там аналогично. Давно по интернету гуляют статьи и советы по созданию неубиваемого НПС: кто-то предлагает положить в основу профиль Сахарова ([npc_name]:stalker_sakharov) вместо обычного сталкера ([npc_name]:stalker), кто-то повесить в постоянный апдейт проверку story id НПСа и бесконечную установку ему здоровья, равному единице. Если второй вариант еще может сработать, хотя и хорошего в нем мало, ибо постоянно висит на апдейте (да и НПС умирают от выстрелов в голову), то вот первый не дает никакой живучести неписю. В итоге во многих модах неписи все равно умирают, даже если им подкрутили иммунитеты. Для создания действительно бессмертного НПС, как полагается, без всяких костылей, нам потребуется СДК. 1. Для начала идем по пути gamedata\config\models\capture и копируем файл, допустим, kurtka_mask_damage_no.ltx, называя его по-своему, например: npc_not_die.ltx 2. Берем нужный нам визуал НПС в формате *.object (исходник или декомпилированный заранее *.ogf файл), открываем его в Actor Editor, в поле User Data прописываем свой инклуд к свежесозданному файлу взамен старого. Например #include "models\capture\npc_not_die.ltx" 3. Затем компилируем НПС с новым путем до конфига в формат *.ogf, помещаем в свой мод. Подготовительная часть закончена. Далее работаем руками немного. 4. Открываем ранее созданный npc_not_die.ltx, находим в нем это место: [immunities] immunities_sect = no_resistance [bone_protection] bones_protection_sect = kurtka_mask_damage Зафиксировали и запомнили. 5. Работаем со строкой immunities_sect – это иммунитеты НПС к различным воздействиям. Вместо no_resistance пишем что-то свое, например - undead_resistance. Получится так: [immunities] immunities_sect = undead_resistance 6. Идем в файл immunities.ltx, копируем любую секцию с иммунитетами (ту же no_resistance) вместе со всеми строками до следующей секции, вставляем куда-нибудь ниже, так и называем – [undead_resistance] (напомню: это название прописали ранее в immunities_sect). Далее все параметры в этой секции выставляем по нулям. Сохраняем. Закрываем. 7. Работаем с bones_protection_sect – отвечает за защиту отдельных костей в скелете НПСа от внешних воздействий. Например, можно сделать голову пуленепробиваемой, ногу или живот. Для начала нам нужно задать имя будущей (!) секции живучести костей. Вместо kurtka_mask_damage пишем свое, допустим kombez_npc_undead. Получится так: [bone_protection] bones_protection_sect = kombez_npc_undead 8. Идем в файл damages.ltx. В нем вверху находим секцию для нашей работы: [body_kurtka_damage], и ниже куча строк с цифрами. Эта секция отвечает за живучесть торса и конечностей. Копируем целиком эту секцию со всеми параметрами и вставляем где-нибудь пониже, называя как душе угодно, например body_undead_npc. Затем для каждой кости в этой секции выставляем нулевое воздействие, т.е было: bip01_pelvis = 1.0, 0.15 Стало: bip01_pelvis = 0, 0 И так проделываем для всех последующих параметров (костей). 9. В том же damages.ltx ниже есть еще секции, отвечающие за живучесть головы. Возьмем для работы [head_mask_damage]. Эта секция отвечает за живучесть головы или ее отдельных элементов (например, можно сделать так, чтобы НПС умирал от попадания только в глаз ). Копируем ее по аналогии с предыдущей, вставляем где-нибудь ниже по файлу, называем по-своему, к примеру head_undead_npc. Значения также обнуляем для всех костей. 10. Спускаемся еще ниже по файлу, там находим: [kurtka_mask_damage]:body_kurtka_damage,head_mask_damage hit_fraction = 0.1 Копируем эту секцию вместе с единственным параметром, вставляем ниже и называем ее так, как придумали еще на 7 пункте урока. У меня это, напомню, kombez_npc_undead. Также обнуляем параметр hit_fraction, а после двоеточия прописываем созданные до этого секции живучести тела и головы - body_undead_npc и head_undead_npc. В итоге должно получиться нечто такое: [kombez_npc_undead]:body_undead_npc,head_undead_npc hit_fraction = 0 Игра считывает этот вариант защиты, в котором на всех «косточках» стоят нули, а следовательно, попадания по ним и привязанной к ним меши никак не засчитываются. 11. Далее открываем m_stalker.ltx, идем в самый низ и вставляем: [hum_undie]:stalker immunities_sect = stalker_immunities_hum_undie [stalker_immunities_hum_undie] burn_immunity = 0.0 ;коэффициенты иммунитета strike_immunity = 0.0 shock_immunity = 0.0 wound_immunity = 0.0 radiation_immunity = 0.0 telepatic_immunity = 0.0 chemical_burn_immunity = 0.0 explosion_immunity = 0.0 fire_wound_immunity = 0.0 wound_2_immunity = 0.0 12. И финальная стадия. Идем в спавн-секцию нашего НПС (spawn_sections.ltx), после двоеточия прописываем новый профиль hum_undie вместо stalker: [имя_нашего_нпс]:hum_undie Все. После такого НПС не умирают ни от каких воздействий (от аномалий не проверено должны выжить). Можно стрелять в любую часть тела из любого оружия, взрывать под ним гранаты, мины, динамиты – НПС выживет, ведь по всей модели хиты не учитываются. Это полезно для умирающих квестовых НПС. На первый взгляд много, но создав один раз все нужные секции, в будущем можно лишь прописывать соотв. инклуд в модель. 1 1 1 13 GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
HellRatz 2 850 Опубликовано 27 Ноября 2017 Поделиться Опубликовано 27 Ноября 2017 Оффтоп переехал в эту тему. В шапке красным по белому написано для чего эта тема и куда обращаться с вопросами. 1 GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
One Developer 0 Опубликовано 4 Марта 2018 Поделиться Опубликовано 4 Марта 2018 (изменено) Всем привет! Когда я только начинал моддинг я много не знал и мне приходилось тратить дни на поиск в оригинале и делать все под себя. А речь пойдет о том как сделать рабочую дверь, для опытных модостроителей это проше просто но это статья для новичков, опытные можете уходить тут не чего интересного не будет. Спавн двери это очень просто, приступим Чтобы заспавнить нашу дверь, надо зайти в spawn_element\physics\door После спавна, нажимаем на наш объект и жмем Enter в Custom Date пишем: Скрытый текст [collide] ignore_static ignore_ragdoll [logic] cfg = configs\scripts\chast_voinay\cha_door_kpp.ltx - здесь указан путь до нашей логики, меняем ее на нашу. ОБЯЗАТЕЛЬНО С LTX !! С сдк все, теперь с самой логикой для новичков постараюсь описать каждый параметр Скрытый текст [logic] active = ph_door@closed - Активная секция [ph_door@closed] - название секции closed = true - подтверждает что дверь будет закрыта locked = false - отвергает что дверь будет открыта on_use = ph_door@open - после конца этой секции активирует секцию под именем ph_door@open snd_open_start = trader_door_open_start - это знать не обязательно snd_close_start = trader_door_close_start - это знать не обязательно snd_close_stop = trader_door_close_stop - это знать не обязательно [ph_door@open] closed = false - все тоже самое locked = false - все тоже самое on_game_timer = 50 | ph_door@closed - через 5 секунд логика перейдет на секцию ph_door@closed snd_open_start = trader_door_open_start - это знать не обязательно snd_close_start = trader_door_close_start - это знать не обязательно snd_close_stop = trader_door_close_stop - это знать не обязательно Сохраняем, компилируем спавн и идем проверять в игре. Изменено 6 Марта 2018 пользователем HellRatz 1 Ссылка на комментарий
One Developer 0 Опубликовано 6 Марта 2018 Поделиться Опубликовано 6 Марта 2018 (изменено) Может кому и пригодиться. Скажу сразу, я скачал эти скрипты очень давно и автора не помню, просто решил залить. https://pastebin.com/HZmycLBW Изменено 6 Марта 2018 пользователем HellRatz Убрал ахтунг Добавлено HellRatz, 6 Марта 2018 Не знаю что это за чудо-юдо было на пол страницы, перетащил это все на пастебин. Остальные посты не понятно к чему - снес. Ссылка на комментарий
Ali_Babai_45 19 Опубликовано 11 Марта 2018 Поделиться Опубликовано 11 Марта 2018 Внесу свою толику. Карты локаций из СГМ 2.2 Смарты на картах пронумерованы, описание и координаты записаны в текстовиках. Может пригодиться для модов на основе СГМ или чистой ЗП (смарты на локациях из ЗП точно не изменялись) для настройки телепортов и заселения локаций. Скачать 1 Ссылка на комментарий
Угол 136 Опубликовано 30 Марта 2018 Поделиться Опубликовано 30 Марта 2018 Нашел урок по переносу аномалий из модов. https://www.youtube.com/watch?v=ppMzi9QjQGI Ссылка на комментарий
Гость Опубликовано 29 Мая 2018 Поделиться Опубликовано 29 Мая 2018 В 23.07.2013 в 11:12, Сталкер Лом сказал: Так что новой вкладки мы не получим - только кнопочка. Даже не расскажу, как это окно сделать, т.к. я пробовал и у меня, пока, ничего не вышло. Будем пытаться, а пока - всё. Скажите пожалуйста, ув. Сталкер Лом, появилось ли какое-либо решение данной проблемы (добавление gui поверх предыдущего в пда) до сегодняшнего дня? Если да, был бы очень признателен узнать об этом подробнее. А также хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры. Заранее спасибо. Ссылка на комментарий
Сталкер Лом 356 Опубликовано 30 Мая 2018 Поделиться Опубликовано 30 Мая 2018 17 часов назад, Den “Angry Wolf” Koslov сказал: ...хотелось бы узнать, что именно было изменено проектом xray extentions в исходном коде игры В дополнении к тому, что я вам черканул в ЛС Сам я правку не смотрел, но, предполагаю, что в движке подправились данные о количестве правок и, по большому счёту, всё. Эти правки очень старые. Может быть, сегодня уже есть что-то посерьёзнее увеличения количества (а не функционала) вкладок, но я не знаю - давно уже этой темой не интересовался. Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
DarkSnowder 900 Опубликовано 30 Августа 2018 Поделиться Опубликовано 30 Августа 2018 Внесу свою скромную лепту в пользу новисам и не только:) Скрытый текст Наверное многие из вас знают, что в ваниле На свалке и Арм. складах сталкеры часто помирали в кострах, в связи с чем такие песы как бес, волк и юрик покидали нас:( Так вот, чтобы этого не было, надо сделать следующее: 1. Распаковать all.spawm или открыть уровень в level editor-e 2. Найти среди спавн объектов space_restrictor-ы с именем camp_fire_номер. 3. Смотрим и видим (restrictor_type = 3)!!! В чём суть спрсите вы?. А вот в чём - в игре есть несколько типов рестрикторов и всё они имеют разную функцию (инфа взята с сайта http://stalkerin.gameru.net. Скрытый текст Чтобы не потерялось пишу сюда типы рестрикторов. Тип рекстриктора можно указать при спавне в переменной restrictor_type restrictor_type = 0 ;eDefaultRestrictorTypeOut restrictor_type = 3 :eRestrictorTypeNone Эти два типа - простые рестрикторы. В чем их отличие - непонятно. "restrictor_type = 0" - в зоне этого рестриктора нпс не подчиняются логике просто будут стоять на месте, лучше этот тип вообще не использовать restrictor_type = 1 ;eDefaultRestrictorTypeOut restrictor_type = 5 ;eRestrictorTypeOut Эти два типа имеют смысл для движка и подразумевают собой зону, откуда нельзя выйти. В природе не встречается restrictor_type = 2 ;eDefaultRestrictorTypeIn restrictor_type = 4 ;eRestrictorTypeIn Эти два типа имеют смысл для движка и подразумевают собой зону, куда нельзя войти. Такими зонами накрывают костры и арену в баре И помните IN и OUT рестрикторы (типы 1,2,4,5) имеют смысл только для НПС Как вы уже прочли, костер накрыт не тем рестриктором. 4.Меняем restrictor_type с 3 на 2 (или в редакторе ставим IN defoult resrtictor). 5. Пакуем спавн и вуаля! - стакеры в костре не мрут!!!!:D Главное, чтобы рестриктор был достаточно большим,чтобы накрыть костёр и область вокруг него, дабы в случае толкучки боты не затолкали себя в костёр сами. Всем удачи в создании лагерей и посиделок у костра;) Добавлено HellRatz, 4 Сентября 2018 А почему бы просто не убрать урон от костра в конфиге в одной строке (ну или паре) ? 1 2 Лучше сделать мод с 0, чем пытаться залатать багованный. Ссылка на комментарий
UriZzz 1 004 Опубликовано 25 Января 2019 Поделиться Опубликовано 25 Января 2019 Скрытый текст Всем привет! В этой теме есть замечательный скрипт на пост-эффект при критическом попадании за авторством АМК Team. У этого скрипта есть один недостаток: проблема в том, что скрипт порой срабатывает с запозданием где-то в полсекунды (или около того) после получения хита, смотрится ужасно. Я думаю (поправьте если ошибаюсь), это из-за того, что скрипт повешен на апдейт и скорость срабатывания зависит от частоты апдейта. Чтобы решить эту проблему без какой-нибудь скриптовой чёрной магии, придётся править движок. Спокойно, никаких тут разборов языка C++ не будет, обойдёмся без взрыва мозга и воспользуемся самым доступным вариантом - X-Ray extensions. Скачать последнюю сборку от @НаноБот можно отсюда. Конкретно нам нужен коллбэк на хит актора, в чистом движке ТЧ его нет, зато он есть в XRay ext и в большинстве сборок седьмого патча. С помощью xray ext пропатчиваем (мудрить с коррекшен листом не обязательно, достаточно пропатчить на дефолтных настройках) файл xrGame.dll (он уже есть в 230й сборке), кидаем dllку в папку bin в корне игры и подтверждаем замену (внимание! Сохраните резервную копию чистой dllки где-нибудь во избежание возможных проблем). Итак, мы имеем пропатченный двигло, но этого мало. Прежде чем использовать коллбэк, его ещё нужно активировать. Для этого нам понадобится файл bind_stalker.script из распакованных ресурсов игры. Открываем его тестовым редактором и среди всего безобразия ищим вот такую строчку: function actor_binder:reinit() Ниже видим такие строки: self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) Это доступные коллбэки. В самом низу этого списка пишем self.object:set_callback(callback.hit, self.actor_hit_callback, self) -- хит актору это новоиспечённый коллбэк. Далее ищем: function actor_binder:net_destroy() И ниже: self.object:set_callback(callback.inventory_info, nil) self.object:set_callback(callback.article_info, nil) self.object:set_callback(callback.on_item_take, nil) self.object:set_callback(callback.on_item_drop, nil) --self.object:set_callback(callback.actor_sleep, nil) self.object:set_callback(callback.task_state, nil) self.object:set_callback(callback.level_border_enter, nil) self.object:set_callback(callback.level_border_exit, nil) self.object:set_callback(callback.take_item_from_box, nil) И в самом низу этого списка дописываем: self.object:set_callback(callback.hit, nil) Сие есть отрегистрация коллбэка. Далее где-нибудь среди функций, например под: function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end ... end Пишем как-то так: function actor_binder:actor_hit_callback(obj) effect_blood.wounded_pp_update() -- это файл скрипта пост- эффекта и функция пост-эффекта в нём end Ииии всё! Теперь, когда мы повесили скрипт на коллбэк хита автору, он: А. Не будет постоянно висеть на апдейте а срабатывать только когда ГГ получает по щам. Б. Будет срабатывать мгновенно при крит.хите. Приятной игры. (Принцип активации коллбэка подсмотрен в ОГСЕ) 3 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Сталкер Лом 356 Опубликовано 1 Февраля 2019 Поделиться Опубликовано 1 Февраля 2019 Просьба к куратору темы заменить в этом посте ссылку на энциклопедию. Вот: https://yadi.sk/d/OzLu-NeoeAFaY Добавлено Murarius, 1 Февраля 2019 Готово. 1 1 Работы на Artstation - https://www.artstation.com/artist/stalker_lom Ссылка на комментарий
UriZzz 1 004 Опубликовано 4 Октября 2019 Поделиться Опубликовано 4 Октября 2019 (изменено) Товарищи - скриптеры, помогите разобраться со скриптом. В проблема с одним из примеров от @amik, Скрытый текст local obj = alife():story_object( 6 ) -- 6 - сид Волка local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end Вызываем: function add_spot_on_map2(obj_id,type,text) имя_файла.add_spot_on_map(obj.id,"green_location","Текст") end Метку можно убрать вот так: local obj = alife():story_object( 6 ) local obj_id = obj.id function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then level.map_remove_object_spot(obj_id, type) end end эту вызывать: function remove_spot() this.remove_spot_from_map(obj.id,"green_location") end Во первых в функциях вызова допущена ошибочка - аргумент obj.id точку нужно заменить на видимый пробел, иначе будет вылет с руганью на index global 'obj'. Во вторых, скрипт работает но метку вешает по чему-то на гг, а не на того на кого хочу повесить - на Толика, в чём причина? Рассматриваю код уже пол часа и не понимаю в чём причина, функции простые как автомат Калашникова, всё вроде правильно... Изменено 4 Октября 2019 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
naxac 2 445 Опубликовано 11 Октября 2019 Поделиться Опубликовано 11 Октября 2019 (изменено) @UriZzz, вот так попробуй function add_spot() local sid = 6 local obj = alife():story_object(sid) if obj then level.map_add_object_spot_ser(obj.id, "blue_location", obj:name()) else get_console():execute("load ~~~ object with story_id "..tostring(sid).."not found") end end -------------------- function remove_spot() local sid = 6 local obj = alife():story_object(sid) if obj then level.map_remove_object_spot(obj.id, "blue_location") else get_console():execute("load ~~~ object with story_id "..tostring(sid).."not found") end end Вместо sid пишешь нужный story_id. Изменено 11 Октября 2019 пользователем naxac 1 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
misterok21 2 Опубликовано 26 Мая 2020 Поделиться Опубликовано 26 Мая 2020 Spoiler Этот код: -- проверяндус есть ли у нас жертва обстоятельств if victim ~= nil then local whocls = get_clsid(who) monster_classes = { [clsid.bloodsucker_s] = "неудачно подошёл к кровососу", [clsid.boar_s] = "неудачная охота на кабана", [clsid.dog_s] = "загрызён собакой", [clsid.flesh_s] = "неудачная охота на плоть", [clsid.pseudodog_s] = "загрызён псевдособакой", [clsid.burer_s] = "нарвался на бюрера", [clsid.cat_s] = "кошка перебежала дорогу", [clsid.chimera_s] = "нарвался на химеру", [clsid.controller_s] = "стал зомби и умер", [clsid.poltergeist_s] = "полтергейст", [clsid.gigant_s] = "растоптал псевдогигант", [clsid.zombie_s] = "попрощался с мозгами", [clsid.snork_s] = "неудачно нашёл снорка", [clsid.tushkano_s] = "умер от стаи тушканов", [clsid.psy_dog_s] = "загрызён пси собакой", [clsid.psy_dog_phantom_s] = "загрызён пси собакой" } local death_komment = { "Ещё один...", "Мдя, ни дня без этого.", "Одним больше, одним меньше...", "Все там будем", "Помянуть надо бы...", "Зона тебе пухом.", "Был пацан, не стало пацана" } -- -- -- victim_name - имя жертвы -- killer_name - имя убивайца -- killer_comm - групировка убивайца -- victim_comm - групировка жертвы -- -- local m_game_vertex = who:game_vertex_id() local lvert = game_graph():vertex(m_game_vertex) local lid = lvert:level_id() local mlevel = alife():level_name(lid) local m_s_level = mlevel local victim_name = victim:character_name() local killer_name = who:character_name() local victim_comm = victim:character_community() local killer_comm = nil if IsStalker(who) then if killer_name == victim_name then killer_name = "аномалия" killer_comm = "monster" else killer_comm = who:character_community() -- Чтобы показывать имя, кто убил удали строку ниже killer_name = "пулевое ранение" end else killer_comm = "monster" if whocls ~= nil then killer_name = monster_classes[whocls] end end if killer_comm ~= nil then if killer_name == nil then -- это если имя убийцы неизвестно или мутантик какой неизвестен killer_name = "%c[230,255,0,0][DATA DELETED]" end local m_text_kill_string="Умер сталкер "..victim_name.."\\nЛокация: "..game.translate_string(m_s_level).."\\nПричина смерти: "..killer_name local news_text = "%c[230,255,128,64]"..m_text_kill_string local news_caption = game.translate_string("DeadMans") local texture = "ui_iconsTotal_weapons" local shans = math.random(1,100) db.actor:give_game_news(news_caption, news_text, texture, 2*1000, 2*1000) if shans > 70 then local dead_news = death_komment[math.random(table.getn(death_komment))] db.actor:give_game_news(game.translate_string("Анонимное сообщение"), dead_news, "ui_iconsTotal_grouping", 5*1000, 5*1000) end end end вставляем в файл gamedata\scripts\xr_motivator.script после строки function motivator_binder:death_callback(victim, who) Примечание: в данном виде функция предназначена для старших платформ: ЧН, ЗП. Для работы на платформе ТЧ участок кода, в котором производится выдача новостных сообщений, следует привести к следующему виду: if killer_comm ~= nil then ... local task_texture, task_rect = get_texture_info("ui_iconsTotal_weapons") local news_text = news_caption .. "%c[230,255,128,64]" .. m_text_kill_string db.actor:give_game_news(news_text, task_texture, task_rect, 5*1000, 5*1000) if shans > 70 then local task_texture, task_rect = get_texture_info("ui_iconsTotal_grouping") local dead_news = dead_caption .. death_komment[math.random(table.getn(death_komment))] db.actor:give_game_news(dead_news, task_texture, task_rect, 5*1000, 5*1000) end end Где: news_caption = '...', dead_caption = '...' - соответствующие строковые заголовки для типов сообщений (кто погиб и комментарии). 2 Ссылка на комментарий
Ruwar 148 Опубликовано 3 Октября 2020 Поделиться Опубликовано 3 Октября 2020 На тему дизайна освещения и визуальных приемов получения сочной картинки DEAD AIR 1.0 капитан Графоний в деле 1 1 Ссылка на комментарий
Это популярное сообщение. Lieutenant Novikov 15 Опубликовано 6 Ноября 2021 Это популярное сообщение. Поделиться Опубликовано 6 Ноября 2021 Всем привет! В интернете легко найти уроки по созданию группировки в Сталкер ТЧ и ЗП,(хотя в первом случаи они неполные), а про ЧН ничего нет, а способ создания группировки в этой части, имеет некоторые свои особенности. В этом уроке я разберу создание группировки + восстановление уже имеющихся, но "неполноценных" (экологи, военные, Монолит и наёмники). Что-ж начнем. Скрытый текст В файле: game_relations.ltx: В строчке communities в конце дописываем свою группировку: communities = actor, 0, actor_bandit, 1, actor_dolg, 2, actor_freedom,3, actor_stalker, 4, arena_enemy, 5, bandit, 6, csky, 7, dolg, 8, ecolog, 9, freedom, 10, killer, 11, army, 12, monolith, 13, monster, 14, stalker, 15, trader, 16, zombied, 17, actor_csky, 18, renegade, 19, ваша группировка, 20 Далее в таблицу под названием [communities_relations] добавляете свою группировку и отношения к другим (1000 и выше-друг,0-нейтрал,-1000 и ниже-враг), не забывайте прописывать как с правой стороны так и наверху. [actor_communities] можете прописать, если в группировку планируется вступление. Через запятую перечислены параметры войны группировок, первая ваша группировка, вторая группировка-враг (параметр "actor, actor" значит что вы в войне группировок не участвуете) (небольшое примечание, если вы пишите что-то необычное, например, "ваша группировка, бандиты", или "наёмники, Свобода", то надо ещё редактировать файл pda.script, но в этом уроке я его разбирать не буду, так сам его не редактировал). [communities_sympathy] коэффициенты "сочувствия" можно скопировать с другой. [monster_relations] таблица отношений между мутантами, там все так как и в [communities_relations]. Можете добавить свою группировку и прописать нейтралитет к определенным мутантам. Скрытый текст Открываем любой character_desc_... и создаем профили, аналогично этому примеру: <!-- ecolog novice --> <specific_character id="sim_default_ecolog_0_default_0" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_0</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>300</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog</visual> <supplies> [spawn] \n device_torch \n wpn_walther \n ammo_9x19_pbp = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <specific_character id="sim_default_ecolog_0_default_1" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog_military</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_0</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>300</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog_military</visual> <supplies> [spawn] \n device_torch \n wpn_sig220 = 1 \n ammo_11.43x23_fmj = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <!-- ecolog expirienced --> <specific_character id="sim_default_ecolog_1_default_0" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_1</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>400</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog</visual> <supplies> [spawn] \n device_torch \n wpn_mp5 \n ammo_9x19_fmj = 1 \n wpn_walther \n ammo_9x19_fmj = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <specific_character id="sim_default_ecolog_1_default_1" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_1</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>400</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog</visual> <supplies> [spawn] \n device_torch \n wpn_ak74u \n ammo_5.45x39_fmj = 1 \n wpn_walther \n ammo_9x19_fmj = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <specific_character id="sim_default_ecolog_1_default_2" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog_military</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_1</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>400</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog_military</visual> <supplies> [spawn] \n device_torch \n wpn_mp5 \n ammo_9x19_fmj = 1 \n wpn_walther \n ammo_9x19_fmj = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <!-- ecolog veteran --> <specific_character id="sim_default_ecolog_2_default_0" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_2</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>600</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog</visual> <supplies> [spawn] \n device_torch \n wpn_l85 \n ammo_5.56x45_ss190 = 1 \n wpn_walther \n ammo_9x19_fmj = 1 \n grenade_rgd5 = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <specific_character id="sim_default_ecolog_2_default_1" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog_military</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_2</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>600</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog_military</visual> <supplies> [spawn] \n device_torch \n wpn_lr300 \n ammo_5.56x45_ss190 = 1 \n wpn_sig220 = 1 \n ammo_11.43x23_fmj = 1 \n grenade_rgd5 = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> <specific_character id="sim_default_ecolog_2_default_2" team_default = "1"> <name>GENERATE_NAME_science</name> <icon>ui_npc_u_stalker_ecolog_military</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_ecolog_2</class> <community>ecolog</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_03\ecolog\</snd_config> <rank>600</rank> <reputation>0</reputation> <visual>actors\stalker_ucheniy\stalker_ecolog_military</visual> <supplies> [spawn] \n device_torch \n wpn_ak74 \n ammo_5.45x39_fmj = 1 \n wpn_walther \n ammo_9x19_fmj = 1 \n grenade_rgd5 = 1 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" #include "gameplay\character_dialogs.xml" </specific_character> Далее открываем файл npc_profile.xml и пишем в нём к примеру: <!-- sim ecolog --> <character id="sim_default_ecolog_0"> <class>sim_default_ecolog_0</class> </character> <character id="sim_default_ecolog_1"> <class>sim_default_ecolog_1</class> </character> <character id="sim_default_ecolog_2"> <class>sim_default_ecolog_2</class> </character> Далее файл spawn_sections_general.ltx ;***** sim ecolog ***** [sim_default_ecolog_0]:stalker $spawn = "respawn\sim_default_ecolog_0" character_profile = sim_default_ecolog_0 spec_rank = regular community = ecolog [sim_default_ecolog_1]:stalker $spawn = "respawn\sim_default_ecolog_1" character_profile = sim_default_ecolog_1 spec_rank = experienced community = ecolog [sim_default_ecolog_2]:stalker $spawn = "respawn\sim_default_ecolog_2" character_profile = sim_default_ecolog_2 spec_rank = veteran community = ecolog Всё. Скрытый текст В нем к примеру пишем:(после ;— пояснение копировать не надо) [settings];— дополнительные отряды за захват контрольных точек. glory_0 = 0 glory_1 = 1 glory_2 = 2 glory_3 = 3 glory_4 = 4 glory_5 = 5 [spawn_by_resource];— какие профили спаунятся в зависимости от ресурсов (ресурсы дают ресурсные точки, например АТП), и их процентное взаимоотношение. 0 = sim_default_ecolog_0, 80, sim_default_ecolog_1, 20 1 = sim_default_ecolog_0, 60, sim_default_ecolog_1, 30, sim_default_ecolog_2, 10 2 = sim_default_ecolog_0, 30, sim_default_ecolog_1, 50, sim_default_ecolog_2, 20 3 = sim_default_ecolog_1, 50, sim_default_ecolog_2, 50 [spawn_by_level];— какие профили спаунятся на локации(?) Честно не заметил их влияние на что либо. marsh = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 escape = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 garbage = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 darkvalley = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 agroprom = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 yantar = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 red_forest = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 military = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 limansk = sim_default_ecolog_0, 40, sim_default_ecolog_1, 30, sim_default_ecolog_2, 30 [expansion_base] base_squad_number = 0 precondition_power = -1 ;— не совсем понял что это, но важно именно это число, или не будет спама respawn_idle_time = 75 respawn_hours = 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 ;— время суток когда происходит респам бойцов группировки [expansion_0]:expansion_base precondition_cond = {+fc_disable_story_line_quest} true, false ;— предварительное условие (мое не копируйте, то если у вас Faction commander), задается чтобы группировка не начала симуляцию раньше времени, к примеру чтобы бандиты и сталкеры не начали воевать с самого начала игры, пока Шрам ещё на Болоте, им задано такое условие {+esc_take_habar_complete}, то бишь начало войны после возвращения хабара Сидоровичу. sim_prior = prior_0 [expansion_1]:expansion_base base_squad_number = 15 ;— базовое количество сквадов на этом этапе войны группировок precondition_power = 0.3 precondition_target = yan_smart_terrain_6_4 ;— смарт-террейн(ы) которые группировка будет пытаться захватить на этом этапе [expansion_2]:expansion_base base_squad_number = 20 precondition_target = yan_smart_terrain_5_3 [expansion_3]:expansion_base base_squad_number = 25 precondition_target_optional = yan_smart_terrain_zombi_in_sci_base6, yan_smart_terrain_4_5 [expansion_4]:expansion_base base_squad_number = 30 precondition_target_optional = yan_smart_terrain_3_4 [expansion_5]:expansion_base base_squad_number = 35 precondition_target_eliminate = yan_smart_terrain_zombi_in_sci_base5 [start_position];— отряды группировки, которые будут находиться на заданном смарт-террейне с самого начала игры. ;red_squad_test_in_sci_base = red_smart_terrain_3_2 ;red_squad_test_in_sci_base2 = red_smart_terrain_3_2 Скрытый текст Далее файл sim_board.script добавляем под "--' Активность группировок по времени суток. В таблицах забито повышение за 1 час ожидания." Вашу группировку, либо экологов, остальные там есть. Следующий файл death_manager.script строчка function init_drop_settings() local community_list = { "stalker", "dolg", "freedom", "renegade", "bandit", "army", "zombied", "ecolog", "killer", "monolith", "csky", "actor_dolg" , "arena_enemy", "ваша группировка" } Далее файл death_items_by_communities.ltx [ecolog]:stalker ;— первое ваша группировка ;Еда ;— вообщем-то можно любые вещи прописать vodka = 0.01 medkit = 0.1 medkit_scientic = 0.2 antirad = 0.3 Скрытый текст sim_defend_smart_ecolog sim_defend_smart_delay_ecolog sim_capture_smart_ecolog sim_eliminate_smart_ecolog sim_eliminate_resource_smart_ecolog sim_eliminate_path_smart_ecolog [sim_defend_smart_ecolog]:sim_defend_smart faction = ecolog reward_money = {~50} 3000, 2500 ;— денежная награда reward_item = {~50} grenade_f1:ammo_5.45x39_ap:ammo_5.45x39_ap, medkit_scientic:medkit_scientic:antirad:antirad ;— награда вещами prior = 5 [sim_defend_smart_delay_ecolog]:sim_defend_smart_delay faction = ecolog (Награда-приоритет по шаблону предыдущего) [sim_capture_smart_ecolog]:sim_capture_smart faction = ecolog (Награда-приоритет) [sim_eliminate_smart_ecolog]:sim_eliminate_smart faction = ecolog (Награда-приоритет) [sim_eliminate_resource_smart_ecolog]:sim_eliminate_resource_smart faction = ecolog (Награда-приоритет) [sim_eliminate_path_smart_ecolog]:sim_eliminate_path_smart faction = ecolog (Награда-приоритет) Всё теперь задания по защите/нападению/и т.д. смартов готовы, правда давать их будет редко, если вы насколько я понял, не состоите в группировке, только если без вашей помощи ни как. Также общие для всех группировок задания (найти пулемет в Рыжем лесу и т.п.), будут автоматически выдаваться и вашей группировкой. Скрытый текст Выбираете локацию на которой будет база вашей группировки alife_....ltx, если создаете новую группировку или восстанавливаете Экологов то в конце файла пишите (для наёмников, Монолита и Армии не нужно, у них уже есть): [11568];— номер по порядку ; cse_abstract properties section_name = sim_faction name = yan_sim_faction_ecolog ;— ваше название position = 14.6198530197144, -11.9344539642334, -266.481781005859;— скорее всего sim_faction можно в любом месте ставить, но я ставил в районе смарт-террейна где будет спауниться моя группировка, для надежности. direction = 0, 0, 0 ;— направление взгляда, можно написать нули id = 65535 version = 124 script_version = 8 spawn_id = 8639 ;— по порядку ; cse_alife_object properties game_vertex_id = 792 ;— вместе с координатами distance = 3.5 level_vertex_id = 331462 ;— вместе с координатами object_flags = 0xffffff3e custom_data = <<END [faction] name = ecolog ;— название группировки base_smart = yan_smart_terrain_6_4 settings = misc\faction_ecolog.ltx ;— адрес файла faction_..., который мы создали ранее. END ; cse_shape properties shapes = 1 shape_0:type = sphere shape_0:offset = 0,0,0 shape_0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_sim_faction properties last_spawn_time = 255 squad_target_cache = random_tasks = current_attack_quantity = squads = 0 Дальше ищите подходящий смарт-террейн в котором будет база группировки и прописываете в нем (я для примера взял Холл Завода в ТД, где подземная лаборатория и где спаунятся наёмники): [9135] ; cse_abstract properties section_name = smart_terrain name = val_smart_terrain_1_2 position = 158.19631958008, -0.72822391986847, -260.88854980469 direction = -0.0116630000993609, 6.90000015310943e-005, 0.00593400001525879 id = 65535 version = 124 script_version = 8 spawn_id = 4838 ; cse_alife_object properties game_vertex_id = 815 distance = 28 level_vertex_id = 329923 object_flags = 0xffffff3e custom_data = <<END [smart_terrain] targets = val_smart_terrain_9_6, val_smart_terrain_8_7, val_smart_terrain_8_9 sim_type = default ;— можете прописать base, тогда этот смарт станет базой вашей группировки, она должна быть одна на всю Зону. sim_value = 3 squad_capacity = 5 sim_avail = {-val_strike_antenna_two_captured +val_destroy_killer_base_done} false, true ;— предполагаю что условия отключения респама squad_id = 3 att_restr = val_smart_terrain_1_2_attack def_restr = val_smart_terrain_1_2_defence respawn_sector = {+val_deliver_pda_done} killer;— прописываем эту строчку, {+val_deliver_pda_done} — означает предварительное условие, как мы уже разобрали выше, если убрать, отряды заспаунятся с самого начала игры, killer — название группировки. Точек респама может быть много, на разных смартах. actor_hides= val_vibros..... ;(там идет дальше, не копирую все запись) Скрытый текст Ну и последнее, если вы прописали вашей группировке квесты, то нужно прописать того кто будет награду выдавать. Вы можете создать нового НПС, или же прописать уже существующему, как я профессору Сахарову к примеру: [11470] ; cse_abstract properties section_name = stalker_sakharov name = yan_stalker_sakharov position = 27.9391098022461, -11.7167835235596, -272.380462646484 direction = 0, 0, 0 id = 65535 version = 124 script_version = 8 spawn_id = 8654 ; cse_alife_trader_abstract properties money = 5000 character_profile = yan_stalker_sakharov ; cse_alife_object properties game_vertex_id = 1312 distance = 0.69999999 level_vertex_id = 72763 object_flags = 0xffffffbb custom_data = <<END [logic] cfg = scripts\yantar\yan_saharov.ltx [task_manager] ;— вот эти две строчки, вместо ecolog можете свою группировку reward = ecolog [spawn] hand_radio = 1 END и т.д.... Ну в соответствующем профиле НПС дописываем диалог награды, пример: <specific_character id="yan_stalker_sakharov" team_default = "1"> <name>yan_st_sakharov_name</name> <icon>ui_npc_u_ucheniy_1</icon> <map_icon x="1" y="0"></map_icon> <bio></bio> <class>yan_stalker_sakharov</class> <community>ecolog</community> <terrain_sect>sakharov_terrain</terrain_sect> <snd_config>characters_voice\human_01\stalker\</snd_config> <rank>400</rank> <reputation>0</reputation> <money min="20000" max="50000" infinitive="1"/> <visual>actors\stalker_ucheniy\stalker_ucheniy_1</visual> <crouch_type>0</crouch_type> <supplies> [spawn] \n hand_radio = 1 \n #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_1.xml" <start_dialog>yan_scientist_hello_dialog</start_dialog> <actor_dialog>yan_scientist_go_diggers</actor_dialog> <actor_dialog>yan_scientist_about_strelok</actor_dialog> <actor_dialog>yan_scientist_about_stalkers</actor_dialog> <actor_dialog>yan_scientist_about_zombie</actor_dialog> <actor_dialog>yan_scientist_bring_documents</actor_dialog> <actor_dialog>tm_reward_task</actor_dialog> ;— вот этот <actor_dialog>treasure_dialog</actor_dialog> </specific_character> Вроде всё, не забудьте, если создаете новую группировку приписать диалог медпомощи в dialog_manager.ltx, а то будет вылет при помощи раненым, ну можете свои диалоги прописать. Надеюсь, урок кому нибудь пригодиться, хотя я сам не обладаю большим опытом, по идеи ошибок быть не должно. 6 Ссылка на комментарий
Это популярное сообщение. Painter 3 373 Опубликовано 19 Ноября 2021 Это популярное сообщение. Поделиться Опубликовано 19 Ноября 2021 (изменено) Скрытый текст Небольшая памятка по изменению направления взгляда ГГ при помощи вызова: local dir = vector():set(X,Y,Z) db.actor:set_actor_direction(dir:getH()) Где X, Y, Z: 0,0,0 - происходит разворот игрока строго на север; 1,0,0 - на запад; -1,0,0 - на восток; 0,0,-1 - на юг; 1,0,-1 - на юго-запад; -1,0,1 - северо-восток; 1,0,1 - северо-запад; -1,0,-1 - юго-восток. Изменено 19 Ноября 2021 пользователем Painter 14 Портфолио Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти