<?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=86.110.187.163&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=86.110.187.163&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/86.110.187.163"/>
		<updated>2026-04-29T20:41:37Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<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>2009-02-13T16:21:15Z</updated>
		
		<summary type="html">&lt;p&gt;86.110.187.163: /* Теория&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_id()&lt;br /&gt;
&lt;br /&gt;
Дальше идет гораздо более интересный параметр game_vertex_id, это почти то же самое, что и level_vertex_id, но (!) это глобальные величины!&lt;br /&gt;
Если level_vertex считается для уровня, то game_vertex_id - для всей игры, и нужен он для того, чтобы указать на какой карте спавнить объект (более вразумительного объяснения я не нашел).&lt;br /&gt;
&lt;br /&gt;
Соответственно, чтобы заспавнить что-нибудь на другой карте, достаточно указать game_vertex_id в четвертом параметре&lt;br /&gt;
Например:&lt;br /&gt;
&amp;lt;pre&amp;gt;db.actor:game_vertex_id()&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_vertex_id())&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почему 1, а не level_vertex_id? Проверено - разницы особой нет, какой level_vertex_id, хотя в некоторых случаях надо прописывать валидный вертекс, а то предмет может просто заспавнится не там, где планировалось... Но по большей части все проходит нормально и с единицей.&lt;br /&gt;
(Игнорирование level_vertex_id может приводить к проваливанию произведенных предметов/персонажей под землю.)&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_id(), 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;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Более простая функция спауна в одну строчку:&lt;br /&gt;
Пример:&lt;br /&gt;
alife():create(&amp;quot;stalker&amp;quot;,vector():set(0,0,0),1,135) -- спаунит сталкера на водокачке. (Игра ЧН, на уровне Болото)&lt;br /&gt;
&lt;br /&gt;
alife():create(section,position,levelvertex,gamevertex)&lt;br /&gt;
section - это секция предмета&lt;br /&gt;
position - Это его позиция (Через vector()) Брать в игре с помощью консольной команды rs_stats 1 или rs_cam_pos 1 (Тока в ЧН)&lt;br /&gt;
levelvertex - Пусть равно 1&lt;br /&gt;
gamevertex - Его Game Vertex, определяет уровень где будет спаун.&lt;br /&gt;
GV можно взять либо скриптом, либо через распакованный all.spawn.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&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>86.110.187.163</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_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F,_%D0%BF%D0%BE%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D0%BE%D0%B5_%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE</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_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F,_%D0%BF%D0%BE%D1%88%D0%B0%D0%B3%D0%BE%D0%B2%D0%BE%D0%B5_%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE"/>
				<updated>2009-01-22T15:44:28Z</updated>
		
		<summary type="html">&lt;p&gt;86.110.187.163: /* Настройка 3D Studio Max */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|align=right&lt;br /&gt;
 |''Автор:'' '''[[Участник:Neo|Neo][]]'''&lt;br /&gt;
 |}&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = center|&lt;br /&gt;
backgroundcolor	= rgb(235, 235, 255);|&lt;br /&gt;
image	=Question.gif|&lt;br /&gt;
heading	=Возникли вопросы/предложения|&lt;br /&gt;
message =Пиши [[Обсуждение:Создание уровня, пошаговое руководство|тут]].}}&lt;br /&gt;
__TOC__&lt;br /&gt;
В данном уроке попытаюсь рассказать об основах работы с Level Editor-ом пакета SDK, на примере создания простейшего уровня.&lt;br /&gt;
&lt;br /&gt;
В пакете SDK уже довольно много готовой геометрии, которую можно размещать на своём уровне, но иногда хочется вставить что-то своё, это можно сделать, смоделировав объект в пакете 3D моделирования Maya или 3D Studio Max.&lt;br /&gt;
&lt;br /&gt;
== Создание геометрии ==&lt;br /&gt;
Научить работать в 3D редакторах я не смогу, поэтому подробно остановлюсь только на процессах установки и настройки плагина, текстурировании и назначении шейдеров геометрии.&lt;br /&gt;
=== Установка и настройка плагина === &lt;br /&gt;
&lt;br /&gt;
==== Установка для Maya ==== &lt;br /&gt;
Установка плагина заключается в копировании:&lt;br /&gt;
*Всех файлов из папки scripts_plugins\scripts в папку C:\Documents and Settings\UserName\My Documents\maya\scripts&lt;br /&gt;
*Всех файлов из папки scripts_plugins\ver-ххх в папку C:\Program Files\Autodesk\Maya_ххх\bin&lt;br /&gt;
*Файла scripts_plugins\xray_path.ltx в папку C:\Program Files\Autodesk\Maya_ххх\bin&lt;br /&gt;
==== Установка для 3D Studio Max ====&lt;br /&gt;
[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=viewtheoned&amp;amp;lid=100 Качаем] плагин. Распаковываем архив, копируем содержимое папки '''plugin'''(именно plugin) в папку макса.&lt;br /&gt;
==== Настройка ====&lt;br /&gt;
Далее в официальном руководстве написано, что требуется диск Х, мы приложили батник для создания этого диска и т.д.&lt;br /&gt;
Возможно кто-то согласится с таким вариантом, но я решил просто отредактировать файл xray_path.ltx и не мучатся с батником и диском.&lt;br /&gt;
&lt;br /&gt;
Необходимо изменить только первые две строчки файла xray_path.ltx:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$server_root$	= false| false|	e:\sdk\(это путь до папки в которой у вас находится SDK)&lt;br /&gt;
$local_root$	= false| false|	e:\sdk\(это путь до папки в которой у вас находится SDK)&lt;br /&gt;
После некоторого шаманства заработало в таком виде:&lt;br /&gt;
$server_root$	= false| false|	C:\Program Files\X-Ray SDK\level_editor\&lt;br /&gt;
$local_root$	= false| false|	C:\Program Files\X-Ray SDK\level_editor\&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Всё, можно пользоваться плагином.&lt;br /&gt;
&lt;br /&gt;
=== Настройка единиц измерения ===&lt;br /&gt;
Для того, чтобы размеры объектов в редакторе совпадали с теми, что используются в X-Ray SDK, необходимо выполнить соответствующую настройку.&lt;br /&gt;
&lt;br /&gt;
==== Настройка Maya ====&lt;br /&gt;
&lt;br /&gt;
Для начала необходимо единицы измерения перевести в метры (по умолчанию в Maya 8.5 используются сантиметры). Делается это в 2 этапа:&lt;br /&gt;
* Заходим в меню Window -&amp;gt; Settings/Preferences -&amp;gt; Preferences. В открывшемся диалоге, в категории Settings, находим список Working Units -&amp;gt; Linear и выбираем Meter, как показано на скриншоте (шаг 1, шаг 2).&lt;br /&gt;
* Теперь, для удобства работы, в настройках камеры необходимо изменить дальность отображения с 10м на 1000м (смотри скриншот шаг 3)&lt;br /&gt;
{|&lt;br /&gt;
|valign=top|[[Изображение:SantimToM1.gif|thumb|400px|Шаг 1: выбираем указанный пункт меню]]&lt;br /&gt;
|valign=top|[[Изображение:SantimToM2.gif|thumb|400px|Шаг 2: выбираем еденицы измерения - метры]]&lt;br /&gt;
|valign=top|[[Изображение:SantimToM3.gif|thumb|400px|Шаг 3: настраиваем камеру]]&lt;br /&gt;
|}&lt;br /&gt;
Замечен глюк: после настройки камеры изображение может пропасть, в чём дело пока не разобрался, но ситуацию помогает победить выбор в меню камеры следующих двух пунктов:&lt;br /&gt;
* Panel -&amp;gt; Perspective -&amp;gt; New&lt;br /&gt;
* View -&amp;gt; Camera Settings -&amp;gt; View Compass&lt;br /&gt;
&lt;br /&gt;
==== Настройка 3D Studio Max ====&lt;br /&gt;
Настройка заключается только в выборе в качестве единиц измерения метров.&lt;br /&gt;
*Заходим в меню Customize -&amp;gt; Units Setup... В группе Display Unit Scale ставим переключатель на Metric, в выпадающем списке ищем Meters.&lt;br /&gt;
[[Изображение:3d-max-unit-setup.gif|thumb|left|400px|Меняем единицы измерения]]&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;
&lt;br /&gt;
Создадим box размеров 50м*50м*0,1м.&lt;br /&gt;
&lt;br /&gt;
==== Замечания и правила ====&lt;br /&gt;
&lt;br /&gt;
* Вся геометрия должна быть создана в реальных мировых размерах (если стол в реальной жизни высотой 1 метр, значит его надо и в Maya делать высотой 1 метр, всё предельно ясно и просто)&lt;br /&gt;
* Bounding box персонажа имеет три состояния: стоя (1.8х0.7х0.7 в метрах), сидя (1.5х0.7х0.7 в метрах) и очень сидя (1.2х0.7х0.7 в метрах).&lt;br /&gt;
* Весь уровень должен быть не больше 150 тысяч треугольников.&lt;br /&gt;
* Сцена должна состоять из групп. Название группы формируется по такому принципу: mp_имяуровня_назвгеометрии. Например, в нашей тестовой сцене такие группы: mp_atp_terrain, mp_atp_buildings. В группе может находится как и один объект, так и несколько. Имена объектов внутри группы никоем образом не должны совпадать с именем группы. В переделах одной группы все имена должны быть уникальны. &lt;br /&gt;
* Шейп объекта должен содержать правильное имя. Формируется по такому принципу: объект - имя_объекта, шейп - имя_объектаShape&lt;br /&gt;
&lt;br /&gt;
=== Текстурирование и назначение шейдеров ===&lt;br /&gt;
&lt;br /&gt;
==== 3D Studio Max ====&lt;br /&gt;
Открываем Material Editor(M) выделив один из образцов материала, открываем диалог Material/Map Browser, щелчком на кнопке Standart. Создадим новый материал XRayMtl, дважды щёлкнув по нему в списке. &lt;br /&gt;
&lt;br /&gt;
Займёмся настройкой параметров материала. X-ray материал, кроме текстуры использует надстройку состоящую из трёх шейдеров - Engine, Compiler, Material.&lt;br /&gt;
* Engine - отображение текстуры в движке игры.&lt;br /&gt;
* Compiler - используется при компиляции уровня.&lt;br /&gt;
* Material - игровой материал (wallmark, sound и др.).&lt;br /&gt;
Для начала настроим шейдеры. В Material Editor-e разворачиваем свиток XRay Params. В выпадающих списках представлены различные варианты шейдеров. Более подробно параметры шейдеров рассмотрены в статье [[Описание шейдеров XRayMtl]]. Для нашего примера ограничимся установкой следующих значений:&lt;br /&gt;
* Engine - default&lt;br /&gt;
* Compiler - default&lt;br /&gt;
* Material - material/asphalt&lt;br /&gt;
{|&lt;br /&gt;
| valign=top |[[Изображение:3d-max-create-xraymtl.gif|thumb|400px|Создание нового материала XRayMtl]]&lt;br /&gt;
| valign=top |[[Изображение:3d-max-xray-params.gif|thumb|Настройка XRay шейдеров материала]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Текстурирование заключается в назначении текстуры процедурной карте Diffuse Color.&lt;br /&gt;
Вообще, в редакторе материалов (В свитке Maps) много процедурных карт, но X-Ray mtl поддерживает (экспортирует) лишь одну, указанную выше.&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = center|&lt;br /&gt;
backgroundcolor	= rgb(235, 235, 255);|&lt;br /&gt;
image	=Question.gif|&lt;br /&gt;
heading	=Надо ли расписать процесс назначения текстуры каналу?|&lt;br /&gt;
message =Пиши [[Обсуждение:Создание уровня, пошаговое руководство|тут]].}}&lt;br /&gt;
&lt;br /&gt;
=== Экспорт ===&lt;br /&gt;
&lt;br /&gt;
==== 3D Studio Max ====&lt;br /&gt;
Для начала выделяем все объекты, которые мы хотим экспортировать в виде единого объекта, т.е. всё, что мы выберем сейчас в редакторе будет представленно как одна модель. В нашем случае это один box.&lt;br /&gt;
&lt;br /&gt;
Переходим на командную панель Utilities, нажимаем кнопку More... В появившемся списке в самом конце видим XRay Export, выбираем, жмём ОК.&lt;br /&gt;
После запуска модуля на панели появится новый свиток XRay Export, в списке Selected можно проконтролировать какие объекты выбраны, нажимаем кнопку Export Editor Object... cохраняем файл в папку {SDK folder}\import.&lt;br /&gt;
{|&lt;br /&gt;
| valign=top |[[Изображение:3d-max-xray-export.gif|thumb|400px|Запускаем модуль экспорта]]&lt;br /&gt;
| valign=top |[[Изображение:3d-max-xray-export2.gif|thumb|400px|Экспорт объектов]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Импорт геометрии и текстур в пакет ==&lt;br /&gt;
При экспорте из редактора(Maya &amp;amp;&amp;amp; 3D Max) мы получим файлы *.object.&lt;br /&gt;
&lt;br /&gt;
Запускаем Level Editor и добавим нашу геометрию в Objects Library, делается это так: Objects -&amp;gt; Library Editor, откроется диалог Object Library.&lt;br /&gt;
[[Изображение:SDK-Find-new-texture.gif|thumb|Редактор нашёл текстуру]]&lt;br /&gt;
Для удобства создадим новую группу для наших объектов, щёлкаем в левой части окна ПКМ и выбираем Create Folder, переименуем в my_first_level.&lt;br /&gt;
Выделяем группу, и нажимаем кнопку Import Object, ищём наши *.object файлы, после того как объекты добавлены можно посмотреть, как они примерно будут выглядеть в игре, для этого ставим галочку Preview и любуемся нашим объектом. Теперь можно закрыть диалог Object Library.&lt;br /&gt;
&lt;br /&gt;
Если использовали свою текстуру, то её также надо добавить в пакет, Images -&amp;gt; Check New Textures. Данная команда заставляет редактор просмотреть папку SDK/Import и добавить новые файлы в Texture List, файлы должны быть в формате Targa(*.tga).&lt;br /&gt;
Не меняя ничего в диалоге импорта текстур нажимаем ОК. Всё теперь наша текстура есть в списке текстур редактора. Можно переходить к следующему шагу.&lt;br /&gt;
{|&lt;br /&gt;
|valign=top|[[Изображение:SDK-Object-Library.gif|thumb|left|Диалог Object Library]]&lt;br /&gt;
|valign=top|[[Изображение:SDK-OL-crt-grp.gif|thumb|left|Создание группы для объектов]]&lt;br /&gt;
|valign=top|[[Изображение:SDK-Update-Image-Dialog.gif|thumb|300px|Диалог импорта текстур]]&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;
сохранении и компиляции читаем по ссылке ниже с '''шага 6'''&lt;br /&gt;
*[[Maya. Глава 1: Hello World или первый кубик.]]&lt;br /&gt;
&lt;br /&gt;
== Подключение уровня к игре ==&lt;br /&gt;
Чтобы уровень можно было создавать прямо из игры, его необходимо добавить в список уровней.&lt;br /&gt;
Существует четыре случая, рассмотрим каждый.&lt;br /&gt;
&lt;br /&gt;
=== SDK объединён с игрой ===&lt;br /&gt;
В данном случае надо только отредактировать файл gamedata\config\mp\map_list.ltx, вписав в каждой из секции [deathmatch], [teamdeathmatch], [artefacthunt] название своего уровня.&lt;br /&gt;
=== SDK не объединён с игрой, игра распакована ===&lt;br /&gt;
В данном случае надо также отредактировать файл gamedata\config\mp\map_list.ltx, вписав в каждой из секции [deathmatch], [teamdeathmatch], [artefacthunt] название своего уровня + скопировать содержимое папки [SDK folder]\gamedata\levels\название уровня\ в папку [STALKER folder]\gamedata\levels\название уровня\.&lt;br /&gt;
=== SDK не объединён с игрой, игра не распакована ===&lt;br /&gt;
Повторяем действия предыдущего случая, только папки надо будет создавать самому, файл gamedata\config\mp\map_list.ltx можно взять из папки [SDK folder]\gamedata\config\mp\map_list.ltx&lt;br /&gt;
=== SDK не объединён с игрой + использовались свои текстуры ===&lt;br /&gt;
В данном случае необходимо скопировать:&lt;br /&gt;
*Текстуры из [SDK folder]\gamedata\textures\user\ в папку [STALKER folder]\gamedata\textures\user\ &lt;br /&gt;
*Файл [SDK folder]\gamedata\textures\textures.ltx в папку [STALKER folder]\gamedata\textures\&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
*[[Описание шейдеров XRayMtl]]&lt;br /&gt;
*[[Глобальное озеленение, добавляем траву на уровень]]&lt;br /&gt;
*[[Добавляем аномалии на уровень]]&lt;br /&gt;
*[[Учимся подвешивать объекты]]&lt;br /&gt;
&amp;lt;!--{{Описание шейдеров XRayMtl}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]][[Категория:Незаконченные статьи]]&lt;/div&gt;</summary>
		<author><name>86.110.187.163</name></author>	</entry>

	</feed>