-
Публикаций
4 512 -
Зарегистрирован
-
Посещение
-
Победитель дней
109
Тип контента
Профили
Форумы
Блоги
Календарь
Новости
Моды
Весь контент Hardtmuth
-
Название: Народная Солянка 2016 Платформа: Тень Чернобыля | Патч: 1.0004 или 1.0006 Разработчик: Arhara Дата выхода: 30 Апреля, 2017 г. Дополненная Народная солянка с новыми локациями и финалом сюжетной линии. Игровой мир мода раскинулся более, чем на три десятка игровых уровней, а геймплей игры был кардинально расширен и доработан. Новая сюжетная линия поведает игрокам новые истории и предложит сотни новых заданий.
-
Вероятнее всего, никто и не найдёт, откуда эти ноги, кроме официальных ребят с движка. Однако, как заметил наш модератор @AziatkaVictor, редактор загружается отдельно от основной странице, т.е. после загрузки самой страницы. И после этого возникла мысль, что иногда редактор может непрогружаться, ибо все ресурсы интернета юзера направлены на загрузку сайта и прочего, а на редактор не хватает (просто личная мысль). Я, поскольку у меня слабый интернет и я гружу его постоянно до самого максимума, ежедневно, несколько раз (иногда и более) встречаю эту проблему что на форуме в редакторе, что при написании статуса на странице профиля. Для меня это обычное дело, что встречается эта проблема. Было бы очень круто, если бы разработчики поработали над редактором и решением этой проблемы, если нашли причины её появления. Будем ждать и надеяться на лучшее. Кстати, небольшой личный вопрос (для личного развития и утолить интерес). Как думаете, в случае переноса сайта на новую версию, это как-то появлияет на него? Например, в плане отказа некоторых нестандартных скриптов, установленных к сайту? Так, чисто взгляд со стороны.
-
[SoC] Система постепенной регенерации жизни Автор статьи: Fireman3000 Дополнил: Darkscape А так же спасибо: Lurk моду и ABC. Статья взята из: stalker inside Для начала создадим скрипт. Например health_effect.scripts: Теперь создаёте скрипт abc_medkit.script: Лезем в bind_stalker.scripts: Далее идем в файл config\misc\items.ltx:
-
[SoC] Телепортация через скрипт
Hardtmuth опубликовал тема в Уроки, вопросы и советы по созданию модов
[SoC] Телепортация через скрипт Функция доступна только для Тень Чернобыля, в остальных сериях наблюдаются вылеты! Создаем скрипт, в него вставляем: Телепортация: Функция телепортации: function poleteli() create_level_changer(20101, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), 10193, 2437, vector():set(66.210,15.040,4.250), vector():set(0.0, 0.0, 0.0), "l12u_sarcofag", 1) end Функция удаления: function delete_poleteli() -- функция удаления(если нужно) local sim = alife() local se_obj = sim:story_object(20101) if se_obj then sim:release(se_obj, true) end local actor = db.actor end Информация: 20101 - STORY_ID нового level_changer 10193 - level_vertex_id 2437 - game_vertex_id vector():set(66.210,15.040,4.250) - координаты vector():set(0.0, 0.0, 0.0) - направление взгляда актёра "l12u_sarcofag" - название локации Функцию телепортации, можно вызывать любым способом. -
[SoC] Урок по созданию respawn монстров Автор: ins33 Рано или поздно, каждый модостроитель задаётся вопросом респавна. Как и все, я не исключение. Первые пробы, создать респавнер, увенчались частичным успехом. О не удаче, читайте в коце поста. Помучив респавнер пару дней, я отложил сие занятие, на дальнюю полку. И вот пришло время, но на сей раз, мне надо было заспавнить мобов. И это оказалось на порядок проще! И так, приступим: Первое, что необходимо запомнить: Респавнер срабатывает, при условиях: 1) Есть свободная работа в смарте. 2) Секции респавнера, совпадают с секциями смарта. 3) Соблюдены условия работы респавнера: conditions Для начала создадим смарт, с одной работай: В папку ACDC\all создадим alife_l01_escape_test.ltx и way_l01_escape_test.ltx. Сделаем это для удобства, при запаковке, всё добавленное окажется в файлах локации, куда это добавляется. В acdc\all\all.ltx добавим alife_l01_escape_test.ltx, и way_l01_escape_test.ltx. В alife_l01_escape_test.ltx добавим смарт: Смарттерей, мы создали, добавим моба для этого смарта: Зверушка есть, добавим пути. Откроем way_l01_escape_test.ltx: Теперь, нам надо создать логику, и условия работы. Для этого создадим gamedata\config\misc\gulag_escape_test.ltx. В gulag_task.ltx зарегистрируем новый гулаг #include "gulag_escape_test.ltx" и напишем в gulag_escape_test.ltx простую логику: Логику, написали, теперь добавим условие. Создадим скрипт gulag_escape_test.script, зарегистрируем его в xr_gulag.script добавив в level_gulags = {*, gulag_escape_test}. В gulag_escape_test.script пропишем: Сделали. Тепрь у нас есть смарт с одной зверушкой. Давайте проверим, работате ли наш смарт? Загрузим игру, и прогуляемся в сторону вагончика на предбаннике, рядом с раненым. С кабанчиком познакомились, давайте добавим респавнер. В alife_l01_escape_test.ltx добавим: Респавнер, сделали. Теперь, было бы здорово, не ждать когда он сам сработает, а заставить сработать его, когда нам это надо. Для этого сделаем спейсрестриктор? Рядом с входом в бункер Сидоровича, который и вызовет респавнер: Собираем all.spawn начинаем НИ, идём убиваем кабана, возвращаемся к входу в бункер, спускаемся по лестнице, и идём обратно, к смарту кабана. Поздравляю, вы сделали респавнер Домашнее задание:
-
Как заставить НПС смотреть в заданную точку Автор: Jоhann Что бы НПС стоял на месте можно использовать логику walker и чтобы он смотрел в заданную точку. Снимаем координаты где он стоит, пишем их в all.spawn и сдесь. И снимаем координаты куда он смотрит, в какую точку: [logic] active = walker [walker] path_walk = название точки где стоит нпс path_look = название точки куда смотрит нпс Это пишем в way_***.ltx в распакованом all.spawn. Координата, где стоит НПС, должна быть такой же, что и писали в самом alife_**.ltx: [название точки где стоит нпс] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -258.846771,-17.546392,-127.127708 ; ваши координаты p0:game_vertex_id = 934 ; ваши гаме вертексы p0:level_vertex_id = 8288 ; ваши левел вертексы [название точки куда смотрит нпс] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -256.672241,-17.875896,-127.18396 ; ваши координаты p0:game_vertex_id = 934 ; ваши гаме вертексы p0:level_vertex_id = 9137 ; ваши левел вертексы
-
Справочник по функциям и классам Такая тема уже давно существует на АМК форуме, и курирует ее malandrinus, но по выводам из ответов/вопросов в теме Модострой: Вопросница (и не только), я понял, что у многих не доходят руки покопать в интернете и найти всем известный АМК форум... потому решил создать такую же тему, здесь... Но так как там вся информация идет не организована и в разброс, здесь я сделаю всю информацию в шапке темы и под спойлерами: Слова автора темы на AMK: Оглавление Основы: Класс alife_simulator. Базовые операции с серверными объектами: Пространства имён. Глобальные функции для большого числа задач: Вступление: Безымянное пространство имён: Пространство имён game: Пространство имён level:
-
Как заспавнить физический объект Автор: KitkaT.Net Редактирование: Pihan13 В этой статье вы узнаете как создать спавнящийся физический объект. Выбираем нужную модель из папки gamedata\meshes. Создаем в файле misc\items.ltx (или своем конфиге) новую секцию, которая будет выглядеть так: [vedro]:identity_immunities ;vedro — название спавн-секции предмета (Потом мы будем через него спавнить). Пишется латиницей. $spawn = "dynamic_objects\el_tehnika\komp_klava" ;путь спавн-секции в дереве спавн-объектов в СДК (если не пользуетесь СДК, то особой важности не имеет). visual = objects\dynamics\decor\vedro_01.ogf ;Путь до модели физического объекта из папки meshes. cform = skeleton ; Движковые классы (донт тач) class = P_SKELET remove_time = 4 ;Время через которое объект исчезнет. Число до от 0 до 9999, если поставить 9999 то он просуществует очень долго Второй вариант: [vedro]:identity_immunities ;vedro — название спавн-секции предмета (Потом мы будем через него спавнить). Пишется латиницей. $spawn = "physics\object" ;путь спавн-секции в дереве спавн-объектов в СДК (если не пользуетесь СДК, то особой важности не имеет). visual = objects\dynamics\decor\vedro_01.ogf ;Путь до модели физического объекта из папки meshes. class = O_PHYS_S remove_time = 60000 ;Время через которое объект исчезнет. Число до от 0 до 9999, если поставить 9999 то он просуществует очень долго. Так вроде лучше. Сохраняем файл. Далее уже стандартно — создаем в скриптовом файле функцию типа: function spawn () alife():create("vedro",vector():set(координаты X,Y,Z),level_vertex_id,game_vertex_id) end И вызываем эту функцию через диалог или другой скрипт.
- 2 ответа
-
- 1
-
-
Делаем свечение у артефактов Автор: AMK + дополнения от Nikitos817 Что бы артефакты ярче светили, надо сделать следующие манипуляции. Открываешь artefacts.ltx из gamedata\config\misc: Ищешь артефакт и меняешь параметры (если нет, добавляешь): ;подсветка арта lights_enabled = true(false) (включено(отключено)) trail_light_color = х, х, х (R,G,B.) trail_light_range = х (радиус свечения) Теперь я объясню, что это: 1. trail_light_color = х, х, х (R,G,B.) - это цвет. RGB - это Red Green Blue (Красный, Зелёный, Синий). Максимальное значение вроде 1.0. Если trail_light_color = 1.0, 0.0, 0.0, то артефакт будет светиться ярко красным цветом. 2. trail_light_range = х - радиус свечения. Максимальный радиус вроде 9.9 (9 метров, 99 сантиметров).
- 3 ответа
-
- 2
-
-
-
[SoC] Вывод другого варианта часов на HUD Автор основного урока: steelrat. Автор правок: LaRento. Благодарность за урок по классу CTime: malandrinus. Здравствуйте. Данный короткий урок посвящён выводу часов, имеющие дату и пару изменений со временем. Прошу не обвинять данный урок как плагиаторство основного урока по добавлению часов на HUD. Понадобятся следующие файлы: новый_скрипт.script bind_stalker.script ui_custom_msgs.xml 1. Создание функции отображения уже всем знакомых часов: Открываем ваш новый_скрипт.script, который вы назовёте как захотите и пишем туда следующее. Функция содержит пояснения. 2. Регистрация или постоянный вызов функции: Открываем bind_stalker.script и в функцию actor_binder:update(delta), допустим после строки: game_stats.update (delta, self.object) пишем: новый_скрипт.add_clock() 3. Добавление самих часиков на худ: Открываем файл ui_custom_msgs.xml и пишем следующее в конце внутри тегов <header>: <hud_clock_static x="852" y="17" width="156" height="52"> <text complex_mode="0" x="65" y="0" font="letterica16" r="255" g="255" b="255" a="130" align="c"/> <texture>ui_hud_frame_clock</texture> </hud_clock_static> <hud_show_time x="870" y="45" width="156" height="52"> <text x="0" y="0" font="graffiti19" r="255" g="255" b="255" a="140" align="c"/> </hud_show_time> <hud_show_date x="875" y="17" width="156" height="52"> <text x="0" y="0" font="letterica16" r="255" g="255" b="255" a="130" align="c"/> </hud_show_date> Либо можете поставить стандартный шрифт времени, как на таймере. Для этого используете это с заменой: <hud_show_time x="875" y="40" width="156" height="52"> <text x="0" y="0" font="graffiti32" r="238" g="155" b="23" align="c"/> </hud_show_time> Вот собственно и всё. Можете спокойно идти и проверять У вас должно получиться вот так:
-
[SoC] Blowout Mod - реализация рандомного выброса Что для этого потребуется: конечно же S.T.A.L.K.E.R. - Shadow of Chernobyl, любой версии, с модификацией Blowout Mod. К чему этот урок: многие уже наверное знают что в модификации "Blowout Mod" выброс наступает по указанному времени, а в этом уроке я поясню как сделать функцию рандома, т.е чтобы "выброс" мог начинаться в любое время. Итак, приступим: В папке с "gamedata", которая из под модификации, находим папку "scripts", там находим файл "ogsm_funcs.script", открываем его и находим такие строчки: g_start_timer("bl1",0, vars.t_surge+math.random(-4,4), 0) и g_start_timer("bl1", 0, vars.t_start, 0) И заменяем их на такие: g_start_timer("bl1",0, math.random(1,24), 0) и g_start_timer("bl1",0, math.random(1,24), 0) Всё, скрипт "vars" можете смело удалять, он больше не пригодится, время начало выброса будет работать по рандому.
-
Отсылаем сообщения главному герою методом разработчиков Автор: Scouser Здравствуйте. Я решил создать маленький урок по выявлению сообщения ГГ. Спасибо модостроителю ColR_iT за некоторые правки. Существует несколько вариантов отослать сообщение ГГ на ПДА: схемой [sr_tip] логики объекта Space Restrictor, методом give_game_news. Однако разработчики пользовались функцией send_tip из скрипта news_manager. Так вот, эта функция спокойной отсылает сообщение на ПДА главного героя. Но стоит учитывать, что она построена на методе give_game_news класса game_object. Для меня это самый удобный способ, имхо. 1. Разберём саму функцию: function name (actor, npc) news_manager.send_tip(db.actor, "new_sms_text", 10000, "ecolog", 18000, 902) end Теперь поэтапно: 2. Добавляем озвучку во время отправки сообщения: Достаточно просто открыть файл news_manager.script и мы увидим вначале и немного вниз множество ссылок на звуковые файлы. В нашем случае пишем: new_sms_text = xr_sound.get_safe_sound_object([[characters_voice\sound]]), Теперь посмотрим, что тут всё это значит: Ну вот собственно и всё. Очень простой способ, которым пользовались разработчики. Желаю удачи вам в моддинге, творите с удовольствием!
- 2 ответа
-
- 4
-
-
-
-
Даём квест ГГ при входе в определённую зону Автор: LaRento Здравствуйте, с вами LaRento. В этой статье я хочу объяснить модмейкерам, как можно получить квест или его выполнение при входе в определённую зону. Введение: часто игроки хотят выдать квест или выполнение его минизадач и даже его самого при входе в какое-нибудь место. Но не многие знают о такой вещи, как Space Restrictor. Это определённый объект, который выдаёт инфпоршни, вызывает функции из скриптов при входе в зону. Так же я объясню, как можно это сделать с задержкой времени. Хоть и существуют туторы по рестрикторам, но я хочу привести примеры, ведь новички порой не знают что такое Спейс рестриктор. 1. Распаковываем all.spawn и открываем alife_локация.ltx. Пишем туда следующую секцию Спейс Рестриктора: 2. Открываем info_локация.xml и пишем: Писать о создании квеста я не буду, думаю, вы найдёте такие статьи. В рестрикторе можно указать любой поршень: начало квеста, завершение подзадачи, завершение самого квеста. Выдача квеста с задержкой времени: Для этого достаточно поменять логику: Вызываем функцию: Стоит поменять логику и вписать важу функция в xr_effects.script: 1. Открываем этот скрипт и пишем вашу функцию. 2. Меняем логику: Проигрывание звука: Тоже дело в логике: Ну вот собственно и всё. Надеюсь, что у вас всё получится. Всего хорошего, удачи.
-
Как привязать к игре другой файл спавна Автор: Wookie Наверное многие копались в Freeplay Start, и видили, что в нем другой файл спавна, не all.spawn, а freeplay.spawn. На самом деле это делается очень просто: 1. Копируем all.spawn (чистый, или который используется в вашем моде) в папку gamedata/spawns. 2. Переименовываем его в любое удобное вам название, например в new.spawn. 3. Создаем папку scripts, если в вашем моде ее еще нет и копируем туда файл ui_main_menu.script (опять же - если его нет, если есть - просто открываем). 4. В скрипте ищем строку с таким содержимым: console:execute("start server(all/single/alife/new) client(localhost)") и заменяем all на название вашего нового файла спавна
-
Создание полоски здоровья, меняющей цвет Для этого нам понадобятся стандартные файлы: config/ui/maingame.xml config/ui/ui_custom_msgs.xml scripts/bind_stalker.script 1. Создаём файл new_hud_health.script в папке gamedata/scripts и пишем в него: 2. Создаём файл new_hud_health.ltx в папке gamedata/config/scripts и пишем в него: 3. В файле ui_custom_msgs.xml прописываем: 4. Открываем файл maingame.xml и находим строчки: 5. Открываем файл bind_stalker.script и пишем после:
- 4 ответа
-
- 1
-
-
Эффект критического ранения Автор: XMK 1. Создаем файл effect_blood.script и записываем туда следующее: lite_treshold = 0.05 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб экран окрасился в красный crit_treshold = 0.30 -- насколько должно уменьшиться здоровье с предыдущего обновления чтоб ГГ начало шатать drop_item_on_crit_prob = 0.20 -- вероятность того что ГГ выронит оружие effector_power_coeff = 0.7 prev_health = -1 chk_h_t = 0 function wounded_pp_update() if (chk_h_t or 0) < time_global() then chk_h_t = time_global()+1000 if prev_health > (db.actor.health + lite_treshold) then level.add_pp_effector("fire_hit.ppe", 2011, false) local effector_power = (prev_health - db.actor.health)*100*effector_power_coeff level.set_pp_effector_factor(2011, effector_power) if prev_health > db.actor.health + crit_treshold then level.add_cam_effector("camera_effects\\fusker.anm", 999, false, "") local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) if math.random() < drop_item_on_crit_prob then local active_item = db.actor:active_item() if active_item and active_item:section() ~= "bolt" and active_item:section()~= "wpn_knife" then db.actor:drop_item(active_item) end end end end prev_health = db.actor.health end end 2. Далее открываем bind_stalker.script и после строчек: function actor_binder:update(delta) object_binder.update(self, delta) local time = time_global() game_stats.update (delta, self.object) пишем: effect_blood.wounded_pp_update()
- 3 ответа
-
- 2
-
-
-
[CoP] Создание новых достижений
Hardtmuth опубликовал тема в Уроки, вопросы и советы по созданию модов
[CoP] Создание новых достижений Автор: Zeka1996Korneev Нам понадобятся файлы: configs\gameplay\info_zaton.xml configs\misc\achievements.ltx configs\text\rus\st_achievement.xml configs\ui\textures_descr\ui_actor_achivments.xml scripts\xr_statistic.script scripts\xr_conditions.script textures\ui\ui_actor_achivments.dds Чтобы их найти, нужен распаковщик ресурсов игры. 1. Открываем файл achievements.ltx и добавляем в конец секцию нашего ачивмента: [sucker] icon = ui_inGame2_lopuh hint = st_sp_achievement_22_hint name = st_sp_achievement_22_name desc = st_sp_achievement_22_descr functor = xr_statistic.sucker_functor Подробно: [sucker] <----- В рамке любое название icon = ui_inGame2_lopuh <------ Иконка hint = st_sp_achievement_22_hint <------ Описание в ПДА при наведении на ачивку. name = st_sp_achievement_22_name <---- Название desc = st_sp_achievement_22_descr <----- Описание functor = xr_statistic.sucker_functor <----- Функция получения 2. Открываем st_achievement.xml и пишем: <string id="st_sp_achievement_22_hint"> <text>Вы постараетесь больше не попадать впросак. :)</text> </string> <string id="st_sp_achievement_22_descr"> <text>Вы отдали артефакт мошеннику.</text> </string> <string id="st_sp_achievement_22_name"> <text>Лопух</text> </string> 3. Открываем xr_statistic.script и пишем рядом с функциями других ачивментов: function sucker_functor() <--- Название if not has_alife_info("sucker_achievement_gained") then <--- Проверка, получили ли вы уже этот ачивмент ранее. if has_alife_info("zat_b14_give_item_stalker") <---- Инфопоршень получения ачивмента then xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"stalker", 200}) <----- Прибавление репутации по отношению сталкеров к ГГ. Если написать -200 то репа будет отрицательной. xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"freedom", 200}) <---- Прибавление репутации по отношению свободы к ГГ. xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"dolg", 200}) <--- Прибавление репутации по отношению долга к ГГ. xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"bandit", 200}) <---- Прибавление репутации по отношению бандосов к ГГ. news_manager.send_tip(db.actor, "st_ach_diplomat", nil, "diplomat", nil, nil) <--- Сообщить о получении ачивмента на ПДА db.actor:give_info_portion("sucker_achievement_gained") <--- Выдать ачивмент end end return has_alife_info("sucker_achievement_gained") end 4. Открываем xr_conditions.script и ищем: sucker_functor = xr_statistic.sucker_functor добавляем ниже: friend_of_stalkers_functor = xr_statistic.friend_of_stalkers_functor 5. В ui_actor_achivments.dds рисуем нашу иконку. 6. В ui_actor_achivments.xml пишем координаты текстуры.- 1 ответ
-
- 3
-
-
[CoP] Разбираемся в секторах character_desc_general Автор: Gramatik Сегодня я расскажу вам о character_desc_general игры Зов Припять. Сам файл находится по пути gamedata\configs\gameplay. Открывая файл мы видим секцию ГГ: <!-- Actor --> <!-- --> <specific_character id="actor" no_random = "1"> <name>st_actor_name</name> <icon>ui_inGame2_Hero</icon> <map_icon x="2" y="5"></map_icon> <team>Actor</team> <supplies> [spawn] \n device_torch \n wpn_binoc \n wpn_knife \n detector_simple \n helm_respirator \n stalker_outfit \n grenade_rgd5 = 2 \n wpn_pm_actor \n ammo_9x18_fmj = 3 \n wpn_ak74u \n ammo_5.45x39_fmj = 3 \n bandage = 2 \n antirad = 1 \n medkit = 4 \n bread = 1 \n kolbasa = 1 \n conserva = 2 \n </supplies> <money min="2500" max="2500" infinitive="0"/> <class>actor</class> <community>actor</community> <rank>0</rank> <reputation>0</reputation> <visual>actors\stalker_hero\stalker_hero_1</visual> </specific_character> В этой секции мы можем изминить имя ГГ, всё что будет у него в инвентаре по началу игры, количество денег и прочее. Дальше идут секции группировок: Разбираем эти секции. Каждая секция начинается с названия группировки. К примеру: Stalker, Zombied. Далее идут секции <!-- Группировка novice --><!-- Группировка expirienced --><!-- Группировка expirienced 2 --><!-- Группировка veteran --><!-- Группировка master --> Подробнее расcмотрим секции: Каждая секция начинается с Профиля НПС. Ид Нпс "sim_default_Группировка_*1_default_*2" Где *1 является номером секции. novice = 0 expirienced = 1. А *2 является номером НПС. Ид НПС в этих секциях отвечает за спавн их в сквадах. Замечу что при добавлении новых секций НПС нельзя чтобы количество НПС в секции было больше 9. Т.е. id="sim_default_Группировка_*_default_9" будет идом последнего НПС в секции. Иначе будет вылет с логом: Expression : false Function : CXml::Load File : D:\prog_repository\sources\trunk\xrXMLParser\xrXMLParser.cpp Line : 87 Description : XML file:gameplay\character_desc_general.xml value: errDescr:Error reading Attributes. Эта статья может понадобится для добавления типовых НПС в сквады!
-
Уроки и полезные функции от Panzyuza Автор: Panzyuza Есть простые функции, которые помогут в моддинге. Для начала вот кое-что. Многие сталкивались с необходимостью получения поршня при обыске трупа нпс или мутанта с уникальным именем. Те, кто работает со all.spawn просто используют стандарт игры, добавляя в логическую схему в спавне: [know_info] инфопоршень Но почему только инфопоршень? Зачем писать ещё коды для отлова инфопоршней при обыске? Есть простой и надёжный способ. Нужно открыть блокнотом скрипт xr_motivator.script, найти там следующий код: function motivator_binder:use_callback(obj, who) if self.object:alive() then xr_use.notify_on_use(obj, who) if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end else --//выдача дефолтных тайников treasure_manager.get_treasure_manager():use(self.object) end end И после строки treasure_manager.get_treasure_manager():use(self.object) вставляем название_скрипта.dead_use(victim, who). Должно получиться примерно так: function motivator_binder:use_callback(obj, who) if self.object:alive() then xr_use.notify_on_use(obj, who) if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end else --//выдача дефолтных тайников treasure_manager.get_treasure_manager():use(self.object) mod.dead_use(victim, who) end end Таким образом в случае юзания игроком нпс после смерти помимо выдачи тайника будет вызываться свой скрипт. Создаём скрипт и вставляем следующее: ---------------------------------------------------------------------------------------------------- -- Функция юзания трупов нпс -- В мотиватор, use коллбек вставить название_скрипта.dead_use(obj, who) ---------------------------------------------------------------------------------------------------- function dead_use(victim, who) if not (victim and who) then return end --/>фикс local name = victim:name() if victim and who and who:id() == db.actor:id() then if string.find(name, "bandit_resp_veteran_dead_bor") then --имя нпс db.actor:give_info_portion("ПОРШЕНЬ") --или вызов скриптовых функций elseif string.find(name, "esc_lager_volk") then --перебор db.actor:give_info_portion("ПОРШЕНЬ") return false --повторной выдачи не будет else return true end end end Нужно только знать имя нпс, которое задаёться ему при спавне. Пример. Если вы создали нпс, прописали ему секцию в spawn_sections, значит его имя будет название секции, которое задаёте при спавне. С мутантами можно также. Но сложнее. Нужно в биндере мутантов добавить use_callback и аналогично с биндером нпс.
-
Создание более сложных диалогов
Hardtmuth опубликовал тема в Уроки, вопросы и советы по созданию модов
Создание более сложных диалогов Автор: R.I.C.K.(KAIL) -
Cоздание кат-сцены в начале игры
Hardtmuth опубликовал тема в Уроки, вопросы и советы по созданию модов
Cоздание кат-сцены в начале игры Автор: tema796 и genior В этом уроке мы научимся создавать кат-сцену в начале игры. Для работы нужно: X-Ray CoP SDK Прямые руки Во первых надо создать сам путь по которой будет двигаться камера: Как создавать путь можно увидеть в этом уроке: Облёт камеры,создание летающей. Сам файл мы помешаем в camera_effects которая находиться в папке anims. Во вторых мы создадим спейс регистор и пути: [41] - номер секций ; cse_abstract properties section_name = space_restrictor name = agr_space_restrictor position = -119.177703857422,0,-162.076232910156 - кординаты direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 0 -гейм вертекст distance = 0 level_vertex_id = 64794 -левл вертекст object_flags = 0xffffff3e custom_data = <<END [logic] cfg = scripts\start.ltx - путь до логики END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1.91259896755219 ; cse_alife_space_restrictor properties restrictor_type = 3 Создаем путь: [agr_look] points = p0 p0:name = wp00 p0:position = -119.5,0,-159.600006103516 p0:game_vertex_id = 28 p0:level_vertex_id = 63455 [agr_walk] points = p0 p0:name = wp00 p0:position = -119.200004577637,0,-161.699996948242 p0:game_vertex_id = 28 p0:level_vertex_id = 63894 В третьих напишем логику для спей регистора. Создаем файл start.ltx в папке scripts которая находиться configs и пишем это: [logic] active = sr_idle [sr_idle] on_info = {=actor_on_level(agroprom)} sr_cutscene@agr если актер находиться на Агропроме то включаеться секция sr_cutscene@agr [sr_cutscene@agr] point = agr_walk - точка в который стоит актер после сцены look = agr_look - куда он смотрит cam_effector = agr_start сам путь который мы создавали global_cameffect = true enable_ui_on_end = true on_signal = cameff_end | %=stop_sr_cutscene% отключение кат-сцены -
Создание профиля персонажа Автор: Болотный Доктор Для создания персонажа необходимо создать его профиль, описание и спаун-секцию. Чтобы создать профиль персонажа, необходимо в файл «gamedata\configs\gameplay\npc_profile.xml» добавить строки: <character id="<идентификатор_профиля>"> <class><идентификатор_класса></class> </character> Идентификатор профиля конструируется как <префикс_уровня>_<идентификатор_сцены>_<группировка_персонажа>_<описательное_название>, например, zat_b7_stalker_raider_leader. Во избежание путаницы, класс персонажа указывается такой же, как идентификатор профиля. Класс персонажа используется для связи профиля и описания персонажа. 1) Создание описания персонажа: С одним профилем персонажа может быть ассоциировано несколько описаний персонажей. Это позволяет, добавив в игру несколько персонажей с одним и тем же профилем, получить в результате персонажей с различным набором вещей, разным внешним видом (visual), и т.д. Для того чтобы создать описание персонажа, необходимо в файл «gamedata\configs\gameplay\character_desc_<имя_уровня>.xml» добавить следующую конструкцию: <specific_character id="<идентификатор_описания>" team_default = "1"> <name><идентификатор_строки_имени></name> <icon><идентификатор_текстуры_иконки></icon> <map_icon x="1" y="0"></map_icon> <bio><идентификатор_строки_биографии></bio> <class><идентификатор_класса></class> <community><группировка_персонажа></community> <terrain_sect>stalker_terrain</terrain_sect> <rank><ранг></rank> <reputation><репутация></reputation> <money min="<минимум_денег>" max="<максимум_денег>" infinitive="<восполняемость>"/> <visual><внешний_вид></visual> <snd_config><папка_озвучки></snd_config> <supplies> [spawn] \n <предмет>\n <предмет>\n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" <start_dialog><идентификатор_стартового_диалога></start_dialog> <actor_dialog><идентификатор_диалога_актёра></actor_dialog> <actor_dialog><идентификатор_диалога_актёра></actor_dialog> #include "gameplay\character_dialogs.xml" </specific_character> 2) Описание элементов конструкции:
-
[SoC] Добавляем новый ранг - Легенда Автор: Fireman3000 Для начала зайдем в gamedata/config/creatures/game_releations.ltx и там изменим: ;реальное разделение на группы репутаций на шкалы rating = novice, 300, experienced, 600, veteran, 900, master, 1200, legend И затем строчку с наименованием рангов: ;шкалы для вывода названий вместо чисел ;рейтингов, репутаций и благосклонности в интерфейсе rating_names = novice, 300, experienced, 600, veteran, 900, master, 1200, legend Затем там же ищем эту строчку и изменяем ее: [rank_relations] ; novice, experienced, veteran, master, legend ;=================================================================== novice = 0, 0, 0, 0, 0 experienced = 0, 0, 0, 0, 0 veteran = 0, 0, 0, 0, 0 master = 0, 0, 0, 0, 0 legend = 0, 0, 0, 0, 0 Затем там же изменяем одну строчку. Не уверен в ее работоспособности, но лучше не рисковать: ;очки рейтинга, получаемые за убийство персонажа ;с определенным статусом [rank_kill_points] novice = 0 experienced = 0 veteran = 0 master = 0 legend = 0 С конфигами вроде разобрались. Лезем в скрипты gamedata/scripts/_g.script: function set_actor_rank(rank) if rank == "novice" then db.actor:set_character_rank(0) elseif rank == "stalker" then db.actor:set_character_rank(300) elseif rank == "veteran" then db.actor:set_character_rank(600) elseif rank == "master" then db.actor:set_character_rank(900) elseif rank == "legend" then db.actor:set_character_rank(1200) end end Вместо 1200 можете поставить любое свое значение. Этот скрипт отвечает либо за то, когда ранг получается у actor`a, либо, если меняешь через скрипт ранг у последнего, то очки его ранга ровны тому, что мы только что подставили (то бишь 1200)... Затем меняем gamedata/scripts/xr_info.script: local info_by_rank = { novice = { "encyclopedy_zone_artifact_af-medusa", "encyclopedy_zone_artifact_af-cristall-flower", "encyclopedy_zone_artifact_af-vyvert", "encyclop edy_zone_artifact_af-gravi", "encyclopedy_zone_artifact_af-blood", "encyclopedy_zone_artifact_af-soul", "encyclopedy_zone_zone-story_stor y-2006", "encyclopedy_zone_anomalies_bald", " encyclopedy_zone_anomalies_gravi", "encyclopedy_zone_anomalies_meat", "encyclopedy_zone_anomalies_electra", "encyclopedy_z one_anomalies_radioactive", "encyclopedy_zone_locations_escape", "encyclopedy_zone_locations_garbage", "encyclopedy_mutant _crow_general", "encyclopedy_mutant_rat_general", "encyclopedy_mutant_flesh_general", "encyclopedy_mutant_blind_general", " encyclopedy_mutant_boar_general", "encyclopedy_social_military_army", "encyclopedy_social_stalker-clans_duty", "encycloped y_social_stalker-clans_bandits" }, stalker = { "encyclopedy_zone_artifact_af-medusa", "encyclopedy_zone_artifact_af-cristall-flower", "encyclopedy_zone_artifact_af-night-sta r", "encyclopedy_zone_artifact_af-vyvert", "encyclopedy_zone_artifact_af-gravi", "encyclopedy_zone_artifact_af-gold-fish", "encyclopedy_ zone_artifact_af-blood", "encyclopedy_zone_artifact_af-mincer-meat", "encyclopedy_zone_artifact_af-soul", " encyclopedy_zone_zone-story_story-2008", "encyclopedy_zone_anomalies_fuzz", "encyclopedy_zone_anomalies_radioactive", "enc yclopedy_zone_anomalies_electra", "encyclopedy_zone_anomalies_ameba", "encyclopedy_zone_locations_escape", "encyclopedy_zo ne_locations_garbage", "encyclopedy_zone_locations_agroprom", "encyclopedy_zone_locations_darkdolina", "encyclopedy_zone_l ocations_bar", "encyclopedy_zone_locations_rostok", "encyclopedy_mutant_tushkano", "encyclopedy_mutant_pseudodog_general", "encyclopedy_ mutant_bloodsucker_general", "encyclopedy_mutant_burer_general", "encyclopedy_mutant_snork_general", " encyclopedy_mutant_flesh_general", "encyclopedy_mutant_blind_general", "encyclopedy_mutant_boar_general", "encyclopedy_soc ial_stalker-clans_freedom", "encyclopedy_social_stalker-clans_monolith", "encyclopedy_social_stalker-clans_killers", "ency clopedy_social_stalker-clans_zomstalkers", "encyclopedy_social_scientists_mobile-labs", "encyclopedy_social_military_army", " encyclopedy_social_stalker-clans_duty", "encyclopedy_social_stalker-clans_bandits", "stalker_story_2", "stalker_story_3", " stalker_story_7", "stalker_story_11", "stalker_story_12", "stalker_story_16", "stalker_story_17", "stalker_sto ry_18", "stalker_story_19", "stalker_story_20" }, veteran = { "encyclopedy_zone_artifact_af-electra-sparkler", "encyclopedy_zone_artifact_af-electra-flash", "encyclopedy_zone_artifact_af-r usty-thorn", "encyclopedy_zone_artifact_af-rusty-kristall", "encyclopedy_zone_artifact_af-gravi", "encyclopedy_zone_artifa ct_af-gold-fish", "encyclopedy_zone_artifact_af-blood", "encyclopedy_zone_artifact_af-mincer-meat", "encyclopedy_zone_arti fact_af-soul", "encyclopedy_zone_artifact_af-electra-sparkler", "encyclopedy_zone_artifact_af-electra-flash", "encyclopedy _zone_artifact_af-electra-moonlight", "encyclopedy_zone_artifact_af-ameba-slime", "encyclopedy_zone_artifact_af-ameba-slug", " encyclopedy_zone_zone-story_story-2010", "encyclopedy_zone_zone-story_story-raid", "encyclopedy_zone_anomalies_fuzz", "enc yclopedy_zone_anomalies_radioactive", "encyclopedy_zone_anomalies_electra", "encyclopedy_zone_anomalies_ameba", "encyclope dy_zone_locations_agroprom", "encyclopedy_zone_locations_darkdolina", "encyclopedy_zone_locations_bar", "encyclopedy_zone_ locations_rostok", "encyclopedy_zone_locations_military-loc", "encyclopedy_zone_locations_yantar", "encyclopedy_zone_locat ions_radar", "encyclopedy_mutant_pseudogiant_general", "encyclopedy_mutant_poltergeist_general", "encyclopedy_mutant_contr oller_general", "encyclopedy_mutant_bloodsucker_general", "encyclopedy_mutant_burer_general", "encyclopedy_mutant_snork_ge neral", "encyclopedy_social_stalker-clans_loners", "encyclopedy_social_military_milstalkers", "encyclopedy_social_stalker- clans_freedom", "encyclopedy_social_stalker-clans_monolith", "encyclopedy_social_stalker-clans_killers", "encyclopedy_soci al_stalker-clans_zomstalkers", "encyclopedy_social_scientists_mobile-labs", "stalker_story_2", "stalker_story_3", "s talker_story_7", "stalker_story_10", "stalker_story_11", "stalker_story_12", "stalker_story_13", "stalker_stor y_14", "stalker_story_16", "stalker_story_17", "stalker_story_18", "stalker_story_19", "stalker_story_20" } , master = { "encyclopedy_zone_artifact_af-electra-sparkler", "encyclopedy_zone_artifact_af-electra-flash", "encyclopedy_zone_artifact_af-e lectra-moonlight", "encyclopedy_zone_artifact_af-rusty-thorn", "encyclopedy_zone_artifact_af-rusty-kristall", "encyclopedy _zone_artifact_af-rusty-sea-urchin", "encyclopedy_zone_artifact_af-drops", "encyclopedy_zone_artifact_af-fireball", "encyc lopedy_zone_artifact_af-cristall", "encyclopedy_zone_zone-story_story-raid", "encyclopedy_zone_anomalies_fuzz", "encyclope dy_zone_anomalies_radioactive", "encyclopedy_zone_anomalies_electra", "encyclopedy_zone_anomalies_ameba", "encyclopedy_zon e_locations_yantar", "encyclopedy_zone_locations_radar", "encyclopedy_zone_locations_pripiat", "encyclopedy_zone_locations _stancia", "encyclopedy_mutant_pseudogiant_general", "encyclopedy_mutant_poltergeist_general", "encyclopedy_mutant_control ler_general", "encyclopedy_social_stalker-clans_loners", "encyclopedy_social_military_milstalkers", "stalker_story_6", " stalker_story_9", "stalker_story_10", "stalker_story_13", "stalker_story_14", "stalker_story_16", "stalker_sto ry_17", "stalker_story_18", "stalker_story_19", "stalker_story_20" }, legend = { "encyclopedy_zone_artifact_af-electra-sparkler", "encyclopedy_zone_artifact_af-electra-flash", "encyclopedy_zone_artifact_af-e lectra-moonlight", "encyclopedy_zone_artifact_af-rusty-thorn", "encyclopedy_zone_artifact_af-rusty-kristall", "encyclopedy _zone_artifact_af-rusty-sea-urchin", "encyclopedy_zone_artifact_af-drops", "encyclopedy_zone_artifact_af-fireball", "encyc lopedy_zone_artifact_af-cristall", "encyclopedy_zone_zone-story_story-raid", "encyclopedy_zone_anomalies_fuzz", "encyclope dy_zone_anomalies_radioactive", "encyclopedy_zone_anomalies_electra", "encyclopedy_zone_anomalies_ameba", "encyclopedy_zon e_locations_yantar", "encyclopedy_zone_locations_radar", "encyclopedy_zone_locations_pripiat", "encyclopedy_zone_locations _stancia", "encyclopedy_mutant_pseudogiant_general", "encyclopedy_mutant_poltergeist_general", "encyclopedy_mutant_control ler_general", "encyclopedy_social_stalker-clans_loners", "encyclopedy_social_military_milstalkers", "stalker_story_6", " stalker_story_9", "stalker_story_10", "stalker_story_13", "stalker_story_14", "stalker_story_16", "stalker_sto ry_17", "stalker_story_18", "stalker_story_19", "stalker_story_20" } } Этот скрипт отвечает за истории, услышанные от сталкеров (которые остаются в дневнике). Затем лезем в gamedata/scripts/xr_statistic.script: local killCountProps = { neutral_novice = 1, neutral_experienced = 2, neutral_veteran = 3, neutral_master = 4, neutral_legend = 5, monolith_novice = 1, monolith_experienced = 2, monolith_veteran = 3, monolith_master = 4, monolith_legend = 5, military_novice = 1, military_experienced = 2, military_veteran = 3, military_master = 4, military_legend = 5, killer_novice = 1, killer_experienced = 2, killer_veteran = 3, killer_master = 4, killer_legend = 5, ecolog_novice = 1, ecolog_experienced = 2, ecolog_veteran = 3, ecolog_master = 4, ecolog_legend = 5, dolg_novice = 1, dolg_experienced = 2, dolg_veteran = 3, dolg_master = 4, dolg_legend = 5, freedom_novice = 1, freedom_experienced = 2, freedom_veteran = 3, freedom_master = 4, freedom_legend = 5, bandit_novice = 1, bandit_experienced = 2, bandit_veteran = 3, bandit_master = 4, bandit_legend = 5, zombied_novice = 1, zombied_experienced = 2, zombied_veteran = 3, zombied_master = 4, zombied_legend = 5, Вместо 5 можно подставить любое число. Это сколько капает в ранг очков когда убиваешь людей с рангом легенда... Лезем далее в gamedata/scripts/se_respawn.script: -- Таблица ограничений на спаун: всего в симуляции не должно быть больше, чем указано. local simMaxCount = { stalker_novice = 43, stalker_regular = 48, stalker_veteran = 43, stalker_master = 20, stalker_legend = 5, monolith_novice = 0, monolith_regular = 30, monolith_veteran = 35, monolith_master = 30, monolith_legend = 10, military_novice = 0, military_regular = 32, military_veteran = 22, military_master = 5, military_legend = 2, killer_novice = 0, killer_regular = 18, killer_veteran = 17, killer_master = 10, killer_legend = 2, ecolog_novice = 1, ecolog_regular = 1, ecolog_veteran = 1, ecolog_master = 1, ecolog_legend = 0, dolg_novice = 0, dolg_regular = 33, dolg_veteran = 36, dolg_master = 17, dolg_legend = 13, freedom_novice = 50, freedom_regular = 20, freedom_veteran = 26, freedom_master = 21, freedom_legend = 13, bandit_novice = 40, bandit_regular = 50, bandit_veteran = 18, bandit_master = 10, bandit_legend = 2, zombied_novice = 20, zombied_regular = 15, zombied_veteran = 10, zombied_master = 10, zombied_legend = 10, Ну, тут, я думаю, понятно. Остался последний штрих, отображение ранга в текстовом значении. То бишь залезаем в config\text\rus и открываем любой файл, например ui_st_mm.xml и добавляем туда: <string id="legend"> <text>Легенда</text> </string> Чтобы протестировать, лезем в config\gameplay\character_desc_general.xml и меняем ранг у актора. Поставим, например, 1201: <specific_character id="actor" no_random = "1"> <name>actor_name</name> <icon>ui_npc_u_actor</icon> <map_icon x="2" y="5"></map_icon> <team>Actor</team> <supplies> [spawn] \n device_torch \n </supplies> <class>actor</class> <community>actor</community> <rank>1201</rank> <reputation>0</reputation> <visual>actors\hero\stalker_novice</visual> </specific_character> Заходим в игру и проверяем. И да! У ГГ теперь ранг Легенда!
-
[CoP] Добавление отметок в ПДА на карту подключенный локации Автор: Nuklia Итак, приступим! Мы подключили локацию к Зов Припяти, расположили карту в пда, начали обустройство. И тут возникает вопрос - как добавить отметки в пда (в ЗП например Аномалия Битум, Коготь и т.д.)? Вот об этом я и расскажу. Например: я сделал аномалию Свалка на подключенной Припяти (на стадионе). В alife_l11_pripyat.ltx: [137] ; cse_abstract properties section_name = space_restrictor name = zero_b1_spot----любое уникальное имя position = 5.76249980926514,2.64950323104858,341.929992675781---центр окружности, при наведении на которую появиться надпись direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 934-------гейм вертекс уровня distance = 0 level_vertex_id = 214948-----левел вертекс уровня object_flags = 0xffffff3e custom_data = <<END [story_object] story_id = zero_b1_spot END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 3 Далее собираем all.spawn (Его еще на место надо положить будет) и идем в папку скрипт, а именно открываем файл pda.script. Находим строку: {target="jup_a9_spot", hint="st_jup_a9_name"}, И после неё вставляем: {target="zero_b1_spot", hint="st_zero_b1_name"}, Закрываем и сохраняем изменения. Далее в папку text/rus/любой файл и там: <string id=" st_zero_b1_name "> <text>Пишем то что хотим видеть при наведении</text> </string>
-
[CoP] Создание места сна Автор: Nuklia - Эх, что-то спасть захотелось. Сказал Дягтярёв и пошёл спать в один из Домиков на кородоне. Нет это не начало рассказа, а то что мы сейчас сделаем, да Вы правы, мы сделаем койкоместо. И так начнём. Разместим секцию спейс-рестриктора в олл.спавне привязка имени к определенному смарт-террейну (esc_b1) не обязательна но желательна для ясности. [15001] ; cse_abstract properties section_name = space_restrictor name = esc_b1_sr_sleep position = -16.1344470977783,0.959998846054077,259.680816650391 direction = 0,0,0 version = 0x7c script_version = 8 ; cse_alife_object properties game_vertex_id = 934 distance = 0 level_vertex_id = 3366 object_flags = 0xffffff3e custom_data = <<END [story_object] story_id = esc_b1_sr_sleep_id [logic] cfg = scripts\sr_sleep.ltx END ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 5.02119588851929,0,0 shape0:axis_y = 0,5.0482006072998,0 shape0:axis_z = 0,0,2.23479747772217 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 3 Регистрируем наше койкоместо в скриптах. В PDA.script: ;стр.-288 local sleep_zones_tbl = { {target = "zat_a2_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "jup_a6_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "pri_a16_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, {target = "esc_b1_sr_sleep_id", hint = "st_ui_pda_sleep_place"}, } Теперь в "xr_effects.script": ;стр.-2846 function sleep(actor, npc) local sleep_zones = { "zat_a2_sr_sleep", "jup_a6_sr_sleep", "pri_a16_sr_sleep", "esc_b1_sr_sleep", "actor_surge_hide_2" } Вот и всё! Теперь бежим на то место и спим!
- 4 ответа
-
- 1
-