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

Материал от S.T.A.L.K.E.R. Ins >

Съдържание

Скриптовете имат една единствена функция, отговорна за раждането на обекти:

Първият параметър е раздел в конфигурациите, който описва обекта, например "bolt", "medkit" - това са прости секции, прости обекти и има обекти, които отиват онлайн / офлайн, това са NPC, чудовища и т.н., например mil_killer_respawn_2 - снайперистът на групата убийци се появява.

С позицията мисля, че няма нужда да обяснявам, има само един нюанс - височината е Y, а не Z.

Можете да зададете позицията със следната конструкция: vector():set(x,y,z), където x, y и z са координатите на точката на нивото, където създаваме обекта.

Вертексът в играта Stalker не е същият като върхът в 3D графиката. Vertex - определена област с малък размер, на която се присвоява индивидуален номер в рамките на нивото или цялата игра. level_vertex определя зоната на нивото, през което NPC може да премине. game_vertex определя зони за свободно ходене, т.е. под ръководството на AI, както и между нивата. Вертексите са от първостепенно значение. Точността на позицията вече е посочена чрез точката на хвърляне на хайвера. Например, можете да получите върха, който е най-близо до актьора - 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 или актьор, тогава артикулът ще се появи в неговия инвентар.

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

Функцията spawn връща сървърен обект, т.е. без NPC, без чудовище или нещо друго.

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

Само минимален набор - координати, ID, раздел и от него (сървърен обект) обикновено се нуждаете само от ID, тъй като можете да получите същия този сървърен обект чрез ID:

Може да се използва за поставяне на знак, например, но аз лично го използвам за други цели - хвърляне на хайвер на сложни обекти, по-специално - NPC.

Например, трябва да разрешите следния проблем - трябва да създадете наемник, да промените групирането му и да промените инвентара му, и като натоварване да го направите приятел на играча.

В определен момент създаденият обект става онлайн, в този момент се извиква обратно извикване - net_spawn.

Какво правим? Сверяваме ID на онлайн обекта със запаметения ID!

Ако съвпадат, така:

Важното е, че идентификаторът на сървърния обект е параметър иза онлайн обект идентификаторът се получава с помощта на функция. Това е важно, в противен случай можете да изгорите.

И така, хванахме нашия убиец по лична карта.

Освен това всичко е много просто - извикваме командите за хвърляне на хайвера на гаус и касети за него в инвентара на NPC (вижте по-горе), променяме групирането със специална функция и го правим приятел.

Защо такива трудности? Просто NPC не съществува офлайн, има само косвено споменаване за него и освен това всички тези функции работят с обект от типа "NPC", а не със сървърни обекти.

По-проста функция за хвърляне на хайвера в един ред:

section -- това е позицията на раздела на елемента -- това е неговата позиция (Чрез vector()) Вземете играта с помощта на конзолната команда rs_stats 1 или rs_cam_pos 1 (Текущо в CN) levelvertex - нека бъде 1 gamevertex - неговият Game Vertex, определя нивото, на което ще се появи. GV може да се вземе или със скрипт, или чрез разопакования all.spawn.

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

1.За да не се повтаряте в описанието на създаването на нов куест, просто проучете статията за създаване на куестове от Fr3nzy - просто не съм виждал най-добрата статия по тази тема :) Просто ще свържем всичко заедно и ще научим как да създаваме обекти от скрипт.

Защо е за предпочитане да се създава със скрипт, а не чрез същия xrSpawner? Програмата xrSpawner, въпреки всичките си достойнства, има един недостатък, а именно, че редактира хвърлянето на хайвера чрез файла all.spawn, което води до:

  • Невъзможност за комбиниране на два мода, като се използва такъв spawn
  • Необходимостта да започвате нова игра всеки път

Когато се създава чрез скрипт, ситуацията е различна: в по-голямата част от случаите, запазените преди това игри ще работят, което е добра новина :)

И така, нека вземем решение за търсенето.

Мисия:след като говорите със Сидорович, пораждайте зомбитафабрична територия на първото място. За да не се повреди оригиналният сюжет на играта, куестът ще бъде издаденследзавършване на куеста с Flash Drive, тъй като зомбитата ще се появят там едновременно с бандитите и Умника. Мисля, че изходът от битката е предрешен :)

Изпълнение: Ще се опитам да опиша всички действия възможно най-подробно, буквално стъпка по стъпка. Първо започнете играта :)

В конзолата въведете командата:

По този начин позволяваме показването на информация на екрана. След това въведете друга команда:

