52 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

S.T.A.L.K.E.R.: Clear Sky «New NPC»

Спавн через скрипт

Материал из S.T.A.L.K.E.R. Inside Wiki

Содержание

Теория

В скриптах есть одна единственная функция, отвечающая за спавн объектов:

Строго говоря, их две: create и create_ammo но различия между ними не существенны. Imp 22:45, 23 июля 2007 (EEST)

Первый параметр — секция в конфигурациях, описывающая объект, например «bolt»,»medkit» — это простые секции, простых объектов а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 — спавнится снайпер группировки киллеров.

С позицией, думаю объяснять не надо, только существует нюанс — высота это Y, а не Z.

Задать позицию можно такой конструкцией: vector():set(x,y,z), где x, y и z — координаты точки на уровне, где спавним объект.

Вертекс в игре Сталкер не тоже самое, что вертекс в трехмерной графике. Vertex — определенная зона малого размера за которой закреплен индивидуальный номер в пределах уровня или целой игры. level_vertex определяет зону на уровне, по которой можно пройти NPC. game_vertex определяют зоны для свободного хождения, т.е. под руководством ИИ, а также между уровнями. Вертексы имеют одно из первостепенных значений. Точность положения указывается уже через точку спавна. Например, можно получить вертекс ближайший к актору — db.actor:level_vertex_id()

game_vertex_id нужен для того, чтобы указать на какой карте спавнить объект.

Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex_id в четвертом параметре. Например:

Итак, чтобы, например, заспавнить болт под ногами актора, пишем:

Почему 1, а не level_vertex_id? Проверено — разницы особой нет, какой level_vertex_id, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось. Но по большей части все проходит нормально и с единицей (игнорирование level_vertex_id может приводить к проваливанию произведенных предметов/персонажей под землю). А вот game_vertex решает все — он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex’у и использовать их в скриптах. На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки, имеющие сквозную нумерацию по всем уровням, и game_vertex выбирает нужный) соответственно неправильное использование черевато.

Кроме того, есть еще один параметр — ID объекта, если указать ID NPC или актора — то предмет заспавнится у него в инвентаре.

Пример (спавним артефакт Медуза в инвентаре у актора):

Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.

Серверный обьект позволяет свежесозданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:

Кстати, create_ammo — практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. Imp 22:38, 23 июля 2007 (EEST)

Просто минимальный набор — координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:

Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей — спавн сложных объектов, конкретно – NPC.

Например надо решить следующую задачу — надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку — сделать другом для игрока.

В определенный момент заспавненный объект переходит онлайн, в этот момент вызывается callback — net_spawn.

Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!

Если они совпадают, например так:

Важно то, что у серверного объекта ID — это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.

Читать еще:  S.T.A.L.K.E.R.: Shadow of Chernobyl "Неофициальный патч 1.0007, версия 3.3"

Итак, мы поймали нашего киллера по ID.

Далее все очень просто — вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.

Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа «NPC», а не с серверными объектами.

Более простая функция спауна в одну строчку:

section — это секция предмета position — это его позиция (Через vector()) Брать в игре с помощью консольной команды rs_stats 1 или rs_cam_pos 1 (Тока в ЧН) levelvertex — пусть равно 1 gamevertex — его Game Vertex, определяет уровень где будет спаун. GV можно взять либо скриптом, либо через распакованный all.spawn.

Практика (часть 1)

1. Чтобы не повторяться в описании создания нового квеста, просто изучите статью по созданию квестов от Fr3nzy – лучшей статьи на эту тему я просто не видел 🙂 Мы просто свяжем все воедино и научимся спавнить объекты из скрипта.

Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – редактирует спавн через файл all.spawn, что приводит к:

  • Невозможности совместить два мода, такой спавн использующих
  • Необходимости каждый раз начинать новую игру

При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохранённые игры будут работать, что не может не радовать 🙂

Итак, определимся с квестом.

Задача: после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться после прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым. я думаю, исход боя предрешен 🙂

Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру 🙂

В консоли введите команду:

Тем самым мы включаем вывод информации на экран. Далее вводим еще одну команду:

И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты — у меня получились 115, -6, -16.

Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).

Другой способ получения тех же сведений — прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):

В результате не нужно экспериментировать, мы сразу получаем все, в том числе и level_vertex и game_vertex. Imp 22:38, 23 июля 2007 (EEST)

Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру, без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).

В папке gamedata создаем папку config, а в ней — папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.

В файлах игры присутствуют 5 моделей гражданских зомби: файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf.

Вернем в игру их всех 🙂

Уже имеются секции:

Два последних типа используют одну и ту же модель zombi_trup.ogf, хм. непорядок, исправляем. Последняя секция выглядит теперь так:

Добавим пятую модель.

Для этого в конце файла создадим секцию:

Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.

Все. Сохраняем изменения и закрываем файл.

2. Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script.

При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую 🙂

Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:

Читать еще:  S.T.A.L.K.E.R.: Call of Pripyat: Сохранение/SaveGame (Игра пройдена на 100%, без читов) v1.6.02

Далее пишем функцию:

Все. Сохраняем и закрываем файл.

Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки ресурсов игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование.

Добавим в local killCountProps к монстрам строчку:

В local sect_alias после строки:

Допишем эти строки:

А ниже в monster_classes строчку:

В функцию getNpcType(npc) добавляем конструкцию:

Сохраняем изменения и закрываем файл.

Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.

Все верно – игра не знает, какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:

  • Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);
  • Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера 🙂

Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр

Все. Вылетов не будет.

3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример статью по созданию диалогов от BAC9-FLCL.

Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:

И также связанный с ним файл stable_dialogs_escape.xml. В самом начале файла пишем следующее:

Все. Можно запускать игру, идти на Кордон, после разговора с Сидоровичем, в зависимости от выбранного Меченным решения, бежим на фабрику и … смотрим сами 🙂

Домашнее задание — вернуть в игру 6-ой тип гражданского зомби 🙂

Практика (часть 2)

4. Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию, добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы сами сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» 🙂 — серию квестов, связанную своим собственным сюжетом. Итак, «домашнее задание» — добавляем в игру шестого зомби.

  • Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4. А где третий? Наверное, сбежал 🙂
  • Скопируем из папки с оригинальными файлами игры в созданную нами папку файл zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить 🙂

На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. 🙂

5. Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:

в файле esc_zombie.script изменяем массив в первой строке:

В функции spawn_zombies изменяем строку спавна:

В функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):

Всё. Сохраняем и закрываем.

6. Копируем в папку gamedataconfiggameplay файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:

И в связанный с ним файл string_table_enc_mutants.xml в папке gamedataconfigtextrus добавляем:

Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:

Читать еще:  Трейнеры для S.T.A.L.K.E.R.: Clear Sky

Сохраняем и закрываем.

7. И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedatatexturesui, а файл ui_npc_monster.xml – в папку gamedataconfigui. Если вы хотите сделать собственные — прочитайте урок по изменению текстур.

Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.

Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку

В секцию [zombie_ghost] добавьте строку:

Сохраняйте изменения. Всё.

Вот готовые файлы примера. Удачи и спасибо за внимание 🙂

Спавн NPC

Эта часть статьи написана Arhet и создана на примере того, как в SRP Mod были созданы NPC группировки «Грех».

  • gamedataconfiggameplaycharacter_desc_escape.xml
  • gamedataconfiggameplaynpc_profile.ltx
  • gamedataconfigcreaturesspawn_sections.ltx

Начнем с character_desc_escape.xml. Описание, что значит каждая строка, писать не буду, так как все до меня уже сделано.

Тут создадим нового персонажа:

Впишем наш код после какого-нибудь .

Теперь идем в npc_profile.xml и туда вгоняем:

Теперь надо заняться spawn_sections.ltx. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:

  • [esc_dark_stalker_1]:stalker – имя секции для скрипта..
  • $spawn = «respawnesc_dark_stalker_1»
  • character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC
  • spec_rank = regular – спец ранг
  • community = dark_stalker – группировка.

Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.

Ну, к примеру, создаем свой файл со скриптом спавна, назовем его — spaw_new_npc.script и запишем туда вот такую функцию (взял из статьи):

Вот и весь скрипт! Теперь надо его активировать, ну к примеру через диалог, после диалога вставляем:

New Model NPC for S.T.A.L.K.E.R.

Название: New Model NPC for S.T.A.L.K.E.R. — Lost Alpha DC

Автор: Muzlo Stalker

Описание:

• Замена моделей NPC в игре LADC;
• Совместим с «hd_pack_ninja_nub_stooe» и подменяет те модели, которые возможно там не понравились.

Заменены:

• bandit
• dolg
• izgoy
• killer
• militari
• monolit
• neytral
• novice
• oso
• soldier
• svoboda

Отличие от оригинала:

• Замена более 150 моделей NPC;
• Практически нет повторяющихся лиц, так как постоянно встречающиеся тут и там «усачи», «бородачи», «грязнули» и пр. одинаковые рожи, уже порядком поднадоели;
• Уникальных персонажей, я частично поменял на новых, а в ряде случаев, просто заменил им лица, так как «Лис-Серый-Лысый» абсолютно были одинаковые внешне.

+other model (bonus)

• dark_stalker_boss (кепка, очки)
• dark_stalker_boss (коричневый плащ)
• dolg (закрытые лица — экзо)
• green_stalker_1 (Шустрый — камуфляж)
• green_stalker_1 (Шустрый — светлая куртка)
• green_stalker_1 (Шустрый — темная куртка)
• green_stalker_9 (охотник в баре)*
• soldier (закрытые лица)
• soldier (открытые лица)
• stalker_bandit_borov*
• stalker_bandit_drunk (наркоша)
• stalker_bandit_drunk (танкист)

Видео демонстрация в скриншотах

1. Если раньше, в папку «mods» добавляли новые модели из пака «DLCs», это — «new_npc.xdb0» и «new_npc.xdb1», их нужно перед установкой данного модельного пака удалить, иначе будут вылеты!
2. Перед установкой паков с неписями, обязательно копируем в папку «mods» это — «textures_model.xdb0» и «textures_model.xdb1»!
3. Совместим только с «hd_pack_ninja_nub_stooe» и подменяет те модели неписей, которые возможно там не понравились.. для этого, я все запаковал отдельно, например — можно заменить солдат, не удаляя тех, которые находятся в «hd_pack_ninja_nub_stooe» и т.д.
4. «Охотник в баре» и «stalker_bandit_borov», точно такие, как и в самом паке, а добавил их тоже отдельно, на тот случай, если кто-то захочет заменить их, или Шустрого в паке «hd_pack_ninja_nub_stooe», так как там у охотника открытое лицо, и таких как он «братьев» встречается довольно таки много.
5. Любые модули, можно — добавлять/удалять в любое время, не начиная НИ!

Скрины всех моделей я положил в отдельную папку.

Выражаю благодарность за модели:

Ааз, jgar, Galil, Scarabay, Tpukc, Хантер22, Трикс, RuWar, Sikorskyi, ПаХ@(N), Tigerr, Fan fan, r0d23, strelok71.71, Sgamer, UR_RF, LightSaber, Malchish_Kibalchish, LafuGix, CRAZY_STALKER666..*

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector