Перейти к контенту

Создание нового НПС


Рекомендуемые сообщения

Подписывайтесь на канал, распространяйте видео, в будущем запишу еще несколько уроков

 

 

Новое видео! Создание диалогов.



Диалоги

 

Я создал эту тему , чтобы не было множества вопросов про ЭТО...

Итак, сразу хочу сказать, что я взял этот материал со сталкер-портал.ру...

Я сам следовал этому способу, и все получилось.

 

Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC. Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию.

Код:

function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end

 

Теперь мы в файле npc_profile.xml (в папке gameplay) добавляем нашего НПС. Код:

 

<character id="esc_unik_npc">
<class>esc_unik_npc</class>
<specific_character>esc_unik_npc</specific_character>
</character>

 

Теперь создадим секцию нашего персоонажа. В файле spawn_section.ltx (gamedata/config/creatures) в блоке:

 

--------Escape--------------
--------neutrals------------

Создаём секцию. Код:

[esc_unik_npc]:stalker
$spawn = "respawn\esc_unik_npc"
character_profile = esc_unik_npc
spec_rank = regular
community = dolg

 

В строке community можете вместо долга вписать другую группировку. Однако если мы хотим, чтоба наш персоонаж не гулял по Зоне, пока не наткнётся на первуюю аномалию, то пропишем чтобы он стоял на месте. Для этого под community вставляем: custom_data = scripts\esc_unik_npc.ltx Далее создаём в gamedata/config папку scripts в в папке создаём файл esc_unik_npc.ltx В наш созданый файл вставляем: Код:

[logic]
active = remark1
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[remark1]
no_move = true

 

Всё наш НПС будет стоять на месте своего спауна, с некоторыми оговорками: схема remark не предназначена для того, чтобы быть активной схемой, нужна она для плавного перехода между основными схемами, например kamp и walker. Поэтому имейте ввиду, что в том случае, когда НПС что-то\кто-то спугнёт и он отбежит на другую точку, назад он уже не вернётся - он так и останется стоять на новой точке. Это не единственный минус использования схемы remark по не назначению. Поэтому, для правильного поведения нашего НПС используйте схему walker:

[logic]
active = walker@stay_at_position
danger = danger_ignore

[danger_ignore]
ignore_distance = 5

[walker@stay_at_position]
path_walk = walker_stay_at_position_walk
path_look = walker_stay_at_position_look

И пропишите точки walker_stay_at_position_walk и walker_stay_at_position_look в файл way_имя_локации.ltx декомпилированного all.spawn. Начинать при этом новую игру вовсе не обязательно.

 

Едем дальше. Нам надо активировать нашего персоонажа. для этого мы должны вставить строку:

<action>esc_unik_npc.esc_unik_npc</action>

Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml (gamedata/gameplay) под Код:

<game_information_portions>

<info_portion id="storyline_actor_start">
<task>storyline_eliminate_gunslinger</task>

Выглядеть это будет так:

 

Код:

<game_information_portions>
<info_portion id="storyline_actor_start">
<task>storyline_eliminate_gunslinger</task>
<action>esc_unik_npc.esc_unik_npc</action>
</info_portion>

 

Однако мы не прописали самого НПС, как личность В файле character_desc_escape.xml (gamedata/gameplay) добавляем: Код:

 

<specific_character id="esc_unik_npc" team_default = "1">
<name>GENERATE_NAME_bandit</name>
<icon>ui_npc_u_stalker_bandit_3</icon>
<bio>esc_wolf_bio</bio>

<class>esc_otbrosi_1</class>
<community>dolg</community>
<terrain_sect>stalker_terrain</terrain_sect>

<rank>367</rank>
<reputation>-60</reputation>
<money min="600" max="2000" infinitive="1"/>

<snd_config>characters_voice\human_01\monolith\</snd_config> <crouch_type>-1</crouch_type>

<visual>actors\bandit\stalker_bandit_3</visual> <supplies> [spawn] \n
wpn_groza \n

ammo_9x39_pab9 \n
</supplies>

#include "gameplay\character_criticals_3.xml"
#include "gameplay\character_food.xml"

</specific_character>

 

Правда тут получится у нас долговец в одежде бандита и говорящего голосом монолитовца xD Всё сохраняем. НПС готов.

 

Но так же можно добавить нашему НПС диалог) Как добавлять диалоги написано на ВИКИ ) Если хотите сделать нашему НПС своё имя то в файле stable_bio_name.xml (gamedata/config/text/rus) добавляем: Код:

<string id="esc_unik_npc">
<text>Факер-мазафакер</text> </string>

 

А в файле сharacter_desc_escape.xml (gamedata/gameplay) находим нашего уже прописаного НПС

и вставляем в секцию <name></name> (у нас в ней написано GENERATE_NAME_bandit) esc_unik_npc

Всё.

Поздравляю)

Вы только-что создали нового НПС!

 

 

 

Также...

 

 

Редактирование созданного НПС[/b]"]За параметры NPC отвечают файлы:

\config\gameplay\character_desc_название локации.xml

 

Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:

 

<name>...</name> - Имя (ссылка на строку в текстовом массиве). Имена бывают двух типов - уникальные (записываются в stable_bio_name и те, которые генерирует игра.

<icon>ui_npc_...</icon> - Иконка для диалогов/торговли/PDA

<bio>..._bio</bio> - Биография (в игре не используется). Просто пишите

<bio>esc_wolf_bio</bio>

<class>...</class> - Класс (лучше не трогать) Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажется может и больше) разных новичков и чтобы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.

<community>...</community> - Группировка.

<rank>...</rank> - Ранг.

<reputation>...</reputation> - Репутация.

<money min="..." max="..." infinitive="..."/> - Количество денег (infinitive="1" - бесконечные деньги).

 

Вот так. Дальше - будеть больше.

<snd_config>...</snd_config> - Набор звуков.

<crouch_type>-1</crouch_type> - Тип приседания. Лучше не трогать.

<visual>actors\...</visual> - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.

<supplies>...</supplies> - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.

 

Про диалоги

<start_dialog>...<start_dialog>

- Приветственный диалог. Их может быть несколько, с различными условиями появления. Но всегда сначала идет фраза персонажа, а потом ваша.

<actor_dialog>...</actor_dialog>

- Диалоги с игроком. Если нужно будет написать, как делаются диалоги.... То в коммент.

 

Практика

 

Изменим, например, параметры NPC по имени Волк.

 

Откроем файл:

\config\gameplay\character_desc_escape.xml

 

И найдем в нем раздел, ему соответствующий:

<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
	<name>esc_wolf_name</name>
	<icon>ui_npc_u_stalker_neytral_balon_1</icon>
	<bio>esc_wolf_bio</bio>

	<class>esc_wolf</class>
	<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>

	<rank>434</rank>
	<reputation>5</reputation>
	<money min="600" max="2000" infinitive="0"/>

	<snd_config>characters_voice\human_01\stalker\</snd_config>
	<crouch_type>-1</crouch_type>

	<visual>actors\neytral\stalker_neytral_balon_1</visual>
	<supplies>
		[spawn] \n
		wpn_pm \n
		ammo_9x18_fmj = 1 \n
		wpn_ak74u \n
		ammo_5.45x39_fmj \n
		device_torch \n
		hand_radio \n
	</supplies>

#include "gameplay\character_criticals_4.xml" //

	<start_dialog>escape_lager_volk_talk</start_dialog>
	<start_dialog>dm_hello_dialog</start_dialog>
	<actor_dialog>dm_cool_info_dialog</actor_dialog>
	<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
	<actor_dialog>tm_wolf_dialog</actor_dialog>
	<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>

 

Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в "Долг" и сделаем неограниченное количество денег:

<!---------------------esc_wolf--------------------->

