<?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=FantomICW</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=FantomICW"/>
		<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/FantomICW"/>
		<updated>2026-04-29T15:32:46Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%81%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%81%D0%BD%D0%B0</id>
		<title>CoP. Создание места для сна</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%81%D1%82%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%81%D0%BD%D0%B0"/>
				<updated>2016-09-18T10:06:59Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здравствуйте, сегодня мы рассмотрим добавление места для сна в ЗП.&lt;br /&gt;
Это моя первая статья, так что прошу сильно ногами не бить....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''1.''' Итак, мы решили добавить место для сна. Откроем локацию в SDK Level Editor и поставим на карту объект '''Spawn Element--&amp;gt;ai--&amp;gt;space_restrictor'''. В логику пропишите следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[story_object]&lt;br /&gt;
story_id = story_id_места_для_сна&lt;br /&gt;
&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\sr_sleep.ltx&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Нажмите '''Compile--&amp;gt;Make game''', скомпилируйте спавн локации с помощью батника '''tool_create_spawn.cmd''' и закиньте новый спавн в игровую папку '''spawns'''.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Потом идем в '''pda.script''', ищем строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
local sleep_zones_tbl =&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
{target = &amp;quot;zat_a2_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
{target = &amp;quot;jup_a6_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
{target = &amp;quot;pri_a16_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и меняем на &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
local sleep_zones_tbl =&lt;br /&gt;
{&lt;br /&gt;
{target = &amp;quot;zat_a2_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
{target = &amp;quot;jup_a6_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
{target = &amp;quot;pri_a16_sr_sleep_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
{target = &amp;quot;произвольное название вашего места_id&amp;quot;, hint = &amp;quot;st_ui_pda_sleep_place&amp;quot;},&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''3.''' Открываем '''xr_effects.script''', ищем строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function sleep(actor, npc)&lt;br /&gt;
local sleep_zones = {&lt;br /&gt;
&amp;quot;zat_a2_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;jup_a6_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;pri_a16_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;actor_surge_hide_2&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и также меняем на&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function sleep(actor, npc)&lt;br /&gt;
local sleep_zones = {&lt;br /&gt;
&amp;quot;произвольное название вашего места&amp;quot;,&lt;br /&gt;
&amp;quot;zat_a2_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;jup_a6_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;pri_a16_sr_sleep&amp;quot;,&lt;br /&gt;
&amp;quot;actor_surge_hide_2&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готово! Теперь после запуска игры с новым '''all.spawn''' у нас будет спальное место в барже Ноя (координаты брались оттуда).&lt;br /&gt;
&lt;br /&gt;
'''Автор: ZeeK'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_xrSpawner_(%D0%B4%D0%BB%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%BE%D0%B2)</id>
		<title>Разбор программы xrSpawner (для новичков)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_xrSpawner_(%D0%B4%D0%BB%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%BE%D0%B2)"/>
				<updated>2016-09-14T14:01:48Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Приветствую, не судите строго, это моя первая статья.&lt;br /&gt;
&lt;br /&gt;
Создал её для новичков и подумал, а вдруг кому то пригодится. Сначала я расскажу о самой программе, а потом приведу примеры. &lt;br /&gt;
&lt;br /&gt;
== Об xrSpawner ==&lt;br /&gt;
'''xrSpawner''' - программа для редактирования файла '''all.spawn''', позволяет добавлять в игру новые объекты или редактировать старые (NPC, монстров, транспорт, аномалии, и т.д.)&lt;br /&gt;
&lt;br /&gt;
== Рабочее поле ==&lt;br /&gt;
Окно программы делится на три части:&lt;br /&gt;
&lt;br /&gt;
===Объекты===&lt;br /&gt;
После загрузки файла '''all.spawn''', появится список '''Entity''' и '''Имя объекта'''. Здесь можно выбрать нужный объект для редактирования.&lt;br /&gt;
&lt;br /&gt;
В поле '''Номер объекта''' выводится порядковый номер выбранного вами объекта.&lt;br /&gt;
&lt;br /&gt;
В поле '''Версия''' выводится номер версии движка.&lt;br /&gt;
&lt;br /&gt;
===Параметры объекта===&lt;br /&gt;
Поле '''Entity''' - внутреннее название объекта. Берётся из ltx-файлов в папке ''config''.&lt;br /&gt;
&lt;br /&gt;
*'''Имя объекта'''- можно ввести любое.&lt;br /&gt;
&lt;br /&gt;
*'''Level_ID''' - выбор уровня, на котором будет создан объект.&lt;br /&gt;
&lt;br /&gt;
*'''Story ID''' - позволяет в квестах ставить в ПДА метку на объект.&lt;br /&gt;
&lt;br /&gt;
*'''Путь к объекту\имя файла''' - вводим путь и имя модели из папки '''meshes''', относительно папки ''gamedata&amp;quot;, без расширения.&lt;br /&gt;
&lt;br /&gt;
*'''Скрипт''' - секция со скриптом.&lt;br /&gt;
&lt;br /&gt;
*'''Координаты X,Z,Y''' - координаты объекта на карте.&lt;br /&gt;
&lt;br /&gt;
*'''Вектор X,Z,Y''' - куда будет повёрнут объект.&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;
&lt;br /&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;
Например, изменим первоначальное месторасположение Меченого и его стартовый инвентарь.&lt;br /&gt;
&lt;br /&gt;
В окошке '''Объекты''' в поиске введём '''аctor'''. Теперь в '''Параметры объекта''' изменим его координаты (например, поставим его в лагере новичков), в координатах пишем: x=(-204,4252), y=(-20,52197), z=(-147,9664). Вектор можно оставить тот же.&lt;br /&gt;
&lt;br /&gt;
В окне '''Скрипт''' мы видим:&lt;br /&gt;
&amp;lt;ini&amp;gt;[dont_spawn_character_supplies]&lt;br /&gt;
[spawn]&lt;br /&gt;
wpn_binoc&lt;br /&gt;
detector_simple&lt;br /&gt;
novice_outfit&lt;br /&gt;
device_torch&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавим, например, FN2000 и патроны к нему:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[dont_spawn_character_supplies]&lt;br /&gt;
&lt;br /&gt;
[spawn]&lt;br /&gt;
wpn_binoc&lt;br /&gt;
detector_simple&lt;br /&gt;
novice_outfit&lt;br /&gt;
device_torch&lt;br /&gt;
wpn_fn2000&lt;br /&gt;
ammo_5.56x45_ss190&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нажмите '''Принять изменения''' ( иначе ничего сохраняться не будет ).&lt;br /&gt;
&lt;br /&gt;
Выберите '''Файл''' &amp;gt; '''Сохранить'''. В папке с программой появляется '''all.spawn'''. Скопируйте его в папку ''gamedata/spawns''.&lt;br /&gt;
&lt;br /&gt;
Вот и всё, теперь при начале новой игры, Меченый появится в лагере новичков, с FN2000.&lt;br /&gt;
&lt;br /&gt;
Да, и не забудьте - после изменения ''all.spawn'' всегда начинайте новую игру!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Пример 2 ===&lt;br /&gt;
&lt;br /&gt;
Добавим консервы в деревне новичков.&lt;br /&gt;
&lt;br /&gt;
Выберите '''Редактирование''' &amp;gt; '''Добавить объект в базу'''. Введите название группы - например, '''items'''. Название объекта - '''conserva'''. Теперь, в поле '''Добавить объект''' выберите вашу группу '''items''' и нажмите кнопку '''Добавить'''.&lt;br /&gt;
&lt;br /&gt;
В самом конце списка '''Entity''' появится '''breakable_object'''. Выберите его. В параметрах объекта следует изменить поле '''Entity''' на '''conserva''', то бишь внутреннее имя файла.&lt;br /&gt;
&lt;br /&gt;
Имя объекта тоже желательно изменить на любое другое. Координаты берём теже, что и ранее '''(x=(-204,4252), y=(-20,52197), z=(-147,9664))'''. Также можно использовать другие, если имеются. &lt;br /&gt;
&lt;br /&gt;
Вроде всё. Жмите '''Принять изменения''', помещайте файл в '''spawns''' и начинайте новую игру.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Автор статьи: '''Azzy''' (надеюсь запишет свой ник сюда)&lt;br /&gt;
&lt;br /&gt;
Дополнил и доработал: '''TuMaN'''&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B7%D0%BE%D0%BD</id>
		<title>CoP. Создание полноценных аномальных зон</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B7%D0%BE%D0%BD"/>
				<updated>2016-09-14T13:53:14Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данная статья посвещена созданию полноценных аномальных зон в ЗП. Расчитана на неопытных мододелов.&lt;br /&gt;
&lt;br /&gt;
Итак начнем, для работы нам понадобятся: распакованный all.spawn, долька фантазии и не очень кривые руки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
РАСПАКОВКА all.spawn:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[http://www.activestate.com/activeperl/]   интерпретатор, нужный для работы ACDC&lt;br /&gt;
&lt;br /&gt;
[http://stalkerin.gameru.net/downloads/stutils/acdccop-20091002.7z]   ACDC от bardak'а&lt;br /&gt;
&lt;br /&gt;
[http://narod.ru/disk/16768045000/script_position_cop.rar.html]   скрипт от bardak'а для вывода на экран информации о позиции игрока.&lt;br /&gt;
&lt;br /&gt;
1) Устанавливаем ActivePerl&lt;br /&gt;
&lt;br /&gt;
2) Закидываем ACDC в любую папку&lt;br /&gt;
&lt;br /&gt;
3) Создаём в файл decompile.txt и вставляем в него текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dos&amp;gt;&lt;br /&gt;
perl acdccop.pl -d all.spawn&lt;br /&gt;
pause&lt;br /&gt;
&amp;lt;/dos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) Создаём в файл compile.txt и вставляем в него текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dos&amp;gt;&lt;br /&gt;
perl acdccop.pl -c all.ltx&lt;br /&gt;
pause&lt;br /&gt;
&amp;lt;/dos&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Меняем расширение обоих .txt на .bat&lt;br /&gt;
&lt;br /&gt;
6) Кидаем сюда же all.spawn и жмем на распаковку. И видим кучу файлов типа alife_локация.ltx, way_локация.ltx, section2.bin, section4.bin и all.ltx   &lt;br /&gt;
&lt;br /&gt;
7) Всё all.spawn распакован оставим его пока что.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ДОЛЬКА ФАНТАЗИИ:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Закидываем скрипт bardak'а в gamedata'у соглашаясь на замену и запускаем игру. На экране должна отобразится информация о позиции игрока на локации.&lt;br /&gt;
&lt;br /&gt;
2) Находим место для нашей аномальной зоны(естественно она состоит из нескольких аномалий). Для примера находим какое нибудь деревце на затоне и делаем 4 скрина (кнопочка F12) с разных сторон (крестом) на расстоянии 5 метров от деревца. Далее 1 скрин возле самого деревца. Выходим из игры.&lt;br /&gt;
&lt;br /&gt;
3) Заходим в (S.T.A.L.K.E.R. - Зов Припяти\users\screenshots) и видим там 5 скринов. Ну с приготовлениями справились =)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
НЕ ОЧЕНЬ КРИВЫЕ РУКИ:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Открываем alife_zaton.ltx и в самом конце вставляем 4 вот таких секции. (Не забудьте удалить коменты)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[9999] ;Уникальный номер секции, для удобства можно именовать последовательно (если последняя секция [1358] то наша должна быть [1359])&lt;br /&gt;
 ; cse_abstract properties&lt;br /&gt;
 section_name = zone_mine_electric_weak ;Имя секции (Типа чё ставим) Аномалии описаны в gamedata\configs\zones &lt;br /&gt;
 name = test_anomaly ;Уникальное имя секции (УНИКАЛЬНОЕ!!!)Не должно повторяться)&lt;br /&gt;
 position = 0,0,0 ;Позиция на локации по X,Y,Z Допустимые варианты заполнения 364.154896,-14.153879,259.145987 или 364,-14,259&lt;br /&gt;
 direction = 0,0,0 ;Направление объекта (Для аномалий можно не трогать)&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 0 ;игровой вертекс&lt;br /&gt;
 distance = 32.0 ;расстояние до ближайшего гв&lt;br /&gt;
 level_vertex_id = 0 ;уровневый вертекс&lt;br /&gt;
 object_flags = 0xffffff3e ;флаг объекта, не трогать&lt;br /&gt;
 &lt;br /&gt;
 ; cse_shape properties&lt;br /&gt;
 shapes = shape0&lt;br /&gt;
 shape0:type = sphere ;Тип shape'а аномалии (в данном случае сфера)&lt;br /&gt;
 shape0:offset = 0,0,0&lt;br /&gt;
 shape0:radius = 1 ;Радиус сферы&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_space_restrictor properties&lt;br /&gt;
 restrictor_type = 3 ;Тип рестриктора&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_custom_zone properties&lt;br /&gt;
 max_power = 0 ;Сила аномалии (при 0 используется стандартное из конфига, если меняем то вписываем по образцу 1.0 и т.д.)&lt;br /&gt;
 enabled_time = ?7?7?7? ;Включенное состояние(указывать в секундах, если постоянно то 0 или удалить строку)&lt;br /&gt;
 disabled_time = ?7?7?7? ;Выключенное состояние(указывать в секундах, если постоянно то 0 или удалить строку)&lt;br /&gt;
 start_time_shift = ?7?7?7? ;Задержка включения(без задержки 0, если использованны предъидущие строки то эта строка обязательна!!!)&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_anomalous_zone properties&lt;br /&gt;
 offline_interactive_radius = 30 ;(Х.З. Чё значит)&lt;br /&gt;
 artefact_spawn_count = 32 ;Чё та про спавн артефактов(Х.З. Чё значит)&lt;br /&gt;
 artefact_position_offset = 0x460 ;Чё та про спавн артефактов(Х.З. Чё значит)&lt;br /&gt;
 &lt;br /&gt;
 ; se_zone_anom properties&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Заполняем ВСЕ (?7?7?7?). Откуда спросите вы =) позиции и вертиксы со скринов. section_name в данном случае из gamedata\configs\zones. Радиус и временные параметры из головы. Получится что то типа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[2180]&lt;br /&gt;
 ; cse_abstract properties&lt;br /&gt;
 section_name = zone_mine_electric_weak&lt;br /&gt;
 name = zaton_testing_anomaly_01&lt;br /&gt;
 position = -73,-7,575&lt;br /&gt;
 direction = 0,0,0&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 48&lt;br /&gt;
 distance = 32.2000007629395&lt;br /&gt;
 level_vertex_id = 795179&lt;br /&gt;
 object_flags = 0xffffff3e&lt;br /&gt;
 &lt;br /&gt;
 ; cse_shape properties&lt;br /&gt;
 shapes = shape0&lt;br /&gt;
 shape0:type = sphere&lt;br /&gt;
 shape0:offset = 0,0,0&lt;br /&gt;
 shape0:radius = 3.0&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_space_restrictor properties&lt;br /&gt;
 restrictor_type = 3&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_custom_zone properties&lt;br /&gt;
 max_power = 10&lt;br /&gt;
 enabled_time = 10&lt;br /&gt;
 disabled_time = 5&lt;br /&gt;
 start_time_shift = 0&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_anomalous_zone properties&lt;br /&gt;
 offline_interactive_radius = 30&lt;br /&gt;
 artefact_spawn_count = 32&lt;br /&gt;
 artefact_position_offset = 0x460&lt;br /&gt;
 &lt;br /&gt;
 ; se_zone_anom properties&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Ну естественно у вас должно получится с другими координатами =)&lt;br /&gt;
&lt;br /&gt;
4) И так заполняем все 4 секции каждую с разных позиций вокруг дерева главное не перестараться с радиусом =)&lt;br /&gt;
&lt;br /&gt;
5) В итоге у нас есть 4 электры вокруг дерева. Согласитесь этого мало для полноценной аномалии. А что еще нужно? А нужно нам что бы в аномальной зоне появлялись артефакты, что бы они постепенно перемещались внутри аномальной зоны, да еще и саму зону на карте отметить.&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;
&amp;lt;ini&amp;gt;[2204]&lt;br /&gt;
 ; cse_abstract properties&lt;br /&gt;
 section_name = anomal_zone&lt;br /&gt;
 name = zaton_test_anomal_zone&lt;br /&gt;
 position = 257.686218261719,19.0880222320557,541.813903808594&lt;br /&gt;
 direction = 0,0,0&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 292&lt;br /&gt;
 distance = 0&lt;br /&gt;
 level_vertex_id = 1407607&lt;br /&gt;
 object_flags = 0xffffff3e&lt;br /&gt;
 custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
 [anomal_zone]&lt;br /&gt;
 cfg = scripts\zaton\anomaly\zaton_test_anomal_zone.ltx&lt;br /&gt;
 END&lt;br /&gt;
 &lt;br /&gt;
 ; cse_shape properties&lt;br /&gt;
 shapes = shape0&lt;br /&gt;
 shape0:type = sphere&lt;br /&gt;
 shape0:offset = 0,0,0&lt;br /&gt;
 shape0:radius = 2&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_space_restrictor properties&lt;br /&gt;
 restrictor_type = 3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь координаты и вертиксы берем со скрина возле дерева.&lt;br /&gt;
&lt;br /&gt;
2) Создаём в папке gamedata\configs\scripts\zaton\anomaly файл zaton_test_anomal_zone.ltx и вставляем в него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[anomal_zone]&lt;br /&gt;
 layers_count = 1&lt;br /&gt;
 respawn_tries = 2&lt;br /&gt;
 max_artefacts = 5&lt;br /&gt;
 ;applying_force_xz = 200&lt;br /&gt;
 applying_force_y = 200 &lt;br /&gt;
 artefacts = af_electra_sparkler, af_electra_flash, af_electra_moonlight, af_dummy_battery, af_dummy_dummy, af_ice&lt;br /&gt;
 start_artefact = af_electra_moonlight&lt;br /&gt;
 coeff = 3, 3, 2, 2, 1, 1&lt;br /&gt;
 artefact_ways = zaton_testing_af_way&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Открываем way_zaton.ltx и в низу вставляем секцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[zaton_testing_af_way]&lt;br /&gt;
 points = p0,p1,p2,p3&lt;br /&gt;
 p0:name = wp00&lt;br /&gt;
 p0:position = ?7?7?7?&lt;br /&gt;
 p0:game_vertex_id = ?7?7?7?&lt;br /&gt;
 p0:level_vertex_id = ?7?7?7?&lt;br /&gt;
 p0:links = p1(1)&lt;br /&gt;
 &lt;br /&gt;
 p1:name = wp01&lt;br /&gt;
 p1:position = ?7?7?7?&lt;br /&gt;
 p1:game_vertex_id = ?7?7?7?&lt;br /&gt;
 p1:level_vertex_id = ?7?7?7?&lt;br /&gt;
 p1:links = p2(1)&lt;br /&gt;
 &lt;br /&gt;
 p2:name = wp02&lt;br /&gt;
 p2:position = ?7?7?7?&lt;br /&gt;
 p2:game_vertex_id = ?7?7?7?&lt;br /&gt;
 p2:level_vertex_id = ?7?7?7?&lt;br /&gt;
 p2:links = p3(1)&lt;br /&gt;
 &lt;br /&gt;
 p2:name = wp02&lt;br /&gt;
 p2:position = ?7?7?7?&lt;br /&gt;
 p2:game_vertex_id = ?7?7?7?&lt;br /&gt;
 p2:level_vertex_id = ?7?7?7?&lt;br /&gt;
 p2:links = p0(1)&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь позиции и вертиксы ставим из первых 4х скринов(тоесть центры аномалий)&lt;br /&gt;
&lt;br /&gt;
4) Опять открываем alife_zaton.ltx вставляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[2205]&lt;br /&gt;
 ; cse_abstract properties&lt;br /&gt;
 section_name = space_restrictor&lt;br /&gt;
 name = zaton_test_anomaly_spot&lt;br /&gt;
 position = 257.686218261719,19.0880222320557,541.813903808594&lt;br /&gt;
 direction = 0,0,0&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 292&lt;br /&gt;
 distance = 0&lt;br /&gt;
 level_vertex_id = 1407607&lt;br /&gt;
 object_flags = 0xffffff3e&lt;br /&gt;
 custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
 [story_object]&lt;br /&gt;
 story_id = zaton_test_anomaly_spot&lt;br /&gt;
 END&lt;br /&gt;
 &lt;br /&gt;
 ; cse_shape properties&lt;br /&gt;
 shapes = shape0&lt;br /&gt;
 shape0:type = sphere&lt;br /&gt;
 shape0:offset = 0,0,0&lt;br /&gt;
 shape0:radius = 1&lt;br /&gt;
 &lt;br /&gt;
 ; cse_alife_space_restrictor properties&lt;br /&gt;
 restrictor_type = 3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С координатами возле деревца.&lt;br /&gt;
&lt;br /&gt;
5)Запаковываем all.spawn запустив Запаковка.bat&lt;br /&gt;
&lt;br /&gt;
6)Полученный all.spawn.new кидаем на место оригинального и переименовываем в all.spawn&lt;br /&gt;
&lt;br /&gt;
7)Идем в gamedata\scripts открываем pda.script и находим строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;local primary_objects_tbl = &amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавляем по анологии строку:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;{target=&amp;quot;zaton_test_anomaly_spot&amp;quot;,	hint=&amp;quot;zaton_test_anomaly_spot_name&amp;quot;},&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получится что то типа&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;{target=&amp;quot;zat_b12_spot&amp;quot;,		hint=&amp;quot;st_zat_b12_name&amp;quot;},&lt;br /&gt;
 	{target=&amp;quot;zat_b28_spot&amp;quot;,		hint=&amp;quot;st_zat_b28_name&amp;quot;},&lt;br /&gt;
 	{target=&amp;quot;zat_b103_spot&amp;quot;,	hint=&amp;quot;st_zat_b103_name&amp;quot;},&lt;br /&gt;
 	{target=&amp;quot;zaton_test_anomaly_spot&amp;quot;,	hint=&amp;quot;zaton_test_anomaly_spot_name&amp;quot;},&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8)Идем в gamedata\configs\text\rus и открываем блокнотиком st_land_names.xml И добавляем новую секцию с &amp;lt;xml&amp;gt;string id = &amp;quot;zaton_test_anomaly_spot_name&amp;quot;&amp;lt;/xml&amp;gt; по анологии.&lt;br /&gt;
&lt;br /&gt;
9)Если всё сделано правильно то в игре вас будет ждать новая аномалия =)&lt;br /&gt;
&lt;br /&gt;
== Перечень названий-типов аномалий ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведён список аномалий и их обазначение для all.spawn:&lt;br /&gt;
* zone_field_radioactive_average - очаг радиоактивности&lt;br /&gt;
* zone_mine_electric_weak - электра &lt;br /&gt;
* zone_mine_gravitational_average - воронка&lt;br /&gt;
&lt;br /&gt;
== Авторы ==&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:WincentDark69|WincentDark69]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D1%85_%D1%82%D0%B5%D0%BB%D0%B5%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2</id>
		<title>CoP. Создание быстрых телепортов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D1%85_%D1%82%D0%B5%D0%BB%D0%B5%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2"/>
				<updated>2016-09-14T13:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &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;
Открываем '''ui_main_menu.script''' и находим следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
	if dik == DIK_keys.DIK_Q then&lt;br /&gt;
		self:OnMessageQuitWin()&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
изменяем их:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
        if dik == DIK_keys.DIK_Q then&lt;br /&gt;
                self:OnMessageQuitWin()&lt;br /&gt;
                elseif dik==DIK_keys.DIK_W then&lt;br /&gt;
                self:position_info()&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в конец файла, т.е. после функции&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function main_menu:OnMenuReloaded()&lt;br /&gt;
	self:OnButton_options_clicked()&lt;br /&gt;
	self.opt_dlg:OnMenuReloaded()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
вставляем&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function main_menu:position_info()&lt;br /&gt;
        local a = db.actor:position()&lt;br /&gt;
        local vid = db.actor:level_vertex_id()&lt;br /&gt;
        local gvid = db.actor:game_vertex_id()&lt;br /&gt;
        local text = &amp;quot;GPS:\\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;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и сохраняем.&lt;br /&gt;
&lt;br /&gt;
Заходим в игру, добегаем до места, где бы хотели видеть телепорт, выходим в меню, и в жмём на '''W''', потом возвращаемся в игру и делаем скриншот клавишей '''F12'''. Потом добегаем до места, куда бы вас должен перенести телепорт и опять делаем скрин.&lt;br /&gt;
&lt;br /&gt;
===all.spawn===&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''alife_zaton.ltx''' из декомпилированного '''all.spawn''' и в конце добавляем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[6464] ;обозначает место, где находится телепорт&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = space_restrictor&lt;br /&gt;
name = zat_b20_teleport&lt;br /&gt;
position = 265.378784,18.411567,526.151062&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 287&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 1420994&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\zaton\test_teleport.ltx&lt;br /&gt;
END&lt;br /&gt;
;&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 4.24460601806641&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
[6465] ;просто визуал телепорта. т.к сам телепорт невидим, этот визуал его покажет&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = zone_teleport&lt;br /&gt;
name = zat_b20_teleport_horiz&lt;br /&gt;
position = 265.378784,18.411567,526.151062&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 287&lt;br /&gt;
distance = 49&lt;br /&gt;
level_vertex_id = 1420994&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
;&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 5.5254921913147&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_custom_zone properties&lt;br /&gt;
max_power = 0&lt;br /&gt;
;&lt;br /&gt;
; cse_alife_anomalous_zone properties&lt;br /&gt;
offline_interactive_radius = 30&lt;br /&gt;
artefact_spawn_count = 32&lt;br /&gt;
artefact_position_offset = 0x1ac0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом открываем '''way_zaton.ltx''' и пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[test_teleport_walk] ;телепортирует в нужное место&lt;br /&gt;
points = p0&lt;br /&gt;
p0:name = wp00&lt;br /&gt;
p0:position = 113.948539,-7.351358,185.813888&lt;br /&gt;
p0:game_vertex_id = 316&lt;br /&gt;
p0:level_vertex_id = 1162410&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем, компилируем '''all.spawn'''.&lt;br /&gt;
&lt;br /&gt;
===Логика телепорта===&lt;br /&gt;
&lt;br /&gt;
Теперь создадим файл логики, назовем его '''test_teleport.ltx''', кинем в ''gamedata\configs\scripts\zaton\'' и пропишем в нём следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
;&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = test_teleport_walk  ;имя секции телепорта в way_zaton.ltx&lt;br /&gt;
look1 = zat_b20_quest_teleport_look&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, сохраняем.&lt;br /&gt;
&lt;br /&gt;
Заходим в игру, загружаемся... И видим -- неподалёку от вас светится телепорт, прыгаем в него и он вас во мгновение ока преносит на Скадовск.&lt;br /&gt;
&lt;br /&gt;
===Автор===&lt;br /&gt;
'''AmiKus'''&lt;br /&gt;
&lt;br /&gt;
Обсудить статью всегда можно на [[Обсуждение:Создание_быстрых_телепортов_в_ЗП|странице обсуждения]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D0%B8%D0%B9</id>
		<title>CoP. Спавн аномалий</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D0%B8%D0%B9"/>
				<updated>2016-08-24T12:34:51Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Пару раз адавали вопрос: как же спавнить аномалии в ЗП? Решил наваять статейку&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
Распаковываем алл.спавн с помощью ACDC. Распаковали&lt;br /&gt;
Откроем,например, '''alife_zaton.ltx''', и в самом конце допишем:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[6464] --порядковый номер&lt;br /&gt;
section_name = zone_burning_fuzz_strong --секция&lt;br /&gt;
name = zone_burning_fuzz_strong --уникальное имя в алайф_лока.лтх&lt;br /&gt;
position = 417.848663330078,41.630443572998,-106.000648498535 --координаты спана&lt;br /&gt;
direction = 0,0,0 --угол поворота&lt;br /&gt;
game_vertex_id = 73 --гейм вертекс&lt;br /&gt;
distance = 18.1999988555908 -- ?&lt;br /&gt;
level_vertex_id = 1650842 --левел вертекс&lt;br /&gt;
object_flags = 0xffffff3e --?&lt;br /&gt;
shapes = shape0 --шейпы(можно задавать несколько).&lt;br /&gt;
shape0:type = sphere --тип шейпа(сфера.так же есть box - коробка)&lt;br /&gt;
shape0:offset = 0,0,0 -- ?&lt;br /&gt;
shape0:radius = 0.100000001490116 --радиус шейпа&lt;br /&gt;
restrictor_type = 3 --?&lt;br /&gt;
max_power = 0 --максимальная сила(?)&lt;br /&gt;
offline_interactive_radius = 30 --?&lt;br /&gt;
artefact_spawn_count = 32 --максимальное число спавна артов&lt;br /&gt;
visual_name = dynamics\anomaly\topolinypuh_big --визуал(модель *.ogf)&lt;br /&gt;
idle_animation = idle --?(скорее всего партикл)&lt;br /&gt;
attack_animation = idle --?(скорее всего партикл)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так выглядит без комментов:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[6464]&lt;br /&gt;
section_name = zone_burning_fuzz_strong&lt;br /&gt;
name = zone_burning_fuzz_strong&lt;br /&gt;
position = 417.848663330078,41.630443572998,-106.000648498535&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
game_vertex_id = 73&lt;br /&gt;
distance = 18.1999988555908&lt;br /&gt;
level_vertex_id = 1650842&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 0.100000001490116&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
max_power = 0&lt;br /&gt;
offline_interactive_radius = 30&lt;br /&gt;
artefact_spawn_count = 32&lt;br /&gt;
visual_name = dynamics\anomaly\topolinypuh_big&lt;br /&gt;
idle_animation = idle&lt;br /&gt;
attack_animation = idle&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
----------------------------------------------------------&lt;br /&gt;
'''Автор статьи: Влад (ака Shader)'''&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=All.spawn._%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F</id>
		<title>All.spawn. Отображения нового уровня</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=All.spawn._%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F"/>
				<updated>2016-08-24T12:32:55Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак, чтобы в распакованном all.spawn отображались новые уровни(а не lxx_unkown) проводим простую манипуляцию&lt;br /&gt;
Открываем блокнотом acdc.pl и находим в нём строчку constant levels_info&lt;br /&gt;
&amp;lt;perl&amp;gt;use constant levels_info =&amp;gt; (&lt;br /&gt;
	{ gvid0 =&amp;gt; 2792, },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2697,	name =&amp;gt; 'deadcity' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2332,	name =&amp;gt; 'l13_generators' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2328,	name =&amp;gt; 'rem_basa' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2326,	name =&amp;gt; 'marsh' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2243,	name =&amp;gt; 'red_forest' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2099,	name =&amp;gt; 'l12_stancia_2' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 2049,	name =&amp;gt; 'l12u_control_monolith' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1984,	name =&amp;gt; 'l12u_sarcofag' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1855,	name =&amp;gt; 'l12_stancia' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1699,	name =&amp;gt; 'l11_pripyat' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1029,	name =&amp;gt; 'l10_radar' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1127,	name =&amp;gt; 'l07_military' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1111,	name =&amp;gt; 'l08u_brainlab' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1020,	name =&amp;gt; 'l08_yantar' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 890,	name =&amp;gt; 'l06_rostok' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 883,	name =&amp;gt; 'l05_bar' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 824,	name =&amp;gt; 'l04u_labx18' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 811,		name =&amp;gt; 'l04_darkvalley' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 703,		name =&amp;gt; 'l03u_agr_underground' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 416,		name =&amp;gt; 'l03_agroprom' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 252,		name =&amp;gt; 'l02_garbage' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 0,		name =&amp;gt; 'l01_escape' },&lt;br /&gt;
);&amp;lt;/perl&amp;gt;&lt;br /&gt;
Цифр..английские буквы..страшно? Я понимаю, думаете мне в первый раз было лучше?:)&lt;br /&gt;
Буду краток как наш призедент&lt;br /&gt;
&amp;lt;perl&amp;gt; { gvid =&amp;gt; нижний гейм вертекс уровня,            name =&amp;gt; 'имя_левела_соотвествущюего_вертексу' },&amp;lt;/perl&amp;gt;&lt;br /&gt;
Вот собсно и усё. Теперь рассмотрим траблу глубже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как известно, если добавляешь много локаций (более 3, а то и двух) сталкиваешься с этакой фигней: в ltx'сах спавна все обьекты сбиваются...Например то, что заспавнено на милитари появляется на кордоне...обьекты спавнятся не там где надо и.т.д короч полный зАд! Делаем следущее. Отедяем наши локи от общего спавна, стираем в acdc.pl в use constant levels_info все локи кроме нашй. Компилим. Подтираем лишние обьекты, берём спаун из СДК кидаем туда оригинальные обьекты, совмещаем с нашими локами и всё! Может пару десятков обьектов надо будет перелопатить, но не 8000 с лишним)&lt;br /&gt;
Статейка маленькая, но дмаю принесёт пользу. &lt;br /&gt;
&lt;br /&gt;
Немного теории. АСДС'шка создаёт лтиксы именно по &amp;lt;pre&amp;gt;use constant levels_info&amp;lt;/pre&amp;gt; этой схеме. На самом деле довольно просто, лтикс создаётся с именем уровня и в него вписываются обьекты с принадлежащим гейм_вертексом. Напомню, в gvid0 указывать только начальный вертекс уровня. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Авторы:&amp;lt;br&amp;gt;&lt;br /&gt;
Спс Xiani за добавление лтик'сов в спаун.&amp;lt;br&amp;gt;&lt;br /&gt;
А так FL TEAM(именно Rez@niy)&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2</id>
		<title>CoP. Спавн предметов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BE%D0%B2"/>
				<updated>2016-08-22T13:59:23Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &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;
* ''1)ACDC для ЗП''&lt;br /&gt;
* ''2)Activeperl 8.7.''&lt;br /&gt;
* ''3)Распакованная игра (CoP)&lt;br /&gt;
''&lt;br /&gt;
Начнём:&lt;br /&gt;
&lt;br /&gt;
Поместим файл '''All.spawn'''(который находится по адресу: Gamedata\spawns) в папку с ACDC. Распаковываем.&lt;br /&gt;
&lt;br /&gt;
В итоге появятся Файлы .Ltx С названием секций. Нас интересуют Файлы alife_*******.ltx Так как они отвечают за спавн.&lt;br /&gt;
&lt;br /&gt;
Для Начала нам нужно снять координаты того места Где должен появится наш вертолёт.&lt;br /&gt;
&lt;br /&gt;
Для этого открываем '''ui_main_menu.script''' и находим вот примерно такое:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if dik == DIK_keys.DIK_Q then&lt;br /&gt;
self:OnMessageQuitWin()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
и делаем так :&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if dik == DIK_keys.DIK_Q then&lt;br /&gt;
self:OnMessageQuitWin()&lt;br /&gt;
elseif dik==DIK_keys.DIK_W then&lt;br /&gt;
self:position_info()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Example_vert.jpg]]&lt;br /&gt;
&lt;br /&gt;
И в конец фаила. В Самый Конец!!!&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function main_menu:position_info()&lt;br /&gt;
local a = db.actor:position()&lt;br /&gt;
local vid = db.actor:level_vertex_id()&lt;br /&gt;
local gvid = db.actor:game_vertex_id()&lt;br /&gt;
local text = &amp;quot;GPS:\\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;/lua&amp;gt;&lt;br /&gt;
Сохраняем!!!&lt;br /&gt;
&lt;br /&gt;
Заходим в игру, добегаем до места где бы хотели чтобы видеть вертолёт,выходим в меню и жмём на W , потом возвращаемся в игру&lt;br /&gt;
и делаем скриншот (F12)&lt;br /&gt;
&lt;br /&gt;
Я выбрал место спавна прямо на палубе Скадовска.&lt;br /&gt;
&lt;br /&gt;
Всё теперь спавним вертолёт.&lt;br /&gt;
&lt;br /&gt;
Выберем поправившуюся секцию. Для примера я взял Затон, поэтому открываем '''alife_zaton.ltx'''&lt;br /&gt;
&lt;br /&gt;
и добавляем :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
[1922]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = helicopter&lt;br /&gt;
name = pri_a28_heli_1&lt;br /&gt;
position = 154.740036,-2.654960,182.621597&lt;br /&gt;
direction = 0,-0.0252000000327826,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 316&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 1216486&lt;br /&gt;
object_flags = 0xffffffb2&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = dynamics\vehicles\mi24\veh_mi24_u_01&lt;br /&gt;
&lt;br /&gt;
; cse_motion properties&lt;br /&gt;
&lt;br /&gt;
; cse_ph_skeleton properties&lt;br /&gt;
skeleton_name = idle&lt;br /&gt;
&lt;br /&gt;
; cse_alife_helicopter properties&lt;br /&gt;
startup_animation = idle&lt;br /&gt;
engine_sound = vehicles\helicopter\helicopter&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Помните !!!!! Всё должно быть по порядкку !!!!!Если перед этим номер скрипта был допустим [1921] то в номер нашего будет [1922]&lt;br /&gt;
&lt;br /&gt;
теперь с пояснениями:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
[1922]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = helicopter -- Имя секции&lt;br /&gt;
name = pri_a28_heli_1 -- Уникальное имя скрипта&lt;br /&gt;
position = 154.740036,-2.654960,182.621597 -- координаты места где мы хотим чтобы появился вертолёт&lt;br /&gt;
direction = 0,-0.0252000000327826,0 -- поворот верталёта&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 316 -- гейм вертекс уровня&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 1216486 -- Левел уровень&lt;br /&gt;
object_flags = 0xffffffb2&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = dynamics\vehicles\mi24\veh_mi24_u_01 -- визуал верталёта&lt;br /&gt;
&lt;br /&gt;
; cse_motion properties&lt;br /&gt;
&lt;br /&gt;
; cse_ph_skeleton properties&lt;br /&gt;
skeleton_name = idle&lt;br /&gt;
&lt;br /&gt;
; cse_alife_helicopter properties&lt;br /&gt;
startup_animation = idle&lt;br /&gt;
engine_sound = vehicles\helicopter\helicopter&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Всё вставляем скрипт в секцию (без комментов конечно)&lt;br /&gt;
&lt;br /&gt;
Сохраняем!&lt;br /&gt;
&lt;br /&gt;
Вот что должно получится:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:vertalet.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Автор : AmiKus]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP:_%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_smart</id>
		<title>CoP: Разбор smart</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP:_%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_smart"/>
				<updated>2016-08-22T09:47:14Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Смарт-террейны спавнятся в SDK Level Editor. В секции смарт-террейна указывается кастом-дата, ведущая к конфигу. Варианты настройки конфига:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrain]&lt;br /&gt;
