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 получается с помощью функции. Это важно, а то можно прогореть.
Итак, мы поймали нашего киллера по 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’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую 🙂
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:
Далее пишем функцию:
Все. Сохраняем и закрываем файл.
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл 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 строчки:
Сохраняем и закрываем.
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..*