<specific_character id="esc_wolf" team_default = "1">
	<name>esc_wolf_name</name>
	<icon>ui_npc_u_stalker_neytral_balon_1</icon>
	<bio>esc_wolf_bio</bio>

	<class>esc_wolf</class>
	<community>dolg</community> <terrain_sect>stalker_terrain</terrain_sect>

	<rank>434</rank>
	<reputation>5</reputation>
	<money min="600" max="2000" infinitive="1"/>

	<snd_config>characters_voice\human_01\stalker\</snd_config>
	<crouch_type>-1</crouch_type>

	<visual>actors\neytral\stalker_neytral_balon_1</visual>
	<supplies>
		[spawn] \n
		wpn_deagle \n
		ammo_11.43x23_fmj = 1 \n
		wpn_fn2000 \n
		ammo_5.56x45_ap \n
		ammo_5.45x39_fmj \n
		device_torch \n
		hand_radio \n
	</supplies>

#include "gameplay\character_criticals_4.xml" //

	<start_dialog>escape_lager_volk_talk</start_dialog>
	<start_dialog>dm_hello_dialog</start_dialog>
	<actor_dialog>dm_cool_info_dialog</actor_dialog>
	<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
	<actor_dialog>tm_wolf_dialog</actor_dialog>
	<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>

 

 

 

Едем дальше....

 

Сделаем нашему новому НПС квест. Сейчас я буду разбирать создание квеста на примере Сидрыча, но думаю вы разберётесь куда тыкать, чтобы квест был для нашего нового НПС.

 

Итак, приступим к созданию диалога, в котором нам будет выдаваться новый квест. Участвующие лица: Сидорович (С) и Меченый (М)

 

М: Здравствуй, Сидорыч! Есть работенка?

С: О, неужели заглянул к нам на огонек, Меченый? Ладно... ближе к телу... эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось.

М: Без проблем! Уже бегу.

 

Будем считать, определились с фразами базового диалога. Теперь необходимо добавить его в соответствующем виде, чтобы игре он был «понятен».

 

Создание «скелета» диалога.

 

Для того, чтобы добавить наш диалог, необходимо открыть для редактирования файл gamedata\config\gameplay\dialogs_escape.xml

 

Для тех, кто знаком с языком XML структура данного файла будет ясна с первого взгляда. Но, поподробнее об этом.

 

Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции:

 

1. <game_dialogs> и закрывающий к нему - </game_dialogs>

2. <dialog id = ""> закрывающий - </dialog>

3. <phrase_list> - </phrase_list>

4. <phrase id = ""> - </phrase>

5. <text> </text>

6. <next> </next>

 

В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже.

 

Поясню, что обозначает каждый тэг в отдельности.

 

1. Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги);

 

2. Определяет новый диалог с id = "". Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ;

 

3. Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между <phrase_list> и </phrase_list> содержатся фразы диалога;

 

4. Этот тэг определяет фразу с id = "". Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры);

 

5. Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже;

 

6. Внутри этого тэга содержится ссылка (в числовом формате) на следующую (или следующие) фразы.

 

Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога.

 

<precondition> </precondition>. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC.

 

<action> </action>. Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг).

 

<give_info> </give_info>.

Позволяет выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через <action>, только это потребует создания специальной функции).

info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml.

Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его.

Так же, с помощью инфопоршнов можно отслеживать действия игрока,

для того, чтобы, например, вывести в нужное время диалог. <has_info> </has_info> и <dont_has_info> </dont_has_info> являются предусловиями для текущей фразы/диалога.

Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие.

 

Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест.

 

Создание info_portion'ов

 

Итак, открываем файл gamedata\config\gameplay\ info_l01escape.xml. Что мы там видим? Правильно, все ту же структуру XML. В данном файле нас интересуют только два тэга:

<info_portion id = ""> </info_portion>
<task> </task>

 

Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга <task>)

 

Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста:

<info_portion id = "new_task_started">
<task>new_task</task>
</info_portion>

 

Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task.

<info_portion id = "player_talked_with_wolf">
</info_portion>
<info_portion id = "player_complete_new_task">
</info_portion>

 

Создание нового квеста

 

Сами квесты содержаться в файлах типа tasks_*****.xml

 

Откроем файл gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.

 

Для примера исследуем уже существующий квест:

<game_task id="esc_help_wounded_from_raid" prio="485">
	<title>esc_help_wounded_from_raid</title>
<objective>
	<text>esc_help_wounded_from_raid_0</text>
	<icon>ui_iconsTotal_esc_help_wounded_from_raid</icon>
	<function_complete>escape_tasks.task_fox_complete</function_complete>
	<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>
	<article>esc_fox_help</article>
	</objective>
	<objective>
	<text>esc_help_wounded_from_raid_1</text>
	<map_location_type hint="esc_fox">green_location</map_location_type>
	<object_story_id>Escape_stalker_from_raid</object_story_id>
	<infoportion_complete>escape_fox_heal</infoportion_complete>
	<infoportion_fail>esc_dogs_return</infoportion_fail>
</objective>
	<objective>
	<text>esc_help_wounded_from_raid_2</text>
	<map_location_type hint="esc_fox">green_location</map_location_type>
	<object_story_id>Escape_stalker_from_raid</object_story_id>
	<infoportion_complete>escape_stalker_done</infoportion_complete>
</objective>
</game_task>

По кусочкам:
<game_task id="esc_help_wounded_from_raid" prio="485">
</game_task>

 

Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = "" задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.

<title>esc_help_wounded_from_raid</title>

 

Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml.

<function_complete>escape_tasks.task_fox_complete</function_complete>

 

Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.

<infoportion_complete>escape_fox_heal</infoportion_complete>

 

Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.

<infoportion_fail>esc_dogs_return</infoportion_fail>

 

Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.

<map_location_type hint="esc_fox">green_location</map_location_type>

 

Создает указатель на карте с подсказкой esc_fox и типом green_location.

<object_story_id>Escape_stalker_from_raid</object_story_id>

 

Указывает на sid из файла gamedata\config\game_story_ids.ltx

<infoportion_set_complete>garbage_meetstalker_start</infoportion_set_complete>

 

Автоматически выдаёт этот info_portion, если функция, указанная в поле <function_complete> вернула истину, то есть подзадание выполнено.

<text>esc_help_wounded_from_raid_0</text>

 

Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст.

 

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

<game_task id="new_task">
<title>Поговорить с Волком</title>
<objective>
	<text>Вернуться к Сидорычу</text>
	<map_location_type hint="escape_trader">blue_location</map_location_type>
	<object_story_id>Escape_Trader</object_story_id>
	<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
<objective>
	<text>Поговорить с Волком</text>
	<icon>ui_iconsTotal_find_item</icon>
	<map_location_type hint="volk">green_location</map_location_type>
	<object_story_id>Escape_novice_lager_volk</object_story_id>
	<infoportion_complete>player_talked_with_wolf</ infoportion_complete>
</objective>
<objective>
	<text>Вернуться к Сидорычу</text>
	<map_location_type hint="escape_trader">blue_location</map_location_type>
	<object_story_id>Escape_Trader</object_story_id>
	<infoportion_complete>player_complete_new_task</ infoportion_complete>
</objective>
</game_task>

 

Здесь же необходимо обязательно указать ссылку на иконку из файла ui_iconstotal, иначе при попытке заглянуть в раздел "Задания" в ПДА при взятии квеста будет происходить вылет. Для примера я проставил иконку поиска предмета.

 

Теперь создадим скелеты диалогов для нашего квеста. Потребуется три: один для Волка и два для Сидорыча.

<dialog id = "volk_new_quest">
<has_info>new_task_started</has_info>
<dont_has_info>player_talked_with_wolf</dont_has_info>
<dont_has_info> player_complete_new_task </dont_has_info>
<phrase_list>
	<phrase id = "0">
		<text>esc_volk_new_quest_0</text>
		<next>1</next>
	</phrase>
	<phrase id = "1">
		<text>esc_volk_new_quest_1</text>
		<give_info>player_talked_with_wolf</give_info>
		<next>2</next>
	</phrase>
	<phrase id = "2">
		<text>esc_volk_new_quest_2</text>
		<action>dialogs.break_dialog</action>
</phrase>

</phrase_list>
</dialog>

<dialog id = "esc_trader_new_quest">
<dont_has_info>player_complete_new_task</dont_has_info>
<dont_has_info>player_talked_with_wolf</dont_has_info>
<phrase_list>
<phrase id = "0">
	<text>esc_trader_new_quest_0</text>
	<next>1</next>
</phrase>
<phrase id = "1">
	<text>esc_trader_new_quest_1</text>
	<give_info>new_task_started</give_info>
	<next>2</next>
</phrase>
<phrase id = "2">
	<text>esc_trader_new_quest_2</text>
	<action>dialogs.break_dialog</action>
</phrase>

</phrase_list>
</dialog>

<dialog id = "esc_trader_new_quest_complete">
<dont_has_info>player_complete_new_task</dont_has_info>
<phrase_list>
<phrase id = "0">
	<text>esc_trader_new_quest_complete_0</text>
	<next>1</next>
</phrase>
<phrase id = "1">
	<text>esc_trader_new_quest_complete_1</text>
	<give_info>player_complete_new_task</give_info>
	<next>2</next>
</phrase>
<phrase id = "2">
	<text>esc_trader_new_quest_complete_2</text>
	<action>dialogs.break_dialog</action>
</phrase>
</phrase_list>
</dialog>

 

Все «скелеты» добавляем в файл dialogs_escape.xml. Между <game_dialogs> и <dialog id=...>!

 

Внимательно следите за правильностью написания тэгов и ОДИНАКОВЫМ написанием идентификаций - как в файле с вашим новым диалогом, так и во всех других файлах, где используются тэги или ваши идентификации(например, идентификации фраз в файле с диалогом должны быть такими же, как и идентификации этих же фраз в файле с текстом). Иначе кроме серии вылетов с не всем понятными логами вы ничего не получите. У меня самого были проблемы при попытке активировать квест, выложеный в этой статье, так что пришлось кое-что поправить - и в тэгах, и в идентификаторах.

 

Примечание: посмотрите на уже готовые диалоги, которые создали разработчики игры – это облегчит вам жизнь.

 

Теперь бежим в файл character_desc_escape.xml

 

Ищем там NPC с id = "escape_trader" и добавляем два новых <actor_dialog></actor_dialog>:

<actor_dialog>esc_trader_new_quest_complete </actor_dialog>
<actor_dialog>esc_trader_new_quest </actor_dialog>

 

Там же ищем NPC с id = "esc_wolf" и добавляем один актор_диалог:

<actor_dialog> volk_new_quest </actor_dialog>

 

Примечание: <actor_dialog> является диалогом, который активируется самим игроком по желанию. А <start_dialog> активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.

 

Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:

<string id="esc_trader_new_quest_complete_0">
<text>Все, я выполнил поручение Волка!</text>
</string>
<string id="esc_trader_new_quest_complete_1">
<text>Молодец, Меченый. На тебя можно положиться.</text>
</string>
<string id="esc_trader_new_quest_complete_2">
<text>Рад был помочь, Сидорыч.</text>
</string>
<string id="esc_trader_new_quest_0">
<text> Здравствуй, Сидорыч! Есть работенка?</text>
</string>
<string id="esc_trader_new_quest_1">
<text>О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая
просьба: сбегай к Волку, у него что-то намечалось.</text>
</string>
<string id=" esc_trader_new_quest_2">
<text>Без проблем! Уже бегу.</text>
</string>
<string id="esc_volk_new_quest_0">
<text>Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.</text>
</string>
<string id="esc_volk_new_quest_1">
<text>Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и
скажи, что все хорошо.</text>
</string>
<string id="esc_volk_new_quest_2">
<text>Все, ухожу.</text>
</string>

 

Все! Поздравляю! Вы только что написали новый квест.

 

 

Дальше...

 

Прописываем в логике НПС:

trade = misc\trade_имя_торговца.ltx

Далее создаем файл trade_имя_торговца.ltx в папке config/misc и прописываем там:

 