squad_id = 34					        --видимо, id отряда РЕСПАВНА в этом смарте(!)&lt;br /&gt;
max_population = 1					--максимальное число отрядов в смарте&lt;br /&gt;
respawn_only_smart = true				--если true, из смарта не удаляются отряды в симуляции.&lt;br /&gt;
respawn_params = respawn@pri_sim_12			--сцылко на секцию параметров респавна&lt;br /&gt;
arrive_dist = 100					--на каком расстоянии от смарта спавнить.&lt;br /&gt;
def_restr = pri_a16_sr_noweap				--некая замена out_restr из ТЧ. Зона, где лагерь. За пределами - лагеря нет.&lt;br /&gt;
safe_restr = pri_surge_hide_a16; pri_a16_sr_light	--зоны, в которых неписи бессмертны&lt;br /&gt;
smart_control = smart_control				--сцылко на секцию контроля смарта&lt;br /&gt;
spawn_point = zat_sim_16_spawn_point 			--точка респавна&lt;br /&gt;
respawn_radius = 150					--радиус респавна. Если актер ближе - не спавнить. По умолчанию, понятно, 150.&lt;br /&gt;
respawn_sector = default				--сектор респавна. Если точка принадлежит группировке и вокруг нет врагов - уменьшаем капасити &lt;br /&gt;
до 1. Рабочих примеров нет. Работоспособность сомнительна&lt;br /&gt;
mutant_lair =						--не работает.&lt;br /&gt;
no_mutant =						--не работает.&lt;br /&gt;
forbidden_point =					--не работает.&lt;br /&gt;
&lt;br /&gt;
[respawn@pri_sim_12]					--параметры респавна - отряды.&lt;br /&gt;
sim_tushkano&lt;br /&gt;
&lt;br /&gt;
[sim_tushkano]&lt;br /&gt;
spawn_squads = simulation_tushkano			--какие отряды респавнить&lt;br /&gt;
spawn_num = {+pri_a18_use_idol_done}2, 0		--сколько респавнить, и когда можно это делать. Если написанно 0 то распавна не будет. Если&lt;br /&gt;
написано 2 то каждый респавн будут спавнится 2 скварда&lt;br /&gt;
&lt;br /&gt;
[smart_control]&lt;br /&gt;
noweap_zone = pri_a16_sr_noweap				--зона принудительного убора оружия&lt;br /&gt;
ignore_zone = pri_surge_hide_a16; pri_a16_sr_light	--зоны, в которых у неписей устанавливаются флаги combat_ignore_cond и &lt;br /&gt;
combat_ignore_keep_when_attacked = true&lt;br /&gt;
alarm_start_sound = {-pri_b305_fifth_cam_end} pri_a16_base_alarm, nil	--озвучка на начало атаки актора&lt;br /&gt;
alarm_stop_sound = {-pri_b305_fifth_cam_end} pri_a16_base_relax, nil	--озвучка на конец атаки актора&lt;br /&gt;
&lt;br /&gt;
[exclusive]&lt;br /&gt;
pri_b35_envoy_after = pripyat\pri_b35_envoy_logic.ltx			--ссылка на эксклюзивные работы для данного смарта.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Автор: KD87'''&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP:_%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_smart</id>
		<title>CoP: Разбор smart</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP:_%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_smart"/>
				<updated>2016-08-22T09:46:42Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Смарт-террейны в СДК LE. В секции смарт-террейна указывается кастом-дата, ведущая к конфигу. Варианты настройки конфига:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrain]&lt;br /&gt;
squad_id = 34					        --видимо, id отряда РЕСПАВНА в этом смарте(!)&lt;br /&gt;
max_population = 1					--максимальное число отрядов в смарте&lt;br /&gt;
respawn_only_smart = true				--если true, из смарта не удаляются отряды в симуляции.&lt;br /&gt;
respawn_params = respawn@pri_sim_12			--сцылко на секцию параметров респавна&lt;br /&gt;
arrive_dist = 100					--на каком расстоянии от смарта спавнить.&lt;br /&gt;
def_restr = pri_a16_sr_noweap				--некая замена out_restr из ТЧ. Зона, где лагерь. За пределами - лагеря нет.&lt;br /&gt;
safe_restr = pri_surge_hide_a16; pri_a16_sr_light	--зоны, в которых неписи бессмертны&lt;br /&gt;
smart_control = smart_control				--сцылко на секцию контроля смарта&lt;br /&gt;
spawn_point = zat_sim_16_spawn_point 			--точка респавна&lt;br /&gt;
respawn_radius = 150					--радиус респавна. Если актер ближе - не спавнить. По умолчанию, понятно, 150.&lt;br /&gt;
respawn_sector = default				--сектор респавна. Если точка принадлежит группировке и вокруг нет врагов - уменьшаем капасити &lt;br /&gt;
до 1. Рабочих примеров нет. Работоспособность сомнительна&lt;br /&gt;
mutant_lair =						--не работает.&lt;br /&gt;
no_mutant =						--не работает.&lt;br /&gt;
forbidden_point =					--не работает.&lt;br /&gt;
&lt;br /&gt;
[respawn@pri_sim_12]					--параметры респавна - отряды.&lt;br /&gt;
sim_tushkano&lt;br /&gt;
&lt;br /&gt;
[sim_tushkano]&lt;br /&gt;
spawn_squads = simulation_tushkano			--какие отряды респавнить&lt;br /&gt;
spawn_num = {+pri_a18_use_idol_done}2, 0		--сколько респавнить, и когда можно это делать. Если написанно 0 то распавна не будет. Если&lt;br /&gt;
написано 2 то каждый респавн будут спавнится 2 скварда&lt;br /&gt;
&lt;br /&gt;
[smart_control]&lt;br /&gt;
noweap_zone = pri_a16_sr_noweap				--зона принудительного убора оружия&lt;br /&gt;
ignore_zone = pri_surge_hide_a16; pri_a16_sr_light	--зоны, в которых у неписей устанавливаются флаги combat_ignore_cond и &lt;br /&gt;
combat_ignore_keep_when_attacked = true&lt;br /&gt;
alarm_start_sound = {-pri_b305_fifth_cam_end} pri_a16_base_alarm, nil	--озвучка на начало атаки актора&lt;br /&gt;
alarm_stop_sound = {-pri_b305_fifth_cam_end} pri_a16_base_relax, nil	--озвучка на конец атаки актора&lt;br /&gt;
&lt;br /&gt;
[exclusive]&lt;br /&gt;
pri_b35_envoy_after = pripyat\pri_b35_envoy_logic.ltx			--ссылка на эксклюзивные работы для данного смарта.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Автор: KD87'''&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=All.spawn._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_NPC</id>
		<title>All.spawn. Создание NPC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=All.spawn._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_NPC"/>
				<updated>2016-08-21T10:32:41Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что,как,зачем ==&lt;br /&gt;
Итак, я хочу рассказать вам как создать NPC через all.spawn.&lt;br /&gt;
Метод был выявлен мною путем проб и ошибок.&lt;br /&gt;
Конечно же у вас появился вопрос: « Ну а зачем же мучатся с all.spawn, если можно сделать тоже самое через скрипт?».&lt;br /&gt;
Ответ:&lt;br /&gt;
Хоть этот способ и не такой быстрый и легкий, но у него есть свои плюсы, необходимые многим, один из них - мы можем задать story id нашему NPC.(Можно прописать в секции нпс которого спауните в низу в файле spawn_sections.ltx Пример:story_id = 10000)&lt;br /&gt;
&amp;quot;А что дает нам это?&amp;quot;&lt;br /&gt;
Много чего, ну для примера - мы сможем поставить отметку на него.&lt;br /&gt;
Я не буду объяснять такие простые вещи как декомпиляция all.spawn и остальное, но если же вы все таки не знаете как, пишите мне в лс на Гейменаторе(stalkers-life, или Идиот)&lt;br /&gt;
Итак, хватит лишних слов, перейдем к работе...&lt;br /&gt;
&lt;br /&gt;
== Работаем!!! ==&lt;br /&gt;
&lt;br /&gt;
С помощью ACDC декомпилируем all.spawn&lt;br /&gt;
&lt;br /&gt;
Получаем кучу файлов типа : alife_l01_escape , way_l01_escape и тд.&lt;br /&gt;
&lt;br /&gt;
Создадим нового непися на Кордоне.&lt;br /&gt;
Открываем alife_l01_escape, и крутим в самый низ.&lt;br /&gt;
&lt;br /&gt;
Если у вас чистая игра и вы ничего не делали в Олл спавне то посленяя секция у вас будет под номером 869.&lt;br /&gt;
Добавляем туда вот такой код(в конец):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[870]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = stalker&lt;br /&gt;
name = noobik&lt;br /&gt;
position = -172.21215820313,-19.941787719727,-161.09272766113&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_trader_abstract properties&lt;br /&gt;
money = 5000&lt;br /&gt;
character_profile = esc_noobik&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 52&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 76655&lt;br /&gt;
object_flags = 0xffffffbf&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx&lt;br /&gt;
&lt;br /&gt;
; cse&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
none = true&lt;br /&gt;
END&lt;br /&gt;
story_id = 10000&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = actors\soldier\soldier_beret_1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_creature_abstract properties&lt;br /&gt;
g_team = 0&lt;br /&gt;
g_squad = 1&lt;br /&gt;
g_group = 2&lt;br /&gt;
health = 1&lt;br /&gt;
dynamic_out_restrictions =&lt;br /&gt;
dynamic_in_restrictions =&lt;br /&gt;
&lt;br /&gt;
upd:health = 1&lt;br /&gt;
upd:timestamp = 0&lt;br /&gt;
upd:creature_flags = 0&lt;br /&gt;
upd:position = -172.21215820313,-19.941787719727,-161.09272766113&lt;br /&gt;
upd:o_model = 0&lt;br /&gt;
upd:o_torso = 0.028013030067086,0,0.9996075630188&lt;br /&gt;
upd:g_team = 0&lt;br /&gt;
upd:g_squad = 1&lt;br /&gt;
upd:g_group = 2&lt;br /&gt;
&lt;br /&gt;
; cse_alife_monster_abstract properties&lt;br /&gt;
&lt;br /&gt;
upd:next_game_vertex_id = 65535&lt;br /&gt;
upd:prev_game_vertex_id = 65535&lt;br /&gt;
upd:distance_from_point = 0&lt;br /&gt;
upd:distance_to_point = 0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_human_abstract properties&lt;br /&gt;
predicate5 = 1,2,2,1,2&lt;br /&gt;
predicate4 = 0,1,1,1&lt;br /&gt;
&lt;br /&gt;
; cse_ph_skeleton properties&lt;br /&gt;
&lt;br /&gt;
upd:start_dialog =&lt;br /&gt;
&lt;br /&gt;
; se_stalker properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разъясню некоторые пункты, чтобы в след. раз не пришлось прибегать к тутору.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
section_name = stalker -//это для игры тут пишется к примеру если ето у тебя сталкера или бандюки то должно быть section_name = stalker&lt;br /&gt;
name = noobik -//пишем что хотим&lt;br /&gt;
position = -172.21215820313,-19.941787719727,-161.09272766113 -//позиция&lt;br /&gt;
direction = 0,0,0 -// направление взгляда(можно писать всегда нули)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse_alife_trader_abstract properties&lt;br /&gt;
money = 5000 -//его бабло&lt;br /&gt;
character_profile = esc_noobik -//ссылка на профиль в character_desc_локация(раз создаем в алайф эскейп значит и профиль будет искатсья в чарактер_деск_ескейп)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 52 -// гейм вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 76655 -//левел вертекс&lt;br /&gt;
object_flags = 0xffffffbf&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx -// ссылка на логику&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse[smart_terrains]&lt;br /&gt;
none = true&lt;br /&gt;
END&lt;br /&gt;
story_id = 10000 -//его стори айди&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = actors\soldier\soldier_beret_1 -// его визуал&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upd:health = 1&lt;br /&gt;
upd:timestamp = 0&lt;br /&gt;
upd:creature_flags = 0&lt;br /&gt;
upd:position = -172.21215820313,-19.941787719727,-161.09272766113 -//опять пишем позицию&lt;br /&gt;
upd:o_model = 0&lt;br /&gt;
upd:o_torso = 0.028013030067086,0,0.9996075630188&lt;br /&gt;
upd:g_team = 0&lt;br /&gt;
upd:g_squad = 1&lt;br /&gt;
upd:g_group = 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upd:next_game_vertex_id = 65535-//честно не знаю что это, я всегда пишу эти цифры&lt;br /&gt;
upd:prev_game_vertex_id = 65535-//не знаю, но пишем всегда это&lt;br /&gt;
upd:distance_from_point = 0&lt;br /&gt;
upd:distance_to_point = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компилируем, получаем файл all.spawn.new , копируем его в геймдату/спавнс и переименовываем просто в олл спавн.&lt;br /&gt;
Это еще не все!&lt;br /&gt;
&lt;br /&gt;
теперь&lt;br /&gt;
&lt;br /&gt;
открываем файл character_desc_escape&lt;br /&gt;
&lt;br /&gt;
перед профилем волка вставляем это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;!---------------------------------------esc_noobik-----------------------------------------------------&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;esc_noobik&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;Нубик&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_noobik&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_noobik&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\soldier\soldier_beret_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;
&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;/specific_character&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;
в папке config/scripts создаем файл noobik_logic.ltx&lt;br /&gt;
и пишем туды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = remark1&lt;br /&gt;
danger = danger_ignore&lt;br /&gt;
&lt;br /&gt;
[danger_ignore]&lt;br /&gt;
ignore_distance = 5&lt;br /&gt;
&lt;br /&gt;
[remark1]&lt;br /&gt;
no_move = true&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все, он никуда не уйдет пока на него не нападут = )&lt;br /&gt;
&lt;br /&gt;
Теперь открываем файл game_story_ids&lt;br /&gt;
&lt;br /&gt;
и в самый низ вписываем:&lt;br /&gt;
10000 = &amp;quot;esc_noobik&amp;quot;&lt;br /&gt;
&lt;br /&gt;
теперь открываем файл npc_profile&lt;br /&gt;
вставляем сие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;character id=&amp;quot;esc_noobik&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_noobik&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_noobik&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, мы на финишной прямой!&lt;br /&gt;
Открываем файл spawn_sections&lt;br /&gt;
&lt;br /&gt;
и в писываем:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[esc_noobik]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_noobik&amp;quot;&lt;br /&gt;
character_profile = esc_noobik&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = stalker&lt;br /&gt;
&amp;lt;/ini&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;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Лутчше написать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = remark&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
danger = danger_condition&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = wait&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[danger_condition]&lt;br /&gt;
ignore_distance = 0&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И тогда НПС будет стоять на месте. =)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;lt;# И стоять НПС при такой логике будет до поры до времени, теперь ясно где все новички учатся изначально делать не правильно...&amp;lt;br&amp;gt;&lt;br /&gt;
Схема '''''remark''''' не предназначена выступать в роли активной схемы, она была создана для мягкого перехода между основными схемами, например '''''kamp''''' и '''''walker'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игнорирование этого момента приводит к нежелательным эффектам, как следствие возникают необоснованные обвинения в адрес X-Ray.&lt;br /&gt;
Если же всё равно делаете через ''all.spawn'', то почему бы не прописать НПС нормальную логику, при которой он действительно будет стоять на месте и даже, если в последующем его что-то отвлечёт, то он вернётся на место, а не останется стоят там, куда перебежал.&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@stay_at_position&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
danger = danger_condition&lt;br /&gt;
&lt;br /&gt;
[walker@stay_at_position]&lt;br /&gt;
path_walk = walker_stay_at_position_walk&lt;br /&gt;
path_look = walker_stay_at_position_look&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[danger_condition]&lt;br /&gt;
ignore_distance = 0&lt;br /&gt;
ignore_distance_corpse = 0&amp;lt;/ini&amp;gt;И в файл ''way_имя_локации.ltx'' вписать две точки:&amp;lt;ini&amp;gt;[walker_stay_at_position_walk]&lt;br /&gt;
points = p0&lt;br /&gt;
p0:name = name00&lt;br /&gt;
p0:flags = 0x1&lt;br /&gt;
p0:position = ;координаты на которых стоим&lt;br /&gt;
p0:game_vertex_id = ;гейм вертекс координат&lt;br /&gt;
p0:level_vertex_id = ;левел вертеск координат&lt;br /&gt;
&lt;br /&gt;
[walker_stay_at_position_look]&lt;br /&gt;
points = p0&lt;br /&gt;
p0:name = name00&lt;br /&gt;
p0:flags = 0x1&lt;br /&gt;
p0:position = ;координаты в которые смотрим&lt;br /&gt;
p0:game_vertex_id = ;гейм вертекс координат&lt;br /&gt;
p0:level_vertex_id = ;левел вертеск координат&amp;lt;/ini&amp;gt;&lt;br /&gt;
И никаких проблем с поведением НПС --#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Статью создал stalker-life'''&lt;br /&gt;
С поправками '''Melnik'''&lt;br /&gt;
Подкоректировал: '''Spaces'''&lt;br /&gt;
Замечание касательно логики: '''ColR_iT'''&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_all.spawn</id>
		<title>Работа с all.spawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_all.spawn"/>
				<updated>2016-08-20T16:48:52Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Расспаковка all.spawn ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы распаковать ол спавн, нам потребуется acdc. Для каждой версии игры нам понадобиться свой. Я описываю для ЗП ( во&lt;br /&gt;
всех частях сталкера этот процесс идентичен), поэтому и пользуюсь acdc от ЗП. Для того, чтобы запустить acdc нам будет &lt;br /&gt;
нужен ActivePerl (адрес откуда можно скачать последнюю версию, для работы подойдёт любая. http://www.activestate.com/activeperl/downloads (дС)) (нужная версия входит в архив)Качаем acdc для ЗП [http://narod.ru/disk/17377026000/ACDC%20Cop.rar.html здесь].После того, как вы скачали acdc, установите эктивперл(если вы этого еще не сделали)(от &amp;quot;GE&amp;quot; - файлы ACDC должны лежать в папке &amp;quot;C:\Perl\bin&amp;quot; если вы не изменяли стандартного пути установки файлов программы Active Perl). Распакуйте acdc и скопируйте в эту папку свой all.spawn (от &amp;quot;GE&amp;quot; - если вы работаете с файлами ТЧ то не забудьте поместить туда-же и файл game.graph , если вы работаете с файлами модов на ТЧ то дополнительно перенести и папку config). Запустите .bat файл decompile(если его нет, то откройте блокнот, запишите в нем такие строки:&lt;br /&gt;
 perl acdccop.pl -d all.spawn&lt;br /&gt;
 pause&lt;br /&gt;
(от &amp;quot;GE&amp;quot; - при работе с утилитами от Бардака .bat файл выглядит так:&lt;br /&gt;
&lt;br /&gt;
 del sections.ini&lt;br /&gt;
 perl universal_acdc.pl -d all.spawn&lt;br /&gt;
 pause&lt;br /&gt;
&lt;br /&gt;
при работе с файлами модов надо включить в .bat сканирование конфигураций:&lt;br /&gt;
&lt;br /&gt;
 del sections.ini&lt;br /&gt;
 perl universal_acdc.pl -d all.spawn -out all -scan config/ -nofatal&lt;br /&gt;
 pause&lt;br /&gt;
&lt;br /&gt;
в ином случае не чего не получится. Описание подходит для де компиляции all.spawn ТЧ и модов , работоспособность .bat с ЧН и ЗП не проверял.)&lt;br /&gt;
&lt;br /&gt;
И сохраните под именем &amp;quot;decompile.bat&amp;quot; Запускайте батник. Через некоторое время появятся .ltx файлы.&lt;br /&gt;
Все, ол спавн распакован и ждет шаманства над собой :) (от &amp;quot;GE&amp;quot; - при работе ACDC от бардака в папке C:\Perl\bin по мимо отсальной кучи файлов &amp;quot;pl и прочих&amp;quot; + наших файлов ACDC появятся файлы: sections.ini, папка all с .ltx всех локаций и guids.)&lt;br /&gt;
&lt;br /&gt;
== Структура файлов == &lt;br /&gt;
&lt;br /&gt;
Я прошу прощения у автора этой статьи, но так как он мало разбирается в модостроении или стесняется писать правильно, счёл возможным внести некоторые правки в его статью. Правки буду вносить в скобках с указанием &amp;quot;дС&amp;quot;(дядяСаша)&lt;br /&gt;
Рассмотрим структуру файлов. Файлы типа alife_ - это основные файлы(не основных файлов нет! каждый файл выполняет свою функцию(дС)), в которых содержаться секции спавна(Название, координаты, характеристики, логика или указания на логику объектов которые спавнятся в игре с помощью all.spawn(дС)) . Файлы типа way_ - это и есть &amp;quot;вэй&amp;quot;. Сквады, логика и прочая дребедень(=Категорически неверно, ни каких сквадов и логики здесь нет. Здесь находятся только координаты точек путей по которым движутся НПС, монстры, техника, координаты костров, и других точек и зон требующихся для симуляции жизни в игре(дС)). Трогать мы их не будем.&lt;br /&gt;
Откроем любой alife_ файл и увидим там много секций спавна. Вот одна из них:&lt;br /&gt;
&lt;br /&gt;
 [0]&lt;br /&gt;
 ; cse_abstract properties&lt;br /&gt;
 section_name = breakable_object&lt;br /&gt;
 name = meshes\brkbl#0.ogf&lt;br /&gt;
 position = -160.539749145508,21.5325393676758,-195.387329101563&lt;br /&gt;
 direction = -0.00700339116156101,-0.108852192759514,0.412739604711533&lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 0&lt;br /&gt;
 distance = 0&lt;br /&gt;
 level_vertex_id = 293223&lt;br /&gt;
 object_flags = 0xffffffba&lt;br /&gt;
 ; cse_visual properties&lt;br /&gt;
 visual_name = meshes\brkbl#0&lt;br /&gt;
 ; cse_alife_object_breakable properties&lt;br /&gt;
 health = 1&lt;br /&gt;
&lt;br /&gt;
А теперь подробнее&lt;br /&gt;
&lt;br /&gt;
 [0] - уникальный &amp;quot;id&amp;quot;, то бишь номер секции(ID в игре сталкер - совершенно другое и ни какого отношения&lt;br /&gt;
                             к номеру секции не имеет. Секция - просто номер который не должен повторятся(дС))&lt;br /&gt;
 ; cse_abstract properties - комментарий&lt;br /&gt;
 section_name = breakable_object - название секции( НЕ В КОЕМ СЛУЧАЕ НЕ СТАВТЕ ЗДЕСЬ СВОЕ НАЗВАНИЕ, ИНАЧЕ all.spawn ВЫ НЕ ЗАПАКУЕТЕ)&lt;br /&gt;
 name = meshes\brkbl#0.ogf - тоже название... Тут уже что годно можно написать(Можно, но лучше&lt;br /&gt;
     придерживаться правил наименования чтобы не запутаться при большом количестве объектов(дС))&lt;br /&gt;
 position = -160.539749145508,21.5325393676758,-195.387329101563 - позиция на которой будет спавн&lt;br /&gt;
     (Уточнение: центральная точка плоскости спавна на горизонтальной плоскости локации, почему см. 3 строчки ниже(дС)) &lt;br /&gt;
 direction = -0.00700339116156101,-0.108852192759514,0.412739604711533 - направление. В какую сторону &amp;quot;смотрит&amp;quot; обьект.&lt;br /&gt;
 ; cse_alife_object properties - комментарий&lt;br /&gt;
 game_vertex_id = 0 - вертикс.&lt;br /&gt;
 distance = 0 (радиус-максимальное расстояние от центральной точки спавна на котором может заспавнится&lt;br /&gt;
               предмет. Расстояние будет выбираться произвольно в пределах указанного радиуса.&lt;br /&gt;
               Теретически можно назначить радиус на всю локацию, НО! я не даром говорил про воображаемую&lt;br /&gt;
                плоскость, надеюсь геометрию уже изучали -)), если ваша плоскость пойдёт через бугор то&lt;br /&gt;
               НПС может заспавнится под землёй и соответственно в игре участвовать не сможет, если над&lt;br /&gt;
                ямой то предмет зависнет в воздухе, есть ещё аномалии и предметы внутри которых может &lt;br /&gt;
                заспавнится ваш объект, поэтому радиус нужно выбирать в разумных пределах(дС))&lt;br /&gt;
 level_vertex_id = 293223 - тоже вертикс. (зачем они объяснять не буду)&lt;br /&gt;
 object_flags = 0xffffffba - флаги обьекта. тоже рассматривать не будем&lt;br /&gt;
 ; cse_visual properties - комментарий&lt;br /&gt;
 visual_name = meshes\brkbl#0 - визуал.(папка meshes не указывается, а указывается полный путь в папке&lt;br /&gt;
 &amp;quot;meshes&amp;quot; например actors\aziat\aziat_bandit_veteran, папка &amp;quot;actors&amp;quot; соответственно должна находится в папке &amp;quot;meshes&amp;quot;(дС))&lt;br /&gt;
 ; cse_alife_object_breakable properties - комментарий.&lt;br /&gt;
 health = 1 - здоровье.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Файл all.ltx - это список файлов, которые упакованы в ол спавн.&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;
Создаем секцию спавна. ( ВНИМАНИЕ! ПРЕЖДЕ ЧЕМ СПАВНИТЬ СТАЛКЕРА, ЕГО НУЖНО СОЗДАТЬ). Как описывать новых напсано [http://stalkerin.gameru.net/wiki/index.php/%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 здесь]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [20927] - уникальный номер секции. (Это просто порядковый номер секции, после распаковки all.spawn &lt;br /&gt;
           открваете последний файл Alife_ в списке для ЗП это alife_zaton.ltx и смотрите № последней&lt;br /&gt;
            секции, дальше уже можете назначать свой. Свою секцию можете вписывать в конце любого&lt;br /&gt;
           файла alife_ только со своим номером. При запаковке, номера будут перебиты соответственно&lt;br /&gt;
           порядковым номерам начиная от первой секции первого файла alife_. Единственное условие&lt;br /&gt;
           порядковые номера не должны быть одинаковыми не сможете запаковать.(дС))&lt;br /&gt;
 &lt;br /&gt;
 ; cse_abstract properties - коментарий :) &lt;br /&gt;
 section_name = stalker - название секции. Если спавните сталкера - stalker. Своих названий быть не должно.&lt;br /&gt;
 name = marsh_koster_stalker - имя.  я использую имя профиля, которого вы создавали при создании нпс (категорическая глупость, не надо путать себя и машину. &lt;br /&gt;
        Правило №1 при спавне новых объектов первые 3 буквы должны содержать название локации mar_ дальше уже пишите название желательно места и затем уже&lt;br /&gt;
        название сталкера и последним порядковый номер например: mar_cerkov_stalk_1, так как указал автор статьи можно заспавнить, но если сталкеров будет&lt;br /&gt;
         много и на разных локациях как это есть в больших модах потом при необходимости внесения изменений найти будет очень тяжело. Поэтому лучше учится&lt;br /&gt;
         сразу правильно делать(дС))&lt;br /&gt;
 position = -150.17852783203,0.63608288764954,-293.19580078125 - координаты.&lt;br /&gt;
 direction = 0.062321275472641,0.00316426996141672,0.0140644172206521 - направление. Куда сталкер будет смотреть.&lt;br /&gt;
 ; cse_alife_trader_abstract properties - &lt;br /&gt;
 money = 5000 - деньги ) (нужны для продажи сталкеру предметов находящихся у ГГ, если это соответствует условиям игры(дС))&lt;br /&gt;
 character_profile = marsh_koster_stalker - профиль, который вы указали при создании нпс. Вот тут нужно указывать его&lt;br /&gt;
 ; cse_alife_object properties&lt;br /&gt;
 game_vertex_id = 934 - вертикс локации&lt;br /&gt;
 distance = 4.90000009536743 - Расстояние до gvid (Опять какой-то бред, причём тут givd. Для чего нужна дистанция, При спавне например группы сталкеров&lt;br /&gt;
         5 человек не нужно для каждого устанавливать свои координаты спавна у всех можно делать одинаковые, но при наличии радиуса, движок их сам&lt;br /&gt;
         раскидает, а если радиус будет 0 все будут спавнится в одной точке, резко возрастает нагрузка на память игра начинает притормаживать, и иногда,&lt;br /&gt;
          я думаю многие встречались с этим, какой-то НПС просто сразу гибнет на месте спавна, почему это происходит не знаю! просто факт!(дС))&lt;br /&gt;
&lt;br /&gt;
 level_vertex_id = 1418 - вертикс локации )&lt;br /&gt;
 object_flags = 0xffffffbf&lt;br /&gt;
 custom_data = &amp;lt;&amp;lt;END - кастом дата. Очень важный элемент при создании нпс. Проще говоря - логика.&lt;br /&gt;
 cfg = scripts/marsh/koster.ltx - путь к конфигу кастом даты (уточняю папка &amp;quot;scripts&amp;quot; которая находится в папке &amp;quot;config&amp;quot;, потому, что в папке gamedata тоже есть папка &amp;quot;scripts&amp;quot; не путать!(дС))&lt;br /&gt;
 [smart_terrains] - смарт террайны ( не рассматриваться)&lt;br /&gt;
 END - окончание кастом даты&lt;br /&gt;
 ; cse_alife_creature_abstract properties&lt;br /&gt;
 g_team = 0&lt;br /&gt;
 g_squad = 1&lt;br /&gt;
 g_group = 5&lt;br /&gt;
 health = 1&lt;br /&gt;
 dynamic_out_restrictions = (здесь указывается рестриктор, если есть, в который нельзя входить НПС или монстру(дС))&lt;br /&gt;
 dynamic_in_restrictions = (здесь указывается рестриктор, если есть, зайдя в который НПС или монстру уже нельзя из него выходить(дС))&lt;br /&gt;
&lt;br /&gt;
 (зачем нужно это не совсем понимаю, но заполнять так же, как и в основной секции)&lt;br /&gt;
 upd:health = 1&lt;br /&gt;
 upd:timestamp = 0x2009656c&lt;br /&gt;
 upd:creature_flags = 0x3d&lt;br /&gt;
 upd:position = -150.17852783203,0.63608288764954,-293.19580078125 (должно соответствовать указанным выше(дС))&lt;br /&gt;
 upd:o_model = 0&lt;br /&gt;
 upd:o_torso = 0.00316426996141672,0.062321275472641,0  (должно соответствовать указанному выше направлению взгляда(дС))&lt;br /&gt;
 upd:g_team = 0&lt;br /&gt;
 upd:g_squad = 1&lt;br /&gt;
 upd:g_group = 5&lt;br /&gt;
 ; cse_alife_monster_abstract properties&lt;br /&gt;
 upd:next_game_vertex_id = 65535&lt;br /&gt;
 upd:prev_game_vertex_id = 65535&lt;br /&gt;
 upd:distance_from_point = 0&lt;br /&gt;
 upd:distance_to_point = 0&lt;br /&gt;
 ; cse_alife_human_abstract properties&lt;br /&gt;
 predicate5 = 1,1,0,0,1       --- (к сожалению за много лет ни разу не находил статьи которая объясняла бы эти цифры. Они определяют порядок действий НПС в различных ситуациях, создают разнообразие жизни &lt;br /&gt;
 predicate4 = 2,2,0,2         --- (но что конкретно я не знаю, поэтому многие скриптовики мучаются с созданием своих систем alife(дС))&lt;br /&gt;
 ; cse_ph_skeleton properties&lt;br /&gt;
 upd:start_dialog =&lt;br /&gt;
 ; se_stalker properties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сохраняем. Запаковываем ол спавн, файлом comlite.bat.&lt;br /&gt;
&lt;br /&gt;
В папке gamedata создаем папку spawns и копируем файл new.spawn(он будет называться именно так). Потом переименовываем в all.spawn.&lt;br /&gt;
&lt;br /&gt;
Статья не закончена и будет пополняться время от времени. Для начала хватит. &lt;br /&gt;
&lt;br /&gt;
Автор статьи - '''Andrey K aka f0rest'''&lt;br /&gt;
&lt;br /&gt;
Правки -- &amp;quot;дядяСаша&amp;quot; (все правки внесённые мной опробованы на &amp;quot;собственной шкуре&amp;quot;, поэтому лучше учится на чужих ошибках! --)) (imgal@mail.ru)&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0</id>
		<title>CoP. Создание техника</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0"/>
				<updated>2015-06-06T07:02:37Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Оформление, мелкие правки&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Допустим, мы перенесли локацию Кордон в Зов Припяти. Пора обустроить ее. В этом уроке мы создадим техника, который может ремонтировать оружие и броню.&lt;br /&gt;
&lt;br /&gt;
=== Секция спавна ===&lt;br /&gt;
Распаковываем '''all.spawn'''. Открываем '''alife''' нашей локации и пишем:&lt;br /&gt;
&amp;lt;ini&amp;gt;[30001]&lt;br /&gt;
; cse_abstract properties &lt;br /&gt;
section_name = stalker &lt;br /&gt;
name = esc_technik&lt;br /&gt;
position = -3.1716885566711,0.87067031860352,296.31362915039&lt;br /&gt;
direction = 0,3,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_trader_abstract properties &lt;br /&gt;
character_profile = esc_technik &lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties &lt;br /&gt;
game_vertex_id = 934&lt;br /&gt;
distance = 0 &lt;br /&gt;
level_vertex_id = 25&lt;br /&gt;
object_flags = 0xfffffffb &lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[logic]             &lt;br /&gt;
cfg = scripts\esc_technik_logic.ltx&lt;br /&gt;
&lt;br /&gt;
[spawn]&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties &lt;br /&gt;
visual_name = actors\novice\green_stalker_2&lt;br /&gt;
&lt;br /&gt;
; cse_alife_creature_abstract properties &lt;br /&gt;
g_team = 0 &lt;br /&gt;
g_squad = 0 &lt;br /&gt;
g_group = 0 &lt;br /&gt;
health = 1 &lt;br /&gt;
dynamic_out_restrictions =             &lt;br /&gt;
dynamic_in_restrictions =             &lt;br /&gt;
&lt;br /&gt;
upd:health = 1 &lt;br /&gt;
upd:timestamp = 0 &lt;br /&gt;
upd:creature_flags = 0 &lt;br /&gt;
upd:position = -3.1716885566711,0.87067031860352,296.31362915039&lt;br /&gt;
upd:o_model = 0 &lt;br /&gt;
upd:o_torso = 0,0,0 &lt;br /&gt;
upd:g_team = 0 &lt;br /&gt;
upd:g_squad = 0 &lt;br /&gt;
upd:g_group = 0 &lt;br /&gt;
&lt;br /&gt;
; cse_alife_monster_abstract properties &lt;br /&gt;
&lt;br /&gt;
upd:next_game_vertex_id = 65535 &lt;br /&gt;
upd:prev_game_vertex_id = 65535 &lt;br /&gt;
upd:distance_from_point = 0 &lt;br /&gt;
upd:distance_to_point = 0 &lt;br /&gt;
&lt;br /&gt;
; cse_alife_human_abstract properties &lt;br /&gt;
predicate5 = 2,2,1,2,0 &lt;br /&gt;
predicate4 = 2,2,1,2 &lt;br /&gt;
&lt;br /&gt;
; cse_ph_skeleton properties &lt;br /&gt;
&lt;br /&gt;
upd:start_dialog =             &lt;br /&gt;
&lt;br /&gt;
; se_stalker properties&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сталкер заспавнится на том же месте, где он был в Чистом небе.&lt;br /&gt;
&lt;br /&gt;
=== Профиль ===&lt;br /&gt;
&lt;br /&gt;
Открываем '''character_desc_general.xml''' и перед ''&amp;lt;/xml&amp;gt;'' в самом конце пишем:&lt;br /&gt;
&amp;lt;xml&amp;gt; &amp;lt;specific_character id=&amp;quot;esc_technik&amp;quot; team_default=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;name&amp;gt;Кулибин&amp;lt;/name&amp;gt;&lt;br /&gt;
              &amp;lt;icon&amp;gt;ui_iconsNpc_soldier_beret&amp;lt;/icon&amp;gt;&lt;br /&gt;
              &amp;lt;map_icon x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot;&amp;gt; &lt;br /&gt;
              &amp;lt;/map_icon&amp;gt; &lt;br /&gt;
              &amp;lt;bio&amp;gt;Опытный сталкер. Детальная информация отсутствует.&amp;lt;/bio&amp;gt; &lt;br /&gt;
              &amp;lt;class&amp;gt;esc_technik&amp;lt;/class&amp;gt;&lt;br /&gt;
			  &amp;lt;mechanic_mode&amp;gt;1&amp;lt;/mechanic_mode&amp;gt;&lt;br /&gt;
              &amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt;&lt;br /&gt;
              &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;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;rank&amp;gt;50&amp;lt;/rank&amp;gt;&lt;br /&gt;
              &amp;lt;reputation&amp;gt;0&amp;lt;/reputation&amp;gt;&lt;br /&gt;
              &amp;lt;money min=&amp;quot;1000&amp;quot; max=&amp;quot;1000&amp;quot; infinitive=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;visual&amp;gt;actors\stalker_neutral\stalker_neutral_2_face_6&amp;lt;/visual&amp;gt;&lt;br /&gt;
&lt;br /&gt;
              &amp;lt;supplies&amp;gt; &lt;br /&gt;
                  [spawn] \n&lt;br /&gt;
                  wpn_ak74 = 1 \n &lt;br /&gt;
                  ammo_5.45x39_fmj = 1 \n &lt;br /&gt;
&lt;br /&gt;
                &amp;lt;/supplies&amp;gt; &lt;br /&gt;
&lt;br /&gt;
             &amp;lt;/specific_character&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Прописать профиль ===&lt;br /&gt;
Открывает '''npc_profile.xml''' и в самом конце перед ''&amp;lt;/xml&amp;gt;'' пишем:&lt;br /&gt;
&amp;lt;xml&amp;gt;    &amp;lt;character id=&amp;quot;esc_technik&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;class&amp;gt;esc_technik&amp;lt;/class&amp;gt;&lt;br /&gt;
             &amp;lt;/character&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Почти все! Осталось только создать логику, чтобы наш НПС никуда не убежал.&lt;br /&gt;
&lt;br /&gt;
=== Логика ===&lt;br /&gt;
В папке '''/configs/scripts''' создаем файл '''esc_technik_logic.ltx''' и пишем:&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]             &lt;br /&gt;
active = remark1 &lt;br /&gt;
danger = danger_ignore &lt;br /&gt;
commander = true&lt;br /&gt;
level_spot = mechanic&lt;br /&gt;
&lt;br /&gt;
[remark1]             &lt;br /&gt;
no_move = true &lt;br /&gt;
meet = meet &lt;br /&gt;
&lt;br /&gt;
[danger_ignore] &lt;br /&gt;
ignore_distance = 10 &lt;br /&gt;
&lt;br /&gt;
[meet] &lt;br /&gt;
use = true &lt;br /&gt;
use_wpn = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Больше наш НПС никуда не денется.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом все!  Запускайте новую игру и проверяйте.&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D1%80%D0%B5%D0%B7%D0%B0%D1%82%D1%8C_%D1%81%D1%8E%D0%B6%D0%B5%D1%82</id>
		<title>Как вырезать сюжет</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D0%B2%D1%8B%D1%80%D0%B5%D0%B7%D0%B0%D1%82%D1%8C_%D1%81%D1%8E%D0%B6%D0%B5%D1%82"/>
				<updated>2015-01-11T09:18:20Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Начнём с ответа на вопрос «а зачем?». Рано или поздно любой, даже самый криворукий (но достаточно упорный) модмейкер осиливает создание квестов. И вот с созданием своего квеста, у некоторых возникает желание создать новый сюжет. Нужно признать, что этим, нас модмейкеры не особо балуют.&amp;lt;br /&amp;gt;&lt;br /&gt;
Полностью разбирать все шаги в этом деле я не буду, ибо очень много объяснять, впрочем , это и не нужно. Если модмейкер не обладает аналитическим складом ума, и делает моды только по статьям или берёт файлы из чужих модов, далеко он всё равно не зайдёт. &amp;lt;br /&amp;gt;&lt;br /&gt;
Для некоторых начинающих модмейкеров, достаточно просто указать «где копать» и они сами всё сделают. Вот для них статья и предназначена.&amp;lt;br /&amp;gt;&lt;br /&gt;
Начнём с того что создание сюжетного мода в разных частях игры требует разного кол-ва времени и усилий. Проще всего создать сюжетный мод в ЗП, практически так же просто в ЧН, ну и малость по сложнее в ТЧ.&lt;br /&gt;
&lt;br /&gt;
=Что такое сюжет=&lt;br /&gt;
Перед тем как вырезать из Сталкера сюжет, нужно для начала определится, что это такое.&amp;lt;br /&amp;gt;&lt;br /&gt;
Я для себя определил это как совокупность квестов, диалогов, действий ГГ и NPC.&lt;br /&gt;
&lt;br /&gt;
==ТЧ==&lt;br /&gt;
В ТЧ сюжет находится в файлах диалогов, скриптах и all.spawne&amp;lt;br /&amp;gt;&lt;br /&gt;
Процесс удаления старого сюжета ТЧ потребует от вас умения править all.spawn, много времени и терпения.&lt;br /&gt;
&lt;br /&gt;
==ЧН==&lt;br /&gt;
В ЧН разрабы очень удачно вынесли из all.spawn почти все логики в configs\scripts\локация\&amp;lt;br /&amp;gt;&lt;br /&gt;
и соответственно упростили нам задачу.&amp;lt;br /&amp;gt;&lt;br /&gt;
Правда, некоторые логики (типа логики двери в бункер учёных на Янтаре) остались в all.spawne&lt;br /&gt;
&lt;br /&gt;
==ЗП==&lt;br /&gt;
В ЗП, вместе со всем, что было нам интересно в Сталкере, разрабы убили и множество технических недоработок.&amp;lt;br /&amp;gt;&lt;br /&gt;
В том числе и логики из all.spawn все вынесены в папку с конфигами - configs\scripts\локация\, за что им отдельное спасибо.&lt;br /&gt;
&lt;br /&gt;
=Как вырезать диалоги=&lt;br /&gt;
Начнём с диалогов:&amp;lt;br /&amp;gt;&lt;br /&gt;
Тут проще некуда. Сюжетные диалоги доступные персонажам прописаны у них в профилях.&amp;lt;br /&amp;gt;&lt;br /&gt;
Заходим в config\gameplay\, редактируем файлы character_desc_****.xml&amp;lt;br /&amp;gt;&lt;br /&gt;
Наша задача закомментировать следующие теги:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;/actor_dialog&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Надеюсь, как комментировать xml-теги вы знаете.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
ПРИМЕЧАНИЕ: проще и быстрее всего побороть все эти теги можно с помощью текстовых редакторов типа Notepad++.&amp;lt;br /&amp;gt;&lt;br /&gt;
Пользуемся функцией замены текста.&lt;br /&gt;
Небольшое уточнение от ASD: при комментировании xml тегов, не забывайте  в конце ставить -- , т.к. это завершает комментирование.&lt;br /&gt;
Образец &amp;lt;code&amp;gt; &amp;lt;!--start_dialog--&amp;gt; &amp;lt;/code&amp;gt; &lt;br /&gt;
или &amp;lt;code&amp;gt; &amp;lt;!--start_dialog&amp;gt;тут всякий игровой текст&amp;lt;/start_dialog--&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Логика=&lt;br /&gt;
Теперь нужно побороть логику, которая отвечает за выдачу инфопорций, квестов и т.д.&amp;lt;br /&amp;gt;&lt;br /&gt;
В ТЧ они находятся в all.spawne, в аддонах в configs\scripts\локация\.&amp;lt;br /&amp;gt;&lt;br /&gt;
Чтобы вы долго не искали я напишу какие строчки нужно комментировать (желательно делать всё это с помощью замены текста, иначе вы состаритесь пока всё в ручную закомментируете).&amp;lt;br /&amp;gt;&lt;br /&gt;
Итак, комментируем следующие строчки:&lt;br /&gt;
&amp;lt;code&amp;gt;on_actor_dist_le =&lt;br /&gt;
on_actor_dist_le_nvis =&lt;br /&gt;
on_actor_dist_ge =&lt;br /&gt;
on_actor_dist_ge_nvis =&lt;br /&gt;
on_signal =&lt;br /&gt;
on_info =&lt;br /&gt;
on_info2 =&lt;br /&gt;
on_info3 =&lt;br /&gt;
on_info4 =&lt;br /&gt;
on_timer =&lt;br /&gt;
on_game_timer =&lt;br /&gt;
on_actor_in_zone =&lt;br /&gt;
on_actor_not_in_zone =&lt;br /&gt;
on_actor_inside =&lt;br /&gt;
on_actor_outside =&lt;br /&gt;
on_npc_in_zone =&lt;br /&gt;
on_npc_not_in_zone =&lt;br /&gt;
allow_break = false&lt;br /&gt;
meet_dialog =&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ПРИМЕЧАНИЕ: некоторые логики (типа логик дверей или баз) нужно потом будет восстановить (то есть раскомментировать).&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, удачи.&amp;lt;br /&amp;gt;&lt;br /&gt;
Автор: [[Участник:THE_ATLAS|THE_ATLAS]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B</id>
		<title>SoC. Не бесконечные болты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B"/>
				<updated>2014-12-02T15:01:42Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &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;
Нам потребуются такие файлы:&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\config\weapons\w_rgd5.ltx'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\config\weapons\w_bolt.ltx'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\config\misc\items.ltx'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\scripts\escape_dialog.script'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\scripts\bind_stalker.script'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В первую очередь лезем в файл '''w_bolt.ltx''', там самая первая строка, которая за что-то отвечает:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Меняем её вот так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[old_bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
Затем, открываем файл '''w_rgd5.ltx''', спускаемся в самый низ и пишем это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 &lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_weight			= 0.05&lt;br /&gt;
cost				= 1&lt;br /&gt;
hud					= bolt_hud2&lt;br /&gt;
ef_weapon_type		= 1&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot;&lt;br /&gt;
destroy_time		= 5000000;3500&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0&lt;br /&gt;
blast_r				= 0&lt;br /&gt;
blast_impulse		= 0&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0&lt;br /&gt;
frags_r				= 0&lt;br /&gt;
frag_hit			= 0&lt;br /&gt;
frag_hit_impulse	= 0&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode&lt;br /&gt;
snd_checkout = monsters\biting\def_0&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0&lt;br /&gt;
light_range		         = 0.0&lt;br /&gt;
light_time 		         = 0.0&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2]&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5&lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_weight			= 0.05 ;вес&lt;br /&gt;
cost				= 1 ;цена за штуку&lt;br /&gt;
hud					= bolt_hud2 ;--ссылка на худ&lt;br /&gt;
ef_weapon_type		= 1 ;тип оружия (не менять ни в коем случае, можно сломать двигло)&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot; ;--описание предмета&lt;br /&gt;
destroy_time		= 5000000;3500 ;лучше оставить как есть, а так это время через которое болт пропадёт&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0 ;мощность взрыва, так как это болт, пусть будет 0&lt;br /&gt;
blast_r				= 0 ; радиус взрыва&lt;br /&gt;
blast_impulse		= 0 ;импульс от взрыва (отражается на дальности отлёта туши от места взрыва)&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0 ;кол-во осколков&lt;br /&gt;
frags_r				= 0 ; радиус разлёта осколков&lt;br /&gt;
frag_hit			= 0 ; урон от 1 попавшего осколка&lt;br /&gt;
frag_hit_impulse	= 0 ; импульс от 1 попавшего осколка&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode звук взрыва&lt;br /&gt;
snd_checkout = monsters\biting\def_0 ;звук броска&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground ; партикл взрыва (в данном случае поставлен партикл ничего не показывающий)&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1 &lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0 ;цвет освещения во время взрыва по RGB&lt;br /&gt;
light_range		         = 0.0 ;насыщенность на сколько я понимаю&lt;br /&gt;
light_time 		         = 0.0 ;время подсветки&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2] ;секция худа&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf ;Визуал болта в руках гг&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, сохраняем, закрываем. Этот файл нам больше не нужен.&lt;br /&gt;
Теперь лезем в файл '''items.ltx''' и в конец пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt_box]:identity_immunities&lt;br /&gt;
GroupControlSection	= spawn_group&lt;br /&gt;
discovery_dependency = &lt;br /&gt;
$spawn 				= &amp;quot;food and drugs\kolbasa&amp;quot;&lt;br /&gt;
;$prefetch 			= 32&lt;br /&gt;
class				= II_FOOD&lt;br /&gt;
cform				= skeleton&lt;br /&gt;
visual				= physics\box\box_metall_01.ogf&lt;br /&gt;
radius				= 1&lt;br /&gt;
;script_binding		= escape_dialog.use_snd&lt;br /&gt;
&lt;br /&gt;
inv_name			        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
inv_name_short		        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
description			= &amp;quot;Коробка с болтами, содержит в себе 25 болтов.&amp;quot;&lt;br /&gt;
inv_weight			= 1.35&lt;br /&gt;
can_trade			= on&lt;br /&gt;
inv_grid_width		= 2&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 8&lt;br /&gt;
inv_grid_y			= 18&lt;br /&gt;
cost				= 30&lt;br /&gt;
&lt;br /&gt;
; eatable item&lt;br /&gt;
eat_health = 0&lt;br /&gt;
eat_satiety = 0&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&lt;br /&gt;
&lt;br /&gt;
attach_angle_offset		= 0.440521, 1.378287, -0.644026&lt;br /&gt;
attach_position_offset	= 0.104196, -0.010821, 0.076969&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;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем, закрываем.&lt;br /&gt;
Дальше мы должны открыть файл '''escape_dialog.script'''&lt;br /&gt;
В конец файла внесём свою функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
    	    end&lt;br /&gt;
	end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then -- объект который должны мы использовать (коробка болтов)&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг&lt;br /&gt;
    	    end -- окончание цикла for i =...&lt;br /&gt;
	end --окончание if&lt;br /&gt;
    end --окончание if&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом же файле находим функцию ''give_weapon_to_actor'' и вносим такие строчки перед ''end'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt_box&amp;quot;, &amp;quot;in&amp;quot;)  &lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt&amp;quot;, &amp;quot;in&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом файле тоже всё.&lt;br /&gt;
Теперь ломимся в '''bind_stalker.script'''&lt;br /&gt;
Пишем в функцию ''function actor_binder:net_destroy()'' это: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, nil)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в функцию ''actor_binder:reinit()'' это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, self.use_object, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конец файла добавляем нашу функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj)&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj) -- function название нашей функции&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну вот и всё, сохраняем и закрываем данный файл.&lt;br /&gt;
Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза.&lt;br /&gt;
Надеюсь, что статья оказалась вам полезна.&lt;br /&gt;
&lt;br /&gt;
'''Автор:''' ''Dj Ultor''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%BE%D1%81%D1%82%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D1%8B_%D0%BF%D1%80%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0.</id>
		<title>SoC. Постэффекты при использовании предмета.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%BE%D1%81%D1%82%D1%8D%D1%84%D1%84%D0%B5%D0%BA%D1%82%D1%8B_%D0%BF%D1%80%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D0%BF%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%B0."/>
				<updated>2014-12-02T14:58:03Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всем привет, тут я опишу, как сделать постэффект при использовании определённого предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
Итак нам понадобятся файлы:&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\config\misc\items.ltx'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\scripts\escape_dialog.script'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\scripts\bind_stalker.script'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приступим.&amp;lt;br&amp;gt;&lt;br /&gt;
1) Открываем файл '''item.ltx''', спускаемся в самый низ и пишем это:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[test_havka]: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&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь подробнее:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[test_havka]: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 ;Класс предмета, в данном случае &amp;quot;Еда&amp;quot; (лучше не менять)&lt;br /&gt;
cform				= skeleton ;Это не трогать&lt;br /&gt;
visual				= weapons\bred\bred.ogf ;Визуал (3d модель предмета)&lt;br /&gt;
description			= enc_equipment_food_bread1 ;Описание. Можно вписать своё, либо в соответствующий текстовый файл, либо сюда но через &amp;quot;&amp;quot;.&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 ;Стоимость предмета, можно указать свою. В данном случае, предмет стоит 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 ;Сколько порций в 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 ;Не менять&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получится булка. Все параметры остаются прежними, то есть 2 одинаковые булки, но нас интересуют не параметры, а вызов постэффекта.&lt;br /&gt;
Сохраняем, закрываем.&lt;br /&gt;
&lt;br /&gt;
2) Открываем файл '''escape_dialog.script'''&lt;br /&gt;
Спускаемся в самый низ и пишем вот это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_test_havka(obj) &lt;br /&gt;
local obj_sect = obj:section() &lt;br /&gt;
local snd &lt;br /&gt;
if obj_sect == &amp;quot;test_havka&amp;quot; then&lt;br /&gt;
	level.add_pp_effector(&amp;quot;alcohol.ppe&amp;quot;, 3000, false)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно обо всём:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_test_havka(obj) -- Имя функции, не должно повторяться. Элемент &amp;quot;function&amp;quot; должен присутствовать перед название функции&lt;br /&gt;
local obj_sect = obj:section() &lt;br /&gt;
local snd &lt;br /&gt;
if obj_sect == &amp;quot;test_havka&amp;quot; then --если объект &amp;quot;test_havka&amp;quot; использована&lt;br /&gt;
	level.add_pp_effector(&amp;quot;alcohol.ppe&amp;quot;, 3000, false) --то скриптовое наложение постэффекта алкогольного опьянения на 3000 миллисекунд.&lt;br /&gt;
end -- первая переменная &amp;quot;end&amp;quot;, завершает параметр &amp;quot;if&amp;quot;&lt;br /&gt;
end -- вторая переменная &amp;quot;end&amp;quot;, завершает функцию&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее в этом же скрипте находим строку:&lt;br /&gt;
''function give_weapon_to_actor (trader, actor)''&lt;br /&gt;
&lt;br /&gt;
Перед ''&amp;quot;end&amp;quot;'' вставляем строку:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;code&amp;gt;dialogs.relocate_item_section(trader, &amp;quot;test_havka&amp;quot;, &amp;quot;in&amp;quot;)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Сохраняем, закрываем. &lt;br /&gt;
&lt;br /&gt;
3) Заходим в '''bind_stalker.script'''&lt;br /&gt;
В функцию ''function actor_binder:net_destroy()''&lt;br /&gt;
вписываем это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, nil)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
В этом же файле в функцию ''actor_binder:reinit()''&lt;br /&gt;
пишем это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, self.use_object, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в конец файла пишем вот такую функцию:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj)&lt;br /&gt;
    escape_dialog.use_test_havka(obj)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj) --название функции&lt;br /&gt;
    escape_dialog.use_test_havka(obj) --вызов функции use_test_havka из файла escape_dialog&lt;br /&gt;
end -- окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем, закрываем.&lt;br /&gt;
Всё, можете проверять. После того, как захаваете батон, получите алкогольное опьянение. &lt;br /&gt;
&lt;br /&gt;
'''Автор:''' ''Dj_Ultor''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B</id>
		<title>SoC. Не бесконечные болты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B"/>
				<updated>2014-12-02T08:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак тут я опишу как реализовать болты которые будут заканчиваться.&lt;br /&gt;
Сразу пишу о том, что будем делать основываясь на гранатах, так, что не исключено что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).&lt;br /&gt;
&lt;br /&gt;
Итак приступим.&lt;br /&gt;
Нам потребуются такие файлы:&lt;br /&gt;
gamedata\config\weapons\w_rgd5.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\config\weapons\w_bolt.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\config\misc\items.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\scripts\escape_dialog.script&amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\scripts\bind_stalker.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В первую очередь лезем в файл w_bolt.ltx, там самая первая строка, которая за что-то отвечает:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Меняем её вот так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[old_bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
Затем, открываем файл w_rgd5.ltx, спускаемся в самый низ и пишем это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 &lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_weight			= 0.05&lt;br /&gt;
cost				= 1&lt;br /&gt;
hud					= bolt_hud2&lt;br /&gt;
ef_weapon_type		= 1&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot;&lt;br /&gt;
destroy_time		= 5000000;3500&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0&lt;br /&gt;
blast_r				= 0&lt;br /&gt;
blast_impulse		= 0&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0&lt;br /&gt;
frags_r				= 0&lt;br /&gt;
frag_hit			= 0&lt;br /&gt;
frag_hit_impulse	= 0&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode&lt;br /&gt;
snd_checkout = monsters\biting\def_0&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0&lt;br /&gt;
light_range		         = 0.0&lt;br /&gt;
light_time 		         = 0.0&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2]&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5&lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_weight			= 0.05 ;вес&lt;br /&gt;
cost				= 1 ;цена за штуку&lt;br /&gt;
hud					= bolt_hud2 ;--ссылка на худ&lt;br /&gt;
ef_weapon_type		= 1 ;тип оружия (не менять ни в коем случае, можно сломать двигло)&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot; ;--описание предмета&lt;br /&gt;
destroy_time		= 5000000;3500 ;лучше оставить как есть, а так это время через которое болт пропадёт&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0 ;мощность взрыва, так как это болт, пусть будет 0&lt;br /&gt;
blast_r				= 0 ; радиус взрыва&lt;br /&gt;
blast_impulse		= 0 ;импульс от взрыва (отражается на дальности отлёта туши от места взрыва)&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0 ;кол-во осколков&lt;br /&gt;
frags_r				= 0 ; радиус разлёта осколков&lt;br /&gt;
frag_hit			= 0 ; урон от 1 попавшего осколка&lt;br /&gt;
frag_hit_impulse	= 0 ; импульс от 1 попавшего осколка&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode звук взрыва&lt;br /&gt;
snd_checkout = monsters\biting\def_0 ;звук броска&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground ; партикл взрыва (в данном случае поставлен партикл ничего не показывающий)&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1 &lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0 ;цвет освещения во время взрыва по RGB&lt;br /&gt;
light_range		         = 0.0 ;насыщенность на сколько я понимаю&lt;br /&gt;
light_time 		         = 0.0 ;время подсветки&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2] ;секция худа&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf ;Визуал болта в руках гг&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, сохраняем, закрываем. Этот файл нам больше не нужен.&lt;br /&gt;
Теперь лезем в файл items.ltx и в конец пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt_box]:identity_immunities&lt;br /&gt;
GroupControlSection	= spawn_group&lt;br /&gt;
discovery_dependency = &lt;br /&gt;
$spawn 				= &amp;quot;food and drugs\kolbasa&amp;quot;&lt;br /&gt;
;$prefetch 			= 32&lt;br /&gt;
class				= II_FOOD&lt;br /&gt;
cform				= skeleton&lt;br /&gt;
visual				= physics\box\box_metall_01.ogf&lt;br /&gt;
radius				= 1&lt;br /&gt;
;script_binding		= escape_dialog.use_snd&lt;br /&gt;
&lt;br /&gt;
inv_name			        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
inv_name_short		        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
description			= &amp;quot;Коробка с болтами, содержит в себе 25 болтов.&amp;quot;&lt;br /&gt;
inv_weight			= 1.35&lt;br /&gt;
can_trade			= on&lt;br /&gt;
inv_grid_width		= 2&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 8&lt;br /&gt;
inv_grid_y			= 18&lt;br /&gt;
cost				= 30&lt;br /&gt;
&lt;br /&gt;
; eatable item&lt;br /&gt;
eat_health = 0&lt;br /&gt;
eat_satiety = 0&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&lt;br /&gt;
&lt;br /&gt;
attach_angle_offset		= 0.440521, 1.378287, -0.644026&lt;br /&gt;
attach_position_offset	= 0.104196, -0.010821, 0.076969&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;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем, закрываем.&lt;br /&gt;
Дальше мы должны открыть файл escape_dialog.script&lt;br /&gt;
В конец файла внесём свою функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
    	    end&lt;br /&gt;
	end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then -- объект который должны мы использовать (коробка болтов)&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг&lt;br /&gt;
    	    end -- окончание цикла for i =...&lt;br /&gt;
	end --окончание if&lt;br /&gt;
    end --окончание if&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом же файле находим функцию give_weapon_to_actor и вносим такие строчки перед end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt_box&amp;quot;, &amp;quot;in&amp;quot;)  &lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt&amp;quot;, &amp;quot;in&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом файле тоже всё.&lt;br /&gt;
Теперь ломимся в bind_stalker.script&lt;br /&gt;
Пишем в функцию function actor_binder:net_destroy() это: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, nil)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в функцию actor_binder:reinit() это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, self.use_object, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конец файла добавляем нашу функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj)&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj) -- function название нашей функции&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну вот и всё, сохраняем и закрываем данный файл.&lt;br /&gt;
Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза.&lt;br /&gt;
Надеюсь, что статья оказалась вам полезна.&lt;br /&gt;
&lt;br /&gt;
Автор: Dj Ultor&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B</id>
		<title>SoC. Не бесконечные болты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9D%D0%B5_%D0%B1%D0%B5%D1%81%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B5_%D0%B1%D0%BE%D0%BB%D1%82%D1%8B"/>
				<updated>2014-12-02T08:34:52Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак тут я опишу как реализовать болты которые будут заканчиваться.&lt;br /&gt;
Сразу пишу о том, что будем делать основываясь на гранатах, так, что не исключено что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).&lt;br /&gt;
&lt;br /&gt;
Итак приступим.&lt;br /&gt;
Нам потребуются такие файлы:&lt;br /&gt;
===gamedata\config\weapons\w_rgd5.ltx&lt;br /&gt;
gamedata\config\weapons\w_bolt.ltx&lt;br /&gt;
gamedata\config\misc\items.ltx&lt;br /&gt;
gamedata\scripts\escape_dialog.script&lt;br /&gt;
gamedata\scripts\bind_stalker.script===&lt;br /&gt;
&lt;br /&gt;
В первую очередь лезем в файл ===w_bolt.ltx===, там самая первая строка, которая за что-то отвечает:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Меняем её вот так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[old_bolt]:identity_immunities&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
Затем, открываем файл ===w_rgd5.ltx===, спускаемся в самый низ и пишем это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 &lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot;&lt;br /&gt;
inv_weight			= 0.05&lt;br /&gt;
cost				= 1&lt;br /&gt;
hud					= bolt_hud2&lt;br /&gt;
ef_weapon_type		= 1&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot;&lt;br /&gt;
destroy_time		= 5000000;3500&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0&lt;br /&gt;
blast_r				= 0&lt;br /&gt;
blast_impulse		= 0&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0&lt;br /&gt;
frags_r				= 0&lt;br /&gt;
frag_hit			= 0&lt;br /&gt;
frag_hit_impulse	= 0&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode&lt;br /&gt;
snd_checkout = monsters\biting\def_0&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0&lt;br /&gt;
light_range		         = 0.0&lt;br /&gt;
light_time 		         = 0.0&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2]&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5&lt;br /&gt;
visual				= weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта&lt;br /&gt;
inv_name			= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_name_short		= &amp;quot;Болт&amp;quot; ;--название&lt;br /&gt;
inv_weight			= 0.05 ;вес&lt;br /&gt;
cost				= 1 ;цена за штуку&lt;br /&gt;
hud					= bolt_hud2 ;--ссылка на худ&lt;br /&gt;
ef_weapon_type		= 1 ;тип оружия (не менять ни в коем случае, можно сломать двигло)&lt;br /&gt;
description			= &amp;quot;Обычный металлический болт&amp;quot; ;--описание предмета&lt;br /&gt;
destroy_time		= 5000000;3500 ;лучше оставить как есть, а так это время через которое болт пропадёт&lt;br /&gt;
&lt;br /&gt;
attach_position_offset	= -0.021,-0.075,0.0&lt;br /&gt;
attach_angle_offset		= 0,0,0&lt;br /&gt;
attach_bone_name		= &lt;br /&gt;
&lt;br /&gt;
blast				= 0 ;мощность взрыва, так как это болт, пусть будет 0&lt;br /&gt;
blast_r				= 0 ; радиус взрыва&lt;br /&gt;
blast_impulse		= 0 ;импульс от взрыва (отражается на дальности отлёта туши от места взрыва)&lt;br /&gt;
;delete&lt;br /&gt;
blast_impulse_factor = 1&lt;br /&gt;
&lt;br /&gt;
frags				= 0 ;кол-во осколков&lt;br /&gt;
frags_r				= 0 ; радиус разлёта осколков&lt;br /&gt;
frag_hit			= 0 ; урон от 1 попавшего осколка&lt;br /&gt;
frag_hit_impulse	= 0 ; импульс от 1 попавшего осколка&lt;br /&gt;
&lt;br /&gt;
;звуки&lt;br /&gt;
snd_explode = monsters\biting\def_0    ;rgd5_explode звук взрыва&lt;br /&gt;
snd_checkout = monsters\biting\def_0 ;звук броска&lt;br /&gt;
explode_particles	= weapons\wg-hit-ground ; партикл взрыва (в данном случае поставлен партикл ничего не показывающий)&lt;br /&gt;
&lt;br /&gt;
inv_grid_width		= 1 &lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 22&lt;br /&gt;
inv_grid_y			= 6&lt;br /&gt;
&lt;br /&gt;
light_color		         = 0.0,0.0,0.0 ;цвет освещения во время взрыва по RGB&lt;br /&gt;
light_range		         = 0.0 ;насыщенность на сколько я понимаю&lt;br /&gt;
light_time 		         = 0.0 ;время подсветки&lt;br /&gt;
&lt;br /&gt;
[bolt_hud2] ;секция худа&lt;br /&gt;
fire_point          = 0.05, 0.0, 0.1&lt;br /&gt;
fire_bone           = bolt_0&lt;br /&gt;
orientation         = 0,0,0&lt;br /&gt;
position            = 0,0,0&lt;br /&gt;
visual              = weapons\bolt\wpn_bolt_hud.ogf ;Визуал болта в руках гг&lt;br /&gt;
&lt;br /&gt;
throw_point			= 0,0.4,0.3&lt;br /&gt;
throw_dir			= 0,0,0&lt;br /&gt;
&lt;br /&gt;
anim_show			= draw3&lt;br /&gt;
anim_hide			= holster_0&lt;br /&gt;
anim_idle			= idle_0&lt;br /&gt;
anim_playing		= idle_01&lt;br /&gt;
anim_throw_begin	              = attack_0_begin&lt;br /&gt;
anim_throw_idle		= attack_0_idle&lt;br /&gt;
anim_throw_act		= attack_0_act	&lt;br /&gt;
anim_throw_end		= attack_0_end&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё, сохраняем, закрываем. Этот файл нам больше не нужен.&lt;br /&gt;
Теперь лезем в файл ===items.ltx=== и в конец пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[bolt_box]:identity_immunities&lt;br /&gt;
GroupControlSection	= spawn_group&lt;br /&gt;
discovery_dependency = &lt;br /&gt;
$spawn 				= &amp;quot;food and drugs\kolbasa&amp;quot;&lt;br /&gt;
;$prefetch 			= 32&lt;br /&gt;
class				= II_FOOD&lt;br /&gt;
cform				= skeleton&lt;br /&gt;
visual				= physics\box\box_metall_01.ogf&lt;br /&gt;
radius				= 1&lt;br /&gt;
;script_binding		= escape_dialog.use_snd&lt;br /&gt;
&lt;br /&gt;
inv_name			        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
inv_name_short		        = &amp;quot;Коробка болтов&amp;quot;&lt;br /&gt;
description			= &amp;quot;Коробка с болтами, содержит в себе 25 болтов.&amp;quot;&lt;br /&gt;
inv_weight			= 1.35&lt;br /&gt;
can_trade			= on&lt;br /&gt;
inv_grid_width		= 2&lt;br /&gt;
inv_grid_height		= 1&lt;br /&gt;
inv_grid_x			= 8&lt;br /&gt;
inv_grid_y			= 18&lt;br /&gt;
cost				= 30&lt;br /&gt;
&lt;br /&gt;
; eatable item&lt;br /&gt;
eat_health = 0&lt;br /&gt;
eat_satiety = 0&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&lt;br /&gt;
&lt;br /&gt;
attach_angle_offset		= 0.440521, 1.378287, -0.644026&lt;br /&gt;
attach_position_offset	= 0.104196, -0.010821, 0.076969&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;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем, закрываем.&lt;br /&gt;
Дальше мы должны открыть файл ===escape_dialog.script===&lt;br /&gt;
В конец файла внесём свою функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())&lt;br /&gt;
    	    end&lt;br /&gt;
	end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)&lt;br /&gt;
    if obj ~= nil then&lt;br /&gt;
        if obj:section() == &amp;quot;bolt_box&amp;quot; then -- объект который должны мы использовать (коробка болтов)&lt;br /&gt;
            for i = 1, 25 do --Совершаем спавн 25 раз&lt;br /&gt;
    	        alife():create(&amp;quot;bolt&amp;quot;, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг&lt;br /&gt;
    	    end -- окончание цикла for i =...&lt;br /&gt;
	end --окончание if&lt;br /&gt;
    end --окончание if&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом же файле находим функцию ==give_weapon_to_actor== и вносим такие строчки перед ==end==:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt_box&amp;quot;, &amp;quot;in&amp;quot;)  &lt;br /&gt;
    dialogs.relocate_item_section(trader, &amp;quot;bolt&amp;quot;, &amp;quot;in&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом файле тоже всё.&lt;br /&gt;
Теперь ломимся в ===bind_stalker.script===&lt;br /&gt;
Пишем в функцию ==function actor_binder:net_destroy()== это: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, nil)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И в функцию actor_binder:reinit() это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.object:set_callback(callback.use_object, self.use_object, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конец файла добавляем нашу функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj)&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:use_object(obj) -- function название нашей функции&lt;br /&gt;
    escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script&lt;br /&gt;
end --окончание функции&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну вот и всё, сохраняем и закрываем данный файл.&lt;br /&gt;
Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза.&lt;br /&gt;
Надеюсь, что статья оказалась вам полезна.&lt;br /&gt;
&lt;br /&gt;
Автор: Dj Ultor&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_C%2B%2B_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%BF%D1%80%D0%BE%D0%B3%D0%B0</id>
		<title>Как создать C++ скрипт-прога</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%B0%D0%BA_%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C_C%2B%2B_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%BF%D1%80%D0%BE%D0%B3%D0%B0"/>
				<updated>2014-10-26T14:33:16Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Очередная школоло-статья.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Как создать С++ скрипт-прога ===&lt;br /&gt;
Хотели создать компилятор-декомпилятор движка?&amp;lt;br/&amp;gt;&lt;br /&gt;
Без проблем. Что нам нужно:&amp;lt;br/&amp;gt;&lt;br /&gt;
-мозги знающие C++ :)&amp;lt;br/&amp;gt;&lt;br /&gt;
-Notepad++&amp;lt;br/&amp;gt;&lt;br /&gt;
Пока что это все, учтите, оно будет консольное.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Инсталлим плагин для Notepad-а++ CS Script, жмем New Script, в окошке диалога вбиваем название скрипта-проги C++.&amp;lt;br/&amp;gt;&lt;br /&gt;
Все, вбиваем необходимый код компиляции-декомпиляции (сам то я не умею &amp;gt;_&amp;lt;).&amp;lt;br/&amp;gt;&lt;br /&gt;
Переименовываем получающийся файл .exe в какой надо (к примеру xrD-C.exe).&amp;lt;br/&amp;gt;&lt;br /&gt;
Делаем батник (если делали команды) с примерно этим содержимым:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
НАЗВАНИЕ_ПРОГИ.exe -КОМАНДА -АУТ КОМАНДА (out)&lt;br /&gt;
Нет, но это может быть по вашим командам, то есть таким, как вы хотите.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Все, гарантирую, устанете когда закончите :) — Но хорошая штука будет :)&amp;lt;br/&amp;gt;&lt;br /&gt;
А также добавьте материал (как хотите, возможно .rar), а потом этот материал выложите сюда, на S.T.A.L.K.E.R. Inside\Inside Wiki (изначально просто Inside, на Wiki добавляются только картинки :))&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B4%D0%B8%D0%BD_%D0%B8%D0%B7_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2_%D1%81%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%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D0%B8%D0%B9</id>
		<title>Один из способов создание новых аномалий</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B4%D0%B8%D0%BD_%D0%B8%D0%B7_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%BE%D0%B2_%D1%81%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%B0%D0%BD%D0%BE%D0%BC%D0%B0%D0%BB%D0%B8%D0%B9"/>
				<updated>2014-09-06T08:01:14Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Визуальная правка кода #FantomICW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Вступление ==&lt;br /&gt;
В этой статье я расскажу вам как создать новые аномалии с разными свойствами при этом не создавая им новый конфиг. Приступим.&lt;br /&gt;
&lt;br /&gt;
== Практика ==&lt;br /&gt;
Возьмем для примера аномалию &amp;quot;Трамплин&amp;quot;&lt;br /&gt;
&amp;lt;ini&amp;gt;[zone_mosquito_bald]&lt;br /&gt;
GroupControlSection	= spawn_group_zone&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald&amp;quot;&lt;br /&gt;
$prefetch 		= 16&lt;br /&gt;
class			= ZS_MBALD&lt;br /&gt;
hit_impulse_scale	= 0.3;0.5 ;0.1&lt;br /&gt;
effective_radius	= 0.85 ;размер радиуса в процентах от оригинального, где действует зона&lt;br /&gt;
actor_blowout_radius_percent	= 0.75&lt;br /&gt;
&lt;br /&gt;
ef_anomaly_type			= 1&lt;br /&gt;
ef_weapon_type			= 13&lt;br /&gt;
&lt;br /&gt;
sound			= zone_mosquito_bald&lt;br /&gt;
&lt;br /&gt;
;postprocess		= mosquito_bald&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
hit_type			= strike&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 0.99&lt;br /&gt;
max_start_power		= 1.00&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
&lt;br /&gt;
idle_particles		= anomaly2\bold_idle&lt;br /&gt;
blowout_particles	= anomaly2\gravity_blast_01&lt;br /&gt;
&lt;br /&gt;
hit_small_particles			= hit_fx\hit_metal_02&lt;br /&gt;
hit_big_particles			= anomaly2\gravity_damage_02_blood2&lt;br /&gt;
idle_small_particles		= anomaly2\gravity_damage_01_smoke&lt;br /&gt;
idle_big_particles			= anomaly2\gravity_damage_02_smoke&lt;br /&gt;
entrance_small_particles	= anomaly2\gravity_entrance_small&lt;br /&gt;
entrance_big_particles		= anomaly2\gravity_entrance_big ;anomaly2\gravity_entrance_big&lt;br /&gt;
&lt;br /&gt;
idle_sound			= anomaly\gravi_rumble1; ambient\fx2		;постоянный звук&lt;br /&gt;
blowout_sound		= anomaly\anomaly_gravy_blast1; anomaly_gravy_blast01	;во время выброса(удара) в центре аномалии	&lt;br /&gt;
hit_sound			= anomaly\anomaly_gravy_hit1								;на персонаже, когда тот получает хит&lt;br /&gt;
entrance_sound		= anomaly\anomaly_gravy_hit1								;при попадании объекта в аномалию&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
awaking_time		= 50;100&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
&lt;br /&gt;
blowout_light_time		= 200&lt;br /&gt;
blowout_explosion_time	= 200&lt;br /&gt;
blowout_particles_time	= 200&lt;br /&gt;
blowout_sound_time  	= 100&lt;br /&gt;
&lt;br /&gt;
disable_time		= 5000		;время игнорирования неживого объекта в зоне (-1 если не нужно)&lt;br /&gt;
disable_time_small	= 5000		;время игнорирования маленького неживого объекта в зоне (-1 если не нужно)&lt;br /&gt;
disable_idle_time	= 1000		;время отключения idle партиклов&lt;br /&gt;
&lt;br /&gt;
ignore_nonalive		= false&lt;br /&gt;
ignore_small		= false&lt;br /&gt;
ignore_artefacts	= true&lt;br /&gt;
&lt;br /&gt;
blowout_light		= on&lt;br /&gt;
light_color		    = 0.5,0.4,0.3&lt;br /&gt;
light_range		    = 30.0&lt;br /&gt;
light_time 		    = 0.9;0.35&lt;br /&gt;
light_height		= 1.5			;подъем источника света на высоту&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
idle_light			= off&lt;br /&gt;
&lt;br /&gt;
visible_by_detector = on&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;рождение артефактов &lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.7, af_cristall_flower, 0.25,af_night_star, 0.05&lt;br /&gt;
&lt;br /&gt;
;;во время срабатывания в online&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
artefact_spawn_probability = 0.09				;вероятность, что во время срабатывания аномалии будет рожден артефакт&lt;br /&gt;
artefact_spawn_particles = anomaly2\pux_blast	;партиклы, которые отыграются на месте рождения артефакта (опционально)&lt;br /&gt;
artefact_born_sound =  anomaly\pux_blast		;звук, который отыграются на месте рождения артефакта (опционально)&lt;br /&gt;
&lt;br /&gt;
throw_out_power = 50			;импульс с которым артефакт будет выброшен из зоны в произвольном направлении&lt;br /&gt;
artefact_spawn_height = 3		;(м) высота на центром зоны где будет рожден артефакт&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;; ветер&lt;br /&gt;
blowout_wind		= on&lt;br /&gt;
&lt;br /&gt;
blowout_wind_time_start     = 0&lt;br /&gt;
blowout_wind_time_peak      = 300&lt;br /&gt;
blowout_wind_time_end		= 501; 899&lt;br /&gt;
blowout_wind_power			= 0.5			;сила поднимаего ветра (от 0 до 1), в момент blowout_wind_time_peak &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[zone_mosquito_bald_weak]:zone_mosquito_bald&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_weak&amp;quot;&lt;br /&gt;
awaking_time		= 80;100&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
&lt;br /&gt;
hit_impulse_scale	= 0.1&lt;br /&gt;
effective_radius	= 0.65 &lt;br /&gt;
actor_blowout_radius_percent= 0.6&lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.8, af_cristall_flower, 0.2,af_night_star, 0.0&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 0.49&lt;br /&gt;
max_start_power		= 0.5&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 1&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
artefact_spawn_rnd	= 50  ;вероятность заспавнить артефакт в процентах.&lt;br /&gt;
&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
ignore_nonalive		= false&lt;br /&gt;
ignore_small		= false&lt;br /&gt;
ignore_artefacts	= true&lt;br /&gt;
&lt;br /&gt;
blowout_wind_power			= 0.2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Не производящая артефактов слабая аномалия&lt;br /&gt;
[zone_mosquito_bald_weak_noart]:zone_mosquito_bald_weak&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_weak_noart&amp;quot;&lt;br /&gt;
spawn_blowout_artefacts = off&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
&lt;br /&gt;
[zone_mosquito_bald_average]:zone_mosquito_bald&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_average&amp;quot;&lt;br /&gt;
awaking_time		= 50&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
&lt;br /&gt;
hit_impulse_scale	= 0.2&lt;br /&gt;
effective_radius	= 0.75 &lt;br /&gt;
actor_blowout_radius_percent= 0.8&lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.6, af_cristall_flower, 0.4,af_night_star, 0.0&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 1.19&lt;br /&gt;
max_start_power		= 1.20&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 1&lt;br /&gt;
max_artefact_count	= 1&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
artefact_spawn_rnd	= 70  ;вероятность заспавнить артефакт в процентах.&lt;br /&gt;
&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
ignore_nonalive		= false&lt;br /&gt;
ignore_small		= false&lt;br /&gt;
ignore_artefacts	= true&lt;br /&gt;
&lt;br /&gt;
blowout_wind_power			= 0.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[zone_mosquito_bald_strong]:zone_mosquito_bald&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_strong&amp;quot;&lt;br /&gt;
awaking_time		= 30&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
accamulate_time		= 49&lt;br /&gt;
&lt;br /&gt;
hit_impulse_scale	= 0.2&lt;br /&gt;
effective_radius	= 0.8 &lt;br /&gt;
actor_blowout_radius_percent= 0.85&lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.2, af_cristall_flower, 0.6,af_night_star, 0.2&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 1.99&lt;br /&gt;
max_start_power		= 2.00&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 1&lt;br /&gt;
max_artefact_count	= 2&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
artefact_spawn_rnd	= 90  ;вероятность заспавнить артефакт в процентах.&lt;br /&gt;
&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
&lt;br /&gt;
blowout_wind_power			= 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Не производящая артефактов слабая аномалия&lt;br /&gt;
[zone_mosquito_bald_strong_noart]:zone_mosquito_bald_strong&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito_bald_strong_noart&amp;quot;&lt;br /&gt;
spawn_blowout_artefacts = off&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&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;
[zone_sarcofag]&lt;br /&gt;
GroupControlSection	= spawn_group_zone&lt;br /&gt;
$spawn 			= &amp;quot;zones\sarcofag zone&amp;quot;&lt;br /&gt;
$prefetch 		= 16&lt;br /&gt;
class			= Z_MBALD&lt;br /&gt;
hit_impulse_scale	= 0.3;0.5 ;0.1&lt;br /&gt;
effective_radius	= 0.85 ;размер радиуса в процентах от оригинального, где действует зона&lt;br /&gt;
actor_blowout_radius_percent	= 0.75&lt;br /&gt;
&lt;br /&gt;
ef_anomaly_type			= 1&lt;br /&gt;
ef_weapon_type			= 13&lt;br /&gt;
&lt;br /&gt;
sound			= zone_mosquito_bald&lt;br /&gt;
&lt;br /&gt;
postprocess		= mosquito_bald&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;рождение артефактов &lt;br /&gt;
artefacts		= &lt;br /&gt;
BirthProbability	= 0.0&lt;br /&gt;
spawn_blowout_artefacts = off&lt;br /&gt;
&lt;br /&gt;
hit_type			= strike&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 1.69&lt;br /&gt;
max_start_power		= 1.70&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
&lt;br /&gt;
idle_particles		= anomaly2\bold_idle_sarkofag&lt;br /&gt;
blowout_particles	= anomaly2\bold_sarkofag_blast&lt;br /&gt;
&lt;br /&gt;
hit_small_particles			= hit_fx\hit_metal_02&lt;br /&gt;
hit_big_particles			= anomaly2\gravity_damage_02_blood2&lt;br /&gt;
idle_small_particles		= anomaly2\gravity_damage_01_smoke&lt;br /&gt;
idle_big_particles			= anomaly2\gravity_damage_02_smoke&lt;br /&gt;
entrance_small_particles	= anomaly2\gravity_entrance_small&lt;br /&gt;
entrance_big_particles		= anomaly2\gravity_entrance_big ;anomaly2\gravity_entrance_big&lt;br /&gt;
&lt;br /&gt;
idle_sound			= anomaly\gravi_rumble1; ambient\fx2		;постоянный звук&lt;br /&gt;
blowout_sound		= anomaly\anomaly_gravy_blast1; anomaly_gravy_blast01	;во время выброса(удара) в центре аномалии	&lt;br /&gt;
hit_sound			= anomaly\anomaly_gravy_hit1								;на персонаже, когда тот получает хит&lt;br /&gt;
entrance_sound		= anomaly\anomaly_gravy_hit1								;при попадании объекта в аномалию&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
awaking_time		= 50;100&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
&lt;br /&gt;
blowout_light_time		= 200&lt;br /&gt;
blowout_explosion_time	= 200&lt;br /&gt;
blowout_particles_time	= 200&lt;br /&gt;
blowout_sound_time  	= 100&lt;br /&gt;
&lt;br /&gt;
disable_time		= 5000		;время игнорирования неживого объекта в зоне (-1 если не нужно)&lt;br /&gt;
disable_time_small	= 5000		;время игнорирования маленького неживого объекта в зоне (-1 если не нужно)&lt;br /&gt;
disable_idle_time	= 100		;время отключения idle партиклов&lt;br /&gt;
&lt;br /&gt;
ignore_nonalive		= false&lt;br /&gt;
ignore_small		= true&lt;br /&gt;
ignore_artefacts	= true&lt;br /&gt;
&lt;br /&gt;
blowout_light		= on&lt;br /&gt;
light_color		    = 0.5,0.4,0.3&lt;br /&gt;
light_range		    = 30.0&lt;br /&gt;
light_time 		    = 0.9;0.35&lt;br /&gt;
light_height		= 1.5			;подъем источника света на высоту&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
idle_light			= off&lt;br /&gt;
&lt;br /&gt;
visible_by_detector = on&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
artefact_spawn_probability = 0.00				;вероятность, что во время срабатывания аномалии будет рожден артефакт&lt;br /&gt;
artefact_spawn_particles = anomaly2\pux_blast	;партиклы, которые отыграются на месте рождения артефакта (опционально)&lt;br /&gt;
artefact_born_sound =  anomaly\pux_blast		;звук, который отыграются на месте рождения артефакта (опционально)&lt;br /&gt;
&lt;br /&gt;
throw_out_power = 50			;импульс с которым артефакт будет выброшен из зоны в произвольном направлении&lt;br /&gt;
artefact_spawn_height = 3		;(м) высота на центром зоны где будет рожден артефакт&lt;br /&gt;
&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;; ветер&lt;br /&gt;
blowout_wind		= off&lt;br /&gt;
&lt;br /&gt;
blowout_wind_time_start     = 0&lt;br /&gt;
blowout_wind_time_peak      = 300&lt;br /&gt;
blowout_wind_time_end		= 501; 899&lt;br /&gt;
blowout_wind_power			= 0.5			;сила поднимаего ветра (от 0 до 1), в момент blowout_wind_time_peak&amp;lt;/ini&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы видим три основных секции:&lt;br /&gt;
zone_mosquito_bald_weak - слабый трамплин,&lt;br /&gt;
zone_mosquito_bald_average - средний трамплин,&lt;br /&gt;
zone_mosquito_bald_strong - сильный трамплин.&lt;br /&gt;
&lt;br /&gt;
Я сделаю так, что сильный трамплин будет разрывать на куски подобно &amp;quot;Воронке&amp;quot;. Для этого найдем секцию [zone_mosquito_bald_strong] и добавим после $spawn = &amp;quot;zones\mosquito bald_strong&amp;quot; строчку &amp;quot;class = ZS_GALAN&amp;quot;(без кавычек). Должно получиться так:&lt;br /&gt;
&amp;lt;ini&amp;gt;[zone_mosquito_bald_strong]:zone_mosquito_bald&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_strong&amp;quot;&lt;br /&gt;
class                   = ZS_GALAN&lt;br /&gt;
awaking_time		= 30&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
accamulate_time		= 49&lt;br /&gt;
&lt;br /&gt;
hit_impulse_scale	= 0.2&lt;br /&gt;
effective_radius	= 0.8 &lt;br /&gt;
actor_blowout_radius_percent= 0.85&lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.2, af_cristall_flower, 0.6,af_night_star, 0.2&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 1.99&lt;br /&gt;
max_start_power		= 2.00&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 1&lt;br /&gt;
max_artefact_count	= 2&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
artefact_spawn_rnd	= 90  ;вероятность заспавнить артефакт в процентах.&lt;br /&gt;
&lt;br /&gt;
accamulate_time		= 1000 ;10;200&lt;br /&gt;
&lt;br /&gt;
blowout_wind_power			= 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Не производящая артефактов слабая аномалия&lt;br /&gt;
[zone_mosquito_bald_strong_noart]:zone_mosquito_bald_strong&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito_bald_strong_noart&amp;quot;&lt;br /&gt;
spawn_blowout_artefacts = off&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Думаю вы догадались, что класс &amp;quot;ZS_GALAN&amp;quot; мы взяли у воронки, можно сказать поменяв класс мы дали сильному трамплину свойство воронки разрывать на части. Но не спешите тестировать в игре! Мы забыли добавить некоторые параметры присущие воронке.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;tearing_particles	=anomaly2\body_tear_00 &lt;br /&gt;
torn_particles          =anomaly2\body_tear_01 &lt;br /&gt;
body_tearing_sound	= anomaly\anomaly_body_tear_1 &lt;br /&gt;
&lt;br /&gt;
;параметры телекинеза для зоны&lt;br /&gt;
throw_in_impulse			= 		0		;сила импульса втягивания (для тела 100кг)&lt;br /&gt;
throw_out_impulse			=		4000;		;сила выбрасывания взрывом&lt;br /&gt;
throw_in_impulse_alive		        = 		0	        ;сила импульса втягивания для живых&lt;br /&gt;
throw_in_atten				= 		2;8	        ;коэфф. затягивания (чем меньше, тем плавнее затягивает)&lt;br /&gt;
blowout_radius_percent		        = 		0.8		;радиус (в процентах от всего радиуса) непосредственно выброса&lt;br /&gt;
&lt;br /&gt;
tele_height				= 0	        ;высота подъема телекинеза &lt;br /&gt;
time_to_tele			        = 5000		;время деражания объекта в воздухе&lt;br /&gt;
tele_pause				= 5000		;пауза перед тем как снова поднять упавший объект&lt;br /&gt;
&lt;br /&gt;
accamulate_time		                = 1000 ;10;200&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция должна выглядеть вот так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[zone_mosquito_bald_strong]:zone_mosquito_bald&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito bald_strong&amp;quot;&lt;br /&gt;
class			= ZS_GALAN&lt;br /&gt;
awaking_time		= 30&lt;br /&gt;
blowout_time		= 500	&lt;br /&gt;
accamulate_time		= 49&lt;br /&gt;
&lt;br /&gt;
hit_impulse_scale	= 0.2&lt;br /&gt;
effective_radius	= 0.8 &lt;br /&gt;
actor_blowout_radius_percent= 0.85&lt;br /&gt;
&lt;br /&gt;
artefacts		= af_medusa,0.2, af_cristall_flower, 0.6,af_night_star, 0.2&lt;br /&gt;
BirthProbability	= 0.1&lt;br /&gt;
spawn_blowout_artefacts = on&lt;br /&gt;
&lt;br /&gt;
;----------- Anomaly settings -----------------------&lt;br /&gt;
min_start_power		= 1.99&lt;br /&gt;
max_start_power		= 2.00&lt;br /&gt;
attenuation			= 1&lt;br /&gt;
period				= 1&lt;br /&gt;
min_artefact_count	= 1&lt;br /&gt;
max_artefact_count	= 2&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&lt;br /&gt;
artefact_spawn_rnd	= 90  ;вероятность заспавнить артефакт в процентах.&lt;br /&gt;
&lt;br /&gt;
tearing_particles	=anomaly2\body_tear_00&lt;br /&gt;
torn_particles      =anomaly2\body_tear_01&lt;br /&gt;
body_tearing_sound	= anomaly\anomaly_body_tear_1&lt;br /&gt;
&lt;br /&gt;
;параметры телекинеза для зоны&lt;br /&gt;
throw_in_impulse			= 		0		    ;сила импульса втягивания (для тела 100кг)&lt;br /&gt;
throw_out_impulse			=		4000;		;сила выбрасывания взрывом&lt;br /&gt;
throw_in_impulse_alive		        = 		0	        ;сила импульса втягивания для живых&lt;br /&gt;
throw_in_atten				= 		2;8			;коэфф. затягивания (чем меньше, тем плавнее затягивает)&lt;br /&gt;
blowout_radius_percent		        = 		0.8		    ;радиус (в процентах от всего радиуса) непосредственно выброса&lt;br /&gt;
&lt;br /&gt;
tele_height				= 0;	3.5	;высота подъема телекинеза &lt;br /&gt;
time_to_tele			        = 5000		;время деражания объекта в воздухе&lt;br /&gt;
tele_pause				= 5000		;пауза перед тем как снова поднять упавший объект&lt;br /&gt;
&lt;br /&gt;
accamulate_time		                = 1000 ;10;200&lt;br /&gt;
&lt;br /&gt;
blowout_wind_power			= 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Не производящая артефактов слабая аномалия&lt;br /&gt;
[zone_mosquito_bald_strong_noart]:zone_mosquito_bald_strong&lt;br /&gt;
$spawn 			= &amp;quot;zones\mosquito_bald_strong_noart&amp;quot;&lt;br /&gt;
spawn_blowout_artefacts = off&lt;br /&gt;
min_artefact_count	= 0&lt;br /&gt;
max_artefact_count	= 0&lt;br /&gt;
artefact_spawn_idle	= 24  ;насколько часто спонить артефакты в офлайне, в часах&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готово! Теперь можно тестировать. Вот скрин где можно найти сильный трамплин.&lt;br /&gt;
http://rghost.ru/57862663/image.png&lt;br /&gt;
&lt;br /&gt;
== Несколько слов ==&lt;br /&gt;
Таким образом не создавая нового конфига можно редактировать уже известные нам секции и подгонять их под свой вкус.&lt;br /&gt;
Можно изменять эффекты, звук, задержку перед разрядкой нужной нам секции не опасаясь что это отразится на &amp;quot;донорной аномалии&amp;quot;.&lt;br /&gt;
Возможно такая статья уже есть, так что сильно не ругайте.&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</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%80%D0%B5%D0%BC%D0%BE%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0</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%80%D0%B5%D0%BC%D0%BE%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D0%B0"/>
				<updated>2014-06-19T19:24:18Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Категория, небольшие фиксы оформления #ficw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Создание ремонтного набора в Сталкер ТЧ.&lt;br /&gt;
&lt;br /&gt;
1. Открываем файл '''gamedata/config/misc/items.ltx''' и в самом конце пишем:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-------------------------------------------------------------------------------РЕМОНТНЫЙ НАБОР &lt;br /&gt;
[repair_kit]:identity_immunities&lt;br /&gt;
GroupControlSection	= spawn_group&lt;br /&gt;
discovery_dependency	=&lt;br /&gt;
$spawn			= &amp;quot;devices\quest_items\repair_kit&amp;quot;&lt;br /&gt;
$prefetch		= 32&lt;br /&gt;
class			= II_ANTIR&lt;br /&gt;
cform			= skeleton&lt;br /&gt;
visual			= physics\box\box_1c.ogf&lt;br /&gt;
radius			= 1&lt;br /&gt;
description		= &amp;quot;Ящик с инструментами для ремонта. Набор содержит инструменты и детали, &lt;br /&gt;
с помощью которых можно отремонтировать оружие и костюм.&amp;quot;&lt;br /&gt;
inv_name		= &amp;quot;Ремонтный набор&amp;quot;&lt;br /&gt;
inv_name_short		= &amp;quot;Ремонтный набор&amp;quot;&lt;br /&gt;
inv_weight		= 3.0&lt;br /&gt;
inv_grid_width		= 2&lt;br /&gt;
inv_grid_height		= 2&lt;br /&gt;
inv_grid_x		= 4&lt;br /&gt;
inv_grid_y		= 18&lt;br /&gt;
cost			= 500&lt;br /&gt;
eat_health		= 0&lt;br /&gt;
eat_satiety		= 0&lt;br /&gt;
eat_power		= 0&lt;br /&gt;
eat_radiation		= 0&lt;br /&gt;
eat_alcohol		= 0&lt;br /&gt;
wounds_heal_perc	= 0&lt;br /&gt;
eat_portions_num	= 3&lt;br /&gt;
animation_slot		= 4&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Теперь открываем файл '''gamedata/scripts/bind_stalker.script''' и после строчек&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:on_item_drop (obj)&lt;br /&gt;
    level_tasks.proceed(self.object)&lt;br /&gt;
    --game_stats.update_drop_item (obj, self.object)&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Пишем:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
exp_mod.itemuse(obj)	--Ремонтный набор&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Теперь в той же папке создаём скрипт с названием '''exp_mod.script''' и в нём пишем:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
--Скрипт NZK мода&lt;br /&gt;
--Здесь описаны всякие безделушки и мелкие поправки в скриптах&lt;br /&gt;
--by zek &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--- Скрипт на использование вещей прямо из инвенторя (в данном случае Ремонтного Набора)&lt;br /&gt;
--- Работа с bind_stalker.script/actor_binder:on_item_drop/&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
function itemuse(what)&lt;br /&gt;
     local obj_name = what:name()&lt;br /&gt;
    if (string.find(obj_name, &amp;quot;repair_kit&amp;quot;)) then&lt;br /&gt;
        use_repair_kit(what)&lt;br /&gt;
    -- If you want to add new trigger item, add script this line.&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--- Собственно процесс использования набора&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
function use_repair_kit(what)&lt;br /&gt;
    local repair_slot_num = 0&lt;br /&gt;
&lt;br /&gt;
    local item_in_slot_1 = db.actor:item_in_slot(1)&lt;br /&gt;
    local item_in_slot_2 = db.actor:item_in_slot(2)&lt;br /&gt;
    local item_in_slot_6 = db.actor:item_in_slot(6)&lt;br /&gt;
&lt;br /&gt;
    if (item_in_slot_1 ~= nil) then&lt;br /&gt;
        repair_slot_num = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if (item_in_slot_2 ~= nil) then&lt;br /&gt;
        if (repair_slot_num == 0) then&lt;br /&gt;
            repair_slot_num = 2&lt;br /&gt;
        elseif (repair_slot_num == 1) then&lt;br /&gt;
            if (item_in_slot_1:condition() &amp;gt; item_in_slot_2:condition()) then&lt;br /&gt;
                repair_slot_num = 2&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if (item_in_slot_6 ~= nil) then&lt;br /&gt;
        if (repair_slot_num == 0) then&lt;br /&gt;
            repair_slot_num = 6&lt;br /&gt;
        elseif  (repair_slot_num == 1) then&lt;br /&gt;
            if (item_in_slot_1:condition() &amp;gt; item_in_slot_6:condition()) then&lt;br /&gt;
                repair_slot_num = 6&lt;br /&gt;
            end&lt;br /&gt;
        elseif  (repair_slot_num == 2) then&lt;br /&gt;
            if (item_in_slot_2:condition() &amp;gt; item_in_slot_6:condition()) then&lt;br /&gt;
                repair_slot_num = 6&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if (repair_slot_num == 1) then&lt;br /&gt;
        local rep_point = item_in_slot_1:condition() + 10&lt;br /&gt;
        if (rep_point &amp;gt; 1) then&lt;br /&gt;
            rep_point = 1&lt;br /&gt;
        end&lt;br /&gt;
        item_in_slot_1:set_condition(rep_point)&lt;br /&gt;
    elseif (repair_slot_num == 2) then&lt;br /&gt;
        local rep_point = item_in_slot_2:condition() + 10&lt;br /&gt;
        if (rep_point &amp;gt; 1) then&lt;br /&gt;
            rep_point = 1&lt;br /&gt;
        end&lt;br /&gt;
        item_in_slot_2:set_condition(rep_point)&lt;br /&gt;
    elseif (repair_slot_num == 6) then&lt;br /&gt;
        local rep_point = item_in_slot_6:condition() + 10&lt;br /&gt;
        if (rep_point &amp;gt; 1) then&lt;br /&gt;
            rep_point = 1&lt;br /&gt;
        end&lt;br /&gt;
        item_in_slot_6:set_condition(rep_point)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
4. Всё! Теперь осталось добавить ремонтный набор в арсенал торговцев ('''gamedata/config/misc/trade_trader.ltx'''), подробнее читайте в статье [[SoC. Редактирование торговцев]].&lt;br /&gt;
&lt;br /&gt;
This article was written by SA STALKER RU MODS :)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%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%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2"/>
				<updated>2014-06-19T19:08:33Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Скрипты]]&lt;br /&gt;
&lt;br /&gt;
= Система сигналов в стиле Boost.Signals или делегатов C# =&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Как мы все знаем, давно распространена практика &amp;quot;навешивания&amp;quot; всевозможных действий на разные вызовы биндера актора: виртуальные функции, такие как '''net_spawn''' и '''update''', а также всевозможные колбеки. Как правило, это делается вставкой строки в один из методов биндера в модуле '''bind_stalker.script''' (в котором как раз и находится класс '''actor_binder'''). Для случая метода '''update''' это может выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:update(delta)&lt;br /&gt;
    object_binder.update(self, delta)&lt;br /&gt;
    ...&lt;br /&gt;
    my_module.update(delta)&lt;br /&gt;
    ...&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
здесь '''my_module.update(delta)''' - эта наша врезка. Вызовы из разных методов и колбеков используются для разных целей. Тот-же апдейт широко (даже слишком широко) используется для всевозможных периодических проверок. Данный подход имеет несколько недостатков.&lt;br /&gt;
&lt;br /&gt;
=== Недостатки существующих подходов ===&lt;br /&gt;
&lt;br /&gt;
1. Добавление очередного сервиса требует внесения изменений в модуль '''bind_stalker.script'''. Это не плохо само по себе, но постепенно приводит к замусориванию и разрастанию этого модуля, что не всем нравится. Кроме того, внесение изменений в существующий код потенциально чревато ошибками.&lt;br /&gt;
&lt;br /&gt;
2. Поскольку каждый новый добавляемый сервис пишется по-разному, то возникает изрядный разнобой как в именовании вызовов, так и в передаваемых аргументах. Это опять же не плохо само по себе, но затрудняет сопровождение кода.&lt;br /&gt;
&lt;br /&gt;
3. Усложнение отладки. Давно известна проблема подвисания различных вызовов биндера в случае возникновения в нем исключения движка. При таких ситуациях вызов тихо перестаёт вызываться с неопределёнными последствиями. Впрочем, неопределённость проявляется только в виде неочевидности и немгновенности эффектов. С точки зрения глобальных последствий всё достаточно определённо. Это почти всегда фатально для дальнейшего продолжения игры, приводит к порче сейвов и крайне мутным и трудноотлаживаемым глюкам.&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;
В общем, при дезорганизованном добавлении сервисов с этой проблемой крайне сложно бороться, что автор этих строк вполне прочувствовал на своей шкуре. К сожалению, хотя подобные приёмы и уродливые, они работают. Если не прибегать к движковым правкам, то ничего лучше в распоряжении модостроителей нет. Таким образом, если нельзя обойтись без использования этих трюков, то нужны инструменты, которые позволят как-то бороться с последствиями.&lt;br /&gt;
&lt;br /&gt;
Описанная здесь система событий как раз и позволяет во многой части преодолеть перечисленные проблемы.&lt;br /&gt;
&lt;br /&gt;
=== Кратко об идее события и подписки на событие ===&lt;br /&gt;
&lt;br /&gt;
Об этом много написано (см. boost.signals, делегаты C#, слоты и сигналы Qt и т.п.), но не лишним будет и повториться. Попробую изложить идею на конкретном примере.&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть ситуация, когда актор использует некий предмет в инвентаре. Мы имеем движковый колбек, который срабатывает при использовании предмета, расположен в модуле '''bind_stalker.script'''&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    ...&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Как было описано в предыдущей части, в модостроении этот колбек используется для многочисленных действий. К примеру, интерфейс использования спального мешка, ремкомплекта и вообще всевозможных устройств, активируемых предметов из инвентаря, дополнительные эффекты от съедаемых предметов и медикаментов и т.п. Соответственно, вызов соответствующих обработок может выглядеть примерно так:&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    sleep_manager.on_use(obj) -- активация спального мешка&lt;br /&gt;
    remkit.use_object(obj) -- активация ремкита&lt;br /&gt;
    healing.use_item(obj) -- дополнительные эффекты от препаратов&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Недостатки этого подхода были подробно описаны ранее. &lt;br /&gt;
&lt;br /&gt;
Что здесь событие? Событие - это факт использования актором предмета. Из примера видно, что событие одно, а действий, которые происходят по событию, может быть много. А может и не быть вовсе, хотя событие происходит вне зависимости от того, связаны ли с ним действия. Отсюда вытекает простая идея отделить событие от обработчиков события. Т.е. я хотел бы иметь в коде что-то вроде такого:&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    генерировать_событие_использования_предмета(obj)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
что приводило бы к срабатыванию функций '''sleep_manager.on_use(obj)''', '''remkit.use_object(obj)''' и '''healing.use_item(obj)'''. Естественно, что это потребует неких усилий: нужен некий промежуточный код, который будет хранить список функций, связанных с событием, который будет при активации события вызывать эти функции одна за другой, передавая в них один и тот-же аргумент; нужен сервисный код, который позволит регистрировать функции-обработчики и связывать их с конкретным событием, а также отвязывать. В частности, используя этот сервисный код, надо предварительно выполнить действия такого рода:&lt;br /&gt;
&amp;lt;lua&amp;gt;связать_функцию_с_событием_использования_предмета(sleep_manager.on_use)&lt;br /&gt;
связать_функцию_с_событием_использования_предмета(remkit.use_object)&lt;br /&gt;
связать_функцию_с_событием_использования_предмета(healing.use_item)&amp;lt;/lua&amp;gt;&lt;br /&gt;
чтобы система событий знала, что надо вызвать эти три функции. &lt;br /&gt;
&lt;br /&gt;
Немного о терминологии. В разных системах и языках для разных частей этого процесса используются разные названия. Событие (event) может также называться сигналом (signal). Функции-обработчики могут также называться слотами (slot), подписчиками (subscriber), делегатами (delegate), колбеками (callback). Соответственно процесс связывания сигнала и обработчика тоже может называться по-разному: (un)subscribe, (dis)connect, add/remove и прочие слова, которые так или иначе могут означать &amp;quot;связать&amp;quot;, &amp;quot;добавить&amp;quot;, &amp;quot;подписать&amp;quot;, &amp;quot;назначить&amp;quot; и т.п. В предлагаемой системе я использую термины &amp;quot;сигнал&amp;quot;, &amp;quot;слот&amp;quot;, &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;
# Как следствие единой системы вызовов для конкретного сигнала принимается соглашение о списках аргументов. Все подписчики на этот сигнал должны следовать этому соглашению. Это на самом деле сильно повышает надёжность системы в целом, поскольку снижает вероятность ошибок при разработке.&lt;br /&gt;
# Наличие централизованный системы вызовов даёт возможность использовать разные сервисы, которые в противном случае требовали бы индивидуальной и громоздкой реализации для каждого вызова. &lt;br /&gt;
#* Внедрена централизованная система отладки, которая автоматически определяет подвисший вызов. Теперь никакой подвисший колбек не останется незамеченным, если его обработка организована через менеджер сигналов. При этом никаких дополнительных усилий это не требует, не нужны обрамляющие отладочные вызовы, счётчики и т.п., поскольку это внедрено в код менеджера сигналов.&lt;br /&gt;
#* Частично сглаживается проблема драки за один объект между вызовами. Это особенно важно для обработчиков инвентарных предметов, а также событий нажатий клавиатуры. Общая проблема заключается в том, что событие одно, а адресовано оно как правило только одному из обработчиков. Т.е. использование предмета &amp;quot;спальный мешок&amp;quot; адресовано только обработчику менеджера сна. При этом, зачастую объект удаляется его обработчиком, что приводит к тому, что последующие обработчики имеют дело с объектом в стадии удаления (клиентский объект ещё есть, а серверного уже нет), что запросто может приводить к багам или дополнительному громоздкому коду, который должен эту ситуацию проверять. При использовании же системы сигналов у обработчиков есть возможность завершить цепочку вызовов на себе, и предотвратить вызов оставшихся в цепочке обработчиков. Для этого обработчик должен вернуть '''true''' (не вернуть ничего или вернуть '''false''' будет означать разрешение продолжить обработку). Кроме того, для некоторых вызовов сам менеджер производит проверку существования объекта, и если он уже удалён, то дальнейшие вызовы не будет сделаны вообще. Для обработчиков нажатий клавиатуры этот подход позволяет снизить нагрузку на процессор.&lt;br /&gt;
#* Есть возможность распределения нагрузки в виде низкоприоритетных (или очерёдных колбеков). В основном это имеет смысл только для использования вместе с сигналом update, тем не менее весьма полезно. Без такой фишки приходится делать это вручную со счётчиком, километровым кодом с if-ами и т.п.&lt;br /&gt;
# Обработчики можно не только подписывать на сигналы, но и отписывать. Это позволяет делать разнообразные динамические компоненты, которые &amp;quot;цепляются&amp;quot; к нужному сигналу и отсоединяются по мере необходимости. Это упрощает разработку, поскольку позволяет избежать громоздкого кода, который при отсутствии такой возможности проверял бы необходимость вызова, и, как следствие, повышает надёжность системы. Это активно используется, к примеру, в системе таймеров.&lt;br /&gt;
# На события можно подписывать не только обычные функции, но и методы классов. Это фишка конкретно этой реализации, но на мой взгляд полезная. Используется при реализации тех-же таймеров.&lt;br /&gt;
# В принципе возможны трюки с эмуляцией сигнала. Т.е. к примеру сигнал update биндера актора нормально вызывается из биндера актора, но никто не мешает принудительно вызывать его откуда-то ещё, что вызовет срабатывание всех подписанных на этот сигнал обработчиков. Я бы не рекомендовал использовать это без лишней нужды, но тем не менее возможность такая есть.&lt;br /&gt;
# Автоподключение модулей. Идея простая: пишется модуль с функциями-обработчиками каких-то событий, имя модуля должно следовать неким правилам для его распознавания менеджером, и также модуль должен содержать специальную переменную-метку и функцию, которая автоматически будет выполнена. В этой функции выполняется подписка на события функций из этого модуля. Используя эту технику можно написать модуль с колбеками, не изменив вообще ни строки ни в одном другом модуле. Всё, что надо сделать для его использования, просто поместить файл в папку scripts. Например, можно написать модуль, который выводит на худ информацию об объекте под прицелом по нажатию сочетания клавиш (нужны естественно колбеки на клавиши), или удаляет объект под прицелом, или меняет его свойства, или телепортирует актора на три метра вперёд, или открывает окно тестового спавна и т.п. Не нужен модуль, просто убрал его из папки со скриптами. Это всё очень удобно для отладочных модулей. Для использования в штатных компонентах не рекомендуется, поскольку по ряду причин для автоподписываемых модулей ослаблены проверки корректности.&lt;br /&gt;
&lt;br /&gt;
== Использование менеджера ==&lt;br /&gt;
&lt;br /&gt;
=== Общие сведения ===&lt;br /&gt;
&lt;br /&gt;
Код менеджера сигналов находится в двух модулях:&lt;br /&gt;
&lt;br /&gt;
'''ogse_signals.script''' - собственно менеджер сигналов&lt;br /&gt;
&lt;br /&gt;
'''ogse_signals_addons_list.script''' - список подписываемых модулей&lt;br /&gt;
&lt;br /&gt;
Глобальный объект менеджера сигналов существует в единственном экземпляре. Поучить его можно функцией '''ogse_signals.get_mgr()'''. Объект менеджера используется для всех дальнейших операций: подписки/отписки функций и вызова сигналов.&lt;br /&gt;
&lt;br /&gt;
Для подписки используется метод менеджера '''subscribe(slot_descriptor)''', для отписки - метод '''unsubscribe(slot_descriptor)''', для генерации сигнала - метод '''call(&amp;quot;signal_name&amp;quot;, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
'''slot_descriptor''' - это таблица, имеющая вид:&lt;br /&gt;
&amp;lt;lua&amp;gt;slot_descriptor = {signal = &amp;quot;signal_name&amp;quot;, fun = function_or_class_member, self = object_reference_or_nil, queued = true}&amp;lt;/lua&amp;gt;&lt;br /&gt;
Если необходимо отписать функцию от события, то надо сохранить этот дескриптор и позднее использовать его в функции '''unsubscribe'''. Для иллюстрации всего этого далее приводятся несколько конкретных примеров использования.&lt;br /&gt;
&lt;br /&gt;
=== Подписка глобальной функции ===&lt;br /&gt;
Допустим, имеется модуль '''some_module.script''', а в нём функция&lt;br /&gt;
&amp;lt;lua&amp;gt;function some_function(arg1, arg2)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда я могу выполнить подписку этой функции на сигнал &amp;quot;'''some_signal'''&amp;quot; таким образом:&lt;br /&gt;
&amp;lt;lua&amp;gt;local slot_desc = {signal = &amp;quot;some_signal&amp;quot;, fun = some_module.some_function} -- дескриптор слота&lt;br /&gt;
ogse_signals.get_mgr():subscribe(slot_desc) -- подписали слот&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С этого момента при генерации сигнала &amp;quot;'''some_signal'''&amp;quot; будет вызываться функция '''some_module.some_function'''. Генерация сигнала (а по-простому вызов) осуществляется так:&lt;br /&gt;
&amp;lt;lua&amp;gt;ogse_signals.get_mgr():call(&amp;quot;some_signal&amp;quot;, arg1, arg2) -- вызов сигнала. В каждый обработчик будут переданы аргументы arg1, arg2&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для отписки этой функции делаем так (при условии, что мы сохранили дескриптор слота '''slot_desc'''):&lt;br /&gt;
&amp;lt;lua&amp;gt;ogse_signals.get_mgr():unsubscribe(slot_desc) -- отписали функцию&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Замечание: модули, в котором находится функция '''some_module.some_function''', из которого осуществляется подписка и отписка функции и откуда вызывается сигнал, могут быть совершенно разными. Хотя чаще всего получается так, что первые три - это один модуль, а откуда вызывается сигнал - другой.&lt;br /&gt;
&lt;br /&gt;
=== Подписка глобальной функции в низкоприоритетную очередь ===&lt;br /&gt;
&lt;br /&gt;
Здесь рассмотрим пример подписки функции на очерЁдное выполнение или оно же выполнение с низким приоритетом. Смысл очерёдности в том, что за каждый вызов сигнала выполняются не все подписанные функции, а только одна, в следующий раз следующая за ней в очереди и т.д. по кругу. В основном это имеет смысл только для события &amp;quot;'''update'''&amp;quot;, которое вызывается из функции апдейта биндера актора. Используя эту возможность, можно распределить нагрузку между последовательными апдейтами за счёт снижения частоты вызовов каждого конкретного подписчика. Обращаю внимание, что при этом частота вызовов будет зависеть от количества подписчиков - чем их больше, тем реже они вызываются. Естественно, не для любых операций это годится, а только для тех, где важен факт срабатывания по принципу &amp;quot;пусть сработает хоть когда-нибудь&amp;quot;. Если важна скорость реакции, то всегда остаётся возможность подписать на то же событие апдейта с высоким приоритетом. Технически эта фишка работает с использованием второй очереди.&lt;br /&gt;
&lt;br /&gt;
В примере ниже подразумевается, что подписываемая функция и код подписывания/отписывания находятся в одном модуле. Таким образом, я могу избежать указания имени модуля. Более того, я могу использовать системную ссылку this, которая означает &amp;quot;этот модуль&amp;quot;, чтобы избежать потенциальных конфликтов имён (вдруг среди глобальных имён встречается '''on_update''').&lt;br /&gt;
&amp;lt;lua&amp;gt;function on_update() -- функция-обработчик события низкоприоритетного обновления&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
ogse_signals.get_mgr():subscribe({signal = &amp;quot;on_update&amp;quot;, fun = this.on_update, queued = true}) -- подписали&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
В качестве дополнительного замечания. В этом примере мы не хотим отписываться от сигнала. Это вполне нормальная ситуация в особенности для глобальных функций типа обработчиков периодического апдейта. В этом случае нет необходимости сохранять дескриптор слота и синтаксис в целом упрощается.&lt;br /&gt;
&lt;br /&gt;
=== Подписка метода класса ===&lt;br /&gt;
&lt;br /&gt;
Имеется возможность подписать на событие метод класса. Напоминаю, что при вызове метода класса в него передаётся скрытый аргумент self, соответственно, при регистрации обработчика надо в дескрипторе указать дополнительный параметр со ссылкой на объект класса. Пример ниже показывает идею, на которой основана работы системы таймеров:&lt;br /&gt;
&amp;lt;lua&amp;gt;class &amp;quot;simple_timer&amp;quot;&lt;br /&gt;
function simple_timer:__init() -- конструктор класса&lt;br /&gt;
    self.slot_desc = {signal = &amp;quot;on_update&amp;quot;, self = self, fun = self.on_update}&lt;br /&gt;
    self.sm = ogse_signals.get_mgr()&lt;br /&gt;
    sm:subscribe(self.slot_desc)&lt;br /&gt;
end&lt;br /&gt;
function simple_timer:on_update() -- функция периодической проверки некоего условия&lt;br /&gt;
    if &amp;lt;выполнилось некое условие&amp;gt; then&lt;br /&gt;
        self:on_finish()&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
function simple_timer:on_finish() -- отписка и завершение выполнения&lt;br /&gt;
    sm:unsubscribe(self.slot_desc)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере объект класса при своём создании сам регистрирует один из своих методов на событие периодического апдейта. Далее, в этой функции проверяется некое условие. Когда это условие выполняется, то вызывается функция завершения работы, которая, кроме выполнения разной полезной нагрузки, также разрегистрирует класс в менеджере сигналов. Таким образом, для начала работы этого простого таймера достаточно просто его создать.&lt;br /&gt;
&amp;lt;lua&amp;gt;simple_timer()&amp;lt;/lua&amp;gt;&lt;br /&gt;
и он автоматически начнёт работу. Более того, нет даже необходимости нигде хранить ссылку на этот объект, поскольку она хранится в менеджере сигналов (в поле '''self'''). При отписывании же, после окончании работы таймера, эта ссылка удаляется и вместе с ней сборщиком мусора удаляется и объект таймера.&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;'''call'''&amp;quot;, то такой класс, с одной стороны, можно подписать как глобальную функцию, а с другой - он может хранить состояние, в отличие от простой функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;class &amp;quot;some_luabind_class&amp;quot;&lt;br /&gt;
function some_luabind_class:__init()&lt;br /&gt;
	local mt = getmetatable(self)&lt;br /&gt;
	mt.__call = self.method_to_call&lt;br /&gt;
end&lt;br /&gt;
function some_luabind_class:method_to_call()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local slot_desc = {signal = &amp;quot;signal_name&amp;quot;, fun = some_luabind_class()}&lt;br /&gt;
ogse_signals.get_mgr():subscribe(slot_desc) -- подписали в высокоприоритетную очередь&lt;br /&gt;
--...&lt;br /&gt;
ogse_signals.get_mgr():unsubscribe(slot_desc) -- отписали&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функциональный класс на таблице строится немного сложнее:&lt;br /&gt;
&amp;lt;lua&amp;gt;local t = {}&lt;br /&gt;
function t:method_to_call()&lt;br /&gt;
end&lt;br /&gt;
local mt = {}&lt;br /&gt;
mt.__call = t.method_to_call&lt;br /&gt;
setmetatable(t, mt)&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
и далее всё как в предыдущем фрагменте.&lt;br /&gt;
&lt;br /&gt;
=== Подписка модуля ===&lt;br /&gt;
&lt;br /&gt;
Часто встречается ситуация, когда имеется некий файл скрипта, который содержит в себе набор обработчиков разных событий. Многие геймплейные минимоды представляют собой такие модули. Их интеграция обычно включает явное прописывание вызовов этих обработчиков из разных колбеков игры. Специально для облегчения этого процесса в менеджере сигналов имеется возможность подписывать модуль целиком. Для подписывания модуля надо сделать следующее:&lt;br /&gt;
1. Вписать имя модуля без расширения в таблицу '''addons''' в файле '''ogse_signals_addons_list.script'''. Допустим, у меня есть модуль '''my_module.script''', тогда я напишу так:&amp;lt;lua&amp;gt;addons = {&lt;br /&gt;
	&amp;quot;my_module&amp;quot;,&lt;br /&gt;
}&amp;lt;/lua&amp;gt;Примечание: запятая после последнего элемента массива допускается синтаксисом '''Lua'''.&lt;br /&gt;
&lt;br /&gt;
2. В самом модуле '''my_module.script''' должна иметься глобальная функция '''attach(sm)''' с единственным аргументом. Эта функция будет вызвана автоматически при старте игры, а аргумент - это ссылка на менеджер сигналов. Функция может выглядеть примерно так:&lt;br /&gt;
&amp;lt;lua&amp;gt;function attach(sm)&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_spawn&amp;quot;, fun = this.on_spawn})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_use&amp;quot;,   fun = this.on_item_use})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_update&amp;quot;,fun = this.on_update, queued = true})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_save&amp;quot;,  fun = this.on_save})&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
т.е. её задача - явно подписать на нужные сигналы обработчики из этого модуля. &lt;br /&gt;
&lt;br /&gt;
Этот подход позволяет выполнить интеграцию скриптовой части минимода с минимальным остальных скриптов. По сути, извне модуля меняется только таблица в файле '''ogse_signals_addons_list.script''' - туда добавляется одна строка. Разумеется, соответствующие сигналы уже должны быть заведены в разных колбеках мода, но для большинства стандартных сигналов (типа колбеков биндера актора update, spawn, use_item и т.п.) это обычно уже сделано. Также, соглашения о вызовах обработчиков из подключаемого модуля должны следовать соглашениям о вызовах соответствующих сигналов.&lt;br /&gt;
&lt;br /&gt;
=== Авторегистрация модуля ===&lt;br /&gt;
&lt;br /&gt;
Имеется возможность подключать модуль без вписывания его в файл '''ogse_signals_addons_list.script'''. Для этого он должен отвечать двум дополнительным требованиям:&lt;br /&gt;
# Имя модуля должно начинаться с &amp;quot;ogse_&amp;quot;&lt;br /&gt;
# Модуль должен содержать глобальную переменную '''auto_attach''', установленную в '''true'''.&lt;br /&gt;
&lt;br /&gt;
Менеджер сигналов сканирует каталог скриптов, находит подходящие по имени, проверяет наличие переменной '''auto_attach''' и её значение, наличие функции '''attach''', и если всё это присутствует, то пытается зарегистрировать модуль (т.е. собственно выполнить функцию '''attach''').&lt;br /&gt;
&lt;br /&gt;
Данный способ, несмотря на внешнее удобство, не рекомендуется использовать для &amp;quot;серьёзных&amp;quot; компонент. Дело в том, что если в модуле автоподключаемого модуля имеется синтаксическая ошибка, то при автоподключении он будет просто проигнорирован, что снижает надёжность системы. Данную возможность предпочтительно использовать для отладочных плагинов.&lt;br /&gt;
&lt;br /&gt;
В качестве лирического отступления. Данная фишка на заре создания этой системы была основным функционалом, ради которого я эту систему и делал. Мне нужна была возможность создавать отладочные модули, которые можно было подключать/отключать просто перенося файл скрипта в папку '''scripts'''. При наличии движковых колбеков на нажатия клавиш получается очень удобная система. К примеру, есть наработки по отладочным модулям, которые позволяют снимать информацию о разных объектах вблизи актора и выводить её в лог или на экран по нажатию нужных сочетаний. С другой стороны я не включаю эти модули в релиз для тестеров, и это не требует изменения ни одной строки кода.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%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%9C%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D1%81%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D0%BE%D0%B2"/>
				<updated>2014-06-19T19:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Скрипты]]&lt;br /&gt;
&lt;br /&gt;
= Система сигналов в стиле Boost.Signals или делегатов C# =&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Как мы все знаем, давно распространена практика &amp;quot;навешивания&amp;quot; всевозможных действий на разные вызовы биндера актора: виртуальные функции, такие как '''net_spawn''' и '''update''', а также всевозможные колбеки. Как правило, это делается вставкой строки в один из методов биндера в модуле '''bind_stalker.script''' (в котором как раз и находится класс '''actor_binder'''). Для случая метода '''update''' это может выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:update(delta)&lt;br /&gt;
    object_binder.update(self, delta)&lt;br /&gt;
    ...&lt;br /&gt;
    my_module.update(delta)&lt;br /&gt;
    ...&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
здесь '''my_module.update(delta)''' - эта наша врезка. Вызовы из разных методов и колбеков используются для разных целей. Тот-же апдейт широко (даже слишком широко) используется для всевозможных периодических проверок. Данный подход имеет несколько недостатков.&lt;br /&gt;
&lt;br /&gt;
=== Недостатки существующих подходов ===&lt;br /&gt;
&lt;br /&gt;
1. Добавление очередного сервиса требует внесения изменений в модуль '''bind_stalker.script'''. Это не плохо само по себе, но постепенно приводит к замусориванию и разрастанию этого модуля, что не всем нравится. Кроме того, внесение изменений в существующий код потенциально чревато ошибками.&lt;br /&gt;
&lt;br /&gt;
2. Поскольку каждый новый добавляемый сервис пишется по-разному, то возникает изрядный разнобой как в именовании вызовов, так и в передаваемых аргументах. Это опять же не плохо само по себе, но затрудняет сопровождение кода.&lt;br /&gt;
&lt;br /&gt;
3. Усложнение отладки. Давно известна проблема подвисания различных вызовов биндера в случае возникновения в нем исключения движка. При таких ситуациях вызов тихо перестаёт вызываться с неопределёнными последствиями. Впрочем, неопределённость проявляется только в виде неочевидности и немгновенности эффектов. С точки зрения глобальных последствий всё достаточно определённо. Это почти всегда фатально для дальнейшего продолжения игры, приводит к порче сейвов и крайне мутным и трудноотлаживаемым глюкам.&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;
В общем, при дезорганизованном добавлении сервисов с этой проблемой крайне сложно бороться, что автор этих строк вполне прочувствовал на своей шкуре. К сожалению, хотя подобные приёмы и уродливые, они работают. Если не прибегать к движковым правкам, то ничего лучше в распоряжении модостроителей нет. Таким образом, если нельзя обойтись без использования этих трюков, то нужны инструменты, которые позволят как-то бороться с последствиями.&lt;br /&gt;
&lt;br /&gt;
Описанная здесь система событий как раз и позволяет во многой части преодолеть перечисленные проблемы.&lt;br /&gt;
&lt;br /&gt;
=== Кратко об идее события и подписки на событие ===&lt;br /&gt;
&lt;br /&gt;
Об этом много написано (см. boost.signals, делегаты C#, слоты и сигналы Qt и т.п.), но не лишним будет и повториться. Попробую изложить идею на конкретном примере.&lt;br /&gt;
&lt;br /&gt;
Пусть у нас есть ситуация, когда актор использует некий предмет в инвентаре. Мы имеем движковый колбек, который срабатывает при использовании предмета, расположен в модуле '''bind_stalker.script'''&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    ...&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Как было описано в предыдущей части, в модостроении этот колбек используется для многочисленных действий. К примеру, интерфейс использования спального мешка, ремкомплекта и вообще всевозможных устройств, активируемых предметов из инвентаря, дополнительные эффекты от съедаемых предметов и медикаментов и т.п. Соответственно, вызов соответствующих обработок может выглядеть примерно так:&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    sleep_manager.on_use(obj) -- активация спального мешка&lt;br /&gt;
    remkit.use_object(obj) -- активация ремкита&lt;br /&gt;
    healing.use_item(obj) -- дополнительные эффекты от препаратов&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Недостатки этого подхода были подробно описаны ранее. &lt;br /&gt;
&lt;br /&gt;
Что здесь событие? Событие - это факт использования актором предмета. Из примера видно, что событие одно, а действий, которые происходят по событию, может быть много. А может и не быть вовсе, хотя событие происходит вне зависимости от того, связаны ли с ним действия. Отсюда вытекает простая идея отделить событие от обработчиков события. Т.е. я хотел бы иметь в коде что-то вроде такого:&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_binder:use_inventory_item(obj)&lt;br /&gt;
    генерировать_событие_использования_предмета(obj)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
что приводило бы к срабатыванию функций '''sleep_manager.on_use(obj)''', '''remkit.use_object(obj)''' и '''healing.use_item(obj)'''. Естественно, что это потребует неких усилий: нужен некий промежуточный код, который будет хранить список функций, связанных с событием, который будет при активации события вызывать эти функции одна за другой, передавая в них один и тот-же аргумент; нужен сервисный код, который позволит регистрировать функции-обработчики и связывать их с конкретным событием, а также отвязывать. В частности, используя этот сервисный код, надо предварительно выполнить действия такого рода:&lt;br /&gt;
&amp;lt;lua&amp;gt;связать_функцию_с_событием_использования_предмета(sleep_manager.on_use)&lt;br /&gt;
связать_функцию_с_событием_использования_предмета(remkit.use_object)&lt;br /&gt;
связать_функцию_с_событием_использования_предмета(healing.use_item)&amp;lt;/lua&amp;gt;&lt;br /&gt;
чтобы система событий знала, что надо вызвать эти три функции. &lt;br /&gt;
&lt;br /&gt;
Немного о терминологии. В разных системах и языках для разных частей этого процесса используются разные названия. Событие (event) может также называться сигналом (signal). Функции-обработчики могут также называться слотами (slot), подписчиками (subscriber), делегатами (delegate), колбеками (callback). Соответственно процесс связывания сигнала и обработчика тоже может называться по-разному: (un)subscribe, (dis)connect, add/remove и прочие слова, которые так или иначе могут означать &amp;quot;связать&amp;quot;, &amp;quot;добавить&amp;quot;, &amp;quot;подписать&amp;quot;, &amp;quot;назначить&amp;quot; и т.п. В предлагаемой системе я использую термины &amp;quot;сигнал&amp;quot;, &amp;quot;слот&amp;quot;, &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;
# Как следствие единой системы вызовов для конкретного сигнала принимается соглашение о списках аргументов. Все подписчики на этот сигнал должны следовать этому соглашению. Это на самом деле сильно повышает надёжность системы в целом, поскольку снижает вероятность ошибок при разработке.&lt;br /&gt;
# Наличие централизованный системы вызовов даёт возможность использовать разные сервисы, которые в противном случае требовали бы индивидуальной и громоздкой реализации для каждого вызова. &lt;br /&gt;
#* Внедрена централизованная система отладки, которая автоматически определяет подвисший вызов. Теперь никакой подвисший колбек не останется незамеченным, если его обработка организована через менеджер сигналов. При этом никаких дополнительных усилий это не требует, не нужны обрамляющие отладочные вызовы, счётчики и т.п., поскольку это внедрено в код менеджера сигналов.&lt;br /&gt;
#* Частично сглаживается проблема драки за один объект между вызовами. Это особенно важно для обработчиков инвентарных предметов, а также событий нажатий клавиатуры. Общая проблема заключается в том, что событие одно, а адресовано оно как правило только одному из обработчиков. Т.е. использование предмета &amp;quot;спальный мешок&amp;quot; адресовано только обработчику менеджера сна. При этом, зачастую объект удаляется его обработчиком, что приводит к тому, что последующие обработчики имеют дело с объектом в стадии удаления (клиентский объект ещё есть, а серверного уже нет), что запросто может приводить к багам или дополнительному громоздкому коду, который должен эту ситуацию проверять. При использовании же системы сигналов у обработчиков есть возможность завершить цепочку вызовов на себе, и предотвратить вызов оставшихся в цепочке обработчиков. Для этого обработчик должен вернуть '''true''' (не вернуть ничего или вернуть '''false''' будет означать разрешение продолжить обработку). Кроме того, для некоторых вызовов сам менеджер производит проверку существования объекта, и если он уже удалён, то дальнейшие вызовы не будет сделаны вообще. Для обработчиков нажатий клавиатуры этот подход позволяет снизить нагрузку на процессор.&lt;br /&gt;
#* Есть возможность распределения нагрузки в виде низкоприоритетных (или очерёдных колбеков). В основном это имеет смысл только для использования вместе с сигналом update, тем не менее весьма полезно. Без такой фишки приходится делать это вручную со счётчиком, километровым кодом с if-ами и т.п.&lt;br /&gt;
# Обработчики можно не только подписывать на сигналы, но и отписывать. Это позволяет делать разнообразные динамические компоненты, которые &amp;quot;цепляются&amp;quot; к нужному сигналу и отсоединяются по мере необходимости. Это упрощает разработку, поскольку позволяет избежать громоздкого кода, который при отсутствии такой возможности проверял бы необходимость вызова, и, как следствие, повышает надёжность системы. Это активно используется, к примеру, в системе таймеров.&lt;br /&gt;
# На события можно подписывать не только обычные функции, но и методы классов. Это фишка конкретно этой реализации, но на мой взгляд полезная. Используется при реализации тех-же таймеров.&lt;br /&gt;
# В принципе возможны трюки с эмуляцией сигнала. Т.е. к примеру сигнал update биндера актора нормально вызывается из биндера актора, но никто не мешает принудительно вызывать его откуда-то ещё, что вызовет срабатывание всех подписанных на этот сигнал обработчиков. Я бы не рекомендовал использовать это без лишней нужды, но тем не менее возможность такая есть.&lt;br /&gt;
# Автоподключение модулей. Идея простая: пишется модуль с функциями-обработчиками каких-то событий, имя модуля должно следовать неким правилам для его распознавания менеджером, и также модуль должен содержать специальную переменную-метку и функцию, которая автоматически будет выполнена. В этой функции выполняется подписка на события функций из этого модуля. Используя эту технику можно написать модуль с колбеками, не изменив вообще ни строки ни в одном другом модуле. Всё, что надо сделать для его использования, просто поместить файл в папку scripts. Например, можно написать модуль, который выводит на худ информацию об объекте под прицелом по нажатию сочетания клавиш (нужны естественно колбеки на клавиши), или удаляет объект под прицелом, или меняет его свойства, или телепортирует актора на три метра вперёд, или открывает окно тестового спавна и т.п. Не нужен модуль, просто убрал его из папки со скриптами. Это всё очень удобно для отладочных модулей. Для использования в штатных компонентах не рекомендуется, поскольку по ряду причин для автоподписываемых модулей ослаблены проверки корректности.&lt;br /&gt;
&lt;br /&gt;
== Использование менеджера ==&lt;br /&gt;
&lt;br /&gt;
=== Общие сведения ===&lt;br /&gt;
&lt;br /&gt;
Код менеджера сигналов находится в двух модулях:&lt;br /&gt;
&lt;br /&gt;
'''ogse_signals.script''' - собственно менеджер сигналов&lt;br /&gt;
&lt;br /&gt;
'''ogse_signals_addons_list.script''' - список подписываемых модулей&lt;br /&gt;
&lt;br /&gt;
Глобальный объект менеджера сигналов существует в единственном экземпляре. Поучить его можно функцией '''ogse_signals.get_mgr()'''. Объект менеджера используется для всех дальнейших операций: подписки/отписки функций и вызова сигналов.&lt;br /&gt;
&lt;br /&gt;
Для подписки используется метод менеджера '''subscribe(slot_descriptor)''', для отписки - метод '''unsubscribe(slot_descriptor)''', для генерации сигнала - метод '''call(&amp;quot;signal_name&amp;quot;, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
'''slot_descriptor''' - это таблица, имеющая вид:&lt;br /&gt;
&amp;lt;lua&amp;gt;slot_descriptor = {signal = &amp;quot;signal_name&amp;quot;, fun = function_or_class_member, self = object_reference_or_nil, queued = true}&amp;lt;/lua&amp;gt;&lt;br /&gt;
Если необходимо отписать функцию от события, то надо сохранить этот дескриптор и позднее использовать его в функции '''unsubscribe'''. Для иллюстрации всего этого далее приводятся несколько конкретных примеров использования.&lt;br /&gt;
&lt;br /&gt;
=== Подписка глобальной функции ===&lt;br /&gt;
Допустим, имеется модуль '''some_module.script''', а в нём функция&lt;br /&gt;
&amp;lt;lua&amp;gt;function some_function(arg1, arg2)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда я могу выполнить подписку этой функции на сигнал &amp;quot;'''some_signal'''&amp;quot; таким образом:&lt;br /&gt;
&amp;lt;lua&amp;gt;local slot_desc = {signal = &amp;quot;some_signal&amp;quot;, fun = some_module.some_function} -- дескриптор слота&lt;br /&gt;
ogse_signals.get_mgr():subscribe(slot_desc) -- подписали слот&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С этого момента при генерации сигнала &amp;quot;'''some_signal'''&amp;quot; будет вызываться функция '''some_module.some_function'''. Генерация сигнала (а по-простому вызов) осуществляется так:&lt;br /&gt;
&amp;lt;lua&amp;gt;ogse_signals.get_mgr():call(&amp;quot;some_signal&amp;quot;, arg1, arg2) -- вызов сигнала. В каждый обработчик будут переданы аргументы arg1, arg2&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для отписки этой функции делаем так (при условии, что мы сохранили дескриптор слота '''slot_desc'''):&lt;br /&gt;
&amp;lt;lua&amp;gt;ogse_signals.get_mgr():unsubscribe(slot_desc) -- отписали функцию&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Замечание: модули, в котором находится функция '''some_module.some_function''', из которого осуществляется подписка и отписка функции и откуда вызывается сигнал, могут быть совершенно разными. Хотя чаще всего получается так, что первые три - это один модуль, а откуда вызывается сигнал - другой.&lt;br /&gt;
&lt;br /&gt;
=== Подписка глобальной функции в низкоприоритетную очередь ===&lt;br /&gt;
&lt;br /&gt;
Здесь рассмотрим пример подписки функции на очерЁдное выполнение или оно же выполнение с низким приоритетом. Смысл очерёдности в том, что за каждый вызов сигнала выполняются не все подписанные функции, а только одна, в следующий раз следующая за ней в очереди и т.д. по кругу. В основном это имеет смысл только для события &amp;quot;'''update'''&amp;quot;, которое вызывается из функции апдейта биндера актора. Используя эту возможность, можно распределить нагрузку между последовательными апдейтами за счёт снижения частоты вызовов каждого конкретного подписчика. Обращаю внимание, что при этом частота вызовов будет зависеть от количества подписчиков - чем их больше, тем реже они вызываются. Естественно, не для любых операций это годится, а только для тех, где важен факт срабатывания по принципу &amp;quot;пусть сработает хоть когда-нибудь&amp;quot;. Если важна скорость реакции, то всегда остаётся возможность подписать на то же событие апдейта с высоким приоритетом. Технически эта фишка работает с использованием второй очереди.&lt;br /&gt;
&lt;br /&gt;
В примере ниже подразумевается, что подписываемая функция и код подписывания/отписывания находятся в одном модуле. Таким образом, я могу избежать указания имени модуля. Более того, я могу использовать системную ссылку this, которая означает &amp;quot;этот модуль&amp;quot;, чтобы избежать потенциальных конфликтов имён (вдруг среди глобальных имён встречается '''on_update''').&lt;br /&gt;
&amp;lt;lua&amp;gt;function on_update() -- функция-обработчик события низкоприоритетного обновления&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
ogse_signals.get_mgr():subscribe({signal = &amp;quot;on_update&amp;quot;, fun = this.on_update, queued = true}) -- подписали&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
В качестве дополнительного замечания. В этом примере мы не хотим отписываться от сигнала. Это вполне нормальная ситуация в особенности для глобальных функций типа обработчиков периодического апдейта. В этом случае нет необходимости сохранять дескриптор слота и синтаксис в целом упрощается.&lt;br /&gt;
&lt;br /&gt;
=== Подписка метода класса ===&lt;br /&gt;
&lt;br /&gt;
Имеется возможность подписать на событие метод класса. Напоминаю, что при вызове метода класса в него передаётся скрытый аргумент self, соответственно, при регистрации обработчика надо в дескрипторе указать дополнительный параметр со ссылкой на объект класса. Пример ниже показывает идею, на которой основана работы системы таймеров:&lt;br /&gt;
&amp;lt;lua&amp;gt;class &amp;quot;simple_timer&amp;quot;&lt;br /&gt;
function simple_timer:__init() -- конструктор класса&lt;br /&gt;
    self.slot_desc = {signal = &amp;quot;on_update&amp;quot;, self = self, fun = self.on_update}&lt;br /&gt;
    self.sm = ogse_signals.get_mgr()&lt;br /&gt;
    sm:subscribe(self.slot_desc)&lt;br /&gt;
end&lt;br /&gt;
function simple_timer:on_update() -- функция периодической проверки некоего условия&lt;br /&gt;
    if &amp;lt;выполнилось некое условие&amp;gt; then&lt;br /&gt;
        self:on_finish()&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
function simple_timer:on_finish() -- отписка и завершение выполнения&lt;br /&gt;
    sm:unsubscribe(self.slot_desc)&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере объект класса при своём создании сам регистрирует один из своих методов на событие периодического апдейта. Далее, в этой функции проверяется некое условие. Когда это условие выполняется, то вызывается функция завершения работы, которая, кроме выполнения разной полезной нагрузки, также разрегистрирует класс в менеджере сигналов. Таким образом, для начала работы этого простого таймера достаточно просто его создать.&lt;br /&gt;
&amp;lt;lua&amp;gt;simple_timer()&amp;lt;/lua&amp;gt;&lt;br /&gt;
и он автоматически начнёт работу. Более того, нет даже необходимости нигде хранить ссылку на этот объект, поскольку она хранится в менеджере сигналов (в поле '''self'''). При отписывании же, после окончании работы таймера, эта ссылка удаляется и вместе с ней сборщиком мусора удаляется и объект таймера.&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;'''call'''&amp;quot;, то такой класс, с одной стороны, можно подписать как глобальную функцию, а с другой - он может хранить состояние, в отличие от простой функции.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;class &amp;quot;some_luabind_class&amp;quot;&lt;br /&gt;
function some_luabind_class:__init()&lt;br /&gt;
	local mt = getmetatable(self)&lt;br /&gt;
	mt.__call = self.method_to_call&lt;br /&gt;
end&lt;br /&gt;
function some_luabind_class:method_to_call()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local slot_desc = {signal = &amp;quot;signal_name&amp;quot;, fun = some_luabind_class()}&lt;br /&gt;
ogse_signals.get_mgr():subscribe(slot_desc) -- подписали в высокоприоритетную очередь&lt;br /&gt;
--...&lt;br /&gt;
ogse_signals.get_mgr():unsubscribe(slot_desc) -- отписали&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функциональный класс на таблице строится немного сложнее:&lt;br /&gt;
&amp;lt;lua&amp;gt;local t = {}&lt;br /&gt;
function t:method_to_call()&lt;br /&gt;
end&lt;br /&gt;
local mt = {}&lt;br /&gt;
mt.__call = t.method_to_call&lt;br /&gt;
setmetatable(t, mt)&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
и далее всё как в предыдущем фрагменте.&lt;br /&gt;
&lt;br /&gt;
=== Подписка модуля ===&lt;br /&gt;
&lt;br /&gt;
Часто встречается ситуация, когда имеется некий файл скрипта, который содержит в себе набор обработчиков разных событий. Многие геймплейные минимоды представляют собой такие модули. Их интеграция обычно включает явное прописывание вызовов этих обработчиков из разных колбеков игры. Специально для облегчения этого процесса в менеджере сигналов имеется возможность подписывать модуль целиком. Для подписывания модуля надо сделать следующее:&lt;br /&gt;
1. Вписать имя модуля без расширения в таблицу '''addons''' в файле '''ogse_signals_addons_list.script'''. Допустим, у меня есть модуль '''my_module.script''', тогда я напишу так:&amp;lt;lua&amp;gt;addons = {&lt;br /&gt;
	&amp;quot;my_module&amp;quot;,&lt;br /&gt;
}&amp;lt;/lua&amp;gt;Примечание: запятая после последнего элемента массива допускается синтаксисом '''Lua'''.&lt;br /&gt;
&lt;br /&gt;
2. В самом модуле '''my_module.script''' должна иметься глобальная функция '''attach(sm)''' с единственным аргументом. Эта функция будет вызвана автоматически при старте игры, а аргумент - это ссылка на менеджер сигналов. Функция может выглядеть примерно так:&lt;br /&gt;
&amp;lt;lua&amp;gt;function attach(sm)&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_spawn&amp;quot;, fun = this.on_spawn})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_use&amp;quot;,   fun = this.on_item_use})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_update&amp;quot;,fun = this.on_update, queued = true})&lt;br /&gt;
	sm:subscribe({signal = &amp;quot;on_save&amp;quot;,  fun = this.on_save})&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
т.е. её задача - явно подписать на нужные сигналы обработчики из этого модуля. &lt;br /&gt;
&lt;br /&gt;
Этот подход позволяет выполнить интеграцию скриптовой части минимода с минимальным остальных скриптов. По сути, извне модуля меняется только таблица в файле '''ogse_signals_addons_list.script''' - туда добавляется одна строка. Разумеется, соответствующие сигналы уже должны быть заведены в разных колбеках мода, но для большинства стандартных сигналов (типа колбеков биндера актора update, spawn, use_item и т.п.) это обычно уже сделано. Также, соглашения о вызовах обработчиков из подключаемого модуля должны следовать соглашениям о вызовах соответствующих сигналов.&lt;br /&gt;
&lt;br /&gt;
=== Авторегистрация модуля ===&lt;br /&gt;
&lt;br /&gt;
Имеется возможность подключать модуль без вписывания его в файл '''ogse_signals_addons_list.script'''. Для этого он должен отвечать двум дополнительным требованиям:&lt;br /&gt;
# Имя модуля должно начинаться с &amp;quot;ogse_&amp;quot;&lt;br /&gt;
# Модуль должен содержать глобальную переменную '''auto_attach''', установленную в '''true'''.&lt;br /&gt;
&lt;br /&gt;
Менеджер сигналов сканирует каталог скриптов, находит подходящие по имени, проверяет наличие переменной '''auto_attach''' и её значение, наличие функции '''attach''', и если всё это присутствует, то пытается зарегистрировать модуль (т.е. собственно выполнить функцию '''attach''').&lt;br /&gt;
&lt;br /&gt;
Данный способ, несмотря на внешнее удобство, не рекомендуется использовать для &amp;quot;серьёзных&amp;quot; компонент. Дело в том, что если в модуле автоподключаемого модуля имеется синтаксическая ошибка, то при автоподключении он будет просто проигнорирован, что снижает надёжность системы. Данную возможность предпочтительно использовать для отладочных плагинов.&lt;br /&gt;
&lt;br /&gt;
В качестве лирического отступления. Данная фишка на заре создания этой системы была основным функционалом, ради которого я эту систему и делал. Мне нужна была возможность создавать отладочные модули, которые можно было подключать/отключать просто перенося файл скрипта в папку '''scripts'''. При наличии движковых колбеков на нажатия клавиш получается очень удобная система. К примеру, есть наработки по отладочным модулям, которые позволяют снимать информацию о разных объектах вблизи актора и выводить её в лог или на экран по нажатию нужных сочетаний. С другой стороны я не включаю эти модули в релиз для тестеров, и это не требует изменения ни одной строки кода.&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_%D1%80%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BA_%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8F%D0%BC_%D0%9D%D0%9F%D0%A1</id>
		<title>Интересный способ рандомной привязки визуалов к профилям НПС</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_%D1%80%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D0%BE%D0%B9_%D0%BF%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%BE%D0%B2_%D0%BA_%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8F%D0%BC_%D0%9D%D0%9F%D0%A1"/>
				<updated>2014-06-19T19:05:45Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Оформление, категория #ficw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Теория ==&lt;br /&gt;
В этой заметке я расскажу о том, как назначить нескольким профилям неписей разные визуалы, которые рандомно распределяться для каждого профиля. &lt;br /&gt;
Для примера возьмём деревню новичков из ТЧ. Находим в файле '''gamedata/config/gameplay/character_desc_escape.ltx''' профили новичков обитающих в деревне возле бункера Сидоровича:&amp;lt;xml&amp;gt;&amp;lt;!-- - - - - - - -         STALKER NOVICE         - - - - - - - --&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default1&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_2&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;140&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;12&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\newbie\&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\novice\green_stalker_2&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_bm16 \n&lt;br /&gt;
			ammo_12x70_buck \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;		&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default2&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_2&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;127&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;-8&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_01\newbie\&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\novice\green_stalker_2&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;
			device_torch \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default3&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_3&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;214&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;9&amp;lt;/reputation&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;&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\novice\green_stalker_3&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_bm16 \n&lt;br /&gt;
			ammo_12x70_buck \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default4&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_3&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;175&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;8&amp;lt;/reputation&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;&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\novice\green_stalker_3&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;
#include &amp;quot;gameplay\character_items.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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default5&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_4&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;268&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;-10&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_02\newbie\&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\novice\green_stalker_4&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_bm16 \n&lt;br /&gt;
			ammo_12x70_buck \n&lt;br /&gt;
			device_torch \n&lt;br /&gt;
#include &amp;quot;gameplay\character_items.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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default6&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_4&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;133&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;6&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_02\newbie\&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\novice\green_stalker_4&amp;lt;/visual&amp;gt;&lt;br /&gt;
		&amp;lt;supplies&amp;gt;&lt;br /&gt;
			[spawn] \n&lt;br /&gt;
			wpn_bm16 \n&lt;br /&gt;
			ammo_12x70_buck \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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default9&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_5&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;224&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;18&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_02\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\novice\green_stalker_5&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;
#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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;!-- - - - - - - -                  - - - - - - - --&amp;gt;&lt;br /&gt;
	&amp;lt;specific_character id=&amp;quot;esc_stalker_novice_default10&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;name&amp;gt;GENERATE_NAME_stalker&amp;lt;/name&amp;gt;&lt;br /&gt;
		&amp;lt;icon&amp;gt;ui_npc_u_green_stalker_5&amp;lt;/icon&amp;gt;&lt;br /&gt;
		&amp;lt;bio&amp;gt;esc_stalker_novice_bio&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;class&amp;gt;esc_stalker_novice&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;58&amp;lt;/rank&amp;gt;&lt;br /&gt;
		&amp;lt;reputation&amp;gt;-2&amp;lt;/reputation&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;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;snd_config&amp;gt;characters_voice\human_02\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\novice\green_stalker_5&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;
			device_torch \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;hello_dialog&amp;lt;/start_dialog&amp;gt;&lt;br /&gt;
#include &amp;quot;gameplay\character_dialogs.xml&amp;quot;&lt;br /&gt;
	&amp;lt;/specific_character&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нас интересуют теги ''&amp;lt;visual&amp;gt;     &amp;lt;/visual&amp;gt;'' - в них указывается название профиля. Как видно из представленных выше профилей, каждому отдельному профилю строго присвоен свой визуал. Всегда ли уместна такая точность?&lt;br /&gt;
У нас есть группа профилей НПС и несколько визуалов подходящих этой группе профилей, можно предположить, что не важно какому именно НПС присвоеться определённый визуал. Проще говоря, в игре, все новички в деревне одинаковые, только куртки разные у них и нам не важно какая именно куртка будет на том или ином мужике.&lt;br /&gt;
Мы выбираем нужные нам визуалы для какой то группы НПС ''(из gamedata/meshes/actors)'' даём  визуалам любое '''одинаковое''' имя, после имени ставим знак подчёркивания и цифру или число. Пример:&lt;br /&gt;
 &amp;lt;pre&amp;gt; name_1.ogf&lt;br /&gt;
 name_2.ogf&lt;br /&gt;
 mame_24.ogf&amp;lt;/pre&amp;gt; &lt;br /&gt;
Затем в нужных профилях НПС в тегах ''&amp;lt;visual&amp;gt; &amp;lt;/visual&amp;gt;'' пишем имя которое задавали нашим визуалам. В примере выше, имя визуалов было ''name'' , в этом случае теги заполняются примерно так: ''&amp;lt;visual&amp;gt;actors\novice\name&amp;lt;/visual&amp;gt;''.&lt;br /&gt;
Таким образом визуалы рандомно распределятся по каждому профилю.&lt;br /&gt;
&lt;br /&gt;
== Отработанный пример на деревне новичков. ==&lt;br /&gt;
&lt;br /&gt;
Находим профили новичков в файле '''gamedata/config/gameplay/character_desc_escape.ltx''', (их профили были вынесены, в этом уроке выше). И мы, например, скачали 5 новых визуалов которые привяжем к новичкам. Нам бы пришлось каждый раз прописывать отдельный визуал в каждом профиле, но мы поступим по другому, для начала мы переименуем скаченные визуалы таким образом:&lt;br /&gt;
 &amp;lt;pre&amp;gt; esc_novichok_1.ogf&lt;br /&gt;
 esc_novichok_2.ogf&lt;br /&gt;
 esc_novichok_3.ogf&lt;br /&gt;
 esc_novichok_4.ogf&lt;br /&gt;
 esc_novichok_5.ogf&amp;lt;/pre&amp;gt;&lt;br /&gt;
Закидываем эти визуалы, например сюда: '''gamedata\meshes\actors\novice'''&lt;br /&gt;
Прописываем '''во всех профилях''' новичков визуал таким образом: ''&amp;lt;visual&amp;gt;actors\novice\esc_novichok&amp;lt;/visual&amp;gt;'' сохраняем, начинаем новую игру, приходим в деревню, видим наших новичков в новых визуалах.&lt;br /&gt;
== Несколько слов ==&lt;br /&gt;
Возможно кто то создавал подобную статью, я не видел даже похожего, если что сильно не ругайте.&lt;br /&gt;
Таким образом возможно задавать несколько визуалов не только группе, но и одному НПС, факт в том что распределение визуалов рандомно и при начале новой игры  НПС скорее всего поменяют визуал. Это может пригодиться для сюжетных модов которые имеют разветвлённый сюжет и  рассчитаны не на одно прохождение, проходя такой мод второй раз с начала, игрок не только узнаёт альтернативную ветку развития сюжета но и встречает знакомых НПС в других визуалах, что усиливает ощущения альтернативности - фактически играет в новый мод.&lt;br /&gt;
Такое явление я проверял в ТЧ в других аддонах не гарантирую работу.&lt;br /&gt;
В будущем возможно проверю такой эффект на именах предметов, оружия и тд.&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</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%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%BB%D0%BE%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%D0%BC%D0%B8</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%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%BB%D0%BE%D0%BA%D0%B0%D1%86%D0%B8%D1%8F%D0%BC%D0%B8"/>
				<updated>2014-06-19T18:59:15Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Перенес в раздел скриптов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Левел-чейнджер ==&lt;br /&gt;
Мы создадим левел-чейнджер на месте ГГ. Наш диалог создаст переход и ГГ попадет куда угодно.&lt;br /&gt;
== Реализация ==&lt;br /&gt;
Вы уже создали диалоги, если нет - статья [[Создание диалогов]]. Ниже есть функции создающие левел-чейнджер. Их ОЧЕНЬ много (на любой вкус):&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function create_level_changer(&lt;br /&gt;
	p_story_id,	-- STORY_ID нового level_changer (понадобится нам позже)&lt;br /&gt;
	p_position,	-- вектор, координаты точки, в которой будет располагаться центр нового level_changer&lt;br /&gt;
	p_lvertex_id,	-- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer&lt;br /&gt;
	p_gvertex_id,	-- game_vertext_id   	&lt;br /&gt;
 &lt;br /&gt;
	p_dest_lv,	-- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока &lt;br /&gt;
	p_dest_gv,	-- game_vertex_id&lt;br /&gt;
	p_dest_pos,	-- координаты точки, в которой на новом уровне окажется игрок&lt;br /&gt;
	p_dest_dir,	-- направрение взгляда игрока&lt;br /&gt;
	p_dest_level,	-- название уровня, например &amp;quot;L11_Pripyat&amp;quot;&lt;br /&gt;
	p_silent	-- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)&lt;br /&gt;
)&lt;br /&gt;
	local obj = alife():create(&amp;quot;level_changer&amp;quot;, p_position, p_lvertex_id, p_gvertex_id)&lt;br /&gt;
 &lt;br /&gt;
	level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
 &lt;br /&gt;
	-- свойства cse_alife_object&lt;br /&gt;
	local game_vertex_id 			= packet:r_u16()&lt;br /&gt;
	local cse_alife_object__unk1_f32 	= packet:r_float()&lt;br /&gt;
	local cse_alife_object__unk2_u32 	= packet:r_u32()&lt;br /&gt;
	local level_vertex_id 			= packet:r_u32()&lt;br /&gt;
	local object_flags 			= packet:r_u32()&lt;br /&gt;
	local custom_data 			= packet:r_stringZ()&lt;br /&gt;
	local story_id 				= packet:r_u32()&lt;br /&gt;
	local spawn_story_id			= packet:r_u32()&lt;br /&gt;
 &lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	local shape_count 			= packet:r_u8()&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type 		= packet:r_u8()&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			local center 		= packet:r_vec3()&lt;br /&gt;
			local radius 		= packet:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			local axis_x_x = packet:r_float()&lt;br /&gt;
			local axis_x_y = packet:r_float()&lt;br /&gt;
			local axis_x_z = packet:r_float()&lt;br /&gt;
			local axis_y_x = packet:r_float()&lt;br /&gt;
			local axis_y_y = packet:r_float()&lt;br /&gt;
			local axis_y_z = packet:r_float()&lt;br /&gt;
			local axis_z_x = packet:r_float()&lt;br /&gt;
			local axis_z_y = packet:r_float()&lt;br /&gt;
			local axis_z_z = packet:r_float()&lt;br /&gt;
			local offset_x = packet:r_float()&lt;br /&gt;
			local offset_y = packet:r_float()&lt;br /&gt;
			local offset_z = packet:r_float()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	-- свойства cse_alife_space_restrictor&lt;br /&gt;
	local restrictor_type 			= packet:r_u8()&lt;br /&gt;
 &lt;br /&gt;
	-- свойства cse_level_changer&lt;br /&gt;
	local dest_game_vertex_id		= packet:r_u16()  &lt;br /&gt;
	local dest_level_vertex_id 		= packet:r_u32()  &lt;br /&gt;
	local dest_position 			= packet:r_vec3()&lt;br /&gt;
	local dest_direction 			= packet:r_vec3()&lt;br /&gt;
	local dest_level_name 			= packet:r_stringZ()&lt;br /&gt;
	local dest_graph_point 			= packet:r_stringZ()&lt;br /&gt;
	local silent_mode 			= packet:r_u8()&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	packet:w_begin(game_vertex_id)			-- game_vertex_id&lt;br /&gt;
	packet:w_float(cse_alife_object__unk1_f32)&lt;br /&gt;
	packet:w_u32(cse_alife_object__unk2_u32) &lt;br /&gt;
	packet:w_u32(level_vertex_id)			-- level_vertex_id&lt;br /&gt;
	packet:w_u32( bit_not(193) )			-- object_flags = -193 = 0xFFFFFF3E&lt;br /&gt;
	packet:w_stringZ(custom_data)&lt;br /&gt;
	packet:w_u32(p_story_id)			-- story_id&lt;br /&gt;
	packet:w_u32(spawn_story_id)&lt;br /&gt;
 &lt;br /&gt;
	packet:w_u8(1)			-- количество фигур&lt;br /&gt;
--		packet:w_u8(0)			-- тип фигуры: сфера&lt;br /&gt;
--		packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center&lt;br /&gt;
--		packet:w_float(3.0)&lt;br /&gt;
	packet:w_u8(1)			-- тип фигуры: box&lt;br /&gt;
	packet:w_float(2)	   -- axis_x_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_x&lt;br /&gt;
	packet:w_float(4)	   -- axis_y_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_y&lt;br /&gt;
	packet:w_float(4)	   -- axis_z_z&lt;br /&gt;
	packet:w_float(0)	   -- offset_x&lt;br /&gt;
	packet:w_float(0)	   -- offset_y&lt;br /&gt;
	packet:w_float(0)          -- offset_z&lt;br /&gt;
 &lt;br /&gt;
	packet:w_u8(3)	 	   -- restrictor_type&lt;br /&gt;
 &lt;br /&gt;
	packet:w_u16(p_dest_gv)			-- destination game_vertex_id&lt;br /&gt;
	packet:w_s32(p_dest_lv)			-- destination level_vertex_id&lt;br /&gt;
	packet:w_vec3(p_dest_pos)		-- destination position&lt;br /&gt;
	packet:w_vec3(p_dest_dir)		-- destination direction (направление взгляда)&lt;br /&gt;
	packet:w_stringZ(p_dest_level)		-- destination level name&lt;br /&gt;
	packet:w_stringZ(&amp;quot;start_actor_02&amp;quot;)	-- some string, always const&lt;br /&gt;
	packet:w_u8(p_silent)			-- 1 for silent level changing&lt;br /&gt;
 &lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
 level.add_pp_effector (&amp;quot;teleport.ppe&amp;quot;, 2006, false)&lt;br /&gt;
 &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function exit_as()	&lt;br /&gt;
    	create_level_changer(11077, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	28719,&lt;br /&gt;
			            1758,&lt;br /&gt;
			            vector():set(-317.23675537109,-26.327833175659,55.278633117676),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l07_military&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_as2()	&lt;br /&gt;
    	create_level_changer(11078, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	66343,&lt;br /&gt;
			            1786,&lt;br /&gt;
			            vector():set(-274.62121582031,-27.297189712524,239.00979614258),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l07_military&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_as3()	&lt;br /&gt;
    	create_level_changer(11079, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	273147,&lt;br /&gt;
			            1821,&lt;br /&gt;
			            vector():set(-33.368682861328,-20.897382736206,379.58074951172),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l07_military&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_as4()	&lt;br /&gt;
    	create_level_changer(11080, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	83694,&lt;br /&gt;
			            1852,&lt;br /&gt;
			            vector():set(-243.89454650879,-0.28634393215179,435.28894042969),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l07_military&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_bunker()	&lt;br /&gt;
    	create_level_changer(11085, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	7807,&lt;br /&gt;
			            2773,&lt;br /&gt;
			            vector():set(8.3457946777344,-23.525426864624,19.003190994263),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l10u_bunker&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka()	&lt;br /&gt;
		create_level_changer(11041, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	127101,&lt;br /&gt;
			            351,&lt;br /&gt;
			            vector():set(-77.325019836426,-3.660080909729,195.34251403809),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka2()	&lt;br /&gt;
		create_level_changer(11042, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	1201,&lt;br /&gt;
			            260,&lt;br /&gt;
			            vector():set(-289.04534912109,-6.6783475875854,-178.82406616211),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka3()	&lt;br /&gt;
		create_level_changer(11043, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	344517,&lt;br /&gt;
			            401,&lt;br /&gt;
			            vector():set(200.77691650391,-0.638019323349,-145.20561218262),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka4()	&lt;br /&gt;
		create_level_changer(11044, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	284570,&lt;br /&gt;
			            374,&lt;br /&gt;
			            vector():set(122.61166381836,-4.2376079559326,153.47959899902),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka5()	&lt;br /&gt;
		create_level_changer(11045, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	324917,&lt;br /&gt;
			            384,&lt;br /&gt;
			            vector():set(173.82795715332,-0.30577194690704,51.149074554443),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka6()	&lt;br /&gt;
		create_level_changer(11046, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	311456,&lt;br /&gt;
			            385,&lt;br /&gt;
			            vector():set(97.819366455078,15.575645446777,31.107891082764),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_svalka7()	&lt;br /&gt;
		create_level_changer(11047, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	166216,&lt;br /&gt;
			            332,&lt;br /&gt;
			            vector():set(-49.738338470459,20.034204483032,115.88290405273),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka8()	&lt;br /&gt;
		create_level_changer(11048, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	2848,&lt;br /&gt;
			            314,&lt;br /&gt;
			            vector():set(-277.18438720703,0.42264106869698,26.608871459961),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka9()	&lt;br /&gt;
		create_level_changer(11049, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	27161,&lt;br /&gt;
			            308,&lt;br /&gt;
			            vector():set(-204.31503295898,0.77477610111237,-14.08620929718),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka10()	&lt;br /&gt;
		create_level_changer(11050, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	117566,&lt;br /&gt;
			            299,&lt;br /&gt;
			            vector():set(-43.285057067871,22.38338470459,-109.06379699707),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka11()	&lt;br /&gt;
		create_level_changer(11051, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	123627,&lt;br /&gt;
			            268,&lt;br /&gt;
			            vector():set(-82.571281433105,-2.6017231941223,-208.38046264648),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_svalka12()	&lt;br /&gt;
		create_level_changer(11052, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	272734,&lt;br /&gt;
			            263,&lt;br /&gt;
			            vector():set(108.47253417969,-2.2334003448486,-264.66119384766),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l02_garbage&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_pripyat()	&lt;br /&gt;
		create_level_changer(11086, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	260269,&lt;br /&gt;
			            2219,&lt;br /&gt;
			            vector():set(190.84159851074,2.8052725791931,212.05661010742),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l11_pripyat&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;exit_pripyat&amp;quot;)				&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_pripyat2()	&lt;br /&gt;
		create_level_changer(11087, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	7817,&lt;br /&gt;
			            2216,&lt;br /&gt;
			            vector():set(-112.93630981445,2.8031325340271,97.108512878418),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l11_pripyat&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;exit_pripyat2&amp;quot;)				&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_x18()	&lt;br /&gt;
		create_level_changer(11056, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	4086,&lt;br /&gt;
			            1155,&lt;br /&gt;
			            vector():set(5.0796270370483,-12.429841995239,15.65408706665),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l04u_labx18&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_td()	&lt;br /&gt;
		create_level_changer(11057, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	212105,&lt;br /&gt;
			            1025,&lt;br /&gt;
			            vector():set(31.025503158569,-2.9186296463013,-18.474792480469),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l04_darkvalley&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_td2()	&lt;br /&gt;
		create_level_changer(11058, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	377579,&lt;br /&gt;
			            938,&lt;br /&gt;
			            vector():set(177.20614624023,6.6501698493958,-368.2509765625),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l04_darkvalley&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon()	&lt;br /&gt;
		create_level_changer(11026, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	557888,&lt;br /&gt;
			            245,&lt;br /&gt;
			            vector():set(288.75579833984,6.6381821632385,334.9274597168),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon2()	&lt;br /&gt;
		create_level_changer(11027, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	220208,&lt;br /&gt;
			            16,&lt;br /&gt;
			            vector():set(-56.72008895874,-29.649417877197,-352.75286865234),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon3()	&lt;br /&gt;
		create_level_changer(11028, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	314641,&lt;br /&gt;
			            198,&lt;br /&gt;
			            vector():set(33.526428222656,4.8442959785461,406.35510253906),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon4()	&lt;br /&gt;
		create_level_changer(11029, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	326234,&lt;br /&gt;
			            97,&lt;br /&gt;
			            vector():set(43.707790374756,1.604367017746,157.83784484863),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon5()	&lt;br /&gt;
		create_level_changer(11030, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	346954,&lt;br /&gt;
			            97,&lt;br /&gt;
			            vector():set(59.635650634766,19.672622680664,156.50126647949),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon6()	&lt;br /&gt;
		create_level_changer(11031, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	479316,&lt;br /&gt;
			            242,&lt;br /&gt;
			            vector():set(176.90881347656,6.2265067100525,274.12582397461),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon7()	&lt;br /&gt;
		create_level_changer(11032, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	418761,&lt;br /&gt;
			            115,&lt;br /&gt;
			            vector():set(116.21976470947,-7.5939545631409,-16.879535675049),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon8()	&lt;br /&gt;
		create_level_changer(11033, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	71846,&lt;br /&gt;
			            30,&lt;br /&gt;
			            vector():set(-178.17098999023,-29.790063858032,-355.4208984375),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon9()	&lt;br /&gt;
		create_level_changer(11034, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	116591,&lt;br /&gt;
			            19,&lt;br /&gt;
			            vector():set(-138.1682434082,-25.440311431885,-356.09561157227),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon10()	&lt;br /&gt;
		create_level_changer(11035, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	46406,&lt;br /&gt;
			            38,&lt;br /&gt;
			            vector():set(-206.31811523438,-36.486312866211,-275.36505126953),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon11()	&lt;br /&gt;
		create_level_changer(11036, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	34087,&lt;br /&gt;
			            47,&lt;br /&gt;
			            vector():set(-218.33445739746,-19.930738449097,-167.60050964355),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon12()	&lt;br /&gt;
		create_level_changer(11037, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	45951,&lt;br /&gt;
			            58,&lt;br /&gt;
			            vector():set(-207.27334594727,-22.535316467285,-128.54507446289),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon13()	&lt;br /&gt;
		create_level_changer(11038, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	11502,&lt;br /&gt;
			            67,&lt;br /&gt;
			            vector():set(-246.82745361328,-14.313711166382,-17.025833129883),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon14()	&lt;br /&gt;
		create_level_changer(11039, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	143574,&lt;br /&gt;
			            73,&lt;br /&gt;
			            vector():set(-112.90689849854,-8.191520690918,7.4986095428467),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_kordon15()	&lt;br /&gt;
		create_level_changer(11040, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	274973,&lt;br /&gt;
			            108,&lt;br /&gt;
			            vector():set(-1.5780007839203,-17.687986373901,-152.26568603516),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l01_escape&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_radar()	&lt;br /&gt;
		create_level_changer(11081, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	93230,&lt;br /&gt;
			            2081,&lt;br /&gt;
			            vector():set(351.03564453125,-45.688995361328,-201.36804199219),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l10_radar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_radar2()	&lt;br /&gt;
		create_level_changer(11082, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	67978,&lt;br /&gt;
			            1930,&lt;br /&gt;
			            vector():set(304.68270874023,-39.390411376953,-25.789834976196),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l10_radar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_radar3()	&lt;br /&gt;
		create_level_changer(11083, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	14611,&lt;br /&gt;
			            2013,&lt;br /&gt;
			            vector():set(14.053562164307,-1.2424700260162,41.381050109863),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l10_radar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_radar4()	&lt;br /&gt;
		create_level_changer(11084, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	6439,&lt;br /&gt;
			            1960,&lt;br /&gt;
			            vector():set(-12.000325202942,0.37741497159004,-67.812171936035),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l10_radar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;exit_radar4&amp;quot;)				&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_undergraund()	&lt;br /&gt;
		create_level_changer(11088, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	2505,&lt;br /&gt;
			            745,&lt;br /&gt;
			            vector():set(-84.987205505371,-16.462963104248,-60.738975524902),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l03_agr_underground&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_bar()	&lt;br /&gt;
		create_level_changer(11059, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	45474,&lt;br /&gt;
			            1188,&lt;br /&gt;
			            vector():set(193.61143493652,0.097166806459427,71.526657104492),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_bar2()	&lt;br /&gt;
		create_level_changer(11060, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	39883,&lt;br /&gt;
			            1204,&lt;br /&gt;
			            vector():set(175.31533813477,-0.0002819299697876,145.91943359375),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_bar3()	&lt;br /&gt;
		create_level_changer(11061, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	47206,&lt;br /&gt;
			            1270,&lt;br /&gt;
			            vector():set(198.24176025391,3.271665096283,-77.252685546875),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_bar4()	&lt;br /&gt;
		create_level_changer(11062, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	59366,&lt;br /&gt;
			            1277,&lt;br /&gt;
			            vector():set(232.64491271973,5.1447978019714,-113.61502838135),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_bar5()	&lt;br /&gt;
		create_level_changer(11063, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	68763,&lt;br /&gt;
			            1274,&lt;br /&gt;
			            vector():set(276.64755249023,0.055086404085159,-66.742523193359),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_bar6()	&lt;br /&gt;
		create_level_changer(11064, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	35860,&lt;br /&gt;
			            1238,&lt;br /&gt;
			            vector():set(128.80438232422,-4.8249382972717,16.76756477356),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_bar7()	&lt;br /&gt;
		create_level_changer(11065, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	33903,&lt;br /&gt;
			            1239,&lt;br /&gt;
			            vector():set(116.09830474854,-5.3052234649658,12.649393081665),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l05_bar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_agroprom()	&lt;br /&gt;
		create_level_changer(11053, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	428448,&lt;br /&gt;
			            498,&lt;br /&gt;
			            vector():set(253.95002746582,-0.20055566728115,76.619018554688),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l03_agroprom&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
function exit_agroprom2()	&lt;br /&gt;
		create_level_changer(11054, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	117939,&lt;br /&gt;
			            523,&lt;br /&gt;
			            vector():set(-122.60626983643,10.350003242493,164.23361206055),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l03_agroprom&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_agroprom3()	&lt;br /&gt;
		create_level_changer(11055, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	103987,&lt;br /&gt;
			            621,&lt;br /&gt;
			            vector():set(-135.0357208252,4.9933753013611,-196.9232635498),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l03_agroprom&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar1()	&lt;br /&gt;
		create_level_changer(11066, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	6635,&lt;br /&gt;
			            1486,&lt;br /&gt;
			            vector():set(-98.555587768555,-12.03422164917,-263.20428466797),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar2()	&lt;br /&gt;
		create_level_changer(11067, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	22009,&lt;br /&gt;
			            1454,&lt;br /&gt;
			            vector():set(-49.516319274902,-12.687213897705,-263.55654907227),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar3()	&lt;br /&gt;
		create_level_changer(11068, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	85543,&lt;br /&gt;
			            1440,&lt;br /&gt;
			            vector():set(87.165092468262,1.5326626300812,-137.15473937988),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar4()	&lt;br /&gt;
		create_level_changer(11069, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	98895,&lt;br /&gt;
			            1520,&lt;br /&gt;
			            vector():set(110.79859924316,0.51710104942322,67.085777282715),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar5()	&lt;br /&gt;
		create_level_changer(11070, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	93237,&lt;br /&gt;
			            1515,&lt;br /&gt;
			            vector():set(102.05886077881,-0.055661827325821,-38.264953613281),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar6()	&lt;br /&gt;
		create_level_changer(11071, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	50739,&lt;br /&gt;
			            1505,&lt;br /&gt;
			            vector():set(23.551870346069,-3.417268037796,-50.092147827148),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar7()	&lt;br /&gt;
		create_level_changer(11072, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	57034,&lt;br /&gt;
			            1445,&lt;br /&gt;
			            vector():set(35.566432952881,0.036594957113266,19.930288314819),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar8()	&lt;br /&gt;
		create_level_changer(11073, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	87168,&lt;br /&gt;
			            1514,&lt;br /&gt;
			            vector():set(90.726051330566,0.028770864009857,-2.0428421497345),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar9()	&lt;br /&gt;
		create_level_changer(11074, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	38250,&lt;br /&gt;
			            1525,&lt;br /&gt;
			            vector():set(-2.272828578949,0.31553617119789,-12.611492156982),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar10()	&lt;br /&gt;
		create_level_changer(11075, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	39736,&lt;br /&gt;
			            1525,&lt;br /&gt;
			            vector():set(0.41521853208542,20.732145309448,-11.2778673172),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_yantar11()	&lt;br /&gt;
		create_level_changer(11076, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	53157,&lt;br /&gt;
			            1480,&lt;br /&gt;
			            vector():set(28.687835693359,-5.943422794342,-272.9033203125),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l08_yantar&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt1()	&lt;br /&gt;
		create_level_changer(11089, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	15216,&lt;br /&gt;
			            1391,&lt;br /&gt;
			            vector():set(-236.99816894531,9.3585262298584,56.257476806641),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt2()	&lt;br /&gt;
		create_level_changer(11090, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	8119,&lt;br /&gt;
			            1382,&lt;br /&gt;
			            vector():set(-254.47462463379,-5.8917918205261,88.748420715332),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt3()	&lt;br /&gt;
		create_level_changer(11091, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	4658,&lt;br /&gt;
			            1379,&lt;br /&gt;
			            vector():set(-268.44509887695,-6.0012273788452,106.45835113525),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt4()	&lt;br /&gt;
		create_level_changer(11092, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	7269,&lt;br /&gt;
			            1338,&lt;br /&gt;
			            vector():set(-282.68493652344,-0.0055593848228455,203.75721740723),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt5()	&lt;br /&gt;
		create_level_changer(11093, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	32043,&lt;br /&gt;
			            1329,&lt;br /&gt;
			            vector():set(-173.43870544434,-0.0011672079563141,192.25354003906),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt6()	&lt;br /&gt;
		create_level_changer(11094, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	38957,&lt;br /&gt;
			            1328,&lt;br /&gt;
			            vector():set(-149.55770874023,0.096051603555679,179.93653869629),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt7()	&lt;br /&gt;
		create_level_changer(11095, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	22437,&lt;br /&gt;
			            1370,&lt;br /&gt;
			            vector():set(-217.82315063477,1.935809969902,88.06103515625),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt8()	&lt;br /&gt;
		create_level_changer(11096, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	32382,&lt;br /&gt;
			            1322,&lt;br /&gt;
			            vector():set(-169.39688110352,-0.0033434927463531,82.040466308594),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt9()	&lt;br /&gt;
		create_level_changer(11097, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	36070,&lt;br /&gt;
			            1321,&lt;br /&gt;
			            vector():set(-159.36485290527,-0.0026704967021942,99.839752197266),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt10()	&lt;br /&gt;
		create_level_changer(11098, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	27318,&lt;br /&gt;
			            1326,&lt;br /&gt;
			            vector():set(-192.9693145752,-0.0026823878288269,119.04988098145),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exit_dt11()	&lt;br /&gt;
		create_level_changer(11099, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 &lt;br /&gt;
                    	46578,&lt;br /&gt;
			            1421,&lt;br /&gt;
			            vector():set(-89.581573486328,3.1074571609497,148.33610534668),	&lt;br /&gt;
                        vector():set(0.0, 0.0, 0.0),	&lt;br /&gt;
						&amp;quot;l06_rostok&amp;quot;,&lt;br /&gt;
                        1)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Комментарии к функциям есть в первой функции.&lt;br /&gt;
Активировать через диалог:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;action&amp;gt;название_скрипта.название_функции_без_скобок&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источник ==&lt;br /&gt;
В моде Hand Teleport на любой вкус.&lt;br /&gt;
&lt;br /&gt;
== Статьи автор ==&lt;br /&gt;
vllzl&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%8B</id>
		<title>Таймеры</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D1%8B"/>
				<updated>2014-06-19T14:56:50Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Оформление, категория #ficw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для чего нужны таймеры?&lt;br /&gt;
Предположим, вы хотите, чтобы Меченому после диалога пришло сообщение на ПДА, но не сразу, а для придания большего реализма с задержкой в ~7-8 секунд. В таком случае, если вы читаете эту статью, то у вас есть:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
- Готовый диалог&amp;lt;br&amp;gt;&lt;br /&gt;
- Необходимая функция в свежем скриптовом файле.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы создать таймер, необходимо открыть файл с вашими скриптами и написать следующее :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;local iTimer&lt;br /&gt;
function function_onetimer()&lt;br /&gt;
    iTimer = time_global() + 6*1000 &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function timer_5_minutes()&lt;br /&gt;
    if iTimer and iTimer &amp;lt; time_global() then &lt;br /&gt;
        iTimer = nil &lt;br /&gt;
        wolfscripts.humorist_killed_msg() &lt;br /&gt;
    end&lt;br /&gt;
end &amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Разъясню: &lt;br /&gt;
&amp;lt;lua&amp;gt;function function_onetimer() — название функции (это главная функция и её будем вызывать из диалога)&lt;br /&gt;
    iTimer = time_global() + 6*1000 -- задержка по времени (6 секунд)&lt;br /&gt;
function timer_5_minutes() — собственно, настройки таймера&lt;br /&gt;
        iTimer = nil       -- отключаем таймер&lt;br /&gt;
        wolfscripts.humorist_killed_msg() -- название скрипта.название функции&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тут, вроде бы, всё просто. Но таймер просто так не заработает. Лезем в '''bind_stalker.script''' и в&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;function actor_binder:update(delta)&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;название_вашего_скрипта.timer_5_minutes()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вуаля, теперь всё работает. Спасибо за внимание.&lt;br /&gt;
Да, кстати, из диалога вызываем функцию ''function_onetimer''.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_Freeplay</id>
		<title>SoC. Реализация Freeplay</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_Freeplay"/>
				<updated>2014-06-19T14:26:59Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Оформление, мелкие правки #ficw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сегодня мы реализуем полноценный фриплей&lt;br /&gt;
&lt;br /&gt;
== Скрипт ==&lt;br /&gt;
Открываем '''gamedata/scripts/xr_effects.script'''. На ходим следующее:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function after_credits(actor, npc)&lt;br /&gt;
	if db.gameover_credits_started ~= true then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local c = get_console()&lt;br /&gt;
	c:execute(&amp;quot;disconnect&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Удаляем это. И вставляем это:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function after_credits(actor, npc)&lt;br /&gt;
	if db.gameover_credits_started ~= true then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local c = get_console()&lt;br /&gt;
	c:execute(&amp;quot;hud_crosshair 1&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Работа с ACDC SOC ==&lt;br /&gt;
&lt;br /&gt;
Декомпилируем '''all.spawn'''.&lt;br /&gt;
Открываем '''alife_l12_stancia.ltx'''.&lt;br /&gt;
Вставляем это:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[40000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = level_changer&lt;br /&gt;
name = exit_to_pripyat_from_st1&lt;br /&gt;
position = 917.929626464844,-0.0999432504177094,-404.117004394531&lt;br /&gt;
direction = 0.11170107126236,0.0645771846175194,-0.00698131695389748&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 2273&lt;br /&gt;
distance = 2.79999995231628&lt;br /&gt;
level_vertex_id = 112702&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
story_id = 30000&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 11.2959985733032,0,0&lt;br /&gt;
shape0:axis_y = 0,11.3806009292603,0&lt;br /&gt;
shape0:axis_z = 0,0,3.42279982566834&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; cse_alife_level_changer properties&lt;br /&gt;
dest_game_vertex_id = 2269&lt;br /&gt;
dest_level_vertex_id = 145458&lt;br /&gt;
dest_position = 31.5,1.60000002384186,424&lt;br /&gt;
dest_direction = -2.49865606747335e-005,3.14000010490417,-1.28936753753806e-005&lt;br /&gt;
dest_level_name = L11_Pripyat&lt;br /&gt;
dest_graph_point = start_actor_01&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Это создаст переход из ЧАЭС-1 в Припять.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/br&amp;gt; Теперь сделаем возврат с ЧАЭС-2 на Припять.&lt;br /&gt;
Открыть alife_l12_stancia_2.ltx.&lt;br /&gt;
добавить в конце:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[40001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = level_changer&lt;br /&gt;
name = exit_to_pripyat_from_st2&lt;br /&gt;
position = 555.293579101563,150.605697631836,201.862899780273&lt;br /&gt;
direction = 0.11170107126236,0.0645771846175194,-0.00698131695389748&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 2517&lt;br /&gt;
distance = 2.79999995231628&lt;br /&gt;
level_vertex_id = 112702&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
story_id = 30001&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 11.2959985733032,0,0&lt;br /&gt;
shape0:axis_y = 0,11.3806009292603,0&lt;br /&gt;
shape0:axis_z = 0,0,3.42279982566834&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; cse_alife_level_changer properties&lt;br /&gt;
dest_game_vertex_id = 2269&lt;br /&gt;
dest_level_vertex_id = 145458&lt;br /&gt;
dest_position = 96.7300033569336,0.730000019073486,188.710006713867&lt;br /&gt;
dest_direction = -1.05999994277954,-0.819999992847443,-1.05999994277954&lt;br /&gt;
dest_level_name = L11_Pripyat&lt;br /&gt;
dest_graph_point = start_actor_01&lt;br /&gt;
silent_mode = 1&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Компилим '''all.spawn'''. Кладем в папку '''gamedata/spawns'''. Пробуем новую игру, доходим до ЧАЭС, пробуем переходы.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%85%D1%83%D0%B4</id>
		<title>Выводим элементы статики на худ</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%85%D1%83%D0%B4"/>
				<updated>2014-06-19T14:18:24Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Значит, создаем скрипт '''ваш скрипт.script''' и пишем: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function hud_elements()&lt;br /&gt;
local hud = get_hud()  --Задаем локальную переменную - обращение к худу&lt;br /&gt;
local element1 = hud:GetCustomStatic(&amp;quot;elementone&amp;quot;)  --Задаем локальную переменную - инициализация худ-элемента&lt;br /&gt;
&lt;br /&gt;
if element1 == nil then  --Условие: если элемент не выведен, то...&lt;br /&gt;
hud:AddCustomStatic(&amp;quot;elementone&amp;quot;)  --...добавляем его на худ&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И после заходим в '''bind_stalker.script''' после апдейта актора (проверка каждую секунду):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;ваш_скрипт.hud_elements()&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит учесть, что xml-описание элемента должно находиться в файле '''configs\ui\ui_custom_msgs.xml'''. Пример xml-описания статика для надписи ''Work in progress...'' из билда 3120:&lt;br /&gt;
&amp;lt;xml&amp;gt;&amp;lt;cs_demo_play  x=&amp;quot;30&amp;quot; y=&amp;quot;710&amp;quot; width=&amp;quot;600&amp;quot; height=&amp;quot;50&amp;quot; complex_mode=&amp;quot;1&amp;quot; stretch=&amp;quot;1&amp;quot;&lt;br /&gt;
							light_anim=&amp;quot;&amp;quot; la_cyclic=&amp;quot;1&amp;quot; la_texture=&amp;quot;1&amp;quot; la_alpha=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text font=&amp;quot;letterica18&amp;quot;  r=&amp;quot;240&amp;quot; g=&amp;quot;217&amp;quot; b=&amp;quot;182&amp;quot; a=&amp;quot;255&amp;quot; align=&amp;quot;l&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/cs_demo_play&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%85%D1%83%D0%B4</id>
		<title>Выводим элементы статики на худ</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%85%D1%83%D0%B4"/>
				<updated>2014-06-19T14:17:17Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Значит, создаем скрипт '''ваш скрипт.script''' и пишем: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function hud_elements()&lt;br /&gt;
local hud = get_hud()  --Задаем локальную переменную - обращение к худу&lt;br /&gt;
local element1 = hud:GetCustomStatic(&amp;quot;elementone&amp;quot;)  --Задаем локальную переменную - инициализация худ-элемента&lt;br /&gt;
&lt;br /&gt;
if element1 == nil then  --Условие: если элемент не выведен, то...&lt;br /&gt;
hud:AddCustomStatic(&amp;quot;elementone&amp;quot;)  --...добавляем его на худ&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И после заходим в '''bind_stalker.script''' после апдейта актора (проверка каждую секунду):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;ваш_скрипт.hud_elements()&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит учесть, что xml-описание элемента должно находиться в файле '''configs\ui\ui_custom_msgs.xml'''. Пример xml-описания статика для надписи ''Work in progress...'' из билда 3120:&lt;br /&gt;
&amp;lt;xml&amp;gt;&amp;lt;cs_demo_play  x=&amp;quot;30&amp;quot; y=&amp;quot;710&amp;quot; width=&amp;quot;600&amp;quot; height=&amp;quot;50&amp;quot; complex_mode=&amp;quot;1&amp;quot; stretch=&amp;quot;1&amp;quot;&lt;br /&gt;
							light_anim=&amp;quot;&amp;quot; la_cyclic=&amp;quot;1&amp;quot; la_texture=&amp;quot;1&amp;quot; la_alpha=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text font=&amp;quot;letterica18&amp;quot;  r=&amp;quot;240&amp;quot; g=&amp;quot;217&amp;quot; b=&amp;quot;182&amp;quot; a=&amp;quot;255&amp;quot; align=&amp;quot;l&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/cs_demo_play&amp;gt;&amp;lt;/xml&amp;gt;&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%90%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D1%8F_Milkshape_3D_1.8.4</id>
		<title>Активация Milkshape 3D 1.8.4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%90%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D1%8F_Milkshape_3D_1.8.4"/>
				<updated>2014-06-19T14:06:59Z</updated>
		
		<summary type="html">&lt;p&gt;FantomICW: Поправил оформление, &amp;quot;сосайта&amp;quot; (:D), ошибки...#ficw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Активация '''Milkshape 3D 1.8.4''' происходит следующим образом:&lt;br /&gt;
&lt;br /&gt;
1) Открываем программу.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нажимаем в верхнем меню на ''&amp;quot;Help&amp;quot; =&amp;gt; About...''.&amp;lt;br&amp;gt;&lt;br /&gt;
3) Вылезет окошко. Внизу доступны два действия: ''&amp;quot;OK&amp;quot;'' и ''&amp;quot;Register&amp;quot;''. Жмем на ''&amp;quot;Register&amp;quot;'' (регистрация программы).&amp;lt;br&amp;gt;&lt;br /&gt;
4) В ''&amp;quot;Your name&amp;quot;'' вводим имя '''Predator'''.&amp;lt;br&amp;gt; &lt;br /&gt;
5) В ''Registration Code'' вводим код '''5EdKb-lG22d3-d7dG1Dd''' (без дефиса).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Далее '''Milkshape 3D''' поблагодарит Вас за регистрацию продукта. Вы можете пользоваться программой неограниченное время! &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;Взято с сайта: http://maxgamestudios.at.ua/load/stati/stati/aktivacija_milkshape_1_8_4_1_8_5/17-1-0-20&lt;br /&gt;
&lt;br /&gt;
[[Категория:Программы]]&lt;/div&gt;</summary>
		<author><name>FantomICW</name></author>	</entry>

	</feed>