И летим до завода. Трябва да изберем място за създаване на обекти и този режим е най-подходящ за изпълнение на нашите планове. Поставяме камерата в точката на предполагаемото хвърляне на хайвера и записваме координатите - получих 115, -6, -16.

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

Друг начин да получите същата информация е да отидете на правилното място и да стартирате скрипт там, който ще даде всички необходими координати. Използвам следния скрипт (викам го по добре познатия начин, чрез main_menu):

Излизаме от играта, отиваме в папката с инсталираната игра и създаваме директорията gamedata (предполага се, че „извайваме“ нашия „mod“ на „чиста“ игра, без инсталирани модове, и имаме разопаковани ресурси на играта в папката, да речем източник на gamedata).

В папката 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.

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

След това записваме функцията:

Всичко. Записваме и затваряме файла.

За да не се срине играта, след като сме добавили нов тип чудовища, те трябва да бъдат добавени към файла xr_statistic.script. И така, нека копираме този файл от папката със скриптови ресурси на играта в нашата папка за файла esc_zombie.script и да го отворим за редактиране.

Нека добавим ред към локалния killCountProps към чудовищата:

В локалния 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, свързан с него. В самото начало на файла пишем следното:

Всичко. Можете да започнете играта, да отидете в Cordon, след разговор със Сидорович, в зависимост от решението, избрано от Marked, тичаме до фабриката и ... виждаме сами :)

Домашна работа - да върнете 6-тия тип цивилни зомбита в играта :)

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

4.Днес ще приключим със зомбитата изцяло - ще добавим техните описания към енциклопедията, ще добавим икони и ще се справим с "домашната работа" :) Мисля, че след внимателно изучаване на тази статия, виесамище можете да възстановите всеки герой, който не е бил включен в окончателното издание на играта чрез скриптови функции. Ако някой има достатъчно време и желание, може дори да напише нещо като "Нощта на живите мъртви" :) - поредица от куестове, свързани със собствен сюжет. И така, "домашна работа" - добавяме шестото зомби към играта.

5.Сега нека напишем нашето ново зомби във всички файлове, които създадохме по-рано. Добавете раздел към файла m_zombie.ltx в самия край:

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

Във функцията spawn_zombies променете линията на spawn:

Във функцията zombie_story_1 променете броя на обектите на кратно на 6 (по избор):

Всичко. Запази и затвори.

6.Копирайте файла encyclopedia_mutants.xml в папката gamedata\config\gameplay\, добавете описанието на зомбито към енциклопедията:

И в свързания с него файл string_table_enc_mutants.xml в папката gamedata\config\text\rus\ добавете:

Копирайте файла тукstable_statistic_caption.xml и променете 3 реда в него:

Запази и затвори.

7.И последното нещо е да добавите няколко икони. Веднага ще кажа, че използвах готов файл, който вече съдържа икони на зомбита и други „възстановени чудовища“ (благодарение на Fr3nzy). Така че просто копирайте файла ui_npc_monster.dds от архива в папката gamedata\textures\ui\ и файла ui_npc_monster.xml в папката gamedata\config\ui\. Ако искате да направите своя собствена, прочетете урока за промяна на текстурите.

Накратко, това, което описва файлът ui_npc_monster.xml, е, че той определя координатите на иконите, разположени във файла ui_npc_monster.dds за всеки тип чудовище в играта.

Финален щрих. Отворете файла m_zombie.ltx и в първия раздел заменете реда

В секцията [zombie_ghost] добавете следния ред:

Запазете промените си. Всичко.

Ето готовите примерни файлове. Успех и благодаря за гледането :)

Тази част от статията е написана от Arhet и се основава на примера за това как са създадени NPC групите "Sin" в SRP Mod.

  • gamedata\config\gameplay\character_desc_escape.xml
  • gamedata\config\gameplay\npc_profile.ltx
  • gamedata\config\creatures\spawn_sections.ltx

Нека започнем сcharacter_desc_escape.xml. Няма да пиша описание какво означава всеки ред, тъй като всичко вече е направено преди мен.

Нека създадем нов герой тук:

Нека напишем нашия код след известно време.

Сега отидете наnpc_profile.xmlи го поставете там:

Сега трябва да се справим сspawn_sections.ltx. Скриптът ще "вземе NPC" само от този файл. Там пишем:

Сега вземаме всеки скрипт за хвърляне на хайвера на NPC, въвеждаме името на секцията от spawn_sections.ltx и woo-a-la.

Е, например, създаваме наш собствен файл със скрипт за размножаване, нека го наречем - spaw_new_npc.scriptи напишете следната функция там (взета от статията):

Това е целият сценарий! Сега трябва да го активирате, добре, например, чрез диалога, след диалога, който вмъкваме: