<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.178.50.109&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.178.50.109&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/89.178.50.109"/>
		<updated>2026-04-29T13:41:13Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)</id>
		<title>Создание диалогов (полный обзор)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)"/>
				<updated>2008-08-10T16:18:07Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Диалоги */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Статья в процессе написания...'''&lt;br /&gt;
&lt;br /&gt;
===Общие данные===&lt;br /&gt;
&lt;br /&gt;
В диалогах обычно задействуются три .xml-файла:&lt;br /&gt;
&lt;br /&gt;
* character_desc_x.xml&lt;br /&gt;
* dialogs_x.xml&lt;br /&gt;
* stable_dialogs_x.xml&lt;br /&gt;
&lt;br /&gt;
В них нам важны, соотвественно, списки присвоения диалогов персонажам, структуры диалогов и текстовые массивы для фраз.&lt;br /&gt;
&lt;br /&gt;
===Структура фраз===&lt;br /&gt;
&lt;br /&gt;
В общем виде диалог выглядит так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''диалог 001'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 0'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Так, чего хотел-то?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''1'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 1'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Задание для тебя есть. Возьмешься?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''21, 22'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 21'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Ну, давай.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''3'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 22'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Не, иди к черту.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''нет'''&amp;lt;br&amp;gt;&lt;br /&gt;
действие: '''выйти из диалога'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[фраза 3 и дальнейшее продолжение...]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''конец диалога'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В файлах эта структура записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Так, чего хотел-то?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Задание для тебя есть. Возьмешься?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Ну, давай.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;22&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Не, иди к черту.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[...]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберемся подробнее.&lt;br /&gt;
&lt;br /&gt;
Во-первых, принадлежность фраз.&lt;br /&gt;
Они могут принадлежать или игроку, или NPC, причем:&lt;br /&gt;
&lt;br /&gt;
* фраза, принадлежащая игроку, всегда идет первой, а за ней уже по древу диалога игра понимает, чья фраза кому принадлежит (например, у нас 0, 21, 22 - игрока; а 1, 3 - NPC)&lt;br /&gt;
* только у фразы, принадлежащей NPC, можно выбрать несколько вариантов ответа игрока&lt;br /&gt;
&lt;br /&gt;
Впрочем, и у фразы игрока можно сделать несколько вариантов ответов, но поскольку компьютер не обладает способностью самостоятельно выбирать, то каждый из вариантов должен быть заранее определен по условиям выбора (например, по наличию у игрока какого-нибудь предмета, или количества денег, или репутации и т.д.), причем условия выбора различных вариантов никогда не должны одновременно становиться подходящими. Это мы разберем позднее.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, структура фразы.&lt;br /&gt;
Простейшая фраза выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;    -- открывающий тег с ID фразы&lt;br /&gt;
	&amp;lt;text&amp;gt;Привет.&amp;lt;/text&amp;gt;    -- текст фразы&lt;br /&gt;
	&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;    -- ссылка на следующую фразу&lt;br /&gt;
&amp;lt;/phrase&amp;gt;    -- закрытие тега фразы&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но есть возможность строить и такие фразы (в данном случае она принадлежит NPC, а игрок на неё будет давать ответ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;propusk_given&amp;lt;/give_info&amp;gt; -- выдача инфопорции (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи пропуск. Теперь тебе охранник позволит войти.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.give_propusk_item&amp;lt;/action&amp;gt; -- ссылка на скрипт (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;23&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Здесь у нас выдается [[Инфопорция|инфопорция]], которая может потом использоваться в различных местах (например, её наличие может проверяться каким-нибудь охранником - и если она есть, то он, скажем, отойдет и пропустит игрока внутрь). Важно понимать отличие инфопорции от предмета. Инфопорция - это ''факт наличия'' пропуска, а лежащий в инвентаре пропуск - ''материальный предмет''. Можно, кстати, обойтись и без инфопорций, впоследствии пользуясь скриптами, проверяющими инвентарь игрока и ищущими нужный предмет, но этот способ сложен и нам пока не понадобится.&lt;br /&gt;
&lt;br /&gt;
* 2. Это скрипт, выдающий игроку предмет &amp;quot;пропуск&amp;quot; в инвентарь. Ссылка на скрипты дается в формате имя_файла.имя_функции.&lt;br /&gt;
&lt;br /&gt;
Как видите, фраза, в которой некий NPC выдает игроку пропуск, позволяющий пройти дальше, достаточно сложна.&lt;br /&gt;
&lt;br /&gt;
Вот еще один пример (здесь она принадлежит игроку):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;propusk_given&amp;lt;/has_info&amp;gt; -- проверка на наличие инфопорции propusk_given&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, пропуск у меня есть.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- ссылка на скрипт, завершающий диалог&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь у нас фраза из диалога игрока с NPC - та, что после вопроса NPC &amp;quot;А пропуск у тебя есть?&amp;quot;. Это один из вариантов ответа на неё. Особенность в том, что этот вариант не появится, если пропуска у вас на самом деле нет - она появляется только при наличии нужной инфопорции (за это отвечает строка с &amp;lt;has_info&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Далее, поподробнее остановимся на задании условий появления фразы.&amp;lt;br&amp;gt;&lt;br /&gt;
Способов это сделать - два.&lt;br /&gt;
&lt;br /&gt;
    * проверка на наличие инфопорций&lt;br /&gt;
    * проверка через скриптовую функцию&lt;br /&gt;
&lt;br /&gt;
Первый метод мы видели выше, а второй - гораздо более комплексный и многофункциональный. Он запускает скрипт, который проводит проверку определенных вещей, и возвращает true/false. Простой пример - NPC требует денег (скажем, 5000 рублей), а нам нужно, чтобы ответная фраза игрока &amp;quot;Вот, держи свои 5000.&amp;quot;, могла быть доступна для выбора, только если у нас действительно есть эти деньги. Для этого пишем такую фразу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи, ровно 5000.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.actor_have_5000&amp;lt;/precondition&amp;gt; -- вызываем условие (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.transfer_5000&amp;lt;/action&amp;gt; -- передача денег скриптом (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Этот скрипт который проверяет наличие денег: если было возвращено true, то фраза доступна.&lt;br /&gt;
* 2. Вызываем другой скрипт, действие - он осуществляет саму передачу денег.&lt;br /&gt;
&lt;br /&gt;
Да, кстати, порядок расстановки тегов внутри фразы не играет никакой роли - они все выполняются одновременно. Единственное - &amp;lt;next&amp;gt; всегда последний. Еще одно - есть второй вид проверки на инфопорцию - он наоборот, проверяет её отсутствие. Применяется точно так же, но называется не has_info, а dont_has_info.&lt;br /&gt;
&lt;br /&gt;
Итак, что у нас есть:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;phrase id=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/phrase&amp;gt;''' - общий тег фразы, задание номера фразы&lt;br /&gt;
* '''&amp;lt;nowiki&amp;gt;&amp;lt;text&amp;gt;...&amp;lt;/text&amp;gt;&amp;lt;/nowiki&amp;gt;''' - тег, содержащий текст фразы&lt;br /&gt;
* '''&amp;lt;give_info&amp;gt;...&amp;lt;/give_info&amp;gt;''' - выдача инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;has_info&amp;gt;...&amp;lt;/has_info&amp;gt;''' - проверка на наличие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;dont_has_info&amp;gt;...&amp;lt;/dont_has_info&amp;gt;''' - проверка на отсутствие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;precondition&amp;gt;...&amp;lt;/precondition&amp;gt;''' - запуск скрипта, возвращающего true или false в зависимости от чего-либо (скриптовая проверка)&lt;br /&gt;
* '''&amp;lt;action&amp;gt;...&amp;lt;/action&amp;gt;''' - запуск скрипта&lt;br /&gt;
* '''&amp;lt;next&amp;gt;...&amp;lt;/next&amp;gt;''' - тег ссылки на следующую фразу&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В первой версии - достаточно просто окна с формами для ввода этих параметров. А программа на основе введенных данных будет собирать фразу. Например, на основе вот таких введенных в поля данных:&lt;br /&gt;
&lt;br /&gt;
Номер фразы: '''12'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Текст: ''Да, там сейчас база военных.&amp;lt;br&amp;gt;Я не в курсе, сколько их там точно, но&amp;lt;br&amp;gt;могу сказать, не меньше, чем один два отряда.''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Выдать инфопорцию: '''info_about_military_base'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Проверить наличие инфопорции: '''info_1'''&amp;lt;br&amp;gt;Проверить отсутствие инфопорции: '''нет'''&amp;lt;br&amp;gt;Проверить через скрипт: '''dialogs.is_npc_a_friend'''&amp;lt;br&amp;gt;Совершить действие: '''dialogs.break_dialog'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Номера следующих фраз: '''13'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нам нужна вот такая запись:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;info_1&amp;lt;/has_info&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, там сейчас база военных. Я не в курсе, сколько их там точно [...]&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.is_npc_a_friend&amp;lt;/precondition&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;info_about_military_base&amp;lt;/give_info&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;13&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Текстовые (строковые) массивы===&lt;br /&gt;
&lt;br /&gt;
Мы упустили один важный нюанс, критичный для крупных диалогов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы записывали текст фразы в &amp;lt;'''text&amp;gt;...&amp;lt;/text&amp;gt;'''. Это, безусловно, удобно, но на самом деле - может привести к проблемам. Дело в том, что таким образом можно использовать только короткие фразы. Стоит ввести в тег длинный текст, и игра... так сказать, не переварит наш диалог.&lt;br /&gt;
&lt;br /&gt;
Поэтому нужно использовать не тексты, а ссылки на них. Работает это так:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Text massive explain.jpg]]&lt;br /&gt;
&lt;br /&gt;
То есть фразу мы записываем так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в игре видим нормальный текст - игра по названию my_text_1 находит его в массиве.&amp;lt;br&amp;gt;&lt;br /&gt;
Массивы (для русскоязычной версии игры) находятся в папке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\text\rus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нужные вам тексты фраз вы можете прописывать в любом из находящихся там .xml-файлов, их разделение на специализации - чисто формальное. Лучше всего держать тексты всех ваших диалогов в одном месте, поэтому выберите один файл - этим вы упростите работу тем, кто будет скрещивать ваш мод с другими.&lt;br /&gt;
&lt;br /&gt;
Запись текста происходит в такой форме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;my_text_1&amp;quot;&amp;gt; -- в заголовке указывается имя текста, которое вызывается из диалога&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt; -- собственно, сам текст&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Диалоги===&lt;br /&gt;
&lt;br /&gt;
Ну что же, структуру фраз мы полностью разобрали. Теперь попробуем собрать из них полноценный диалог. Для начала выберем жертву для экспериментов - Сидорович вполне подойдет :)&lt;br /&gt;
&lt;br /&gt;
Откроем папку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\gameplay&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас нас интересует файл '''character_desc_escape.xml''', хранящий профили персонажей с локации &amp;quot;Кордон&amp;quot; (остальные файлы названы по аналогичной системе - вместо '''escape''', соответственно, идет название других уровней). Открываем его и видим профиль Сидоровича '''escape_trader''' - он находится в самом начале файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;escape_trader&amp;quot; no_random = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;name&amp;gt;escape_trader_name&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;icon&amp;gt;ui_npc_u_trader&amp;lt;/icon&amp;gt;&lt;br /&gt;
	&amp;lt;bio&amp;gt;escape_trader_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;class&amp;gt;trader&amp;lt;/class&amp;gt;&lt;br /&gt;
	&amp;lt;community&amp;gt;trader&amp;lt;/community&amp;gt;&lt;br /&gt;
	&amp;lt;visual&amp;gt;actors\trader\trader&amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;rank&amp;gt;330&amp;lt;/rank&amp;gt;&lt;br /&gt;
	&amp;lt;reputation&amp;gt;23&amp;lt;/reputation&amp;gt;&lt;br /&gt;
	&amp;lt;money min=&amp;quot;100000&amp;quot; max=&amp;quot;100000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
	&amp;lt;supplies&amp;gt;&lt;br /&gt;
		[spawn] \n&lt;br /&gt;
		wpn_knife \n&lt;br /&gt;
	&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробный разбор параметров профиля мы делать не будем - для этого существует [[Редактирование_NPC|отдельная статья]]. Сейчас нас интересуют теги &amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;, ссылающиеся на доступные у этого NPC диалоги. Добавим в этот список и ссылку на наш будущий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;my_dialog_1&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее добавим в любой диалоговый файл, например, в '''dialogs_escape.xml''', следующий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;my_dialog_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;my_script_for_dialogs.my_function_1&amp;lt;/precondition&amp;gt; -- условия можно вызывать и здесь&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; -- фразы Меченого&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_0&amp;lt;/text&amp;gt; -- &amp;quot;Ага, вот эти ребята...&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt; -- фразы Сидоровича&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt; -- &amp;quot;Ненене!!! Нет, Меченый, нет!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_2&amp;lt;/text&amp;gt; -- &amp;quot;Я делаю особую, уличную магию. Кто хочет увидеть немного магии?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;            &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_3&amp;lt;/text&amp;gt; -- &amp;quot;Что я тебе, Толик какой-нибудь? Целый день у этих идиотов из лагеря &lt;br /&gt;
			&amp;lt;next&amp;gt;4&amp;lt;/next&amp;gt;             разный хлам скупал, устал, хочу просто отдохнуть...&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_4&amp;lt;/text&amp;gt; -- &amp;quot;И что купил?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;5&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_5&amp;lt;/text&amp;gt; -- &amp;quot;Я купил зеленый свитер, если ты так хочешь знать! Сорок долларов,&lt;br /&gt;
			&amp;lt;next&amp;gt;6&amp;lt;/next&amp;gt;             между прочим.&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_6&amp;lt;/text&amp;gt; -- &amp;quot;Зеленый свитер? А ты уверен, что не купил тедди-бир?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;7&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_7&amp;lt;/text&amp;gt; -- &amp;quot;Тедди-бир?... ТЕДДИ-БИР!!! Где мой зеленый свитер, ты что делаешь, демон?!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_8&amp;lt;/text&amp;gt; -- &amp;quot;Ладно, ладно... еще один фокус. Будь добр, взгляни на телевизор &lt;br /&gt;
			&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;             рядом с тобой. Что он показывает?&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;9&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_9&amp;lt;/text&amp;gt; -- &amp;quot;Билд 1154!!! Ты что делаешь, демон, ты что делаешь?! Проваливай отсюда!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;10&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;10&amp;quot;&amp;gt;          &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_10&amp;lt;/text&amp;gt; -- &amp;quot;Ладно.&amp;quot;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- выход из диалога&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для начала лучше попробовать свои силы в простом линейном диалоге вроде этого.&amp;lt;br&amp;gt;&lt;br /&gt;
Да, и не забудьте добавить строки с текстовыми фразами в массив.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Если вам неясно, что за ахинея написана в текстах, вам [http://ru.youtube.com/watch?v=CdTIQ6BVlvw&amp;amp;feature=related сюда] xD&lt;br /&gt;
&lt;br /&gt;
===Дополнительные сведения по диалогам===&lt;br /&gt;
&lt;br /&gt;
===Скрипт-генерируемые диалоги===&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)</id>
		<title>Создание диалогов (полный обзор)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)"/>
				<updated>2008-08-10T16:17:41Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Структура фраз */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Статья в процессе написания...'''&lt;br /&gt;
&lt;br /&gt;
===Общие данные===&lt;br /&gt;
&lt;br /&gt;
В диалогах обычно задействуются три .xml-файла:&lt;br /&gt;
&lt;br /&gt;
* character_desc_x.xml&lt;br /&gt;
* dialogs_x.xml&lt;br /&gt;
* stable_dialogs_x.xml&lt;br /&gt;
&lt;br /&gt;
В них нам важны, соотвественно, списки присвоения диалогов персонажам, структуры диалогов и текстовые массивы для фраз.&lt;br /&gt;
&lt;br /&gt;
===Структура фраз===&lt;br /&gt;
&lt;br /&gt;
В общем виде диалог выглядит так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''диалог 001'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 0'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Так, чего хотел-то?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''1'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 1'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Задание для тебя есть. Возьмешься?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''21, 22'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 21'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Ну, давай.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''3'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 22'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Не, иди к черту.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''нет'''&amp;lt;br&amp;gt;&lt;br /&gt;
действие: '''выйти из диалога'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[фраза 3 и дальнейшее продолжение...]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''конец диалога'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В файлах эта структура записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Так, чего хотел-то?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Задание для тебя есть. Возьмешься?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Ну, давай.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;22&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Не, иди к черту.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[...]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберемся подробнее.&lt;br /&gt;
&lt;br /&gt;
Во-первых, принадлежность фраз.&lt;br /&gt;
Они могут принадлежать или игроку, или NPC, причем:&lt;br /&gt;
&lt;br /&gt;
* фраза, принадлежащая игроку, всегда идет первой, а за ней уже по древу диалога игра понимает, чья фраза кому принадлежит (например, у нас 0, 21, 22 - игрока; а 1, 3 - NPC)&lt;br /&gt;
* только у фразы, принадлежащей NPC, можно выбрать несколько вариантов ответа игрока&lt;br /&gt;
&lt;br /&gt;
Впрочем, и у фразы игрока можно сделать несколько вариантов ответов, но поскольку компьютер не обладает способностью самостоятельно выбирать, то каждый из вариантов должен быть заранее определен по условиям выбора (например, по наличию у игрока какого-нибудь предмета, или количества денег, или репутации и т.д.), причем условия выбора различных вариантов никогда не должны одновременно становиться подходящими. Это мы разберем позднее.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, структура фразы.&lt;br /&gt;
Простейшая фраза выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;    -- открывающий тег с ID фразы&lt;br /&gt;
	&amp;lt;text&amp;gt;Привет.&amp;lt;/text&amp;gt;    -- текст фразы&lt;br /&gt;
	&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;    -- ссылка на следующую фразу&lt;br /&gt;
&amp;lt;/phrase&amp;gt;    -- закрытие тега фразы&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но есть возможность строить и такие фразы (в данном случае она принадлежит NPC, а игрок на неё будет давать ответ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;propusk_given&amp;lt;/give_info&amp;gt; -- выдача инфопорции (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи пропуск. Теперь тебе охранник позволит войти.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.give_propusk_item&amp;lt;/action&amp;gt; -- ссылка на скрипт (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;23&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Здесь у нас выдается [[Инфопорция|инфопорция]], которая может потом использоваться в различных местах (например, её наличие может проверяться каким-нибудь охранником - и если она есть, то он, скажем, отойдет и пропустит игрока внутрь). Важно понимать отличие инфопорции от предмета. Инфопорция - это ''факт наличия'' пропуска, а лежащий в инвентаре пропуск - ''материальный предмет''. Можно, кстати, обойтись и без инфопорций, впоследствии пользуясь скриптами, проверяющими инвентарь игрока и ищущими нужный предмет, но этот способ сложен и нам пока не понадобится.&lt;br /&gt;
&lt;br /&gt;
* 2. Это скрипт, выдающий игроку предмет &amp;quot;пропуск&amp;quot; в инвентарь. Ссылка на скрипты дается в формате имя_файла.имя_функции.&lt;br /&gt;
&lt;br /&gt;
Как видите, фраза, в которой некий NPC выдает игроку пропуск, позволяющий пройти дальше, достаточно сложна.&lt;br /&gt;
&lt;br /&gt;
Вот еще один пример (здесь она принадлежит игроку):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;propusk_given&amp;lt;/has_info&amp;gt; -- проверка на наличие инфопорции propusk_given&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, пропуск у меня есть.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- ссылка на скрипт, завершающий диалог&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь у нас фраза из диалога игрока с NPC - та, что после вопроса NPC &amp;quot;А пропуск у тебя есть?&amp;quot;. Это один из вариантов ответа на неё. Особенность в том, что этот вариант не появится, если пропуска у вас на самом деле нет - она появляется только при наличии нужной инфопорции (за это отвечает строка с &amp;lt;has_info&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Далее, поподробнее остановимся на задании условий появления фразы.&amp;lt;br&amp;gt;&lt;br /&gt;
Способов это сделать - два.&lt;br /&gt;
&lt;br /&gt;
    * проверка на наличие инфопорций&lt;br /&gt;
    * проверка через скриптовую функцию&lt;br /&gt;
&lt;br /&gt;
Первый метод мы видели выше, а второй - гораздо более комплексный и многофункциональный. Он запускает скрипт, который проводит проверку определенных вещей, и возвращает true/false. Простой пример - NPC требует денег (скажем, 5000 рублей), а нам нужно, чтобы ответная фраза игрока &amp;quot;Вот, держи свои 5000.&amp;quot;, могла быть доступна для выбора, только если у нас действительно есть эти деньги. Для этого пишем такую фразу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи, ровно 5000.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.actor_have_5000&amp;lt;/precondition&amp;gt; -- вызываем условие (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.transfer_5000&amp;lt;/action&amp;gt; -- передача денег скриптом (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Этот скрипт который проверяет наличие денег: если было возвращено true, то фраза доступна.&lt;br /&gt;
* 2. Вызываем другой скрипт, действие - он осуществляет саму передачу денег.&lt;br /&gt;
&lt;br /&gt;
Да, кстати, порядок расстановки тегов внутри фразы не играет никакой роли - они все выполняются одновременно. Единственное - &amp;lt;next&amp;gt; всегда последний. Еще одно - есть второй вид проверки на инфопорцию - он наоборот, проверяет её отсутствие. Применяется точно так же, но называется не has_info, а dont_has_info.&lt;br /&gt;
&lt;br /&gt;
Итак, что у нас есть:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;phrase id=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/phrase&amp;gt;''' - общий тег фразы, задание номера фразы&lt;br /&gt;
* '''&amp;lt;nowiki&amp;gt;&amp;lt;text&amp;gt;...&amp;lt;/text&amp;gt;&amp;lt;/nowiki&amp;gt;''' - тег, содержащий текст фразы&lt;br /&gt;
* '''&amp;lt;give_info&amp;gt;...&amp;lt;/give_info&amp;gt;''' - выдача инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;has_info&amp;gt;...&amp;lt;/has_info&amp;gt;''' - проверка на наличие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;dont_has_info&amp;gt;...&amp;lt;/dont_has_info&amp;gt;''' - проверка на отсутствие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;precondition&amp;gt;...&amp;lt;/precondition&amp;gt;''' - запуск скрипта, возвращающего true или false в зависимости от чего-либо (скриптовая проверка)&lt;br /&gt;
* '''&amp;lt;action&amp;gt;...&amp;lt;/action&amp;gt;''' - запуск скрипта&lt;br /&gt;
* '''&amp;lt;next&amp;gt;...&amp;lt;/next&amp;gt;''' - тег ссылки на следующую фразу&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В первой версии - достаточно просто окна с формами для ввода этих параметров. А программа на основе введенных данных будет собирать фразу. Например, на основе вот таких введенных в поля данных:&lt;br /&gt;
&lt;br /&gt;
Номер фразы: '''12'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Текст: ''Да, там сейчас база военных.&amp;lt;br&amp;gt;Я не в курсе, сколько их там точно, но&amp;lt;br&amp;gt;могу сказать, не меньше, чем один два отряда.''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Выдать инфопорцию: '''info_about_military_base'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Проверить наличие инфопорции: '''info_1'''&amp;lt;br&amp;gt;Проверить отсутствие инфопорции: '''нет'''&amp;lt;br&amp;gt;Проверить через скрипт: '''dialogs.is_npc_a_friend'''&amp;lt;br&amp;gt;Совершить действие: '''dialogs.break_dialog'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Номера следующих фраз: '''13'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нам нужна вот такая запись:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;info_1&amp;lt;/has_info&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, там сейчас база военных. Я не в курсе, сколько их там точно [...]&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.is_npc_a_friend&amp;lt;/precondition&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;info_about_military_base&amp;lt;/give_info&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;13&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Текстовые (строковые) массивы===&lt;br /&gt;
&lt;br /&gt;
Мы упустили один важный нюанс, критичный для крупных диалогов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы записывали текст фразы в &amp;lt;'''text&amp;gt;...&amp;lt;/text&amp;gt;'''. Это, безусловно, удобно, но на самом деле - может привести к проблемам. Дело в том, что таким образом можно использовать только короткие фразы. Стоит ввести в тег длинный текст, и игра... так сказать, не переварит наш диалог.&lt;br /&gt;
&lt;br /&gt;
Поэтому нужно использовать не тексты, а ссылки на них. Работает это так:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Text massive explain.jpg]]&lt;br /&gt;
&lt;br /&gt;
То есть фразу мы записываем так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в игре видим нормальный текст - игра по названию my_text_1 находит его в массиве.&amp;lt;br&amp;gt;&lt;br /&gt;
Массивы (для русскоязычной версии игры) находятся в папке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\text\rus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нужные вам тексты фраз вы можете прописывать в любом из находящихся там .xml-файлов, их разделение на специализации - чисто формальное. Лучше всего держать тексты всех ваших диалогов в одном месте, поэтому выберите один файл - этим вы упростите работу тем, кто будет скрещивать ваш мод с другими.&lt;br /&gt;
&lt;br /&gt;
Запись текста происходит в такой форме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;my_text_1&amp;quot;&amp;gt; -- в заголовке указывается имя текста, которое вызывается из диалога&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt; -- собственно, сам текст&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Диалоги===&lt;br /&gt;
&lt;br /&gt;
Ну что же, структуру фраз мы полностью разобрали. Теперь попробуем собрать из них полноценный диалог. Для начала выберем жертву для экспериментов - Сидорович вполне подойдет :)&lt;br /&gt;
&lt;br /&gt;
Откроем папку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\gameplay&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас нас интересует файл '''character_desc_escape.xml''', хранящий профили персонажей с локации &amp;quot;Кордон&amp;quot; (остальные файлы названы по аналогичной системе - вместо '''escape''', соответственно, идет название других уровней). Открываем его и видим профиль Сидоровича '''escape_trader''' - он находится в самом начале файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;escape_trader&amp;quot; no_random = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;name&amp;gt;escape_trader_name&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;icon&amp;gt;ui_npc_u_trader&amp;lt;/icon&amp;gt;&lt;br /&gt;
	&amp;lt;bio&amp;gt;escape_trader_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;class&amp;gt;trader&amp;lt;/class&amp;gt;&lt;br /&gt;
	&amp;lt;community&amp;gt;trader&amp;lt;/community&amp;gt;&lt;br /&gt;
	&amp;lt;visual&amp;gt;actors\trader\trader&amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;rank&amp;gt;330&amp;lt;/rank&amp;gt;&lt;br /&gt;
	&amp;lt;reputation&amp;gt;23&amp;lt;/reputation&amp;gt;&lt;br /&gt;
	&amp;lt;money min=&amp;quot;100000&amp;quot; max=&amp;quot;100000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
	&amp;lt;supplies&amp;gt;&lt;br /&gt;
		[spawn] \n&lt;br /&gt;
		wpn_knife \n&lt;br /&gt;
	&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробный разбор параметров профиля мы делать не будем - для этого существует [[Редактирование_NPC|отдельная статья]]. Сейчас нас интересуют теги &amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;, ссылающиеся на доступные у этого NPC диалоги. Добавим в этот список и ссылку на наш будущий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;my_dialog_1&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее добавим в любой диалоговый файл, например, в '''dialogs_escape.xml''', следующий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;my_dialog_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;my_script_for_dialogs.my_function_1&amp;lt;/precondition&amp;gt; -- условия можно вызывать и здесь&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; -- фразы Меченого&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_0&amp;lt;/text&amp;gt; -- &amp;quot;Ага, вот эти ребята...&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt; -- фразы Сидоровича&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt; -- &amp;quot;Ненене!!! Нет, Меченый, нет!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_2&amp;lt;/text&amp;gt; -- &amp;quot;Я делаю особую, уличную магию. Кто хочет увидеть немного магии?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;            &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_3&amp;lt;/text&amp;gt; -- &amp;quot;Что я тебе, Толик какой-нибудь? Целый день у этих идиотов из лагеря &lt;br /&gt;
			&amp;lt;next&amp;gt;4&amp;lt;/next&amp;gt;             разный хлам скупал, устал, хочу просто отдохнуть...&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_4&amp;lt;/text&amp;gt; -- &amp;quot;И что купил?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;5&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_5&amp;lt;/text&amp;gt; -- &amp;quot;Я купил зеленый свитер, если ты так хочешь знать! Сорок долларов,&lt;br /&gt;
			&amp;lt;next&amp;gt;6&amp;lt;/next&amp;gt;             между прочим.&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_6&amp;lt;/text&amp;gt; -- &amp;quot;Зеленый свитер? А ты уверен, что не купил тедди-бир?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;7&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_7&amp;lt;/text&amp;gt; -- &amp;quot;Тедди-бир?... ТЕДДИ-БИР!!! Где мой зеленый свитер, ты что делаешь, демон?!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_8&amp;lt;/text&amp;gt; -- &amp;quot;Ладно, ладно... еще один фокус. Будь добр, взгляни на телевизор &lt;br /&gt;
			&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;             рядом с тобой. Что он показывает?&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;9&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_9&amp;lt;/text&amp;gt; -- &amp;quot;Билд 1154!!! Ты что делаешь, демон, ты что делаешь?! Проваливай отсюда!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;10&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;10&amp;quot;&amp;gt;          &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_10&amp;lt;/text&amp;gt; -- &amp;quot;Ладно.&amp;quot;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- выход из диалога&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для начала лучше попробовать свои силы в простом линейном диалоге вроде этого.&amp;lt;br&amp;gt;&lt;br /&gt;
Да, и не забудьте добавить строки с текстовыми фразами в массив.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Если вам неясно, что за ахинея написана в текстах, вам [http://ru.youtube.com/watch?v=CdTIQ6BVlvw&amp;amp;feature=related сюда] xD&lt;br /&gt;
&lt;br /&gt;
===Дополнительные сведения по диалогам===&lt;br /&gt;
&lt;br /&gt;
===Скрипт-генерируемые диалоги===&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)</id>
		<title>Создание диалогов (полный обзор)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)"/>
				<updated>2008-08-10T16:11:08Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Текстовые (строковые) массивы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Статья в процессе написания...'''&lt;br /&gt;
&lt;br /&gt;
===Общие данные===&lt;br /&gt;
&lt;br /&gt;
В диалогах обычно задействуются три .xml-файла:&lt;br /&gt;
&lt;br /&gt;
* character_desc_x.xml&lt;br /&gt;
* dialogs_x.xml&lt;br /&gt;
* stable_dialogs_x.xml&lt;br /&gt;
&lt;br /&gt;
В них нам важны, соотвественно, списки присвоения диалогов персонажам, структуры диалогов и текстовые массивы для фраз.&lt;br /&gt;
&lt;br /&gt;
===Структура фраз===&lt;br /&gt;
&lt;br /&gt;
В общем виде диалог выглядит так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''диалог 001'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 0'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Так, чего хотел-то?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''1'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 1'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Задание для тебя есть. Возьмешься?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''21, 22'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 21'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Ну, давай.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''3'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 22'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Не, иди к черту.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''нет'''&amp;lt;br&amp;gt;&lt;br /&gt;
действие: '''выйти из диалога'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[фраза 3 и дальнейшее продолжение...]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''конец диалога'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В файлах эта структура записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Так, чего хотел-то?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Задание для тебя есть. Возьмешься?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Ну, давай.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;22&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Не, иди к черту.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[...]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберемся подробнее.&lt;br /&gt;
&lt;br /&gt;
Во-первых, принадлежность фраз.&lt;br /&gt;
Они могут принадлежать или игроку, или NPC, причем:&lt;br /&gt;
&lt;br /&gt;
* фраза, принадлежащая игроку, всегда идет первой, а за ней уже по древу диалога игра понимает, чья фраза кому принадлежит (например, у нас 0, 21, 22 - игрока; а 1, 3 - NPC)&lt;br /&gt;
* только у фразы, принадлежащей NPC, можно выбрать несколько вариантов ответа игрока&lt;br /&gt;
&lt;br /&gt;
Впрочем, и у фразы игрока можно сделать несколько вариантов ответов, но поскольку компьютер не обладает способностью самостоятельно выбирать, то каждый из вариантов должен быть заранее определен по условиям выбора (например, по наличию у игрока какого-нибудь предмета, или количества денег, или репутации и т.д.), причем условия выбора различных вариантов никогда не должны одновременно становиться подходящими. Это мы разберем позднее.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, структура фразы.&lt;br /&gt;
Простейшая фраза выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;    -- открывающий тег с ID фразы&lt;br /&gt;
	&amp;lt;text&amp;gt;Привет.&amp;lt;/text&amp;gt;    -- текст фразы&lt;br /&gt;
	&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;    -- ссылка на следующую фразу&lt;br /&gt;
&amp;lt;/phrase&amp;gt;    -- закрытие тега фразы&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но есть возможность строить и такие фразы (в данном случае она принадлежит NPC, а игрок на неё будет давать ответ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;propusk_given&amp;lt;/give_info&amp;gt; -- выдача инфопорции (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи пропуск. Теперь тебе охранник позволит войти.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.give_propusk_item&amp;lt;/action&amp;gt; -- ссылка на скрипт (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;23&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Здесь у нас выдается [[Инфопорция|инфопорция]], которая может потом использоваться в различных местах (например, её наличие может проверяться каким-нибудь охранником - и если она есть, то он, скажем, отойдет и пропустит игрока внутрь). Важно понимать отличие инфопорции от предмета. Инфопорция - это ''факт наличия'' пропуска, а лежащий в инвентаре пропуск - ''материальный предмет''. Можно, кстати, обойтись и без инфопорций, впоследствии пользуясь скриптами, проверяющими инвентарь игрока и ищущими нужный предмет, но этот способ сложен и нам пока не понадобится.&lt;br /&gt;
&lt;br /&gt;
* 2. Это скрипт, выдающий игроку предмет &amp;quot;пропуск&amp;quot; в инвентарь. Ссылка на скрипты дается в формате имя_файла.имя_функции.&lt;br /&gt;
&lt;br /&gt;
Как видите, фраза, в которой некий NPC выдает игроку пропуск, позволяющий пройти дальше, достаточно сложна.&lt;br /&gt;
&lt;br /&gt;
Вот еще один пример (здесь она принадлежит игроку):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;propusk_given&amp;lt;/has_info&amp;gt; -- проверка на наличие инфопорции propusk_given&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, пропуск у меня есть.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- ссылка на скрипт, завершающий диалог&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь у нас фраза из диалога игрока с NPC - та, что после вопроса NPC &amp;quot;А пропуск у тебя есть?&amp;quot;. Это один из вариантов ответа на неё. Особенность в том, что этот вариант не появится, если пропуска у вас на самом деле нет - она появляется только при наличии нужной инфопорции (за это отвечает строка с &amp;lt;has_info&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Далее, поподробнее остановимся на задании условий появления фразы.&amp;lt;br&amp;gt;&lt;br /&gt;
Способов это сделать - два.&lt;br /&gt;
&lt;br /&gt;
    * проверка на наличие инфопорций&lt;br /&gt;
    * проверка через скриптовую функцию&lt;br /&gt;
&lt;br /&gt;
Первый метод мы видели выше, а второй - гораздо более комплексный и многофункциональный. Он запускает скрипт, который проводит проверку определенных вещей, и возвращает true/false. Простой пример - NPC требует денег (скажем, 5000 рублей), а нам нужно, чтобы ответная фраза игрока &amp;quot;Вот, держи свои 5000.&amp;quot;, могла быть доступна для выбора, только если у нас действительно есть эти деньги. Для этого пишем такую фразу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи, ровно 5000.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.actor_have_5000&amp;lt;/precondition&amp;gt; -- вызываем условие (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.transfer_5000&amp;lt;/action&amp;gt; -- передача денег скриптом (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Этот скрипт который проверяет наличие денег: если было возвращено true, то фраза доступна.&lt;br /&gt;
* 2. Вызываем другой скрипт, действие - он осуществляет саму передачу денег.&lt;br /&gt;
&lt;br /&gt;
Да, кстати, порядок расстановки тегов внутри фразы не играет никакой роли - они все выполняются одновременно. Единственное - &amp;lt;next&amp;gt; всегда последний. Еще одно - есть второй вид проверки на инфопорцию - он наоборот, проверяет её отсутствие. Применяется точно так же, но называется не has_info, а dont_has_info.&lt;br /&gt;
&lt;br /&gt;
Итак, что у нас есть:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;phrase id=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/phrase&amp;gt;''' - общий тег фразы, задание номера фразы&lt;br /&gt;
* '''&amp;lt;text&amp;gt;...&amp;lt;/text&amp;gt;''' - тег, содержащий текст фразы&lt;br /&gt;
* '''&amp;lt;give_info&amp;gt;...&amp;lt;/give_info&amp;gt;''' - выдача инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;has_info&amp;gt;...&amp;lt;/has_info&amp;gt;''' - проверка на наличие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;dont_has_info&amp;gt;...&amp;lt;/dont_has_info&amp;gt;''' - проверка на отсутствие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;precondition&amp;gt;...&amp;lt;/precondition&amp;gt;''' - запуск скрипта, возвращающего true или false в зависимости от чего-либо (скриптовая проверка)&lt;br /&gt;
* '''&amp;lt;action&amp;gt;...&amp;lt;/action&amp;gt;''' - запуск скрипта&lt;br /&gt;
* '''&amp;lt;next&amp;gt;...&amp;lt;/next&amp;gt;''' - тег ссылки на следующую фразу&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В первой версии - достаточно просто окна с формами для ввода этих параметров. А программа на основе введенных данных будет собирать фразу. Например, на основе вот таких введенных в поля данных:&lt;br /&gt;
&lt;br /&gt;
Номер фразы: '''12'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Текст: ''Да, там сейчас база военных.&amp;lt;br&amp;gt;Я не в курсе, сколько их там точно, но&amp;lt;br&amp;gt;могу сказать, не меньше, чем один два отряда.''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Выдать инфопорцию: '''info_about_military_base'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Проверить наличие инфопорции: '''info_1'''&amp;lt;br&amp;gt;Проверить отсутствие инфопорции: '''нет'''&amp;lt;br&amp;gt;Проверить через скрипт: '''dialogs.is_npc_a_friend'''&amp;lt;br&amp;gt;Совершить действие: '''dialogs.break_dialog'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Номера следующих фраз: '''13'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нам нужна вот такая запись:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;info_1&amp;lt;/has_info&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, там сейчас база военных. Я не в курсе, сколько их там точно [...]&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.is_npc_a_friend&amp;lt;/precondition&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;info_about_military_base&amp;lt;/give_info&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;13&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Текстовые (строковые) массивы===&lt;br /&gt;
&lt;br /&gt;
Мы упустили один важный нюанс, критичный для крупных диалогов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы записывали текст фразы в &amp;lt;'''text&amp;gt;...&amp;lt;/text&amp;gt;'''. Это, безусловно, удобно, но на самом деле - может привести к проблемам. Дело в том, что таким образом можно использовать только короткие фразы. Стоит ввести в тег длинный текст, и игра... так сказать, не переварит наш диалог.&lt;br /&gt;
&lt;br /&gt;
Поэтому нужно использовать не тексты, а ссылки на них. Работает это так:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Text massive explain.jpg]]&lt;br /&gt;
&lt;br /&gt;
То есть фразу мы записываем так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в игре видим нормальный текст - игра по названию my_text_1 находит его в массиве.&amp;lt;br&amp;gt;&lt;br /&gt;
Массивы (для русскоязычной версии игры) находятся в папке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\text\rus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нужные вам тексты фраз вы можете прописывать в любом из находящихся там .xml-файлов, их разделение на специализации - чисто формальное. Лучше всего держать тексты всех ваших диалогов в одном месте, поэтому выберите один файл - этим вы упростите работу тем, кто будет скрещивать ваш мод с другими.&lt;br /&gt;
&lt;br /&gt;
Запись текста происходит в такой форме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;my_text_1&amp;quot;&amp;gt; -- в заголовке указывается имя текста, которое вызывается из диалога&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt; -- собственно, сам текст&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Диалоги===&lt;br /&gt;
&lt;br /&gt;
Ну что же, структуру фраз мы полностью разобрали. Теперь попробуем собрать из них полноценный диалог. Для начала выберем жертву для экспериментов - Сидорович вполне подойдет :)&lt;br /&gt;
&lt;br /&gt;
Откроем папку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\gameplay&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас нас интересует файл '''character_desc_escape.xml''', хранящий профили персонажей с локации &amp;quot;Кордон&amp;quot; (остальные файлы названы по аналогичной системе - вместо '''escape''', соответственно, идет название других уровней). Открываем его и видим профиль Сидоровича '''escape_trader''' - он находится в самом начале файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;escape_trader&amp;quot; no_random = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;name&amp;gt;escape_trader_name&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;icon&amp;gt;ui_npc_u_trader&amp;lt;/icon&amp;gt;&lt;br /&gt;
	&amp;lt;bio&amp;gt;escape_trader_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;class&amp;gt;trader&amp;lt;/class&amp;gt;&lt;br /&gt;
	&amp;lt;community&amp;gt;trader&amp;lt;/community&amp;gt;&lt;br /&gt;
	&amp;lt;visual&amp;gt;actors\trader\trader&amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;rank&amp;gt;330&amp;lt;/rank&amp;gt;&lt;br /&gt;
	&amp;lt;reputation&amp;gt;23&amp;lt;/reputation&amp;gt;&lt;br /&gt;
	&amp;lt;money min=&amp;quot;100000&amp;quot; max=&amp;quot;100000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
	&amp;lt;supplies&amp;gt;&lt;br /&gt;
		[spawn] \n&lt;br /&gt;
		wpn_knife \n&lt;br /&gt;
	&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробный разбор параметров профиля мы делать не будем - для этого существует [[Редактирование_NPC|отдельная статья]]. Сейчас нас интересуют теги &amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;, ссылающиеся на доступные у этого NPC диалоги. Добавим в этот список и ссылку на наш будущий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;my_dialog_1&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее добавим в любой диалоговый файл, например, в '''dialogs_escape.xml''', следующий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;my_dialog_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;my_script_for_dialogs.my_function_1&amp;lt;/precondition&amp;gt; -- условия можно вызывать и здесь&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; -- фразы Меченого&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_0&amp;lt;/text&amp;gt; -- &amp;quot;Ага, вот эти ребята...&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt; -- фразы Сидоровича&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt; -- &amp;quot;Ненене!!! Нет, Меченый, нет!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_2&amp;lt;/text&amp;gt; -- &amp;quot;Я делаю особую, уличную магию. Кто хочет увидеть немного магии?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;            &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_3&amp;lt;/text&amp;gt; -- &amp;quot;Что я тебе, Толик какой-нибудь? Целый день у этих идиотов из лагеря &lt;br /&gt;
			&amp;lt;next&amp;gt;4&amp;lt;/next&amp;gt;             разный хлам скупал, устал, хочу просто отдохнуть...&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_4&amp;lt;/text&amp;gt; -- &amp;quot;И что купил?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;5&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_5&amp;lt;/text&amp;gt; -- &amp;quot;Я купил зеленый свитер, если ты так хочешь знать! Сорок долларов,&lt;br /&gt;
			&amp;lt;next&amp;gt;6&amp;lt;/next&amp;gt;             между прочим.&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_6&amp;lt;/text&amp;gt; -- &amp;quot;Зеленый свитер? А ты уверен, что не купил тедди-бир?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;7&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_7&amp;lt;/text&amp;gt; -- &amp;quot;Тедди-бир?... ТЕДДИ-БИР!!! Где мой зеленый свитер, ты что делаешь, демон?!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_8&amp;lt;/text&amp;gt; -- &amp;quot;Ладно, ладно... еще один фокус. Будь добр, взгляни на телевизор &lt;br /&gt;
			&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;             рядом с тобой. Что он показывает?&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;9&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_9&amp;lt;/text&amp;gt; -- &amp;quot;Билд 1154!!! Ты что делаешь, демон, ты что делаешь?! Проваливай отсюда!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;10&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;10&amp;quot;&amp;gt;          &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_10&amp;lt;/text&amp;gt; -- &amp;quot;Ладно.&amp;quot;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- выход из диалога&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для начала лучше попробовать свои силы в простом линейном диалоге вроде этого.&amp;lt;br&amp;gt;&lt;br /&gt;
Да, и не забудьте добавить строки с текстовыми фразами в массив.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Если вам неясно, что за ахинея написана в текстах, вам [http://ru.youtube.com/watch?v=CdTIQ6BVlvw&amp;amp;feature=related сюда] xD&lt;br /&gt;
&lt;br /&gt;
===Дополнительные сведения по диалогам===&lt;br /&gt;
&lt;br /&gt;
===Скрипт-генерируемые диалоги===&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)</id>
		<title>Создание диалогов (полный обзор)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_(%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80)"/>
				<updated>2008-08-10T16:10:27Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Структура фраз */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Статья в процессе написания...'''&lt;br /&gt;
&lt;br /&gt;
===Общие данные===&lt;br /&gt;
&lt;br /&gt;
В диалогах обычно задействуются три .xml-файла:&lt;br /&gt;
&lt;br /&gt;
* character_desc_x.xml&lt;br /&gt;
* dialogs_x.xml&lt;br /&gt;
* stable_dialogs_x.xml&lt;br /&gt;
&lt;br /&gt;
В них нам важны, соотвественно, списки присвоения диалогов персонажам, структуры диалогов и текстовые массивы для фраз.&lt;br /&gt;
&lt;br /&gt;
===Структура фраз===&lt;br /&gt;
&lt;br /&gt;
В общем виде диалог выглядит так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''диалог 001'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 0'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Так, чего хотел-то?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''1'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 1'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Задание для тебя есть. Возьмешься?&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''21, 22'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 21'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Ну, давай.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''3'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''фраза 22'''&amp;lt;br&amp;gt;&lt;br /&gt;
''&amp;quot;Не, иди к черту.&amp;quot;''&amp;lt;br&amp;gt;&lt;br /&gt;
следующие фразы: '''нет'''&amp;lt;br&amp;gt;&lt;br /&gt;
действие: '''выйти из диалога'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[фраза 3 и дальнейшее продолжение...]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;'''конец диалога'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В файлах эта структура записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Так, чего хотел-то?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Задание для тебя есть. Возьмешься?&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Ну, давай.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;22&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;Не, иди к черту.&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		[...]&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберемся подробнее.&lt;br /&gt;
&lt;br /&gt;
Во-первых, принадлежность фраз.&lt;br /&gt;
Они могут принадлежать или игроку, или NPC, причем:&lt;br /&gt;
&lt;br /&gt;
* фраза, принадлежащая игроку, всегда идет первой, а за ней уже по древу диалога игра понимает, чья фраза кому принадлежит (например, у нас 0, 21, 22 - игрока; а 1, 3 - NPC)&lt;br /&gt;
* только у фразы, принадлежащей NPC, можно выбрать несколько вариантов ответа игрока&lt;br /&gt;
&lt;br /&gt;
Впрочем, и у фразы игрока можно сделать несколько вариантов ответов, но поскольку компьютер не обладает способностью самостоятельно выбирать, то каждый из вариантов должен быть заранее определен по условиям выбора (например, по наличию у игрока какого-нибудь предмета, или количества денег, или репутации и т.д.), причем условия выбора различных вариантов никогда не должны одновременно становиться подходящими. Это мы разберем позднее.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, структура фразы.&lt;br /&gt;
Простейшая фраза выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;    -- открывающий тег с ID фразы&lt;br /&gt;
	&amp;lt;text&amp;gt;Привет.&amp;lt;/text&amp;gt;    -- текст фразы&lt;br /&gt;
	&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;    -- ссылка на следующую фразу&lt;br /&gt;
&amp;lt;/phrase&amp;gt;    -- закрытие тега фразы&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но есть возможность строить и такие фразы (в данном случае она принадлежит NPC, а игрок на неё будет давать ответ):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;propusk_given&amp;lt;/give_info&amp;gt; -- выдача инфопорции (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи пропуск. Теперь тебе охранник позволит войти.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.give_propusk_item&amp;lt;/action&amp;gt; -- ссылка на скрипт (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;21&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;22&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;23&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Здесь у нас выдается [[Инфопорция|инфопорция]], которая может потом использоваться в различных местах (например, её наличие может проверяться каким-нибудь охранником - и если она есть, то он, скажем, отойдет и пропустит игрока внутрь). Важно понимать отличие инфопорции от предмета. Инфопорция - это ''факт наличия'' пропуска, а лежащий в инвентаре пропуск - ''материальный предмет''. Можно, кстати, обойтись и без инфопорций, впоследствии пользуясь скриптами, проверяющими инвентарь игрока и ищущими нужный предмет, но этот способ сложен и нам пока не понадобится.&lt;br /&gt;
&lt;br /&gt;
* 2. Это скрипт, выдающий игроку предмет &amp;quot;пропуск&amp;quot; в инвентарь. Ссылка на скрипты дается в формате имя_файла.имя_функции.&lt;br /&gt;
&lt;br /&gt;
Как видите, фраза, в которой некий NPC выдает игроку пропуск, позволяющий пройти дальше, достаточно сложна.&lt;br /&gt;
&lt;br /&gt;
Вот еще один пример (здесь она принадлежит игроку):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;propusk_given&amp;lt;/has_info&amp;gt; -- проверка на наличие инфопорции propusk_given&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, пропуск у меня есть.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- ссылка на скрипт, завершающий диалог&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь у нас фраза из диалога игрока с NPC - та, что после вопроса NPC &amp;quot;А пропуск у тебя есть?&amp;quot;. Это один из вариантов ответа на неё. Особенность в том, что этот вариант не появится, если пропуска у вас на самом деле нет - она появляется только при наличии нужной инфопорции (за это отвечает строка с &amp;lt;has_info&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Далее, поподробнее остановимся на задании условий появления фразы.&amp;lt;br&amp;gt;&lt;br /&gt;
Способов это сделать - два.&lt;br /&gt;
&lt;br /&gt;
    * проверка на наличие инфопорций&lt;br /&gt;
    * проверка через скриптовую функцию&lt;br /&gt;
&lt;br /&gt;
Первый метод мы видели выше, а второй - гораздо более комплексный и многофункциональный. Он запускает скрипт, который проводит проверку определенных вещей, и возвращает true/false. Простой пример - NPC требует денег (скажем, 5000 рублей), а нам нужно, чтобы ответная фраза игрока &amp;quot;Вот, держи свои 5000.&amp;quot;, могла быть доступна для выбора, только если у нас действительно есть эти деньги. Для этого пишем такую фразу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Вот, держи, ровно 5000.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.actor_have_5000&amp;lt;/precondition&amp;gt; -- вызываем условие (см. объяснение №1 ниже)&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.transfer_5000&amp;lt;/action&amp;gt; -- передача денег скриптом (см. объяснение №2 ниже)&lt;br /&gt;
	&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1. Этот скрипт который проверяет наличие денег: если было возвращено true, то фраза доступна.&lt;br /&gt;
* 2. Вызываем другой скрипт, действие - он осуществляет саму передачу денег.&lt;br /&gt;
&lt;br /&gt;
Да, кстати, порядок расстановки тегов внутри фразы не играет никакой роли - они все выполняются одновременно. Единственное - &amp;lt;next&amp;gt; всегда последний. Еще одно - есть второй вид проверки на инфопорцию - он наоборот, проверяет её отсутствие. Применяется точно так же, но называется не has_info, а dont_has_info.&lt;br /&gt;
&lt;br /&gt;
Итак, что у нас есть:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;phrase id=&amp;quot;...&amp;quot;&amp;gt;&amp;lt;/phrase&amp;gt;''' - общий тег фразы, задание номера фразы&lt;br /&gt;
* '''&amp;lt;text&amp;gt;...&amp;lt;/text&amp;gt;''' - тег, содержащий текст фразы&lt;br /&gt;
* '''&amp;lt;give_info&amp;gt;...&amp;lt;/give_info&amp;gt;''' - выдача инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;has_info&amp;gt;...&amp;lt;/has_info&amp;gt;''' - проверка на наличие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;dont_has_info&amp;gt;...&amp;lt;/dont_has_info&amp;gt;''' - проверка на отсутствие инфопорции с именем, записанным в теге&lt;br /&gt;
* '''&amp;lt;precondition&amp;gt;...&amp;lt;/precondition&amp;gt;''' - запуск скрипта, возвращающего true или false в зависимости от чего-либо (скриптовая проверка)&lt;br /&gt;
* '''&amp;lt;action&amp;gt;...&amp;lt;/action&amp;gt;''' - запуск скрипта&lt;br /&gt;
* '''&amp;lt;next&amp;gt;...&amp;lt;/next&amp;gt;''' - тег ссылки на следующую фразу&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В первой версии - достаточно просто окна с формами для ввода этих параметров. А программа на основе введенных данных будет собирать фразу. Например, на основе вот таких введенных в поля данных:&lt;br /&gt;
&lt;br /&gt;
Номер фразы: '''12'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Текст: ''Да, там сейчас база военных.&amp;lt;br&amp;gt;Я не в курсе, сколько их там точно, но&amp;lt;br&amp;gt;могу сказать, не меньше, чем один два отряда.''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Выдать инфопорцию: '''info_about_military_base'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Проверить наличие инфопорции: '''info_1'''&amp;lt;br&amp;gt;Проверить отсутствие инфопорции: '''нет'''&amp;lt;br&amp;gt;Проверить через скрипт: '''dialogs.is_npc_a_friend'''&amp;lt;br&amp;gt;Совершить действие: '''dialogs.break_dialog'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Номера следующих фраз: '''13'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нам нужна вот такая запись:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;12&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;info_1&amp;lt;/has_info&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Да, там сейчас база военных. Я не в курсе, сколько их там точно [...]&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;dialogs.is_npc_a_friend&amp;lt;/precondition&amp;gt;&lt;br /&gt;
	&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;give_info&amp;gt;info_about_military_base&amp;lt;/give_info&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;13&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Текстовые (строковые) массивы===&lt;br /&gt;
&lt;br /&gt;
Мы упустили один важный нюанс, критичный для крупных диалогов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы записывали текст фразы в &amp;lt;'''text&amp;gt;...&amp;lt;/text&amp;gt;'''. Это, безусловно, удобно, но на самом деле - может привести к проблемам. Дело в том, что таким образом можно использовать только короткие фразы. Стоит ввести в тег длинный текст, и игра... так сказать, не переварит наш диалог.&lt;br /&gt;
&lt;br /&gt;
Поэтому нужно использовать не тексты, а ссылки на них. Работает это так:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Text massive explain.jpg]]&lt;br /&gt;
&lt;br /&gt;
То есть фразу мы записываем так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;54&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;next&amp;gt;55&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в игре видим нормальный текст - игра по названию my_text_1 находит его в массиве.&amp;lt;br&amp;gt;&lt;br /&gt;
Массивы (для русскоязычной версии игры) находятся в папке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\text\rus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нужные вам тексты фраз вы можете прописывать в любом из находящихся там .xml-файлов, их разделение на специализации - чисто формальное. Лучше всего держать тексты всех ваших диалогов в одном месте, поэтому выберите один файл - этим вы упростите работу тем, кто будет скрещивать ваш мод с другими.&lt;br /&gt;
&lt;br /&gt;
Запись текста происходит в такой форме:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;my_text_1&amp;quot;&amp;gt; -- в заголовке указывается имя текста, которое вызывается из диалога&lt;br /&gt;
	&amp;lt;text&amp;gt;Здравствуй, сталкер. Чем я могу помочь тебе?&amp;lt;/text&amp;gt; -- собственно, сам текст&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Диалоги===&lt;br /&gt;
&lt;br /&gt;
Ну что же, структуру фраз мы полностью разобрали. Теперь попробуем собрать из них полноценный диалог. Для начала выберем жертву для экспериментов - Сидорович вполне подойдет :)&lt;br /&gt;
&lt;br /&gt;
Откроем папку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;S.T.A.L.K.E.R\gamedata\config\gameplay&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сейчас нас интересует файл '''character_desc_escape.xml''', хранящий профили персонажей с локации &amp;quot;Кордон&amp;quot; (остальные файлы названы по аналогичной системе - вместо '''escape''', соответственно, идет название других уровней). Открываем его и видим профиль Сидоровича '''escape_trader''' - он находится в самом начале файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;escape_trader&amp;quot; no_random = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;name&amp;gt;escape_trader_name&amp;lt;/name&amp;gt;&lt;br /&gt;
	&amp;lt;icon&amp;gt;ui_npc_u_trader&amp;lt;/icon&amp;gt;&lt;br /&gt;
	&amp;lt;bio&amp;gt;escape_trader_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;class&amp;gt;trader&amp;lt;/class&amp;gt;&lt;br /&gt;
	&amp;lt;community&amp;gt;trader&amp;lt;/community&amp;gt;&lt;br /&gt;
	&amp;lt;visual&amp;gt;actors\trader\trader&amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;rank&amp;gt;330&amp;lt;/rank&amp;gt;&lt;br /&gt;
	&amp;lt;reputation&amp;gt;23&amp;lt;/reputation&amp;gt;&lt;br /&gt;
	&amp;lt;money min=&amp;quot;100000&amp;quot; max=&amp;quot;100000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
	&amp;lt;supplies&amp;gt;&lt;br /&gt;
		[spawn] \n&lt;br /&gt;
		wpn_knife \n&lt;br /&gt;
	&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробный разбор параметров профиля мы делать не будем - для этого существует [[Редактирование_NPC|отдельная статья]]. Сейчас нас интересуют теги &amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;, ссылающиеся на доступные у этого NPC диалоги. Добавим в этот список и ссылку на наш будущий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;my_dialog_1&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее добавим в любой диалоговый файл, например, в '''dialogs_escape.xml''', следующий диалог:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;my_dialog_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;precondition&amp;gt;my_script_for_dialogs.my_function_1&amp;lt;/precondition&amp;gt; -- условия можно вызывать и здесь&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; -- фразы Меченого&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_0&amp;lt;/text&amp;gt; -- &amp;quot;Ага, вот эти ребята...&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt; -- фразы Сидоровича&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_1&amp;lt;/text&amp;gt; -- &amp;quot;Ненене!!! Нет, Меченый, нет!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_2&amp;lt;/text&amp;gt; -- &amp;quot;Я делаю особую, уличную магию. Кто хочет увидеть немного магии?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;            &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_3&amp;lt;/text&amp;gt; -- &amp;quot;Что я тебе, Толик какой-нибудь? Целый день у этих идиотов из лагеря &lt;br /&gt;
			&amp;lt;next&amp;gt;4&amp;lt;/next&amp;gt;             разный хлам скупал, устал, хочу просто отдохнуть...&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_4&amp;lt;/text&amp;gt; -- &amp;quot;И что купил?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;5&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_5&amp;lt;/text&amp;gt; -- &amp;quot;Я купил зеленый свитер, если ты так хочешь знать! Сорок долларов,&lt;br /&gt;
			&amp;lt;next&amp;gt;6&amp;lt;/next&amp;gt;             между прочим.&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_6&amp;lt;/text&amp;gt; -- &amp;quot;Зеленый свитер? А ты уверен, что не купил тедди-бир?&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;7&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_7&amp;lt;/text&amp;gt; -- &amp;quot;Тедди-бир?... ТЕДДИ-БИР!!! Где мой зеленый свитер, ты что делаешь, демон?!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_8&amp;lt;/text&amp;gt; -- &amp;quot;Ладно, ладно... еще один фокус. Будь добр, взгляни на телевизор &lt;br /&gt;
			&amp;lt;next&amp;gt;9&amp;lt;/next&amp;gt;             рядом с тобой. Что он показывает?&amp;quot;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;9&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_9&amp;lt;/text&amp;gt; -- &amp;quot;Билд 1154!!! Ты что делаешь, демон, ты что делаешь?! Проваливай отсюда!&amp;quot;&lt;br /&gt;
			&amp;lt;next&amp;gt;10&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;10&amp;quot;&amp;gt;          &lt;br /&gt;
			&amp;lt;text&amp;gt;my_text_10&amp;lt;/text&amp;gt; -- &amp;quot;Ладно.&amp;quot;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; -- выход из диалога&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для начала лучше попробовать свои силы в простом линейном диалоге вроде этого.&amp;lt;br&amp;gt;&lt;br /&gt;
Да, и не забудьте добавить строки с текстовыми фразами в массив.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Если вам неясно, что за ахинея написана в текстах, вам [http://ru.youtube.com/watch?v=CdTIQ6BVlvw&amp;amp;feature=related сюда] xD&lt;br /&gt;
&lt;br /&gt;
===Дополнительные сведения по диалогам===&lt;br /&gt;
&lt;br /&gt;
===Скрипт-генерируемые диалоги===&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Назначение скриптам горячих кнопок. Часть 1. Скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1._%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2008-08-10T15:50:56Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Траспорт */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
&lt;br /&gt;
Поизучав мод от камрада Jeppa, решил создать небольшое руководство по созданию новых интерфейсных окон, привязки скриптов на кнопки, реакцию на нажатия клавиш, спавн предметов прямо в игре.&lt;br /&gt;
''(если кто знает ссылку на первоисточник мода '''jeppa_s_mod__v1.05__incl.vehicles_946''', то поставьте ее плиз. я только ссылки на закачку находил)''&lt;br /&gt;
&lt;br /&gt;
К сожалению в самой игре возможность прибиндить запуск скрипта или еще какое действие на новую кнопку отсутствет, поэтому приходится придумывать что-то свое. Jeppa вышел из положения создав новое диалоговое окно на основе старого интерфейса загрузки спавн файлов. Он добавил на него 10 кнопок с описаниями, при нажатии на каждую вызывался какой-либо скрипт или функция.&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся следующие распакованные (или имеющиеся) файлы:&lt;br /&gt;
 config\system.ltx&lt;br /&gt;
 scripts\ui_main_menu.script&lt;br /&gt;
Остальное будем делать с нуля. Я придерживаюсь политики минимального вмешательства в уже имеющиеся файлы.&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
&lt;br /&gt;
Итак, как это сделать. Начнем с самого простого. Сначала создадим наш новый скрипт, который и будет заниматься вызовом других скриптов. Назовем его '''ui_cheat.script''' и положим ко всем остальным скриптам.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;collapsible collapsed&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Вот его содержание:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- инициализация&lt;br /&gt;
class &amp;quot;cheat&amp;quot; (CUIScriptWnd)&lt;br /&gt;
&lt;br /&gt;
function cheat:__init(owner) super()&lt;br /&gt;
	self.owner = owner&lt;br /&gt;
	self:InitControls()&lt;br /&gt;
	self:InitCallBacks()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:__finalize() end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitControls()&lt;br /&gt;
-- здесь будут все контролы &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cheat:InitCallBacks()&lt;br /&gt;
-- здесь будут все каллбаки (ну или обработчики)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- сразу созадим ф-ию для выхода&lt;br /&gt;
function cheat:on_quit()&lt;br /&gt;
	local console = get_console()&lt;br /&gt;
	self:GetHolder():start_stop_menu (self.owner, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu (self,true)&lt;br /&gt;
	self.owner:Show	(true)&lt;br /&gt;
-- если мы вызывались из игры, то убираем главное меню&lt;br /&gt;
	if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
		console:execute(&amp;quot;main_menu off&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Теперь нужно как-то этот скрипт вызвать. Я решил пойти по проторенной дорожке, и вызывать его из главного меню. Пока мы не будем создавать там новых кнопок, а повесим его запуск на горячую клавишу. Например на F1, из игры будет удобно жать Esc и сразу F1. Но можете и другую кнопку использовать. Итак, открываем файл '''ui_main_menu.script''', идем в самый конец и ищем там такую ф-ию:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnKeyboard(dik, keyboard_action)&amp;lt;/code&amp;gt;&lt;br /&gt;
Это обработчик нажатий клавиш. Ииспользуемые клавиши перечислены в '''lua_help.script''' (ищите строку ''C++ class DIK_keys''). Итак, вместо&lt;br /&gt;
&amp;lt;code lua&amp;gt;--	if dik == DIK_keys.DIK_S then&lt;br /&gt;
--		self:OnButton_load_spawn()&lt;br /&gt;
			&lt;br /&gt;
--	else&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&amp;lt;/code&amp;gt;&lt;br /&gt;
мы напишем&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- раскоментируем и заоодно включим убранное спавн меню &lt;br /&gt;
if	dik == DIK_keys.DIK_S then&lt;br /&gt;
	self:OnButton_load_spawn()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_Q then&lt;br /&gt;
	self:OnMessageQuitWin()&lt;br /&gt;
-- а вот это обработка кнопки F1. при ее нажатии будет вызываться ф-ия OnButton_cheat()&lt;br /&gt;
elseif 	dik == DIK_keys.DIK_F1 then&lt;br /&gt;
	self:OnButton_cheat()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;То есть при нажатии на '''S''' будет вызывать спавн меню, на '''Q''' - мгновенный выход из игры, ну а '''F1''' запустит функцию ''OnButton_cheat()''. &lt;br /&gt;
То есть, вот один из вариантов запуска, привязка к горячей клавише. Но еще нет самой ф-ии, поэтому допишем в конец файла:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function main_menu:OnButton_cheat()&lt;br /&gt;
-- если еще ни разу не вызывали, то обозначим наш новый скрипт&lt;br /&gt;
	if self.cheat_dlg == nil then&lt;br /&gt;
		self.cheat_dlg = ui_cheat.cheat()&lt;br /&gt;
		self.cheat_dlg.owner = self&lt;br /&gt;
	end&lt;br /&gt;
-- останавливаем родительский элемент, запускаем свой, но родителя показываем.&lt;br /&gt;
	self:GetHolder():start_stop_menu(self.cheat_dlg, true)&lt;br /&gt;
	self:GetHolder():start_stop_menu(self, true)&lt;br /&gt;
	self:Show(true)&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
Запуск по кнопке уже есть, но нет возврата обратно. Исправим это, вернемся к файлу '''ui_cheat.script''' и сделаем там обработчик нажатий клавиш. В конец файла допишем:&lt;br /&gt;
&amp;lt;code lua&amp;gt;function cheat:OnKeyboard(dik, keyboard_action)&lt;br /&gt;
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
-- сразу же производим действия для возврата&lt;br /&gt;
		self:on_quit()&lt;br /&gt;
-- на выход повесим Esc&lt;br /&gt;
		if dik == DIK_keys.DIK_ESCAPE then&lt;br /&gt;
-- тут ничего не делаем&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь надо проверить работоспособность. Запускаем игру, в главном меню жмем '''F1''', анимация должна тормознуть, мышь бегать. Если произошел вылет - открываем блокнот и вставляем из буфера предсмертное послание игры. (Надеюсь, все помнят, что при ошибке и краше в буфере остается лог ошибки?) Если вылета нет, то нажимаем '''Esc''' и возвращаемся в меню. Такую же проверку желательно провести и в самой игре. Визуально должен пропасть HUD, но должна остаться картинка. Можно снимать скриншоты :)&lt;br /&gt;
&lt;br /&gt;
== Предметы ==&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача в том, чтобы в обработчик нажатий клавиш внести новые ф-ии. Начнем, например, со спавна предметов. Посмотрим, как спавнятся квестовые монстры и вещи и сделаем также (добаляем в конец '''ui_cheat.script'''):&lt;br /&gt;
&amp;lt;code lua&amp;gt;-- spawn_item - необходимый предмет&lt;br /&gt;
-- dist - радиус появления (случайно)&lt;br /&gt;
function cheat:spawn_item(spawn_item, dist)&lt;br /&gt;
	local pos = db.actor:position()&lt;br /&gt;
	local dir = db.actor:direction()&lt;br /&gt;
	pos = pos:add(dir:mul(dist))&lt;br /&gt;
-- создаем предмет в dist метрах прямо перед нами&lt;br /&gt;
	alife():create(spawn_item, pos, 1, db.actor:game_vertex_id())&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Можно спавнить предметы прямо в инвентарь -- Neo][|&lt;br /&gt;
message = Функция будет выглядеть следующим образом(соответственно надо учитывать отсутствие параметра dist, при вызове функции и не применять при спавне техники и монстров):&lt;br /&gt;
&amp;lt;pre&amp;gt;function cheat:spawn_item(spawn_item)&lt;br /&gt;
 	alife():create	(spawn_item, db.actor:position(),  db.actor:level_vertex_id(),&lt;br /&gt;
 			db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
 end&amp;lt;/pre&amp;gt;}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Добавление от HikeR.&lt;br /&gt;
Таким образом, кстати, передаются квестовые предметы. Используйте в своих скриптах и новых квестах.&lt;br /&gt;
Функцию можно добавить к существующей, тогда при ее вызове будет проверятся количество аргументов&lt;br /&gt;
и вызываться нужная. В С++ это называется &amp;quot;перегрузка&amp;quot; (если не ошибаюсь ;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь необходимо вызвать эту функцию. Привяжем кнопки '''1''' и '''2''' на цифровой клавиатуре к появлению Грозы и патронов к ней. В функцию '''cheat:OnKeyboard''' после строки:&lt;br /&gt;
&amp;lt;code lua&amp;gt;if dik == DIK_keys.DIK_ESCAPE then&amp;lt;/code&amp;gt;&lt;br /&gt;
добавим следующее:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD1 then self:cheat1()&lt;br /&gt;
elseif dik == DIK_keys.DIK_NUMPAD2 then self:cheat2()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и создадим эти функции (опять добавляем в конец файла):&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat1()&lt;br /&gt;
-- колдуем грозу на расстоянии 3 метров.&lt;br /&gt;
	self:spawn_item(&amp;quot;wpn_groza&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
function cheat:cheat2()&lt;br /&gt;
	self:spawn_item(&amp;quot;ammo_9x39_sp5&amp;quot;, 3)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Транспорт ==&lt;br /&gt;
&lt;br /&gt;
Спавнить транспорт мы будем аналогично, но тут есть небольшая проблема. В конфигах для траспорта отсутствуют необходимые параметры, все-таки машины в игре были вырезаны. Но нам это не помеха, поэтому начнем с Нивы.&lt;br /&gt;
&lt;br /&gt;
Создадим новый файл с именем cars_spawn.ltx&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[ven_niva]&lt;br /&gt;
class		= SCRPTCAR&lt;br /&gt;
cform           = skeleton&lt;br /&gt;
visual		= physics\vehicles\niva\veh_niva_u_01.ogf&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраним его к остальным конфигам транспорта, то есть в '''config\models\vehicles'''. Это минимальный набор для правильного появление нового объекта в игре. Но игра еще не знает, что мы добавили новый конфиг, поэтому немного подредактируем '''system.ltx'''. В начале файла есть множество команд '''#include ...''', они подключают конфиги. найдем последний include и добавим наш конфиг:&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;quot;models\vehicles\cars_spawn.ltx&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Далее по накатанной дорожке. Допишем функцию вызова спавна:&lt;br /&gt;
&amp;lt;code lua&amp;gt;&lt;br /&gt;
function cheat:cheat3()&lt;br /&gt;
	self:spawn_item(&amp;quot;ven_niva&amp;quot;, 5, 10)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
и назначим ей кнопку 3 на цифровой клавиатуре:&lt;br /&gt;
&amp;lt;code lua&amp;gt;elseif dik == DIK_keys.DIK_NUMPAD3 then self:cheat3()&amp;lt;/code&amp;gt;&lt;br /&gt;
Все. Можно запускаться и смотреть. Жмем Esc, потом F1 (главное меню пропадает, остается просто картинка), потом 1, 2 или 3 на цифровой клавиатуре. в выбранном радиусе будут появляться автоматы, патроны и Нивы.&lt;br /&gt;
&lt;br /&gt;
Однако, оружие и боеприпасы при появлении падают на землю, а вот траспорт остается висеть в воздухе. Я пытаюсь понять, что можно сделать, но пока просто киньте в нее болт. Машина упадет и покатится, если стоит на неровной поверхности.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует...&lt;br /&gt;
&lt;br /&gt;
== Монстры ==&lt;br /&gt;
&lt;br /&gt;
Аналогично добавляем монстров и прочую живность. Функция:&lt;br /&gt;
 function cheat:cheat4()&lt;br /&gt;
 -- создаем монстра подальше от нас&lt;br /&gt;
 	self:spawn_item(&amp;quot;dog_weak&amp;quot;, 20)&lt;br /&gt;
 end&lt;br /&gt;
Обработка клавиши '''4'''&lt;br /&gt;
 elseif dik == DIK_keys.DIK_NUMPAD4 then	self:cheat4()&lt;br /&gt;
&lt;br /&gt;
== Сон по желанию ==&lt;br /&gt;
&lt;br /&gt;
Если у Вас установлен Dream mod, то можно и его повесить на кнопку.&lt;br /&gt;
 function cheat:cheat5()&lt;br /&gt;
 	sleep_manager.sleep_three_hours()&lt;br /&gt;
 end&lt;br /&gt;
Предполагается, что имя скрипта '''sleep_manager.script''', а в нем есть функция '''sleep_three_hours()''', то есть спать 3 часа. Сам я не пользовал этот мод, поэтому могу ошибаться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Прим. от Empro: лично у меня не заработало и повисло. Вообще, вызывать сон из главного меню, да ещё и в режиме паузы - неблагодарное дело.&lt;br /&gt;
Прим. от HikeR: сначала снять с паузы, а потом спать. Тогда все работает.&lt;br /&gt;
&lt;br /&gt;
== Внимание!!! ==&lt;br /&gt;
&lt;br /&gt;
При описанном способе спавна есть некоторые трудности. Предмет создает в направлении вектора игрока, который не всегда совпадает с направдением взгляда. Можете включить внешний обзор и увидеть, что при небольших поворотах ноги игрока не двигаются. Чтобы гарантированно повернуться сделайте пару шагов вперед&lt;br /&gt;
&lt;br /&gt;
Желательно выбирать ровную поверхность, либо поверхность с наклоном '''от''' игрока. Если спавнить '''в гору''' - то предмет вообще не появится, вернее он появится, но провалится под уровень.&lt;br /&gt;
&lt;br /&gt;
== Ссылки на ресурсы ==&lt;br /&gt;
&lt;br /&gt;
[[Скрипт ui script|Полный текст скрипта ui_cheats.script]]&lt;br /&gt;
&lt;br /&gt;
== Благодарности ==&lt;br /&gt;
&lt;br /&gt;
*'''Jeppa''' - за толчок в сторону изучения этой стороны скриптинга&lt;br /&gt;
*'''[http://forums.ag.ru/?action=viewprofile&amp;amp;username=Red75 Red75]''' - за расчет координат спавна (появление прямо перед нами)&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
А дальше плавно переходим к облагораживанию, иначе говоря - к [[Назначение скриптам горячих кнопок. Часть 2. Интерфейс|интерфейсу]].&lt;br /&gt;
&lt;br /&gt;
--[[Участник:HikeR|HikeR]] 23:37, 20 мая 2007 (MSD)&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_1:_Hello_World_%D0%B8%D0%BB%D0%B8_%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9_%D0%BA%D1%83%D0%B1%D0%B8%D0%BA.</id>
		<title>Maya. Глава 1: Hello World или первый кубик.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_1:_Hello_World_%D0%B8%D0%BB%D0%B8_%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9_%D0%BA%D1%83%D0%B1%D0%B8%D0%BA."/>
				<updated>2008-08-10T15:50:01Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}Естественно, первый раз взявшись за пакет, охото проверить его на работоспособность и получить первое представление о том, как происходит процесс создания объектов. Собственно для этого мы и создадим первую комнату с четырьмя стенами и полом. В данной главе не будут рассматриваться подробности процесса создания моделей, как я уже сказал, она для того, чтобы получить общее впечатление о том, с чем придётся иметь дело.&lt;br /&gt;
&lt;br /&gt;
Если по ходу чтения статьи возникли вопросы или предложения, задать их можно на [[Обсуждение:Maya. Глава 1: Hello World или первый кубик.|страничке обсуждения этой статьи]].&lt;br /&gt;
&lt;br /&gt;
== Шаг 1. Настраиваем плагины. ==&lt;br /&gt;
&lt;br /&gt;
Важный шаг, но его рассписывать пока не буду, так как он описан в [http://sdk.stalker-game.com/ru/index.php/Docs:%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8 официальном руководстве]. Дополнительная информация к официальной справке есть на этом сайте в статье [[Создание уровня, пошаговое руководство#Установка и настройка плагина|создание уровня, пошаговое руководство]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 2. Настраиваем сцену. ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы после экспорта модели не возникло недоразумений и просто для удобства работы необходимо настроить следующие вещи:&lt;br /&gt;
&lt;br /&gt;
=== Единицы измерения ===&lt;br /&gt;
&lt;br /&gt;
1. Открываем диалог настроек '''Window -&amp;gt; Settings/Preferences -&amp;gt; Preferences'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 001.jpg|center|250px|thumb|Рисунок 1. Открываем диалог редактирования настроек программы.]]&lt;br /&gt;
&lt;br /&gt;
2. В открывшемся диалоге, в списке '''Categories''' выбираем пункт '''Settings'''&lt;br /&gt;
&lt;br /&gt;
3. Изменяем параметр '''Linear''' на '''meter'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 002.jpg|center|500px|thumb|Рисунок 2. Меняем еденицы измерения на метры.]]&lt;br /&gt;
&lt;br /&gt;
4. Нажимаем '''Save'''.&lt;br /&gt;
&lt;br /&gt;
=== Настройка меню ===&lt;br /&gt;
&lt;br /&gt;
Так как работать нам придётся с полигонами, то имеет смысл перевести меню в режим работы с полигонами. Делается это следующим образом: в том же окне редактирования настроек, что и &lt;br /&gt;
в предыдущем пункте, только в категории '''Interface''', опцию '''MenuSet''' изменяем на '''Polygons''' и нажимаем '''Save'''.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 010.jpg|center|500px|thumb|Рисунок 3. Настройка меню для работы с полигонами.]]&lt;br /&gt;
&lt;br /&gt;
=== Настройка камеры ===&lt;br /&gt;
&lt;br /&gt;
Раз единицы измерения увеличились в 100 раз, то и дальность отображения камеры необходимо увеличить в 100 раз&lt;br /&gt;
&lt;br /&gt;
Для этого в меню камеры выбираем '''View -&amp;gt; Camera Attribute Editor''' в открывшемся диалоге изменяем параметры:&lt;br /&gt;
&lt;br /&gt;
* Near Clip Plane на 0.1 (!!! Внимание: десятичная дробная часть числа отделяется точкой, а не запятой)&lt;br /&gt;
* Far Clip Plane на 1000&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 003.jpg|center|500px|thumb|Рисунок 4. Настройка дальности видимости камеры.]]&lt;br /&gt;
&lt;br /&gt;
Как вы, возможно, знаете, в игре есть два типа полигонов:&lt;br /&gt;
&lt;br /&gt;
* односторонние — только одна сторона видимая, если посмотреть на этот полигон с обратной стороны, вы ничего не увидите.&lt;br /&gt;
* двусторонние — обе стороны видимы.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы не запутаться где у одностороннего полигона какая сторона, отметим следующие пункты в меню камеры:&lt;br /&gt;
&lt;br /&gt;
* Smooth Shade All&lt;br /&gt;
* Backface Culling&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 004.jpg|center|500px|thumb|Рисунок 5. Данные пункты необходимо отметить, чтобы не запутаться где лицевая, а где обратная сторона создаваемой модели.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 3. Создаём кубик. ==&lt;br /&gt;
&lt;br /&gt;
Ну вот, приступим:&lt;br /&gt;
&lt;br /&gt;
1. Выбираем в меню '''Create -&amp;gt; Polygon Primitives -&amp;gt; Значок рядом с Cube'''. Выбираем именно значок рядом с Cube, как показано на скриншоте ниже, это открывает нам меню ручной настройки создаваемого примитива.&lt;br /&gt;
&lt;br /&gt;
2. Для того, чтоб габариты созданного кубика были 5х5х5 м, в открывшемся окне параметры '''Width''' (ширина), '''Height''' (высота) и '''Depth''' (длина) устанавливаем на значение 5.&lt;br /&gt;
&lt;br /&gt;
3. Кликаем в произвольном месте в окне камеры, желательно ближе к центру. В этом месте у нас появится кубик&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 005.jpg|center|500px|thumb|Рисунок 6. Ручная настройка габаритов кубика.]]&lt;br /&gt;
&lt;br /&gt;
В результате, вы должны увидеть примерно следующее:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 006.jpg|center|500px|thumb|Рисунок 7. Кубик 5х5х5 м.]]&lt;br /&gt;
&lt;br /&gt;
Немножко отвлечёмся: как я раньше говорил, игра использует двусторонние и односторонние полигоны. В рассматриваемом сейчас примере мы будем использовать односторонние. Созданный кубик по умолчанию имеет полигоны видимые только снаружи. Для того чтобы нам поместить человека внутрь кубика необходимо вывернуть кубик наизнанку, то есть сделать так, чтобы видимые стороны полигонов, обращённые к игроку, были внутри кубика. Внимание, прежде чем продолжать удостоверьтесь ещё раз, что в тех настройках камеры, которые я описывал выше отмечена галочка на '''Backface Culling''' иначе для вас все полигоны будут отображаться как двусторонние.&lt;br /&gt;
&lt;br /&gt;
Выворачиваем:&lt;br /&gt;
&lt;br /&gt;
1. Выделяем кубик.&lt;br /&gt;
&lt;br /&gt;
2. Выбираем в меню пункт '''Normals -&amp;gt; Reverse'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 008.jpg|center|500px|thumb|Рисунок 8. Данный пункт меню меняет лицевую и оборотную сторону полигона местами.]]&lt;br /&gt;
&lt;br /&gt;
Должно получиться что-то наподобие этого:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 009.jpg|center|500px|thumb|Рисунок 9. Теперь кубик вывернут наизнанку.]]&lt;br /&gt;
&lt;br /&gt;
Всё, теперь нам, для получения желаемой модели кубика осталось только убрать у него верхнюю грань, для этого:&lt;br /&gt;
&lt;br /&gt;
1. Кликаем на кубике правой кнопкой мыши, раскроется меню, в нём выбираем пункт '''Face''', теперь мы получаем возможность манипулировать гранями кубика:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya tutor 007.jpg|center|500px|thumb|Рисунок 10. Переходим в режим редактирования Faces.]]&lt;br /&gt;
&lt;br /&gt;
2. Кликаем по центру верхнего полигона, который теперь выделен синимквадратиком. Выделенный полигон кубика должен подсветиться.&lt;br /&gt;
&lt;br /&gt;
3. Нажимаем на Delete на клавиатуре.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya_tutor_011.png|center|530px|thumb|Рисунок 11. Удаляем верх у кубика.]]&lt;br /&gt;
&lt;br /&gt;
Всё, желаемая модель получена, теперь время перейти к следующему этапу моделирования.&lt;br /&gt;
&lt;br /&gt;
== Шаг 4. Текстурирование. ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы не усложнять пример, этот шаг пока мы пропустим.&lt;br /&gt;
&lt;br /&gt;
== Шаг 5. Экспорт сцены из Maya. ==&lt;br /&gt;
&lt;br /&gt;
Для экспорта:&lt;br /&gt;
&lt;br /&gt;
1. Нажмите в меню '''File -&amp;gt; Export All...'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya_tutor_012.jpg|center|150px|thumb|Рисунок 12. File -&amp;gt; Export All....]]&lt;br /&gt;
&lt;br /&gt;
2. Сохраняем файл в директорию '''X:\import\''' под именем '''mp_cube''' (Х - это диск который создаётся .bat файлом идущим в комплекте с SDK, если он у вас не создан, тогда зайдите в меню пуск и в меню программ запустите следующий файл: '''X-Ray SDK \ Map X-Drive''')&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya_tutor_013.jpg|center|300px|thumb|Рисунок 13. Экспортируем в mp_cube.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 6. Импорт объекта в LevelEditor и настройка сцены ==&lt;br /&gt;
&lt;br /&gt;
=== Импорт и настройка свойств объекта ===&lt;br /&gt;
&lt;br /&gt;
Экспорт объектов хорошо рассмотрен в официальной справке, но на всякий случай я дам порядок выполнения операций с краткими комментариями.&lt;br /&gt;
&lt;br /&gt;
1. Выбираем в меню пункт '''Object -&amp;gt; Object Lybrary'''.&lt;br /&gt;
&lt;br /&gt;
2. Создаём папку для объектов нашего уровня, я назвал её ''mp_test_cube'' (можно сделать с помощью правой кнопки мыщи, в раскрывшемся меню выбрать '''Create Folder''').&lt;br /&gt;
&lt;br /&gt;
3. Выбираем нашу папку и жмём '''Import Object''', выбираем сохранённый нами файл '''X:\import\mp_cube'''. Импортированный файл должен появиться в библиотеке объектов.&lt;br /&gt;
&lt;br /&gt;
4. Выбираем в библиотеке импортированный нами объект и жмём '''Properties'''.&lt;br /&gt;
&lt;br /&gt;
5. Откроется меню свойств объекта, там нас интересует пункт '''Texture''', жмём на троеточие рядом с этим пунктом (см. скриншот ниже). Откроется меню выбора текстур, выбираем любую понравившуюся и жмём ОК.&lt;br /&gt;
&lt;br /&gt;
6. Сохраняем изменения в библиотеке объектов.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya_tutor_016.jpg|center|650px|thumb|Рисунок 14. Назначаем текстуру нашему объекту.]]&lt;br /&gt;
&lt;br /&gt;
=== Добавляем объект в уровень ===&lt;br /&gt;
&lt;br /&gt;
1. Жмём '''Multiple Append'''.&lt;br /&gt;
&lt;br /&gt;
2. В открывшемся окне ставим галочку на нашем объекте.&lt;br /&gt;
&lt;br /&gt;
3. Жмём ОК, наш объект должен появиться в создаваемом нами уровне.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Maya_tutor_018.jpg|center|400px|thumb|Рисунок 15. Добавляем объект в уровень.]]&lt;br /&gt;
&lt;br /&gt;
=== Добавляем необходимые объекты ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы запустить уровень нам необходимо добавить следующие 3 объекта:&lt;br /&gt;
# Респаун игрока ('''$rpoint''')&lt;br /&gt;
# Объект '''Light'''&lt;br /&gt;
# Объект '''Glow'''&lt;br /&gt;
&lt;br /&gt;
И так добавляем:&lt;br /&gt;
# Респаун:[[Изображение:Maya_tutor_019.jpg|center|500px|thumb|Рисунок 16. Добавляем респаун игрока.]]&lt;br /&gt;
# Light:[[Изображение:Maya_tutor_021.jpg|center|500px|thumb|Рисунок 17. Добавляем Light.]]&lt;br /&gt;
# Glow:[[Изображение:Maya_tutor_020.jpg|center|500px|thumb|Рисунок 18. Добавляем Glow.]]&lt;br /&gt;
&lt;br /&gt;
=== Настраиваем сцену ===&lt;br /&gt;
&lt;br /&gt;
# Заходим в меню '''Scene -&amp;gt; Options'''&lt;br /&gt;
# Правим параметры отмеченные на скриншоте:[[Изображение:Maya_tutor_022.jpg|center|500px|thumb|Рисунок 19. Настраиваем сцену.]]&lt;br /&gt;
# Теперь сохраняем сцену как '''mp_test_cube'''&lt;br /&gt;
# Всё жмём '''Compile -&amp;gt; Build''', после того как билд закончится закрываем едитор и приступаем к следующему шагу&lt;br /&gt;
&lt;br /&gt;
== Шаг 7. Компиляция ==&lt;br /&gt;
&lt;br /&gt;
1. Заходим в меню '''Пуск -&amp;gt; Выполнить'''&lt;br /&gt;
2. Набираем X:\xrLC.bat mp_test_cube [[Изображение:Maya_tutor_023.jpg|347px|center|thumb|Рисунок 20. Запускаем компиляцию.]]&lt;br /&gt;
3. По окончании компиляции нажмите ОК. [[Изображение:Maya_tutor_024.jpg|500px|center|thumb|Рисунок 21. Компиляция окончена.]]&lt;br /&gt;
&lt;br /&gt;
Добавил Haron 04.02.2008 01:11&lt;br /&gt;
ПРИМЕЧАНИЕ!&lt;br /&gt;
&lt;br /&gt;
Есть такое число, - ограничение на количество полигонов в отдельном объекте на карте, это ~150000. На самом деле, это число на порядок ниже. Экспериментально установлено, что если количество полигонов в каком-либо объекте на карте превышает ~ 80000 - 90000, компилятор уровня (xrLC.exe) при компиляции, - тупо слетает на фазе Build UW Mapping.&lt;br /&gt;
&lt;br /&gt;
== Шаг 8. Запускаем уровень ==&lt;br /&gt;
&lt;br /&gt;
Для запуска нам необходимо:&lt;br /&gt;
# Скопировать следующие файлы:&lt;br /&gt;
## Файл '''level_editor\gamedata\config\mp\map_list.ltx''' в папку '''S.T.A.L.K.E.R\gamedata\config\mp\'''&lt;br /&gt;
## Содержимое папки '''level_editor\gamedata\levels\mp_test_cube\''' в папку '''S.T.A.L.K.E.R\gamedata\levels\mp_test_cube\'''&lt;br /&gt;
# Добавить в список карт '''S.T.A.L.K.E.R\gamedata\config\mp\map_list.ltx''' (файл можно открыть обычным блокнотом) нашу карту [[Изображение:Maya_tutor_015.jpg|250px|center|thumb|Рисунок 22. Добавляем нашу карту в список доступных.]]&lt;br /&gt;
&lt;br /&gt;
Всё карту можно пробовать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Изображение:Maya_tutor1_screen1.jpg|center|250px|thumb|Скрин 1.]]||[[Изображение:Maya_tutor1_screen2.jpg|center|250px|thumb|Скрин 2.]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перенёс твой вопрос на страничку обсуждения стаьи (см выше)&lt;br /&gt;
&lt;br /&gt;
== Полезные ссылки ==&lt;br /&gt;
&lt;br /&gt;
# [http://sdk.stalker-game.com/ru/index.php/MOD-%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB_S.T.A.L.K.E.R.:_Shadow_of_Chernobyl MOD-портал S.T.A.L.K.E.R.: Shadow of Chernobyl]&lt;br /&gt;
# [http://usa.autodesk.com/adsk/servlet/index?siteID=123112&amp;amp;id=8782084 Офицальный хэлп Maya]&lt;br /&gt;
# [[Создание уровня, пошаговое руководство]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_3:_%D0%9F%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B,_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%BE_%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%B0%D1%82%D1%8C_%D0%BA_%D1%83%D1%80%D0%BE%D0%BA%D0%B0%D0%BC.</id>
		<title>Maya. Глава 3: Полезные советы, которые трудно привязать к урокам.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_3:_%D0%9F%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B,_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5_%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%BE_%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%B0%D1%82%D1%8C_%D0%BA_%D1%83%D1%80%D0%BE%D0%BA%D0%B0%D0%BC."/>
				<updated>2008-08-10T15:49:38Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом разделе находятся советы, которые скорей всего пригодятся по ходу работы над уровнем, но рассмотрение которых в уроках будет сильно перегружать информационно статью.&lt;br /&gt;
&lt;br /&gt;
== Считаем полигоны ==&lt;br /&gt;
&lt;br /&gt;
Все мы помним что весь уровень должен быть не больше 150 тысяч треугольников, и чтоб не проворонить это магическое число, отметьте галочкой в меню следующий пункт: '''Display -&amp;gt; Heads Up Display -&amp;gt; Poly Count'''&lt;br /&gt;
&lt;br /&gt;
В результате вы увидете детальную статистику по вашей сцене (первая колонка статистика - на всей сцене, вторая - в текущем окне, третья - по выделенным объектам), треугольники - '''Tris''': [[Изображение:Maya_tutor3_1.jpg|400px|center|thumb|Рисунок 1. Статистика сцены.]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]][[Категория:Незаконченные статьи]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_2:_%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%BB%D0%B0%D0%BC%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D1%81%D1%82%D0%B5%D0%BD%D0%BA%D1%83.</id>
		<title>Maya. Глава 2: Необходимые основы моделирования или проламываем стенку.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_2:_%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%BB%D0%B0%D0%BC%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D1%81%D1%82%D0%B5%D0%BD%D0%BA%D1%83."/>
				<updated>2008-08-10T15:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}В этой статье я опишу как быстро (у меня создание этой сцены, вместе с рисованием текстуры заняло меньше 10 минут) сцену дома с проломом в стене, выглядящую примерно следующим образом: [[Изображение:Maya_tutor2_1.jpg|350px|center|thumb|Рисунок 1. Так будет выглядеть созданная нами сцена.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 1. Настраиваем сцену. ==&lt;br /&gt;
&lt;br /&gt;
О [[Maya. Глава 1: Hello World или первый кубик.#Шаг 2. Настраиваем сцену.|настройках котрые я упоминал в предидущей главе]] повторяться не буду, сразу перейду к тем, котрые мы ещё не рассматривали.&lt;br /&gt;
&lt;br /&gt;
Для удобства работы настроим сетку и привязку к ней:&lt;br /&gt;
&lt;br /&gt;
=== Настраиваем сетку ===&lt;br /&gt;
&lt;br /&gt;
Включить сетку можно поставив галочку в меню '''Display -&amp;gt; Grid'''&lt;br /&gt;
[[Изображение:Maya_tutor2_3.jpg|180px|center|thumb|Рисунок 2. Включаем сетку.]]&lt;br /&gt;
&lt;br /&gt;
В том же меню, нажав на расширенные настройки мы можем настроить её:[[Изображение:Maya_tutor2_4.jpg|174px|center|thumb|Рисунок 3. Заходим в настройку.]]&lt;br /&gt;
&lt;br /&gt;
Я, для удобства, сделал это следующим образом:[[Изображение:Maya_tutor2_2.jpg|400px|center|thumb|Рисунок 4. Настраиваем сетку.]]&lt;br /&gt;
&lt;br /&gt;
=== Включаем привязку к сетке ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы включить привязку к сетке нужно нажать на следующий значок, на понели инструментов:[[Изображение:Maya_tutor_014.jpg|145px|center|thumb|Рисунок 5. Включаем привязку.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 2. Моделируем сцену ==&lt;br /&gt;
&lt;br /&gt;
=== Создаём полигон ===&lt;br /&gt;
&lt;br /&gt;
# Создаём объект '''Plane''' (меню '''Create -&amp;gt; Polygon Primitives -&amp;gt; Кубик рядом с Plane'''), с параметрами:&lt;br /&gt;
#* '''Width''': 8&lt;br /&gt;
#* '''Height''': 8[[Изображение:Maya_tutor2_5.jpg|250px|center|thumb|Рисунок 6. Создаём объект Plane.]]&lt;br /&gt;
# Помещаем объект на сцену&lt;br /&gt;
# Теперь нам необходимо изменить координаты центра объекта на (0,0,0), для этого в '''Channel Box''' установите (не снимая выделения с объекта) значения свойств '''Translate X,Y,Z''' в 0. Как попасть в Channel Box изображено на рисунке ниже[[Изображение:Maya_tutor2_6.jpg|200px|center|thumb|Рисунок 7. Устанавливаем объект в положение (0,0,0).]]&lt;br /&gt;
&lt;br /&gt;
Всё площадка готова к тому, чтобы мы её превратили в желаемый объект. Но сначала немного теории:&lt;br /&gt;
&lt;br /&gt;
=== Немножко теории ===&lt;br /&gt;
&lt;br /&gt;
# Теоретически можно выделить три метода построения  полигональных моделей, которые могут применяться как в чистом виде, так и в разнообразных комбинациях. Модель может строиться:&lt;br /&gt;
#* вытягиванием из одного-единственного исходного полигона,  при этом каждый новый полигон вытягивается из предыдущего и, в ряде случаев, сваривается с каким-то соседним полигоном через вершины;&lt;br /&gt;
#* на основе полигональных примитивов, когда берется примитив (куб, сфера и т.п.), а затем из него вытягиваются те или иные подобъекты и при необходимости делятся отдельные грани. Данный метод пользуется наибольшей популярностью;&lt;br /&gt;
#* модель создается с нуля, а входящие в нее полигоны не вытягиваются, а рисуются вручную.&lt;br /&gt;
#Для создания и редактирования полигональных моделей предназначены командные меню '''Polygons''' и '''Edit Polygons''', содержащие очень большое количество команд. Однако самыми важными в полигональном моделировании являются команды:&lt;br /&gt;
#* '''Split Polygon Tool''' (Разбить полигон) из меню '''Edit Polygons''' — приводит к разбиению каждой грани на несколько новых граней, что реализуется путем создания новых ребер;&lt;br /&gt;
#* '''Extrude Face/Extrude Edge/Extrude Vertex''' (Выдавить грань/Выдавить ребро/Выдавить вершину) из меню '''Edit Polygons''' — обеспечивает перемещение выделенных  граней, ребер и вершин и изменение в итоге формы модели;&lt;br /&gt;
#* '''Smooth''' (Сгладить) из меню '''Polygons''' — увеличивает детализацию объекта благодаря переразбиению на большее число граней; может выполняться как для всего объекта в целом, так и для его отдельных подобъектов.&lt;br /&gt;
#Чтобы результат моделирования оказался удачным, стоит придерживаться следующих правил:&lt;br /&gt;
#* многие модели симметричны, поэтому, как правило, создается лишь одна их половина, а затем генерируется ее зеркальная копия (команда '''Polygons -&amp;gt; Mirror Geometry''' — Полигоны -&amp;gt; Зеркальная геометрия), по окончании обе половинки модели сшиваются, например путем булева объединения, а затем полученная модель сглаживается;&lt;br /&gt;
#* модели не должны иметь в своем составе лишних подобъектов, которые не нужны для формирования задуманной поверхности, — это лишь усложняет модель и может стать причиной неправильного выполнения тех или иных операций. Поэтому от лишних подобъектов нужно сразу же избавляться — например для уничтожения лишних вершин достаточно переключиться в режим редактирования вершин и удалить ненужные;&lt;br /&gt;
#* нередко воспользоваться нужным инструментом не получается, например при попытке создания новой грани не удается провести новое ребро от ребра A к ребру B. Причиной возникновения таких ситуаций является невозможность выполнения операции в данном конкретном случае, так как происходит нарушение существующей полигональной системы плоскостей. Можно попытаться провести ту же операцию, но в обратном порядке, то есть соединить ребро B с ребром A, иначе придется придумывать какое-то иное решение;&lt;br /&gt;
#* операция сглаживания ('''Smooth''') существенно увеличивает количество полигонов модели,  поэтому не стоит злоупотреблять ею — в противном случае модель может стать слишком сложной: из-за большого числа полигонов с ней трудно будет работать, время визуализации сильно вырастет, а недостаточно мощный компьютер может при ее обработке зависать.&lt;br /&gt;
&lt;br /&gt;
=== Обрабатываем полигон ===&lt;br /&gt;
&lt;br /&gt;
И так, тяжело в учении легко в бою, приступим.&lt;br /&gt;
# Включаем вид сверху, для этого на компасе нажимаем на указатель с надписью Y: [[Изображение:Maya_tutor2_7.jpg|71px|center|thumb|Рисунок 7. Переключаемся на вид сверху.]]&lt;br /&gt;
# В меню выбираем настройки инструмента '''Split Polygon Tool (разделение полигона)''' ('''Edit Mesh -&amp;gt; Квадратик рядом с Split Polygon Tool'''), для того чтобы включить привязку у этого инструмента к сетке, настраиваем как у меня: [[Изображение:Maya_tutor2_8.jpg|250px|center|thumb|Рисунок 8. Включаем привязку к сетке у инструмента Split Polygon Tool.]]&lt;br /&gt;
# Теперь для того, чтобы поделить наш полигон на две части нам нужно кликнуть на теместа края полигона, где будет начинаться и заканчиваться разделительная линия. Затем нажать '''Enter''': [[Изображение:Maya_tutor2_9.jpg|250px|center|thumb|Рисунок 9. Режим наш полигон.]]&lt;br /&gt;
# Такимже образом нарезаем наш полигон в следующую заготовку: [[Изображение:Maya_tutor2_10.jpg|350px|center|thumb|Рисунок 10. Готовая заготовка.]]&lt;br /&gt;
&lt;br /&gt;
=== Вытягиваем стены из полигона ===&lt;br /&gt;
&lt;br /&gt;
Всё теперь вид переключаем на перспективу (жмём кубик на компасе) и переключаемся в режим редактирования фэйсов (для тех, кто забыл первый урок: жмём правой кнопкой на объекте в раскрывшемся списке выбираем '''Face''').&lt;br /&gt;
# Выделям фэйсы как у меня: [[Изображение:Maya_tutor2_11.jpg|250px|center|thumb|Рисунок 11. Выделяем вытягиваемые полигоны.]]&lt;br /&gt;
# Жмём в меню '''Edit Mesh -&amp;gt; Extrude (вытягивание)''' (не снимая выделения с фэйсов)&lt;br /&gt;
# Открываем '''Attribute Editor'''&lt;br /&gt;
# Указываем в параметре '''Translate (Y)''' значение '''2''', это должно вытянуть выделенные нами полигоны на 2 метра вверх: [[Изображение:Maya_tutor2_12.jpg|600px|center|thumb|Рисунок 12. Вытягиваем стены из полигона.]]&lt;br /&gt;
&lt;br /&gt;
Всё, стены для того чтобы их проламывать готовы.&lt;br /&gt;
&lt;br /&gt;
=== Делаем пробоину ===&lt;br /&gt;
&lt;br /&gt;
''В процессе, пишу..''&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]][[Категория:Незаконченные статьи]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_2:_%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%BB%D0%B0%D0%BC%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D1%81%D1%82%D0%B5%D0%BD%D0%BA%D1%83.</id>
		<title>Maya. Глава 2: Необходимые основы моделирования или проламываем стенку.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_2:_%D0%9D%D0%B5%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D0%BC%D1%8B%D0%B5_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8%D0%BB%D0%B8_%D0%BF%D1%80%D0%BE%D0%BB%D0%B0%D0%BC%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC_%D1%81%D1%82%D0%B5%D0%BD%D0%BA%D1%83."/>
				<updated>2008-08-10T15:48:26Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}В этой статье я опишу как быстро (у меня создание этой сцены, вместе с рисованием текстуры заняло меньше 10 минут) сцену дома с проломом в стене, выглядящую примерно следующим образом: [[Изображение:Maya_tutor2_1.jpg|350px|center|thumb|Рисунок 1. Так будет выглядеть созданная нами сцена.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 1. Настраиваем сцену. ==&lt;br /&gt;
&lt;br /&gt;
О [[Maya. Глава 1: Hello World или первый кубик.#Шаг 2. Настраиваем сцену.|настройках котрые я упоминал в предидущей главе]] повторяться не буду, сразу перейду к тем, котрые мы ещё не рассматривали.&lt;br /&gt;
&lt;br /&gt;
Для удобства работы настроим сетку и привязку к ней:&lt;br /&gt;
&lt;br /&gt;
=== Настраиваем сетку ===&lt;br /&gt;
&lt;br /&gt;
Включить сетку можно поставив галочку в меню '''Display -&amp;gt; Grid'''&lt;br /&gt;
[[Изображение:Maya_tutor2_3.jpg|180px|center|thumb|Рисунок 2. Включаем сетку.]]&lt;br /&gt;
&lt;br /&gt;
В том же меню, нажав на расширенные настройки мы можем настроить её:[[Изображение:Maya_tutor2_4.jpg|174px|center|thumb|Рисунок 3. Заходим в настройку.]]&lt;br /&gt;
&lt;br /&gt;
Я, для удобства, сделал это следующим образом:[[Изображение:Maya_tutor2_2.jpg|400px|center|thumb|Рисунок 4. Настраиваем сетку.]]&lt;br /&gt;
&lt;br /&gt;
=== Включаем привязку к сетке ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы включить привязку к сетке нужно нажать на следующий значок, на понели инструментов:[[Изображение:Maya_tutor_014.jpg|145px|center|thumb|Рисунок 5. Включаем привязку.]]&lt;br /&gt;
&lt;br /&gt;
== Шаг 2. Моделируем сцену ==&lt;br /&gt;
&lt;br /&gt;
=== Создаём полигон ===&lt;br /&gt;
&lt;br /&gt;
# Создаём объект '''Plane''' (меню '''Create -&amp;gt; Polygon Primitives -&amp;gt; Кубик рядом с Plane'''), с параметрами:&lt;br /&gt;
#* '''Width''': 8&lt;br /&gt;
#* '''Height''': 8[[Изображение:Maya_tutor2_5.jpg|250px|center|thumb|Рисунок 6. Создаём объект Plane.]]&lt;br /&gt;
# Помещаем объект на сцену&lt;br /&gt;
# Теперь нам необходимо изменить координаты центра объекта на (0,0,0), для этого в '''Channel Box''' установите (не снимая выделения с объекта) значения свойств '''Translate X,Y,Z''' в 0. Как попасть в Channel Box изображено на рисунке ниже[[Изображение:Maya_tutor2_6.jpg|200px|center|thumb|Рисунок 7. Устанавливаем объект в положение (0,0,0).]]&lt;br /&gt;
&lt;br /&gt;
Всё площадка готова к тому, чтобы мы её превратили в желаемый объект. Но сначала немного теории:&lt;br /&gt;
&lt;br /&gt;
=== Немножко теории ===&lt;br /&gt;
&lt;br /&gt;
# Теоретически можно выделить три метода построения  полигональных моделей, которые могут применяться как в чистом виде, так и в разнообразных комбинациях. Модель может строиться:&lt;br /&gt;
#* вытягиванием из одного-единственного исходного полигона,  при этом каждый новый полигон вытягивается из предыдущего и, в ряде случаев, сваривается с каким-то соседним полигоном через вершины;&lt;br /&gt;
#* на основе полигональных примитивов, когда берется примитив (куб, сфера и т.п.), а затем из него вытягиваются те или иные подобъекты и при необходимости делятся отдельные грани. Данный метод пользуется наибольшей популярностью;&lt;br /&gt;
#* модель создается с нуля, а входящие в нее полигоны не вытягиваются, а рисуются вручную.&lt;br /&gt;
#Для создания и редактирования полигональных моделей предназначены командные меню '''Polygons''' и '''Edit Polygons''', содержащие очень большое количество команд. Однако самыми важными в полигональном моделировании являются команды:&lt;br /&gt;
#* '''Split Polygon Tool''' (Разбить полигон) из меню '''Edit Polygons''' — приводит к разбиению каждой грани на несколько новых граней, что реализуется путем создания новых ребер;&lt;br /&gt;
#* '''Extrude Face/Extrude Edge/Extrude Vertex''' (Выдавить грань/Выдавить ребро/Выдавить вершину) из меню '''Edit Polygons''' — обеспечивает перемещение выделенных  граней, ребер и вершин и изменение в итоге формы модели;&lt;br /&gt;
#* '''Smooth''' (Сгладить) из меню '''Polygons''' — увеличивает детализацию объекта благодаря переразбиению на большее число граней; может выполняться как для всего объекта в целом, так и для его отдельных подобъектов.&lt;br /&gt;
#Чтобы результат моделирования оказался удачным, стоит придерживаться следующих правил:&lt;br /&gt;
#* многие модели симметричны, поэтому, как правило, создается лишь одна их половина, а затем генерируется ее зеркальная копия (команда '''Polygons -&amp;gt; Mirror Geometry''' — Полигоны -&amp;gt; Зеркальная геометрия), по окончании обе половинки модели сшиваются, например путем булева объединения, а затем полученная модель сглаживается;&lt;br /&gt;
#* модели не должны иметь в своем составе лишних подобъектов, которые не нужны для формирования задуманной поверхности, — это лишь усложняет модель и может стать причиной неправильного выполнения тех или иных операций. Поэтому от лишних подобъектов нужно сразу же избавляться — например для уничтожения лишних вершин достаточно переключиться в режим редактирования вершин и удалить ненужные;&lt;br /&gt;
#* нередко воспользоваться нужным инструментом не получается, например при попытке создания новой грани не удается провести новое ребро от ребра A к ребру B. Причиной возникновения таких ситуаций является невозможность выполнения операции в данном конкретном случае, так как происходит нарушение существующей полигональной системы плоскостей. Можно попытаться провести ту же операцию, но в обратном порядке, то есть соединить ребро B с ребром A, иначе придется придумывать какое-то иное решение;&lt;br /&gt;
#* операция сглаживания ('''Smooth''') существенно увеличивает количество полигонов модели,  поэтому не стоит злоупотреблять ею — в противном случае модель может стать слишком сложной: из-за большого числа полигонов с ней трудно будет работать, время визуализации сильно вырастет, а недостаточно мощный компьютер может при ее обработке зависать.&lt;br /&gt;
&lt;br /&gt;
=== Обрабатываем полигон ===&lt;br /&gt;
&lt;br /&gt;
И так, тяжело в учении легко в бою, приступим.&lt;br /&gt;
# Включаем вид сверху, для этого на компасе нажимаем на указатель с надписью Y: [[Изображение:Maya_tutor2_7.jpg|71px|center|thumb|Рисунок 7. Переключаемся на вид сверху.]]&lt;br /&gt;
# В меню выбираем настройки инструмента '''Split Polygon Tool (разделение полигона)''' ('''Edit Mesh -&amp;gt; Квадратик рядом с Split Polygon Tool'''), для того чтобы включить привязку у этого инструмента к сетке, настраиваем как у меня: [[Изображение:Maya_tutor2_8.jpg|250px|center|thumb|Рисунок 8. Включаем привязку к сетке у инструмента Split Polygon Tool.]]&lt;br /&gt;
# Теперь для того, чтобы поделить наш полигон на две части нам нужно кликнуть на теместа края полигона, где будет начинаться и заканчиваться разделительная линия. Затем нажать '''Enter''': [[Изображение:Maya_tutor2_9.jpg|250px|center|thumb|Рисунок 9. Режим наш полигон.]]&lt;br /&gt;
# Такимже образом нарезаем наш полигон в следующую заготовку: [[Изображение:Maya_tutor2_10.jpg|350px|center|thumb|Рисунок 10. Готовая заготовка.]]&lt;br /&gt;
&lt;br /&gt;
=== Вытягиваем стены из полигона ===&lt;br /&gt;
&lt;br /&gt;
Всё теперь вид переключаем на перспективу (жмём кубик на компасе) и переключаемся в режим редактирования фэйсов (для тех, кто забыл первый урок: жмём правой кнопкой на объекте в раскрывшемся списке выбираем '''Face''').&lt;br /&gt;
# Выделям фэйсы как у меня: [[Изображение:Maya_tutor2_11.jpg|250px|center|thumb|Рисунок 11. Выделяем вытягиваемые полигоны.]]&lt;br /&gt;
# Жмём в меню '''Edit Mesh -&amp;gt; Extrude (вытягивание)''' (не снимая выделения с фэйсов)&lt;br /&gt;
# Открываем '''Attribute Editor'''&lt;br /&gt;
# Указываем в параметре '''Translate (Y)''' значение '''2''', это должно вытянуть выделенные нами полигоны на 2 метра вверх: [[Изображение:Maya_tutor2_12.jpg|600px|center|thumb|Рисунок 12. Вытягиваем стены из полигона.]]&lt;br /&gt;
&lt;br /&gt;
Всё, стены для того чтобы их проламывать готовы.&lt;br /&gt;
&lt;br /&gt;
=== Делаем пробоину ===&lt;br /&gt;
&lt;br /&gt;
''В процессе, пишу..''&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]][[Категория:Программы]][[Категория:Незаконченные статьи]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=3dsmax._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D0%B0_%D0%B8_%D0%BF%D1%80%D0%BE%D1%87%D0%B8%D1%85</id>
		<title>3dsmax. Создание текстуры террейна и прочих</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=3dsmax._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D0%B0_%D0%B8_%D0%BF%D1%80%D0%BE%D1%87%D0%B8%D1%85"/>
				<updated>2008-08-10T11:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
==ВВЕДЕНИЕ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Статья рассчитана на достаточно опытных юзеров '''3Ds Max'''. С вопросами типа &amp;quot;как создать кубик&amp;quot; и иже с ними - идём сюда ([http://www.3domen.com www.3domen.com]) и учимся работать. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Рассмотрим способ создания текстуры террейна, при этом она будет на 100 % отвечать следующим требованиям:&lt;br /&gt;
&amp;lt;code&amp;gt;- Готова для использования в качестве, собственно основной текстуры террейна&lt;br /&gt;
- Пригодна в качестве базовой текстуры для генерации детальных объектов (Добавляем траву на уровень)&lt;br /&gt;
- Пригодна для генерации маски. Маска необходима для корректного рапределения шейдеров по ландшафту.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==СОЗДАНИЕ ТЕКСТУРЫ==&lt;br /&gt;
&lt;br /&gt;
Нам понадобятся:&lt;br /&gt;
&amp;lt;code&amp;gt;Autodesk 3DsMax&lt;br /&gt;
Adobe Photoshop&lt;br /&gt;
Две специальных текстуры: &amp;quot;Трава&amp;quot; и &amp;quot;Асфальт&amp;quot;.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.lproject.3dn.ru/tutorials/Soft/Textures.7z СКАЧАТЬ ТЕКСТУРЫ]&lt;br /&gt;
&lt;br /&gt;
Итак: Допустим у нас имеется готовый террейн. На нём смоделена дорога. Как его затекстурить:&lt;br /&gt;
Идём в '''Material Editor''' и делаем два &amp;quot;'''Standart'''&amp;quot; материала, обзываем их как хотим, например '''Grass''' и '''Asphalt'''.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 1.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 2.JPG]]&lt;br /&gt;
&lt;br /&gt;
Полученными материалами мы будем затекстуривать наш террейн. Настоятельно рекомендуется предварительно отделить всё, что относится к асфальту или земле от общего меша, для экспорта в СДК - это суровая необходимость, да и текстурить будет проще. &lt;br /&gt;
Итак: Материал &amp;quot;'''Asphalt'''&amp;quot; накладываем на всё, что относится к асфальту. Аналогично поступаем с материалом '''Grass''' и с землёй. В результате должно получиться вот это:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 3.JPG]]&lt;br /&gt;
&lt;br /&gt;
Аттачим все объекты, и сверху всё это дело &amp;quot;прессуем&amp;quot; модификатором '''Unwrap UWV''' :). С свитке модификатора переходим в режим Face и выделяем ВСЕ фейсы модели. Ниже в настройках модификатора ищем кнопку '''Planar Mapping''', нажимаем, и жмём кнопку рядом - '''Align Z Axis'''. Отжимаем кнопку '''Planar Mapping''', и конвертируем в '''Edit Poly'''. &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 4.JPG]]&lt;br /&gt;
&lt;br /&gt;
Любуемся полученной идеалистической и профессиональной картинкой :) &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 5.JPG]]&lt;br /&gt;
&lt;br /&gt;
А вот теперь - начинается самое интересное. Генерация текстуры.&lt;br /&gt;
Открываем окно '''Rendering in Texture''' (Вызывается нажатием &amp;quot;0&amp;quot; (ноль) на клаве), и настраиваем параметры рендеринга следующим образом: &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 6.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 7.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Landshaft 8.JPG]]&lt;br /&gt;
&lt;br /&gt;
Рендерим! На выходе, в указанной папке - появится текстура в формате '''TGA'''. Текстуру уже можно экспортить в '''X-Ray SDK''', предварительно убив альфа-канал в фотошопе и дав нормальное имя (terrain_МОЯКАРТА.tga)&lt;br /&gt;
&lt;br /&gt;
==НАЗНАЧЕНИЕ ГОТОВОЙ ТЕКСТУРЫ НА ТЕРРЕЙН==&lt;br /&gt;
&lt;br /&gt;
Итак, после экспорта в '''SDK''' у нас в папке .'''..SDK\gamedata\textures\terrain\''' появится аналог нашей текстурки в формате '''DDS'''. Вот её и заюзаем для этого. Создаём на базе данной текстуры ещё два одинаковых материала, обозвав их '''terrain_aspalt''' и '''terrain_grass'''. Убиваем на нашем террейне вспомогательные материалы. Сделать это можно, воспользовавшись утилитой '''UWV Remove''' (Найти её можно на вкладке '''Utilites''' правого тулбара '''3DsMax'''). Выделив объекты террейна - запускаем утилиту и жмём кнопку '''Clear &amp;gt;&amp;gt; Materials''' (НЕ UWV!!!!). Теперь назначаем террейну - новые материалы. На асфальт - '''terrain_asphalt'''... и так-же с землёй и '''terrain_grass'''. Теперь можете аттачить асфальт и землю в один меш, и спокойно экспортить в СДК. После экспорта объекта - не забываем прописать нашу текстуру в файле '''textures.ltx''' &lt;br /&gt;
Прописываем её так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
terrain\terrain_НАШАКАРТА         = detail\detail_grnd_grass, **.000000, usage[diffuse]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вместо '''**''' - указываем уровень детализации (ориентировочно от 40 до 90) От него зависит детальность шейдера поверхности террейна. Чем выше число - тем выше детальность. Я ставлю где-то 65-80. Прописать необходимо в ''НУЖНОЕ'' место файла '''textures.ltx''', для этого юзаем &amp;quot;поиск&amp;quot; в редакторе, и ищем где прописаны остальные &amp;quot;террейны&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==СОЗДАНИЕ ДЕТАЛЬНОЙ ТЕКСТУРЫ==&lt;br /&gt;
&lt;br /&gt;
Юзаем фотошоп для этого. Открываем TGA-вариант текстуры, и заливаем &amp;quot;асфальт&amp;quot; жёлтым цветом &lt;br /&gt;
'''(R:G:B индекс - 240:240:1)'''. Это &amp;quot;Штатный&amp;quot; СДК-шный цветоиндекс, ему соотвествуют &amp;quot;листья на асфальте&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важный момент -- Haron|&lt;br /&gt;
message = Не меняйте стандартные цвета В DTI-ФАЙЛЕ! УБЪЁТЕ ВСЁ И НАСМЕРТЬ. Дело в том, что для текстур террейна используется тот же набор цветов что и в DTI-файле.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
Теперь подбираем интенсивность альфа-канала текстуры в нужных местах. ''(100%-альфа - травы НЕ будет! Без альфы - всё заросшее)''. Сохраняем в TGA, обозвав '''terrain_МОЯКАРТА_det.TGA''' и экспортим в СДК. Получившуюся текстуру в '''DDS''' формате юзаем на детальные объекты.&lt;br /&gt;
&lt;br /&gt;
==СОЗДАНИЕ МАСКИ==&lt;br /&gt;
&lt;br /&gt;
Юзаем фотошоп.&lt;br /&gt;
&lt;br /&gt;
Вот таблица цветов под разные участки маски: Заливать - ими.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Асфальт: RGB - 0:252:0&lt;br /&gt;
Земля: RGB - 248:0:0&lt;br /&gt;
Овраги, вода RGB - 0:0:248&lt;br /&gt;
Под домами: Просто чёрный цвет&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем под именем '''terrain_МОЯКАРТА_mask.TGA''' И экспортим в СДК. &lt;br /&gt;
&lt;br /&gt;
Вроде усё =)&lt;br /&gt;
Запарилсо =)&lt;br /&gt;
&lt;br /&gt;
====Дополнение Сахарова====&lt;br /&gt;
Тайлинг детальных текстур, зависит в принципе &amp;quot;не от балды&amp;quot;, а от размера карты(для кордона например 140, для мп атп 40 и т.п.)&lt;br /&gt;
&lt;br /&gt;
и какбы надо написать что маска юзается только после финальной компиляции уровня на макс настройках.&lt;br /&gt;
QUOTE &lt;br /&gt;
Теперь назначаем террейну - новые материалы. На асфальт - terrain_asphalt... и так-же с землёй и terrain_grass. Теперь можете аттачить асфальт и землю в один меш, и спокойно экспортить в СДК. После экспорта объекта - не забываем прописать нашу текстуру в файле textures.ltx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Енжин шейдер только из папки levels, материалы какие угодно(хоть металл), на остальных маска не юзается(ибо нефик), в идеале нужно создать для своего уровня персональный шейдер с набором текстур для маски (всего 4 текстуры максимум, ибо ARGB.. +1 дитеил текстура, ака дитейл бамп(онли р2 рендер)) &lt;br /&gt;
terrain_grass и т.п., это для всяких декораций на заднем плане(см, мп_атп и иже сними)&lt;br /&gt;
&lt;br /&gt;
[[Категория: SDK]]&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Haron|Haron]] '''17:20, 13 июля 2008 (MSD)'''&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D0%B0%D0%B9%D0%BB%D1%8B</id>
		<title>Категория:Конфигурационные файлы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D0%B0%D0%B9%D0%BB%D1%8B"/>
				<updated>2008-08-10T10:45:14Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории содержатся статьи, освещающие работу с конфигурационными файлами игры.&lt;br /&gt;
&lt;br /&gt;
Основная статья [[Теория_модостроения|Теория модостроения]]&lt;br /&gt;
[[Категория:Руководства]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BC%D0%BE%D0%B4%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Теория модостроения</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BC%D0%BE%D0%B4%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2008-08-10T10:44:43Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==О модифицировании игры==&lt;br /&gt;
&lt;br /&gt;
Выход долгожданной игры ознаменовался скандалами и возмущением общественности большим количеством убранного из игры.&lt;br /&gt;
&lt;br /&gt;
На фоне вырезанного контента и огромного количества несоответствий игры обещаниям разработчиков стали формироваться моддерские команды. К счастью, разработчики оставили возможность простого модифицирования игры. Благодаря [[Распаковщик архивов|распаковщику игровых архивов]] мы получили полный доступ к ресурсам игры. Сверх того, разработчики оставили в финальном билде 2947 (и билдах после него) высший приоритет распакованной папки gamedata.&lt;br /&gt;
&lt;br /&gt;
Итак, что же мы имеем?&lt;br /&gt;
&lt;br /&gt;
==Звуки==&lt;br /&gt;
&lt;br /&gt;
Звуки в игре записаны в формате ogg. Хочу заметить, что OGG Vorbis является признанным игровым форматом звука.&lt;br /&gt;
&lt;br /&gt;
Проблем со звуком вообщем-то не возникает. Если Вы пользуетесь редактором звука, который не поддерживает OGG Vorbis, для Вас существует множество платных и бесплатных конвертеров.&lt;br /&gt;
&lt;br /&gt;
Видео в игре также в формат Vorbis, расширения видео файлов - OGM. Для просмотра видео рекомендую Media Player Classic и CCCP Codec Pack ([http://cccp-project.net/ сайт проекта]).&lt;br /&gt;
&lt;br /&gt;
==Текстуры==&lt;br /&gt;
&lt;br /&gt;
Текстуры в игре имеют формат DDS (Direct Draw Surface). Для их редактирования рекомендую Adobe Photoshop CS 8.0 и NVidia Developer's Photoshop DDS Plugins (скачать его можно [http://developer.nvidia.com/object/photoshop_dds_plugins.html здесь]).&lt;br /&gt;
&lt;br /&gt;
При этом учтите следующее:&lt;br /&gt;
&lt;br /&gt;
* Вы можете использовать сторонние конвертеры. К таким относится Lister Total Commander, который умеет сохранять и просматривать DDS текстуры в других форматах. Это расширенная сборка Total Commander'a (платный файловый менеджер Кристиана Гислера) версии 6.55. Приобрести его можно [http://www.ghisler.com/ здесь].&lt;br /&gt;
&lt;br /&gt;
* Также, Вы можете воспользоваться специальными DDS конвертером. Но при конвертации может исчезнуть альфа-канал текстуры, он очень важен для игры. Поэтому настоятельно рекомендую использовать Photoshop CS 8.0 с плагинами.&lt;br /&gt;
&lt;br /&gt;
Внимание! После работы в Photoshop над тестурами, при сохранении не забудьте отметить пункт &amp;quot;Alpha Channels&amp;quot; и в открывшемся окне (после нажатия на кнопку &amp;quot;Сохранить&amp;quot;), выберите режим &amp;quot;DXT5 ARGB 8 bpp | interpolated alpha&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Также, в папке с игрой есть дополнительные текстуры с приписанным в конце имени файла словом &amp;quot;bump&amp;quot;. Это бамп-карты текстур, используемые для придания модели некоторой объемности, которую ещё называют &amp;quot;псевдорельефностью&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Бамп-карты текстур используются только при игре на втором рендере (динамическое освещение, то есть DirectX9-рендер.&lt;br /&gt;
&lt;br /&gt;
==Модели==&lt;br /&gt;
&lt;br /&gt;
Следующий немаловажный компонент игры - OGF модели.&lt;br /&gt;
&lt;br /&gt;
Модели расположены в папке meshes. &lt;br /&gt;
&lt;br /&gt;
Они содержат в себе информацию о материале, анимации и саму модель предмета.&lt;br /&gt;
Изменить текстуру модели реально при помощи WinHEX - путь к текстуре находится в первых строчках файла.&lt;br /&gt;
 &lt;br /&gt;
Для просмотра моделей незаменимой утилитой является OGF Viewer ([http://www.g3ddev.com/ сайт]) от batya.&lt;br /&gt;
На данный момент возможен только просмотр и конвертирование моделей в формат obj.&lt;br /&gt;
&lt;br /&gt;
При использовании OGF Viewer необходимо задать путь к текстурам в конфигурационном файле, который лежит в папке с программой.&lt;br /&gt;
&lt;br /&gt;
==Уровни==&lt;br /&gt;
&lt;br /&gt;
Следующим компонентом игры являются игровые уровни. Уровни можно разделить на мультиплеерные и сингловые.&lt;br /&gt;
&lt;br /&gt;
MP-уровни отличаются от уровней одиночной игры отсутствием некоторых компонентов и несколько иной структурой/набором файлов. Например, на мультиплеерных уровнях отсутствует координатная сетка для A-Life.&lt;br /&gt;
&lt;br /&gt;
Перед релизом бета-версии SDK (Software Development Kit от GSC Game World) я несколько недель тестировал его и сделал несколько печальных выводов.&lt;br /&gt;
&lt;br /&gt;
Во-первых, при помощи MP-SDK невозможно не только редактировать, но и даже просматривать уже откомпилированные уровни.&lt;br /&gt;
Дело в том, что MP-SDK требует исходников уровней. К тому же, пора прекращать мечтать о SDK и выкрикивать: &amp;quot;Дайте мне СДК я вам новое оружие сделаю и движок поменяю!!!&amp;quot;. MP-SDK - всего лишь маппер для мультиплеера. Возможно, будет маппер и для сингловой версии игры, но исходников уровней от GSC Game World даже и ждать не стоит.&lt;br /&gt;
&lt;br /&gt;
Однако, не стоит забывать, что в сеть была выложена лишь бета-версия этого пакета. Возможно, к появлению релиза добавятся новые функции и инструменты.&lt;br /&gt;
&lt;br /&gt;
Уровни из сингловой версии игры можно портировать под мультиплеер. Алгоритм действий:&lt;br /&gt;
&lt;br /&gt;
* Скопировать содержание папки уровня в новую папку с именем типа mp_yantar.&lt;br /&gt;
* Удалить файлы level.game, level.ai, level.som. Скопировать level.game из любой мультиплеерной карты и вставить в переделываемую карту.&lt;br /&gt;
* Открыть конфигурационный файл config\mp\maplist.ltx и добавить карту в список.&lt;br /&gt;
&lt;br /&gt;
==Скрипты==&lt;br /&gt;
&lt;br /&gt;
В игре широко используются скрипты. Некоторые из них - тестовые и являют собой оставленный разработчиками мусор, но никогда нельзя точно знать, где используется скрипт.&lt;br /&gt;
&lt;br /&gt;
В скриптах используется язык Lua. Язык не очень сложный, с помощью него можно многое делать, в том числе и спаунить (от англ. &amp;quot;spawn&amp;quot; - размещать на карте) объекты.&lt;br /&gt;
&lt;br /&gt;
К тому же, скрипты можно вызывать в spawn-файле, о нём подробнее будет рассказано ниже.&lt;br /&gt;
&lt;br /&gt;
==Конфиги==&lt;br /&gt;
&lt;br /&gt;
Другая, немаловажная часть игры - конфигурационные файлы. Они открываются обычным &amp;quot;Блокнотом&amp;quot; и представляют собой набор параметров и их значений.&lt;br /&gt;
&lt;br /&gt;
В игре существуют конфигурационные файлы существ, мультиплеера, погоды, оружия, объектов, геймплея, моделей, конфигурационные скрипты и конфигурация интерфейса.&lt;br /&gt;
&lt;br /&gt;
Также существует множество других конфигурационных файлов.&lt;br /&gt;
&lt;br /&gt;
О некоторых из них подробнее.&lt;br /&gt;
Конфигурации существ - одним из самых важных конфигурационных файлов является actor.ltx. В нём заданы параметры актора - т.е. главного героя игры.&lt;br /&gt;
&lt;br /&gt;
На его примере рассмотрим структуру конфигурационного файла.&lt;br /&gt;
&lt;br /&gt;
[actor] - пример entity. Конфигурацию актора вызывают при помощи названия entity. В данном случае - actor.&lt;br /&gt;
В других конфигурационных файлах мы можем найти пример ссылки на entity. Например: [burer_arena]:m_burer_e.&lt;br /&gt;
&lt;br /&gt;
В данном случае существо &amp;quot;burer_arena&amp;quot; ссылается на существо &amp;quot;m_burer_e&amp;quot; и является его прототипом.&lt;br /&gt;
Также могут быть и ссылки на entity, обозначающей набор параметров. Например: damage = m_burer_damage.&lt;br /&gt;
&lt;br /&gt;
Комментарии в ltx файлах начинаются с символа &amp;quot;;&amp;quot;. Все, что расположено за этим знаком, игрой не учитывается.&lt;br /&gt;
&lt;br /&gt;
Также очень интересна система так называемых инклудов (включений).&lt;br /&gt;
&lt;br /&gt;
Инклуд обозначается строкой &amp;quot;#include &amp;quot;имя_файла.ltx&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Инклуды означают, что в файл, в котором написана вышеуказанная строка, вставляется содержание файла, указанного как аргумент к функции #include.&lt;br /&gt;
&lt;br /&gt;
Получается так, что конфигурационные файлы монстров (к примеру) объединяются в файле monsters.ltx, файлы сталкеров - в stalkers.ltx. А файлы monsters.ltx, stalkers.ltx и все остальные файлы объединяются в файле system.ltx, в котором прописано около 20 инклудов. Таким образом, всё содержание ltx-файлов объединено в system.ltx.&lt;br /&gt;
&lt;br /&gt;
Помните - когда создаёте новый конфигурационный файл - не забудьте вставить его методом инклуда в общий конфигурационный список в system.ltx.&lt;br /&gt;
&lt;br /&gt;
==Спавн-файл==&lt;br /&gt;
&lt;br /&gt;
Последнее, о чём пойдёт речь - папка spawns. &lt;br /&gt;
&lt;br /&gt;
В ней расположен файл all.spawn. В этом файле обозначены почти все динамические объекты, которые содержатся в игровой Зоне. Это как монстры и сталкеры, так и приёмник &amp;quot;Горизонт&amp;quot; на столе у торговца, и даже ящик рядом с блокпостом.&lt;br /&gt;
&lt;br /&gt;
Формат спаун-файла долго разбирался специалистами и благодаря товарищу Zeed'у разобран. И им же была написана специальная программа [[xrSpawner]] для спауна динамических объектов.&lt;br /&gt;
&lt;br /&gt;
==Дополнительно==&lt;br /&gt;
&lt;br /&gt;
Кроме файлов спауна в директории gamedata также присутствует папка с шейдерами, папка с анимациями камеры, папка с некоторыми файлами A-life и несколько файлов в формате xr.&lt;br /&gt;
&lt;br /&gt;
В файле gamemtl.xr лежат настройки материалов, текстур и hit_fx эффектов.&lt;br /&gt;
В режиме HEX файл более или менее читаем.&lt;br /&gt;
&lt;br /&gt;
И последнее.&lt;br /&gt;
Не пробуйте искать где указаны классы типа AI_CROW. &lt;br /&gt;
Все классы существ находятся в xrGame.dll и попытки извлечь их или изменить бессмыслены.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана: [[Участник:Empro|Empro]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B</id>
		<title>Категория:Скрипты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B"/>
				<updated>2008-08-10T10:44:18Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории содержатся статьи, освещающие работу со скриптами игры.&lt;br /&gt;
&lt;br /&gt;
Основная статья [[Теория_модостроения|Теория модостроения]]&lt;br /&gt;
[[Категория:Руководства]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B</id>
		<title>Категория:Скрипты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%8B"/>
				<updated>2008-08-10T10:44:01Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории содержатся статьи, освещающие работу со скриптами игры.&lt;br /&gt;
Основная статья [[Теория_модостроения|Теория модостроения]]&lt;br /&gt;
[[Категория:Руководства]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D1%80%D1%82%D0%B8%D0%BA%D0%BB%D0%BE%D0%B2</id>
		<title>Создание партиклов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D1%80%D1%82%D0%B8%D0%BA%D0%BB%D0%BE%D0%B2"/>
				<updated>2008-08-10T10:41:34Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данная статья рассматривает основы создания партиклов, без которых работа с ними не обходится в любом случае.&lt;br /&gt;
&lt;br /&gt;
Запускаем Particle Editor  и создаем в общей директории свою папку, в ней создаем новый партикл-эффект.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle01.jpg|470px]]&lt;br /&gt;
&lt;br /&gt;
Даем название своему партиклу и находим кнопку Append, в появившемся окне выбираем source - это база для любого партикла. Теперь настроим его. Находим пункт Color -&amp;gt; Alpha, назначаем текстуре прозрачность.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle02.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
Далее, нужно указать размер текстуры (Size -&amp;gt; Center). Теперь прокручиваем список вверх к пункту Max particles - задаём ограничение в 50 партиклов и спускаемся на строчку ниже к пункту Sprite - ставим напротив него галочку, появится 4 подпункта. Нас пока интересует первый пункт - Texture, выбираем текстуру для своего партикла.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle03.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
Также, выбираем шейдер. Теперь можно нажать F5 для запуска превью своего партикла.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle04.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
Далее, есть ещё одна обязательная вещь для нашего эффекта: нажимаем Append и выбираем Kill Old. Эта функция убирает старые партиклы. В настройках указываем время жизни (Age limit).&lt;br /&gt;
&lt;br /&gt;
Если наш партикл задумывается движущимся, нужно также приаттачить ещё один итем - Move, этот итем базируется на параметре Velocity.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle05.jpg|500px]]&lt;br /&gt;
&lt;br /&gt;
Теперь настроим Domain - базовый параметр партикла.&lt;br /&gt;
&lt;br /&gt;
По умолчанию, домен - точка (point), при двойном щелчке на этом пункте, откроется меню, где на выбор будет несколько базовых форм: точка, линия, сфера, конус, цилиндр, диск и т.д.&lt;br /&gt;
&lt;br /&gt;
Я выбрал диск. Снова жмём F5 для просмотра.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle06.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
Мы получили что то вроде огненного диска, который медленно поднимается вверх. Частота кадров указывается в пункте Source -&amp;gt; Rate (чем больше это значение, тем быстрей обновляются наши партиклы).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну теперь можно добавлять ещё разных итемов и смотреть на эффект.&lt;br /&gt;
&lt;br /&gt;
Копируем фаил particles.xr в геймдату игровую из геймдаты редактора, прописываем этот эффект чему-нибудь - и всё.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Particle07.jpg|700px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:Сахаров|Сахаров]] ([[Team:SRP Team|SRP Team]])&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2</id>
		<title>Спавн новых предметов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2"/>
				<updated>2008-08-10T10:39:56Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье я расскажу как создавать новые предметы:&lt;br /&gt;
&lt;br /&gt;
Для начал находим файл items.ltx, находящийся в папке config/misc/, и копируем какой-нибудь предмет, я, например, взял:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[bread]:identity_immunities&lt;br /&gt;
GroupControlSection = spawn_group&lt;br /&gt;
discovery_dependency =&lt;br /&gt;
$spawn = &amp;quot;food and drugs\bread&amp;quot;&lt;br /&gt;
;$prefetch = 32&lt;br /&gt;
class = II_FOOD&lt;br /&gt;
cform = skeleton&lt;br /&gt;
visual = weapons\bred\bred.ogf&lt;br /&gt;
description = enc_equipment_food_bread1&lt;br /&gt;
&lt;br /&gt;
inv_name = Bread&lt;br /&gt;
inv_name_short = Bread&lt;br /&gt;
inv_weight = 0.3 ;0.2&lt;br /&gt;
&lt;br /&gt;
inv_grid_width = 1&lt;br /&gt;
inv_grid_height = 1&lt;br /&gt;
inv_grid_x = 11&lt;br /&gt;
inv_grid_y = 9&lt;br /&gt;
cost = 20&lt;br /&gt;
&lt;br /&gt;
attach_angle_offset = -0.287979, 1.560923, 1.544060&lt;br /&gt;
attach_position_offset = 0.096910, -0.013594, 0.107925&lt;br /&gt;
attach_bone_name = bip01_r_hand&lt;br /&gt;
auto_attach = false&lt;br /&gt;
&lt;br /&gt;
// should be deleted after update&lt;br /&gt;
bone_name = bip01_r_hand&lt;br /&gt;
position_offset = 0.0,0.0,0.0&lt;br /&gt;
angle_offset = 1.570790,1.570790,3.92699&lt;br /&gt;
&lt;br /&gt;
; eatable item&lt;br /&gt;
eat_health = 0.05&lt;br /&gt;
eat_satiety = 0.2&lt;br /&gt;
eat_power = 0&lt;br /&gt;
eat_radiation = 0&lt;br /&gt;
wounds_heal_perc = 0&lt;br /&gt;
eat_portions_num = -1&lt;br /&gt;
&lt;br /&gt;
; food item&lt;br /&gt;
slot = 4&lt;br /&gt;
animation_slot = 4&lt;br /&gt;
&lt;br /&gt;
;hud item&lt;br /&gt;
hud = wpn_vodka_hud&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вставляем его копию в конец, меняем название:&lt;br /&gt;
&lt;br /&gt;
[bread]&lt;br /&gt;
&lt;br /&gt;
На:&lt;br /&gt;
&lt;br /&gt;
[test]&lt;br /&gt;
&lt;br /&gt;
А также:&lt;br /&gt;
&lt;br /&gt;
 inv_name = Bread&lt;br /&gt;
 inv_name_short = Bread &lt;br /&gt;
&lt;br /&gt;
На:&lt;br /&gt;
&lt;br /&gt;
 inv_name = test&lt;br /&gt;
 inv_name_short = test&lt;br /&gt;
&lt;br /&gt;
И description = enc_equipment_food_bread1 на description = enc_equipment_food_bread1_test&lt;br /&gt;
&lt;br /&gt;
И, также, &amp;quot;по желанию&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
eat_health = 0.05&lt;br /&gt;
eat_satiety = 0.2&lt;br /&gt;
eat_power = 0&lt;br /&gt;
eat_radiation = 0&lt;br /&gt;
wounds_heal_perc = 0&lt;br /&gt;
eat_portions_num = -1&lt;br /&gt;
&lt;br /&gt;
Всё, в item.ltx работа закончена, теперь переходим к редактированию описания, открываем string_table_enc_equipment &amp;quot;Блокнотом&amp;quot;. Что мы там видим: все описания и названия прописаны по тегам:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;string id=&amp;quot;название из inv_name&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;Название в игре&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;string id=&amp;quot;описание из description&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;Описание в игре&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;string id=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;Тестовый предмет&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;string id=&amp;quot;enc_equipment_food_bread1_test&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;Тестовый предмет, разработанный в сверхсекретных лабораториях Зоны :)&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем... Все! Основная работа завершена! Теперь добавим предмет торговцам, например, Сидоровичу.&lt;br /&gt;
&lt;br /&gt;
Открываем trade_trader из папки config/misc (работа с ним подробно описана в [[Редактирование торговцев|этой статье]]), прописываем:&lt;br /&gt;
&lt;br /&gt;
test = 0.3, 0.5&lt;br /&gt;
&lt;br /&gt;
В секции:&lt;br /&gt;
&lt;br /&gt;
[trader_generic_buy]&lt;br /&gt;
&lt;br /&gt;
И далее в:&lt;br /&gt;
&lt;br /&gt;
[supplies_start]&lt;br /&gt;
&lt;br /&gt;
test = 10, 1&lt;br /&gt;
&lt;br /&gt;
В [supplies_after_fabric]&lt;br /&gt;
&lt;br /&gt;
test = 10, 1&lt;br /&gt;
&lt;br /&gt;
В [trader_start_sell]&lt;br /&gt;
&lt;br /&gt;
И в:&lt;br /&gt;
&lt;br /&gt;
[trader_after_fabric_sell]&lt;br /&gt;
&lt;br /&gt;
test = 1. 3&lt;br /&gt;
&lt;br /&gt;
Сохраняем, запускаем игру, торгуем с Сидоровичем и видим у него два вида хлеба: один из них - наш :)&lt;br /&gt;
&lt;br /&gt;
О том как, делать иконки для новых предметов, детально описано в [[Изменение текстур|статье BAC9-FLCL.]]&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:Alwen|Alwen]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]][[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8</id>
		<title>Создание новой группировки</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8"/>
				<updated>2008-08-10T10:39:01Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Новая группировка==&lt;br /&gt;
&lt;br /&gt;
Сегодня мы создадим новую группировку. Назовем её, скажем, &amp;quot;Ветер&amp;quot;. Не суть важно.&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
===Базовый уровень===&lt;br /&gt;
&lt;br /&gt;
'''1.''' Для начала в '''game_relations.ltx''' и в таблицу отношений группировок в конце и в заголовке добавляем название своей группировки и коэффициенты отношений к ней у других группировок. Также, не забываем прописать её собственное отношение к другим группировкам:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[communities_relations]&lt;br /&gt;
;|actor  |act_dol|act_fre|stalker|monolit|militar|killer |ecolog |dolg   |freedom|bandit |zombied|strange|trader|arena_enemy|wind|&lt;br /&gt;
;=================================================================================================================================&lt;br /&gt;
actor = 0,	   0,	   0,	   0,  -5000,  -5000,  -5000,      0,	   0,	   0,  -5000,  -5000,	   0,	  0,  -5000, 0&lt;br /&gt;
actor_dolg = 0,	   0,	   0,      0,  -5000,   -500,  -5000,   5000,    600,  -5000,  -5000,  -5000,	   0,	  0,  -5000&lt;br /&gt;
actor_freedom = 0,	   0,	   0,	   0,  -5000,  -5000,  -5000,  -1500,  -5000,   5000,	   0,  -5000,	   0,	 0,  -5000, 0&lt;br /&gt;
&lt;br /&gt;
stalker	= 0,	   0,	   0,	   0,  -5000,  -5000,  -5000,      0,	   0,	   0,  -5000,  -5000,	   0,	  0,  -5000, 0&lt;br /&gt;
monolith = -5000,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,  -5000,  -5000,   5000,   5000,  -5000,	 0,  -5000, 0&lt;br /&gt;
military = -5000,  -5000,  -5000,  -5000,  -5000,   5000,  -5000,      0,  -5000,  -5000,  -5000,  -5000, 	   0,	 0,  -5000, 0&lt;br /&gt;
killer = -5000,  -5000,      0,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,	   0,  -5000,  -5000,	  0,  -5000, 0&lt;br /&gt;
ecolog = 0,	 600,  -5000,      0,  -5000,   1000,  -5000,   5000,    500,  -5000,   -500,  -5000,	   0,	  0,      0, 0&lt;br /&gt;
dolg = 0,    600,  -5000,      0,  -5000,   -500,  -5000,   5000,   5000,  -5000,  -5000,  -5000,	   0,	  0,      0, 0&lt;br /&gt;
freedom = 0,  -5000,	 600,	   0,  -5000,  -5000,  -5000,  -1500,  -5000,   5000,	   0,  -5000,	   0,	  0,      0, 0&lt;br /&gt;
bandit = -5000,  -5000,	   0,  -5000,  -5000,   -500,      0,  -5000,  -5000,	   0,	   0,  -5000,  -5000,	  0,  -5000, 0&lt;br /&gt;
zombied	= -5000,  -5000,  -5000,  -5000,   5000,  -5000,  -5000,  -5000,  -5000,  -5000,  -5000,   5000,  -5000,	 0,  -5000, 0&lt;br /&gt;
stranger = 0,	   0,	   0,      0,  -5000,  -5000,  -5000,      0,	   0,	   0,   -500,  -5000,	   0,	  0,      0, 0&lt;br /&gt;
trader = 0,	   0,	   0,	   0,	   0, 	   0,	   0,	   0,	   0,	   0,	   0,	   0,      0,	  0,      0&lt;br /&gt;
arena_enemy = -5000,  -5000,  -5000,  -5000,  -5000,  -5000,      0,      0,      0,  -5000,  -5000,      0,      0,	  0,     0, 0&lt;br /&gt;
&lt;br /&gt;
wind = 0,	   0,	   0,	   0,  -5000,  -5000,  -5000,      0,	   0,	   0,  -5000,  -5000,	   0,	  0,  -5000, 0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также, изменим эту строку, добавив туда имя и номер группировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;;названия группировок&lt;br /&gt;
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, &lt;br /&gt;
freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18,&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.&lt;br /&gt;
&lt;br /&gt;
Далее, в разделе ''[communities_sympathy]'' в конце добавляем свою группировку и коэффициент &amp;quot;впечатлительности&amp;quot; - чем он меньше, тем меньше отношение группировки будет меняться к вам в целом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[communities_sympathy]&lt;br /&gt;
actor		=		0.0&lt;br /&gt;
actor_dolg	=		0.0&lt;br /&gt;
actor_freedom	=		0.0&lt;br /&gt;
stalker		=		0.0&lt;br /&gt;
monolith	=		0.0&lt;br /&gt;
military	=		0.0&lt;br /&gt;
killer		=		0.0&lt;br /&gt;
ecolog		=		0.0&lt;br /&gt;
dolg		=		0.1&lt;br /&gt;
freedom		=		0.1&lt;br /&gt;
bandit		=		0.0&lt;br /&gt;
zombied		=		0.0&lt;br /&gt;
trader		=		0.0&lt;br /&gt;
stranger	=		0.0&lt;br /&gt;
arena_enemy	=	    	0.0&lt;br /&gt;
wind 		= 		0.0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.''' После этого в файле '''death_manager.script''' ищем строку ''local community_list'' и в скобках добавляем название своей группировки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function init_drop_settings()&lt;br /&gt;
	local community_list = { &amp;quot;stalker&amp;quot;, &amp;quot;dolg&amp;quot;, &amp;quot;freedom&amp;quot;, &amp;quot;bandit&amp;quot;, &amp;quot;military&amp;quot;, &amp;quot;zombied&amp;quot;, &amp;quot;ecolog&amp;quot;, &amp;quot;killer&amp;quot;, &amp;quot;monolith&amp;quot;, &lt;br /&gt;
&amp;quot;arena_enemy&amp;quot;, &amp;quot;actor_dolg&amp;quot;, &amp;quot;wind&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''3.''' В файле '''death_items_by_communities.ltx''' пишем ''[x]:stalker'' (вместо ''x'' - название вашей группировки):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
af_dummy_spring			= 0&lt;br /&gt;
af_fuzz_kolobok			= 0&lt;br /&gt;
&lt;br /&gt;
;Еда&lt;br /&gt;
vodka					= 0&lt;br /&gt;
&lt;br /&gt;
[arena_enemy]&lt;br /&gt;
[actor_dolg]&lt;br /&gt;
&lt;br /&gt;
[wind]: stalker&lt;br /&gt;
bread					= 0&lt;br /&gt;
kolbasa					= 0&lt;br /&gt;
vodka					= 0&lt;br /&gt;
energy_drink			= 0.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''4.''' Если предусматривается респавн бойцов новой группировки, в '''se_respawn.script''' прописываем в '''local simMaxCount = {''' после строчек с зомбированными сталкерами строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wind_novice = 20, wind_regular = 20, wind_veteran = 20, wind_master = 6,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.''' Чтобы при убийстве непися новой группировки игра не вылетала в '''xr_statistic.script''',&lt;br /&gt;
&lt;br /&gt;
после строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;zombied_novice = 1, zombied_experienced = 2, zombied_veteran = 3, zombied_master = 4,&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
пишем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;dark_stalker_novice = 1, dark_stalker_experienced = 2, dark_stalker_veteran = 3, dark_stalker_master = 4,&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''6.''' Ну а в '''character_desk_x.xml''' выбираем любого NPC (или группу) и меняем группировку на свою:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---esc_wolf---&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;wind&amp;lt;/community&amp;gt;&lt;br /&gt;
		[...]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''7.''' Чтобы у персонажа в графе &amp;quot;Группировка&amp;quot; отображалось не &amp;quot;wind&amp;quot;, а &amp;quot;Ветер&amp;quot;, зарегистрируем соответствующую строку в файле string_table_general.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;string_table&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;wind&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ветер&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;actor&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Одиночка&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	[...]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''8.''' Существует возможность создать для нашей новой группировки места, где они будут ходить (''*_terrain'' брать из '''m_stalker.ltx'''):&lt;br /&gt;
&lt;br /&gt;
То есть, к примеру, существует секция:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[stalker_terrain]&lt;br /&gt;
	255,000,255,255&lt;br /&gt;
	008,001,255,255 ;Разрешено ходить по опасным местам на баре&lt;br /&gt;
	012,001,255,255 ;Разрешено ходить по опасным местам на Милитари&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда можно создать новую, по аналогии:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[wind_terrain]&lt;br /&gt;
	255,000,255,255&lt;br /&gt;
	008,001,255,255 ;Разрешено ходить по опасным местам на баре&lt;br /&gt;
	012,001,255,255 ;Разрешено ходить по опасным местам на Милитари&lt;br /&gt;
	010,001,255,255	;Разрешено ходить по опасным местам на янтаре&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Здесь, очевидно, указаны координаты самого уровня. Для каждого уровня существует своя начальная координата.&lt;br /&gt;
&lt;br /&gt;
===Продвинутый уровень===&lt;br /&gt;
&lt;br /&gt;
Такой метод достаточно примитивен. Это не полноценная группировка. Нам нужны соответствующие диалоги, возможность получения квестов и вступления в группировку, уникальные NPC.&lt;br /&gt;
&lt;br /&gt;
====Квесты====&lt;br /&gt;
&lt;br /&gt;
Добавим квесты, которые нужно выполнить для группировки. Пока - простые поручения распространенных типов.&lt;br /&gt;
&lt;br /&gt;
Во-первых, пропишите в список диалогов персонажа следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;		&amp;lt;actor_dialog&amp;gt;[что-нибудь]_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;[что-нибудь]_reward&amp;lt;/actor_dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примеры названий: ''tm_trader_dialog'', ''tm_wolf_dialog''...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Внимание! Метод не проверен.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Этим мы добавили ему ветку диалога &amp;quot;Есть работа?&amp;quot;, а также ветку для награды за квест/отказа от него. Теперь зарегистрируем в '''task_manager.ltx''' набор новых заданий.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[list]&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
;--------Wind------------------------&lt;br /&gt;
;----------Kill Stalker----&lt;br /&gt;
wind_kill_stalker&lt;br /&gt;
;----------Find Item----	&lt;br /&gt;
wind_find_item&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
;tasks for Wind	&lt;br /&gt;
&lt;br /&gt;
[wind_find_item]&lt;br /&gt;
type = find_item&lt;br /&gt;
community = actor&lt;br /&gt;
text = [ссылка на текст с рассказом заказчика о задании]&lt;br /&gt;
description = [ссылка на текст с описанием задания]&lt;br /&gt;
parent = [имя NPC-заказчика]&lt;br /&gt;
target = scientific_outfit&lt;br /&gt;
reward_money = 5000&lt;br /&gt;
reward_reputation = +5&lt;br /&gt;
reward_rank = 4&lt;br /&gt;
reward_item = wpn_sig_m1&lt;br /&gt;
time = 86400&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[wind_kill_stalker]&lt;br /&gt;
type = kill_stalker&lt;br /&gt;
community = actor&lt;br /&gt;
text = [ссылка на текст с рассказом заказчика о задании]&lt;br /&gt;
description = [ссылка на текст с описанием задания]&lt;br /&gt;
parent = [имя NPC-заказчика]&lt;br /&gt;
target = sim_stalker_master_master&lt;br /&gt;
reward_money = 4000&lt;br /&gt;
reward_reputation = +5&lt;br /&gt;
reward_rank = 9&lt;br /&gt;
reward_item = ammo_5.56x45_ap, ammo_5.56x45_ap, ammo_5.56x45_ap&lt;br /&gt;
time = 86400&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте прописать описания заданий в текстовые массивы. Подробнее о редактировании '''task_manager.ltx''' читайте в [[Однотипные квесты|уроке]], посвященном однотипным квестам.&lt;br /&gt;
&lt;br /&gt;
Да, и зарегистрируйте сами ветки диалогов в файле '''dialogs.xml'''. Вот пример того, как это сделано для заданий &amp;quot;Долга&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;dialog id=&amp;quot;tm_dolg_dialog&amp;quot; priority=&amp;quot;-1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;init_func&amp;gt;task_manager.init_dolg_task_dialog&amp;lt;/init_func&amp;gt;&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&lt;br /&gt;
    &amp;lt;dialog id=&amp;quot;tm_dolg_reward&amp;quot; priority=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;init_func&amp;gt;task_manager.init_dolg_reward_dialog&amp;lt;/init_func&amp;gt;&lt;br /&gt;
		&amp;lt;precondition&amp;gt;task_manager.has_active_vendor_task&amp;lt;/precondition&amp;gt;&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Соответственно, пройдем туда, куда указывает строка ''task_manager.init_dolg_task_dialog'' - в '''task_manager.script''':	 &lt;br /&gt;
	 &lt;br /&gt;
&amp;lt;pre&amp;gt;function init_dolg_task_dialog(dlg)	 &lt;br /&gt;
	get_random_task():init_task_dialog(dlg, &amp;quot;dolg&amp;quot;)&amp;lt;/pre&amp;gt;	 &lt;br /&gt;
		 &lt;br /&gt;
По аналогии делаем и с нашим &amp;quot;Ветром&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====Вступление в группировку====&lt;br /&gt;
&lt;br /&gt;
Реализуем возможность вступления в группировку.&lt;br /&gt;
&lt;br /&gt;
Прописываем в '''dialogs.script''' такие action'ы:&lt;br /&gt;
&amp;lt;pre&amp;gt;-----------------------------------------------------------------------------------&lt;br /&gt;
-- Community&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
function actor_set_wind (actor, npc)&lt;br /&gt;
printf (&amp;quot;ACTOR NOW IN WIND COMMUNITY&amp;quot;&lt;br /&gt;
if db.actor then&lt;br /&gt;
db.actor:set_character_community (&amp;quot;actor_wind&amp;quot;, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
return true&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После чего создадим диалог, и сделаем в нем фразу с action'ом вида ''&amp;lt;action&amp;gt;actor_set_wind&amp;lt;/action&amp;gt;''. Советую изучить [[Создание диалогов|урок]], посвященный диалогам.&lt;br /&gt;
&lt;br /&gt;
====Новые NPC====&lt;br /&gt;
&lt;br /&gt;
Лучше всего всё вышеприведенное повесить на нового, уникального персонажа. Способ его спавна описан [[Cпавн через скрипт#Спавн NPC|здесь]].&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья [[Участник:BAC9-FLCL|BAC9-FLCL]].&amp;lt;br&amp;gt;&lt;br /&gt;
Способ открыт [[Участник:Arhet|Arhet]] ([[Team:SRP Team|SRP Team]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Альтернатива - статья [[Участник:SenseyVit|SenseyVit]] ([http://stalkerhunt.ucoz.ru/publ/1-1-0-2 открыть]).&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]][[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F</id>
		<title>Создание нового оружия</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F"/>
				<updated>2008-08-10T10:38:25Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье мы научимся создавать новые образцы вооружения. Для начала, мы будем использовать модели из оригинальной игры. Если вы хотите создать оружие, имеющее уникальный внешний вид, ознакомьтесь с [[Создание моделей и их добавление в игру|уроком]] по созданию моделей.&lt;br /&gt;
&lt;br /&gt;
Добавим в игру '''АК101'''.&lt;br /&gt;
&lt;br /&gt;
==Внешний вид==&lt;br /&gt;
&lt;br /&gt;
Позаботимся о том, чтобы наше оружие отличалось внешне от того же '''АК74'''.&lt;br /&gt;
&lt;br /&gt;
===Текстуры===&lt;br /&gt;
&lt;br /&gt;
Нарисуем для оружия новую текстуру. Подробно останавливаться на этом процессе не буду, ознакомьтесь с примером, приведенным [[Изменение текстур#Изменение текстур моделей|здесь]]. Итак, основываясь на текстуре '''АК74''', мы сделали вот такую текстуру:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:500px-AK101 texture.jpg]]&lt;br /&gt;
&lt;br /&gt;
Файлы текстур мы назвали:&lt;br /&gt;
&lt;br /&gt;
* '''wpn_ak10.dds'''&lt;br /&gt;
* '''wpn_ak10_bump#.dds'''&lt;br /&gt;
* '''wpn_ak10_bump.dds'''&lt;br /&gt;
&lt;br /&gt;
===Модели===&lt;br /&gt;
&lt;br /&gt;
Новых моделей мы пока делать не станем, просто воспользуемся дублированными моделями от '''АК74'''. Скопируем папку:&lt;br /&gt;
&lt;br /&gt;
'''gamedata\meshes\weapons\ak47\''' &lt;br /&gt;
&lt;br /&gt;
И назовем её '''ak-101'''. Содержимое, соответственно, переименуем в:&lt;br /&gt;
&lt;br /&gt;
* '''wpn_ak101.ogf'''&lt;br /&gt;
* '''wpn_ak101_hud.ogf'''.&lt;br /&gt;
&lt;br /&gt;
Теперь пропишем в эти модели созданные нами текстуры. Способ описан [[Изменение текстур#Создание новых visual для использования с новыми объектами|здесь]]'''.&lt;br /&gt;
&lt;br /&gt;
===Иконки===&lt;br /&gt;
&lt;br /&gt;
Добавим в игру иконки, которыми оружие будет отображаться в инвентаре. Способ подробно описан [[Изменение текстур#Изменение иконок предметов|здесь]].&lt;br /&gt;
&lt;br /&gt;
Вот, что получилось в конечном итоге:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:500px-AK101 icon.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Конфиги==&lt;br /&gt;
&lt;br /&gt;
Новое оружие мы будем делать на базе оригинальных конфигурационных файлов. Создадим '''АК101''' на базе конфигов '''АК74'''. &lt;br /&gt;
&lt;br /&gt;
===Свойства оружия===&lt;br /&gt;
&lt;br /&gt;
Скопируем файл из папки:&lt;br /&gt;
&lt;br /&gt;
'''gamedata\config\weapons\ak74.ltx'''&lt;br /&gt;
&lt;br /&gt;
Назовем его '''ak101.ltx'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Отредактируем свойства по своему усмотрению (но лучше - в соответствии с достоверной информацией о характеристиках оружия, т.к. '''АК101''' - всё-таки оружие реально существующее). Редактирование конфигов оружия подробно описано в отдельном [[Редактирование оружия|уроке]]. В данном случае конфиг был составлен таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
[wpn_ak101]:identity_immunities&lt;br /&gt;
GroupControlSection		= spawn_group&lt;br /&gt;
discovery_dependency	= &lt;br /&gt;
$spawn              	= &amp;quot;weapons\ak-101&amp;quot;	; name and section in level editor&lt;br /&gt;
$npc					= on				&lt;br /&gt;
$prefetch 				= 8&lt;br /&gt;
scheduled				= off               ;[] option for ALife Simulator&lt;br /&gt;
cform               	= skeleton&lt;br /&gt;
class               	= WP_AK74			; class of the weapon that corresponding to CPP class&lt;br /&gt;
min_radius          	= 30				; [] for AI&lt;br /&gt;
max_radius          	= 100				; [] for AI&lt;br /&gt;
description				= enc_weapons1_wpn-ak101&lt;br /&gt;
	&lt;br /&gt;
ef_main_weapon_type		= 2&lt;br /&gt;
ef_weapon_type			= 6&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
holder_range_modifier	= 1.0		       ; во сколько раз увеличивается eye_range &lt;br /&gt;
holder_fov_modifier		= 0.7              ; во сколько раз увеличивается eye_fov&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cost					= 2;4000				&lt;br /&gt;
weapon_class			= assault_rifle		&lt;br /&gt;
	&lt;br /&gt;
ammo_limit				= 210				&lt;br /&gt;
ammo_elapsed			= 30				&lt;br /&gt;
	&lt;br /&gt;
ammo_mag_size			= 30				&lt;br /&gt;
fire_modes				= 1, -1&lt;br /&gt;
&lt;br /&gt;
ammo_class				= ammo_5.56x45_ss190, ammo_5.56x45_ap	  &lt;br /&gt;
grenade_class			= ammo_vog-25, ammo_vog-25p			&lt;br /&gt;
launch_speed			= 0&lt;br /&gt;
&lt;br /&gt;
hand_dependence			= 1									&lt;br /&gt;
single_handed			= 0&lt;br /&gt;
	&lt;br /&gt;
slot 					= 2									&lt;br /&gt;
animation_slot			= 2									&lt;br /&gt;
inv_name	        	= wpn-ak101								&lt;br /&gt;
inv_name_short			= wpn-ak101&lt;br /&gt;
inv_weight			= 3.3								&lt;br /&gt;
&lt;br /&gt;
inv_grid_width			= 5	 &lt;br /&gt;
inv_grid_height			= 2	    &lt;br /&gt;
inv_grid_x				= 11  &lt;br /&gt;
inv_grid_y				= 29&lt;br /&gt;
&lt;br /&gt;
kill_msg_x			= 0&lt;br /&gt;
kill_msg_y			= 28&lt;br /&gt;
kill_msg_width		= 84&lt;br /&gt;
kill_msg_height		= 28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
;params of weapon recoil&lt;br /&gt;
&lt;br /&gt;
fire_dispersion_base			= 0.15;0.2		&lt;br /&gt;
control_inertion_factor			= 1.1f;1.25f&lt;br /&gt;
&lt;br /&gt;
;отдача&lt;br /&gt;
cam_relax_speed         		=6;5;3.5; 0.15		&lt;br /&gt;
cam_dispersion          		= 0.1;0.15		&lt;br /&gt;
cam_dispersion_inc			= 0.2;0.3		&lt;br /&gt;
cam_dispertion_frac			= 0.8;0.9		&lt;br /&gt;
cam_max_angle				= 10.0	    	&lt;br /&gt;
cam_max_angle_horz			= 20.0		&lt;br /&gt;
cam_step_angle_horz			= 1.1;1		&lt;br /&gt;
&lt;br /&gt;
fire_dispersion_condition_factor 	= 5.7;5	    	 &lt;br /&gt;
misfire_probability 		= 0.0055;0.003	 &lt;br /&gt;
misfire_condition_k			= 0.06;0.05&lt;br /&gt;
condition_shot_dec 			= 0.00035;0.0001	&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fire_point             		=  0,0.216,0.638			 &lt;br /&gt;
fire_point2            		=  0,0.216,0.730			&lt;br /&gt;
&lt;br /&gt;
flame_particles				= weapons\generic_weapon05	&lt;br /&gt;
smoke_particles				= weapons\generic_shoot_00&lt;br /&gt;
grenade_flame_particles		= weapons\generic_weapon01&lt;br /&gt;
	&lt;br /&gt;
shell_point		 			= 0,0.216,0.174				&lt;br /&gt;
shell_particles	 			= weapons\generic_shells	&lt;br /&gt;
&lt;br /&gt;
PDM_disp_base 				= 1.0&lt;br /&gt;
PDM_disp_vel_factor 		= 1.3&lt;br /&gt;
PDM_disp_accel_factor 		= 1.3&lt;br /&gt;
PDM_crouch	 				= 1.0&lt;br /&gt;
PDM_crouch_no_acc 			= 1.0&lt;br /&gt;
&lt;br /&gt;
; ttc&lt;br /&gt;
hit_power                	= 0.36, 0.4, 0.43, 0.46		&lt;br /&gt;
hit_impulse		 			= 140			&lt;br /&gt;
hit_type 					= fire_wound 	&lt;br /&gt;
fire_distance            	= 1700		&lt;br /&gt;
bullet_speed				= 1000		&lt;br /&gt;
rpm                      	= 750		&lt;br /&gt;
&lt;br /&gt;
use_aim_bullet				= true		&lt;br /&gt;
time_to_aim					= 1.0	&lt;br /&gt;
&lt;br /&gt;
;params when silencer is attached &lt;br /&gt;
;similar to corresponding params without prefix silencer_&lt;br /&gt;
&lt;br /&gt;
silencer_hit_power       	= 0.38&lt;br /&gt;
silencer_hit_impulse	 	= 120&lt;br /&gt;
silencer_fire_distance   	= 250&lt;br /&gt;
silencer_bullet_speed	 	= 600&lt;br /&gt;
&lt;br /&gt;
hud                      	= wpn_ak101_hud				&lt;br /&gt;
&lt;br /&gt;
position         	        = -0.026,-0.172,0			&lt;br /&gt;
orientation      	        = 0,0,0						&lt;br /&gt;
&lt;br /&gt;
;--STRAP PARAMETERS-----------------------------------------------------------------&lt;br /&gt;
strap_position         		= -0.16,-0.40,0.15			&lt;br /&gt;
strap_orientation      		= -10,-5,10					&lt;br /&gt;
strap_bone0					= bip01_spine2&lt;br /&gt;
strap_bone1					= bip01_spine1&lt;br /&gt;
&lt;br /&gt;
visual         		        = weapons\ak-101\wpn_ak101		&lt;br /&gt;
&lt;br /&gt;
light_color					= 0.6,0.5,0.3				&lt;br /&gt;
light_range					= 5							&lt;br /&gt;
light_var_color				= 0.05						&lt;br /&gt;
light_var_range				= 0.5&lt;br /&gt;
light_time 					= 0.2						&lt;br /&gt;
&lt;br /&gt;
ph_mass						= 5							&lt;br /&gt;
&lt;br /&gt;
;addons&lt;br /&gt;
scope_status				= 2							&lt;br /&gt;
silencer_status				= 2							&lt;br /&gt;
grenade_launcher_status		= 0;2							&lt;br /&gt;
&lt;br /&gt;
zoom_enabled				= true						&lt;br /&gt;
scope_zoom_factor	    	= 50						&lt;br /&gt;
&lt;br /&gt;
scope_name 					= wpn_addon_scope			&lt;br /&gt;
scope_x 					= 42						&lt;br /&gt;
scope_y 					= 3&lt;br /&gt;
silencer_name  				= wpn_addon_silencer		&lt;br /&gt;
silencer_x 					= 218						&lt;br /&gt;
silencer_y 					= 13					&lt;br /&gt;
grenade_launcher_name 		= wpn_addon_grenade_launcher&lt;br /&gt;
grenade_launcher_x 			= 116						&lt;br /&gt;
grenade_launcher_y 			= 23&lt;br /&gt;
&lt;br /&gt;
;sounds (name of the sound, volume (0.0 - 1.0), delay (sec))&lt;br /&gt;
snd_draw					= weapons\ak74_draw&lt;br /&gt;
snd_holster					= weapons\generic_holster&lt;br /&gt;
snd_shoot					= weapons\ak74_shot_0&lt;br /&gt;
snd_shoot1					= weapons\ak74_shot_1&lt;br /&gt;
snd_shoot2					= weapons\ak74_shot_2&lt;br /&gt;
snd_shoot3					= weapons\ak74_shot_3		&lt;br /&gt;
snd_empty					= weapons\gen_empty, 0.5&lt;br /&gt;
snd_reload					= weapons\ak74_reload, 0.7, 0.35&lt;br /&gt;
snd_shoot_grenade			= weapons\gen_grenshoot&lt;br /&gt;
snd_reload_grenade			= weapons\gen_grenload, 1.0, 0.8&lt;br /&gt;
snd_switch					= weapons\groza_switch, 1.0, 0.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;params when silencer is attached &lt;br /&gt;
;similar to corresponding params without prefix silencer_&lt;br /&gt;
&lt;br /&gt;
;silencer_flame_particles 	= weapons\generic_weapon01&lt;br /&gt;
silencer_smoke_particles 	= weapons\generic_shoot_00&lt;br /&gt;
&lt;br /&gt;
snd_silncer_shot			= weapons\w_ak74_shot1 &lt;br /&gt;
&lt;br /&gt;
silencer_light_color		= 0.6,0.5,0.3&lt;br /&gt;
silencer_light_range		= 0.01&lt;br /&gt;
silencer_light_var_color	= 0.05&lt;br /&gt;
silencer_light_var_range	= 0.5&lt;br /&gt;
silencer_light_time 		= 0.2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;-- HUD DESCRIPTION&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
[wpn_ak101_hud]&lt;br /&gt;
allow_inertion				= true&lt;br /&gt;
&lt;br /&gt;
;similar to corresponding params in weapon section but for 1st person view&lt;br /&gt;
&lt;br /&gt;
shell_point					= -0.065000,0.000000,-0.045000&lt;br /&gt;
shell_dir			     	= 0.0, 1.0, 0.0&lt;br /&gt;
&lt;br /&gt;
fire_point               	= 0.09,0.020,-0.06&lt;br /&gt;
fire_point2              	= 0.30, 0.00, 0.05&lt;br /&gt;
fire_bone               	= wpn_body&lt;br /&gt;
&lt;br /&gt;
orientation             	= 0, 0, 0		&lt;br /&gt;
position                	= 0, 0, 0.05&lt;br /&gt;
visual                  	= weapons\ak-101\wpn_ak101_hud&lt;br /&gt;
&lt;br /&gt;
grenade_bone            	= wpn_grenade	&lt;br /&gt;
&lt;br /&gt;
; animation names&lt;br /&gt;
&lt;br /&gt;
anim_idle					= idle&lt;br /&gt;
anim_idle_aim				= idle_aim&lt;br /&gt;
anim_reload					= reload&lt;br /&gt;
anim_draw					= draw_wo_gl&lt;br /&gt;
anim_holster				= holster_wo_gl&lt;br /&gt;
anim_shoot					= shoot&lt;br /&gt;
			&lt;br /&gt;
; animation names&lt;br /&gt;
; attached grenade launcher [GRENADE fire mode]&lt;br /&gt;
anim_idle_g					= idle_grenade&lt;br /&gt;
anim_idle_g_aim				= idle_g_aim&lt;br /&gt;
anim_reload_g				= reload_grenade&lt;br /&gt;
anim_shoot_g				= shoot_grenade&lt;br /&gt;
anim_switch_grenade_on		= switch_grenade&lt;br /&gt;
anim_switch_grenade_off		= switch_grenade_off&lt;br /&gt;
anim_draw_g					= draw_grenade_mode&lt;br /&gt;
anim_holster_g				= holster_grenade_mode&lt;br /&gt;
&lt;br /&gt;
; attached grenade launcher [NORMAL fire mode]&lt;br /&gt;
anim_idle_gl				= idle_w_gl&lt;br /&gt;
anim_idle_gl_aim			= idle_w_gl_aim&lt;br /&gt;
anim_reload_gl				= reload_w_gl&lt;br /&gt;
anim_draw_gl				= draw_w_gl&lt;br /&gt;
anim_holster_gl				= holster_w_gl&lt;br /&gt;
anim_shoot_gl				= shoot_w_gl&lt;br /&gt;
anim_idle_sprint			= idle_sprint&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;HUD offset in zoom mode (to all)&lt;br /&gt;
;(use CONSOLE: hud_adjust_mode 0,1,2, then keys WSADQE and P to show current value in console)&lt;br /&gt;
&lt;br /&gt;
zoom_offset			= -0.112400,0.016800,-0.115000&lt;br /&gt;
zoom_rotate_x		= 0.000200&lt;br /&gt;
zoom_rotate_y		= 0.017500&lt;br /&gt;
&lt;br /&gt;
zoom_hide_crosshair	= true						&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; same as above, but for attached grenade launcher for&lt;br /&gt;
; in NORMAL shoot mode&lt;br /&gt;
&lt;br /&gt;
grenade_normal_zoom_offset			= -0.112500,0.014000,0.000000&lt;br /&gt;
grenade_normal_zoom_rotate_x		= -0.000900&lt;br /&gt;
grenade_normal_zoom_rotate_y		= 0.017200&lt;br /&gt;
&lt;br /&gt;
; same as above, but for attached grenade launcher for&lt;br /&gt;
; in GRENADE mode&lt;br /&gt;
&lt;br /&gt;
grenade_zoom_offset			= -0.039600,-0.433100,0.000000&lt;br /&gt;
grenade_zoom_rotate_x		= -0.538700&lt;br /&gt;
grenade_zoom_rotate_y		= -0.033800&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Регистрация===&lt;br /&gt;
&lt;br /&gt;
Итак, с характеристиками разобрались. Теперь зарегистрируем оружие в файле '''weapons.ltx'''. Для этого пропишем в него строку следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;w_ak101.ltx&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также, необходимо прописать модели, используемые для отображения оружия, в '''prefetch.ltx''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
weapons\abakan\wpn_abakan&lt;br /&gt;
weapons\abakan\wpn_abakan_hud&lt;br /&gt;
weapons\ak-101\wpn_ak101&lt;br /&gt;
weapons\ak-101\wpn_ak101_hud&lt;br /&gt;
weapons\ak74\wpn_ak74&lt;br /&gt;
weapons\ak74\wpn_ak74_hud&lt;br /&gt;
[...]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так же не забудте в файле '''mp_ranks.ltx''' прописать после '''available_items''' (которое внизу)&lt;br /&gt;
прописать название своего оружия. Это предотвратит вылет при убийстве ГГ.&lt;br /&gt;
&lt;br /&gt;
==Добавление в игру==&lt;br /&gt;
&lt;br /&gt;
Осталось добавить оружие в игру. &lt;br /&gt;
&lt;br /&gt;
Выдайте его некоторым NPC ([[Редактирование NPC#Практика|как это сделать?]]), расширьте ассортимент торговцев ([[Редактирование торговцев#Расширяем ассортимент|как это сделать?]]).&lt;br /&gt;
&lt;br /&gt;
А вот как оно будет выглядеть в игре:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Russian_Guns_3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана: &lt;br /&gt;
*[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
&lt;br /&gt;
По материалам мода [[Mod:Russian Guns|Russian Guns]] за авторством: &lt;br /&gt;
*[[Участник:Tony|Tony]]&lt;br /&gt;
*[[Участник:lez0|lez0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты|Скрипты]][[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F</id>
		<title>Создание нового оружия</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F"/>
				<updated>2008-08-10T10:37:39Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье мы научимся создавать новые образцы вооружения. Для начала, мы будем использовать модели из оригинальной игры. Если вы хотите создать оружие, имеющее уникальный внешний вид, ознакомьтесь с [[Создание моделей и их добавление в игру|уроком]] по созданию моделей.&lt;br /&gt;
&lt;br /&gt;
Добавим в игру '''АК101'''.&lt;br /&gt;
&lt;br /&gt;
==Внешний вид==&lt;br /&gt;
&lt;br /&gt;
Позаботимся о том, чтобы наше оружие отличалось внешне от того же '''АК74'''.&lt;br /&gt;
&lt;br /&gt;
===Текстуры===&lt;br /&gt;
&lt;br /&gt;
Нарисуем для оружия новую текстуру. Подробно останавливаться на этом процессе не буду, ознакомьтесь с примером, приведенным [[Изменение текстур#Изменение текстур моделей|здесь]]. Итак, основываясь на текстуре '''АК74''', мы сделали вот такую текстуру:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:500px-AK101 texture.jpg]]&lt;br /&gt;
&lt;br /&gt;
Файлы текстур мы назвали:&lt;br /&gt;
&lt;br /&gt;
* '''wpn_ak10.dds'''&lt;br /&gt;
* '''wpn_ak10_bump#.dds'''&lt;br /&gt;
* '''wpn_ak10_bump.dds'''&lt;br /&gt;
&lt;br /&gt;
===Модели===&lt;br /&gt;
&lt;br /&gt;
Новых моделей мы пока делать не станем, просто воспользуемся дублированными моделями от '''АК74'''. Скопируем папку:&lt;br /&gt;
&lt;br /&gt;
'''gamedata\meshes\weapons\ak47\''' &lt;br /&gt;
&lt;br /&gt;
И назовем её '''ak-101'''. Содержимое, соответственно, переименуем в:&lt;br /&gt;
&lt;br /&gt;
* '''wpn_ak101.ogf'''&lt;br /&gt;
* '''wpn_ak101_hud.ogf'''.&lt;br /&gt;
&lt;br /&gt;
Теперь пропишем в эти модели созданные нами текстуры. Способ описан [[Изменение текстур#Создание новых visual для использования с новыми объектами|здесь]]'''.&lt;br /&gt;
&lt;br /&gt;
===Иконки===&lt;br /&gt;
&lt;br /&gt;
Добавим в игру иконки, которыми оружие будет отображаться в инвентаре. Способ подробно описан [[Изменение текстур#Изменение иконок предметов|здесь]].&lt;br /&gt;
&lt;br /&gt;
Вот, что получилось в конечном итоге:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:500px-AK101 icon.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Конфиги==&lt;br /&gt;
&lt;br /&gt;
Новое оружие мы будем делать на базе оригинальных конфигурационных файлов. Создадим '''АК101''' на базе конфигов '''АК74'''. &lt;br /&gt;
&lt;br /&gt;
===Свойства оружия===&lt;br /&gt;
&lt;br /&gt;
Скопируем файл из папки:&lt;br /&gt;
&lt;br /&gt;
'''gamedata\config\weapons\ak74.ltx'''&lt;br /&gt;
&lt;br /&gt;
Назовем его '''ak101.ltx'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Отредактируем свойства по своему усмотрению (но лучше - в соответствии с достоверной информацией о характеристиках оружия, т.к. '''АК101''' - всё-таки оружие реально существующее). Редактирование конфигов оружия подробно описано в отдельном [[Редактирование оружия|уроке]]. В данном случае конфиг был составлен таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
[wpn_ak101]:identity_immunities&lt;br /&gt;
GroupControlSection		= spawn_group&lt;br /&gt;
discovery_dependency	= &lt;br /&gt;
$spawn              	= &amp;quot;weapons\ak-101&amp;quot;	; name and section in level editor&lt;br /&gt;
$npc					= on				&lt;br /&gt;
$prefetch 				= 8&lt;br /&gt;
scheduled				= off               ;[] option for ALife Simulator&lt;br /&gt;
cform               	= skeleton&lt;br /&gt;
class               	= WP_AK74			; class of the weapon that corresponding to CPP class&lt;br /&gt;
min_radius          	= 30				; [] for AI&lt;br /&gt;
max_radius          	= 100				; [] for AI&lt;br /&gt;
description				= enc_weapons1_wpn-ak101&lt;br /&gt;
	&lt;br /&gt;
ef_main_weapon_type		= 2&lt;br /&gt;
ef_weapon_type			= 6&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
holder_range_modifier	= 1.0		       ; во сколько раз увеличивается eye_range &lt;br /&gt;
holder_fov_modifier		= 0.7              ; во сколько раз увеличивается eye_fov&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cost					= 2;4000				&lt;br /&gt;
weapon_class			= assault_rifle		&lt;br /&gt;
	&lt;br /&gt;
ammo_limit				= 210				&lt;br /&gt;
ammo_elapsed			= 30				&lt;br /&gt;
	&lt;br /&gt;
ammo_mag_size			= 30				&lt;br /&gt;
fire_modes				= 1, -1&lt;br /&gt;
&lt;br /&gt;
ammo_class				= ammo_5.56x45_ss190, ammo_5.56x45_ap	  &lt;br /&gt;
grenade_class			= ammo_vog-25, ammo_vog-25p			&lt;br /&gt;
launch_speed			= 0&lt;br /&gt;
&lt;br /&gt;
hand_dependence			= 1									&lt;br /&gt;
single_handed			= 0&lt;br /&gt;
	&lt;br /&gt;
slot 					= 2									&lt;br /&gt;
animation_slot			= 2									&lt;br /&gt;
inv_name	        	= wpn-ak101								&lt;br /&gt;
inv_name_short			= wpn-ak101&lt;br /&gt;
inv_weight			= 3.3								&lt;br /&gt;
&lt;br /&gt;
inv_grid_width			= 5	 &lt;br /&gt;
inv_grid_height			= 2	    &lt;br /&gt;
inv_grid_x				= 11  &lt;br /&gt;
inv_grid_y				= 29&lt;br /&gt;
&lt;br /&gt;
kill_msg_x			= 0&lt;br /&gt;
kill_msg_y			= 28&lt;br /&gt;
kill_msg_width		= 84&lt;br /&gt;
kill_msg_height		= 28&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
;params of weapon recoil&lt;br /&gt;
&lt;br /&gt;
fire_dispersion_base			= 0.15;0.2		&lt;br /&gt;
control_inertion_factor			= 1.1f;1.25f&lt;br /&gt;
&lt;br /&gt;
;отдача&lt;br /&gt;
cam_relax_speed         		=6;5;3.5; 0.15		&lt;br /&gt;
cam_dispersion          		= 0.1;0.15		&lt;br /&gt;
cam_dispersion_inc			= 0.2;0.3		&lt;br /&gt;
cam_dispertion_frac			= 0.8;0.9		&lt;br /&gt;
cam_max_angle				= 10.0	    	&lt;br /&gt;
cam_max_angle_horz			= 20.0		&lt;br /&gt;
cam_step_angle_horz			= 1.1;1		&lt;br /&gt;
&lt;br /&gt;
fire_dispersion_condition_factor 	= 5.7;5	    	 &lt;br /&gt;
misfire_probability 		= 0.0055;0.003	 &lt;br /&gt;
misfire_condition_k			= 0.06;0.05&lt;br /&gt;
condition_shot_dec 			= 0.00035;0.0001	&lt;br /&gt;
;-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
fire_point             		=  0,0.216,0.638			 &lt;br /&gt;
fire_point2            		=  0,0.216,0.730			&lt;br /&gt;
&lt;br /&gt;
flame_particles				= weapons\generic_weapon05	&lt;br /&gt;
smoke_particles				= weapons\generic_shoot_00&lt;br /&gt;
grenade_flame_particles		= weapons\generic_weapon01&lt;br /&gt;
	&lt;br /&gt;
shell_point		 			= 0,0.216,0.174				&lt;br /&gt;
shell_particles	 			= weapons\generic_shells	&lt;br /&gt;
&lt;br /&gt;
PDM_disp_base 				= 1.0&lt;br /&gt;
PDM_disp_vel_factor 		= 1.3&lt;br /&gt;
PDM_disp_accel_factor 		= 1.3&lt;br /&gt;
PDM_crouch	 				= 1.0&lt;br /&gt;
PDM_crouch_no_acc 			= 1.0&lt;br /&gt;
&lt;br /&gt;
; ttc&lt;br /&gt;
hit_power                	= 0.36, 0.4, 0.43, 0.46		&lt;br /&gt;
hit_impulse		 			= 140			&lt;br /&gt;
hit_type 					= fire_wound 	&lt;br /&gt;
fire_distance            	= 1700		&lt;br /&gt;
bullet_speed				= 1000		&lt;br /&gt;
rpm                      	= 750		&lt;br /&gt;
&lt;br /&gt;
use_aim_bullet				= true		&lt;br /&gt;
time_to_aim					= 1.0	&lt;br /&gt;
&lt;br /&gt;
;params when silencer is attached &lt;br /&gt;
;similar to corresponding params without prefix silencer_&lt;br /&gt;
&lt;br /&gt;
silencer_hit_power       	= 0.38&lt;br /&gt;
silencer_hit_impulse	 	= 120&lt;br /&gt;
silencer_fire_distance   	= 250&lt;br /&gt;
silencer_bullet_speed	 	= 600&lt;br /&gt;
&lt;br /&gt;
hud                      	= wpn_ak101_hud				&lt;br /&gt;
&lt;br /&gt;
position         	        = -0.026,-0.172,0			&lt;br /&gt;
orientation      	        = 0,0,0						&lt;br /&gt;
&lt;br /&gt;
;--STRAP PARAMETERS-----------------------------------------------------------------&lt;br /&gt;
strap_position         		= -0.16,-0.40,0.15			&lt;br /&gt;
strap_orientation      		= -10,-5,10					&lt;br /&gt;
strap_bone0					= bip01_spine2&lt;br /&gt;
strap_bone1					= bip01_spine1&lt;br /&gt;
&lt;br /&gt;
visual         		        = weapons\ak-101\wpn_ak101		&lt;br /&gt;
&lt;br /&gt;
light_color					= 0.6,0.5,0.3				&lt;br /&gt;
light_range					= 5							&lt;br /&gt;
light_var_color				= 0.05						&lt;br /&gt;
light_var_range				= 0.5&lt;br /&gt;
light_time 					= 0.2						&lt;br /&gt;
&lt;br /&gt;
ph_mass						= 5							&lt;br /&gt;
&lt;br /&gt;
;addons&lt;br /&gt;
scope_status				= 2							&lt;br /&gt;
silencer_status				= 2							&lt;br /&gt;
grenade_launcher_status		= 0;2							&lt;br /&gt;
&lt;br /&gt;
zoom_enabled				= true						&lt;br /&gt;
scope_zoom_factor	    	= 50						&lt;br /&gt;
&lt;br /&gt;
scope_name 					= wpn_addon_scope			&lt;br /&gt;
scope_x 					= 42						&lt;br /&gt;
scope_y 					= 3&lt;br /&gt;
silencer_name  				= wpn_addon_silencer		&lt;br /&gt;
silencer_x 					= 218						&lt;br /&gt;
silencer_y 					= 13					&lt;br /&gt;
grenade_launcher_name 		= wpn_addon_grenade_launcher&lt;br /&gt;
grenade_launcher_x 			= 116						&lt;br /&gt;
grenade_launcher_y 			= 23&lt;br /&gt;
&lt;br /&gt;
;sounds (name of the sound, volume (0.0 - 1.0), delay (sec))&lt;br /&gt;
snd_draw					= weapons\ak74_draw&lt;br /&gt;
snd_holster					= weapons\generic_holster&lt;br /&gt;
snd_shoot					= weapons\ak74_shot_0&lt;br /&gt;
snd_shoot1					= weapons\ak74_shot_1&lt;br /&gt;
snd_shoot2					= weapons\ak74_shot_2&lt;br /&gt;
snd_shoot3					= weapons\ak74_shot_3		&lt;br /&gt;
snd_empty					= weapons\gen_empty, 0.5&lt;br /&gt;
snd_reload					= weapons\ak74_reload, 0.7, 0.35&lt;br /&gt;
snd_shoot_grenade			= weapons\gen_grenshoot&lt;br /&gt;
snd_reload_grenade			= weapons\gen_grenload, 1.0, 0.8&lt;br /&gt;
snd_switch					= weapons\groza_switch, 1.0, 0.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;params when silencer is attached &lt;br /&gt;
;similar to corresponding params without prefix silencer_&lt;br /&gt;
&lt;br /&gt;
;silencer_flame_particles 	= weapons\generic_weapon01&lt;br /&gt;
silencer_smoke_particles 	= weapons\generic_shoot_00&lt;br /&gt;
&lt;br /&gt;
snd_silncer_shot			= weapons\w_ak74_shot1 &lt;br /&gt;
&lt;br /&gt;
silencer_light_color		= 0.6,0.5,0.3&lt;br /&gt;
silencer_light_range		= 0.01&lt;br /&gt;
silencer_light_var_color	= 0.05&lt;br /&gt;
silencer_light_var_range	= 0.5&lt;br /&gt;
silencer_light_time 		= 0.2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
;-- HUD DESCRIPTION&lt;br /&gt;
;-----------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
[wpn_ak101_hud]&lt;br /&gt;
allow_inertion				= true&lt;br /&gt;
&lt;br /&gt;
;similar to corresponding params in weapon section but for 1st person view&lt;br /&gt;
&lt;br /&gt;
shell_point					= -0.065000,0.000000,-0.045000&lt;br /&gt;
shell_dir			     	= 0.0, 1.0, 0.0&lt;br /&gt;
&lt;br /&gt;
fire_point               	= 0.09,0.020,-0.06&lt;br /&gt;
fire_point2              	= 0.30, 0.00, 0.05&lt;br /&gt;
fire_bone               	= wpn_body&lt;br /&gt;
&lt;br /&gt;
orientation             	= 0, 0, 0		&lt;br /&gt;
position                	= 0, 0, 0.05&lt;br /&gt;
visual                  	= weapons\ak-101\wpn_ak101_hud&lt;br /&gt;
&lt;br /&gt;
grenade_bone            	= wpn_grenade	&lt;br /&gt;
&lt;br /&gt;
; animation names&lt;br /&gt;
&lt;br /&gt;
anim_idle					= idle&lt;br /&gt;
anim_idle_aim				= idle_aim&lt;br /&gt;
anim_reload					= reload&lt;br /&gt;
anim_draw					= draw_wo_gl&lt;br /&gt;
anim_holster				= holster_wo_gl&lt;br /&gt;
anim_shoot					= shoot&lt;br /&gt;
			&lt;br /&gt;
; animation names&lt;br /&gt;
; attached grenade launcher [GRENADE fire mode]&lt;br /&gt;
anim_idle_g					= idle_grenade&lt;br /&gt;
anim_idle_g_aim				= idle_g_aim&lt;br /&gt;
anim_reload_g				= reload_grenade&lt;br /&gt;
anim_shoot_g				= shoot_grenade&lt;br /&gt;
anim_switch_grenade_on		= switch_grenade&lt;br /&gt;
anim_switch_grenade_off		= switch_grenade_off&lt;br /&gt;
anim_draw_g					= draw_grenade_mode&lt;br /&gt;
anim_holster_g				= holster_grenade_mode&lt;br /&gt;
&lt;br /&gt;
; attached grenade launcher [NORMAL fire mode]&lt;br /&gt;
anim_idle_gl				= idle_w_gl&lt;br /&gt;
anim_idle_gl_aim			= idle_w_gl_aim&lt;br /&gt;
anim_reload_gl				= reload_w_gl&lt;br /&gt;
anim_draw_gl				= draw_w_gl&lt;br /&gt;
anim_holster_gl				= holster_w_gl&lt;br /&gt;
anim_shoot_gl				= shoot_w_gl&lt;br /&gt;
anim_idle_sprint			= idle_sprint&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;HUD offset in zoom mode (to all)&lt;br /&gt;
;(use CONSOLE: hud_adjust_mode 0,1,2, then keys WSADQE and P to show current value in console)&lt;br /&gt;
&lt;br /&gt;
zoom_offset			= -0.112400,0.016800,-0.115000&lt;br /&gt;
zoom_rotate_x		= 0.000200&lt;br /&gt;
zoom_rotate_y		= 0.017500&lt;br /&gt;
&lt;br /&gt;
zoom_hide_crosshair	= true						&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; same as above, but for attached grenade launcher for&lt;br /&gt;
; in NORMAL shoot mode&lt;br /&gt;
&lt;br /&gt;
grenade_normal_zoom_offset			= -0.112500,0.014000,0.000000&lt;br /&gt;
grenade_normal_zoom_rotate_x		= -0.000900&lt;br /&gt;
grenade_normal_zoom_rotate_y		= 0.017200&lt;br /&gt;
&lt;br /&gt;
; same as above, but for attached grenade launcher for&lt;br /&gt;
; in GRENADE mode&lt;br /&gt;
&lt;br /&gt;
grenade_zoom_offset			= -0.039600,-0.433100,0.000000&lt;br /&gt;
grenade_zoom_rotate_x		= -0.538700&lt;br /&gt;
grenade_zoom_rotate_y		= -0.033800&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Регистрация===&lt;br /&gt;
&lt;br /&gt;
Итак, с характеристиками разобрались. Теперь зарегистрируем оружие в файле '''weapons.ltx'''. Для этого пропишем в него строку следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#include &amp;quot;w_ak101.ltx&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также, необходимо прописать модели, используемые для отображения оружия, в '''prefetch.ltx''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[...]&lt;br /&gt;
weapons\abakan\wpn_abakan&lt;br /&gt;
weapons\abakan\wpn_abakan_hud&lt;br /&gt;
weapons\ak-101\wpn_ak101&lt;br /&gt;
weapons\ak-101\wpn_ak101_hud&lt;br /&gt;
weapons\ak74\wpn_ak74&lt;br /&gt;
weapons\ak74\wpn_ak74_hud&lt;br /&gt;
[...]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так же не забудте в файле '''mp_ranks.ltx''' прописать после '''available_items''' (которое внизу)&lt;br /&gt;
прописать название своего оружия. Это предотвратит вылет при убийстве ГГ.&lt;br /&gt;
&lt;br /&gt;
==Добавление в игру==&lt;br /&gt;
&lt;br /&gt;
Осталось добавить оружие в игру. &lt;br /&gt;
&lt;br /&gt;
Выдайте его некоторым NPC ([[Редактирование NPC#Практика|как это сделать?]]), расширьте ассортимент торговцев ([[Редактирование торговцев#Расширяем ассортимент|как это сделать?]]).&lt;br /&gt;
&lt;br /&gt;
А вот как оно будет выглядеть в игре:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Russian_Guns_3.jpeg]]&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана: &lt;br /&gt;
*[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
&lt;br /&gt;
По материалам мода [[Mod:Russian Guns|Russian Guns]] за авторством: &lt;br /&gt;
*[[Участник:Tony|Tony]]&lt;br /&gt;
*[[Участник:lez0|lez0]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты|Скрипты]][[Категория:Конфигурационные фаилы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=3dsmax._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BB%D1%91%D1%81%D0%BD%D0%BE%D0%B9_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B8</id>
		<title>3dsmax. Создание колёсной техники</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=3dsmax._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BB%D1%91%D1%81%D0%BD%D0%BE%D0%B9_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B8"/>
				<updated>2008-08-10T10:30:12Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создание колёсной техники==&lt;br /&gt;
===1. Вступление===&lt;br /&gt;
&lt;br /&gt;
Данный урок посвящен созданию моделей транспорта (авто или что-то другое решать Вам). Статья рассчитана на опытных пользователей 3DSMax.&lt;br /&gt;
&lt;br /&gt;
Перед прочтением этой статьи советую еще раз ознакомится с [[Создание моделей и их добавление в игру|этим]] уроком. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===2. Создание примитов===&lt;br /&gt;
&lt;br /&gt;
Для начала - откроем 3DSMax. Создадим что-то похожее на машину. Далее необходимо создать материал, настроить его и затекстурить модель.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-2.jpg|300px]][[Изображение:Untitled-1.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
На этом скриншоте показаны '''ID''' материалов назначаемых разным частям машины и подписаны сами части.&lt;br /&gt;
&lt;br /&gt;
===3. Создание хелперов===&lt;br /&gt;
&lt;br /&gt;
Поскольку лично я костями не пользуюсь, ставим Хелперы ('''Dummy''').&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-4.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Называть хелперы можно в процессе создания или после установки всех хелперов. Называть можно как Вам самим будет удобно и понятно, '''НО''' хелперы '''root''', '''front_axle''', '''back_axle''' не советую. Это именно те хелперы которые нельзя определить в конфига (*.ltx) и может случиться так что игра будет вылетать с нулевым логом.  &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-5.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Тоже самое вид сбоку.&lt;br /&gt;
&lt;br /&gt;
Затем надо развернуть некоторые хелперы в нужную сторону. Поскольку это не кости по ним невидно куда они ориентированы, это создает излишние сложности. Нам необходимо провернуть хелперы колёс (*_*_wheel), руля (stearing_wheel), сидения (seat_left), выхлопной трубы (exhausts), фар (*_light) и дверей (*_door). Конечные хелперы (вида *_end) вращать не надо.&lt;br /&gt;
&lt;br /&gt;
Вращение хелперов осуществляется также как и любых других объектов в 3DSMax, а для проверки приходится пользоваться меню '''Hierarchy''' &amp;gt; '''Adjust Pivot''' &amp;gt; '''Affect Pivot Only'''.&lt;br /&gt;
&lt;br /&gt;
'''Не забывайте выходить из этого режима иначе хелпер не провернётся, провернётся только его ось.'''&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-8.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Здесь все хелперы уже повёрнуты в нужные стороны.&lt;br /&gt;
И более подробно каждый в отдельности.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-9a.jpg|300px]][[Изображение:Untitled-9b.jpg|300px]][[Изображение:Untitled-9c.jpg|300px]][[Изображение:Untitled-9d.jpg|300px]][[Изображение:Untitled-9e.jpg|300px]][[Изображение:Untitled-9f.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Некоторые пояснения: вращение колёс происходит вокруг зелёной оси (хелпера) по направлению синей оси, водитель сидит лицом по зеленой оси (хелпера) тело снизу вверх направлено по синей оси (хелпера), фары светят по зелёной оси,  выхлопная труба - дым направлен по зелёной оси, двери - выход из машины осуществляется по зелёной оси (хотя с этим надо поэкспериментировать).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И после всего этого необходимо создать Линки ('''Link''') между хелперами. Лункуются они начиная с конечного (end) к головному (root).&lt;br /&gt;
Итог должен выглядеть примерно вот так.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-6.jpg|300px]] [[Изображение:Untitled-7.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Естественно жёлтых связей вы не увидите, но так выглядит более наглядно.&lt;br /&gt;
&lt;br /&gt;
===4. Привязка скелета к модели===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После расстановки и линковки хелперов выбираем наш объект (mesh), применяем к нему модификатор '''Physique''', жмем кнопку '''Attach to node''' root –&amp;gt; '''Rigid''' –&amp;gt; '''Initialize'''. Скелет готов к привязке.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-7.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Это действо уже описывалось в других уроках, поэтому останавливаться на этом подробно не буду.&lt;br /&gt;
&lt;br /&gt;
Окончив привязку, можно экспортировать модель. Необходимо поставить галочку Allow Dummy.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-3.jpg|100px]]&lt;br /&gt;
&lt;br /&gt;
===4. Настройка модели в Actor Editor===&lt;br /&gt;
&lt;br /&gt;
Здесь необходимо, вписать в раздел '''Object''' &amp;gt; '''User Data''' ссылку на файл конфиг (*.ltx), в моём случае строка имеет такой вид: #include &amp;quot;models\vehicles\veh_niva_u_01.ltx&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-11a.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Вот так.&lt;br /&gt;
&lt;br /&gt;
После этого неплохо проверить настойки материалов ('''Surfaces'''). &lt;br /&gt;
Шейдеры для свечения и блеска models\lightplanes, def_shaders\def_ghost (или другие использующие прозрачность альфа канала), material\fake (по большому счёту материал неважен).&lt;br /&gt;
Шейдеры для колёс model\model, def_shaders\def_vertex, objects\car_wheel.&lt;br /&gt;
Шейдеры для кузова и прочих частей model\model, def_shaders\def_vertex, objects\car_cabine.&lt;br /&gt;
&lt;br /&gt;
Далее необходимо настроить некоторые кости. В меню (слева) '''Object Items''' выбираем '''Bones''', далее '''Generate Shape''' &amp;gt; '''All'''. Ждём, в зависимости от компа и модели может занять минуту.&lt;br /&gt;
Раскрываем список, ищем оси машины '''back_axle''', '''back_axle2''', '''front_axle''', '''front_axle2''' и выбираем первую из них. &lt;br /&gt;
Смотрим ниже по списку (также слева) ищем раздел '''Shape'''  в нём '''Type''', сейчас там стоит None надо поставить Cylinder (или Box кому что нравится).&lt;br /&gt;
Ползём ниже, раздел '''Joint''' в нём '''Rigid''', меняем на '''Joint'''. Ингода вместо человеческих цифр (в графах ниже), могут появляться бешеные числа такого типа 9999876455.0 вместо них ставим 0 (нуль).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-11b.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Следующим выбираем '''back_left_wheel''', так же '''Shape''' &amp;gt; '''Type''' &amp;gt; '''None''' сменить на '''Cylinder'''. Далее раздел '''Joint''' в нём выбираем '''Wheel Steer-X,Roll-Z'''. Так же вместо человеческих цифр (в графах ниже), могут появляться бешеные числа такого типа 9999876455.0 вместо них ставим 0 (нуль). &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-11c.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Проделываем выше описанное для всех оставшихся осей и колёс.&lt;br /&gt;
Не забудьте для передних (рулевых) колес указать в разделе '''Joint''' &amp;gt; '''Steer''' &amp;gt; параметры '''Limits Min''' и '''Limits Max''' - это углы поворота колёс. Примерно минимум -20, максимум 20.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-11d.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Далее необходимо проставить у всех остальных костей тип Box или более подходящий по месту (раздел '''Shape''' в нём '''Type''').&lt;br /&gt;
Если про экспорте ругается на нулевой шейп какой-либо кости, то её тип необходимо поставить в None.&lt;br /&gt;
&lt;br /&gt;
Вот что в итоге получилось у меня.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-11e.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Жуть редкостная, но ездит :)&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Untitled-12 (car test).jpg|300px]] [[Изображение:Untitled-12a (car test).jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
Удачи!&lt;br /&gt;
&lt;br /&gt;
===6. Исходники===&lt;br /&gt;
&lt;br /&gt;
Исходники можно не скачивать. Их просто нет (&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
'''Статья создана:''' [[Участник:NOsoft|NOsoft]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Благодарности:''' [[Участник:Neo|Neo]], [[Участник:Zeed|Zeed]] и многие другие хорошие люди&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=3ds_Max._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_HUD-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F</id>
		<title>3ds Max. Создание HUD-модели оружия</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=3ds_Max._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_HUD-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F"/>
				<updated>2008-08-10T10:27:40Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создание HUD-модели==&lt;br /&gt;
===1. Вступление===&lt;br /&gt;
&lt;br /&gt;
Данный урок посвящен созданию HUD-моделей для оружия. Статья рассчитана на опытных пользователей 3DSMax, так что вопросы вида &amp;quot;Как создать сферу?&amp;quot; - не принимаются.&lt;br /&gt;
&lt;br /&gt;
Вот так наш HUD будет выглядеть в конечном итоге (в 3DSMax):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Hud lesson 1.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Перед прочтением этой статьи советую еще раз ознакомится с [[Создание моделей и их добавление в игру|этим]] уроком. &lt;br /&gt;
&lt;br /&gt;
Для экспорта моделей лучше всего воспользоваться плагином '''ogf2smd''', т.к. встроенная функция экспорта из '''OGFViewer''' создает по 11 полигонов на одной координате, что крайне затрудняет процесс моделлинга и экспорта в игру.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===2. Работа с материалом===&lt;br /&gt;
&lt;br /&gt;
Для начала - откроем 3DSMax.&lt;br /&gt;
&lt;br /&gt;
Импортируем модель, открываем редактор материалов (по умолчанию - кнопка М). Нажимаем на кнопку '''Standart''', выбираем '''STALKER Mtl'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Кликнем по маленькой кнопочке напротив '''Diffuse''', выбираем '''Bitmap''', и находим нашу текстуру. Далее, присвоим её нашей модели. Все, с текстурированием покончено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3. Создание костей===&lt;br /&gt;
&lt;br /&gt;
Для работы с костями удобно использовать утилиту '''Bone Tools''', которая находится в меню '''Character'''.&lt;br /&gt;
&lt;br /&gt;
Как будет выглядеть расстановка костей в HUD-модели, вы увидите в исходнике, но главное – надо создать одну главную кость, и от нее уже вести скелет для рук и оружия. А сами кости создаются через '''Create''' -&amp;gt; '''Systems''' -&amp;gt; '''Bones'''.&lt;br /&gt;
&lt;br /&gt;
===4. Привязка скелета к модели===&lt;br /&gt;
&lt;br /&gt;
После расстановки костей выбираем наш объект, применяем к нему модификатор '''Physique''', жмем кнопку '''Attach to node''' –&amp;gt; '''Rigid\Deformable''' –&amp;gt; '''Initialize'''. Скелет готов к привязке.&lt;br /&gt;
*Важная деталь: К модели оружия обязательно должна быть привязана кость wpn_body, если ее не будет, то игра обязательно вылетит что бы вы не вписывали в конфигах!  &lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 3.jpg]]&lt;br /&gt;
&lt;br /&gt;
Включаем режим '''Vertex''' и при нажатой кнопке '''Select''' и синем плюсе выбираем нужные вершины, жмем '''Attach to link'''. Далее, при выбранном красном (или зеленом, если объект твердый) плюсе кликнем по косточке и жмем '''Lock Assignment'''. Повторяем для всех костей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 4.jpg]]&lt;br /&gt;
&lt;br /&gt;
3) Закончив привязку вершин для рук, в корне модификатора '''Physique''' сохраняем привязку в файл с помощью кнопки '''Save to *.phy''' , чтобы потом, загрузив этот файл при следующей привязке, сэкономить уйму времени.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 5.jpg]]&lt;br /&gt;
&lt;br /&gt;
Окончив привязку, можно приступать к анимированию.&lt;br /&gt;
&lt;br /&gt;
===4. Анимация HUD-модели===&lt;br /&gt;
&lt;br /&gt;
Анимировать можно в режиме '''Set Key''', и в режиме '''Auto Key''', но в данном случае удобнее будет все-таки во втором режиме.&lt;br /&gt;
&lt;br /&gt;
Нажимаем кнопку '''Auto Key''', выбираем именно кость (для удобства анимации можно выполнить команду '''ПКМ''' –&amp;gt; '''Freeze selected''' в любом видовом окне), фиксируем ее положение нажатием ключа, переводим ползунок кадров в любое положение - траектория движения и ключи в промежутке кадров просчитаются автоматически.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Hud lesson 6.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После того, как мы экспортировали модель без анимации, выбираем нашу анимацию и в утилите '''Stalker Export''' выбираем E'''xport Motion''', после чего экспортим анимацию формат '''*.skl''' &lt;br /&gt;
*Если игра вылетает с логом &amp;quot;cannot find anim [название_аним-и]_r&amp;quot; или с чем-то подобным, то создавайте копии существующих анимаций с окончанием '''_r''' и добавляйте их вместе с обычными. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 7.jpg]]&lt;br /&gt;
&lt;br /&gt;
===5. Настройка параметров в Actor Editor===&lt;br /&gt;
&lt;br /&gt;
Открываем Actor Editor. Настраиваем параметры в свитке '''Surface'''. Я ставил такие:&lt;br /&gt;
&lt;br /&gt;
* '''models\weapons'''&lt;br /&gt;
* '''def_shader\def_vertex'''&lt;br /&gt;
* '''game mtl\objects\small_weapon'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 8.jpg]]&lt;br /&gt;
&lt;br /&gt;
В принципе, можно попробовать и другие.&lt;br /&gt;
&lt;br /&gt;
Далее, настроим кости в свитке '''Bones'''. В параметрах свитка выделяем все кости, ставим '''Type''' -&amp;gt; '''XXXX''', нет никакой разницы, а также '''Game mtl\objects\small_weapon''', и нажимаем '''Generate shape''' -&amp;gt; '''All'''&lt;br /&gt;
&lt;br /&gt;
Также чтобы анимации не &amp;quot;заедались&amp;quot; во время игры надо поставить галки напротив пунктов '''Stop at End''' и '''Sync Part'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 9.jpg]]&lt;br /&gt;
&lt;br /&gt;
После этого - настройка анимации. Открываем свиток '''Motions''', нажимаем кнопку '''Append''', выделяем все наши '''*.skl''' – анимации и вставляем в модель. Редактируем в параметрах скорость, плавность и проигрывание анимации. В оружии типа MP5 есть семь стандартных анимаций:&lt;br /&gt;
&lt;br /&gt;
* idle&lt;br /&gt;
* idle_aim&lt;br /&gt;
* idle_sprint&lt;br /&gt;
* shoot&lt;br /&gt;
* draw&lt;br /&gt;
* holster&lt;br /&gt;
* reload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 10.jpg]]&lt;br /&gt;
&lt;br /&gt;
Берем с главной кости координаты и градус поворота худа, и вписываем их в конфиг.&lt;br /&gt;
&lt;br /&gt;
В разделе конфига '''wpn_..._hud''' редактируются также параметры точки вылета гильзы из оружия, а также партикла выстрела. Чтобы облегчить себе работу с этими параметрами, можно создать в 3DSMax вспомогательные кости и сразу получить их координаты при настройке HUD'а в Actor Editor. Если в логе при импорте или экспорте вашего творения есть какие-то ошибки – значит, вы что-то сделали не так.&lt;br /&gt;
&lt;br /&gt;
Рекомендую сразу не хвататься за сложный HUD, а просто сделать анимированное штурмового–наступательное оружие под названием &amp;quot;Кубик&amp;quot;. Удачи!&lt;br /&gt;
&lt;br /&gt;
===6. Исходники===&lt;br /&gt;
&lt;br /&gt;
Вариант 1 - модель рук привязана к скелету Biped http://www.sendspace.com/file/k9yihh/&lt;br /&gt;
&lt;br /&gt;
Вариант 2 - модель привязана к обычным костям http://www.sendspace.com/file/bsbht9/&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
'''Статья создана:''' [[Участник:Egorych|Egorych]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Благодарности:''' [[Участник:Haron|Haron]], [[Участник:tambovski|tambovski]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Редактировано:''' [[Участник:Alwen|Alwen]] 16.02.2008&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=3ds_Max._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_HUD-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F</id>
		<title>3ds Max. Создание HUD-модели оружия</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=3ds_Max._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_HUD-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D1%8F"/>
				<updated>2008-08-10T10:18:03Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создание HUD-модели==&lt;br /&gt;
===1. Вступление===&lt;br /&gt;
&lt;br /&gt;
Данный урок посвящен созданию HUD-моделей для оружия. Статья рассчитана на опытных пользователей 3DSMax, так что вопросы вида &amp;quot;Как создать сферу?&amp;quot; - не принимаются.&lt;br /&gt;
&lt;br /&gt;
Вот так наш HUD будет выглядеть в конечном итоге (в 3DSMax):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 1.jpg|600px&lt;br /&gt;
&lt;br /&gt;
Перед прочтением этой статьи советую еще раз ознакомится с [[Создание моделей и их добавление в игру|этим]] уроком. &lt;br /&gt;
&lt;br /&gt;
Для экспорта моделей лучше всего воспользоваться плагином '''ogf2smd''', т.к. встроенная функция экспорта из '''OGFViewer''' создает по 11 полигонов на одной координате, что крайне затрудняет процесс моделлинга и экспорта в игру.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===2. Работа с материалом===&lt;br /&gt;
&lt;br /&gt;
Для начала - откроем 3DSMax.&lt;br /&gt;
&lt;br /&gt;
Импортируем модель, открываем редактор материалов (по умолчанию - кнопка М). Нажимаем на кнопку '''Standart''', выбираем '''STALKER Mtl'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 2.jpg&lt;br /&gt;
&lt;br /&gt;
Кликнем по маленькой кнопочке напротив '''Diffuse''', выбираем '''Bitmap''', и находим нашу текстуру. Далее, присвоим её нашей модели. Все, с текстурированием покончено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===3. Создание костей===&lt;br /&gt;
&lt;br /&gt;
Для работы с костями удобно использовать утилиту '''Bone Tools''', которая находится в меню '''Character'''.&lt;br /&gt;
&lt;br /&gt;
Как будет выглядеть расстановка костей в HUD-модели, вы увидите в исходнике, но главное – надо создать одну главную кость, и от нее уже вести скелет для рук и оружия. А сами кости создаются через '''Create''' -&amp;gt; '''Systems''' -&amp;gt; '''Bones'''.&lt;br /&gt;
&lt;br /&gt;
===4. Привязка скелета к модели===&lt;br /&gt;
&lt;br /&gt;
После расстановки костей выбираем наш объект, применяем к нему модификатор '''Physique''', жмем кнопку '''Attach to node''' –&amp;gt; '''Rigid\Deformable''' –&amp;gt; '''Initialize'''. Скелет готов к привязке.&lt;br /&gt;
*Важная деталь: К модели оружия обязательно должна быть привязана кость wpn_body, если ее не будет, то игра обязательно вылетит что бы вы не вписывали в конфигах!  &lt;br /&gt;
&lt;br /&gt;
Hud lesson 3.jpg&lt;br /&gt;
&lt;br /&gt;
Включаем режим '''Vertex''' и при нажатой кнопке '''Select''' и синем плюсе выбираем нужные вершины, жмем '''Attach to link'''. Далее, при выбранном красном (или зеленом, если объект твердый) плюсе кликнем по косточке и жмем '''Lock Assignment'''. Повторяем для всех костей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 4.jpg&lt;br /&gt;
&lt;br /&gt;
3) Закончив привязку вершин для рук, в корне модификатора '''Physique''' сохраняем привязку в файл с помощью кнопки '''Save to *.phy''' , чтобы потом, загрузив этот файл при следующей привязке, сэкономить уйму времени.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 5.jpg&lt;br /&gt;
&lt;br /&gt;
Окончив привязку, можно приступать к анимированию.&lt;br /&gt;
&lt;br /&gt;
===4. Анимация HUD-модели===&lt;br /&gt;
&lt;br /&gt;
Анимировать можно в режиме '''Set Key''', и в режиме '''Auto Key''', но в данном случае удобнее будет все-таки во втором режиме.&lt;br /&gt;
&lt;br /&gt;
Нажимаем кнопку '''Auto Key''', выбираем именно кость (для удобства анимации можно выполнить команду '''ПКМ''' –&amp;gt; '''Freeze selected''' в любом видовом окне), фиксируем ее положение нажатием ключа, переводим ползунок кадров в любое положение - траектория движения и ключи в промежутке кадров просчитаются автоматически.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 6.jpg|600px&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После того, как мы экспортировали модель без анимации, выбираем нашу анимацию и в утилите '''Stalker Export''' выбираем E'''xport Motion''', после чего экспортим анимацию формат '''*.skl''' &lt;br /&gt;
*Если игра вылетает с логом &amp;quot;cannot find anim [название_аним-и]_r&amp;quot; или с чем-то подобным, то создавайте копии существующих анимаций с окончанием '''_r''' и добавляйте их вместе с обычными. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 7.jpg&lt;br /&gt;
&lt;br /&gt;
===5. Настройка параметров в Actor Editor===&lt;br /&gt;
&lt;br /&gt;
Открываем Actor Editor. Настраиваем параметры в свитке '''Surface'''. Я ставил такие:&lt;br /&gt;
&lt;br /&gt;
* '''models\weapons'''&lt;br /&gt;
* '''def_shader\def_vertex'''&lt;br /&gt;
* '''game mtl\objects\small_weapon'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hud lesson 8.jpg&lt;br /&gt;
&lt;br /&gt;
В принципе, можно попробовать и другие.&lt;br /&gt;
&lt;br /&gt;
Далее, настроим кости в свитке '''Bones'''. В параметрах свитка выделяем все кости, ставим '''Type''' -&amp;gt; '''XXXX''', нет никакой разницы, а также '''Game mtl\objects\small_weapon''', и нажимаем '''Generate shape''' -&amp;gt; '''All'''&lt;br /&gt;
&lt;br /&gt;
Также чтобы анимации не &amp;quot;заедались&amp;quot; во время игры надо поставить галки напротив пунктов '''Stop at End''' и '''Sync Part'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 9.jpg]]&lt;br /&gt;
&lt;br /&gt;
После этого - настройка анимации. Открываем свиток '''Motions''', нажимаем кнопку '''Append''', выделяем все наши '''*.skl''' – анимации и вставляем в модель. Редактируем в параметрах скорость, плавность и проигрывание анимации. В оружии типа MP5 есть семь стандартных анимаций:&lt;br /&gt;
&lt;br /&gt;
* idle&lt;br /&gt;
* idle_aim&lt;br /&gt;
* idle_sprint&lt;br /&gt;
* shoot&lt;br /&gt;
* draw&lt;br /&gt;
* holster&lt;br /&gt;
* reload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Hud lesson 10.jpg]]&lt;br /&gt;
&lt;br /&gt;
Берем с главной кости координаты и градус поворота худа, и вписываем их в конфиг.&lt;br /&gt;
&lt;br /&gt;
В разделе конфига '''wpn_..._hud''' редактируются также параметры точки вылета гильзы из оружия, а также партикла выстрела. Чтобы облегчить себе работу с этими параметрами, можно создать в 3DSMax вспомогательные кости и сразу получить их координаты при настройке HUD'а в Actor Editor. Если в логе при импорте или экспорте вашего творения есть какие-то ошибки – значит, вы что-то сделали не так.&lt;br /&gt;
&lt;br /&gt;
Рекомендую сразу не хвататься за сложный HUD, а просто сделать анимированное штурмового–наступательное оружие под названием &amp;quot;Кубик&amp;quot;. Удачи!&lt;br /&gt;
&lt;br /&gt;
===6. Исходники===&lt;br /&gt;
&lt;br /&gt;
Вариант 1 - модель рук привязана к скелету Biped http://www.sendspace.com/file/k9yihh/&lt;br /&gt;
&lt;br /&gt;
Вариант 2 - модель привязана к обычным костям http://www.sendspace.com/file/bsbht9/&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
'''Статья создана:''' [[Участник:Egorych|Egorych]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Благодарности:''' [[Участник:Haron|Haron]], [[Участник:tambovski|tambovski]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Редактировано:''' [[Участник:Alwen|Alwen]] 16.02.2008&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%91%D0%BC_HOM,_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D1%8B_%D0%B8_%D1%81%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0</id>
		<title>Создаём HOM, порталы и сектора</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%91%D0%BC_HOM,_%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D0%BB%D1%8B_%D0%B8_%D1%81%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0"/>
				<updated>2008-08-10T10:01:16Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория:Статьи участников]]&lt;br /&gt;
&lt;br /&gt;
Для работы нам понадобится X-Ray SDK.&lt;br /&gt;
&lt;br /&gt;
'''Для начала, зачем оно нужно:'''&lt;br /&gt;
&lt;br /&gt;
HOM - расшифровывается как Hierarchical Occlusion Mapping, или маппинг иерархических отсечений. Что это значит: упрощённо говоря, с помощью HOM, можно повысить производительность рендеринга сложных уровней на ~20%. &lt;br /&gt;
&lt;br /&gt;
'''Как работает HOM:''' Не вдаваясь в технические подробности, объясню упрощённо: то, что закрыто от игрока Occlusion'ом - процессор не обрабатывает, а видеокарта не рендерит - а значит, система экономит свои ресурсы, производительность при этом, естественно, возрастает.&lt;br /&gt;
&lt;br /&gt;
'''Секторы и порталы:''' про них - читаем [http://www.gamedev.ru/articles/?id=30131 здесь] - разъяснено очень просто и доступно. Могу лишь добавить, что в X-Ray 3D Engine, геометрия уровня в построении секторов не участвует, он использует для этого HOM-объекты.&lt;br /&gt;
&lt;br /&gt;
'''Вывод:''' Все эти заморочки позволяют практически двухкратно поднять производительность системы, и благодарные юзеры с не слишком сильными компами (а таких большинство), будут таскать вас на руках за такой шикарный подарок ;)&lt;br /&gt;
&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Важные моменты|&lt;br /&gt;
message = 1. Делать всё это, актуально для действительно сложных и мощных карт, так как не только поднимет скорость в итоге, &lt;br /&gt;
но и позволит напихать в карту, побольше всякой интересной геометрии.&lt;br /&gt;
&lt;br /&gt;
2. Изложенные выше принципы, актуальны не только для сталкера, но и для подавляющего большинства современных игр.&lt;br /&gt;
Например, лучше всего это всё дело с порталами и секторами продумано на играх на движке Sourse (Half-Life 2 и т. д.)&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Итак, приступаем к креативу!'''&lt;br /&gt;
&lt;br /&gt;
Допустим, есть у вас карта, на которой надо сделать всё вышеперечисленное. Как это сделать, я объясню на примере старого доброго кубика, сделаем ему HOM, поставим на карту, и создадим порталы с секторами.&lt;br /&gt;
&lt;br /&gt;
Начнём с HOM.&lt;br /&gt;
&lt;br /&gt;
Вот наша карта, на ней кубик, надо для него сделать HOM. &lt;br /&gt;
&lt;br /&gt;
[[Изображение:100.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать HOM, сбрасываем сцену, и идём в Библиотеку статической геометрии, находим там наш кубик. У меня он находится по адресу '''editor\shadertest_box''', вы можете заюзать свой.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:200.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Теперь, этот кубик, там же, в библиотеке, экспортим в формат LWO, чтобы стереть все настройки материалов, на базе экспортированного объекта мы и сделаем HOM, и материалы с шейдерами ему ни к чему: обозвал я его '''shadertest_box_occ''', (OCC - значит окклюдер, отсекатель).&lt;br /&gt;
&lt;br /&gt;
[[Изображение:300.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Всё, экспортировали. Теперь импортируем его обратно, заходим в настройки объекта, в поле '''Object Type''' (тип объекта), меняем его тип со '''Static''' на '''HOM''', выходим с настроек и сохраняем изменения. Тут же - видим, вид нашего кубика - изменился, теперь - он стал HOM-объектом.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:400.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Теперь - загружаем снова нашу карту, выбираем режим &amp;quot;объекты&amp;quot;, в самом низу, жмём кнопку &amp;quot;обновить список&amp;quot;, чтобы в нём появился новый объект, и добавляем наш окллюдер на карту, как обыкновенный объект.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:500.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Осталось только &amp;quot;подогнать&amp;quot; (двигая, вращая и т. д...) окклюдер под имеющийся кубик как можно точнее.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:600.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Всё! HOM-окклюдер для объекта успешно создан. Таким-же образом, можно (и нужно) поступить со всеми объектами на карте, но создавать окклюдеры лучше всего - ещё в '''3DSMax''', в виде неких &amp;quot;упрощённых муляжей&amp;quot; для создаваемых объектов. Хотя можно и так как я описал выше. &lt;br /&gt;
&lt;br /&gt;
Секторы и порталы необходимо генерировать ''после'' того, как сборка карты закончена, все объекты на месте, окклюдеры установлены, и т.д. Короче, перед самой прекомпиляцией. Делаются они очень просто, так как в SDK - возможности по ним весьма убогие, а многие так и вообще &amp;quot;временно отключены&amp;quot;. Но создавать их можно. &lt;br /&gt;
&lt;br /&gt;
Итак: &lt;br /&gt;
&lt;br /&gt;
Переходим в режим '''Секторы''' и создаём базовые порталы, нажав соответствующую кнопку. Если объектов много, целесообразно &amp;quot;проверить на правильность&amp;quot; одноимённой кнопкой. Сектора созданы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:700.JPG|400px]]&lt;br /&gt;
   &lt;br /&gt;
'''Переходим в режим &amp;quot;порталы&amp;quot;''' и &amp;quot;вычисляем все порталы&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:800.JPG|400px]] &lt;br /&gt;
&lt;br /&gt;
Всё. Occlusion Mapping - сделан, сектора созданы, а порталы к ним вычислены. Спасибо за внимание.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана: [[Участник:Haron|Haron]]&amp;lt;br&amp;gt;&lt;br /&gt;
Коррекция: [[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%81%D1%82%D1%8E%D0%BC%D0%BE%D0%B2</id>
		<title>Редактирование костюмов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D1%81%D1%82%D1%8E%D0%BC%D0%BE%D0%B2"/>
				<updated>2008-08-10T09:54:42Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Разбор параметров===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В этой статье мы рассмотрим значения параметров костюмов.&amp;lt;br&amp;gt;&lt;br /&gt;
Все параметры, не упомянутые ниже, изменять '''строго не рекомендуется'''!&lt;br /&gt;
&lt;br /&gt;
Итак, секции с параметрами находятся в файле:&amp;lt;br&amp;gt;&lt;br /&gt;
'''config\misc\outfit.ltx'''&lt;br /&gt;
&lt;br /&gt;
Разберем, например, параметры классического костюма сталкера.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[stalker_outfit]:outfit_base &lt;br /&gt;
&lt;br /&gt;
; название секции костюма. именно к нему игра будет обращаться. outfit_base - &lt;br /&gt;
базовая (наследуемая)  секция (изменять строго не рекомендуется).&lt;br /&gt;
&lt;br /&gt;
visual          = equipments\stalker_suit ; модель, используемая для сложенного костюма, &lt;br /&gt;
лежащего на земле.&lt;br /&gt;
&lt;br /&gt;
actor_visual	= actors\hero\stalker_hood.ogf ; модель, используемая для игрока, когда&lt;br /&gt;
на нем надет костюм.&lt;br /&gt;
&lt;br /&gt;
inv_name			= stalker_outfit_name ; название в инвентаре.&lt;br /&gt;
&lt;br /&gt;
inv_name_short		= stalker_outfit_name ; название в инвентаре (в принципе, можно&lt;br /&gt;
здесь продублировать значение предыдущего параметра - так чаще всего и делают).&lt;br /&gt;
&lt;br /&gt;
description			= stalker_outfit_description ; ссылка на текстовую строку&lt;br /&gt;
с описанием.&lt;br /&gt;
&lt;br /&gt;
inv_weight			= 5.0 ; вес.&lt;br /&gt;
&lt;br /&gt;
; далее идут параметры иконки в инвентаре (см. примечание 1).&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 2&lt;br /&gt;
inv_grid_height		= 3&lt;br /&gt;
inv_grid_x		= 6&lt;br /&gt;
inv_grid_y		= 15&lt;br /&gt;
&lt;br /&gt;
full_icon_name		= npc_icon_stalker_outfit ; название иконки.&lt;br /&gt;
&lt;br /&gt;
cost				= 15000 ; базовая цена (см. примечание 2).&lt;br /&gt;
&lt;br /&gt;
full_scale_icon		= 14,11			; иконка сталкера в костюме в полный &lt;br /&gt;
рост (отображается в инвентаре справа).&lt;br /&gt;
&lt;br /&gt;
nightvision_sect				= effector_nightvision_bad ; тип ПНВ&lt;br /&gt;
(&amp;quot;плохой&amp;quot; - зеленый, &amp;quot;хороший&amp;quot; - синий).&lt;br /&gt;
&lt;br /&gt;
; ниже идут параметры защиты владельца от различных типов воздействий, &lt;br /&gt;
обеспечиваемые костюмом.&lt;br /&gt;
&lt;br /&gt;
burn_protection 				= 0.5 ; защита от воздействия &lt;br /&gt;
огня (костры, аномалия &amp;quot;Жарка&amp;quot; и т.д.).&lt;br /&gt;
&lt;br /&gt;
strike_protection 				= 0.5 ; защита от ударов&lt;br /&gt;
(наносятся мутантами, например, псевдогигантом).&lt;br /&gt;
&lt;br /&gt;
shock_protection 				= 0.5 ; защита от поражения&lt;br /&gt;
электричеством.&lt;br /&gt;
&lt;br /&gt;
wound_protection				= 0.4 ; защита от ранений&lt;br /&gt;
(наносятся мутантами, например, собаками, кровососами и т.д.).&lt;br /&gt;
&lt;br /&gt;
radiation_protection 			= 0.5 ; защита от радиации.&lt;br /&gt;
&lt;br /&gt;
telepatic_protection 			= 0.0 ; защита от пси-воздействия&lt;br /&gt;
(например, присутствие контроллера серьезно влияет на psy_health).&lt;br /&gt;
&lt;br /&gt;
chemical_burn_protection 		= 0.5 ; защита от химического воздействия.&lt;br /&gt;
&lt;br /&gt;
explosion_protection 			= 0.3 ; защита от взрывов/осколков.&lt;br /&gt;
&lt;br /&gt;
fire_wound_protection  			= 0.3 ; защита от огнестрельного&lt;br /&gt;
оружия (наиболее важный параметр для большинства костюмов).&lt;br /&gt;
&lt;br /&gt;
power_loss = 0.87&lt;br /&gt;
bones_koeff_protection = gilet_antigas_damage&lt;br /&gt;
&lt;br /&gt;
[sect_stalker_outfit_immunities] ; коэффициенты иммунитета самого костюма, то &lt;br /&gt;
есть - то, насколько сильно он сам подвержен повреждениям от различных типов &lt;br /&gt;
воздействий. по значениям каждого типа - см. выше.&lt;br /&gt;
&lt;br /&gt;
burn_immunity				= 0.03&lt;br /&gt;
strike_immunity				= 0.01&lt;br /&gt;
shock_immunity				= 0.03&lt;br /&gt;
wound_immunity				= 0.015&lt;br /&gt;
radiation_immunity			= 0.00&lt;br /&gt;
telepatic_immunity			= 0.00&lt;br /&gt;
chemical_burn_immunity		= 0.03&lt;br /&gt;
explosion_immunity			= 0.03&lt;br /&gt;
fire_wound_immunity			= 0.01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примечания===&lt;br /&gt;
&lt;br /&gt;
1. Подробнее о работе с иконками и текстурами - см. [[Редактирование торговцев|здесь]].&amp;lt;br&amp;gt;&lt;br /&gt;
2. Подробнее о механизме работы цен - см. [[Изменение текстур|здесь]].&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Спавн через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2008-08-10T09:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Спавн NPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теория==&lt;br /&gt;
&lt;br /&gt;
В скриптах есть одна единственная функция, отвечающая за спавн объектов:&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(section,position,levelvertex,gamevertex)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Строго говоря, их две: create create_ammo но различия между ними не существенны. [[Участник:Imp|Imp]] 22:45, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый параметр - секция в конфигурациях, описывающая объект, например &amp;quot;bolt&amp;quot;,&amp;quot;med_kit&amp;quot; - это простые секции, простых объектов&lt;br /&gt;
а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.&lt;br /&gt;
&lt;br /&gt;
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z.&lt;br /&gt;
Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.&lt;br /&gt;
&lt;br /&gt;
Дальше сложнее, так как сам толком сформулировать не могу.&lt;br /&gt;
&lt;br /&gt;
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.&lt;br /&gt;
&lt;br /&gt;
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта.&lt;br /&gt;
Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()&lt;br /&gt;
&lt;br /&gt;
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины!&lt;br /&gt;
Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).&lt;br /&gt;
&lt;br /&gt;
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;db.actor:game_vertex()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак, чтобы, например, заспавнить болт под ногами актора, пишем: &lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;bolt&amp;quot;,db.actor():position(),1,db.actor:game_verte())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей.&lt;br /&gt;
(Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.)&lt;br /&gt;
А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах.&lt;br /&gt;
На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....&lt;br /&gt;
&lt;br /&gt;
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.&lt;br /&gt;
&lt;br /&gt;
Пример (спавним артефакт Медуза в инвентаре у актора):&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;af_medusa&amp;quot;, db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Серверный обьект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	local obj&lt;br /&gt;
	local a = vector() -- Задаем тип переменной&lt;br /&gt;
	local dir    = db.actor:direction()&lt;br /&gt;
&lt;br /&gt;
	a.x = -243.61	-- координата X&lt;br /&gt;
	a.y = -19.52	-- высота Y&lt;br /&gt;
	a.z = -127.17	-- координата Z&lt;br /&gt;
&lt;br /&gt;
	obj = alife():create(&amp;quot;bar_dolg_respawn_3&amp;quot;,a,13193,8,65535)&lt;br /&gt;
	alife():create_ammo(&amp;quot;ammo_9x18_fmj&amp;quot;,&lt;br /&gt;
		obj.position,&lt;br /&gt;
		obj.m_level_vertex_id,&lt;br /&gt;
		obj.m_game_vertex_id,&lt;br /&gt;
		obj.id,&lt;br /&gt;
		20) -- число патронов&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:&lt;br /&gt;
&amp;lt;pre&amp;gt;(alife():object(id))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.&lt;br /&gt;
&lt;br /&gt;
Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.&lt;br /&gt;
&lt;br /&gt;
В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.&lt;br /&gt;
&lt;br /&gt;
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!&lt;br /&gt;
&lt;br /&gt;
Если они совпадают, например так:&lt;br /&gt;
&amp;lt;pre&amp;gt;if obj:id()==saved_id then ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.&lt;br /&gt;
&lt;br /&gt;
Итак, мы поймали нашего киллера по ID.&lt;br /&gt;
&lt;br /&gt;
Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.&lt;br /&gt;
&lt;br /&gt;
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа &amp;quot;NPC&amp;quot;, а не с серверными объектами.&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 1)==&lt;br /&gt;
&lt;br /&gt;
'''1.''' Чтобы не повторяться в описании создания нового квеста, просто изучите [[Создание квестов (Fr3nzy)|статью по созданию квестов]] от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта. &lt;br /&gt;
&lt;br /&gt;
Небольшое отступление:&lt;br /&gt;
&lt;br /&gt;
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:&lt;br /&gt;
&lt;br /&gt;
* Невозможности совместить два мода, такой спавн использующих&lt;br /&gt;
* Необходимости каждый раз начинать новую игру&lt;br /&gt;
&lt;br /&gt;
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)&lt;br /&gt;
&lt;br /&gt;
Итак, определимся с квестом.&lt;br /&gt;
&lt;br /&gt;
'''Задача:''' после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться '''после''' прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым... я думаю, исход боя предрешен :)&lt;br /&gt;
&lt;br /&gt;
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :) &lt;br /&gt;
&lt;br /&gt;
В консоли введите команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rs_stats on или rs_stats 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым мы включаем вывод информации на экран. &lt;br /&gt;
Далее вводим еще одну команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;demo_record 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16. &lt;br /&gt;
&lt;br /&gt;
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Другой способ получения тех же сведений - прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function main_menu:main_cheat_f3()&lt;br /&gt;
	-- Выдадим сообщение о нашем местоположении&lt;br /&gt;
	local text&lt;br /&gt;
	local vid&lt;br /&gt;
	local gvid&lt;br /&gt;
	local a = vector() -- Тип переменной&lt;br /&gt;
	local text&lt;br /&gt;
&lt;br /&gt;
	a    = db.actor:position()        -- Наше положение в координатах&lt;br /&gt;
	vid  = db.actor:level_vertex_id() &lt;br /&gt;
	gvid = db.actor:game_vertex_id() &lt;br /&gt;
	text = &amp;quot;Позиция:\\nX= &amp;quot;..a.x..&amp;quot;\\nY= &amp;quot;..a.y..&amp;quot;\\nZ= &amp;quot;..a.z..&amp;quot;\\nlevel_vertex= &amp;quot;..vid..&amp;quot;\\ngame_vertex_id= &amp;quot;..gvid&lt;br /&gt;
	news_manager.send_tip(db.actor, text, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате не нужно эксперементировать мы сразу получаем все, в том числе и level_vertex и  game_vertex. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру,  без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).&lt;br /&gt;
&lt;br /&gt;
В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.&lt;br /&gt;
&lt;br /&gt;
В файлах игры присутствуют 5 моделей гражданских зомби:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вернем в игру их всех :)&lt;br /&gt;
&lt;br /&gt;
Уже имеются секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong. &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Два последних типа используют одну и ту же модель zombi_trup.ogf, хм... непорядок, исправляем. &lt;br /&gt;
Последняя секция выглядит теперь так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_immortal]:zombie_strong&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_immortal&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_trup_2&lt;br /&gt;
panic_threshold		= 0.05	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим пятую модель. &lt;br /&gt;
&lt;br /&gt;
Для этого в конце файла создадим секцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_ghost]:zombie_strong&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.&lt;br /&gt;
 &lt;br /&gt;
Пишем дальше:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$spawn				= &amp;quot;monsters\zombies\zombie_ghost&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_1_ghost&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script. &lt;br /&gt;
&lt;br /&gt;
Отступление третье:&lt;br /&gt;
&lt;br /&gt;
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)&lt;br /&gt;
&lt;br /&gt;
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее пишем функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function spawn_zombies( position, total )&lt;br /&gt;
	local zombie_index			-- тип зомби из массива zombie_types&lt;br /&gt;
	local new_pos, x_offset, z_offset	-- объявляем переменные 	&lt;br /&gt;
	for zombie_index=1, total do		-- крутим цикл столько раз, сколько &lt;br /&gt;
задает переменная total&lt;br /&gt;
		x_offset = math.random(5)	-- случайное (рандомное)  x от 1 до 5&lt;br /&gt;
		z_offset = math.random(5)	-- случайное (рандомное)  z от 1 до 5&lt;br /&gt;
		new_pos = position		-- передаем координаты в функцию&lt;br /&gt;
		new_pos.x = new_pos.x + x_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате x полученное выше рандомное x&lt;br /&gt;
		new_pos.z = new_pos.z + z_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате z полученное выше рандомное z&lt;br /&gt;
-- Ниже, собственно и вызывается функция спавна случайного типа зомби &lt;br /&gt;
zombie_types[math.random(5)] привязанного к нашим координатам&lt;br /&gt;
	alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И последнее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function zomby_story_1( actor, npc )&lt;br /&gt;
--	десять зомби на фабрике (Кордон)&lt;br /&gt;
	local spawn_point = vector():set( 115, -6, -16 )	-- здесь указываем координаты, &lt;br /&gt;
выбранные нами для спавна, когда «летали» камерой :)&lt;br /&gt;
	spawn_zombies( spawn_point, 10 )		-- собственно вызов предыдущей функции &lt;br /&gt;
с передачей ей координат и количества объектов&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Продолжаем разговор :) &lt;br /&gt;
&lt;br /&gt;
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование. &lt;br /&gt;
&lt;br /&gt;
Добавим в local killCountProps  к монстрам строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = 1, zombie_normal = 2, zombie_strong = 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В local sect_alias строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = &amp;quot;zombie_weak&amp;quot;, zombie_normal  = &amp;quot;zombie_normal&amp;quot;, zombie_strong = &amp;quot;zombie_strong&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
А ниже в monster_classes строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;			[clsid.zombie_s      ] = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
В функцию getNpcType(npc) добавляем конструкцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;		elseif npc:character_community() == &amp;quot;zombie&amp;quot; then&lt;br /&gt;
			community = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Expression    : fatal error&lt;br /&gt;
Function      : CInifile::r_string&lt;br /&gt;
File          : D:\xray-svn\xrCore\Xr_ini.cpp&lt;br /&gt;
Line          : 351&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find variable icon in [zombie_weak]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:&lt;br /&gt;
&lt;br /&gt;
* Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);&lt;br /&gt;
* Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)&lt;br /&gt;
&lt;br /&gt;
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр&lt;br /&gt;
&amp;lt;pre&amp;gt; icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Вылетов не будет.&lt;br /&gt;
&lt;br /&gt;
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример [[Создание диалогов (BAC9-FLCL)|статью по созданию диалогов]] от BAC9-FLCL.&lt;br /&gt;
&lt;br /&gt;
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;   &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
………&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_999&amp;lt;/text&amp;gt;&lt;br /&gt;
	          &amp;lt;next&amp;gt;7770&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9991&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9992&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9993&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9994&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9992&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9992&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99922&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;99922&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_99922&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9993&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9993&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99933&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9995&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9995&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3121&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3121&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3131&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3131&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;41&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_41&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Начало-------&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7770&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7770&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7771&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7771&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7771&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7772&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7773&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7772&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7772&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7777&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7773&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7773&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7779&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7779&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7779&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7777&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7777&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;esc_zombie.zombie_story_1&amp;lt;/action&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
          			 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Конец-------&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;51&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_51&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
……&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И также связанный с ним файл stable_dialogs_escape.xml.&lt;br /&gt;
В самом начале файла пишем следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7770&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Происшествий никаких не было?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7771&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да знаешь... Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне &lt;br /&gt;
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели какиих-то то ли &lt;br /&gt;
людей, то ли призраков... Мало ли что спьяну почудится - я и сказал этим паникерам, мол, &lt;br /&gt;
закусывать надо! Хех, блин, алкаши...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7772&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих &lt;br /&gt;
&amp;quot;людей-призраков&amp;quot;.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7773&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да я как-то не собирался в ту сторону...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7779&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ну, смотри сам, все равно будь осторожен.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7777&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;esc_bridge_soldiers_start_11&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Здесь проход воспрещён, сталкер.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Можно запускать игру, идти на Кордон, после разговороа с Сидоровичем, в зависимости &lt;br /&gt;
от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)&lt;br /&gt;
&lt;br /&gt;
 [http://www.sendspace.com/file/2kx7uf Готовые файлы примера](перезалито)&lt;br /&gt;
 [http://slil.ru/24600587 Spawn Lib]&lt;br /&gt;
Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)&lt;br /&gt;
&lt;br /&gt;
Продолжение следует…&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 2)==&lt;br /&gt;
&lt;br /&gt;
'''4.''' Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию,  добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы ''сами'' сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» :)  - серию квестов, связанную своим собственным сюжетом. &lt;br /&gt;
Итак, «домашнее задание» - добавляем в игру шестого зомби.&lt;br /&gt;
&lt;br /&gt;
* Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4... А где третий? Наверное, сбежал :)&lt;br /&gt;
&lt;br /&gt;
* Скопируем из папки с оригинальными файлами игры в созданную нами папку zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить :)&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-717-3 Файл модели '''до''' редактирования]&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-718-3 Файл модели '''после''' редактирования]&lt;br /&gt;
&lt;br /&gt;
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)&lt;br /&gt;
&lt;br /&gt;
'''5.''' Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_old]:zombie_normal&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_old&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в файле esc_zombie.script изменяем массив в первой строке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &lt;br /&gt;
&amp;quot;zombie_old&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В функции spawn_zombies изменяем строку спавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	alife():create(zombie_types[math.random(6)],new_pos,&lt;br /&gt;
db.actor:level_vertex_id(),db.actor:game_vertex_id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	spawn_zombies( spawn_point, 12 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё. Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''6.''' Копируем в папку gamedata\config\gameplay\  файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;!-------------------------------- Zombieg -----------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;article id=&amp;quot;mutant_zombieg_general&amp;quot; name=&amp;quot;Zombieg&amp;quot; group=&amp;quot;Mutants&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;texture&amp;gt;ui_npc_monster_zombieg&amp;lt;/texture&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;enc_mutant_zombieg_general&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/article&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;Zombie&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;Zombieg&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombieg_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-привидение отличается от обычного зомби лишь тем, что &lt;br /&gt;
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и &lt;br /&gt;
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombie_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Воздействие Выжигателя мозгов полностью разрушает структуру личности, &lt;br /&gt;
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела &lt;br /&gt;
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные, &lt;br /&gt;
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем &lt;br /&gt;
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя: &lt;br /&gt;
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально &lt;br /&gt;
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или, &lt;br /&gt;
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое &lt;br /&gt;
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры &lt;br /&gt;
стараются обходить эти неуклюжие опустошённые оболочки.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;zombie_normal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомбированный, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_strong&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_weak&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''7.''' И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по [[Изменение текстур (BAC9-FLCL)|изменению текстур]].&lt;br /&gt;
&lt;br /&gt;
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.&lt;br /&gt;
&lt;br /&gt;
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку &lt;br /&gt;
&amp;lt;pre&amp;gt;icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
На:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombie&amp;lt;/pre&amp;gt;&lt;br /&gt;
В секцию [zombie_ghost] добавьте строку:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombieg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняйте изменения. Всё. &lt;br /&gt;
&lt;br /&gt;
Вот [http://data.cod.ru/1290894794 готовые файлы примера].&lt;br /&gt;
Удачи и спасибо за внимание :)&lt;br /&gt;
&lt;br /&gt;
==Спавн NPC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Эта часть статьи написана [[Участник:Arhet|Arhet]] и создана на примере того, как в SRP Mod были созданы NPC группировки &amp;quot;Грех&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задействуем файлы:&lt;br /&gt;
&lt;br /&gt;
* gamedata\config\gameplay\character_desc_escape.xml&lt;br /&gt;
* gamedata\config\gameplay\npc_profile.ltx&lt;br /&gt;
* gamedata\config\creatures\spawn_sections.ltx&lt;br /&gt;
&lt;br /&gt;
Начнем с ''character_desc_escape.xml''. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.&lt;br /&gt;
&lt;br /&gt;
Тут создадим нового персонажа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;specific_character id=&amp;quot;esc_dark_stalker_1&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;GENERATE_NAME_bandit&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;icon&amp;gt;ui_npc_dark_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
&amp;lt;map_icon x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/map_icon&amp;gt;&lt;br /&gt;
&amp;lt;bio&amp;gt;sim_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt; - вот тут наш новый класс кстати.&lt;br /&gt;
&amp;lt;community&amp;gt;dark_stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
&amp;lt;money min=&amp;quot;200&amp;quot; max=&amp;quot;600&amp;quot; infinitive=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/money&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rank&amp;gt;198&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;lt;reputation&amp;gt;-24&amp;lt;/reputation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;visual&amp;gt;actors\dark_stalker\dark_stalker_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;snd_config&amp;gt;characters_voice\human_01\monolith\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
&amp;lt;panic_treshold&amp;gt;0&amp;lt;/panic_treshold&amp;gt;&lt;br /&gt;
&amp;lt;supplies&amp;gt;&lt;br /&gt;
[spawn] \n&lt;br /&gt;
wpn_dark_colt1911 \n&lt;br /&gt;
ammo_11.43x23_hydro \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_drugs.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_food.xml&amp;quot;&lt;br /&gt;
&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_3.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Впишем наш код после какого-нибудь &amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь идем в ''npc_profile.xml'' и туда вгоняем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;esc_dark_stalker_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_dark_stalker_1&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь надо заняться ''spawn_sections.ltx''. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:&lt;br /&gt;
&lt;br /&gt;
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..&lt;br /&gt;
* $spawn = &amp;quot;respawn\esc_dark_stalker_1&amp;quot;&lt;br /&gt;
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC&lt;br /&gt;
* spec_rank = regular – спец ранг&lt;br /&gt;
* community = dark_stalker – группировка.&lt;br /&gt;
&lt;br /&gt;
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.&lt;br /&gt;
&lt;br /&gt;
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):&amp;lt;br&amp;gt;&lt;br /&gt;
ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)&amp;lt;br&amp;gt;&lt;br /&gt;
ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:XStream|xStream]]&lt;br /&gt;
* [[Участник:RekLatS|OffBar]]&lt;br /&gt;
* [[Участник:Fr3nzy|Fr3nzy]]&lt;br /&gt;
* [[Участник:Imp|Imp]]&lt;br /&gt;
* [[Участник:Arhet|Arhet]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Спавн через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2008-08-10T09:50:25Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Спавн NPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теория==&lt;br /&gt;
&lt;br /&gt;
В скриптах есть одна единственная функция, отвечающая за спавн объектов:&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(section,position,levelvertex,gamevertex)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Строго говоря, их две: create create_ammo но различия между ними не существенны. [[Участник:Imp|Imp]] 22:45, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый параметр - секция в конфигурациях, описывающая объект, например &amp;quot;bolt&amp;quot;,&amp;quot;med_kit&amp;quot; - это простые секции, простых объектов&lt;br /&gt;
а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.&lt;br /&gt;
&lt;br /&gt;
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z.&lt;br /&gt;
Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.&lt;br /&gt;
&lt;br /&gt;
Дальше сложнее, так как сам толком сформулировать не могу.&lt;br /&gt;
&lt;br /&gt;
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.&lt;br /&gt;
&lt;br /&gt;
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта.&lt;br /&gt;
Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()&lt;br /&gt;
&lt;br /&gt;
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины!&lt;br /&gt;
Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).&lt;br /&gt;
&lt;br /&gt;
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;db.actor:game_vertex()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак, чтобы, например, заспавнить болт под ногами актора, пишем: &lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;bolt&amp;quot;,db.actor():position(),1,db.actor:game_verte())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей.&lt;br /&gt;
(Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.)&lt;br /&gt;
А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах.&lt;br /&gt;
На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....&lt;br /&gt;
&lt;br /&gt;
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.&lt;br /&gt;
&lt;br /&gt;
Пример (спавним артефакт Медуза в инвентаре у актора):&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;af_medusa&amp;quot;, db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Серверный обьект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	local obj&lt;br /&gt;
	local a = vector() -- Задаем тип переменной&lt;br /&gt;
	local dir    = db.actor:direction()&lt;br /&gt;
&lt;br /&gt;
	a.x = -243.61	-- координата X&lt;br /&gt;
	a.y = -19.52	-- высота Y&lt;br /&gt;
	a.z = -127.17	-- координата Z&lt;br /&gt;
&lt;br /&gt;
	obj = alife():create(&amp;quot;bar_dolg_respawn_3&amp;quot;,a,13193,8,65535)&lt;br /&gt;
	alife():create_ammo(&amp;quot;ammo_9x18_fmj&amp;quot;,&lt;br /&gt;
		obj.position,&lt;br /&gt;
		obj.m_level_vertex_id,&lt;br /&gt;
		obj.m_game_vertex_id,&lt;br /&gt;
		obj.id,&lt;br /&gt;
		20) -- число патронов&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:&lt;br /&gt;
&amp;lt;pre&amp;gt;(alife():object(id))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.&lt;br /&gt;
&lt;br /&gt;
Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.&lt;br /&gt;
&lt;br /&gt;
В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.&lt;br /&gt;
&lt;br /&gt;
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!&lt;br /&gt;
&lt;br /&gt;
Если они совпадают, например так:&lt;br /&gt;
&amp;lt;pre&amp;gt;if obj:id()==saved_id then ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.&lt;br /&gt;
&lt;br /&gt;
Итак, мы поймали нашего киллера по ID.&lt;br /&gt;
&lt;br /&gt;
Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.&lt;br /&gt;
&lt;br /&gt;
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа &amp;quot;NPC&amp;quot;, а не с серверными объектами.&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 1)==&lt;br /&gt;
&lt;br /&gt;
'''1.''' Чтобы не повторяться в описании создания нового квеста, просто изучите [[Создание квестов (Fr3nzy)|статью по созданию квестов]] от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта. &lt;br /&gt;
&lt;br /&gt;
Небольшое отступление:&lt;br /&gt;
&lt;br /&gt;
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:&lt;br /&gt;
&lt;br /&gt;
* Невозможности совместить два мода, такой спавн использующих&lt;br /&gt;
* Необходимости каждый раз начинать новую игру&lt;br /&gt;
&lt;br /&gt;
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)&lt;br /&gt;
&lt;br /&gt;
Итак, определимся с квестом.&lt;br /&gt;
&lt;br /&gt;
'''Задача:''' после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться '''после''' прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым... я думаю, исход боя предрешен :)&lt;br /&gt;
&lt;br /&gt;
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :) &lt;br /&gt;
&lt;br /&gt;
В консоли введите команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rs_stats on или rs_stats 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым мы включаем вывод информации на экран. &lt;br /&gt;
Далее вводим еще одну команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;demo_record 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16. &lt;br /&gt;
&lt;br /&gt;
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Другой способ получения тех же сведений - прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function main_menu:main_cheat_f3()&lt;br /&gt;
	-- Выдадим сообщение о нашем местоположении&lt;br /&gt;
	local text&lt;br /&gt;
	local vid&lt;br /&gt;
	local gvid&lt;br /&gt;
	local a = vector() -- Тип переменной&lt;br /&gt;
	local text&lt;br /&gt;
&lt;br /&gt;
	a    = db.actor:position()        -- Наше положение в координатах&lt;br /&gt;
	vid  = db.actor:level_vertex_id() &lt;br /&gt;
	gvid = db.actor:game_vertex_id() &lt;br /&gt;
	text = &amp;quot;Позиция:\\nX= &amp;quot;..a.x..&amp;quot;\\nY= &amp;quot;..a.y..&amp;quot;\\nZ= &amp;quot;..a.z..&amp;quot;\\nlevel_vertex= &amp;quot;..vid..&amp;quot;\\ngame_vertex_id= &amp;quot;..gvid&lt;br /&gt;
	news_manager.send_tip(db.actor, text, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате не нужно эксперементировать мы сразу получаем все, в том числе и level_vertex и  game_vertex. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру,  без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).&lt;br /&gt;
&lt;br /&gt;
В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.&lt;br /&gt;
&lt;br /&gt;
В файлах игры присутствуют 5 моделей гражданских зомби:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вернем в игру их всех :)&lt;br /&gt;
&lt;br /&gt;
Уже имеются секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong. &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Два последних типа используют одну и ту же модель zombi_trup.ogf, хм... непорядок, исправляем. &lt;br /&gt;
Последняя секция выглядит теперь так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_immortal]:zombie_strong&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_immortal&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_trup_2&lt;br /&gt;
panic_threshold		= 0.05	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим пятую модель. &lt;br /&gt;
&lt;br /&gt;
Для этого в конце файла создадим секцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_ghost]:zombie_strong&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.&lt;br /&gt;
 &lt;br /&gt;
Пишем дальше:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$spawn				= &amp;quot;monsters\zombies\zombie_ghost&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_1_ghost&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script. &lt;br /&gt;
&lt;br /&gt;
Отступление третье:&lt;br /&gt;
&lt;br /&gt;
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)&lt;br /&gt;
&lt;br /&gt;
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее пишем функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function spawn_zombies( position, total )&lt;br /&gt;
	local zombie_index			-- тип зомби из массива zombie_types&lt;br /&gt;
	local new_pos, x_offset, z_offset	-- объявляем переменные 	&lt;br /&gt;
	for zombie_index=1, total do		-- крутим цикл столько раз, сколько &lt;br /&gt;
задает переменная total&lt;br /&gt;
		x_offset = math.random(5)	-- случайное (рандомное)  x от 1 до 5&lt;br /&gt;
		z_offset = math.random(5)	-- случайное (рандомное)  z от 1 до 5&lt;br /&gt;
		new_pos = position		-- передаем координаты в функцию&lt;br /&gt;
		new_pos.x = new_pos.x + x_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате x полученное выше рандомное x&lt;br /&gt;
		new_pos.z = new_pos.z + z_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате z полученное выше рандомное z&lt;br /&gt;
-- Ниже, собственно и вызывается функция спавна случайного типа зомби &lt;br /&gt;
zombie_types[math.random(5)] привязанного к нашим координатам&lt;br /&gt;
	alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И последнее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function zomby_story_1( actor, npc )&lt;br /&gt;
--	десять зомби на фабрике (Кордон)&lt;br /&gt;
	local spawn_point = vector():set( 115, -6, -16 )	-- здесь указываем координаты, &lt;br /&gt;
выбранные нами для спавна, когда «летали» камерой :)&lt;br /&gt;
	spawn_zombies( spawn_point, 10 )		-- собственно вызов предыдущей функции &lt;br /&gt;
с передачей ей координат и количества объектов&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Продолжаем разговор :) &lt;br /&gt;
&lt;br /&gt;
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование. &lt;br /&gt;
&lt;br /&gt;
Добавим в local killCountProps  к монстрам строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = 1, zombie_normal = 2, zombie_strong = 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В local sect_alias строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = &amp;quot;zombie_weak&amp;quot;, zombie_normal  = &amp;quot;zombie_normal&amp;quot;, zombie_strong = &amp;quot;zombie_strong&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
А ниже в monster_classes строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;			[clsid.zombie_s      ] = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
В функцию getNpcType(npc) добавляем конструкцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;		elseif npc:character_community() == &amp;quot;zombie&amp;quot; then&lt;br /&gt;
			community = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Expression    : fatal error&lt;br /&gt;
Function      : CInifile::r_string&lt;br /&gt;
File          : D:\xray-svn\xrCore\Xr_ini.cpp&lt;br /&gt;
Line          : 351&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find variable icon in [zombie_weak]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:&lt;br /&gt;
&lt;br /&gt;
* Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);&lt;br /&gt;
* Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)&lt;br /&gt;
&lt;br /&gt;
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр&lt;br /&gt;
&amp;lt;pre&amp;gt; icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Вылетов не будет.&lt;br /&gt;
&lt;br /&gt;
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример [[Создание диалогов (BAC9-FLCL)|статью по созданию диалогов]] от BAC9-FLCL.&lt;br /&gt;
&lt;br /&gt;
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;   &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
………&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_999&amp;lt;/text&amp;gt;&lt;br /&gt;
	          &amp;lt;next&amp;gt;7770&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9991&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9992&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9993&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9994&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9992&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9992&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99922&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;99922&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_99922&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9993&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9993&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99933&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9995&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9995&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3121&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3121&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3131&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3131&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;41&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_41&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Начало-------&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7770&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7770&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7771&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7771&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7771&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7772&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7773&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7772&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7772&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7777&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7773&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7773&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7779&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7779&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7779&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7777&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7777&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;esc_zombie.zombie_story_1&amp;lt;/action&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
          			 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Конец-------&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;51&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_51&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
……&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И также связанный с ним файл stable_dialogs_escape.xml.&lt;br /&gt;
В самом начале файла пишем следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7770&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Происшествий никаких не было?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7771&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да знаешь... Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне &lt;br /&gt;
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели какиих-то то ли &lt;br /&gt;
людей, то ли призраков... Мало ли что спьяну почудится - я и сказал этим паникерам, мол, &lt;br /&gt;
закусывать надо! Хех, блин, алкаши...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7772&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих &lt;br /&gt;
&amp;quot;людей-призраков&amp;quot;.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7773&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да я как-то не собирался в ту сторону...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7779&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ну, смотри сам, все равно будь осторожен.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7777&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;esc_bridge_soldiers_start_11&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Здесь проход воспрещён, сталкер.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Можно запускать игру, идти на Кордон, после разговороа с Сидоровичем, в зависимости &lt;br /&gt;
от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)&lt;br /&gt;
&lt;br /&gt;
 [http://www.sendspace.com/file/2kx7uf Готовые файлы примера](перезалито)&lt;br /&gt;
 [http://slil.ru/24600587 Spawn Lib]&lt;br /&gt;
Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)&lt;br /&gt;
&lt;br /&gt;
Продолжение следует…&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 2)==&lt;br /&gt;
&lt;br /&gt;
'''4.''' Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию,  добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы ''сами'' сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» :)  - серию квестов, связанную своим собственным сюжетом. &lt;br /&gt;
Итак, «домашнее задание» - добавляем в игру шестого зомби.&lt;br /&gt;
&lt;br /&gt;
* Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4... А где третий? Наверное, сбежал :)&lt;br /&gt;
&lt;br /&gt;
* Скопируем из папки с оригинальными файлами игры в созданную нами папку zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить :)&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-717-3 Файл модели '''до''' редактирования]&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-718-3 Файл модели '''после''' редактирования]&lt;br /&gt;
&lt;br /&gt;
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)&lt;br /&gt;
&lt;br /&gt;
'''5.''' Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_old]:zombie_normal&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_old&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в файле esc_zombie.script изменяем массив в первой строке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &lt;br /&gt;
&amp;quot;zombie_old&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В функции spawn_zombies изменяем строку спавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	alife():create(zombie_types[math.random(6)],new_pos,&lt;br /&gt;
db.actor:level_vertex_id(),db.actor:game_vertex_id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	spawn_zombies( spawn_point, 12 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё. Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''6.''' Копируем в папку gamedata\config\gameplay\  файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;!-------------------------------- Zombieg -----------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;article id=&amp;quot;mutant_zombieg_general&amp;quot; name=&amp;quot;Zombieg&amp;quot; group=&amp;quot;Mutants&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;texture&amp;gt;ui_npc_monster_zombieg&amp;lt;/texture&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;enc_mutant_zombieg_general&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/article&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;Zombie&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;Zombieg&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombieg_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-привидение отличается от обычного зомби лишь тем, что &lt;br /&gt;
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и &lt;br /&gt;
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombie_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Воздействие Выжигателя мозгов полностью разрушает структуру личности, &lt;br /&gt;
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела &lt;br /&gt;
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные, &lt;br /&gt;
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем &lt;br /&gt;
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя: &lt;br /&gt;
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально &lt;br /&gt;
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или, &lt;br /&gt;
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое &lt;br /&gt;
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры &lt;br /&gt;
стараются обходить эти неуклюжие опустошённые оболочки.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;zombie_normal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомбированный, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_strong&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_weak&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''7.''' И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по [[Изменение текстур (BAC9-FLCL)|изменению текстур]].&lt;br /&gt;
&lt;br /&gt;
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.&lt;br /&gt;
&lt;br /&gt;
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку &lt;br /&gt;
&amp;lt;pre&amp;gt;icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
На:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombie&amp;lt;/pre&amp;gt;&lt;br /&gt;
В секцию [zombie_ghost] добавьте строку:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombieg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняйте изменения. Всё. &lt;br /&gt;
&lt;br /&gt;
Вот [http://data.cod.ru/1290894794 готовые файлы примера].&lt;br /&gt;
Удачи и спасибо за внимание :)&lt;br /&gt;
&lt;br /&gt;
==Спавн NPC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Эта часть статьи написана [[Участник:Arhet|Arhet]] и создана на примере того, как в SRP Mod были созданы NPC группировки &amp;quot;Грех&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задействуем файлы:&lt;br /&gt;
&lt;br /&gt;
* gamedata\config\gameplay\character_desc_escape.xml&lt;br /&gt;
* gamedata\config\gameplay\npc_profile.ltx&lt;br /&gt;
* gamedata\config\creatures\spawn_sections.ltx&lt;br /&gt;
&lt;br /&gt;
Начнем с ''character_desc_escape.xml''. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.&lt;br /&gt;
&lt;br /&gt;
Тут создадим нового персонажа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;specific_character id=&amp;quot;esc_dark_stalker_1&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;GENERATE_NAME_bandit&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;icon&amp;gt;ui_npc_dark_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
&amp;lt;map_icon x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/map_icon&amp;gt;&lt;br /&gt;
&amp;lt;bio&amp;gt;sim_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt; - вот тут наш новый класс кстати.&lt;br /&gt;
&amp;lt;community&amp;gt;dark_stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
&amp;lt;money min=&amp;quot;200&amp;quot; max=&amp;quot;600&amp;quot; infinitive=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/money&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rank&amp;gt;198&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;lt;reputation&amp;gt;-24&amp;lt;/reputation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;visual&amp;gt;actors\dark_stalker\dark_stalker_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;snd_config&amp;gt;characters_voice\human_01\monolith\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
&amp;lt;panic_treshold&amp;gt;0&amp;lt;/panic_treshold&amp;gt;&lt;br /&gt;
&amp;lt;supplies&amp;gt;&lt;br /&gt;
[spawn] \n&lt;br /&gt;
wpn_dark_colt1911 \n&lt;br /&gt;
ammo_11.43x23_hydro \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_drugs.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_food.xml&amp;quot;&lt;br /&gt;
&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_3.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Впишем наш код после какого-нибудь &amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь идем в ''npc_profile.xml'' и туда вгоняем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;esc_dark_stalker_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_dark_stalker_1&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь надо заняться ''spawn_sections.ltx''. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:&lt;br /&gt;
&lt;br /&gt;
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..&lt;br /&gt;
* $spawn = &amp;quot;respawn\esc_dark_stalker_1&amp;quot;&lt;br /&gt;
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC&lt;br /&gt;
* spec_rank = regular – спец ранг&lt;br /&gt;
* community = dark_stalker – группировка.&lt;br /&gt;
&lt;br /&gt;
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.&lt;br /&gt;
&lt;br /&gt;
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):&amp;lt;br&amp;gt;&lt;br /&gt;
+	&amp;lt;br&amp;gt;&lt;br /&gt;
+	ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)&amp;lt;br&amp;gt;&lt;br /&gt;
+	&amp;lt;br&amp;gt;&lt;br /&gt;
+	ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:XStream|xStream]]&lt;br /&gt;
* [[Участник:RekLatS|OffBar]]&lt;br /&gt;
* [[Участник:Fr3nzy|Fr3nzy]]&lt;br /&gt;
* [[Участник:Imp|Imp]]&lt;br /&gt;
* [[Участник:Arhet|Arhet]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Спавн через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2008-08-10T09:49:51Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Спавн NPC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теория==&lt;br /&gt;
&lt;br /&gt;
В скриптах есть одна единственная функция, отвечающая за спавн объектов:&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(section,position,levelvertex,gamevertex)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Строго говоря, их две: create create_ammo но различия между ними не существенны. [[Участник:Imp|Imp]] 22:45, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый параметр - секция в конфигурациях, описывающая объект, например &amp;quot;bolt&amp;quot;,&amp;quot;med_kit&amp;quot; - это простые секции, простых объектов&lt;br /&gt;
а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.&lt;br /&gt;
&lt;br /&gt;
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z.&lt;br /&gt;
Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.&lt;br /&gt;
&lt;br /&gt;
Дальше сложнее, так как сам толком сформулировать не могу.&lt;br /&gt;
&lt;br /&gt;
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.&lt;br /&gt;
&lt;br /&gt;
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта.&lt;br /&gt;
Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()&lt;br /&gt;
&lt;br /&gt;
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины!&lt;br /&gt;
Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).&lt;br /&gt;
&lt;br /&gt;
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;db.actor:game_vertex()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак, чтобы, например, заспавнить болт под ногами актора, пишем: &lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;bolt&amp;quot;,db.actor():position(),1,db.actor:game_verte())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей.&lt;br /&gt;
(Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.)&lt;br /&gt;
А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах.&lt;br /&gt;
На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....&lt;br /&gt;
&lt;br /&gt;
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.&lt;br /&gt;
&lt;br /&gt;
Пример (спавним артефакт Медуза в инвентаре у актора):&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;af_medusa&amp;quot;, db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Серверный обьект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	local obj&lt;br /&gt;
	local a = vector() -- Задаем тип переменной&lt;br /&gt;
	local dir    = db.actor:direction()&lt;br /&gt;
&lt;br /&gt;
	a.x = -243.61	-- координата X&lt;br /&gt;
	a.y = -19.52	-- высота Y&lt;br /&gt;
	a.z = -127.17	-- координата Z&lt;br /&gt;
&lt;br /&gt;
	obj = alife():create(&amp;quot;bar_dolg_respawn_3&amp;quot;,a,13193,8,65535)&lt;br /&gt;
	alife():create_ammo(&amp;quot;ammo_9x18_fmj&amp;quot;,&lt;br /&gt;
		obj.position,&lt;br /&gt;
		obj.m_level_vertex_id,&lt;br /&gt;
		obj.m_game_vertex_id,&lt;br /&gt;
		obj.id,&lt;br /&gt;
		20) -- число патронов&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:&lt;br /&gt;
&amp;lt;pre&amp;gt;(alife():object(id))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.&lt;br /&gt;
&lt;br /&gt;
Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.&lt;br /&gt;
&lt;br /&gt;
В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.&lt;br /&gt;
&lt;br /&gt;
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!&lt;br /&gt;
&lt;br /&gt;
Если они совпадают, например так:&lt;br /&gt;
&amp;lt;pre&amp;gt;if obj:id()==saved_id then ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.&lt;br /&gt;
&lt;br /&gt;
Итак, мы поймали нашего киллера по ID.&lt;br /&gt;
&lt;br /&gt;
Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.&lt;br /&gt;
&lt;br /&gt;
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа &amp;quot;NPC&amp;quot;, а не с серверными объектами.&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 1)==&lt;br /&gt;
&lt;br /&gt;
'''1.''' Чтобы не повторяться в описании создания нового квеста, просто изучите [[Создание квестов (Fr3nzy)|статью по созданию квестов]] от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта. &lt;br /&gt;
&lt;br /&gt;
Небольшое отступление:&lt;br /&gt;
&lt;br /&gt;
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:&lt;br /&gt;
&lt;br /&gt;
* Невозможности совместить два мода, такой спавн использующих&lt;br /&gt;
* Необходимости каждый раз начинать новую игру&lt;br /&gt;
&lt;br /&gt;
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)&lt;br /&gt;
&lt;br /&gt;
Итак, определимся с квестом.&lt;br /&gt;
&lt;br /&gt;
'''Задача:''' после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться '''после''' прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым... я думаю, исход боя предрешен :)&lt;br /&gt;
&lt;br /&gt;
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :) &lt;br /&gt;
&lt;br /&gt;
В консоли введите команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rs_stats on или rs_stats 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым мы включаем вывод информации на экран. &lt;br /&gt;
Далее вводим еще одну команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;demo_record 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16. &lt;br /&gt;
&lt;br /&gt;
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Другой способ получения тех же сведений - прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function main_menu:main_cheat_f3()&lt;br /&gt;
	-- Выдадим сообщение о нашем местоположении&lt;br /&gt;
	local text&lt;br /&gt;
	local vid&lt;br /&gt;
	local gvid&lt;br /&gt;
	local a = vector() -- Тип переменной&lt;br /&gt;
	local text&lt;br /&gt;
&lt;br /&gt;
	a    = db.actor:position()        -- Наше положение в координатах&lt;br /&gt;
	vid  = db.actor:level_vertex_id() &lt;br /&gt;
	gvid = db.actor:game_vertex_id() &lt;br /&gt;
	text = &amp;quot;Позиция:\\nX= &amp;quot;..a.x..&amp;quot;\\nY= &amp;quot;..a.y..&amp;quot;\\nZ= &amp;quot;..a.z..&amp;quot;\\nlevel_vertex= &amp;quot;..vid..&amp;quot;\\ngame_vertex_id= &amp;quot;..gvid&lt;br /&gt;
	news_manager.send_tip(db.actor, text, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате не нужно эксперементировать мы сразу получаем все, в том числе и level_vertex и  game_vertex. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру,  без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).&lt;br /&gt;
&lt;br /&gt;
В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.&lt;br /&gt;
&lt;br /&gt;
В файлах игры присутствуют 5 моделей гражданских зомби:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вернем в игру их всех :)&lt;br /&gt;
&lt;br /&gt;
Уже имеются секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong. &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Два последних типа используют одну и ту же модель zombi_trup.ogf, хм... непорядок, исправляем. &lt;br /&gt;
Последняя секция выглядит теперь так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_immortal]:zombie_strong&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_immortal&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_trup_2&lt;br /&gt;
panic_threshold		= 0.05	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим пятую модель. &lt;br /&gt;
&lt;br /&gt;
Для этого в конце файла создадим секцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_ghost]:zombie_strong&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.&lt;br /&gt;
 &lt;br /&gt;
Пишем дальше:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$spawn				= &amp;quot;monsters\zombies\zombie_ghost&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_1_ghost&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script. &lt;br /&gt;
&lt;br /&gt;
Отступление третье:&lt;br /&gt;
&lt;br /&gt;
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)&lt;br /&gt;
&lt;br /&gt;
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее пишем функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function spawn_zombies( position, total )&lt;br /&gt;
	local zombie_index			-- тип зомби из массива zombie_types&lt;br /&gt;
	local new_pos, x_offset, z_offset	-- объявляем переменные 	&lt;br /&gt;
	for zombie_index=1, total do		-- крутим цикл столько раз, сколько &lt;br /&gt;
задает переменная total&lt;br /&gt;
		x_offset = math.random(5)	-- случайное (рандомное)  x от 1 до 5&lt;br /&gt;
		z_offset = math.random(5)	-- случайное (рандомное)  z от 1 до 5&lt;br /&gt;
		new_pos = position		-- передаем координаты в функцию&lt;br /&gt;
		new_pos.x = new_pos.x + x_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате x полученное выше рандомное x&lt;br /&gt;
		new_pos.z = new_pos.z + z_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате z полученное выше рандомное z&lt;br /&gt;
-- Ниже, собственно и вызывается функция спавна случайного типа зомби &lt;br /&gt;
zombie_types[math.random(5)] привязанного к нашим координатам&lt;br /&gt;
	alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И последнее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function zomby_story_1( actor, npc )&lt;br /&gt;
--	десять зомби на фабрике (Кордон)&lt;br /&gt;
	local spawn_point = vector():set( 115, -6, -16 )	-- здесь указываем координаты, &lt;br /&gt;
выбранные нами для спавна, когда «летали» камерой :)&lt;br /&gt;
	spawn_zombies( spawn_point, 10 )		-- собственно вызов предыдущей функции &lt;br /&gt;
с передачей ей координат и количества объектов&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Продолжаем разговор :) &lt;br /&gt;
&lt;br /&gt;
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование. &lt;br /&gt;
&lt;br /&gt;
Добавим в local killCountProps  к монстрам строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = 1, zombie_normal = 2, zombie_strong = 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В local sect_alias строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = &amp;quot;zombie_weak&amp;quot;, zombie_normal  = &amp;quot;zombie_normal&amp;quot;, zombie_strong = &amp;quot;zombie_strong&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
А ниже в monster_classes строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;			[clsid.zombie_s      ] = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
В функцию getNpcType(npc) добавляем конструкцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;		elseif npc:character_community() == &amp;quot;zombie&amp;quot; then&lt;br /&gt;
			community = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Expression    : fatal error&lt;br /&gt;
Function      : CInifile::r_string&lt;br /&gt;
File          : D:\xray-svn\xrCore\Xr_ini.cpp&lt;br /&gt;
Line          : 351&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find variable icon in [zombie_weak]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:&lt;br /&gt;
&lt;br /&gt;
* Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);&lt;br /&gt;
* Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)&lt;br /&gt;
&lt;br /&gt;
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр&lt;br /&gt;
&amp;lt;pre&amp;gt; icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Вылетов не будет.&lt;br /&gt;
&lt;br /&gt;
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример [[Создание диалогов (BAC9-FLCL)|статью по созданию диалогов]] от BAC9-FLCL.&lt;br /&gt;
&lt;br /&gt;
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;   &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
………&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_999&amp;lt;/text&amp;gt;&lt;br /&gt;
	          &amp;lt;next&amp;gt;7770&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9991&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9992&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9993&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9994&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9992&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9992&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99922&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;99922&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_99922&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9993&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9993&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99933&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9995&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9995&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3121&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3121&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3131&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3131&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;41&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_41&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Начало-------&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7770&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7770&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7771&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7771&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7771&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7772&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7773&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7772&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7772&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7777&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7773&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7773&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7779&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7779&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7779&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7777&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7777&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;esc_zombie.zombie_story_1&amp;lt;/action&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
          			 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Конец-------&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;51&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_51&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
……&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И также связанный с ним файл stable_dialogs_escape.xml.&lt;br /&gt;
В самом начале файла пишем следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7770&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Происшествий никаких не было?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7771&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да знаешь... Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне &lt;br /&gt;
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели какиих-то то ли &lt;br /&gt;
людей, то ли призраков... Мало ли что спьяну почудится - я и сказал этим паникерам, мол, &lt;br /&gt;
закусывать надо! Хех, блин, алкаши...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7772&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих &lt;br /&gt;
&amp;quot;людей-призраков&amp;quot;.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7773&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да я как-то не собирался в ту сторону...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7779&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ну, смотри сам, все равно будь осторожен.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7777&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;esc_bridge_soldiers_start_11&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Здесь проход воспрещён, сталкер.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Можно запускать игру, идти на Кордон, после разговороа с Сидоровичем, в зависимости &lt;br /&gt;
от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)&lt;br /&gt;
&lt;br /&gt;
 [http://www.sendspace.com/file/2kx7uf Готовые файлы примера](перезалито)&lt;br /&gt;
 [http://slil.ru/24600587 Spawn Lib]&lt;br /&gt;
Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)&lt;br /&gt;
&lt;br /&gt;
Продолжение следует…&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 2)==&lt;br /&gt;
&lt;br /&gt;
'''4.''' Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию,  добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы ''сами'' сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» :)  - серию квестов, связанную своим собственным сюжетом. &lt;br /&gt;
Итак, «домашнее задание» - добавляем в игру шестого зомби.&lt;br /&gt;
&lt;br /&gt;
* Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4... А где третий? Наверное, сбежал :)&lt;br /&gt;
&lt;br /&gt;
* Скопируем из папки с оригинальными файлами игры в созданную нами папку zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить :)&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-717-3 Файл модели '''до''' редактирования]&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-718-3 Файл модели '''после''' редактирования]&lt;br /&gt;
&lt;br /&gt;
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)&lt;br /&gt;
&lt;br /&gt;
'''5.''' Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_old]:zombie_normal&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_old&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в файле esc_zombie.script изменяем массив в первой строке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &lt;br /&gt;
&amp;quot;zombie_old&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В функции spawn_zombies изменяем строку спавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	alife():create(zombie_types[math.random(6)],new_pos,&lt;br /&gt;
db.actor:level_vertex_id(),db.actor:game_vertex_id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	spawn_zombies( spawn_point, 12 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё. Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''6.''' Копируем в папку gamedata\config\gameplay\  файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;!-------------------------------- Zombieg -----------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;article id=&amp;quot;mutant_zombieg_general&amp;quot; name=&amp;quot;Zombieg&amp;quot; group=&amp;quot;Mutants&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;texture&amp;gt;ui_npc_monster_zombieg&amp;lt;/texture&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;enc_mutant_zombieg_general&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/article&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;Zombie&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;Zombieg&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombieg_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-привидение отличается от обычного зомби лишь тем, что &lt;br /&gt;
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и &lt;br /&gt;
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombie_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Воздействие Выжигателя мозгов полностью разрушает структуру личности, &lt;br /&gt;
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела &lt;br /&gt;
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные, &lt;br /&gt;
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем &lt;br /&gt;
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя: &lt;br /&gt;
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально &lt;br /&gt;
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или, &lt;br /&gt;
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое &lt;br /&gt;
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры &lt;br /&gt;
стараются обходить эти неуклюжие опустошённые оболочки.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;zombie_normal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомбированный, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_strong&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_weak&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''7.''' И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по [[Изменение текстур (BAC9-FLCL)|изменению текстур]].&lt;br /&gt;
&lt;br /&gt;
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.&lt;br /&gt;
&lt;br /&gt;
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку &lt;br /&gt;
&amp;lt;pre&amp;gt;icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
На:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombie&amp;lt;/pre&amp;gt;&lt;br /&gt;
В секцию [zombie_ghost] добавьте строку:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombieg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняйте изменения. Всё. &lt;br /&gt;
&lt;br /&gt;
Вот [http://data.cod.ru/1290894794 готовые файлы примера].&lt;br /&gt;
Удачи и спасибо за внимание :)&lt;br /&gt;
&lt;br /&gt;
==Спавн NPC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Эта часть статьи написана [[Участник:Arhet|Arhet]] и создана на примере того, как в SRP Mod были созданы NPC группировки &amp;quot;Грех&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задействуем файлы:&lt;br /&gt;
&lt;br /&gt;
* gamedata\config\gameplay\character_desc_escape.xml&lt;br /&gt;
* gamedata\config\gameplay\npc_profile.ltx&lt;br /&gt;
* gamedata\config\creatures\spawn_sections.ltx&lt;br /&gt;
&lt;br /&gt;
Начнем с ''character_desc_escape.xml''. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.&lt;br /&gt;
&lt;br /&gt;
Тут создадим нового персонажа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;specific_character id=&amp;quot;esc_dark_stalker_1&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;GENERATE_NAME_bandit&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;icon&amp;gt;ui_npc_dark_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
&amp;lt;map_icon x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/map_icon&amp;gt;&lt;br /&gt;
&amp;lt;bio&amp;gt;sim_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt; - вот тут наш новый класс кстати.&lt;br /&gt;
&amp;lt;community&amp;gt;dark_stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
&amp;lt;money min=&amp;quot;200&amp;quot; max=&amp;quot;600&amp;quot; infinitive=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/money&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rank&amp;gt;198&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;lt;reputation&amp;gt;-24&amp;lt;/reputation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;visual&amp;gt;actors\dark_stalker\dark_stalker_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;snd_config&amp;gt;characters_voice\human_01\monolith\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
&amp;lt;panic_treshold&amp;gt;0&amp;lt;/panic_treshold&amp;gt;&lt;br /&gt;
&amp;lt;supplies&amp;gt;&lt;br /&gt;
[spawn] \n&lt;br /&gt;
wpn_dark_colt1911 \n&lt;br /&gt;
ammo_11.43x23_hydro \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_drugs.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_food.xml&amp;quot;&lt;br /&gt;
&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_3.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Впишем наш код после какого-нибудь &amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь идем в ''npc_profile.xml'' и туда вгоняем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;esc_dark_stalker_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_dark_stalker_1&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь надо заняться ''spawn_sections.ltx''. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:&lt;br /&gt;
&lt;br /&gt;
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..&lt;br /&gt;
* $spawn = &amp;quot;respawn\esc_dark_stalker_1&amp;quot;&lt;br /&gt;
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC&lt;br /&gt;
* spec_rank = regular – спец ранг&lt;br /&gt;
* community = dark_stalker – группировка.&lt;br /&gt;
&lt;br /&gt;
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.&lt;br /&gt;
&lt;br /&gt;
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):&lt;br /&gt;
+	&lt;br /&gt;
+	ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)&lt;br /&gt;
+	&lt;br /&gt;
+	ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:XStream|xStream]]&lt;br /&gt;
* [[Участник:RekLatS|OffBar]]&lt;br /&gt;
* [[Участник:Fr3nzy|Fr3nzy]]&lt;br /&gt;
* [[Участник:Imp|Imp]]&lt;br /&gt;
* [[Участник:Arhet|Arhet]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>Спавн через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2008-08-10T09:49:16Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теория==&lt;br /&gt;
&lt;br /&gt;
В скриптах есть одна единственная функция, отвечающая за спавн объектов:&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(section,position,levelvertex,gamevertex)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Строго говоря, их две: create create_ammo но различия между ними не существенны. [[Участник:Imp|Imp]] 22:45, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый параметр - секция в конфигурациях, описывающая объект, например &amp;quot;bolt&amp;quot;,&amp;quot;med_kit&amp;quot; - это простые секции, простых объектов&lt;br /&gt;
а есть объекты, которые переходят в онлайн/оффлайн, это неписи, монстры и так далее, например mil_killer_respawn_2 - спавнится снайпер группировки киллеров.&lt;br /&gt;
&lt;br /&gt;
С позицией, думаю объяснять не надо, только существует нюанс - высота это Y, а не Z.&lt;br /&gt;
Задать позицию можно такой конструкцией vector():set(x,y,z), где x, y и z - координаты точки на уровне, где спавним объект.&lt;br /&gt;
&lt;br /&gt;
Дальше сложнее, так как сам толком сформулировать не могу.&lt;br /&gt;
&lt;br /&gt;
Начнем от простого к сложному. На каждом уровне много объектов, все объекты состоят из полигонов, у каждого полигона есть вершины – вертексы.&lt;br /&gt;
&lt;br /&gt;
Именно они и должны здесь указываться, зачем - не особо понимаю, скорее всего для точного позиционирования объекта.&lt;br /&gt;
Например, можно получить вертекс ближайший к актору - db.actor:level_vertex()&lt;br /&gt;
&lt;br /&gt;
Дальше идет гораздо более интересный параметр game_vertex, это почти то же самое, что и level_vertex, но (!) это глобальные величины!&lt;br /&gt;
Если level_vertex считается для уровня, то game_vertex - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).&lt;br /&gt;
&lt;br /&gt;
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex в четвертом параметре&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;db.actor:game_vertex()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак, чтобы, например, заспавнить болт под ногами актора, пишем: &lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;bolt&amp;quot;,db.actor():position(),1,db.actor:game_verte())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почему 1, а не level_vertex? Проверено - разницы особой нет, какой level_vertex, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей.&lt;br /&gt;
(Игнорирование level_vertex может приводить к проваливанию произведенных предметов/персонажей под землю.)&lt;br /&gt;
А вот game_vertex решает все - он указывает на каком уровне спавнить предмет, поэтому его надо указывать. Теоретически можно просто найти для каждого уровня по одному game_vertex'у и использовать их в скриптах.&lt;br /&gt;
На самом деле game_vertex показывает какой фрагмент карты используется (вся карта разбита на кусочки имеющие сквозную нумерацию по всем уровням и game_vertex выбирает нужный) соответсвенно неправильное использование черевато....&lt;br /&gt;
&lt;br /&gt;
Кроме того - есть еще один параметр - ID объекта, если указать ID NPC или актора - то предмет заспавнится у него в инвентаре.&lt;br /&gt;
&lt;br /&gt;
Пример (спавним артефакт Медуза в инвентаре у актора):&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():create(&amp;quot;af_medusa&amp;quot;, db.actor():position(), 1, db.actor:game_vertex(), db.actor:id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция спавна возвращает серверный объект, то есть ни NPC, ни монстра ни что-либо еще.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Серверный обьект позволяет свеже созданного NPC или тайник затарить разными рулезами/артефактами. Например, вот так создадим перед входом к Сидоровичу долговца и засунем в него пачку патронов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	local obj&lt;br /&gt;
	local a = vector() -- Задаем тип переменной&lt;br /&gt;
	local dir    = db.actor:direction()&lt;br /&gt;
&lt;br /&gt;
	a.x = -243.61	-- координата X&lt;br /&gt;
	a.y = -19.52	-- высота Y&lt;br /&gt;
	a.z = -127.17	-- координата Z&lt;br /&gt;
&lt;br /&gt;
	obj = alife():create(&amp;quot;bar_dolg_respawn_3&amp;quot;,a,13193,8,65535)&lt;br /&gt;
	alife():create_ammo(&amp;quot;ammo_9x18_fmj&amp;quot;,&lt;br /&gt;
		obj.position,&lt;br /&gt;
		obj.m_level_vertex_id,&lt;br /&gt;
		obj.m_game_vertex_id,&lt;br /&gt;
		obj.id,&lt;br /&gt;
		20) -- число патронов&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кстати, create_ammo - практически тоже самое, что и create, разница в том, что create_ammo предназначена специально для спавна патронов и позволяет создавать неполные пачки патронов. Возможно есть еще какие-то отличия. Стоит учесть, что сами авторы игры спавнят патроны исключительно через create_ammo. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Просто минимальный набор - координаты, ID, секция,а из него (серверного объекта) обычно нужен только ID, так как по ID можно получить этот самый серверный объект:&lt;br /&gt;
&amp;lt;pre&amp;gt;(alife():object(id))&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Его можно использовать, чтобы поставить метку, например, но я его лично использую для других целей - спавн сложных объектов, конкретно – NPC.&lt;br /&gt;
&lt;br /&gt;
Например надо решить следующую задачу - надо создать наемника, сменить ему группировку и изменить его инвентарь, ну и в нагрузку - сделать другом для игрока.&lt;br /&gt;
&lt;br /&gt;
В определенный момент заспавненый объект переходит онлайн, в этот момент вызывается callback - net_spawn.&lt;br /&gt;
&lt;br /&gt;
Что мы делаем? Сверяем ID онлайн объекта с сохраненным ID!&lt;br /&gt;
&lt;br /&gt;
Если они совпадают, например так:&lt;br /&gt;
&amp;lt;pre&amp;gt;if obj:id()==saved_id then ...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Важно то, что у серверного объекта ID - это параметр, а у онлайнового объекта ID получается с помощью функции. Это важно, а то можно прогореть.&lt;br /&gt;
&lt;br /&gt;
Итак, мы поймали нашего киллера по ID.&lt;br /&gt;
&lt;br /&gt;
Далее все очень просто - вызываем команды для спавна гаусса и патронов к нему в инвентаре NPC (см. выше), меняем группировку специальной функцией, и делаем его другом.&lt;br /&gt;
&lt;br /&gt;
Зачем такие сложности? Просто в оффлайне NPC как бы не существует, есть только косвенное упоминание о нем, и, плюс, все эти функции работают именно с объектом типа &amp;quot;NPC&amp;quot;, а не с серверными объектами.&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 1)==&lt;br /&gt;
&lt;br /&gt;
'''1.''' Чтобы не повторяться в описании создания нового квеста, просто изучите [[Создание квестов (Fr3nzy)|статью по созданию квестов]] от Fr3nzy – лучшей статьи на эту тему я просто не видел :) Мы просто свяжем все воедино и научимся спавнить объекты из скрипта. &lt;br /&gt;
&lt;br /&gt;
Небольшое отступление:&lt;br /&gt;
&lt;br /&gt;
Почему предпочтительнее делать спавн скриптом, а не через тот же xrSpawner? Программа xrSpawner, при всех своих достоинствах, обладает одним недостатком, а именно – она делает спавн через файл all.spawn, что приводит к:&lt;br /&gt;
&lt;br /&gt;
* Невозможности совместить два мода, такой спавн использующих&lt;br /&gt;
* Необходимости каждый раз начинать новую игру&lt;br /&gt;
&lt;br /&gt;
При спавне через скрипт ситуация иная: в подавляющем большинстве случаев, ранее сохраненные игры будут работать, что не может не радовать :)&lt;br /&gt;
&lt;br /&gt;
Итак, определимся с квестом.&lt;br /&gt;
&lt;br /&gt;
'''Задача:''' после разговора с Сидоровичем спавним зомби на территории фабрики в первой локации. Для того, чтобы не повредить оригинальный сюжет игры, задание будет выдаваться '''после''' прохождения квеста с флешкой Шустрого, так как появись там зомби одновременно с бандитами и Шустрым... я думаю, исход боя предрешен :)&lt;br /&gt;
&lt;br /&gt;
Реализация: Постараюсь описать все действия максимально подробно, буквально по шагам. Первым делом запустите игру :) &lt;br /&gt;
&lt;br /&gt;
В консоли введите команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;rs_stats on или rs_stats 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тем самым мы включаем вывод информации на экран. &lt;br /&gt;
Далее вводим еще одну команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;demo_record 1 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И «летим» на фабрику. Нам нужно выбрать место для спавна объектов и данный режим как нельзя лучше подходит для реализации задуманного. Помещаем камеру в точке предполагаемого спавна и записываем координаты - у меня получились 115, -6, -16. &lt;br /&gt;
&lt;br /&gt;
Для выхода из режима demo_record нажимаем Esc, в консоли пишем rs_stats off или rs_stats 0 (убираем вывод информации).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Другой способ получения тех же сведений - прийти в нужное место и запустить там скрипт, который выдаст все нужные координаты. Я пользуюсь следующим скриптом (вызываю общеизвестным способом, через main_menu):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function main_menu:main_cheat_f3()&lt;br /&gt;
	-- Выдадим сообщение о нашем местоположении&lt;br /&gt;
	local text&lt;br /&gt;
	local vid&lt;br /&gt;
	local gvid&lt;br /&gt;
	local a = vector() -- Тип переменной&lt;br /&gt;
	local text&lt;br /&gt;
&lt;br /&gt;
	a    = db.actor:position()        -- Наше положение в координатах&lt;br /&gt;
	vid  = db.actor:level_vertex_id() &lt;br /&gt;
	gvid = db.actor:game_vertex_id() &lt;br /&gt;
	text = &amp;quot;Позиция:\\nX= &amp;quot;..a.x..&amp;quot;\\nY= &amp;quot;..a.y..&amp;quot;\\nZ= &amp;quot;..a.z..&amp;quot;\\nlevel_vertex= &amp;quot;..vid..&amp;quot;\\ngame_vertex_id= &amp;quot;..gvid&lt;br /&gt;
	news_manager.send_tip(db.actor, text, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
В результате не нужно эксперементировать мы сразу получаем все, в том числе и level_vertex и  game_vertex. [[Участник:Imp|Imp]] 22:38, 23 июля 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходим из игры, идем в папку с установленной игрой и создаем каталог gamedata (предполагается, что «лепим» свой «мод» на «чистую» игру,  без установленных модов, и имеем распакованные ресурсы игры в папке, скажем, gamedata source).&lt;br /&gt;
&lt;br /&gt;
В папке gamedata создаем папку config, а в ней - папку creatures. Скопируем из оригинальной папки файл m_zombie.ltx и откроем его на редактирование.&lt;br /&gt;
&lt;br /&gt;
В файлах игры присутствуют 5 моделей гражданских зомби:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;файлы zombi_1.ogf, zombi_1_ghost.ogf, zombi_2.ogf, zombi_trup.ogf, zombi_trup_2.ogf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вернем в игру их всех :)&lt;br /&gt;
&lt;br /&gt;
Уже имеются секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_weak]:m_zombie_e, [zombie_normal]:m_zombie_e, [zombie_strong]:m_zombie_e и [zombie_immortal]:zombie_strong. &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Два последних типа используют одну и ту же модель zombi_trup.ogf, хм... непорядок, исправляем. &lt;br /&gt;
Последняя секция выглядит теперь так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_immortal]:zombie_strong&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_immortal&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_trup_2&lt;br /&gt;
panic_threshold		= 0.05	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим пятую модель. &lt;br /&gt;
&lt;br /&gt;
Для этого в конце файла создадим секцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_ghost]:zombie_strong&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что наш пятый зомби наследует все параметры zombie_strong, мы добавим лишь визуальное представление.&lt;br /&gt;
 &lt;br /&gt;
Пишем дальше:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;$spawn				= &amp;quot;monsters\zombies\zombie_ghost&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_1_ghost&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Пишем скрипт спавна. В папке gamedata создаем новую папку scripts, в ней создаем новый текстовый документ и называем его esc_zombie.script. &lt;br /&gt;
&lt;br /&gt;
Отступление третье:&lt;br /&gt;
&lt;br /&gt;
При написании статьи использовался оригинальный скрипт zombie_story.script из horror-mod’а. Концепция спавна перенесена практически без изменений, поэтому на авторство этого способа спавна я никоим образом не претендую :)&lt;br /&gt;
&lt;br /&gt;
Итак, открываем наш пустой файл на редактирование, первой строкой объявляем переменную, в которой хранятся наши зомби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее пишем функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function spawn_zombies( position, total )&lt;br /&gt;
	local zombie_index			-- тип зомби из массива zombie_types&lt;br /&gt;
	local new_pos, x_offset, z_offset	-- объявляем переменные 	&lt;br /&gt;
	for zombie_index=1, total do		-- крутим цикл столько раз, сколько &lt;br /&gt;
задает переменная total&lt;br /&gt;
		x_offset = math.random(5)	-- случайное (рандомное)  x от 1 до 5&lt;br /&gt;
		z_offset = math.random(5)	-- случайное (рандомное)  z от 1 до 5&lt;br /&gt;
		new_pos = position		-- передаем координаты в функцию&lt;br /&gt;
		new_pos.x = new_pos.x + x_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате x полученное выше рандомное x&lt;br /&gt;
		new_pos.z = new_pos.z + z_offset	-- прибавляем к указанной нами &lt;br /&gt;
координате z полученное выше рандомное z&lt;br /&gt;
-- Ниже, собственно и вызывается функция спавна случайного типа зомби &lt;br /&gt;
zombie_types[math.random(5)] привязанного к нашим координатам&lt;br /&gt;
	alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())&lt;br /&gt;
	end&lt;br /&gt;
end &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И последнее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function zomby_story_1( actor, npc )&lt;br /&gt;
--	десять зомби на фабрике (Кордон)&lt;br /&gt;
	local spawn_point = vector():set( 115, -6, -16 )	-- здесь указываем координаты, &lt;br /&gt;
выбранные нами для спавна, когда «летали» камерой :)&lt;br /&gt;
	spawn_zombies( spawn_point, 10 )		-- собственно вызов предыдущей функции &lt;br /&gt;
с передачей ей координат и количества объектов&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Сохраняем и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Продолжаем разговор :) &lt;br /&gt;
&lt;br /&gt;
Для того, чтобы игра не вылетала после того, как мы добавили новый тип монстров, их нужно добавить в файл xr_statistic.script. Итак, скопируем этот файл из папки игры scripts в нашу папку к файлу esc_zombie.script и откроем на редактирование. &lt;br /&gt;
&lt;br /&gt;
Добавим в local killCountProps  к монстрам строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = 1, zombie_normal = 2, zombie_strong = 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В local sect_alias строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;	zombie_weak = &amp;quot;zombie_weak&amp;quot;, zombie_normal  = &amp;quot;zombie_normal&amp;quot;, zombie_strong = &amp;quot;zombie_strong&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
А ниже в monster_classes строчку:&lt;br /&gt;
&amp;lt;pre&amp;gt;			[clsid.zombie_s      ] = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
В функцию getNpcType(npc) добавляем конструкцию:&lt;br /&gt;
&amp;lt;pre&amp;gt;		elseif npc:character_community() == &amp;quot;zombie&amp;quot; then&lt;br /&gt;
			community = &amp;quot;zombie&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем изменения и закрываем файл.&lt;br /&gt;
&lt;br /&gt;
Все будет работать на ура, пока мы не попробуем обыскать убитого зомби. Как только мы это сделаем, игра вылетит с примерно такой ошибкой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Expression    : fatal error&lt;br /&gt;
Function      : CInifile::r_string&lt;br /&gt;
File          : D:\xray-svn\xrCore\Xr_ini.cpp&lt;br /&gt;
Line          : 351&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find variable icon in [zombie_weak]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все верно – игра не знает какую иконку нам показывать для зомби. Иконки монстров хранятся в файле ui_npc_monster.dds. Здесь есть два варианта:&lt;br /&gt;
&lt;br /&gt;
* Если дружите с Фотошопом, отредактировать этот файл (нарисовать, добавить иконки);&lt;br /&gt;
* Взять готовый из любого мода, естественно, с разрешения авторов мода. Сейчас мы пропустим данный аспект и присвоим нашим зомби иконки контролера :)&lt;br /&gt;
&lt;br /&gt;
Вернемся к файлу m_zombie.ltx и в секцию [m_zombie_e]:monster_base впишем параметр&lt;br /&gt;
&amp;lt;pre&amp;gt; icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Вылетов не будет.&lt;br /&gt;
&lt;br /&gt;
3. Тема данной статьи не предусматривает подробного описания того, как сделать новый диалог. В начале статьи я упомянул источник, где можно найти исчерпывающую информацию по созданию диалогов, могу также привести в пример [[Создание диалогов (BAC9-FLCL)|статью по созданию диалогов]] от BAC9-FLCL.&lt;br /&gt;
&lt;br /&gt;
Нам нужно просто проверить работоспособность скриптового спавна, поэтому я приведу просто собственно сам измененный диалог из файла dialogs_escape.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;   &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
………&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;999&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_999&amp;lt;/text&amp;gt;&lt;br /&gt;
	          &amp;lt;next&amp;gt;7770&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9991&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9992&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9993&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9994&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9992&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9992&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99922&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;99922&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_99922&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9993&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9993&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99933&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;9995&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_9995&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3121&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3121&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;3131&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_3131&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;41&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_41&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Начало-------&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id=&amp;quot;7770&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7770&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7771&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7771&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7771&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7772&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7773&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7772&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7772&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7777&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7773&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7773&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;7779&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7779&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7779&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
			&amp;lt;/phrase&amp;gt;&lt;br /&gt;
			&amp;lt;phrase id=&amp;quot;7777&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;text&amp;gt;escape_trader_talk_info_7777&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;esc_zombie.zombie_story_1&amp;lt;/action&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
               			 &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
          			 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;!------Наш диалог: Конец-------&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;51&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_51&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9996&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
……&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И также связанный с ним файл stable_dialogs_escape.xml.&lt;br /&gt;
В самом начале файла пишем следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7770&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Происшествий никаких не было?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7771&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да знаешь... Вроде как тихо все у нас. Хотя, вот, вспомнил! Говорили мне &lt;br /&gt;
на днях, что на фабрике, ну, там, где бандюки околачиваются постоянно, видели какиих-то то ли &lt;br /&gt;
людей, то ли призраков... Мало ли что спьяну почудится - я и сказал этим паникерам, мол, &lt;br /&gt;
закусывать надо! Хех, блин, алкаши...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7772&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Дык мне по любому мимо фабрики топать - заодно и посмотрю на этих &lt;br /&gt;
&amp;quot;людей-призраков&amp;quot;.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7773&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да я как-то не собирался в ту сторону...&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7779&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ну, смотри сам, все равно будь осторожен.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_7777&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ага. Сходи, проветрись. Потом зайдешь, расскажешь, что там и как.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;esc_bridge_soldiers_start_11&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Здесь проход воспрещён, сталкер.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все. Можно запускать игру, идти на Кордон, после разговороа с Сидоровичем, в зависимости &lt;br /&gt;
от выбранного Меченным решения, бежим на фабрику и … смотрим сами :)&lt;br /&gt;
&lt;br /&gt;
 [http://www.sendspace.com/file/2kx7uf Готовые файлы примера](перезалито)&lt;br /&gt;
 [http://slil.ru/24600587 Spawn Lib]&lt;br /&gt;
Домашнее задание - вернуть в игру 6-ой тип гражданского зомби :)&lt;br /&gt;
&lt;br /&gt;
Продолжение следует…&lt;br /&gt;
&lt;br /&gt;
==Практика (часть 2)==&lt;br /&gt;
&lt;br /&gt;
'''4.''' Сегодня мы закончим с зомби в полном объеме – добавим их описания в энциклопедию,  добавим иконки, и разберемся с «домашним заданием»:) Думаю, что внимательно изучив эту статью, вы ''сами'' сможете через скриптовые функции восстановить любого персонажа, не вошедшего в финальный релиз игры. Если у кого хватит времени и желания, те могут даже написать что-то типа «Ночи живых мертвецов» :)  - серию квестов, связанную своим собственным сюжетом. &lt;br /&gt;
Итак, «домашнее задание» - добавляем в игру шестого зомби.&lt;br /&gt;
&lt;br /&gt;
* Создаем в папке gamedata папку meshes, в ней папку monsters, а там – папку zombi. В папке meshes хранятся модели персонажей, объектов, окружения, присутствующих в игре. Как я уже говорил выше, в игре представлено 5 моделей гражданских зомби, а вот текстур – 6. Также немного смутила нумерация моделей – 1, 2, 4... А где третий? Наверное, сбежал :)&lt;br /&gt;
&lt;br /&gt;
* Скопируем из папки с оригинальными файлами игры в созданную нами папку zombi файл zombi_2.ogf и переименуем его в zombi_3.ogf. Откроем файл нашей новой модели любым HexEditor’ом, я использую BiEd (Binary Editor 1.00). Так как данная статья рассчитана не только на «продвинутых юзеров», но и на «обычных чайников», которые, тем не менее, хотят «что-нить замутить» и при этом не сильно «парить моск», я не буду рассказывать здесь про адресацию, двухбайтовую запись и т.д., я просто наглядно покажу, где что поправить :)&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-717-3 Файл модели '''до''' редактирования]&lt;br /&gt;
&lt;br /&gt;
[http://www.golushkov.pp.net.ua/photo/11-0-718-3 Файл модели '''после''' редактирования]&lt;br /&gt;
&lt;br /&gt;
На скринах видно, что мы просто изменили для этой модели путь к текстуре. Все. Без использования 3D-редакторов и затраты кучи времени на обработку модели в них, мы получили абсолютно новую (на внешний вид) модель. :)&lt;br /&gt;
&lt;br /&gt;
'''5.''' Теперь пропишем нашего нового зомби во все файлы, которые мы создали ранее. В файл m_zombie.ltx в самый конец добавляем секцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[zombie_old]:zombie_normal&lt;br /&gt;
$spawn				= &amp;quot;monsters\zombies\zombie_old&amp;quot;&lt;br /&gt;
visual				= monsters\zombi\zombi_3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в файле esc_zombie.script изменяем массив в первой строке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local zombie_types = {&amp;quot;zombie_weak&amp;quot;, &amp;quot;zombie_normal&amp;quot;, &amp;quot;zombie_strong&amp;quot;, &amp;quot;zombie_immortal&amp;quot;, &lt;br /&gt;
&amp;quot;zombie_old&amp;quot;, &amp;quot;zombie_ghost&amp;quot;}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В функции spawn_zombies изменяем строку спавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	alife():create(zombie_types[math.random(6)],new_pos,&lt;br /&gt;
db.actor:level_vertex_id(),db.actor:game_vertex_id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
в функции zombie_story_1 меняем число объектов на кратное 6-ти (необязательно):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	spawn_zombies( spawn_point, 12 )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё. Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''6.''' Копируем в папку gamedata\config\gameplay\  файл encyclopedia_mutants.xml, добавляем описание зомби в энциклопедию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;lt;!-------------------------------- Zombieg -----------------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;article id=&amp;quot;mutant_zombieg_general&amp;quot; name=&amp;quot;Zombieg&amp;quot; group=&amp;quot;Mutants&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;texture&amp;gt;ui_npc_monster_zombieg&amp;lt;/texture&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;enc_mutant_zombieg_general&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/article&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в связанный с ним файл string_table_enc_mutants.xml в папке gamedata\config\text\rus\ добавляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;Zombie&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;Zombieg&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombieg_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Зомби-привидение отличается от обычного зомби лишь тем, что &lt;br /&gt;
воздействие Выжигателя мозгов полностью разрушило не только структуру личности, но и &lt;br /&gt;
тело, поэтому зомби-призрак несколько более живуч по сравнению с обычным зомби.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;enc_mutant_zombie_general&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Воздействие Выжигателя мозгов полностью разрушает структуру личности, &lt;br /&gt;
оставляя только телесную оболочку.\n\n Побродив немного по Зоне, лишённые разума тела &lt;br /&gt;
начинают превращаться в настоящих зомби. Из рефлексов у них остаются лишь самые примитивные, &lt;br /&gt;
оружие и экипировка скоро приходят в негодность. В результате зомби становятся собой ни чем &lt;br /&gt;
иным, как медлительными полутрупами, которых наличествуют лишь два эффективных раздражителя: &lt;br /&gt;
еда и сон. Зомби совершенно неразборчивы в выборе пищи и питья, поэтому их тела буквально &lt;br /&gt;
пропитаны радиацией и токсинами. Как правило, эти существа бесцельно бродят по Зоне или, &lt;br /&gt;
словно трупы, валяются внутри заброшенных построек. Однако, лишь только зомби почует близкое &lt;br /&gt;
присутствие живого человека, он сразу же пытается атаковать. Умудрённые опытом сталкеры &lt;br /&gt;
стараются обходить эти неуклюжие опустошённые оболочки.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Копируем сюда же файл stable_statistic_caption.xml и изменяем в нем 3 строчки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;zombie_normal&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомбированный, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_strong&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби-призрак, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;zombie_weak&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;зомби, гражданский&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&lt;br /&gt;
'''7.''' И последнее – добавим иконки. Скажу сразу, воспользовался готовым файлом, уже содержащим иконки зомби и других «восстановленных монстров» (спасибо Fr3nzy). Поэтому просто скопируйте файл ui_npc_monster.dds из архива в папку gamedata\textures\ui\, а файл ui_npc_monster.xml – в папку gamedata\config\ui\. Если вы хотите сделать собственные - прочитайте урок по [[Изменение текстур (BAC9-FLCL)|изменению текстур]].&lt;br /&gt;
&lt;br /&gt;
Вкратце, что описывает файл ui_npc_monster.xml: в нем задаются координаты иконок, расположенных в файле ui_npc_monster.dds, применительно к каждому типу монстров в игре.&lt;br /&gt;
&lt;br /&gt;
Заключительный штрих. Откройте файл m_zombie.ltx и в первой секции замените строку &lt;br /&gt;
&amp;lt;pre&amp;gt;icon				 = ui_npc_monster_kontroler&amp;lt;/pre&amp;gt;&lt;br /&gt;
На:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombie&amp;lt;/pre&amp;gt;&lt;br /&gt;
В секцию [zombie_ghost] добавьте строку:&lt;br /&gt;
&amp;lt;pre&amp;gt;icon 				= ui_npc_monster_zombieg&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняйте изменения. Всё. &lt;br /&gt;
&lt;br /&gt;
Вот [http://data.cod.ru/1290894794 готовые файлы примера].&lt;br /&gt;
Удачи и спасибо за внимание :)&lt;br /&gt;
&lt;br /&gt;
==Спавн NPC==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;Эта часть статьи написана [[Участник:Arhet|Arhet]] и создана на примере того, как в SRP Mod были созданы NPC группировки &amp;quot;Грех&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задействуем файлы:&lt;br /&gt;
&lt;br /&gt;
* gamedata\config\gameplay\character_desc_escape.xml&lt;br /&gt;
* gamedata\config\gameplay\npc_profile.ltx&lt;br /&gt;
* gamedata\config\creatures\spawn_sections.ltx&lt;br /&gt;
&lt;br /&gt;
Начнем с ''character_desc_escape.xml''. Описание что значит каждая строка писать не буду, так как все до меня уже сделано.&lt;br /&gt;
&lt;br /&gt;
Тут создадим нового персонажа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;specific_character id=&amp;quot;esc_dark_stalker_1&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;GENERATE_NAME_bandit&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;icon&amp;gt;ui_npc_dark_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
&amp;lt;map_icon x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/map_icon&amp;gt;&lt;br /&gt;
&amp;lt;bio&amp;gt;sim_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt; - вот тут наш новый класс кстати.&lt;br /&gt;
&amp;lt;community&amp;gt;dark_stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
&amp;lt;money min=&amp;quot;200&amp;quot; max=&amp;quot;600&amp;quot; infinitive=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/money&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rank&amp;gt;198&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;lt;reputation&amp;gt;-24&amp;lt;/reputation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;visual&amp;gt;actors\dark_stalker\dark_stalker_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;snd_config&amp;gt;characters_voice\human_01\monolith\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
&amp;lt;panic_treshold&amp;gt;0&amp;lt;/panic_treshold&amp;gt;&lt;br /&gt;
&amp;lt;supplies&amp;gt;&lt;br /&gt;
[spawn] \n&lt;br /&gt;
wpn_dark_colt1911 \n&lt;br /&gt;
ammo_11.43x23_hydro \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_drugs.xml&amp;quot; \n&lt;br /&gt;
#include &amp;quot;gameplay\character_food.xml&amp;quot;&lt;br /&gt;
&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_3.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Впишем наш код после какого-нибудь &amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь идем в ''npc_profile.xml'' и туда вгоняем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;esc_dark_stalker_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_dark_stalker_01&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_dark_stalker_1&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь надо заняться ''spawn_sections.ltx''. Скрипт будет «брать NPC» как раз из этого файла. Пишем туда:&lt;br /&gt;
&lt;br /&gt;
* [esc_dark_stalker_1]:stalker – имя секции для скрипта..&lt;br /&gt;
* $spawn = &amp;quot;respawn\esc_dark_stalker_1&amp;quot;&lt;br /&gt;
* character_profile = esc_dark_stalker_1 – ссылка на описание нашего NPC&lt;br /&gt;
* spec_rank = regular – спец ранг&lt;br /&gt;
* community = dark_stalker – группировка.&lt;br /&gt;
&lt;br /&gt;
Теперь берем любой скрипт спавна NPC, вгоняем туда имя секции из spawn_sections.ltx и ву-а-ля.&lt;br /&gt;
&lt;br /&gt;
Тока забыли что данному НПС будет присвоенная дефолтовая логика (т.е. тупо хожу куда сам не знаю) забыли упомянуть про (ххх - лока):&lt;br /&gt;
 	+	&lt;br /&gt;
 	+	ххх gulag.script (действия НПС! Где можно: где можно присвоить статус кампера; волкера; и.д.т)&lt;br /&gt;
 	+	&lt;br /&gt;
 	+	ххх gulag.ltx (дублер логики т.е. дублирует кратко действия НПС)&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:XStream|xStream]]&lt;br /&gt;
* [[Участник:RekLatS|OffBar]]&lt;br /&gt;
* [[Участник:Fr3nzy|Fr3nzy]]&lt;br /&gt;
* [[Участник:Imp|Imp]]&lt;br /&gt;
* [[Участник:Arhet|Arhet]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC</id>
		<title>SoC. Редактирование NPC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC"/>
				<updated>2008-08-10T09:44:13Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вступление==&lt;br /&gt;
&lt;br /&gt;
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры.&lt;br /&gt;
&lt;br /&gt;
==Параметры==&lt;br /&gt;
&lt;br /&gt;
За параметры NPC отвечают файлы: &lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_[название локации].xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;name&amp;gt;...&amp;lt;/name&amp;gt;''  - Имя (ссылка на строку в текстовом массиве).&lt;br /&gt;
* ''&amp;lt;icon&amp;gt;ui_npc_...&amp;lt;/icon&amp;gt;'' - Иконка для диалогов/торговли/PDA.&lt;br /&gt;
* ''&amp;lt;bio&amp;gt;..._bio&amp;lt;/bio&amp;gt;'' - Биография (в игре не используется).&lt;br /&gt;
* ''&amp;lt;class&amp;gt;...&amp;lt;/class&amp;gt;'' - Класс (лучше не трогать).[[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.&lt;br /&gt;
* ''&amp;lt;community&amp;gt;...&amp;lt;/community&amp;gt;'' - Группировка.&lt;br /&gt;
* ''&amp;lt;rank&amp;gt;...&amp;lt;/rank&amp;gt;'' - Ранг.&lt;br /&gt;
* ''&amp;lt;reputation&amp;gt;...&amp;lt;/reputation&amp;gt;'' - Репутация.&lt;br /&gt;
* ''&amp;lt;money min=&amp;quot;...&amp;quot; max=&amp;quot;...&amp;quot; infinitive=&amp;quot;...&amp;quot;/&amp;gt;'' - Количество денег (infinitive=&amp;quot;1&amp;quot; - бесконечные деньги).&lt;br /&gt;
* ''&amp;lt;snd_config&amp;gt;...&amp;lt;/snd_config&amp;gt;'' - Набор звуков.&lt;br /&gt;
* ''&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;'' - Тип приседания. Лучше не трогать.&lt;br /&gt;
* ''&amp;lt;visual&amp;gt;actors\...&amp;lt;/visual&amp;gt;'' - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.&lt;br /&gt;
* ''&amp;lt;supplies&amp;gt;...&amp;lt;/supplies&amp;gt;'' - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, &amp;quot;запрещенные&amp;quot; предметы удаляються скриптом. [[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;start_dialog&amp;gt;...&amp;lt;start_dialog&amp;gt;'' - Приветственный диалог. Их может быть несколько, с различными условиями появления.&lt;br /&gt;
* ''&amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;'' - Диалоги с игроком.&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
Изменим, например, параметры NPC по имени Волк.&lt;br /&gt;
&lt;br /&gt;
Откроем файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_escape.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И найдем в нем раздел, ему соответствующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_pm \n &lt;br /&gt;
			ammo_9x18_fmj = 1 \n &lt;br /&gt;
			wpn_ak74u \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в &amp;quot;Долг&amp;quot; и сделаем неограниченное количество денег: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;dolg&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_deagle \n &lt;br /&gt;
			ammo_11.43x23_fmj = 1 \n &lt;br /&gt;
			wpn_fn2000 \n&lt;br /&gt;
			ammo_5.56x45_ap \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ввода нового NPC в симуляцию достаточно создать новый профиль.&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC</id>
		<title>SoC. Редактирование NPC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC"/>
				<updated>2008-08-10T09:43:47Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вступление==&lt;br /&gt;
&lt;br /&gt;
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры.&lt;br /&gt;
&lt;br /&gt;
==Параметры==&lt;br /&gt;
&lt;br /&gt;
За параметры NPC отвечают файлы: &lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_[название локации].xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;name&amp;gt;...&amp;lt;/name&amp;gt;''  - Имя (ссылка на строку в текстовом массиве).&lt;br /&gt;
* ''&amp;lt;icon&amp;gt;ui_npc_...&amp;lt;/icon&amp;gt;'' - Иконка для диалогов/торговли/PDA.&lt;br /&gt;
* ''&amp;lt;bio&amp;gt;..._bio&amp;lt;/bio&amp;gt;'' - Биография (в игре не используется).&lt;br /&gt;
* ''&amp;lt;class&amp;gt;...&amp;lt;/class&amp;gt;'' - Класс (лучше не трогать).[[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.&lt;br /&gt;
* ''&amp;lt;community&amp;gt;...&amp;lt;/community&amp;gt;'' - Группировка.&lt;br /&gt;
* ''&amp;lt;rank&amp;gt;...&amp;lt;/rank&amp;gt;'' - Ранг.&lt;br /&gt;
* ''&amp;lt;reputation&amp;gt;...&amp;lt;/reputation&amp;gt;'' - Репутация.&lt;br /&gt;
* ''&amp;lt;money min=&amp;quot;...&amp;quot; max=&amp;quot;...&amp;quot; infinitive=&amp;quot;...&amp;quot;/&amp;gt;'' - Количество денег (infinitive=&amp;quot;1&amp;quot; - бесконечные деньги).&lt;br /&gt;
* ''&amp;lt;snd_config&amp;gt;...&amp;lt;/snd_config&amp;gt;'' - Набор звуков.&lt;br /&gt;
* ''&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;'' - Тип приседания. Лучше не трогать.&lt;br /&gt;
* ''&amp;lt;visual&amp;gt;actors\...&amp;lt;/visual&amp;gt;'' - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.&lt;br /&gt;
* ''&amp;lt;supplies&amp;gt;...&amp;lt;/supplies&amp;gt;'' - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, &amp;quot;запрещенные&amp;quot; предметы удаляються скриптом. [[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;start_dialog&amp;gt;...&amp;lt;start_dialog&amp;gt;'' - Приветственный диалог. Их может быть несколько, с различными условиями появления.&lt;br /&gt;
* ''&amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;'' - Диалоги с игроком.&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
Изменим, например, параметры NPC по имени Волк.&lt;br /&gt;
&lt;br /&gt;
Откроем файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_escape.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И найдем в нем раздел, ему соответствующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_pm \n &lt;br /&gt;
			ammo_9x18_fmj = 1 \n &lt;br /&gt;
			wpn_ak74u \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в &amp;quot;Долг&amp;quot; и сделаем неограниченное количество денег: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;dolg&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_deagle \n &lt;br /&gt;
			ammo_11.43x23_fmj = 1 \n &lt;br /&gt;
			wpn_fn2000 \n&lt;br /&gt;
			ammo_5.56x45_ap \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ввода нового NPC в симуляцию достаточно создать новый профиль.&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC</id>
		<title>SoC. Редактирование NPC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC"/>
				<updated>2008-08-10T09:43:38Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вступление==&lt;br /&gt;
&lt;br /&gt;
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры.&lt;br /&gt;
&lt;br /&gt;
==Параметры==&lt;br /&gt;
&lt;br /&gt;
За параметры NPC отвечают файлы: &lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_[название локации].xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;name&amp;gt;...&amp;lt;/name&amp;gt;''  - Имя (ссылка на строку в текстовом массиве).&lt;br /&gt;
* ''&amp;lt;icon&amp;gt;ui_npc_...&amp;lt;/icon&amp;gt;'' - Иконка для диалогов/торговли/PDA.&lt;br /&gt;
* ''&amp;lt;bio&amp;gt;..._bio&amp;lt;/bio&amp;gt;'' - Биография (в игре не используется).&lt;br /&gt;
* ''&amp;lt;class&amp;gt;...&amp;lt;/class&amp;gt;'' - Класс (лучше не трогать).[[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.&lt;br /&gt;
* ''&amp;lt;community&amp;gt;...&amp;lt;/community&amp;gt;'' - Группировка.&lt;br /&gt;
* ''&amp;lt;rank&amp;gt;...&amp;lt;/rank&amp;gt;'' - Ранг.&lt;br /&gt;
* ''&amp;lt;reputation&amp;gt;...&amp;lt;/reputation&amp;gt;'' - Репутация.&lt;br /&gt;
* ''&amp;lt;money min=&amp;quot;...&amp;quot; max=&amp;quot;...&amp;quot; infinitive=&amp;quot;...&amp;quot;/&amp;gt;'' - Количество денег (infinitive=&amp;quot;1&amp;quot; - бесконечные деньги).&lt;br /&gt;
* ''&amp;lt;snd_config&amp;gt;...&amp;lt;/snd_config&amp;gt;'' - Набор звуков.&lt;br /&gt;
* ''&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;'' - Тип приседания. Лучше не трогать.&lt;br /&gt;
* ''&amp;lt;visual&amp;gt;actors\...&amp;lt;/visual&amp;gt;'' - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.&lt;br /&gt;
* ''&amp;lt;supplies&amp;gt;...&amp;lt;/supplies&amp;gt;'' - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, &amp;quot;запрещенные&amp;quot; предметы удаляються скриптом. [[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;start_dialog&amp;gt;...&amp;lt;start_dialog&amp;gt;'' - Приветственный диалог. Их может быть несколько, с различными условиями появления.&lt;br /&gt;
* ''&amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;'' - Диалоги с игроком.&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
Изменим, например, параметры NPC по имени Волк.&lt;br /&gt;
&lt;br /&gt;
Откроем файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_escape.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И найдем в нем раздел, ему соответствующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_pm \n &lt;br /&gt;
			ammo_9x18_fmj = 1 \n &lt;br /&gt;
			wpn_ak74u \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в &amp;quot;Долг&amp;quot; и сделаем неограниченное количество денег: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;dolg&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_deagle \n &lt;br /&gt;
			ammo_11.43x23_fmj = 1 \n &lt;br /&gt;
			wpn_fn2000 \n&lt;br /&gt;
			ammo_5.56x45_ap \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ввода нового NPC в симуляцию достаточно создать новый профиль.&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC</id>
		<title>SoC. Редактирование NPC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_NPC"/>
				<updated>2008-08-10T09:43:26Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вступление==&lt;br /&gt;
&lt;br /&gt;
В этой статье мы научимся редактировать NPC: изменять содержимое их инвентаря, реплики, поведение, имя, и другие параметры.&lt;br /&gt;
&lt;br /&gt;
==Параметры==&lt;br /&gt;
&lt;br /&gt;
За параметры NPC отвечают файлы: &lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_[название локации].xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Каждый из них разбит на секции - по одной на NPC. Используются следующие параметры:&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;name&amp;gt;...&amp;lt;/name&amp;gt;''  - Имя (ссылка на строку в текстовом массиве).&lt;br /&gt;
* ''&amp;lt;icon&amp;gt;ui_npc_...&amp;lt;/icon&amp;gt;'' - Иконка для диалогов/торговли/PDA.&lt;br /&gt;
* ''&amp;lt;bio&amp;gt;..._bio&amp;lt;/bio&amp;gt;'' - Биография (в игре не используется).&lt;br /&gt;
* ''&amp;lt;class&amp;gt;...&amp;lt;/class&amp;gt;'' - Класс (лучше не трогать).[[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)Нужно для того что-бы автоматические респавнеры могли спавнить немного разных персонажей. То есть например в игре есть описание восьми (кажеться может и больше) разных новичков и что бы при автоматическом респавне не получалась куча братьев-близнецов, респавнер настраивается на класс персонажей и спавнит случайным образом разных персонажей одного класса.&lt;br /&gt;
* ''&amp;lt;community&amp;gt;...&amp;lt;/community&amp;gt;'' - Группировка.&lt;br /&gt;
* ''&amp;lt;rank&amp;gt;...&amp;lt;/rank&amp;gt;'' - Ранг.&lt;br /&gt;
* ''&amp;lt;reputation&amp;gt;...&amp;lt;/reputation&amp;gt;'' - Репутация.&lt;br /&gt;
* ''&amp;lt;money min=&amp;quot;...&amp;quot; max=&amp;quot;...&amp;quot; infinitive=&amp;quot;...&amp;quot;/&amp;gt;'' - Количество денег (infinitive=&amp;quot;1&amp;quot; - бесконечные деньги).&lt;br /&gt;
* ''&amp;lt;snd_config&amp;gt;...&amp;lt;/snd_config&amp;gt;'' - Набор звуков.&lt;br /&gt;
* ''&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;'' - Тип приседания. Лучше не трогать.&lt;br /&gt;
* ''&amp;lt;visual&amp;gt;actors\...&amp;lt;/visual&amp;gt;'' - Внешность. Влияет как на внешний вид костюма, так и на его свойства. Укажите здесь экзоскелет - и персонаж действительно в нем окажется: как по внешности, так и по свойствам.&lt;br /&gt;
* ''&amp;lt;supplies&amp;gt;...&amp;lt;/supplies&amp;gt;'' - Предметы, находящиеся у него в инвентаре. Некоторые из них в игре не отображаются, поэтому не удивляйтесь присутствию здесь предметов вроде рации или фонарика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: gray&amp;quot;&amp;gt;В игре отображаються все предметы, просто при торговле есть ограничения на допустимые к торговле предметы, а при смерти персонажа, &amp;quot;запрещенные&amp;quot; предметы удаляються скриптом. [[Участник:Imp|Imp]] 12:46, 12 августа 2007 (EEST)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''&amp;lt;start_dialog&amp;gt;...&amp;lt;start_dialog&amp;gt;'' - Приветственный диалог. Их может быть несколько, с различными условиями появления.&lt;br /&gt;
* ''&amp;lt;actor_dialog&amp;gt;...&amp;lt;/actor_dialog&amp;gt;'' - Диалоги с игроком.&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
Изменим, например, параметры NPC по имени Волк.&lt;br /&gt;
&lt;br /&gt;
Откроем файл:&lt;br /&gt;
&amp;lt;pre&amp;gt;\config\gameplay\character_desc_escape.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И найдем в нем раздел, ему соответствующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_pm \n &lt;br /&gt;
			ammo_9x18_fmj = 1 \n &lt;br /&gt;
			wpn_ak74u \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменим некоторые параметры. Выдадим ему FN2000 и Desert Eagle, примем в &amp;quot;Долг&amp;quot; и сделаем неограниченное количество денег: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;!---------------------esc_wolf---------------------&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_wolf&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;esc_wolf_name&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_wolf_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_wolf&amp;lt;/class&amp;gt;&lt;br /&gt;
		&amp;lt;community&amp;gt;dolg&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
		&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
		&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
		&amp;lt;visual&amp;gt;actors\neytral\stalker_neytral_balon_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_deagle \n &lt;br /&gt;
			ammo_11.43x23_fmj = 1 \n &lt;br /&gt;
			wpn_fn2000 \n&lt;br /&gt;
			ammo_5.56x45_ap \n&lt;br /&gt;
			ammo_5.45x39_fmj \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
			hand_radio \n&lt;br /&gt;
		&amp;lt;/supplies&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot; //&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_lager_volk_talk&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;dm_hello_dialog&amp;lt;/start_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_cool_info_dialog&amp;lt;/actor_dialog&amp;gt; &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;dm_help_wounded_medkit_dialog&amp;lt;/actor_dialog&amp;gt;  &lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_wolf_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ввода нового NPC в симуляцию достаточно создать новый профиль.&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B2%D0%B5%D1%82%D0%BE%D0%BA_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2</id>
		<title>SoC. Создание новых веток диалогов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B2%D0%B5%D1%82%D0%BE%D0%BA_%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2"/>
				<updated>2008-08-10T09:35:46Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: /* Практический пример не работает со вторым патчем - решение проблемы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt;Создание новых веток диалогов.&amp;lt;/center&amp;gt;==&lt;br /&gt;
===Теория:===&lt;br /&gt;
&lt;br /&gt;
(Если где то чего то напутал исправляйте, многое писал интуитивно)&lt;br /&gt;
&lt;br /&gt;
'''1)''' Списки веток диалогов содержатся в файлах вида gamedata/config/gameplay/character_desc_*.xml &lt;br /&gt;
&lt;br /&gt;
Это например: &lt;br /&gt;
character_desc_zombied.xml&lt;br /&gt;
character_desc_stalker.xml&lt;br /&gt;
character_desc_garbage.xml&lt;br /&gt;
итд.&lt;br /&gt;
&lt;br /&gt;
Файлы character_desc_*.xml можно сравнить со стволом дерева диалогов.&lt;br /&gt;
В них перечисляется названия прикрепляемых веток диалогов&lt;br /&gt;
&lt;br /&gt;
Например вот список веток диалога с Сидоровичем взятый из файла character_desc_escape.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;		&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В свою очередь каждая ветка диалога также может ветвится.&lt;br /&gt;
&lt;br /&gt;
'''2)''' Ветвление веток прописывается уже в других файлах.&lt;br /&gt;
Например ветвление веток диалога с Сидоровичем содержится в файле gamedata/config/gameplay/dialogs_escape.xml&lt;br /&gt;
Возьмем оттуда к примеру ветвление ветки escape_trader_jobs&lt;br /&gt;
&lt;br /&gt;
(ветвление веток обычно очень большое поэтому я приведу только часть):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;phrase_list&amp;gt;&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_1&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;100&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99&amp;lt;/next&amp;gt;&lt;br /&gt;
	      &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              …&lt;br /&gt;
              …&lt;br /&gt;
              …&lt;br /&gt;
            &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_0&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;/phrase&amp;gt;&lt;br /&gt;
        &amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;precondition&amp;gt;…&amp;lt;/precondition&amp;gt; - это проверка выполнения условия. Ветка появится в диалоге, только если условие выполняется.&lt;br /&gt;
Конкретно &amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt; из ветки  escape_trader_talk_info есть обращение к функции trader_has_talk_info_wr находящейся в файле скрипте gamedata/scripts/escape_dialog.script&lt;br /&gt;
&lt;br /&gt;
Функция выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function trader_has_talk_info_wr( trader, actor )&lt;br /&gt;
	return true&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt; в принципе выполняется всегда, т.к. функция всегда возвращает иситну и &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt; пропускается в списк реплик.&lt;br /&gt;
Но для конкретной ветки может быть несколько precondition и других условий.&lt;br /&gt;
&lt;br /&gt;
Далее &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt; (если я верно понимаю) это так же своего рода проверка условия. В данном случае проверка на то закончена стадия tutorialа или нет. Т.е ветка допустится в список реплик если стадия tutorialа закончена.&lt;br /&gt;
более детально об этом в конце данной статьи.&lt;br /&gt;
&lt;br /&gt;
А далее идут конкретные фразы содержащие ссылки на вытекающие фразы&lt;br /&gt;
&lt;br /&gt;
Фраза:        &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_0&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
это основа ветки escape_trader_talk_info. &lt;br /&gt;
(Вообще как я понял в любой основной ветке любого диалога фраза &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; будет основой из которой далее будет все вытекать)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt; - это ссылка на вытекающую фразу &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;       &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;text&amp;gt;escape_trader_talk_info_1&amp;lt;/text&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;100&amp;lt;/next&amp;gt;&lt;br /&gt;
                &amp;lt;next&amp;gt;99&amp;lt;/next&amp;gt;&lt;br /&gt;
	    &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt;&lt;br /&gt;
        &amp;lt;/phrase&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В свою очередь   &amp;lt;next&amp;gt;100&amp;lt;/next&amp;gt;, &amp;lt;next&amp;gt;99&amp;lt;/next&amp;gt;, &amp;lt;next&amp;gt;9995&amp;lt;/next&amp;gt; это ссылки на фразы веточки растущие из фразы &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''3)''' Текст каждой фразы содержится уже в четвертом файле. Для диалога с Сидоровичем тексты лежат в файле gamedata/config/text/rus/stable_dialogs_escape.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_talk_info_0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Есть несколько вопросов.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_talk_info_1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Спрашивай, только я ведь всего не знаю. Сам понимаешь, сижу тут целыми днями, а жизнь - она вся там, снаружи, в Зоне. Могу рассказать о Зоне вообще, а немного могу о ближайших окрестностях, где сам ходил.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эти строки содержат тексты для фраз &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt; и &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого диалоги разложены по 4 а то и более файлам.&lt;br /&gt;
&lt;br /&gt;
Да кстати, путь по веткам может быть зацикленным если того требует диалог. Например так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;…&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;…&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;11&amp;lt;/next&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;12&amp;lt;/next&amp;gt;&lt;br /&gt;
 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;11&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;…&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;  - Это возврат к фразе 1. (зацикливание)  &lt;br /&gt;
            &amp;lt;next&amp;gt;111&amp;lt;/next&amp;gt;&lt;br /&gt;
 &amp;lt;/phrase&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Практика:===&lt;br /&gt;
Добавим в диалог с Сидоровичем ветку своего собственного изготовления.Например такую: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые? &lt;br /&gt;
Сидорович: Чего?!!&lt;br /&gt;
Меченый: Ты их совсем, совсем не кормишь?&lt;br /&gt;
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для этого:&lt;br /&gt;
&lt;br /&gt;
'''1)''' В файле gamedata/config/gameplay/character_desc_escape.xml в конце списка веток для  trader_а  суем свою ветку с произвольным названием. (например   &amp;lt;actor_dialog&amp;gt;escape_trader_letat_gusi&amp;lt;/actor_dialog&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Т.е у нас получится так&lt;br /&gt;
&amp;lt;pre&amp;gt;		…&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;escape_trader&amp;quot; no_random = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		…&lt;br /&gt;
		…&lt;br /&gt;
		…&lt;br /&gt;
		&amp;lt;start_dialog&amp;gt;escape_trader_start_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_talk_info&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_jobs&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_trader_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;tm_trader_reward&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
		&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
                        &amp;lt;actor_dialog&amp;gt;escape_trader_letat_gusi&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
		…&amp;lt;/pre&amp;gt;&lt;br /&gt;
Записываем изменения и с файлом character_desc_escape.xml  все.&lt;br /&gt;
&lt;br /&gt;
'''2)''' Теперь берем файл gamedata/config/gameplay/dialogs_escape.xml&lt;br /&gt;
&lt;br /&gt;
Диалогу:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Меченый: Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые? &lt;br /&gt;
Сидорович: Чего?!!&lt;br /&gt;
Меченый: Ты их совсем, совсем не кормишь?&lt;br /&gt;
Сидорович: В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
который мы хотим реализовать будет соответствовать такая структура:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;escape_trader_letat_gusi_0&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt;escape_trader_letat_gusi_1&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
 &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt; escape_trader_letat_gusi_2&amp;lt;/text&amp;gt;&lt;br /&gt;
            &amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;text&amp;gt; escape_trader_letat_gusi_3&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
условия наличия ветки в диалоге можно взять из ветки  &amp;lt;dialog id=&amp;quot;escape_trader_talk_info&amp;quot;&amp;gt;&lt;br /&gt;
Т.е берем условия  &amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt; и  &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
(Можно было конечно прописать в скрипте еще одно условие для ветки, чтоб она появилась только один раз, &lt;br /&gt;
а потом больше не возникала. Но об этом как нибудь позже допишу.)&lt;br /&gt;
&lt;br /&gt;
В итоге у нас получилась такая структура:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;phrase_list&amp;gt;&lt;br /&gt;
                   &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;text&amp;gt;escape_trader_letat_gusi_0&amp;lt;/text&amp;gt;&lt;br /&gt;
                              &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
                    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                               &amp;lt;text&amp;gt;escape_trader_letat_gusi_1&amp;lt;/text&amp;gt;&lt;br /&gt;
                                &amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;text&amp;gt; escape_trader_letat_gusi_2&amp;lt;/text&amp;gt;&lt;br /&gt;
                                &amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                                  &amp;lt;text&amp;gt; escape_trader_letat_gusi_3&amp;lt;/text&amp;gt;&lt;br /&gt;
                      &amp;lt;/phrase&amp;gt;&lt;br /&gt;
        &amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
  &amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Которую нужно вставить в любом месте между dialog id_шниками других веток в файле dialogs_escape.xml.&lt;br /&gt;
&lt;br /&gt;
Главное не промахнутся и засунуть именно между, а не внутрь одного из dialog id&lt;br /&gt;
&lt;br /&gt;
Все что находится между тегами &amp;lt;dialog id=&amp;quot;***&amp;quot;&amp;gt; и   &amp;lt;/dialog&amp;gt; это внутенности конкретного dialog id&lt;br /&gt;
&lt;br /&gt;
Т.е совать наш&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;dialog id=&amp;quot;escape_trader_letat_gusi&amp;quot;&amp;gt;&lt;br /&gt;
 …  &lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
надо &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;dialog id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
здесь&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
…&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
но&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;dialog id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
не здесь&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После сохранения внесенных изменений с файлом dialogs_escape.xml все.&lt;br /&gt;
&lt;br /&gt;
'''3)''' Теперь вбиваем сами текстовички в файле gamedata/config/text/rus/stable_dialogs_escape.xml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Т.е нам надо в файле stable_dialogs_escape.xml вставить такую конструкцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;string id=&amp;quot;escape_trader_letat_gusi_0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Сидрыч а почему это у тебя зеленые человечки, что по столу бегают, такие худые?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_letat_gusi_1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Чего?!!&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_letat_gusi_2&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Ты их совсем, совсем не кормишь?&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_letat_gusi_3&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;В следующий раз, как пойдешь в зону, бери-ка  вместо водяры побольше антирада. А то мало что таким перегаром дышишь, уже до зеленых человечков долечился… Шутник.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в любом месте между уже существующими string id &lt;br /&gt;
	&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;string id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
              сюда&lt;br /&gt;
	&amp;lt;string id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Но не внутрь одного из существующих string id&lt;br /&gt;
	&amp;lt;pre&amp;gt;&lt;br /&gt;
      &amp;lt;string id=&amp;quot;*** &amp;quot;&amp;gt;&lt;br /&gt;
               не сюда&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
После сохранения изменений, у нас все готово. Можно грузить игру и смотреть что получилось.&lt;br /&gt;
&lt;br /&gt;
===Практический пример не работает со вторым патчем - решение проблемы===&lt;br /&gt;
&lt;br /&gt;
По крайней мере со вторым патчем несовместимо условие &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;precondition&amp;gt;escape_dialog.trader_has_talk_info_wr&amp;lt;/precondition&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
использование этого условия приведет к вылету &lt;br /&gt;
&lt;br /&gt;
так как со вторым патчем из файла escape_dialog.script была удалена функция: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function trader_has_talk_info_wr( trader, actor ) &lt;br /&gt;
   return true &lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
можно либо воткнуть эту функцию обратно в escape_dialog.script &lt;br /&gt;
&lt;br /&gt;
либо использовать другие более мение подходящие условия, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;precondition&amp;gt;escape_dialog.trader_alredy_give_job&amp;lt;/precondition&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Дополение от XiaNi====&lt;br /&gt;
По поводу &amp;lt;precondition&amp;gt; в данном примере.. он тут реально вообще не нужен тем более что возвращает всегда одно и то же... тут уж или реально надо использовать функцию которая хоть чтото проверяет нужное для диалога... а так... диалог и так будет активным если убрать &amp;lt;precondition&amp;gt; (в данном случае это 100%)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;has_info&amp;gt; и &amp;lt;dont_has_info&amp;gt; это условия на присутствие и соответственно отсутствие у игрока &amp;quot;информации&amp;quot; которая на самом деле всеголишь флажок что пользователь слышал о чемто или видел чтото который выдается:&lt;br /&gt;
1. условиями &amp;quot;логики&amp;quot; прописанной объектам или неписям.&lt;br /&gt;
2. скриптами&lt;br /&gt;
3. диалогами через например &amp;quot;&amp;lt;give_info&amp;gt;tutorial_end&amp;lt;/give_info&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
В принципе &amp;lt;has_info&amp;gt; соответствует скриптовому аналогу функции has_alife_info&lt;br /&gt;
так например &amp;quot;&amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&amp;quot; можно заменить на &amp;quot;&amp;lt;precondition&amp;gt;check_tutor_end&amp;lt;/precondition&amp;gt;&amp;quot; и дописать в &amp;quot;escape_dialog.script&amp;quot; строчки :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function check_tutor_end(actor, npc)&lt;br /&gt;
if	has_alife_info(&amp;quot;tutorial_end&amp;quot;)&lt;br /&gt;
	then&lt;br /&gt;
	 return true&lt;br /&gt;
        else&lt;br /&gt;
         return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
в которой мы проверяем есть ли информация tutorial_end у игрока.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
&lt;br /&gt;
* [[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
* [[Участник:Keha|Keha]]&lt;br /&gt;
* [[Участник:XiaNi|XiaNi]]&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2-2</id>
		<title>SoC. Создание квестов-2</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2-2"/>
				<updated>2008-08-10T09:29:12Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вступление&lt;br /&gt;
&lt;br /&gt;
Перед изучением этого урока советую освоить находящийся несколько выше урок &amp;quot;Создание новых веток диалогов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Небольшие правила, следуя которым, можно сберечь себе много нервов:&lt;br /&gt;
&lt;br /&gt;
- всегда сохраняйте резервные копии модифицируемых файлов&lt;br /&gt;
- старайтесь почаще тестировать внесенные изменения - так проще понять, в чем вы ошиблись (если активно работать пару часов без остановки, не разу не протетировав внесенные изменения, то потом будет очень сложно понять - почему же, черт возьми, игра вылетает при попытке поговорить с Сидоровичем?)&lt;br /&gt;
- перед началом работы создайте новую папку gamedata, а свои моды спрячьте подальше: работать с &amp;quot;чистой&amp;quot; версией игры не в пример удобнее и проще; особенно противопоказан Repair Mod, который с новыми диалогами часто конфликтует*&lt;br /&gt;
&lt;br /&gt;
* о том, как создать диалоги и квесты, исключающие возможность конфликта с другими подобными модами, см. часть 4. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создание базового диалога&lt;br /&gt;
&lt;br /&gt;
Начнем создание квеста с написания небольшого линейного диалога. Это будет выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
Меченый: Сидрыч, давай поговорим о... водке.&lt;br /&gt;
Сидорович: О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?! Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а? Вроде у Волка на чердаке была, что-то он однажды об этом упоминал...&lt;br /&gt;
Меченый: Да сбегаю я сейчас, сбегаю... алкоголик, блин.&lt;br /&gt;
Сидорович: Беги, беги... сил уж нет ждать, давай, родимый.&lt;br /&gt;
&lt;br /&gt;
После третьей фразы у нас будет активироваться квест &amp;quot;Принеси водки Сидоровичу&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Открываем файл gamedata\config\gameplay\character_desc_escape.xml и проводим такие манипуляции:&lt;br /&gt;
&lt;br /&gt;
- находим строку &amp;quot;&amp;lt;actor_dialog&amp;gt;escape_trader_done_blockpost_box&amp;lt;/actor_dialog&amp;gt;&amp;quot;&lt;br /&gt;
- добавляем после нее новую - &amp;quot;&amp;lt;actor_dialog&amp;gt;escape_trader_oops&amp;lt;/actor_dialog&amp;gt;&amp;quot;&lt;br /&gt;
- сохраняем изменения&lt;br /&gt;
&lt;br /&gt;
Мы добавили к Диалогу с Сидоровичем новую ветку, вернее, только ссылку на неё. Сама внутренняя структура ветки хранится в файле gamedata\config\gameplay\dialogs_escape.xml, который мы открываем и производим:&lt;br /&gt;
&lt;br /&gt;
- находим в любом месте файла промежуток между &amp;lt;/dialog&amp;gt; и &amp;lt;dialog id=&amp;quot;...&amp;quot;&amp;gt;&lt;br /&gt;
- засовываем туда такую конструкцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;lt;dialog id=&amp;quot;escape_trader_oops&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;precondition&amp;gt;escape_dialog.trader_alredy_give_job&amp;lt;/precondition&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;escape_trader_oops_0&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;escape_trader_oops_1&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;escape_trader_oops_2&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;escape_trader_oops_3&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- сохраняем изменения&lt;br /&gt;
&lt;br /&gt;
Теперь у нас прописана структура новой ветки диалога. Осталось сделать еще одну вещь - прописать строки, которые будут отображаться вместо &amp;quot;escape_trader_oops_...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Для этого откроем файл gamedata\config\text\rus\stable_dialogs_escape.xml и сделаем следующее:&lt;br /&gt;
&lt;br /&gt;
- находим любой удобный промежуток между &amp;lt;/string&amp;gt; и &amp;lt;string id=&amp;quot;...&amp;quot;&amp;gt;&lt;br /&gt;
- прописываем туда следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;escape_trader_oops_0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Сидрыч, давай поговорим о... водке.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_oops_1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?! &lt;br /&gt;
Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а? &lt;br /&gt;
Вроде у Волка на чердаке была, что-то он однажды об этом упоминал...&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_oops_2&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Да сбегаю я сейчас, сбегаю... алкоголик, блин.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
	&amp;lt;string id=&amp;quot;escape_trader_oops_3&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Беги, беги... сил уж нет ждать, давай, родимый.&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- сохраняем изменения&lt;br /&gt;
&lt;br /&gt;
Всё. Диалог готов. Можно грузить игру и смотреть, работает ли новая ветка.&lt;br /&gt;
А теперь будем прикреплять к этому безобразию квест &amp;quot;&amp;quot;Принеси водки Сидоровичу&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Создание базового квеста&lt;br /&gt;
&lt;br /&gt;
Активацию квеста в диалог прикрепить достаточно просто. Проводим с файлом gamedata\config\gameplay\ dialogs_escape.xml следующие манипуляции:&lt;br /&gt;
&lt;br /&gt;
- добавляем содержимое фразы &amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt; следующим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
&amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;escape_trader_oops_2&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;give_info&amp;gt;kvest_vodka_started&amp;lt;/give_info&amp;gt;&lt;br /&gt;
&amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- сохраняем изменения&lt;br /&gt;
&lt;br /&gt;
Теперь после фразы Меченого &amp;quot;Да сбегаю я сейчас, сбегаю...&amp;quot; Сидорович таки всучивает нам квест &amp;quot;Принеси водку&amp;quot;. Но не спешите тестировать изменения. Мы добавили в диалог упоминание о квесте, хотя он еще не создан.&lt;br /&gt;
&lt;br /&gt;
Исправим это недоразумение. Откройте файл gamedata\config\gameplay\tasks_escape.xml и в начале файла создайте такую конструкцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;game_task id=&amp;quot;esc_test_vodka_task&amp;quot;&amp;gt;&lt;br /&gt;
        	&amp;lt;title&amp;gt;Принести водки&amp;lt;/title&amp;gt; &amp;lt;!-- заголовок квеста --&amp;gt;&lt;br /&gt;
        	&amp;lt;objective&amp;gt;&lt;br /&gt;
            		&amp;lt;text&amp;gt;Принести водки Сидоровичу&amp;lt;/text&amp;gt;&lt;br /&gt;
            		&amp;lt;icon&amp;gt;ui_iconsTotal_find_item&amp;lt;/icon&amp;gt;&lt;br /&gt;
            		&amp;lt;infoportion_complete&amp;gt;test_quest_vodka_otdana&amp;lt;/infoportion_complete&amp;gt;        	&amp;lt;/objective&amp;gt;&lt;br /&gt;
        	&amp;lt;objective&amp;gt;&lt;br /&gt;
            		&amp;lt;text&amp;gt;Вернуться с водкой обратно&amp;lt;/text&amp;gt; &lt;br /&gt;
            		&amp;lt;map_location_type hint=&amp;quot;esc_dinamit_to_volk&amp;quot;&amp;gt;green_location&amp;lt;/map_location_type&amp;gt; &lt;br /&gt;
            		&amp;lt;object_story_id&amp;gt;Escape_novice_lager_volk&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
            		&amp;lt;infoportion_complete&amp;gt;test_quest_vodka_otdana&amp;lt;/infoportion_complete&amp;gt;&lt;br /&gt;
        	&amp;lt;/objective&amp;gt;&lt;br /&gt;
        	&amp;lt;objective&amp;gt;&lt;br /&gt;
            		&amp;lt;text&amp;gt;Найти водку на чердаке&amp;lt;/text&amp;gt;&lt;br /&gt;
            		&amp;lt;map_location_type hint=&amp;quot;escape_trader&amp;quot;&amp;gt;blue_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
            		&amp;lt;object_story_id&amp;gt;Escape_Trader&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
            		&amp;lt;infoportion_complete&amp;gt;test_quest_vodka_otdana&amp;lt;/infoportion_complete&amp;gt;&lt;br /&gt;
        	&amp;lt;/objective&amp;gt;&lt;br /&gt;
&amp;lt;/game_task&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы прописали данные о квесте: название, иконку, строки заданий, расположение маркеров и т.д.&lt;br /&gt;
&lt;br /&gt;
К этому файлу мы еще вернемся, т.к. в этом варианте многое проставлялось не иначе как от балды. Я еще подумаю, как заставить задание &amp;quot;Вернуться с водкой обратно&amp;quot; появиться в PDA, а то оно что-то не желает явить себя народу... впрочем, ладно, главное, что все работает и не вылетает. А исправление столь мелких багов - дело десятое. Продолжим.&lt;br /&gt;
&lt;br /&gt;
Откроем файл gamedata\config\gameplay\info_l01escape.xml и зарегистрируем до того отсутствовавшие в игре типы условий (они нам еще пригодятся для завершения работы над квестом):&lt;br /&gt;
&lt;br /&gt;
- после строки &amp;lt;game_information_portions&amp;gt; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;info_portion id=&amp;quot;test_quest_vodka_otdana&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;info_portion id=&amp;quot;kvest_vodka_started&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;task&amp;gt;esc_test_vodka_task&amp;lt;/task&amp;gt;&lt;br /&gt;
&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;info_portion id=&amp;quot;otkazalsya_prinesty_vodku&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С прописыванием условий - всё.&lt;br /&gt;
&lt;br /&gt;
Теперь займемся одной небольшой, но нужной вещью - прописыванием экранных подсказок, которые высвечиваются при получении/выполнении этапа/завершении задания.&lt;br /&gt;
&lt;br /&gt;
Для этого откроем файл gamedata\config\text\rus\string_table_tasks_escape.xml и пропишем там:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    &amp;lt;string id=&amp;quot;esc_test_prinesti_vodku&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Принести бутылку водки&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;string id=&amp;quot;esc_test_prinesti_vodku_1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Найти водку на чердаке у Волка&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/string&amp;gt;&lt;br /&gt;
    &amp;lt;string id=&amp;quot;esc_test_prinesti_vodku_2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Принести бутылку водки Сидоровичу&amp;lt;/text&amp;gt;&lt;br /&gt;
    &amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь можно тестировать, что получилось. Сверяем результаты:&lt;br /&gt;
&lt;br /&gt;
- по окончанию разговора про водку у вас появляется новое задание&lt;br /&gt;
- в задании маркером отмечен Волк (ближайший к чердаку маркер, потому и отмечен)&lt;br /&gt;
- при получении задания на экране высвечивается уведомление&lt;br /&gt;
&lt;br /&gt;
Можно приступать к третьей стадии. Что мы забыли? Правильно - возможность выполнить квест.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация возможности выполнить квест&lt;br /&gt;
&lt;br /&gt;
На самом деле - все просто. Все условия и т.д. уже нами созданы, осталось только применить их в диалоге. Давайте несколько изменим его структуру, сделаем его ветвистым и функциональным:&lt;br /&gt;
&lt;br /&gt;
0. Сидрыч, давай поговорим о... водке. ( переход к 1)&lt;br /&gt;
1. О водке? Да о какой водке сейчас можно говорить? Вокруг оглянись. Видишь хоть одну бутылку?! Вот. Именно. Кончилась она у меня, родимая, кончилась... помоги, принесешь, а? Вроде у Волка на чердаке была, что-то он однажды об этом упоминал... ( выбор - переход к 2, 4, 5; изначально доступен только 2 вариант )&lt;br /&gt;
2. Да сбегаю я сейчас, сбегаю... алкоголик, блин. ( получение квеста, переход к 3, после этого перестает быть доступен )&lt;br /&gt;
3. Беги, беги... сил уж нет ждать, давай, родимый. ( конец, переход к списку веток Сидоровича )&lt;br /&gt;
4. Вот она, твоя бутылка водки. Ну, вернее, не твоя, а Волка... ( появляется только при наличии водки в инвентаре, при выборе водка передается Сидоровичу, квест выполняется, идет переход к 7 )&lt;br /&gt;
5. Извини, Сидрыч, я пока еще не раздобыл, терпи... ( появляется только если взять квест, переход к 6 )&lt;br /&gt;
6. А ну марш отсюда! Без бутылки пришел... ууу, вражина... ( переход к 8 )&lt;br /&gt;
7. Теперь моя будет, Меченый! Ты так Волку и передай. Спасибо, выручил... держи награду. Нееет, это не водка, обойдешься... денег дам. ( выдача награды, переход к 8 )&lt;br /&gt;
8. Ну тебя в пень... ( конец, переход к списку веток Сидоровича )&lt;br /&gt;
&lt;br /&gt;
А вот так это будет выглядеть в файле gamedata\config\gameplay\dialogs_escape.xml:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_oops&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;precondition&amp;gt;escape_dialog.trader_alredy_give_job&amp;lt;/precondition&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;phrase_list&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_0&amp;lt;/text&amp;gt;&lt;br /&gt;
                              	&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
                               	&amp;lt;text&amp;gt;escape_trader_oops_1&amp;lt;/text&amp;gt;&lt;br /&gt;
                                &amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;4&amp;lt;/next&amp;gt;&lt;br /&gt;
				&amp;lt;next&amp;gt;5&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;dont_has_info&amp;gt;kvest_vodka_started&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
                                &amp;lt;text&amp;gt;escape_trader_oops_2&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;give_info&amp;gt;kvest_vodka_started&amp;lt;/give_info&amp;gt;&lt;br /&gt;
                                &amp;lt;next&amp;gt;3&amp;lt;/next&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
                     &amp;lt;phrase id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
                                &amp;lt;text&amp;gt;escape_trader_oops_3&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
                     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
		     &amp;lt;phrase id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_4&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;precondition&amp;gt;escape_dialog.have_a_vodka&amp;lt;/precondition&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;escape_dialog.otday_vodku&amp;lt;/action&amp;gt;&lt;br /&gt;
                              	&amp;lt;next&amp;gt;7&amp;lt;/next&amp;gt;&lt;br /&gt;
		     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
		     &amp;lt;phrase id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;has_info&amp;gt;kvest_vodka_started&amp;lt;/has_info&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_5&amp;lt;/text&amp;gt;&lt;br /&gt;
                              	&amp;lt;next&amp;gt;6&amp;lt;/next&amp;gt;&lt;br /&gt;
		     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
		     &amp;lt;phrase id=&amp;quot;6&amp;quot;&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_6&amp;lt;/text&amp;gt;&lt;br /&gt;
                              	&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
		     &amp;lt;phrase id=&amp;quot;7&amp;quot;&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_7&amp;lt;/text&amp;gt;&lt;br /&gt;
				&amp;lt;give_info&amp;gt;test_quest_vodka_otdana&amp;lt;/give_info&amp;gt;&lt;br /&gt;
				&amp;lt;action&amp;gt;escape_dialog.transfer_deneg&amp;lt;/action&amp;gt;&lt;br /&gt;
                              	&amp;lt;next&amp;gt;8&amp;lt;/next&amp;gt;&lt;br /&gt;
		     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
		     &amp;lt;phrase id=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
                             	&amp;lt;text&amp;gt;escape_trader_oops_8&amp;lt;/text&amp;gt;&lt;br /&gt;
		     &amp;lt;/phrase&amp;gt;&lt;br /&gt;
        &amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
    &amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь добавим в игру скрипты &amp;quot;передача денег&amp;quot; и &amp;quot;передача водки&amp;quot;. Откройте файл gamedata\scripts\escape_dialog.script и перед разделителем &amp;quot;Trader&amp;quot; добавьте туда следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function transfer_deneg (npc, actor)&lt;br /&gt;
    dialogs.relocate_money(stalker, 8000, &amp;quot;in&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
   &lt;br /&gt;
function otday_vodku (npc, actor)&lt;br /&gt;
    dialogs.relocate_item_section(npc, &amp;quot;vodka&amp;quot;, &amp;quot;out&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function have_a_vodka (stalker, player)&lt;br /&gt;
    return stalker:object (&amp;quot;vodka&amp;quot;) ~= nil&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готово. Запускайте игру и любуйтесь.&lt;br /&gt;
&lt;br /&gt;
Есть несколько багов, кто исправит, тому пирожок =)&lt;br /&gt;
Итак:&lt;br /&gt;
&lt;br /&gt;
- второй пункт задания в PDA не отображается&lt;br /&gt;
- задание не обновляется при подборе бутылки водки (как это реализовать, в принципе понятно, но это как-нибудь в другой раз, сейчас лень)&lt;br /&gt;
- премиальные не перечисляются Меченому (уу, Сидорович, жид такой)&lt;br /&gt;
&lt;br /&gt;
Для тех, кто еще с нами - сейчас мы модифицируем квест так, чтобы исключить конфликты с другими подобными модами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Реализация совместимости&lt;br /&gt;
&lt;br /&gt;
Из-за чего наш мод не может работать вместе с аналогичными ему модами? Да потому, что файлы dialogs_escape.xml и некоторые другие у них пересекаются. Поэтому выделим их отдельно от основных диалогов:&lt;br /&gt;
&lt;br /&gt;
Вместо dialogs_escape.xml мы будем испольховать новый - dialogs_new.xml&lt;br /&gt;
Вместо stable_dialogs_escape.xml мы будем использовать файл stable_dialogs_new.xml (важно! не знаю почему, но он должен лежать в text\..., а не в text\rus\...)&lt;br /&gt;
&lt;br /&gt;
Соответственно, весь реализованный нами новый контент перекидываем в пустые файлы (соблюдая форматирование), подчистив за собой на старом месте.&lt;br /&gt;
&lt;br /&gt;
Единственное, что останется сделать после установки того же Repair Mod'а - заново добавить ветку диалога Сидоровичу в файле character_desc_escape.xml. Остальное в новом варианте нашего мода переписывать не придется - для диалогов отведено три файла.&lt;br /&gt;
&lt;br /&gt;
Остальные файлы относятся уже к квестовой части и ни с чем пересекаться не могут - где вы видели другие моды с новыми квестами? Я - нет.&lt;br /&gt;
&lt;br /&gt;
Откройте файл gamedata\config\localization.ltx и зарегистрируйте там stable_dialogs_escape.ltx.&lt;br /&gt;
Потом откройте файл gamedata\config\system.ltx и в разделе &amp;quot;Dialogs&amp;quot; в конце строки (после dialogs_aes) пропишите dialogs_new (без &amp;quot;.ltx&amp;quot;!).&lt;br /&gt;
&lt;br /&gt;
Все. Теперь ваши диалоги будут подгружаться из сторонних файлов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Отдельное спасибо:&lt;br /&gt;
&lt;br /&gt;
XiaNi - за страшный и непричесанный, но работающий пример квеста, на основе которого я и освоил принципы квестостроения =)&lt;br /&gt;
Keha – за урок по созданию новых диалогов&lt;br /&gt;
Dйja Vu – за создание wiki-ресурса&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Дополнения&lt;br /&gt;
&lt;br /&gt;
1. Если изменить шапку нашего диалога в файле dialogs_escape.xml со старого варианта на такой, то ветка исчезнет после выполнения задания:&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;escape_trader_oops&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;precondition&amp;gt;escape_dialog.trader_alredy_give_job&amp;lt;/precondition&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;tutorial_end&amp;lt;/has_info&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;test_quest_vodka_otdana&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
          &amp;lt;phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		...&lt;br /&gt;
&lt;br /&gt;
Не тестировал. Дело за вами =)&lt;br /&gt;
&lt;br /&gt;
2. Разнообразить речь обычных сталкеров не так просто, как кажется – они не выделены в отдельных людей, а используют один и тот же набор реплик, зависящий от локации/мастерства сталкера. Но при этом в пункте &amp;quot;Что можешь интересного рассказать&amp;quot; у каждого сталкера история разная.&lt;br /&gt;
&lt;br /&gt;
Кто сможет разузнать, откуда берутся тексты для этих реплик, тому буду очень благодарен... &lt;br /&gt;
&lt;br /&gt;
3. Неплохо бы добавить реплики гопникам, но это уже на стадии предположений. На данный момент реплик у них нет, так что если вы, например, играете с модом &amp;quot;Улучшенные взаимоотношения&amp;quot; (или как там его) или какими-либо иными способами добились нейтрального/дружеского отношения с их стороны, то при потытке заговорить игра вылетит.&lt;br /&gt;
&lt;br /&gt;
В принципе, можно зарегистрировать новые базы диалогов для бандитов (как было описано выше), созданные по образцу таковых у сталкеров. Но как эти наборы диалогов связать с гуляющими по карте гопниками - вопрос.&lt;br /&gt;
&lt;br /&gt;
У меня есть подозрения, что набор диалогов прописывается персонажу в его свойствах в файле all.spawn. Прошу специалистов по spawn-ресурсам посмотреть, имеются у NPC такие свойства или нет.&lt;br /&gt;
&lt;br /&gt;
Фух, вроде всё...&lt;br /&gt;
&lt;br /&gt;
Всем спасибо, занавес =)&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана:&lt;br /&gt;
[[Участник:BAC9-FLCL|BAC9-FLCL]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи участников]]&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2</id>
		<title>SoC. Создание квестов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%B2%D0%B5%D1%81%D1%82%D0%BE%D0%B2"/>
				<updated>2008-08-10T09:27:30Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.50.109: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создание квестов и диалогов==&lt;br /&gt;
===Создание базового диалога===&lt;br /&gt;
&lt;br /&gt;
Итак, приступим к созданию диалога, в котором нам будет выдаваться новый квест.&lt;br /&gt;
Участвующие лица: Сидорович (С) и Меченый (М)&lt;br /&gt;
&lt;br /&gt;
'''М:''' Здравствуй, Сидорыч! Есть работенка?&lt;br /&gt;
&lt;br /&gt;
'''С:''' О, неужели заглянул к нам на огонек, Меченый? Ладно... ближе к телу... эээ, к делу. У меня к тебе следующая просьба: сбегай к Волку, у него что-то намечалось. &lt;br /&gt;
&lt;br /&gt;
'''М:''' Без проблем! Уже бегу.&lt;br /&gt;
&lt;br /&gt;
Будем считать, определились с фразами базового диалога. Теперь необходимо добавить его в соответствующем виде, чтобы игре он был «понятен».&lt;br /&gt;
&lt;br /&gt;
Создание «скелета» диалога.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы добавить наш диалог, необходимо открыть для редактирования файл gamedata\config\gameplay\dialogs_escape.xml&lt;br /&gt;
&lt;br /&gt;
Для тех, кто знаком с языком XML структура данного файла будет ясна с первого взгляда. Но, поподробнее об этом. &lt;br /&gt;
&lt;br /&gt;
Для того, чтобы добавить в игру диалог предусмотрены так называемые тэги. В данном случае, тэгами являются такие конструкции:&lt;br /&gt;
&lt;br /&gt;
'''1.''' &amp;lt;tt&amp;gt;&amp;lt;game_dialogs&amp;gt;&amp;lt;/tt&amp;gt; и закрывающий к нему - &amp;lt;tt&amp;gt;&amp;lt;/game_dialogs&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.''' &amp;lt;tt&amp;gt;&amp;lt;dialog id = &amp;quot;&amp;quot;&amp;gt; закрывающий - &amp;lt;/dialog&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''3.''' &amp;lt;tt&amp;gt;&amp;lt;phrase_list&amp;gt; - &amp;lt;/phrase_list&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''4.''' &amp;lt;tt&amp;gt;&amp;lt;phrase id = &amp;quot;&amp;quot;&amp;gt; - &amp;lt;/phrase&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.''' &amp;lt;code&amp;gt;&amp;lt;text&amp;gt; &amp;lt;/text&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''6.''' &amp;lt;tt&amp;gt;&amp;lt;next&amp;gt; &amp;lt;/next&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В принципе, этих конструкций уже достаточно для того, чтобы создать диалог. Но, диалог, созданный на основе этих конструкций, не сможет стать основой для нового квеста. Для того, чтобы во время диалога вам выдавался квест, есть соответствующий тэг. Но об этом – чуть позже.&lt;br /&gt;
&lt;br /&gt;
Поясню, что обозначает каждый тэг в отдельности.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Определяет содержимое файла (в данном случае, говорит о том, что файл содержит диалоги);&lt;br /&gt;
&lt;br /&gt;
'''2.''' Определяет новый диалог с &amp;lt;tt&amp;gt;id = &amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;. Где содержимое кавычек есть идентификатор диалога. Идентификатор диалога задается в файлах типа character_description_***.xml ;&lt;br /&gt;
&lt;br /&gt;
'''3.''' Этот тэг говорит XML-парсеру игры о том, что далее следуют фразы диалога. Иными словами, между &amp;lt;tt&amp;gt;&amp;lt;phrase_list&amp;gt;&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;&amp;lt;/phrase_list&amp;gt;&amp;lt;/tt&amp;gt;  содержатся фразы диалога;&lt;br /&gt;
&lt;br /&gt;
'''4.''' Этот тэг определяет фразу с &amp;lt;tt&amp;gt;id = &amp;quot;&amp;quot;&amp;lt;/tt&amp;gt;. Внутри кавычек содержится идентификатор фразы (ВНИМАНИЕ: идентификатором в данном случае могут быть ТОЛЬКО цифры);&lt;br /&gt;
&lt;br /&gt;
'''5.''' Внутри этих двух тэгов содержится ссылка на соответствующий данной фразе текст (пример, esc_trader_talk_info_123). Сам текст берется из файлов типа stable_dialogs_*****.xml, в котором содержатся все фразы в текстовом виде. О создании текста фразы поговорим позже;&lt;br /&gt;
&lt;br /&gt;
'''6.''' Внутри этого тэга содержится ссылка (в числовом формате) на следующую (или следующие) фразы.&lt;br /&gt;
&lt;br /&gt;
Теперь приступим к тэгам, позволяющим производить какие-то действия во время диалога.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;precondition&amp;gt; &amp;lt;/precondition&amp;gt;&amp;lt;/tt&amp;gt;. Представляет собой предусловие, в случае выполнения которого (то есть предусловие вернуло ИСТИНУ) данный диалог, или фраза будут появляться в списке доступных во время игры у NPC. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;action&amp;gt; &amp;lt;/action&amp;gt;&amp;lt;/tt&amp;gt;.  Данный тэг позволяет производить какое-либо действие во время диалога (например, передачу предметов между общающимися... так же позволяет производить более сложные действия). Внутри тэга располагается ссылка на какую-либо функцию (например, dialogs. actor_set_dolg сделает игрока членом группировки Долг). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;give_info&amp;gt; &amp;lt;/give_info&amp;gt;&amp;lt;/tt&amp;gt;. Позволяет  выдавать игроку во время диалога так называемые info_portion'ы (кстати, инфопоршны можно выдавать так же и через &amp;lt;action&amp;gt;, только это потребует создания специальной функции). info_portion – является основой для квестов, info_portion’ы определяются в файлах типа info****.xml. Инфопоршны могут, как начинать квест, так и заканчивать (завершать) его.  Так же, с помощью инфопоршнов можно отслеживать действия игрока, для того, чтобы, например, вывести в нужное время диалог.&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;has_info&amp;gt; &amp;lt;/has_info&amp;gt;&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;&amp;lt;dont_has_info&amp;gt; &amp;lt;/dont_has_info&amp;gt;&amp;lt;/tt&amp;gt; являются предусловиями для текущей фразы/диалога. Первый тэг проверяет наличие данного инфопоршна у игрока, второй – отсутствие.&lt;br /&gt;
&lt;br /&gt;
Ну что, теперь мы можем создать диалог, в котором нам будет выдаваться квест. Но мы не создали самих info_portion'оф, которые позволяет активировать квест.&lt;br /&gt;
&lt;br /&gt;
===Создание info_portion'ов===&lt;br /&gt;
&lt;br /&gt;
Итак, открываем файл gamedata\config\gameplay\ info_l01escape.xml. Что мы там видим? Правильно, все ту же структуру XML. &lt;br /&gt;
В данном файле нас интересуют только два тэга:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;info_portion id = &amp;quot;&amp;quot;&amp;gt; &amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;task&amp;gt; &amp;lt;/task&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первый объявляет сам info_portion. Второй – объявляет задание (идентификатор задания id содержится внутри тэга &amp;lt;task&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Для примера, создадим 3 info_portion, которые понадобятся нам для будущего квеста:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;info_portion id = &amp;quot;new_task_started&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;task&amp;gt;new_task&amp;lt;/task&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это инфопоршн с именем new_task_started. Он активирует квест с именем new_task.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;info_portion id = &amp;quot;player_talked_with_wolf&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;info_portion id = &amp;quot;player_complete_new_task&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Создание нового квеста===&lt;br /&gt;
&lt;br /&gt;
Сами квесты содержаться в файлах типа tasks_*****.xml&lt;br /&gt;
&lt;br /&gt;
Откроем файл  gamedata\config\gameplay\tasks_escape.xml. Структура – все тот же XML.&lt;br /&gt;
&lt;br /&gt;
Для примера исследуем уже существующий квест:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;game_task id=&amp;quot;esc_help_wounded_from_raid&amp;quot; prio=&amp;quot;485&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;esc_help_wounded_from_raid&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_help_wounded_from_raid_0&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_iconsTotal_esc_help_wounded_from_raid&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;function_complete&amp;gt;escape_tasks.task_fox_complete&amp;lt;/function_complete&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_set_complete&amp;gt;garbage_meetstalker_start&amp;lt;/infoportion_set_complete&amp;gt;&lt;br /&gt;
		&amp;lt;article&amp;gt;esc_fox_help&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;/objective&amp;gt;&lt;br /&gt;
		&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_help_wounded_from_raid_1&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;map_location_type hint=&amp;quot;esc_fox&amp;quot;&amp;gt;green_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
		&amp;lt;object_story_id&amp;gt;Escape_stalker_from_raid&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_complete&amp;gt;escape_fox_heal&amp;lt;/infoportion_complete&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_fail&amp;gt;esc_dogs_return&amp;lt;/infoportion_fail&amp;gt;&lt;br /&gt;
	&amp;lt;/objective&amp;gt;&lt;br /&gt;
		&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_help_wounded_from_raid_2&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;map_location_type hint=&amp;quot;esc_fox&amp;quot;&amp;gt;green_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
		&amp;lt;object_story_id&amp;gt;Escape_stalker_from_raid&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_complete&amp;gt;escape_stalker_done&amp;lt;/infoportion_complete&amp;gt;&lt;br /&gt;
	&amp;lt;/objective&amp;gt;&lt;br /&gt;
&amp;lt;/game_task&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По кусочкам:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;game_task id=&amp;quot;esc_help_wounded_from_raid&amp;quot; prio=&amp;quot;485&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/game_task&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задает имя (id) нового квеста. В данном случае, esc_help_wounded_from_raid. prio = &amp;quot;&amp;quot; задает приоритет задачи. Чем выше приоритет, тем больше вероятность того, что текущий маркер квеста будет переключен на ваше задание.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;esc_help_wounded_from_raid&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задает заголовок квеста. Т. е. его название. Название можно прописать в виде текста, либо в виде ссылки. В данном случае используется ссылка на текст, который хранится в файле string_table_tasks_escape.xml. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;function_complete&amp;gt;escape_tasks.task_fox_complete&amp;lt;/function_complete&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызывает функцию из файла escape_tasks.script под именем task_fox_complete. При выполнении данной функции дается info_portion, который завершает данную подзадачу, в случае, если все условия функции соблюдаются.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;infoportion_complete&amp;gt;escape_fox_heal&amp;lt;/infoportion_complete&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Текущее подзадание будет завершено в случае, если игроку будет дан этот info_portion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;infoportion_fail&amp;gt;esc_dogs_return&amp;lt;/infoportion_fail&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Текущее подзадание будет провалено в случае, если игроку будет дан этот info_portion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;map_location_type hint=&amp;quot;esc_fox&amp;quot;&amp;gt;green_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создает указатель на карте с подсказкой esc_fox и типом green_location. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;object_story_id&amp;gt;Escape_stalker_from_raid&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указывает на sid из файла gamedata\config\game_story_ids.ltx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;infoportion_set_complete&amp;gt;garbage_meetstalker_start&amp;lt;/infoportion_set_complete&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Автоматически устанавливает данную подзадачу в положение «Выполнено», если у игрока есть данный info_portion. //!!!!!!Не уверен – не пользовался не разу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;text&amp;gt;esc_help_wounded_from_raid_0&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Содержит описание подзадачи. Может содержать внутри как текст, так и ссылку на текст.&lt;br /&gt;
&lt;br /&gt;
Создадим задание, которое потребуется нам для диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;game_task id=&amp;quot;new_task&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;Поговорить с Волком&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Вернуться к Сидорычу&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;map_location_type hint=&amp;quot;escape_trader&amp;quot;&amp;gt;blue_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
		&amp;lt;object_story_id&amp;gt;Escape_Trader&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_complete&amp;gt;player_complete_new_task&amp;lt;/ infoportion_complete&amp;gt;&lt;br /&gt;
	&amp;lt;/objective&amp;gt;&lt;br /&gt;
	&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Поговорить с Волком&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_iconsTotal_find_item&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;map_location_type hint=&amp;quot;volk&amp;quot;&amp;gt;green_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
		&amp;lt;object_story_id&amp;gt;Escape_novice_lager_volk&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_complete&amp;gt;player_talked_with_wolf&amp;lt;/ infoportion_complete&amp;gt;&lt;br /&gt;
	&amp;lt;/objective&amp;gt;&lt;br /&gt;
	&amp;lt;objective&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Вернуться к Сидорычу&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;map_location_type hint=&amp;quot;escape_trader&amp;quot;&amp;gt;blue_location&amp;lt;/map_location_type&amp;gt;&lt;br /&gt;
		&amp;lt;object_story_id&amp;gt;Escape_Trader&amp;lt;/object_story_id&amp;gt;&lt;br /&gt;
		&amp;lt;infoportion_complete&amp;gt;player_complete_new_task&amp;lt;/ infoportion_complete&amp;gt;&lt;br /&gt;
	&amp;lt;/objective&amp;gt;&lt;br /&gt;
&amp;lt;/game_task&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Здесь же необходимо обязательно указать ссылку на иконку из файла ui_iconstotal, иначе при попытке заглянуть в раздел &amp;quot;Задания&amp;quot; в ПДА при взятии квеста будет происходить вылет. Для примера я проставил иконку поиска предмета.''&lt;br /&gt;
&lt;br /&gt;
Теперь создадим скелеты диалогов для нашего квеста. Потребуется три: один для Волка и два для Сидорыча.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;dialog id = &amp;quot;volk_new_quest&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;has_info&amp;gt;new_task_started&amp;lt;/has_info&amp;gt;&lt;br /&gt;
	&amp;lt;dont_has_info&amp;gt;player_talked_with_wolf&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
	&amp;lt;dont_has_info&amp;gt; player_complete_new_task &amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
	&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id = &amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;esc_volk_new_quest_0&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;esc_volk_new_quest_1&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;give_info&amp;gt;player_talked_with_wolf&amp;lt;/give_info&amp;gt;&lt;br /&gt;
			&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
		&amp;lt;/phrase&amp;gt;&lt;br /&gt;
		&amp;lt;phrase id = &amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text&amp;gt;esc_volk_new_quest_2&amp;lt;/text&amp;gt;&lt;br /&gt;
			&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dialog id = &amp;quot;esc_trader_new_quest&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;player_complete_new_task&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;player_talked_with_wolf&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_0&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_1&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;give_info&amp;gt;new_task_started&amp;lt;/give_info&amp;gt;&lt;br /&gt;
		&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_2&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt; &lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dialog id = &amp;quot;esc_trader_new_quest_complete&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;player_complete_new_task&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_complete_0&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_complete_1&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;give_info&amp;gt;player_complete_new_task&amp;lt;/give_info&amp;gt;&lt;br /&gt;
		&amp;lt;next&amp;gt;2&amp;lt;/next&amp;gt;&lt;br /&gt;
	&amp;lt;/phrase&amp;gt;&lt;br /&gt;
	&amp;lt;phrase id = &amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;esc_trader_new_quest_complete_2&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;action&amp;gt;dialogs.break_dialog&amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все «скелеты» добавляем в файл dialogs_escape.xml. Между &amp;lt;game_dialogs&amp;gt; и &amp;lt;dialog id=...&amp;gt;! &lt;br /&gt;
&lt;br /&gt;
''Внимательно следите за правильностью написания тэгов и ОДИНАКОВЫМ написанием идентификаций - как в файле с вашим новым диалогом, так и во всех других файлах, где используются тэги или ваши идентификации(например, идентификации фраз в файле с диалогом должны быть такими же, как и идентификации этих же фраз в файле с текстом). Иначе кроме серии вылетов с не всем понятными логами вы ничего не получите. У меня самого были проблемы при попытке активировать квест, выложеный в этой статье, так что пришлось кое-что поправить - и в тэгах, и в идентификаторах.''&lt;br /&gt;
&lt;br /&gt;
Примечание: посмотрите на уже готовые диалоги, которые создали разработчики игры – это облегчит вам жизнь.&lt;br /&gt;
&lt;br /&gt;
Теперь бежим в файл character_desc_escape.xml&lt;br /&gt;
&lt;br /&gt;
Ищем там NPC с &amp;lt;tt&amp;gt;id = &amp;quot;escape_trader&amp;quot;&amp;lt;/tt&amp;gt; и добавляем два новых &amp;lt;tt&amp;gt;&amp;lt;actor_dialog&amp;gt;&amp;lt;/actor_dialog&amp;gt;&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;esc_trader_new_quest_complete &amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;esc_trader_new_quest &amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Там же ищем NPC с id = &amp;quot;esc_wolf&amp;quot; и добавляем один актор_диалог:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt; volk_new_quest &amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примечание: &amp;lt;tt&amp;gt;&amp;lt;actor_dialog&amp;gt;&amp;lt;/tt&amp;gt; является диалогом, который активируется самим игроком по желанию. А &amp;lt;tt&amp;gt;&amp;lt;start_dialog&amp;gt;&amp;lt;/tt&amp;gt; активируется только при выполнении определенных условий, заданных в нем, и обычно недоступен.&lt;br /&gt;
&lt;br /&gt;
Осталось только добавить текст трех диалогов, чтобы наш квест стал полноценным. Открываем файл stable_dialogs_escape.xml и добавляем в него новый текст в таком виде:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;string id=&amp;quot;esc_trader_new_quest_complete_0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Все, я выполнил поручение Волка!&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_trader_new_quest_complete_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Молодец, Меченый. На тебя можно положиться.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_trader_new_quest_complete_2&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Рад был помочь, Сидорыч.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_trader_new_quest_0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt; Здравствуй, Сидорыч! Есть работенка?&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_trader_new_quest_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;О, неужели заглянул к нам на огонек, Меченый? Ладно… ближе к телу… эээ, к делу. У меня к тебе следующая &lt;br /&gt;
просьба: сбегай к Волку, у него что-то намечалось.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot; esc_trader_new_quest_2&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Без проблем! Уже бегу.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_volk_new_quest_0&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Здорово, Волк. Меня тут Сидорыч послал, говорит у тебя работа есть.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_volk_new_quest_1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Привет, Меченый. Верь ты ему больше, этому старому маразматику! Все спокойно сейчас. Так что иди к нему и &lt;br /&gt;
скажи, что все хорошо.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;esc_volk_new_quest_2&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;text&amp;gt;Все, ухожу.&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все! Поздравляю! Вы только что написали новый квест.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
&lt;br /&gt;
Статья создана: [[Участник:Fr3nzy|Fr3nzy]]&lt;br /&gt;
&lt;br /&gt;
== Внесённые изменения ==&lt;br /&gt;
*[[Участник:BerSerK™|BerSerK™]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.50.109</name></author>	</entry>

	</feed>