Перейти к содержанию

Hardtmuth

Модераторы
  • Публикаций

    4 122
  • Зарегистрирован

  • Посещение

  • Победитель дней

    107

Весь контент Hardtmuth

  1. [SoC] Система постепенной регенерации жизни Автор статьи: Fireman3000 Дополнил: Darkscape А так же спасибо: Lurk моду и ABC. Статья взята из: stalker inside Для начала создадим скрипт. Например health_effect.scripts: Теперь создаёте скрипт abc_medkit.script: Лезем в bind_stalker.scripts: Далее идем в файл config\misc\items.ltx:
  2. [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" - название локации Функцию телепортации, можно вызывать любым способом.
  3. [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 начинаем НИ, идём убиваем кабана, возвращаемся к входу в бункер, спускаемся по лестнице, и идём обратно, к смарту кабана. Поздравляю, вы сделали респавнер Домашнее задание:
  4. Как заставить НПС смотреть в заданную точку Автор: 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 ; ваши левел вертексы
  5. Справочник по функциям и классам Такая тема уже давно существует на АМК форуме, и курирует ее malandrinus, но по выводам из ответов/вопросов в теме Модострой: Вопросница (и не только), я понял, что у многих не доходят руки покопать в интернете и найти всем известный АМК форум... потому решил создать такую же тему, здесь... Но так как там вся информация идет не организована и в разброс, здесь я сделаю всю информацию в шапке темы и под спойлерами: Слова автора темы на AMK: Оглавление Основы: Класс alife_simulator. Базовые операции с серверными объектами: Пространства имён. Глобальные функции для большого числа задач: Вступление: Безымянное пространство имён: Пространство имён game: Пространство имён level:
  6. Как заспавнить физический объект Автор: 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 И вызываем эту функцию через диалог или другой скрипт.
  7. Делаем свечение у артефактов Автор: 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 сантиметров).
  8. [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> Вот собственно и всё. Можете спокойно идти и проверять У вас должно получиться вот так:
  9. [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" можете смело удалять, он больше не пригодится, время начало выброса будет работать по рандому.
  10. Отсылаем сообщения главному герою методом разработчиков Автор: 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]]), Теперь посмотрим, что тут всё это значит: Ну вот собственно и всё. Очень простой способ, которым пользовались разработчики. Желаю удачи вам в моддинге, творите с удовольствием!
  11. Даём квест ГГ при входе в определённую зону Автор: LaRento Здравствуйте, с вами LaRento. В этой статье я хочу объяснить модмейкерам, как можно получить квест или его выполнение при входе в определённую зону. Введение: часто игроки хотят выдать квест или выполнение его минизадач и даже его самого при входе в какое-нибудь место. Но не многие знают о такой вещи, как Space Restrictor. Это определённый объект, который выдаёт инфпоршни, вызывает функции из скриптов при входе в зону. Так же я объясню, как можно это сделать с задержкой времени. Хоть и существуют туторы по рестрикторам, но я хочу привести примеры, ведь новички порой не знают что такое Спейс рестриктор. 1. Распаковываем all.spawn и открываем alife_локация.ltx. Пишем туда следующую секцию Спейс Рестриктора: 2. Открываем info_локация.xml и пишем: Писать о создании квеста я не буду, думаю, вы найдёте такие статьи. В рестрикторе можно указать любой поршень: начало квеста, завершение подзадачи, завершение самого квеста. Выдача квеста с задержкой времени: Для этого достаточно поменять логику: Вызываем функцию: Стоит поменять логику и вписать важу функция в xr_effects.script: 1. Открываем этот скрипт и пишем вашу функцию. 2. Меняем логику: Проигрывание звука: Тоже дело в логике: Ну вот собственно и всё. Надеюсь, что у вас всё получится. Всего хорошего, удачи.
  12. Как привязать к игре другой файл спавна Автор: 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 на название вашего нового файла спавна
  13. Создание полоски здоровья, меняющей цвет Для этого нам понадобятся стандартные файлы: 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 и пишем после:
  14. Эффект критического ранения Автор: 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()
  15. [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 пишем координаты текстуры.
  16. [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. Эта статья может понадобится для добавления типовых НПС в сквады!
  17. Уроки и полезные функции от 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 и аналогично с биндером нпс.
  18. Создание более сложных диалогов Автор: R.I.C.K.(KAIL)
  19. 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% отключение кат-сцены
  20. Создание профиля персонажа Автор: Болотный Доктор Для создания персонажа необходимо создать его профиль, описание и спаун-секцию. Чтобы создать профиль персонажа, необходимо в файл «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) Описание элементов конструкции:
  21. [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> Заходим в игру и проверяем. И да! У ГГ теперь ранг Легенда!
  22. [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>
  23. [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" } Вот и всё! Теперь бежим на то место и спим!
  24. Hardtmuth

    Sigerous Mod 1.7

    Название: Sigerous Mod | Версия: 1.7 Платформа: Зов Припяти | Патч: 1.6.00, 1.6.01 или 1.6.02 Разработчик: Болотов Николай (GeJorge или Nick_Mondyfic) Дата выхода: 26.08.2010 Sigerous Mod 1.7 - сюжетный мод разработанный для Сталкер Зов Припяти. В SGM 1.7 полностью переписан оригинальный сюжет игры, добавлены новые ключевые персонажи, новая квестовая линия, изменяющая и расширяющая возможности оригинальной версии игры. Этот глобальный мод зарекомендовал себя как очень стабильный в отличии от других творений модостроителей.
  25. Название: Sins of the past. Пролог Платформа: Зов Припяти | Патч: 1.6.02 Разработчик: ANOTHER Team Дата выхода: 26.01.2019 Модификация расскажет вам о последних действиях Грифа, перед уходом из Зоны еще в 2016 году. Гриф, будучи профессиональным наёмником, работавшим под началом самого Шакала, решается на уход из Зоны. Он довольно долго размышлял над этим, но последней крупицей, которая перевесила чашу весов, стал заказ на убийство довольно большой группы сталкеров.