[trader]
buy_condition = trader_generic_buy
sell_condition = {+esc_kill_bandits_quest_done} trader_after_fabric_sell, trader_start_sell
buy_supplies = {+esc_kill_bandits_quest_done} supplies_after_fabric, supplies_start
#include "shop_имя_торговца\имя_торговца_buy.ltx"
#include "shop_имя_торговца\имя_торговца_supl.ltx"
#include "shop_имя_торговца\имя_торговца_trade.ltx"

 

После этого создаем папку "shop_имя_торговца" в config/misc и копируем туда файлы торговли от Сидоровича(например) переназываем файлы, изменяем торговлю.

 

 

Если ВЫ сделали нашего нового НПС торговцем, то вам скорее всего понадобится изменять его ассортимент. Как??? Смотрите ниже!

 

Работа над ассортиментом торговли[/b]"]

 

Ассортимент товаров у торговцев хранится в файлах вида trade_[...].ltx, где ... - системное имя торговца. Это файлы:

trade_barman.ltx - Бармен

trade_dolg.ltx - сержант Петренко на базе группировки "Долг"

trade_ecolog.ltx - Сахаров

trade_freedom.ltx - Скряга на базе группировки "Свобода"

trade_trader.ltx - Сидорович

trade_generic.ltx - обычный сталкер

у вас должен быть (по идее) файл

trade_esc_unic_npc (это если вы сделали нашего нового НПС торговцем)

 

Все они хранятся в папке:

...\S.T.A.L.K.E.R\gamedata\config\misc\...

 

Структура файла

 

Разберем структуру файла trade_barman.ltx:

[trader]
buy_condition = barman_generic_buy
sell_condition = {+yan_labx16_switcher_primary_off} barman_after_brain_sell, {+bar_darklab_document_done} barman_after_darkvalley_sell, barman_start_sell
buy_supplies = { yan_labx16_switcher_primary_off} supplies_after_brain, { bar_darklab_document_done}
supplies_after_darkvalley, supplies_start

 

Здесь содержатся условия, от которых зависит диапазон продаваемых/покупаемых торговцем предметов. То есть, например, после выполнения квеста на "Янтаре" соответствующее условие считается выполненным, и ассортимент сменяется на новый, из другого раздела.

 

После этого идет раздел [barman_generic_buy], содержащий предметы, которые бармен покупает.

 

Структура записи в этом разделе:

wpn_walther				= 0.3,	0.1

wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"

0.3 - максимальная цена, по которой торговец купит предмет

0.1 - минимальная цена, по которой торговец купит предмет

 

Цена зависит от репутации игрока.

 

Далее идет раздел [supplies_start] - ассортимент, предоставляемый барменом в начале игры. Он поделен на категории:

[supplies_start]

;'''Аммуниция'''
ammo_9x18_fmj 			= 15,	0.6
...

;'''Оружие'''
wpn_pb					= 3,	0.6
...

;'''Броники'''
stalker_outfit			= 3,	0.7
...

;'''Медикаменты'''
bandage					= 5,	0.6
...

;'''Еда'''
bread					= 10,	0.5
...

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

 

Теперь о структуре одной записи:

wpn_walther				= 3,	0.6

wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"

3 - количество предметов этого типа у торговца

0.6 - вероятность появления каждого из них

 

То есть если значения равны 4, 0.5, то это означает, что у торговца в ассортименте появятся два предмета этого типа.

 

Далее идет раздел [barman_start_sell]. Рассмотрим структуру записи в нем:

wpn_walther = 2, 4

wpn_walther - имя предмета, в данном случае - пистолет "Вальтер"

Цена высчитываетя по формулае (2+4)/2 * базовую цену предмета*(МР).

Модифиакор Реакции(МР) - Цена зависит от репутации игрока. (по умолчанию = 1)

 

Расширяем ассортимент

 

Чтобы добавить в начальный ассортимент, например, винтовку FN2000, проделаем следующее:

 

1. Добавим её в раздел [supplies_start]:

;Оружие

...

wpn_fn2000 = 2, 0.5

 

2. Добавим её в раздел [barman_start_sell]:

;Оружие

...

wpn_fn2000 1, 3

 

Ну а чтобы оно не пропадало после выполнения важных заданий, запишите её и в ассортименты для выполненных условий.

 

 

Пока всё.

  • Нравится 1
  • Полезно 1
  • Сомнительно 1

Thank you for your honesty.

Now fuck off and die.

Ссылка на комментарий
Всё наш НПС будет стоять на месте своего спауна. Едем дальше. Нам надо активировать нашего персоонажа. для этого мы должны вставить строку:

<action>esc_unik_npc.esc_unik_npc</action>

Либо в диалог, либо в какой-нибудь квест. Давайте вставим строку в файл info_portions.xml (gamedata/gameplay) под Код:

<game_information_portions>

<info_portion id="storyline_actor_start">
<task>storyline_eliminate_gunslinger</task>

Выглядеть это будет так:

<game_information_portions>
<info_portion id="storyline_actor_start">
<task>storyline_eliminate_gunslinger</task>
<action>esc_unik_npc.esc_unik_npc</action>
</info_portion>

как я понял storyline_eliminate_gunslinger это в ТЧ. А каким квестом активировать в ЧН? чтоб в любой момент он уже соспавнился.

P.S. основные квесты на кордоне я прошёл (это те которые связаны с вояками и хабаром Сидора)

Изменено пользователем Pihan13
Ссылка на комментарий

Кто может Пожалуста помогите!!!Сделал так как в выше приведенной статье по созданию персонального НРС и все заработало НО:

он не стоит на месте а тупо идет по всей Зоне и главное когда я его убил то игра вилитила с ссылкой в логе на xr_danger.script.

Кто знает что где прописать напишите более подробно.Заранее благодарен... :( :( :(

Ссылка на комментарий

Как отснять координаты, на которые хочешь поставить непися, пробовал командой "rc_stats on" в консоли, вставил, непись просто не появляется в указанной ему точке.

Наверно я не правильно вставляю, кто может помогите или скажите другой способ нахождения координат.

Ссылка на комментарий

Gramond я пользовался этим:

Открываем ui_main_menu.script

находим вот примерно такое

------------------------------------------------

if dik == DIK_keys.DIK_Q then

self:OnMessageQuitWin()

end

и делаем так :

if dik == DIK_keys.DIK_Q then

self:OnMessageQuitWin()

elseif dik==DIK_keys.DIK_W then

self:position_info()

end

--------------------------------------------

И в конец фаила.В Самый Конец!!!

function main_menu:position_info()

local a = db.actor:position()

local vid = db.actor:level_vertex_id()

local gvid = db.actor:game_vertex_id()

local text = "GPS:\\nX= "..a.x.."\\nY= "..a.y.."\\nZ= "..a.z.."\\nlevel_vertex= "..vid.."\\ngame_vertex_id= "..gvid

news_manager.send_tip(db.actor, text, nil, nil, 30000)

end

Сохраняем!!!

*5.2

Заходим в игру ,добегаем до места где бы хотели чтобы спавнилса НРС,выходим в Меню и в меню жмём на W , потом возвращаемся в игру

И Делаем скриншот (F12)

Ссылка на комментарий

советую - пользуйтесь лучше прогой Position Informer (в разделе Инструментарий для мододелов) - очень просто координаты снимть

Thank you for your honesty.

Now fuck off and die.

Ссылка на комментарий

Может дело не в координатах.Возможно ты допустил ошибку в кода прописи этих координат.

 

Добавлено через 8 мин.:

Я сделал так как в выше приведенной статье и все заработало НРС спавнився на том месте где я хотел/

----------------------------------------------------------------------------------------------------------------------------------------

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

Ссылка на комментарий

Следуй инструкциям в выше приведенной статье от SCRIPT.

----------------------------------------------------------------------------------------------------------------

Я делал так как он написал:

 

Для того, чтобы создать нового НПС нам понадобятся координаты нужного места, где и будет заспаунен наш NPC. Возьмём Кордон, лагерь новичков. Можете снять координаты сами, а можете взять мною уже снятые: (-218.20,-20.2,-145.63),35362,47). Далее. Создаём файл в папке gamedata/scripts файл, скажем esc_unik_npc.script. В нём создаём функцию.

Код:

Код

function esc_unik_npc () alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47) end

Ссылка на комментарий

level_vertex тоесть "35362" насколько я понял если его указать неверно то предмет может просто заспавнится не там, где планировалось,

и может приводить к проваливанию произведенных предметов/персонажей под землю или наоборот.

game_vertex тоесть "47" - он указывает на каком уровне спавнить предмет, поэтому его надо указывать.

game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по

всем уровням и game_vertex выбирает нужный)...

Ссылка на комментарий

Спасибо за ответы, вы мне очень помогли разобраться.

Но у меня всё равно непись упорно не хочет появлятся по моим координатам, у меня какая-то ошибка в координатах.

По координатам из урока НПС появляется, а помоим нет. :(

Изменено пользователем Gramond
Ссылка на комментарий

Gramond

возьми position informer и будет тебе счастье.

 

Или улучшенную его версию, которая так же может отображать инфопоршни, численность гулагов и ешо некоторые полезные функции: _http://stalker-portal.ru/forums.php?m=posts&p=866027#866027

 

ЗЫ: надеюсь не расценится как реклама...

Изменено пользователем Отшель[НИК]
Ссылка на комментарий
пробовал. эффекта ноль, но хоть не глючит нечего =)

Чтоб таких постов больше не было ,вот написал программку(хотя вру,написал раньше).

Описание:

Программа для новичков в модостроении для игры СТАЛКЕР.

Программа поможет вам создать собственного НПС всего за десяток "шагов".

Примечания:

Наводите иногда на надписи и возможно(!) увидите подсказку.

Ссылка:

http://narod.ru/disk/10375545000/NpcCreatoR.exe.html

 

Пишите пожелания/предложения/... в личку.Может благодаря вам появится новая версия программы(с редактором логики).

Удачи в Зоне.

  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

Здраствуйте сталкеры! всё сделал точно по уроку создания нпс(вверху) но как тока захожу в игру вылет с логом:

 

Expression : fatal error

Function : CInifile::r_section

File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp

Line : 342

Description : <no expression>

Arguments : Can't open section 'stalker $spawn = "respawn\esc_andrew_npc"'

 

только я везде где надо было писать esc_unik_npc я писал esc_andrew_npc!

 

пожалуйста скажите в чём ошибка и как это исправить

Разработка Andrew's Pack Mod V0.5..

Ссылка на комментарий

andrewrap, в уроке небольшая ошибка,

в место этого :

[esc_unik_npc]:stalker $spawn = "respawn\esc_unik_npc"
character_profile = esc_unik_npc 
spec_rank = regular 
community = dolg

Надо это:

[esc_unik_npc]:stalker
$spawn = "respawn\esc_unik_npc" 
character_profile = esc_unik_npc 
spec_rank = regular 
community = dolg

по крайней ере твой вылет исправит.

Возможно всё, ну или почти всё.
Ссылка на комментарий

8push5, огромное спасибо

 

Добавлено через 12 мин.:

И сразу ещё один вопрос: разве после того как создал нового персонажа с помощью этого урока он не должен появится на месте введённых координат? или его надо спавнить с помощью ACDC?

 

У меня нпс почему то не появляется на месте введённых координат

Изменено пользователем andrewrap

Разработка Andrew's Pack Mod V0.5..

Ссылка на комментарий
andrewrap, советую использовать программу от меченый(стрелок), как только ты пропишешь все поля. У тебя на рабочем столе появятся файлы. В одном из файлов есть координаты (уже готовые) которые ты ввёл в поля. Просто копируешь строчку где указаны координаты, и вставляешь вместо тех которые в уроке. В файле "esc_unik_npc.script". :)
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...