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

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BB%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%BE%D0%B2</id>
		<title>Для новичков</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BB%D1%8F_%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%BE%D0%B2"/>
				<updated>2010-11-17T16:08:15Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. Изменить носимый вес ==&lt;br /&gt;
Начнем. Для того чтобы изменить носимый вес, нам необходимо 2 файла: ''gamedata\config\creatures\actor.ltx'' и ''gamedata\config\system.ltx''.&lt;br /&gt;
&lt;br /&gt;
Займемся файлом '''actor.ltx'''. Открываем файл блокнотом, ну или как вам удобно. Жмем F3, ищем строку ''max_item_mass = 50.0''&lt;br /&gt;
&lt;br /&gt;
Изменяем ''max_item_mass = 500.0''&lt;br /&gt;
Изменяем ''max_walk_weight = 500.0''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
С этим файлом все.&lt;br /&gt;
&lt;br /&gt;
Открываем '''system.ltx''', также ищем строку ''max_weight = 50'' и меняем на ''max_weight = 500.0''&lt;br /&gt;
&lt;br /&gt;
Все, можем грузить игру и проверять, все ли работает.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. Сделать бессмертие ==&lt;br /&gt;
2. Сделать бессмертие.&lt;br /&gt;
&lt;br /&gt;
Нужен лишь один файл: ''gamedata\config\creatures\actor.ltx''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Открываем, находим секцию ''[actor_condition]''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Рассмотрим все детально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[actor_condition] &lt;br /&gt;
satiety_v					= 0.00015 ;скорость уменьшения сытости со временем&lt;br /&gt;
radiation_v					= 0.00001 ;скорость уменьшения радиации&lt;br /&gt;
satiety_power_v				        = 0.00055 ;увеличение силы при уменьшении сытости &lt;br /&gt;
satiety_health_v			        = 0.00001 ;увеличение здоровья при уменьшении сытости &lt;br /&gt;
satiety_critical			        = 0.00000 ;критическое значения сытости (в процентах от 0..1) когда здоровье начианает уменьшаться&lt;br /&gt;
radiation_health_v			        = 0.00000 ;уменьшение здоровья при воздействии радиации&lt;br /&gt;
morale_v					= 0.00001 ;скорость восстановления морали&lt;br /&gt;
&lt;br /&gt;
psy_health_v				= 0.001	;скорость восстановления psy-здоровья&lt;br /&gt;
alcohol_v			        = -0.0003&lt;br /&gt;
health_hit_part				= 1.0   ;процент хита, уходящий на отнимание здоровья&lt;br /&gt;
power_hit_part				= 0.1	;процент хита, уходящий на отнимание силы&lt;br /&gt;
max_power_leak_speed		        = 0.0	;накопление усталости (макс граница, до которой восстанавливается сила) в секунду игрового времени&lt;br /&gt;
max_walk_weight				= 60&lt;br /&gt;
&lt;br /&gt;
bleeding_v				= 0.0	;потеря крови при номинальной ране в секунду&lt;br /&gt;
wound_incarnation_v			= 1.0	;скорость заживления раны&lt;br /&gt;
min_wound_size				= 0.256	;минимальный размер раны, после которого она считается зажившей&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать бессмертие, нужно:&lt;br /&gt;
&lt;br /&gt;
Изменить параметр satiety_v на 0.0;&lt;br /&gt;
Изменить параметр radiation_v на 1.0;&lt;br /&gt;
Изменить параметр satiety_critical на 0.0;&lt;br /&gt;
Изменить параметр health_hit_part на 0.0;&lt;br /&gt;
Изменить параметр power_hit_part на 0.0&lt;br /&gt;
Изменить параметр max_power_leak_speed на 0.0;(если не изменен)&lt;br /&gt;
Изменить параметр min_wound_size на 1.0; &lt;br /&gt;
На этом все.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные_файлы]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%B2%D1%8B%D0%BB%D0%B5%D1%82%D0%BE%D0%B2_%D0%B8%D0%B3%D1%80%D1%8B_(%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC_%D0%BB%D0%BE%D0%B3%D0%B8)</id>
		<title>Причины вылетов игры (разбираем логи)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%B2%D1%8B%D0%BB%D0%B5%D1%82%D0%BE%D0%B2_%D0%B8%D0%B3%D1%80%D1%8B_(%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC_%D0%BB%D0%BE%D0%B3%D0%B8)"/>
				<updated>2010-11-06T17:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Привет всем! Игра сталкер, а конкретно сам движок X-ray довольно капризный, и зачастую как в процессе модификации, так и во время игры игра &amp;quot;вылетает&amp;quot;. Чтобы мы знали причину вылета, движок нам оставляет лог вылета. Лог вылета можно посмотреть несколькими способами:&lt;br /&gt;
*В текстовом редакторе нажать Ctrl+V (Вставить)&lt;br /&gt;
*Посмотреть лог игры включая лог вылета в файле xray_имя_пользователя.log в папке C:\Documents and Settings\All Users\Документы\STALKER-***\logs&lt;br /&gt;
*Посмотреть непосредственно в окне багтрекера (только в ЧН и ЗП).&lt;br /&gt;
Ну приступим. Начнём с простых:&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : wave&amp;amp;&amp;amp;wave-&amp;gt;length()&lt;br /&gt;
Function      : CSoundRender_Source::LoadWave&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xrSound\SoundRender_Source_loader.cpp&lt;br /&gt;
Line          : 65&lt;br /&gt;
Description   : Can't open wave file:&lt;br /&gt;
Arguments     : d:\stalker\gamedata\sounds\music\sound.ogg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Здесь игра не может найти звуковой OGG-файл под названием sound в папке d:\stalker\gamedata\sounds\music\&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : fatal error&lt;br /&gt;
Function      : CRender::texture_load&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xr_3da\xrRender\Texture.cpp&lt;br /&gt;
Line          : 295&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find texture 'act\act_corp_monolit'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не может найти текстуру act_corp_monolit из папки textures\act&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : fatal error&lt;br /&gt;
Function      : CModelPool::Instance_Load&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xr_3da\xrRender\ModelPool.cpp&lt;br /&gt;
Line          : 111&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Can't find model file 'physics\mesh.ogf'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не найдена трёхмерная OGF-модель mesh.ogf из папки meshes\physics.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : SG&lt;br /&gt;
Function      : CRender::model_CreateParticles&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xr_3da\xrRender_R2\r2.cpp&lt;br /&gt;
Line          : 330&lt;br /&gt;
Description   : Particle effect or group doesn't exist&lt;br /&gt;
Arguments     : hit_fx\hit_water_00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не найдена система частиц (партикл) hit_water_00 в директории hit_fx файла particles.xr (подробно опишу позже).&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : fatal error&lt;br /&gt;
Function      : CResourceManager::_GetBlender&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xr_3da\ResourceManager.cpp&lt;br /&gt;
Line          : 49&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : Shader 'models\antigas_glass' not found in library.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не найден шейдер models\antigas_glass в библиотеке шейдеров.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : fs&lt;br /&gt;
Function      : CResourceManager::_CreateVS&lt;br /&gt;
File          : E:\stalker\patch_1_0004\xr_3da\ResourceManager_Resources.cpp&lt;br /&gt;
Line          : 185&lt;br /&gt;
Description   : shader file doesnt exist&lt;br /&gt;
Arguments     : d:\stalker\gamedata\shaders\r2\deffer_impl_flat.vs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не найден файл шейдера deffer_impl_flat.vs.&lt;br /&gt;
&amp;lt;tt&amp;gt;--Added by Герр. Роммель&lt;br /&gt;
Да нет. Тут проблема вся в том, что неправильно закомпилился шейдер, при компиляции уровня на качестве, более высоком чем Draft. Нужно скачивать исправление шейдеров от товарища Haron&amp;lt;/tt&amp;gt;&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression : fatal error&lt;br /&gt;
Function : out_of_memory_handler&lt;br /&gt;
File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp&lt;br /&gt;
Line : 336&lt;br /&gt;
Description : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments : Out of memory. Memory request: 55965 K &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Нехватка оперативной памяти.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression : fatal error&lt;br /&gt;
Function : CInifile::r_string&lt;br /&gt;
File :E:\stalker\sources\trunk\xrCore\Xr_ini.cpp&lt;br /&gt;
Line : 352&lt;br /&gt;
Description : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments : Can't find variable ammo_mag_size in [wpn_addon_grenade_launcher]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Не найдена переменная ammo_mag_size в секции [wpn_addon_grenade_launcher].&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression    : fatal error&lt;br /&gt;
Function      : CScriptEngine::lua_error&lt;br /&gt;
File          : D:\xray-svn\xr_3da\xrGame\script_engine.cpp&lt;br /&gt;
Line          : 74&lt;br /&gt;
Description   : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments     : LUA error: C stack overflow&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Переполнение стека. Смотрим внимательно: lua_error. Ошибка возможно в скриптах.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression : vertex || show_restrictions(m_object)&lt;br /&gt;
Function : CPatrolPathManager::select_point&lt;br /&gt;
File : E:\stalker\sources\trunk\xr_3da\xrGame\patrol_path_manager.cpp&lt;br /&gt;
Line : 155&lt;br /&gt;
Description : any vertex in patrol path [sniper_3_walk] in inaccessible for object [stalker_0002]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Какая то вершина (вейпоинт) пути sniper_3_walk стоит в неположенном месте (например не на аи-сетке). Объект stalker_0002 (в данном случае сталкер) который якобы двигался по пути sniper_3_walk попал на эту точку, а заодно ушёл за аи-сетку. Этого движок не терпит.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression : e_entity&lt;br /&gt;
Function : xrServer::Process_event_reject&lt;br /&gt;
File : E:\stalker\sources\trunk\xr_3da\xrGame\xrServer_process_event_reject.cpp&lt;br /&gt;
Line : 12&lt;br /&gt;
Description : entity not found. id_parent=7540 id_entity=44047 frame=2075050&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Возникают иногда произвольно при смерти неписей. Причина – движок отрабатывая лут изредка теряет серверный объект уничтожаемой вещи, в итоге происходит вылет.&lt;br /&gt;
--------------&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Expression : fatal error&lt;br /&gt;
Function : CScriptEngine::lua_error&lt;br /&gt;
File : D:\xray-svn\xr_3da\xrGame\script_engine.cpp&lt;br /&gt;
Line : 74&lt;br /&gt;
Description : &amp;lt;no expression&amp;gt;&lt;br /&gt;
Arguments : LUA error: e:\stalker\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ошибка распространённая. На первый взгляд кажется, что ошибка как раз в скриптах, но всё может быть иначе. Делаем так: открываем файл _g.script блокнотом, закоменчиваем 20 строку (ставим перед строкой --) и идём к тому месту где поймали вылет. Так мы получим более развёрнутый ответ.&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;
* Автор статьи - '''Pihan13'''&lt;br /&gt;
* Частично использовалась информация с сайта http://forum.stalker-simbion.ru/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; '''Не стесняемся - дополняем, если знаем о чём идёт речь.''' &amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CS._%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC_%D1%87%D0%B0%D1%81%D1%82%D0%B8_%D0%BC%D0%BE%D0%BD%D1%81%D1%82%D1%80%D0%BE%D0%B2</id>
		<title>CS. Восстанавливаем части монстров</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CS._%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC_%D1%87%D0%B0%D1%81%D1%82%D0%B8_%D0%BC%D0%BE%D0%BD%D1%81%D1%82%D1%80%D0%BE%D0%B2"/>
				<updated>2010-11-05T08:44:40Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Восстанавливаем части монстров===&lt;br /&gt;
&lt;br /&gt;
Чтобы восстановить части тел монстров, нам понадобятся следующие файлы:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''gamedata\configs\creatures\m_boar.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_bloodsucker.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_burer.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_dog.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_flesh.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_pseudodog.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_snork.ltx&amp;lt;br&amp;gt;&lt;br /&gt;
'''gamedata\configs\creatures\ m_zombie.ltx&amp;lt;br&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Для начала возьмём '''m_boar.ltx'''. Там есть строка:&amp;lt;br&amp;gt;&lt;br /&gt;
 ''Spawn_Inventory_Item_Probability = 0'' - это означает, с какой вероятностью выпадет часть тела&lt;br /&gt;
Меняем на:&amp;lt;br&amp;gt;&lt;br /&gt;
 ''Spawn_Inventory_Item_Probability = 0.9'' - в данном случае будет выпадать почти всегда&lt;br /&gt;
С остальными файлами делаем по аналогии =)&lt;br /&gt;
'''ВНИМАНИЕ!!!''' Поменяйте в '''m_pseudodog.ltx''' строку:&lt;br /&gt;
 ''Spawn_Inventory_Item_Section = mutant_pseudodog_tail''&lt;br /&gt;
На:&lt;br /&gt;
 ''Spawn_Inventory_Item_Section = mutant_psevdodog_tail''&lt;br /&gt;
Заметки: когда я возвращал щупальца кровососу, я удалил точку с запятой в строке&lt;br /&gt;
 ''Spawn_Inventory_Item_Section = ;mutant_krovosos_jaw''&lt;br /&gt;
Так что если её не удалять я не знаю что будет. '' -- [[Участник:RedPython|RedPython]] 11:09, 1 июня 2010 (UTC) знаком &amp;quot;''';'''&amp;quot; в '''*.ltx'''-файлах обозначаются комментарии, т.е. если удалить, то спавниться щупалка не будет.''&lt;br /&gt;
&amp;lt;br&amp;gt;Спасибо за внимание.&lt;br /&gt;
&lt;br /&gt;
'''Автор''': [[Участник:Duhazzz|Duhazzz]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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>2010-09-22T16:50:26Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &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.&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;
&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разъясню некоторые пункты, чтобы в след. раз не пришлось прибегать к тутору.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&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;/code&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;code&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;/code&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;code&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;/code&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, мы на финишной прямой!&lt;br /&gt;
Открываем файл spawn_sections&lt;br /&gt;
&lt;br /&gt;
и в писываем:&lt;br /&gt;
&amp;lt;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, все готово!&lt;br /&gt;
Начинаем новую игру, и видем сталкера с именем Нубик = )&lt;br /&gt;
&lt;br /&gt;
'''Статью создал stalker-life'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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>2010-09-22T15:09:25Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &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.&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;
&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разъясню некоторые пункты, чтобы в след. раз не пришлось прибегать к тутору.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&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;/code&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;code&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;/code&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;code&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;/code&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, мы на финишной прямой!&lt;br /&gt;
Открываем файл spawn_sections&lt;br /&gt;
&lt;br /&gt;
и в писываем:&lt;br /&gt;
&amp;lt;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, все готово!&lt;br /&gt;
Начинаем новую игру, и видем сталкера с именем Нубик = )&lt;br /&gt;
&lt;br /&gt;
'''Статью разместил и оформил: stalker-life'''&lt;br /&gt;
&lt;br /&gt;
Тутор написал не ты, стандер и способ открыт не тобою. Он был ещё известен всем умным людям в 2008 году. Так что слейся&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%82%D1%83%D1%82%D0%BE%D1%80_Level_Editor_%D0%BE%D1%82_GSC</id>
		<title>Официальный тутор Level Editor от GSC</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%82%D1%83%D1%82%D0%BE%D1%80_Level_Editor_%D0%BE%D1%82_GSC"/>
				<updated>2010-09-22T12:19:00Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этом уроке, рассмотрены основные положения по Левел Едитороу(Редактору Уровней)&lt;br /&gt;
&lt;br /&gt;
'''Before Opening the Editor'''&lt;br /&gt;
&lt;br /&gt;
Сейчас, вам придется установить игру и должным образом разместить её, чтобы вы могли создавать уровни. Вам будет также нужна копия 3D Studio Max, так как вся горизонтальная геометрия будет создана там и экспортирована в Level Editor, используя специаельные плагины&lt;br /&gt;
&lt;br /&gt;
'''The Editor'''&lt;br /&gt;
Теперь, когда всё необходимое для работы готово, мы можем приступать. Если все работает должным образом это должно стартовать без любых проблем. Ниже приведёт скриншот экрана&lt;br /&gt;
&lt;br /&gt;
http://savepic.ru/1713161m.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Когда появляется окно обзора, вам предоставлена 3D перспектива просмотра. Мощный рендер редактора, позволяет вам видеть обьекты и окружающий мир в приближённом виде к игровому варианту. Навигация в 3D-перспективе проста. Удерживая SHIFT+ЛКМ перемещает камеру вперёд\назад\влево\вправо&lt;br /&gt;
SHIFT+ПКМ двигают камеру по оси Z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''The Top Toolbar'''&lt;br /&gt;
&lt;br /&gt;
http://savepic.ru/1756164.jpg  &lt;br /&gt;
&amp;lt;code&amp;gt;Стрелка влево - отменить действие&lt;br /&gt;
Стрелка вправо - вернуть действие&lt;br /&gt;
Стрелочка - выделение&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://savepic.ru/1734660.jpg&lt;br /&gt;
&amp;lt;code&amp;gt;Основная панель при работе с уровнем&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/b9332.jpg &lt;br /&gt;
''Добавление обьектов на уровень (инструмент Add)''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f9a1c.jpg&lt;br /&gt;
''Манипулятор для осей X,Y,Z (инструмент Move) ''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/93ad2.jpg&lt;br /&gt;
''Поворот обьектов по осям X,Y,Z (инструмент Rotate)'' &lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/30d93.jpg&lt;br /&gt;
''Увеличение\меньшение(инструмент Scale)''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/3662f.jpg&lt;br /&gt;
''Выбор оси для работы''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/d82a5.jpg&lt;br /&gt;
''Привязки(привязка к обьекту\сетке\точке)''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/be68a.jpg&lt;br /&gt;
''Положение камеры''&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/220a0.jpg&lt;br /&gt;
''Zoom Extents и Zoom Selected Extents''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''The Main Toolbar'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На высшей панели, находятся все основные функции управления уровнем&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f6da7.jpg&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
File - Функции открытия\сохранения файла уровня&lt;br /&gt;
Scene - Тонкие настройки сцены(вашего уровня)&lt;br /&gt;
Compile - Компиляция и её настройки&lt;br /&gt;
Objects - Работа с обьектами, включая редактор обьектов&lt;br /&gt;
Images - Импорт графических файлов, библиотека графических файлов&lt;br /&gt;
Sounds - Звуковой редактор&lt;br /&gt;
Light Anim Editor - Редактор светоанимаций&lt;br /&gt;
Object List - Обьекты находящиеся на уровне&lt;br /&gt;
Preferences - Редактор префренсов&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/03164.jpg&lt;br /&gt;
&amp;lt;code&amp;gt;Edit - Копирование\вставка&lt;br /&gt;
Selection - Выделение, снятия выделения&lt;br /&gt;
Visibility - Настройки отображения&lt;br /&gt;
Locking - Блокировка\снятие блокировки&lt;br /&gt;
Properties - Настройки&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Тут нахоядится то, что поможет вам создать уровень''&lt;br /&gt;
http://img.gameru.net/img/0e42e.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Obejct - Библиотека обьектов&lt;br /&gt;
Light - Добавление\правка лайтов&lt;br /&gt;
Sound Source - Добавление\правка Sound Source&lt;br /&gt;
Sound Env - Добавление Sound enviroment (окружающий мир), на уровень&lt;br /&gt;
Glow - Источник света&lt;br /&gt;
Shape - Шейпы(Зона Влияния)&lt;br /&gt;
Spawn Element - Добавление\правка спавн элементов(динамические обьекты)&lt;br /&gt;
Way Points - AI пути&lt;br /&gt;
Sector - Утилита для создания секторов&lt;br /&gt;
Portal - Генератор порталов&lt;br /&gt;
Group - Редактор групп&lt;br /&gt;
Static Particles - Создание\добавление статических партикл-эффектов&lt;br /&gt;
Detail Objects - Добавление\правка детальной растительности&lt;br /&gt;
AI Map - Создание\правка AI карты&lt;br /&gt;
Wallmarks - Добавление\правка валлмарок&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Статья пишется далее.&lt;br /&gt;
То что идёт дальше, уже не раз изложено в простых и видео уроках. А именно:&lt;br /&gt;
&amp;lt;code&amp;gt;Установка плагинов&lt;br /&gt;
Создание террейна&lt;br /&gt;
Экспорт моделей в SDK&lt;br /&gt;
Настройка шейдеров&lt;br /&gt;
Добавление основных элементов&lt;br /&gt;
Создание секторов и порталов&lt;br /&gt;
Компиляция&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== См. также ==&lt;br /&gt;
[http://stalkerin.gameru.net/wiki/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:SDK Все уроки]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Автор: GSC&lt;br /&gt;
Спасибо: некоторым лицам с gameru.net за предоставленный тутор на английском языке&lt;br /&gt;
Перевод: Erwin Rommel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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>2010-09-22T09:21:38Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &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.&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;
&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разъясню некоторые пункты, чтобы в след. раз не пришлось прибегать к тутору.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&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;/code&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;code&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;/code&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;code&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;/code&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;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, мы на финишной прямой!&lt;br /&gt;
Открываем файл spawn_sections&lt;br /&gt;
&lt;br /&gt;
и в писываем:&lt;br /&gt;
&amp;lt;code&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, все готово!&lt;br /&gt;
Начинаем новую игру, и видем сталкера с именем Нубик = )&lt;br /&gt;
&lt;br /&gt;
Тутор написал не ты, стандер и способ открыт не тобою. Он был ещё известен всем умным людям в 2008 году. Так что слейся&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-09-16T12:32:29Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Oxygenium */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Технические админы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по функционалу и работе базы знаний.&lt;br /&gt;
&lt;br /&gt;
=== Neo][ ===&lt;br /&gt;
*[mailto:neo@stalkerin.gameru.net электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
== Главные редакторы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по материалам, находящимся в базе знаний.&lt;br /&gt;
&lt;br /&gt;
=== Erwin Rommel ===&lt;br /&gt;
*[mailto:semyonpoltorak@yandex.ru электронная почта]&lt;br /&gt;
*ICQ: 3906034 &lt;br /&gt;
Вопросы, касательно вики и сайта&lt;br /&gt;
&lt;br /&gt;
=== Loxotron ===&lt;br /&gt;
*[mailto:loxotron@bk.ru электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
=== [[Участник:HikeR|HikeR]] ===&lt;br /&gt;
*[mailto:hhrhhr@gmail.com электронная почта]&lt;br /&gt;
*ICQ: 58258575&lt;br /&gt;
&lt;br /&gt;
== Новости STALKER Wiki ==&lt;br /&gt;
'''- январь 2008 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поддержка flash мувиков&lt;br /&gt;
&lt;br /&gt;
'''- июнь 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починена загрузка картинок&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- февраль 2010 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починено отображение картинок&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=DCT:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B5%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D0%BA%D0%B0%D1%80%D1%82%D1%8B</id>
		<title>DCT:Создание мультиплеерной карты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=DCT:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B5%D0%B5%D1%80%D0%BD%D0%BE%D0%B9_%D0%BA%D0%B0%D1%80%D1%82%D1%8B"/>
				<updated>2010-08-13T16:14:55Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: Откачено к последнему изменению, сделанному Loxotron&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаём сцену в Maya.==&lt;br /&gt;
*Вся геометрия должна быть создана в реальных мировых размерах (если стол в реальной жизни высотой 1 метр, значит его надо и в Maya делать высотой 1 метр, всё предельно ясно и просто)&lt;br /&gt;
*Bounding box персонажа имеет три состояния: стоя (1.8х0.7х0.7 в метрах), сидя (1.5х0.7х0.7 в метрах) и очень сидя (1.2х0.7х0.7 в метрах).&lt;br /&gt;
*Весь уровень должен быть не больше 150 тысяч треугольников.&lt;br /&gt;
[[image: Docs_maya_outliner.jpg|outliner screenshot|center|frame|outliner screenshot]]&lt;br /&gt;
*Сцена должна состоять из групп. Название группы формируется по такому принципу: '''mp_имяуровня_назвгеометрии'''. Например, в нашей тестовой сцене такие группы: mp_atp_terrain, mp_atp_buildings. В группе может находится как и один объект, так и несколько. Имена объектов внутри группы никоем образом не должны совпадать с именем группы. &amp;lt;br /&amp;gt;&lt;br /&gt;
'''В переделах одной группы все имена должны быть уникальны'''.&lt;br /&gt;
[[image: Docs_maya_mp_atp_terrain.jpg|mp_atp_terrain - игровой ландшафт|center|frame|mp_atp_terrain - игровой ландшафт]]&lt;br /&gt;
[[image: Docs_maya_mp_atp_buildings.jpg|mp_atp_buildings - игровая геометрия|center|frame|mp_atp_buildings - игровая геометрия]]&lt;br /&gt;
*Шейп объекта должен содержать правильное имя. Формируется по такому принципу: объект - имя_объекта, шейп - имя_объектаShape.&lt;br /&gt;
[[image: Docs_maya_objectname.jpg|Имена объектов в Maya|center|frame|Имена объектов в Maya]]&lt;br /&gt;
&lt;br /&gt;
==Экспортим геометрию из Maya.==&lt;br /&gt;
Для ознакомления с процессом экспорта просмотрите ролик в следующем параграфе.&lt;br /&gt;
В случае если xrayMaya_export не экспортит объекты, то проведите проверку на наличие ошибок, и исправьте их.&lt;br /&gt;
&lt;br /&gt;
Ошибками для xrayMaya_export считаются:&lt;br /&gt;
*Неправильные текстурные координаты (потяжки).&lt;br /&gt;
*Полигон площадью 0 м&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;.&lt;br /&gt;
*Тонкие длинные треугольники.&lt;br /&gt;
*Не склеенные точки находящиеся в одном и том же месте и т.д.&lt;br /&gt;
[[image: Docs_maya_cleanup.jpg|настройки Cleanup ...|center|frame|настройки Cleanup ...]]&lt;br /&gt;
&lt;br /&gt;
==Импортим в библиотеку LevelEditor'a.==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;flash&amp;gt;file=import.swf|width=750|height=582|quality=medium|menu=false&amp;lt;/flash&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создаём сцену в LevelEditor.==&lt;br /&gt;
===Создание сцены===&lt;br /&gt;
Для ознакомления с процессом создания сцены просмотрите ролик.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;swf width=&amp;quot;750&amp;quot; height=&amp;quot;582&amp;quot;&amp;gt;/wiki/images/big_files/createscene.swf&amp;lt;/swf&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Добавление объектов из библиотеки LevelEditor'a===&lt;br /&gt;
*Edit Mode -&amp;gt; Object -&amp;gt;Select&lt;br /&gt;
*Выбираем необходимый объект.&lt;br /&gt;
[[image:Docs_leveleditor_select_object.jpg|Выбор объекта из библиотеки|center|frame|Выбор объекта из библиотеки]]&lt;br /&gt;
*Жмём Add и добавляем в сцену.&lt;br /&gt;
[[image:Docs_eveleditor_add_objecttoscene.jpg|Добавление объекта в сцену|center|frame|Добавление объекта в сцену]]&lt;br /&gt;
&lt;br /&gt;
==Настраиваем spawn элементы.==&lt;br /&gt;
===General issues===&lt;br /&gt;
В игре существует 3 типа мультиплеерной игры:&lt;br /&gt;
&lt;br /&gt;
*DeathMatch&lt;br /&gt;
*TeamDeathMatch (только 2 команды)&lt;br /&gt;
*ArtefactHunt&lt;br /&gt;
&lt;br /&gt;
Максимальное количество игроков - 32.&lt;br /&gt;
===DeathMatch Setup===&lt;br /&gt;
Добовляем в сцену необходимое количество '''$rpoint''' &amp;lt;code&amp;gt;(Edit Mode -&amp;gt; Spawn Element -&amp;gt; $rpoint)&amp;lt;/code&amp;gt; элементов с базовой настройкой.&lt;br /&gt;
&lt;br /&gt;
[[image:Docs_leveleditor_dethmatch.jpg|Базовая настройка для $rpoint|center|frame|Базовая настройка для $rpoint]]&lt;br /&gt;
===TeamDeathMatch Setup===&lt;br /&gt;
*Добовляем в сцену необходимое количество $rpoint (Edit Mode -&amp;gt; Spawn Element -&amp;gt; $rpoint) элементов с базовой настройкой.&lt;br /&gt;
*В случае если необходимо сделать $rpoint, принадлежащим только одной команде, меняем параметр Team: 1 или 2, и Game Type: TeamDeathMatch '''(работает только в версии 1.003 и выше)'''. В этом случае все $rpoint с базовыми настройками будут служить как spectator place.&lt;br /&gt;
[[image:Docs_leveleditor_teamdethmatch.jpg|TeamDeathMatch настройка для $rpoint|center|frame|TeamDeathMatch настройка для $rpoint]]&lt;br /&gt;
&lt;br /&gt;
===ArtefactHunt Setup===&lt;br /&gt;
====Создание баз====&lt;br /&gt;
*Создайте два box shapes (Edit Mode -&amp;gt; Shape -&amp;gt; Box), в тех местах где будут располагаться противоборствующие базы. '''В пределах этого Box Shape’а''' игроки команды '''неуязвимы'''. &lt;br /&gt;
[[image:Docs_leveleditor_teambase_shape.jpg|Добавляем Box Shape|center|frame|Добавляем Box Shape]]&lt;br /&gt;
*Расположите в каждом $team_base (Edit Mode -&amp;gt; Spawn Element -&amp;gt; $team_base) внутри box shapes.&lt;br /&gt;
[[image:Docs_leveleditor_teambase_spawn.jpg|Добавляем $team_base|center|frame|Добавляем $team_base]]&lt;br /&gt;
[[image:Docs_leveleditor_teambase.jpg|ArtefactHunt настройка для $team_base|center|frame|ArtefactHunt настройка для $team_base]]&lt;br /&gt;
*Выбрать $team_base.&lt;br /&gt;
*Нажать Commands -&amp;gt; Attach Object…&lt;br /&gt;
*Выбрать необходимый Shape.&lt;br /&gt;
[[image:Docs_leveleditor_teambase_spawnattach.jpg|Присоединение $team_base к Box Shape|center|frame|Присоединение $team_base к Box Shape]]&lt;br /&gt;
&lt;br /&gt;
====Добавление spawn point членов команды====&lt;br /&gt;
*Добавляем в сцену необходимое количество $rpoint в пределах box shape 1ой команды с такими настройками:&lt;br /&gt;
[[image:Docs_leveleditor_artefacthunt1.jpg|ArtefactHunt настройка для $rpoint (игроки)|center|frame|ArtefactHunt настройка для $rpoint (игроки)]]&lt;br /&gt;
*Аналогично для 2ой каманды, только параметр Team меняем на 2.&lt;br /&gt;
====Добавление командных частиц (символизирует границы базы команды)====&lt;br /&gt;
*Добавляем в сцену необходимое количество $rpoint в пределах box shape 1ой команды с такими настройками:&lt;br /&gt;
[[image:Docs_leveleditor_artefacthunt2.jpg|ArtefactHunt настройка для $rpoint (частицы)|center|frame|ArtefactHunt настройка для $rpoint (частицы)]]&lt;br /&gt;
*Аналогично для 2ой каманды, только параметр Team меняем на 2.&lt;br /&gt;
====Добавление spawn point артефактов====&lt;br /&gt;
Артефакты не появляются случайным образом, места их рождения необходимо указывать самостоятельно. Добавляем в сцену необходимое количество $rpoint с такими настройками:&lt;br /&gt;
[[image:Docs_leveleditor_artefacthunt3.jpg|ArtefactHunt настройка для $rpoint (артефакты)|center|frame|ArtefactHunt настройка для $rpoint (артефакты)]]&lt;br /&gt;
&lt;br /&gt;
==Настраиваем тип карты==&lt;br /&gt;
Принадлежность карты к одному из трёх типов игры указывается таким образом:&lt;br /&gt;
*Нажать Scene -&amp;gt; Options&lt;br /&gt;
*В секции Usage выбрать необходимые для вас типы&lt;br /&gt;
[[image:Docs_leveleditor_map_usage.jpg|Настройки типа карты|center|frame|Настройки типа карты]]&lt;br /&gt;
&lt;br /&gt;
==Компилируем==&lt;br /&gt;
&amp;lt;code&amp;gt;Windows -&amp;gt; start -&amp;gt; run&amp;lt;/code&amp;gt; и в командной строке пишем:&lt;br /&gt;
[[image:Docs_wind_run_comp_multiplayer.jpg|Запуск уровня на компиляцию|center|frame|Запуск уровня на компиляцию]]&lt;br /&gt;
После корректной компиляции:&lt;br /&gt;
[[image:Docs_wind_xray_levelcompiler.jpg|Завершение компиляции|center|frame|Завершение компиляции]]&lt;br /&gt;
&lt;br /&gt;
==Собираем карту и добавляем её в игру.==&lt;br /&gt;
*Нажать File -&amp;gt; Make pack...&lt;br /&gt;
[[image:Docs_leveleditor_mod_pack.jpg|Собираем карту|center|frame|Собираем карту]]&lt;br /&gt;
*В корне диска X:\ создастся файл gamedata.xdb0, его необходимо скопировать в папку игры S.T.A.L.K.E.R\mods&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Milkshape._%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_%D0%BA%D0%BE%D1%81%D1%82%D0%B5%D0%B9</id>
		<title>Milkshape. Привязка костей</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Milkshape._%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_%D0%BA%D0%BE%D1%81%D1%82%D0%B5%D0%B9"/>
				<updated>2010-07-29T07:29:48Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;И так начнём с того, что возьмём понравившуюся нам модель, к примеру, я взял вот эту модельку для всс винтарез&lt;br /&gt;
первое, что мы сделаем. так это ознакомимся, что же такое милкшейп, и для чего нужна эта программа&lt;br /&gt;
Хороший сайт про эту программу&lt;br /&gt;
http://milkshape3d.by.ru/start.html&lt;br /&gt;
&lt;br /&gt;
'''Перейдём не посредственно к изучению программы'''&lt;br /&gt;
http://pics.kz/view1188907&lt;br /&gt;
&amp;lt;pre&amp;gt;1)-выделение кости, джоинта, модели&lt;br /&gt;
2)- пемешение, кости, джоинта, модели&lt;br /&gt;
3)- поворот модели&lt;br /&gt;
4)- уменьщение\увеличение модели,, что бы увеличить, в слотах пришем цифры 1.0099\уменьшить 0.99&lt;br /&gt;
5)- для начинающих, это не надо, остальное создаёт модели шара, нара с не ровными углами wacko2.gif планшет коробка, и т.д.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188908&lt;br /&gt;
&lt;br /&gt;
Импортирование модели в милкшейп, без специального плагина от Бардака, сделать этого, мы не сможем, можно скачать его тут&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188909&lt;br /&gt;
&lt;br /&gt;
Вот, это открытая модель в программе&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188910&lt;br /&gt;
&lt;br /&gt;
Эти части, мы и будем привязывать, каждая из них имеет своё название, к примеру затвор-zatvor, прицел- scope, магазин magazin и т.д.&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188911&lt;br /&gt;
&lt;br /&gt;
выделяем магазин с помощью select и и не чего не нажимая на поле с моделькой переходим в пункт Г (см. 1 скрин), там ищем кось магазина, и жмём assign, всё, кость магазина привязали, теперь двигаем её (move) как нам надо, что бы глаз не резал и и как душе угодно в общем dash2.gif&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
Делаем так же как и ранее, но и с остальными частями, всё оставшееся, это приклад, ручку цевьё, привязываем к body или wpn_body кому как нравится , получиться должно примерно так&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188962&lt;br /&gt;
&lt;br /&gt;
Всё, теперь приступим к экспорту в сдк, делаем это вот так , обязательно пишем правильное название как на скриншоте &lt;br /&gt;
http://pics.kz/view1188963&lt;br /&gt;
&lt;br /&gt;
а именно, что бы после названия было написанно .object&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188964&lt;br /&gt;
[[Участник:РикошеТ]]&lt;br /&gt;
[[Категория:Wireframe]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Milkshape._%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_%D0%BA%D0%BE%D1%81%D1%82%D0%B5%D0%B9</id>
		<title>Milkshape. Привязка костей</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Milkshape._%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_%D0%BA%D0%BE%D1%81%D1%82%D0%B5%D0%B9"/>
				<updated>2010-07-29T07:29:21Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;И так начнём с того, что возьмём понравившуюся нам модель, к примеру, я взял вот эту модельку для всс винтарез&lt;br /&gt;
первое, что мы сделаем. так это ознакомимся, что же такое милкшейп, и для чего нужна эта программа&lt;br /&gt;
Хороший сайт про эту программу&lt;br /&gt;
http://milkshape3d.by.ru/start.html&lt;br /&gt;
&lt;br /&gt;
'''Перейдём не посредственно к изучению программы'''&lt;br /&gt;
http://pics.kz/view1188907&lt;br /&gt;
&amp;lt;pre&amp;gt;1)-выделение кости, джоинта, модели&lt;br /&gt;
2)- пемешение, кости, джоинта, модели&lt;br /&gt;
3)- поворот модели&lt;br /&gt;
4)- уменьщение\увеличение модели,, что бы увеличить, в слотах пришем цифры 1.0099\уменьшить 0.99&lt;br /&gt;
5)- для начинающих, это не надо, остальное создаёт модели шара, нара с не ровными углами wacko2.gif планшет коробка, и т.д.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188908&lt;br /&gt;
&lt;br /&gt;
Импортирование модели в милкшейп, без специального плагина от Бардака, сделать этого, мы не сможем, можно скачать его тут&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188909&lt;br /&gt;
&lt;br /&gt;
Вот, это открытая модель в программе&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
http://pics.kz/view1188910&lt;br /&gt;
&lt;br /&gt;
Эти части, мы и будем привязывать, каждая из них имеет своё название, к примеру затвор-zatvor, прицел- scope, магазин magazin и т.д.&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188911&lt;br /&gt;
&lt;br /&gt;
выделяем магазин с помощью select и и не чего не нажимая на поле с моделькой переходим в пункт Г (см. 1 скрин), там ищем кось магазина, и жмём assign, всё, кость магазина привязали, теперь двигаем её (move) как нам надо, что бы глаз не резал и и как душе угодно в общем dash2.gif&lt;br /&gt;
&amp;lt;u&amp;gt;далее&amp;lt;/u&amp;gt;&lt;br /&gt;
Делаем так же как и ранее, но и с остальными частями, всё оставшееся, это приклад, ручку цевьё, привязываем к body или wpn_body кому как нравится , получиться должно примерно так&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188962&lt;br /&gt;
&lt;br /&gt;
Всё, теперь приступим к экспорту в сдк, делаем это вот так , обязательно пишем правильное название как на скриншоте &lt;br /&gt;
http://pics.kz/view1188963&lt;br /&gt;
&lt;br /&gt;
а именно, что бы после названия было написанно .object&lt;br /&gt;
&lt;br /&gt;
http://pics.kz/view1188964&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Sv_bearercantsprint</id>
		<title>Sv bearercantsprint</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Sv_bearercantsprint"/>
				<updated>2010-07-23T09:37:27Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sv_bearercantsprint -  (0,1) игрок, который несет артефакт, может бежать.&lt;br /&gt;
[[Категория:FAQ]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%BE%D0%BA%D0%B0%D1%86%D0%B8%D0%B9_%D0%BA_%D0%A7%D0%9D_%D0%B8_%D0%97%D0%9F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_%D0%BE%D1%82_AMK_Team</id>
		<title>Подключение локаций к ЧН и ЗП с помощью программы от AMK Team</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BB%D0%BE%D0%BA%D0%B0%D1%86%D0%B8%D0%B9_%D0%BA_%D0%A7%D0%9D_%D0%B8_%D0%97%D0%9F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_%D0%BE%D1%82_AMK_Team"/>
				<updated>2010-07-15T15:55:05Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Подготовка. ==&lt;br /&gt;
Устанавливаем active perl.&lt;br /&gt;
&lt;br /&gt;
Заходим в папку с программой ggEditor_01.Создаем там папки Cs или Cop(Смотря на какую игру делаете) и папку Soc.В папке Soc создаем папку gamedata и кидаем в нее файл game.graph(Важно чтобы game.graph лежал там, иначе программа не прочитает.) из мода, или от ТЧ.В папке gamedata создаем папку levels и кидаем туда папку с уровнем, который мы хотим портировать. Далее возвращаемся в папку Soc и туда кидаем папку с ACDC для ТЧ, туда же кладём all.spawn.Запускаем соответствующий батник для распаковки all.spawn`а.&lt;br /&gt;
&lt;br /&gt;
Далее в папку ggEditor_01\Cs или Cop, кидаем папку с соответствующим ACDC, опять-же кладем туда all.spawn, распаковываем.&lt;br /&gt;
&lt;br /&gt;
В итоге у нас должно получиться 2 распакованных all.spawn`а, game.graph от ТЧ и папка с переносимым уровнем.&lt;br /&gt;
&lt;br /&gt;
С приготовлениями всё.&lt;br /&gt;
&lt;br /&gt;
== Основная работа. ==&lt;br /&gt;
Запускаем программу ggEditor.Видим там два окошка. В левом открываем game.graph от ТЧ, а в правом — от ЗП или ЧН(В ЗП и ЧН граф вшит в all.spawn, ищите его там.)(Нужно выбрать тип файлов для ЧН — graph.bin, а для ЗП — все файлы и открыть в папке с ACDC файл section4.bin).&lt;br /&gt;
В окошках мы видим список уровней. В левом окошке находим нужный нам уровень и нажимаем на соответствующую стрелку для переноса уровня в нужный нам граф. Нажимаем в правом окошке «сохранить».После того, как граф сохранился, можно закрыть программу, она нам больше не понадобится. Потом этого шагаем в папку с ACDC для ЧН\ЗП и удаляем старые файлы section4.bin или graph.bin.Затем переименовываем файлы graph.bin.new или section4.bin.new в graph.bin и соответственно section4.bin.&lt;br /&gt;
&lt;br /&gt;
Далее идем в папку с ACDC от ТЧ, находим там файл alife_наша_локация и копируем его. Затем шуруем в папку с ACDC от ЧН\ЗП, вставляем скопированный нами файл. Открываем этот файл, сносим все, оставляем только одну секцию спавна(Лучше всего если это будет какой-нибудь объект), присваиваем секции номер не меньше 20000, сворачиваем на время этот файл. Далее нужно подогнать вертексы. Для этого запускаем батник ggtool, ждем некоторое время, после чего появляются имена локаций, а рядом с ними числа. Смотрим это число рядом с нашей локацией(в ЧН это скорее всего будет 1620, а в ЗП 934).Далее разворачиваем alife_ файл с нашей локацией, ищем там строку «game_vertex_id» и пишем там число которое появилось рядом с нашей локацией при запуске батника ggtool.Затем обращаем свой взор на строку «level_vertex_id».К исходному значению строки прибавляем число, которое мы записали в строку «game_vertex_id», полученное число записываем. Далее, в добавляемых потом секциях спавна нужно писать эти числа. Мы подогнали вертексы.&lt;br /&gt;
&lt;br /&gt;
Затем открываем файл all.ltx.Вписываем туда свой alife_ файл локации, way_ файлы не трогаем. Меняем на соответствующее число локации строку level_count.&lt;br /&gt;
&lt;br /&gt;
После этого открываем файл alife_zaton(для ЗП) или alife_marsh(для ЧН)и ищем там гг по строке «section_name = actor».Нашли?Отлично. Теперь присваиваем этой секции спавна позицию(новую позицию прописываем также в строке &amp;quot;upd:position = &amp;quot;) и вертексы как у единственного предмета в файле alife_новая_локация. При следующей распаковке, если вы все сделали правильно, наш актор окажется в файле alife_новая_лока.&lt;br /&gt;
&lt;br /&gt;
Мы почти закончили с пробной сборкой новой локации(пока без перехода).&lt;br /&gt;
&lt;br /&gt;
Осталось только прописать наш новый уровень в файл ACDC Cop\acdccop.pl(для ЗП)либо в файле ACDC Cs\stkutils\level.pm.&lt;br /&gt;
&lt;br /&gt;
В этих файлах ищем такие строки(для ЗП):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
use constant levels_info =&amp;gt; (&lt;br /&gt;
	{ gvid0 =&amp;gt; 934,   },&lt;br /&gt;
	{ gvid0 =&amp;gt; 883,		name =&amp;gt; 'jupiter_underground' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 857,		name =&amp;gt; 'labx8' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 666,		name =&amp;gt; 'pripyat' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 317,		name =&amp;gt; 'jupiter' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 0,		name =&amp;gt; 'zaton' },&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И если у вас число когда мы запускали батник ggtool тоже 934 то прописываем так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
use constant levels_info =&amp;gt; (&lt;br /&gt;
	{ gvid0 =&amp;gt; 934,         name =&amp;gt; 'ваша_локация' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 883,		name =&amp;gt; 'jupiter_underground' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 857,		name =&amp;gt; 'labx8' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 666,		name =&amp;gt; 'pripyat' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 317,		name =&amp;gt; 'jupiter' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 0,		name =&amp;gt; 'zaton' },&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А в файле level.pm от ACDC ЧН вы увидите такой текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
use constant levels_info =&amp;gt; (&lt;br /&gt;
	{ gvid0 =&amp;gt; 1620,   },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1573,	name =&amp;gt; 'l12_hospital' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1565,	name =&amp;gt; 'l11_stancia2' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1524,	name =&amp;gt; 'l10_limansk' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1511,	name =&amp;gt; 'l09_agroprom_undeground' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1313,	name =&amp;gt; 'l08_military' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1212,	name =&amp;gt; 'l07_yantar' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1057,	name =&amp;gt; 'l06_agroprom' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 961,		name =&amp;gt; 'l05_red_forest' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 743,		name =&amp;gt; 'l04_darkvalley' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 472,		name =&amp;gt; 'l03_escape' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 245,		name =&amp;gt; 'l02_garbage' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 0,		name =&amp;gt; 'l01_marsh' },&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прописать там свой уровень нужно точно так-же как в файле от ACDC ЗП:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
use constant levels_info =&amp;gt; (&lt;br /&gt;
	{ gvid0 =&amp;gt; 1620,        name =&amp;gt; 'ваша_локация' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1573,	name =&amp;gt; 'l12_hospital' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1565,	name =&amp;gt; 'l11_stancia2' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1524,	name =&amp;gt; 'l10_limansk' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1511,	name =&amp;gt; 'l09_agroprom_undeground' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1313,	name =&amp;gt; 'l08_military' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1212,	name =&amp;gt; 'l07_yantar' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 1057,	name =&amp;gt; 'l06_agroprom' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 961,		name =&amp;gt; 'l05_red_forest' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 743,		name =&amp;gt; 'l04_darkvalley' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 472,		name =&amp;gt; 'l03_escape' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 245,		name =&amp;gt; 'l02_garbage' },&lt;br /&gt;
	{ gvid0 =&amp;gt; 0,		name =&amp;gt; 'l01_marsh' },&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Всё.Собираем all.spawn.&lt;br /&gt;
&lt;br /&gt;
== Сборка геймдаты. ==&lt;br /&gt;
Осталось собрать gamedat`у для игры и смотреть что получилось.&lt;br /&gt;
Итак, приступим:&lt;br /&gt;
&lt;br /&gt;
В папке с игрой создаем папку gamedata, а в ней папки configs, levels, spawns.В папку spawns ложим получившийся при сборке all.spawn.new(или new.spawn), не забывая переименовать его в all.spawn.В папку levels ложим уровень из ggEditor_01\Soc\gamedata\levels\ваша_локация.Затем заходим в папку с уровнем, удаляем файл level.ai и переименовываем файл level.ai10 в level.ai.&lt;br /&gt;
&lt;br /&gt;
Теперь осталось только прописать уровень в конфигах.Из распакованной геймдаты игры берем файлы configs\game_graphs.ltx, game_levels.ltx, game_maps_single.ltx.&lt;br /&gt;
&lt;br /&gt;
game_graphs.ltx для ЧН должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[location_0]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001          = &amp;quot;эскейп&amp;quot;&lt;br /&gt;
  002          = &amp;quot;свалка&amp;quot;&lt;br /&gt;
  003          = &amp;quot;агропром&amp;quot;&lt;br /&gt;
  004          = &amp;quot;агропром-подземка&amp;quot;&lt;br /&gt;
  005          = &amp;quot;темная долина&amp;quot;&lt;br /&gt;
  006          = &amp;quot;лаборатория X-18&amp;quot;&lt;br /&gt;
  007          = &amp;quot;даркскейп&amp;quot;&lt;br /&gt;
  008          = &amp;quot;Бар&amp;quot;&lt;br /&gt;
  009          = &amp;quot;Росток&amp;quot;&lt;br /&gt;
  010		   = &amp;quot;Янтарь&amp;quot;&lt;br /&gt;
  011		   = &amp;quot;лаборатория X-16&amp;quot;&lt;br /&gt;
  012		   = &amp;quot;Милитари&amp;quot;&lt;br /&gt;
  013		   = &amp;quot;Мертвый город&amp;quot;&lt;br /&gt;
  014		   = &amp;quot;Радар&amp;quot;&lt;br /&gt;
  015		   = &amp;quot;Радар бункер&amp;quot;&lt;br /&gt;
  016		   = &amp;quot;Припять&amp;quot;&lt;br /&gt;
  017		   = &amp;quot;станция АЭС&amp;quot;&lt;br /&gt;
  018          = &amp;quot;ваша_локация&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
[location_1]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001          = &amp;quot;ограниченный доступ&amp;quot;&lt;br /&gt;
  002		   = &amp;quot;запрещенный доступ&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
[location_2]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001		   = &amp;quot;не для игрока&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[location_3]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001          = &amp;quot;ваша_локация&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
game_graphs для ЗП должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[location_0]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001          = &amp;quot;ваша_локация&amp;quot;&lt;br /&gt;
  002          = &amp;quot;sim_smart_2&amp;quot;&lt;br /&gt;
  003          = &amp;quot;sim_smart_3&amp;quot;&lt;br /&gt;
  004          = &amp;quot;sim_smart_4&amp;quot;&lt;br /&gt;
  005          = &amp;quot;sim_smart_5&amp;quot;&lt;br /&gt;
  006          = &amp;quot;sim_smart_6&amp;quot;&lt;br /&gt;
  007          = &amp;quot;sim_smart_7&amp;quot;&lt;br /&gt;
  008          = &amp;quot;sim_smart_8&amp;quot;&lt;br /&gt;
  009          = &amp;quot;sim_smart_base&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
[location_1]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001          = &amp;quot;ограниченный доступ&amp;quot;&lt;br /&gt;
  002		   = &amp;quot;запрещенный доступ&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
[location_2]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  001		   = &amp;quot;не для игрока&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[location_3]&lt;br /&gt;
  000          = &amp;quot;...&amp;quot;&lt;br /&gt;
  ...          . .......................&lt;br /&gt;
  112          = &amp;quot;pri_a22_smart_terrain&amp;quot;&lt;br /&gt;
  113          = &amp;quot;pri_a25_smart_terrain&amp;quot;&lt;br /&gt;
  114          = &amp;quot;pri_a28_arch&amp;quot;&lt;br /&gt;
  115          = &amp;quot;pri_a28_base&amp;quot;&lt;br /&gt;
  116          = &amp;quot;pri_b28_evac&amp;quot;&lt;br /&gt;
  117          = &amp;quot;pri_a28_heli&amp;quot;&lt;br /&gt;
  118          = &amp;quot;pri_a28_school&amp;quot;&lt;br /&gt;
  119          = &amp;quot;pri_a28_shop&amp;quot;&lt;br /&gt;
  120          = &amp;quot;pri_b301&amp;quot;&lt;br /&gt;
  121          = &amp;quot;pri_b302&amp;quot;&lt;br /&gt;
  122          = &amp;quot;pri_b303&amp;quot;&lt;br /&gt;
  123          = &amp;quot;pri_b304_monsters_smart_terrain&amp;quot;&lt;br /&gt;
  124          = &amp;quot;pri_b305_dogs&amp;quot;&lt;br /&gt;
  125          = &amp;quot;pri_b306&amp;quot;&lt;br /&gt;
  126          = &amp;quot;pri_b307&amp;quot;&lt;br /&gt;
  127          = &amp;quot;pri_b35_mercs&amp;quot;&lt;br /&gt;
  128          = &amp;quot;pri_b35_military&amp;quot;&lt;br /&gt;
  129          = &amp;quot;pri_b36_smart_terrain&amp;quot;&lt;br /&gt;
  130          = &amp;quot;pri_sim_1&amp;quot;&lt;br /&gt;
  131          = &amp;quot;pri_sim_2&amp;quot;&lt;br /&gt;
  132          = &amp;quot;pri_sim_3&amp;quot;&lt;br /&gt;
  133          = &amp;quot;pri_sim_4&amp;quot;&lt;br /&gt;
  134          = &amp;quot;pri_sim_5&amp;quot;&lt;br /&gt;
  135          = &amp;quot;pri_sim_6&amp;quot;&lt;br /&gt;
  136          = &amp;quot;pri_sim_7&amp;quot;&lt;br /&gt;
  137          = &amp;quot;pri_sim_8&amp;quot;&lt;br /&gt;
  138          = &amp;quot;pri_sim_9&amp;quot;&lt;br /&gt;
  139          = &amp;quot;pri_sim_10&amp;quot;&lt;br /&gt;
  140          = &amp;quot;pri_sim_11&amp;quot;&lt;br /&gt;
  141          = &amp;quot;pri_sim_12&amp;quot;&lt;br /&gt;
  142          = &amp;quot;ваша_локация&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    	   	&lt;br /&gt;
[graph_points_draw_color_palette]&lt;br /&gt;
default				= 0x6000ffff &lt;br /&gt;
000_000_000_000		= 0x60ff00ff&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее лезем в game_levels.ltx.&lt;br /&gt;
Там в самом начале, где список уровней, вписываем &amp;quot;level183&amp;quot;(число не менее 183.)&lt;br /&gt;
Листаем файл до самого конца и в конце пишем следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[level183]&lt;br /&gt;
name   = ваша_локация&lt;br /&gt;
caption = &amp;quot;ваша_локация&amp;quot;&lt;br /&gt;
offset  = 700.0,     1000.0,    -840.0&lt;br /&gt;
weathers = [default]&lt;br /&gt;
id  = 183&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Затем открываем файл game_maps_single.ltx и прописываем свой уровень в секции &amp;quot;[level_maps_single]&amp;quot;, а затем создаем примерно такую секцию для нашего уровня:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ваша_локация]&lt;br /&gt;
        global_rect                      = 307.0, 90.0, 717.0, 500.000000&lt;br /&gt;
        weathers                         = dynamic_default&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Всё.Запускайте игру и пробуйте, что получилось.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Соединение с остальными уровнями. ==&lt;br /&gt;
Предлагаю вам не терять зря времени просто бегая по подключенной локации, а замерить координаты для создания перехода.Координаты будем снимать на 2-х локациях:на подключенной и на той на которую вы хотите сделать переход соответственно.На каждой локации нам нужно снять по две координаты(координата самого перехода и координата места в которое будет бросать при переходе с второй локации, вторую координату делаем на пару метров дальше, потому как если сделать близко, то сразу же будет кидать обратно, на локацию с которой переходим.).Как снять координаты, я думаю все знают, поэтому объяснять здесь не буду.&lt;br /&gt;
&lt;br /&gt;
Мы отмерили все необходимые нам координаты.&lt;br /&gt;
&lt;br /&gt;
Затем распаковываем сделанный нами ранее all.spawn.Теперь в нужных нам локациях, в alife_ файлах добавляем следующую секцию спавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[1] &lt;br /&gt;
; cse_abstract properties &lt;br /&gt;
section_name = level_changer &lt;br /&gt;
name = escgar_level_changer - уникальное имя&lt;br /&gt;
position = 28.060224533081,16.556184768677,685.80151367188 - координаты перехода&lt;br /&gt;
direction = 0,0,0 &lt;br /&gt;
cse_abstract__unk1_h16 = 0x1 &lt;br /&gt;
; cse_alife_object properties &lt;br /&gt;
game_vertex_id = 1142 - геймвертексы&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 308110 - геймвертексы&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
; cse_shape properties &lt;br /&gt;
shapes = shape0 &lt;br /&gt;
shape0:type = box &lt;br /&gt;
shape0:axis_x = 1.25219917297363,0,0 &lt;br /&gt;
shape0:axis_y = 0,3.09340000152588,0 &lt;br /&gt;
shape0:axis_z = 0,0,1.25219917297363 &lt;br /&gt;
shape0:offset = 0,0,0 &lt;br /&gt;
; cse_alife_space_restrictor properties &lt;br /&gt;
restrictor_type = 3 &lt;br /&gt;
; cse_alife_level_changer properties &lt;br /&gt;
dest_game_vertex_id = 1187 - вертексы локи на которую ведет переход&lt;br /&gt;
dest_level_vertex_id = 212769 - вертексы локи на которую ведет переход&lt;br /&gt;
dest_position = 39.396331787109,0.48722490668297,-299.7674505469 - позиция куда кидает&lt;br /&gt;
dest_direction = 0,0,0 - поворот гг&lt;br /&gt;
dest_level_name = l02_garbage - на какую локу кидает&lt;br /&gt;
dest_graph_point = start_actor_01&lt;br /&gt;
silent_mode = 1 &lt;br /&gt;
; se_level_changer properties&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Изменяем только те места, которые я прокомментировал, комментарии соответственно, удаляем.&lt;br /&gt;
Всё готово.Собираем all.spawn и запихиваем в игру.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Убедительная просьба к начинающим модмейкерам.Пожалуйста, если вы только начали заниматься модами, то я вам настоятельно не советую заниматься подключением локаций.Наберитесь опыта, подучитесь элементарному.Я вас учить этому не подписывался.'''&lt;br /&gt;
&lt;br /&gt;
Да и еще.Если будете переносить секции спавна, то для массовой замены гейм вертексов и левел вертексов можно использовать блокнот: открываем наш файл в блокноте=&amp;gt; правка=&amp;gt; заменить, и пишем что на что заменять.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Автор статьи: БАТЯ-STALKER'''&lt;br /&gt;
&lt;br /&gt;
'''О способе подключения поведал: джЭдай (ака Panisher)'''&lt;br /&gt;
&lt;br /&gt;
Если у вас что-то не получается или появились вопросы, есть [http://www.gameru.net/forum/index.php?showtopic=32654 тема] на форуме.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD</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_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD"/>
				<updated>2010-07-12T10:32:17Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Как вывести сообщение на экран без использования функций АМК'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
У любого клиентского объекта имеется метод give_game_news&lt;br /&gt;
Он и выводит сообщения на экран. Экспериментом выяснил, что сообщение можно вывести совершенно от любого клиентского объекта, хоть от куска колбасы (хвала дизайнерскому гению GSC! Ну почему не сделать просто глобальную функцию?). Однако, следуя традиции и здравому смыслу, мы таки воспользуемся для этого объектом, соответствующим ГГ, т.е. актёром.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;  local sactor = alife():actor() --получаем серверный объект актера&lt;br /&gt;
    local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера&lt;br /&gt;
    cactor:give_game_news(&lt;br /&gt;
        &amp;quot;Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!&amp;quot;, -- строка сообщение, может быть многострочной&lt;br /&gt;
        &amp;quot;ui\\ui_npc_monster&amp;quot;,        --текстура, из которой берется аватара &amp;quot;отправителя&amp;quot;&lt;br /&gt;
        Frect():set(0,215,163,105),  --координаты и размеры вырезаемого из текстуры изображения&lt;br /&gt;
        math.random(1000, 3000),     --начало показа сообщения с текущего момента (в миллисекундах)&lt;br /&gt;
        5000                         --длительность показа сообщения (в миллисекундах)&lt;br /&gt;
        )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доп. комментарии к аргументам '''give_game_news''':&lt;br /&gt;
имя текстуры - это имя файла DDS без расширения, адресуемого относительно папки '''\gamedata\textures\'''&lt;br /&gt;
в этом выражении '''Frect():set(0,215,163,105)'''&lt;br /&gt;
'''0,215''' - это координаты верхнего левого угла нужного изображения&lt;br /&gt;
'''163,105''' - его размеры&lt;br /&gt;
Размеры и координаты могут быть любыми, но полученное изображение будет увеличено или уменьшено до размеров 83х47&lt;br /&gt;
В данном случае изображение тушкана из файла ui_npc_monster.dds было уменьшено.&lt;br /&gt;
Параметр времени начала показа нужен, очевидно, для внесения некоторой живости в игру. Дело в том, что код Lua получает управление только в определённые моменты, по определённым событиям. В такой момент можно сгенерить пачку сообщений и раскидать их по времени с помощью этого параметра, создав таким образом некоторую имитацию жизнедеятельности на ближайшее время. Думаю, таким же образом можно имитировать диалоги. Просто генерится пачка сообщений и им задаётся вывод с небольшим интервалом.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;br /&gt;
[[Участник:malandrinus]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0</id>
		<title>Maya. Один из способов создания игрового ландшафта</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0"/>
				<updated>2010-07-03T17:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для начала откроем саму прогу.  Выполнив все манипуляции по настройке плагинов и единиц измерения (читаем офф. руководство на вики), создадим  NURBS primitives plane. Жмем кубик рядом с надписью &lt;br /&gt;
http://img.gameru.net/img/ccd63.jpg&lt;br /&gt;
&lt;br /&gt;
Смотрим, что получилось? Настроим нашу плоскость, к примеру, 200х200.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e5797.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь кликаем в центр решетки. Нажимаем кнопку «5»&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/93af2.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно вот так.&lt;br /&gt;
Теперь выровняем по центру нашу плоскость.&lt;br /&gt;
Для этого лезем самая крайняя кнопка с права в панели инструментов. Выставляем Translate по всем осям на 0.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/d6552.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь смоделируем дорогу. Жмем create CV Curve tool. Тыкаем кубик&lt;br /&gt;
http://img.gameru.net/img/5c311.jpg&lt;br /&gt;
&lt;br /&gt;
Если хотим загогулистую дорогу, ставим cubic, если ограничимся прямой, то но linear.  Я решил сделать с плавными изгибами.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f3b5b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь переходим в режим ТОР (вид с верху) настраиваем сетку (я сделал 100х10х1)&lt;br /&gt;
http://img.gameru.net/img/08a55.jpg&lt;br /&gt;
&lt;br /&gt;
Включаем привязку к сетке (клавиша x или соответствующая иконка на панели инструментов)&lt;br /&gt;
Теперь точками рисуем нашу кривую 1&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb417.jpg&lt;br /&gt;
&lt;br /&gt;
После того как кривая нарисована, жмем enter,  наша кривая станет зеленой.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/9e111.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сочетание клавиш ctrl+D дублируем нашу кривую, выбираем инструмент move и перемещаем ее рядом чтоб получить вторую границу нашей дороги. Не забываем про размеры, я для примера перенесу 2 кривую на 5 метров вправо. Отключаем во вкладке Shading Smooth shade all, или нажимае кнопку «4».&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/3edd0.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно это.&lt;br /&gt;
Теперь все это безобразие нужно превратить в полигоны.&lt;br /&gt;
Заходим во вкладку Window -&amp;gt; Outliner &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb150.jpg&lt;br /&gt;
&lt;br /&gt;
И в открывшемся окне с помощью клавиши ctrl и лев. Кнопки Миши выбираем Curve1 &amp;amp; Curve2.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ca639.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь из режима редактирования полигонов нам надо перейти в режим редактирования Surfaces. Ниспадающее меню сразу под вкладками File Edit.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ce7ad.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь отрываем вкладку Surfaces -&amp;gt; Loft жмем кубик&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1b5c6.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В открывшемся окне проведем некоторые настройки.&lt;br /&gt;
Движок Sections spans отвечает за количество разбиений, не переборщите, потом тяжелее будет все это приводить в порядок. Для дороги (и.т.п.) я использую 2. Ставим в окне циферу 2 и жмем  Loft. Должно получиться примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/95536.jpg&lt;br /&gt;
&lt;br /&gt;
Сразу отметим, что в окне outliner, появился новый объект LoftedSurface1, переименуем его в road, щелкнем в окне Outliner на сей объект, и пропишем ему новое имя. В дальнейшем при наполнении локации корректное имя объекта здорово облегчит жизнь.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/8b2ae.jpg&lt;br /&gt;
&lt;br /&gt;
Так. Дорогу создали, теперь создадим все остальное , что дорогу окружает.&lt;br /&gt;
Тобиш землю, по которой эта дорога проложена.&lt;br /&gt;
Для этого создадим еще 2 кривые, только теперь в настройках CV Curve tool  поменяем Curve degree  с cubic  на linear.&lt;br /&gt;
 Включаем привязку к сетке и строим две вертикальные кривые по линиям нашей ранее созданной плоскости.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/b179f.jpg&lt;br /&gt;
Сразу отмечу то, что чем больше точек в линии, тем больше будет разбиений , и тем больше в итоге получится поликов. Тут уж на глаз. &lt;br /&gt;
Все жмем enter дублируем нашу линию ctrl+D и инструментом move перемещаем на противоположную сторону.&lt;br /&gt;
Теперь плоскость NurmbsPlane  нам больше не нужна, удалим ее. В окне Outliner выделим ее и нажмем клавишу del.&lt;br /&gt;
Вот что должно получиться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1e657.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сформируем новые плоскости. Для этого в окне Outliner выбираем Curve1&amp;amp;curve3 жмем surfaces -&amp;gt; loft  и кубик рядом, экспериментируя с настройками, добиваемся боле менее нормального варианта разбиения, у меня получилось так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/4b564.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь выбираем кривые 2 и 4 и проделываем то же самое.&lt;br /&gt;
Выглядеть должно примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e514b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь все кривые можно удалить. В окне выбираем все 4 и мочим их.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/82a2d.jpg&lt;br /&gt;
&lt;br /&gt;
Ну, вот что-то похожее на истину у нас получилось, теперь все это безобразие нужно конвертировать в полигональные объекты. Выбираем наш road, лезем во вкладку Modify -&amp;gt; convert -&amp;gt; Nurmbs to Poligon  жмем кубик&lt;br /&gt;
В открывшемся окне делаем настройки. С разу скажу, что лучше разбивать на треугольники, а не на кубики. Т.к. Повороты будут плавне и с числом полигонов count  при разбиении придется экспериментировать, до получения оптимального варианта. Я взял 400.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/08ca0.jpg&lt;br /&gt;
&lt;br /&gt;
Жмем apply, получаем результат.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/00be4.jpg&lt;br /&gt;
Обратите внимание на то что в окне Outliner появился новый объект, переименуем его все в тот же road, а исходный можно удалить.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/43094.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь по такой же схеме проделываем фокусы с оставшимися объектами, у меня получилось вот так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/df4cd.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь оставим дорогу в покое, а две половинки нашей земли склеим в единый меш.&lt;br /&gt;
В окне Outliner выбираем их, переходим в режим редактирования полигонов (под вкладками file edit) заходим &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/127df.jpg&lt;br /&gt;
Получим склеенный меш. &lt;br /&gt;
Теперь можно заниматься самим ландшафтом, холмами, долами и.т.п. .&lt;br /&gt;
Потом наносим материалы, собираем в единый меш и экспортим.&lt;br /&gt;
Вроде усе. &lt;br /&gt;
Authors: '''ZVUKARb'''&lt;br /&gt;
Из Word в Wiki: '''Oxygenium'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Wireframe ]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2</id>
		<title>SoC. Снятие денег с трупов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2"/>
				<updated>2010-07-03T16:04:39Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой теме я напишу как сделать так что б можна было снимать деньги с трупов.&lt;br /&gt;
Нам надо файл treasure_manager.script&lt;br /&gt;
В етом файле находим такие строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
После строки --printf(&amp;quot;TREASURE USE&amp;quot;)-- пишем&lt;br /&gt;
&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
У нас далжно выйти&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Типерь создаём файл lootmoney.script&lt;br /&gt;
и в нём пишем &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function lootmoney(npc)&lt;br /&gt;
	if npc ~= nil and not string.find(npc:section(),&amp;quot;arena&amp;quot;) and npc:character_community()~=&amp;quot;arena_enemy&amp;quot; then&lt;br /&gt;
		local money = npc:money()&lt;br /&gt;
		if money ~= nil and money ~=0 then&lt;br /&gt;
				local deadmoney = money&lt;br /&gt;
&lt;br /&gt;
                                local npc_rank&lt;br /&gt;
		npc_rank = ranks.get_obj_rank_name(npc)&lt;br /&gt;
		if npc_rank ~= nil then&lt;br /&gt;
			if npc_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(25,400)    &lt;br /&gt;
			elseif npc_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=500 then deadmoney=math.random(50,500)  &lt;br /&gt;
			elseif npc_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=600 then deadmoney=math.random(100,600) &lt;br /&gt;
			elseif npc_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=700 then deadmoney=math.random(200,700)  &lt;br /&gt;
                          end&lt;br /&gt;
						  end&lt;br /&gt;
				local news_texti = &amp;quot;\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]&amp;quot;..npc:character_name()..&amp;quot;\\n%c[255,255,0,0]Обнаружено денег: %c[default]&amp;quot;..game.translate_string(tostring(deadmoney)..&amp;quot;руб.&amp;quot;)&lt;br /&gt;
				db.actor:give_game_news(news_texti, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,0,83,47), 1, 4000)&lt;br /&gt;
				db.actor:give_money(deadmoney)&lt;br /&gt;
				game_stats.money_quest_update(deadmoney) &lt;br /&gt;
				npc:give_money(-money)&lt;br /&gt;
				game_stats.money_quest_update(-money)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
теперь создаем файл watcher_act.script и впишем в его&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- Red75 (c) 2008&lt;br /&gt;
-- Marauder scheme v 1.1&lt;br /&gt;
-- Part of AMK MOD&lt;br /&gt;
&lt;br /&gt;
evid_see_stuff=6931&lt;br /&gt;
evid_near_stuff=evid_see_stuff+1&lt;br /&gt;
evid_see_body=evid_see_stuff+2&lt;br /&gt;
evid_position_corrected=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
actid_reach_item=evid_see_stuff&lt;br /&gt;
actid_grab_item=evid_see_stuff+1&lt;br /&gt;
actid_grab_body=evid_see_stuff+2&lt;br /&gt;
actid_correct_position=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
-- Вызывает closure раз в period, obj[var] хранит время следующего срабатывания&lt;br /&gt;
function timed(obj,var,period,closure)&lt;br /&gt;
	if obj[var] and obj[var]&amp;lt;time_global() then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
		closure()&lt;br /&gt;
	elseif not obj[var] then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
--		closure()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trigger_timed(obj,var)&lt;br /&gt;
	obj[var]=time_global()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local disabled_objects={}&lt;br /&gt;
&lt;br /&gt;
local corpse_checked={} -- true - has loot, false - hasn't loot, nil - not checked&lt;br /&gt;
&lt;br /&gt;
function checkCorpse(obj)&lt;br /&gt;
	if (IsStalker(obj) or IsMonster(obj)) and obj:alive()==false then&lt;br /&gt;
		if corpse_checked[obj:id()]~=nil then&lt;br /&gt;
			return corpse_checked[obj:id()]&lt;br /&gt;
		end&lt;br /&gt;
		local cnt=0&lt;br /&gt;
		obj:iterate_inventory(function (dummy, item)&lt;br /&gt;
        if item:section()~=&amp;quot;bolt&amp;quot; then&lt;br /&gt;
          cnt=cnt+1&lt;br /&gt;
        end&lt;br /&gt;
			end, nil)&lt;br /&gt;
		corpse_checked[obj:id()]=cnt&amp;gt;0&lt;br /&gt;
		return corpse_checked[obj:id()]&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local valuable_clsid={&lt;br /&gt;
    [clsid.art_bast_artefact]=true,&lt;br /&gt;
    [clsid.art_black_drops]=true,&lt;br /&gt;
    [clsid.art_dummy]=true,&lt;br /&gt;
    [clsid.art_electric_ball]=true,&lt;br /&gt;
    [clsid.art_faded_ball]=true,&lt;br /&gt;
    [clsid.art_galantine]=true,&lt;br /&gt;
    [clsid.art_gravi]=true,&lt;br /&gt;
    [clsid.art_gravi_black]=true,&lt;br /&gt;
    [clsid.art_mercury_ball]=true,&lt;br /&gt;
    [clsid.art_needles]=true,&lt;br /&gt;
    [clsid.art_rusty_hair]=true,&lt;br /&gt;
    [clsid.art_thorn]=true,&lt;br /&gt;
    [clsid.art_zuda]=true,&lt;br /&gt;
    [clsid.artefact_s]=true,&lt;br /&gt;
    [clsid.device_detector_simple]=true,&lt;br /&gt;
    [clsid.device_pda]=true,&lt;br /&gt;
    [clsid.device_torch_s]=true,&lt;br /&gt;
    [clsid.equ_exo]=true,&lt;br /&gt;
    [clsid.equ_military]=true,&lt;br /&gt;
    [clsid.equ_scientific]=true,&lt;br /&gt;
    [clsid.equ_stalker_s]=true,&lt;br /&gt;
    [clsid.obj_antirad]=true,&lt;br /&gt;
    [clsid.obj_attachable]=true,&lt;br /&gt;
    [clsid.obj_bandage]=true,&lt;br /&gt;
    [clsid.obj_bolt]=true,&lt;br /&gt;
    [clsid.obj_bottle]=true,&lt;br /&gt;
    [clsid.obj_food]=true,&lt;br /&gt;
    [clsid.obj_medkit]=true,&lt;br /&gt;
    [clsid.wpn_ak74_s]=true,&lt;br /&gt;
    [clsid.wpn_ammo]=true,&lt;br /&gt;
    [clsid.wpn_ammo_m209]=true,&lt;br /&gt;
    [clsid.wpn_ammo_og7b]=true,&lt;br /&gt;
    [clsid.wpn_ammo_vog25]=true,&lt;br /&gt;
    [clsid.wpn_binocular_s]=true,&lt;br /&gt;
    [clsid.wpn_bm16_s]=true,&lt;br /&gt;
    [clsid.wpn_fn2000]=true,&lt;br /&gt;
    [clsid.wpn_fort]=true,&lt;br /&gt;
    [clsid.wpn_groza_s]=true,&lt;br /&gt;
    [clsid.wpn_hpsa_s]=true,&lt;br /&gt;
    [clsid.wpn_knife_s]=true,&lt;br /&gt;
    [clsid.wpn_lr300_s]=true,&lt;br /&gt;
    [clsid.wpn_pm_s]=true,&lt;br /&gt;
    [clsid.wpn_rg6_s]=true,&lt;br /&gt;
    [clsid.wpn_rpg7_s]=true,&lt;br /&gt;
    [clsid.wpn_scope_s]=true,&lt;br /&gt;
    [clsid.wpn_shotgun_s]=true,&lt;br /&gt;
    [clsid.wpn_silencer]=true,&lt;br /&gt;
    [clsid.wpn_svd_s]=true,&lt;br /&gt;
    [clsid.wpn_svu_s]=true,&lt;br /&gt;
    [clsid.wpn_usp45_s]=true,&lt;br /&gt;
    [clsid.wpn_val_s]=true,&lt;br /&gt;
    [clsid.wpn_vintorez_s]=true,&lt;br /&gt;
    [clsid.wpn_walther_s]=true,&lt;br /&gt;
    [clsid.wpn_wmagaz]=true,&lt;br /&gt;
    [clsid.wpn_wmaggl]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj_owner={}&lt;br /&gt;
&lt;br /&gt;
function bgwith(str,ptr)&lt;br /&gt;
	local ps=string.find(str,ptr)&lt;br /&gt;
	return ps~=nil and ps==1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isValuable(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  if sec==&amp;quot;amk_metka&amp;quot; then&lt;br /&gt;
    return false,false&lt;br /&gt;
  end&lt;br /&gt;
	if valuable_clsid[obj:clsid()] then&lt;br /&gt;
		return true, false&lt;br /&gt;
	end&lt;br /&gt;
	return bgwith(sec,&amp;quot;af_&amp;quot;) or bgwith(sec,&amp;quot;ammo_&amp;quot;) or bgwith(sec,&amp;quot;wpn_&amp;quot;) or bgwith(sec,&amp;quot;energy_&amp;quot;) or checkCorpse(obj), IsStalker(obj) or IsMonster(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function objValue(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  local multiplier=1&lt;br /&gt;
  if bgwith(sec,&amp;quot;ammo_&amp;quot;) then&lt;br /&gt;
    multiplier=30&lt;br /&gt;
  elseif sec==&amp;quot;vodka&amp;quot; then&lt;br /&gt;
    multiplier=20&lt;br /&gt;
  end&lt;br /&gt;
	if system_ini():section_exist(sec) and system_ini():line_exist(sec,&amp;quot;cost&amp;quot;) then&lt;br /&gt;
		return system_ini():r_float(sec,&amp;quot;cost&amp;quot;)*multiplier&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function claimGObject(npc,st,obj)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
	end&lt;br /&gt;
	st.grabitemid=obj:id()&lt;br /&gt;
	obj_owner[obj:id()]=npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function freeGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
		st.grabitemid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function clearGObject(st)&lt;br /&gt;
	st.grabitemid=nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		local ret=level.object_by_id(st.grabitemid)&lt;br /&gt;
		if ret==nil then&lt;br /&gt;
			st.grabitemid=nil&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mypGObject(npc,st)&lt;br /&gt;
	return st.grabitemid~=nil and obj_owner[st.grabitemid]~=nil and obj_owner[st.grabitemid]==npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local bad_dangers={&lt;br /&gt;
  [danger_object.hit]=true,&lt;br /&gt;
  [danger_object.attacked]=true,&lt;br /&gt;
  [danger_object.bullet_ricochet]=true,&lt;br /&gt;
  [danger_object.grenade]=true,&lt;br /&gt;
  [danger_object.entity_death]=true,&lt;br /&gt;
  [danger_object.enemy_sound]=true&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
local inertion_time=30000&lt;br /&gt;
&lt;br /&gt;
function bad_danger(npc)&lt;br /&gt;
  local danger=npc:best_danger()&lt;br /&gt;
  if danger then&lt;br /&gt;
    return bad_dangers[danger:type()] and time_global()-danger:time()&amp;lt;inertion_time&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
function ev_see_stuff:evaluate()&lt;br /&gt;
	local res=getGObject(self.st)~=nil&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  local actsch=db.storage[npc:id()].active_scheme&lt;br /&gt;
  if actsch and db.actor then&lt;br /&gt;
    xr_logic.try_switch_to_another_section(npc, db.storage[npc:id()][actsch], db.actor)&lt;br /&gt;
  end&lt;br /&gt;
	local act_sec=db.storage[npc:id()].active_section or &amp;quot;&amp;quot;&lt;br /&gt;
	if (not npc:alive()) or xr_wounded.is_wounded(npc) or npc:best_enemy() or &lt;br /&gt;
      bad_danger(npc) or (actsch and db.storage[npc:id()][actsch].no_loot) then&lt;br /&gt;
		if res then&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; distracted. sect &amp;quot;..act_sec,&amp;quot;grb&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  local dist_limit=1000&lt;br /&gt;
  if bgwith(act_sec,&amp;quot;camper&amp;quot;) then&lt;br /&gt;
    dist_limit=5&lt;br /&gt;
  end&lt;br /&gt;
	local busy=bgwith(act_sec,&amp;quot;walker&amp;quot;) or bgwith(act_sec,&amp;quot;combat&amp;quot;) or bgwith(act_sec,&amp;quot;danger&amp;quot;) -- or npc:best_danger()&lt;br /&gt;
	if res and self.st.block_search then&lt;br /&gt;
	  -- NPC собрался взять вещь. Временно прекратим поиск.&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	timed(self.st,&amp;quot;tm1&amp;quot;,5000+math.random()*10000,&lt;br /&gt;
		function ()&lt;br /&gt;
--			amk.mylog(npc:name() .. &amp;quot; is going to search stuff&amp;quot;,&amp;quot;grb&amp;quot;)&lt;br /&gt;
			local min_dist=100000&lt;br /&gt;
			local function check_item(o)&lt;br /&gt;
				local obj=o:object()&lt;br /&gt;
				if obj_owner[obj:id()] and (level.object_by_id(obj_owner[obj:id()])==nil or level.object_by_id(obj_owner[obj:id()]):alive()==false) then&lt;br /&gt;
					obj_owner[obj:id()]=nil&lt;br /&gt;
				end&lt;br /&gt;
				if (not self.st.disabled_objects[obj:id()]) and (obj:parent()==nil or not IsStalker(obj:parent())) and &lt;br /&gt;
           (obj_owner[obj:id()]==nil or obj_owner[obj:id()]==npc:id()) and npc:accessible(obj:level_vertex_id()) and&lt;br /&gt;
           (db.actor==nil or db.actor:alive()==false or db.actor:position():distance_to_sqr(obj:position())&amp;gt;6) then&lt;br /&gt;
					local valuable,corpse=isValuable(obj)&lt;br /&gt;
					if valuable then &lt;br /&gt;
						local value=3000&lt;br /&gt;
						if not corpse then&lt;br /&gt;
							value=objValue(obj)&lt;br /&gt;
						end&lt;br /&gt;
						if value&amp;lt;=0 then value=0 end&lt;br /&gt;
						local max_dist=5+math.sqrt(value)&lt;br /&gt;
						if busy then&lt;br /&gt;
							max_dist=max_dist/5&lt;br /&gt;
						end&lt;br /&gt;
						local dist=level.vertex_position(obj:level_vertex_id()):distance_to(npc:position())&lt;br /&gt;
            local corrected_dist=dist&lt;br /&gt;
            if dist&amp;gt;5 then&lt;br /&gt;
              corrected_dist=5+(dist-5)/math.sqrt(value)&lt;br /&gt;
            end&lt;br /&gt;
						if dist&amp;lt;max_dist and corrected_dist&amp;lt;min_dist and dist&amp;lt;dist_limit then&lt;br /&gt;
              min_dist=corrected_dist&lt;br /&gt;
							claimGObject(npc,self.st,obj)&lt;br /&gt;
							res=true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end -- function check_item&lt;br /&gt;
			for o in npc:memory_visible_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
			for o in npc:memory_sound_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
--			for o in npc:not_yet_visible_objects() do&lt;br /&gt;
--				check_item(o)&lt;br /&gt;
--			end&lt;br /&gt;
			if res then &lt;br /&gt;
				amk.mylog(npc:name() .. &amp;quot; claimed &amp;quot;..getGObject(self.st):name()..&amp;quot; cact &amp;quot;..tostring(npc:motivation_action_manager():current_action_id()),&amp;quot;grb&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	return res -- false -- res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_near_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if gi then&lt;br /&gt;
    if self.st.dest_lvid then&lt;br /&gt;
      return npc:level_vertex_id()==self.st.dest_lvid&lt;br /&gt;
    end&lt;br /&gt;
    return level.vertex_position(gi:level_vertex_id()):distance_to_sqr(npc:position())&amp;lt;1&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_body&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:__init(st) super(nil, &amp;quot;ev_see_body&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi then&lt;br /&gt;
    return IsStalker(gi) or IsMonster(gi)&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_position_corrected&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:__init(st) super(nil, &amp;quot;ev_position_corrected&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  return self.st.position_corrected==true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	npc:set_item(object.idle,nil)&lt;br /&gt;
	npc:set_movement_type(move.walk)&lt;br /&gt;
	npc:set_mental_state(anim.danger)&lt;br /&gt;
	npc:set_body_state(move.crouch)&lt;br /&gt;
  npc:movement_enabled(true)&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
--	if gi then npc:set_sight(gi,true,true) end&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab item&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
    if(IsStalker(gi) or IsMonster(gi)) then&lt;br /&gt;
  		self.tt=time_global()+3000&lt;br /&gt;
  	else&lt;br /&gt;
  		self.tt=time_global()+1000&lt;br /&gt;
    	utils.send_to_nearest_accessible_vertex(npc,gi:level_vertex_id())&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	end&lt;br /&gt;
	--npc:set_dest_level_vertex_id(1)&lt;br /&gt;
	self.force=vector():set(0,0,0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
			gi:transfer_item(gi,npc)&lt;br /&gt;
			npc:enable_memory_object(gi,false)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_body&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:__init (st) super (nil, &amp;quot;act_grab_body&amp;quot;)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab body&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
 		self.tt=time_global()+6000&lt;br /&gt;
    state_mgr.set_state(npc,&amp;quot;search&amp;quot;,nil,nil,{look_object=gi})&lt;br /&gt;
  else&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
      gi:iterate_inventory(function (d,item)&lt;br /&gt;
          if item:section()~=&amp;quot;bolt&amp;quot; then &lt;br /&gt;
            gi:transfer_item(item,npc)&lt;br /&gt;
          end&lt;br /&gt;
        end, nil)&lt;br /&gt;
		local num=gi:money() &lt;br /&gt;
		if num and num &amp;gt;0 then &lt;br /&gt;
				local deadmoney = num&lt;br /&gt;
				local gi_rank&lt;br /&gt;
		gi_rank = ranks.get_obj_rank_name(gi)&lt;br /&gt;
		if gi_rank ~= nil then&lt;br /&gt;
			if gi_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=100 then deadmoney=math.random(25,100)    &lt;br /&gt;
			elseif gi_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=200 then deadmoney=math.random(50,200)  &lt;br /&gt;
			elseif gi_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=300 then deadmoney=math.random(100,300) &lt;br /&gt;
			elseif gi_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(200,400)  &lt;br /&gt;
		end&lt;br /&gt;
		end&lt;br /&gt;
		npc:give_money(deadmoney) &lt;br /&gt;
		game_stats.money_quest_update(deadmoney) &lt;br /&gt;
		gi:give_money(-num) &lt;br /&gt;
		game_stats.money_quest_update(-num) &lt;br /&gt;
		end&lt;br /&gt;
      corpse_checked[gi:id()]=false&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function correct_position(gi,npc)&lt;br /&gt;
  if IsStalker(gi) then&lt;br /&gt;
    -- Вычисляем вектор разницы между координатами кости и level vertex. Пытаемся найти level vertex наиболее близкий к кости&lt;br /&gt;
    local diff=gi:bone_position(&amp;quot;bip01_head&amp;quot;):sub(level.vertex_position(gi:level_vertex_id()))&lt;br /&gt;
    local len=diff:magnitude()&lt;br /&gt;
    local diffp=vector():set(diff.z,0,-diff.x):mul(0.5)&lt;br /&gt;
    -- Сдвигаем целевую точку вбок, чтобы непись не залазил ногами в труп&lt;br /&gt;
    diff:add(diffp)&lt;br /&gt;
    return npc:vertex_in_direction(gi:level_vertex_id(),diff,len)&lt;br /&gt;
  else&lt;br /&gt;
    return gi:level_vertex_id()&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_reach_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  self.st.dest_lvid=nil&lt;br /&gt;
  self.tgt_lvid=0&lt;br /&gt;
	if gi then&lt;br /&gt;
		if npc:accessible(gi:level_vertex_id()) then&lt;br /&gt;
		  npc:set_detail_path_type(move.curve)&lt;br /&gt;
		  npc:set_path_type(game_object.level_path)&lt;br /&gt;
      if npc:best_danger() and time_global()-npc:best_danger():time()&amp;lt;inertion_time then&lt;br /&gt;
        npc:set_mental_state(anim.danger)&lt;br /&gt;
        npc:set_body_state(move.crouch)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
--        npc:set_sight(gi,true,true)&lt;br /&gt;
      else&lt;br /&gt;
        npc:set_body_state(move.standing)&lt;br /&gt;
        npc:set_mental_state(anim.free)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
      end&lt;br /&gt;
      npc:movement_enabled(true)&lt;br /&gt;
      if npc:best_weapon() and isWeapon(npc:best_weapon()) then&lt;br /&gt;
--        npc:set_item(object.idle,npc:best_weapon())&lt;br /&gt;
      end&lt;br /&gt;
--			npc:set_dest_level_vertex_id(gi:level_vertex_id())&lt;br /&gt;
			npc:set_sight(look.danger,nil,0)&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) --gi:level_vertex_id()&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
		else&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	self.ct=time_global()&lt;br /&gt;
	self.clvid=npc:level_vertex_id()&lt;br /&gt;
  self.st.position_corrected=false&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to reach item&amp;quot;,&amp;quot;stmt&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi and gi:parent()~=nil then&lt;br /&gt;
		-- ГГ забрал вкусность. Можно добавить наезд на ГГ.&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
		freeGObject(self.st)&lt;br /&gt;
	elseif gi then&lt;br /&gt;
		if self.clvid==npc:level_vertex_id() then&lt;br /&gt;
			if time_global()-self.ct&amp;gt;10000 then&lt;br /&gt;
			-- не можем добраться до нняки&lt;br /&gt;
				self.st.disabled_objects[gi:id()]=true&lt;br /&gt;
        self.st.dest_lvid=nil&lt;br /&gt;
				freeGObject(self.st)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			self.clvid=npc:level_vertex_id()&lt;br /&gt;
			self.ct=time_global()&lt;br /&gt;
		end&lt;br /&gt;
    if self.tgt_lvid~=gi:level_vertex_id() then&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) -- gi:level_vertex_id()&lt;br /&gt;
			npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
    end&lt;br /&gt;
				--npc:set_sight(gi)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_to_binder(object, char_ini, scheme, section, st)&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	local npc=object&lt;br /&gt;
	st.disabled_objects={}&lt;br /&gt;
  local manager = object:motivation_action_manager()&lt;br /&gt;
&lt;br /&gt;
  local zombi=npc:character_community()==&amp;quot;zombied&amp;quot; or npc:character_community()==&amp;quot;trader&amp;quot; or&lt;br /&gt;
          npc:character_community()==&amp;quot;arena_enemy&amp;quot; or npc:name()==&amp;quot;mil_stalker0012&amp;quot; or npc:name()==&amp;quot;yantar_ecolog_general&amp;quot; or -- сумашедший на милитари и Сахаров&lt;br /&gt;
          npc:name()==&amp;quot;mil_freedom_member0021&amp;quot; -- Скрягу в зомби!&lt;br /&gt;
	&lt;br /&gt;
	local prop_idlecombat=xr_evaluators_id.state_mgr + 3&lt;br /&gt;
  local prop_contact=xr_evaluators_id.stohe_meet_base + 1&lt;br /&gt;
  -- Evaluators&lt;br /&gt;
	if npc:story_id()~=4294967296 or zombi then&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, property_evaluator_const(false))&lt;br /&gt;
	else&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, ev_see_stuff(st,&amp;quot;ev_see_stuff&amp;quot;))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, ev_see_body(st))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, ev_position_corrected(st))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, ev_near_stuff(st,&amp;quot;ev_near_stuff&amp;quot;))&lt;br /&gt;
	  -- Actions&lt;br /&gt;
	  local action = act_grab_item(&amp;quot;act_grab_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true)) -- отключим стэйт менеджер&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,true)) -- для переключения на обыск трупа&lt;br /&gt;
	  manager:add_action (actid_grab_item, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_grab_body(st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
--	  action:add_precondition(world_property(evid_position_corrected,true))&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,false)) -- переключаемся на подъём вещички&lt;br /&gt;
	  manager:add_action (actid_grab_body, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_reach_item(&amp;quot;act_reach_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_contact,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true))&lt;br /&gt;
	  action:add_effect (world_property(evid_near_stuff, true))&lt;br /&gt;
	  manager:add_action (actid_reach_item, action)&lt;br /&gt;
		&lt;br /&gt;
	  action = manager:action(xr_actions_id.alife) &lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
    action = manager:action(stalker_ids.action_danger_planner)&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--    action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 3) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
		&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_meet_base+1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))	&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb end &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_scheme(npc, ini, scheme, section)&lt;br /&gt;
--	amk.mylog(&amp;quot;set scheme &amp;quot;..npc:name()..&amp;quot; story_id &amp;quot;..npc:story_id(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
  local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)&lt;br /&gt;
  st.ini=ini&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Теперь осталось содать скрипт amk.script --у кого есть ненадо--&lt;br /&gt;
и вписываем в него&lt;br /&gt;
&lt;br /&gt;
local npc_spawner={}  --служебный массив, работает автоматически - не трогать шаловливыми русками&lt;br /&gt;
&lt;br /&gt;
local timers={}   --хранит реал-тайм таймеры&lt;br /&gt;
local g_timers={} --хранит таймеры в игровом времени&lt;br /&gt;
local markers={}  --хранит маркеры на карте&lt;br /&gt;
local x_objs={}     --хранит ИДшники объектов&lt;br /&gt;
local timer_trigger=nil&lt;br /&gt;
convert_npc={}&lt;br /&gt;
g_kick=false&lt;br /&gt;
&lt;br /&gt;
is_debug = false&lt;br /&gt;
ver = &amp;quot;0&amp;quot;&lt;br /&gt;
oau_watchdog=0&lt;br /&gt;
oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
--переменные для типсов&lt;br /&gt;
pda_news = xr_sound.get_safe_sound_object([[device\pda\pda_news]])&lt;br /&gt;
pda_tips = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])&lt;br /&gt;
pda_task = xr_sound.get_safe_sound_object([[device\pda\pda_objective]])&lt;br /&gt;
&lt;br /&gt;
tips_icons = {&lt;br /&gt;
  default  = { 0, 658},&lt;br /&gt;
  trader   = { 332, 893},&lt;br /&gt;
  dolg     = { 0, 658},&lt;br /&gt;
  freedom  = { 0, 658},&lt;br /&gt;
  ecolog   = { 498, 0},&lt;br /&gt;
  arena    = { 332, 141},&lt;br /&gt;
  stalker  = { 0, 658},&lt;br /&gt;
  krot     = { 332, 47},&lt;br /&gt;
  barman   = { 332, 235},&lt;br /&gt;
  wolf   = { 332, 940},&lt;br /&gt;
  o_soznanie = { 498, 893},&lt;br /&gt;
  monolith = { 0, 658},&lt;br /&gt;
    saharov  = { 332, 470},&lt;br /&gt;
    prizrak  = { 0, 658},&lt;br /&gt;
    killer   = { 0, 658},&lt;br /&gt;
  death     = { 0, 752},&lt;br /&gt;
  gen_info  = { 0, 658},&lt;br /&gt;
	trade 		= { 0, 0},&lt;br /&gt;
  uniq  =  {  498, 47}    --{ 498, 188}&lt;br /&gt;
}&lt;br /&gt;
----------------&lt;br /&gt;
local bufferedmessages={}&lt;br /&gt;
&lt;br /&gt;
function logct(msg,tag)&lt;br /&gt;
	if true and (tag and (tag==&amp;quot;mcbt&amp;quot; or tag==&amp;quot;temp&amp;quot;)) then --(tag==&amp;quot;dram&amp;quot;)) then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))		&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rep(npc,msg,tag)&lt;br /&gt;
	if string.find(npc:name(),&amp;quot;gar_dm&amp;quot;) then&lt;br /&gt;
		logct(msg,tag)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mylog(msg)&lt;br /&gt;
  if is_debug then &lt;br /&gt;
	  if msg==nil then&lt;br /&gt;
	    return &lt;br /&gt;
	  end&lt;br /&gt;
	  if db and db.actor then&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      for k,v in ipairs(bufferedmessages) do&lt;br /&gt;
	        db.actor:give_game_news(v, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	      end&lt;br /&gt;
	      bufferedmessages=nil&lt;br /&gt;
	    end&lt;br /&gt;
	  db.actor:give_game_news(msg, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	  else&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      table.insert(bufferedmessages,msg)&lt;br /&gt;
	    end&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	  if get_console() then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))&lt;br /&gt;
	    get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--показываем типс&lt;br /&gt;
function send_tip(news_text, header, timeout, showtime, sender, sound)&lt;br /&gt;
  if news_text==nil then return end&lt;br /&gt;
  if header==nil then header=game.translate_string(&amp;quot;st_tip&amp;quot;) end&lt;br /&gt;
  if timeout == nil then timeout = 0 end&lt;br /&gt;
  if showtime == nil then showtime = 5 end&lt;br /&gt;
  &lt;br /&gt;
  local player&lt;br /&gt;
  if sound==&amp;quot;news&amp;quot; then&lt;br /&gt;
    player=pda_news&lt;br /&gt;
  elseif sound==&amp;quot;task&amp;quot; then&lt;br /&gt;
    player=pda_task&lt;br /&gt;
  else&lt;br /&gt;
    player=pda_tips&lt;br /&gt;
  end   &lt;br /&gt;
  &lt;br /&gt;
  --' Играем дефолтный звук&lt;br /&gt;
  player:play(db.actor, timeout, sound_object.s2d)&lt;br /&gt;
  &lt;br /&gt;
  if sender == nil then&lt;br /&gt;
    sender = &amp;quot;default&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
  local x = tips_icons[sender][1]&lt;br /&gt;
  local y = tips_icons[sender][2]&lt;br /&gt;
  &lt;br /&gt;
  local news_text = &amp;quot;%c[255,160,160,160]&amp;quot;..header..&amp;quot;\\n&amp;quot;..&amp;quot;%c[default]&amp;quot;..news_text&lt;br /&gt;
  db.actor:give_game_news(news_text, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(x,y,83,47), timeout*1000, showtime*1000)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_spot_on_map(obj_id,type,text)&lt;br /&gt;
  --возможные типы type смотри в ui\map_spots.xml &lt;br /&gt;
  if obj_id then&lt;br /&gt;
    if text==nil then text=&amp;quot; &amp;quot; end&lt;br /&gt;
    -- Ставим метку на серверный объект чтобы её не пришлось обновлять&lt;br /&gt;
    level.map_add_object_spot_ser(obj_id, type, text)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id, type)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id, text)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function remove_spot_from_map(obj_id,type)&lt;br /&gt;
  if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then&lt;br /&gt;
    level.map_remove_object_spot(obj_id, type)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в реальном времени&lt;br /&gt;
function start_timer(name,delay,action)&lt;br /&gt;
  if not delay then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if not action then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;xt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;xt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;xd&amp;quot;..a, time+delay*1000*system_ini():r_float(&amp;quot;alife&amp;quot;,&amp;quot;time_factor&amp;quot;))&lt;br /&gt;
  save_variable(&amp;quot;xp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в игровом времени&lt;br /&gt;
function g_start_timer(name,delay_d,delay_h,delay_m,action)&lt;br /&gt;
    local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  if delay_d==nil or delay_h==nil or delay_m==nil then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if action==nil then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;gt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  save_variable(&amp;quot;gt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;gd&amp;quot;..a, time+delay_d*60*24+delay_h*60+delay_m)&lt;br /&gt;
  save_variable(&amp;quot;gp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_g_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Временное хранилище для переменных удалённых из pstor&lt;br /&gt;
local emerg_store&lt;br /&gt;
-- Удаляем переменные из pstor. Чтобы не переполнить буфер&lt;br /&gt;
function emergency_cleanup()&lt;br /&gt;
  emerg_store={}&lt;br /&gt;
  if load_variable(&amp;quot;zombied&amp;quot;,false) then&lt;br /&gt;
    emerg_store.zombied=load_table(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
    del_variable(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  for i=1,100,1 do&lt;br /&gt;
    if load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
      emerg_store[i]={}&lt;br /&gt;
      emerg_store[i].gt=load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gd=load_variable(&amp;quot;gd&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gp=load_variable(&amp;quot;gp&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      del_variable(&amp;quot;gt&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gd&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gp&amp;quot;..i)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;emerg&amp;quot;,true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Восстанавливаем удалённые переменные&lt;br /&gt;
function emergency_restore()&lt;br /&gt;
  for k,v in pairs(emerg_store) do&lt;br /&gt;
    if k==&amp;quot;zombied&amp;quot; then&lt;br /&gt;
      save_table(k,v)&lt;br /&gt;
    else&lt;br /&gt;
      save_variable(&amp;quot;gt&amp;quot;..k,v.gt)&lt;br /&gt;
      save_variable(&amp;quot;gd&amp;quot;..k,v.gd)&lt;br /&gt;
      save_variable(&amp;quot;gp&amp;quot;..k,v.gp)      &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  del_variable(&amp;quot;emerg&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function convert_timers()&lt;br /&gt;
  if load_variable(&amp;quot;tmcv&amp;quot;,true) then&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_timer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;xt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;xd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;xp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_gtimer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;gt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;gd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;gp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    save_variable(&amp;quot;tmcv&amp;quot;,false)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--проверка таймеров, использует 3 следующие за ним функции для выбора действия&lt;br /&gt;
function check_timers()&lt;br /&gt;
  local tmp&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __g_timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __timer_found(idx)&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;xd&amp;quot;..idx, nil)&amp;lt;=time then&lt;br /&gt;
    name=load_variable(&amp;quot;xt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;xp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;xt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __g_timer_found(idx)&lt;br /&gt;
    local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;gd&amp;quot;..idx, nil)&amp;lt;=gtime then&lt;br /&gt;
    name=load_variable(&amp;quot;gt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;gp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;gt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __do_timer_action(select_string,params_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
  if select_string==&amp;quot;show_news&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;show_news&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;gg_need_sleep&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_nrg&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_nrg&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
--[[&lt;br /&gt;
if select_string==&amp;quot;sleep_med&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_med&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
 ]]--&lt;br /&gt;
  if select_string==&amp;quot;sleep_matras&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_matras&amp;quot;,params_string)&lt;br /&gt;
  end &lt;br /&gt;
  if select_string==&amp;quot;sleep_tr_item&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_tr_item&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_notebook&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_notebook&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;block_sleep_menu&amp;quot; then&lt;br /&gt;
    save_variable(&amp;quot;block_sleep_menu&amp;quot;,0)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;radar_fix&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;radar_fix&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;af_transform_end&amp;quot;,unpack_array_from_string(params_string))&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;amk_freeplay&amp;quot; then&lt;br /&gt;
    if amk.load_variable(&amp;quot;freeplay&amp;quot;,0)==1 and level.name()==&amp;quot;l12_stancia_2&amp;quot; then&lt;br /&gt;
      xr_effects.game_credits()&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Blowout_pp&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;test&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout_ss&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;blowout_scary_sounds&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blow_shift&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_repbox&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;repbox_cond&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;after_repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;collect_anomalies_info&amp;quot; then&lt;br /&gt;
    amk_anoms.collect_info()&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;news_check&amp;quot; then&lt;br /&gt;
    if (news_main and news_main.check_news) then&lt;br /&gt;
		news_main.check_news()&lt;br /&gt;
	end&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--спавним объекты на карту&lt;br /&gt;
--для спавна неписей смотрим config\creatures\spawn_sections.ltx - там написаны имена секций для разных типов неписей&lt;br /&gt;
function spawn_item(spawn_item, pos, gv,lv)&lt;br /&gt;
  if gv==nil then gv=db.actor:game_vertex_id() end&lt;br /&gt;
  if lv==nil then lv=db.actor:level_vertex_id() end&lt;br /&gt;
  return alife():create(spawn_item, pos, lv, gv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для спавна патронов используем spawn_ammo_in_inv&lt;br /&gt;
function spawn_item_in_inv(spawn_item,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  return alife():create(spawn_item, &lt;br /&gt;
      npc:position(),&lt;br /&gt;
      npc:level_vertex_id(),  &lt;br /&gt;
      npc:game_vertex_id(),&lt;br /&gt;
      npc:id())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--используем для спавна патронов&lt;br /&gt;
function spawn_ammo_in_inv(spawn_item,number,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  if number &amp;gt; 0 then&lt;br /&gt;
    return se_respawn.create_ammo(spawn_item, &lt;br /&gt;
        npc:position(),&lt;br /&gt;
        npc:level_vertex_id(),  &lt;br /&gt;
        npc:game_vertex_id(),&lt;br /&gt;
        npc:id(),&lt;br /&gt;
        number)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- удаляем объект из игры&lt;br /&gt;
function remove_item(remove_item)&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выбрасываем объект из инвентаря, применимо к ГГ&lt;br /&gt;
function drop_item(npc,item)&lt;br /&gt;
  if item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(item)&lt;br /&gt;
    npc:drop_item(item)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--убиваем непися&lt;br /&gt;
function make_suicide(npc)&lt;br /&gt;
  npc:kill(npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--узнаем отношение одного непися к другому&lt;br /&gt;
function get_npc_relation(obj,target)&lt;br /&gt;
  local rel = obj:relation(target)&lt;br /&gt;
  local relation&lt;br /&gt;
  if rel==game_object.neutral then&lt;br /&gt;
    relation=&amp;quot;neutral&amp;quot;&lt;br /&gt;
  elseif rel==game_object.friend then&lt;br /&gt;
    relation=&amp;quot;friend&amp;quot;&lt;br /&gt;
  elseif rel==game_object.enemy then&lt;br /&gt;
    relation=&amp;quot;enemy&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  return relation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--задаем отношение одного непися к другому&lt;br /&gt;
function set_npc_relation(obj,target,relation)&lt;br /&gt;
  local rel&lt;br /&gt;
  if relation==&amp;quot;neutral&amp;quot; then&lt;br /&gt;
    rel=game_object.neutral&lt;br /&gt;
  elseif relation==&amp;quot;friend&amp;quot; then&lt;br /&gt;
    rel=game_object.friend&lt;br /&gt;
  elseif relation==&amp;quot;enemy&amp;quot; then&lt;br /&gt;
    rel=game_object.enemy&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end &lt;br /&gt;
  obj:set_relation(rel,target)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- узнаем группировку непися, применимо к ГГ, только ОНЛАЙН&lt;br /&gt;
function get_npc_community(npc)&lt;br /&gt;
  return npc:character_community()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выставляем группировку непися, можно ГГ, только ОНЛАЙН&lt;br /&gt;
function set_npc_community(npc,community_string)&lt;br /&gt;
  --значения для community_string можно узнать в config\creatures\game_relations.ltx&lt;br /&gt;
  return npc:set_character_community(community_string, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря по имени&lt;br /&gt;
function remove_item_from_inventory_by_name(remove_item_name,npc)&lt;br /&gt;
  return remove_item_from_inventory(npc:object(remove_item_name),npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря&lt;br /&gt;
function remove_item_from_inventory(remove_item,npc)&lt;br /&gt;
  if npc==nil then npc=db.actor end&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(remove_item)&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--создаем &amp;quot;ожидатели&amp;quot; для неписей нужно для корректной работы с объектами, созданными внутри скрипта&lt;br /&gt;
function create_waiter_for_npc(npc,select_string)--неписи&lt;br /&gt;
  npc_spawner[npc.id]=select_string&lt;br /&gt;
  save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--очищаем инвентарь непися, можно ГГ, использует следующую фунцию для удаления предмета&lt;br /&gt;
function clear_npc_inventory(npc)&lt;br /&gt;
    npc:iterate_inventory(__del_item, npc)&lt;br /&gt;
end&lt;br /&gt;
function __del_item(npc, item)&lt;br /&gt;
    local section = item:section()&lt;br /&gt;
&lt;br /&gt;
    if section == &amp;quot;bolt&amp;quot; or section == &amp;quot;device_torch&amp;quot; then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
--    npc:mark_item_dropped(item)&lt;br /&gt;
    alife():release(alife():object(item:id()), true)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
--проверка запущена ли игра&lt;br /&gt;
function check_game()&lt;br /&gt;
  if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем переменную&lt;br /&gt;
function save_variable(variable_name, value)&lt;br /&gt;
  if value==nil then&lt;br /&gt;
    amk.mylog(&amp;quot;saving nil into &amp;quot;..variable_name)&lt;br /&gt;
    del_variable(variable_name)&lt;br /&gt;
  else&lt;br /&gt;
    local vn=compress_name(variable_name)&lt;br /&gt;
    xr_logic.pstor_store(db.actor, vn, value)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем переменную&lt;br /&gt;
function load_variable(variable_name, value_if_not_found)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  return xr_logic.pstor_retrieve(db.actor, vn, value_if_not_found)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем переменную&lt;br /&gt;
function del_variable(variable_name)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  if db.storage[db.actor:id()].pstor[vn] then&lt;br /&gt;
    db.storage[db.actor:id()].pstor[vn] = nil&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица компрессии имён&lt;br /&gt;
local compress_table={&lt;br /&gt;
}&lt;br /&gt;
local checked=false&lt;br /&gt;
&lt;br /&gt;
-- Преобразует имя переменной в короткое&lt;br /&gt;
function compress_name(name)&lt;br /&gt;
  return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--определяем находится ли ГГ в определенной зоне&lt;br /&gt;
function check_npc_in_box(npc, p1,p2,p3)&lt;br /&gt;
  local pos&lt;br /&gt;
  if npc.name then pos=npc:position() else pos=npc end&lt;br /&gt;
  if p3==nil then&lt;br /&gt;
    if is_point_inside_interval(pos.x,p1.x,p2.x) and&lt;br /&gt;
      is_point_inside_interval(pos.y,p1.y,p2.y) and&lt;br /&gt;
      is_point_inside_interval(pos.z,p1.z,p2.z) then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false  &lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    local v1,v2,r,proj1,proj2,dv1,dv2&lt;br /&gt;
    v1=sub(p2,p1)&lt;br /&gt;
    v2=sub(p3,p2)&lt;br /&gt;
    v1.y=0 &lt;br /&gt;
    v2.y=0&lt;br /&gt;
    dv1=v1:magnitude()&lt;br /&gt;
    dv2=v2:magnitude()&lt;br /&gt;
    v1:normalize() &lt;br /&gt;
    v2:normalize()&lt;br /&gt;
    r=sub(pos,p1)&lt;br /&gt;
    local v1p=vector():set(v1.z,0,-v1.x)&lt;br /&gt;
    proj2=v1p:dotproduct(r)/v1p:dotproduct(v2)&lt;br /&gt;
    proj1=v1:dotproduct(r)-v1:dotproduct(v2)*proj2&lt;br /&gt;
    if proj1&amp;gt;0 and proj1&amp;lt;dv1 and proj2&amp;gt;0 and proj2&amp;lt;dv2 and pos.y&amp;gt;p1.y and pos.y&amp;lt;p3.y then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function is_point_inside_interval(x,p1,p2)&lt;br /&gt;
  if p1&amp;gt;p2 then &lt;br /&gt;
    p1,p2 = p2,p1 &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if x&amp;gt;p1 and x&amp;lt;p2 then &lt;br /&gt;
    return true&lt;br /&gt;
  else &lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sub(v1,v2)&lt;br /&gt;
  local newvec = vector()&lt;br /&gt;
  newvec.x = v1.x-v2.x&lt;br /&gt;
  newvec.y = v1.y-v2.y&lt;br /&gt;
  newvec.z = v1.z-v2.z&lt;br /&gt;
  return newvec&lt;br /&gt;
end&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
--инвентарное название объекта&lt;br /&gt;
function get_inv_name(section)&lt;br /&gt;
  return system_ini():r_string(section,&amp;quot;inv_name&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Внимание! Строки в структуре не должны содержать символов с кодами 0-31.&lt;br /&gt;
function pack_array_to_string(array)&lt;br /&gt;
  return string.char(1)..pack_new(array)&lt;br /&gt;
  -- local str=&amp;quot;&amp;quot;&lt;br /&gt;
  -- local key&lt;br /&gt;
  -- for key0,value in pairs(array) do&lt;br /&gt;
    -- if type(key0)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      -- key='&amp;quot;'..key0..'&amp;quot;'&lt;br /&gt;
    -- else&lt;br /&gt;
      -- key=key0&lt;br /&gt;
    -- end&lt;br /&gt;
    -- if type(value)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      -- local substr=pack_array_to_string(value)&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;{&amp;quot;..substr..&amp;quot;}|&amp;quot;&lt;br /&gt;
    -- elseif type(value)==&amp;quot;customdata&amp;quot; or type(value)==&amp;quot;function&amp;quot; then&lt;br /&gt;
      -- mylog(&amp;quot;Custom data and function isn't supported&amp;quot;)&lt;br /&gt;
    -- elseif type(value)==&amp;quot;boolean&amp;quot; or type(value)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;&amp;quot;..tostring(value)..&amp;quot;|&amp;quot;&lt;br /&gt;
    -- else&lt;br /&gt;
      -- str=str..key..'=&amp;gt;&amp;quot;'..value..'&amp;quot;|'&lt;br /&gt;
    -- end&lt;br /&gt;
  -- end&lt;br /&gt;
  -- return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function unpack_array_from_string(str)&lt;br /&gt;
  if str==nil or str==&amp;quot;&amp;quot; then return {} end&lt;br /&gt;
  if string.sub(str,1,1)~=string.char(1) then&lt;br /&gt;
    -- Старый формат упаковки&lt;br /&gt;
    return _parse(str)&lt;br /&gt;
  else&lt;br /&gt;
    -- новый формат упаковки тэгирован символом c кодом 1.&lt;br /&gt;
    return parse_new(string.sub(str,2,-1))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _assign(tbl,key,val)&lt;br /&gt;
  local key0=string.match(key,'&amp;quot;(.*)&amp;quot;')&lt;br /&gt;
  if key0 then&lt;br /&gt;
    tbl[key0]=val&lt;br /&gt;
  else&lt;br /&gt;
    tbl[key+0]=val&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pack_type_num=1&lt;br /&gt;
local pack_type_string=2&lt;br /&gt;
local pack_type_bool=3&lt;br /&gt;
local pack_type_table=4&lt;br /&gt;
local pack_val_endtable=5&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
 Новый формат упаковки: &lt;br /&gt;
 table ::= subtable&lt;br /&gt;
 subtable ::= keytype key valuetype ( value | subtable 0x5 )&lt;br /&gt;
 keytype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
 valuetype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
]]&lt;br /&gt;
function pack_new(tbl)&lt;br /&gt;
  local ret=&amp;quot;&amp;quot;&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(k)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..k&lt;br /&gt;
    elseif type(k)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..k&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..type(k))&lt;br /&gt;
    end&lt;br /&gt;
    if type(v)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_bool)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_table)..pack_new(v)..string.char(pack_val_endtable)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_new(str,idx)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  idx=idx or 1&lt;br /&gt;
  while true do&lt;br /&gt;
    local key,value&lt;br /&gt;
    if idx&amp;gt;string.len(str) then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      key,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      key,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_val_endtable then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      value,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      value,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_bool then&lt;br /&gt;
      value,idx=get_bool(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_table then&lt;br /&gt;
      value,idx=parse_new(str,idx)&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    ret[key]=value&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_byte(str,idx)&lt;br /&gt;
  return string.byte(string.sub(str,idx,idx)),idx+1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_string(str,idx)&lt;br /&gt;
  local idx1=string.len(str)+1&lt;br /&gt;
  for i=idx,string.len(str),1 do&lt;br /&gt;
    if string.byte(string.sub(str,i,i))&amp;lt;32 then&lt;br /&gt;
      idx1=i&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return string.sub(str,idx,idx1-1),idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_num(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st+0,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_bool(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st==&amp;quot;1&amp;quot;,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function _parse(str)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  while str and str~=&amp;quot;&amp;quot; do&lt;br /&gt;
    local i1,i2,key=string.find(str,'(.-)=&amp;gt;')&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
    i1,i2,val=string.find(str,'&amp;quot;(.-)&amp;quot;|')&lt;br /&gt;
    if val and i1==1 then&lt;br /&gt;
      -- строка&lt;br /&gt;
      _assign(ret,key,val)&lt;br /&gt;
    else&lt;br /&gt;
      i1,i2,val=string.find(str,'(%b{})|')&lt;br /&gt;
      if val and i1==1 then&lt;br /&gt;
        -- таблица&lt;br /&gt;
        _assign(ret,key,_parse(string.sub(val,2,-2)))&lt;br /&gt;
      else&lt;br /&gt;
        i1,i2,val=string.find(str,'(.-)|')&lt;br /&gt;
        -- число или булево значение&lt;br /&gt;
        if val==&amp;quot;true&amp;quot; then&lt;br /&gt;
          _assign(ret,key,true)&lt;br /&gt;
        elseif val==&amp;quot;false&amp;quot; then&lt;br /&gt;
          _assign(ret,key,false)&lt;br /&gt;
        else&lt;br /&gt;
          _assign(ret,key,val+0)&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
--callback section&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на получение инфопоршена&lt;br /&gt;
function on_info(npc, info_id)&lt;br /&gt;
	if (news_main and news_main.on_info) then&lt;br /&gt;
		news_main.on_info(info_id)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ&lt;br /&gt;
function on_item_take(obj)&lt;br /&gt;
	escape_dialog.have_a_art()&lt;br /&gt;
	flamethrower.have_a_fire_kolobok()&lt;br /&gt;
	flamethrower.have_a_trubki()&lt;br /&gt;
	flamethrower.have_a_manometr()&lt;br /&gt;
	flamethrower.have_a_vodko()&lt;br /&gt;
	flamethrower.have_a_gorelka()&lt;br /&gt;
	&lt;br /&gt;
	remove_spot_from_map(obj:id(),&amp;quot;red_location&amp;quot;)&lt;br /&gt;
	mod_call(&amp;quot;check_usable_item&amp;quot;,obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ из ящика&lt;br /&gt;
function on_item_take_from_box(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на потерю предмета из инвентаря ГГ&lt;br /&gt;
function on_item_drop(obj)&lt;br /&gt;
  mod_call(&amp;quot;check_for_af_drop&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_sleep_item&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_beacon_drop&amp;quot;,obj)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
  amk_alcohol.drink_vodka(obj)&lt;br /&gt;
  --&lt;br /&gt;
flamethrower.have_a_fire_kolobok()&lt;br /&gt;
flamethrower.have_a_trubki()&lt;br /&gt;
flamethrower.have_a_manometr()&lt;br /&gt;
flamethrower.have_a_vodko()&lt;br /&gt;
flamethrower.have_a_gorelka()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local prev_health=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--колбэк на апдейт ГГ (удобно для проверки условий, так как вызывается постоянно, нельзя перегружать, а то будут лаги)&lt;br /&gt;
function on_actor_upade(delta)&lt;br /&gt;
	oau_watchdog=100&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade begin&amp;quot;)&lt;br /&gt;
 --не удалять! библиотечная конструкция&lt;br /&gt;
  if not timer_trigger then &lt;br /&gt;
    timer_trigger=game.time() &lt;br /&gt;
  end&lt;br /&gt;
  if timer_trigger&amp;lt;=game.time() then&lt;br /&gt;
    timer_trigger=game.time()+1000&lt;br /&gt;
    check_timers()&lt;br /&gt;
  end&lt;br /&gt;
	--user area &lt;br /&gt;
	oau_watchdog=99&lt;br /&gt;
  mod_call(&amp;quot;blowout_phantoms&amp;quot;)&lt;br /&gt;
	oau_watchdog=98&lt;br /&gt;
  mod_call(&amp;quot;check_radar_off&amp;quot;)&lt;br /&gt;
	oau_watchdog=97&lt;br /&gt;
  mod_call(&amp;quot;check_metka&amp;quot;)&lt;br /&gt;
	oau_watchdog=96&lt;br /&gt;
  mod_call(&amp;quot;check_hud&amp;quot;)&lt;br /&gt;
	oau_watchdog=95&lt;br /&gt;
  mod_call(&amp;quot;weather_manager&amp;quot;)&lt;br /&gt;
	oau_watchdog=94&lt;br /&gt;
  mod_call(&amp;quot;check_armor&amp;quot;)&lt;br /&gt;
	oau_watchdog=93&lt;br /&gt;
  mod_call(&amp;quot;firebat_ammo&amp;quot;)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
	oau_watchdog=931&lt;br /&gt;
  amk_alcohol.check_alcohol()&lt;br /&gt;
	oau_watchdog=92&lt;br /&gt;
  amk_mod.on_blowout_hit_actor()&lt;br /&gt;
	oau_watchdog=91&lt;br /&gt;
  if amk_target then amk_target.update() end&lt;br /&gt;
  --&lt;br /&gt;
  for k,v in pairs(convert_npc) do&lt;br /&gt;
    local obj=level.object_by_id(k)&lt;br /&gt;
		local sobj=alife():object(k)&lt;br /&gt;
		if sobj then&lt;br /&gt;
	    if obj==nil and v==true then&lt;br /&gt;
	      convert_npc[k]=false&lt;br /&gt;
	      switch_online(k)&lt;br /&gt;
      elseif obj and v==false then&lt;br /&gt;
        convert_npc[k]=nil&lt;br /&gt;
	    elseif v==1 and obj then -- тайник не перешёл в оффлайн попытаемся его туда запихнуть.&lt;br /&gt;
       alife():set_switch_online(k, false)&lt;br /&gt;
       alife():set_switch_offline(k, true)&lt;br /&gt;
      elseif v==1 then -- тайник в оффлайне. выталкиваем.&lt;br /&gt;
	      convert_npc[k]=nil&lt;br /&gt;
	      switch_online(k)      &lt;br /&gt;
			else&lt;br /&gt;
--				convert_npc[k]=nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			convert_npc[k]=nil&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
	oau_watchdog=90&lt;br /&gt;
&lt;br /&gt;
	if gg_kick then	&lt;br /&gt;
		if prev_health&amp;gt;db.actor.health+0.05 then&lt;br /&gt;
			level.add_pp_effector(&amp;quot;amk_shoot.ppe&amp;quot;, 2011, false)&lt;br /&gt;
			level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)  &lt;br /&gt;
			&lt;br /&gt;
			if prev_health&amp;gt;db.actor.health+0.30 then&lt;br /&gt;
				level.add_cam_effector(&amp;quot;camera_effects\\fusker.anm&amp;quot;, 999, false, &amp;quot;&amp;quot;)	&lt;br /&gt;
				local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])&lt;br /&gt;
				snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)&lt;br /&gt;
				if math.random()&amp;lt;0.20 then&lt;br /&gt;
					local active_item = db.actor:active_item()&lt;br /&gt;
					if active_item and active_item:section()~= &amp;quot;bolt&amp;quot; and active_item:section()~= &amp;quot;wpn_knife&amp;quot; then&lt;br /&gt;
						db.actor:drop_item(active_item)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		prev_health = db.actor.health&lt;br /&gt;
	end&lt;br /&gt;
	oau_watchdog=89&lt;br /&gt;
	&lt;br /&gt;
	if (amk_offline_alife) then&lt;br /&gt;
      amk_offline_alife.update()&lt;br /&gt;
    end&lt;br /&gt;
	oau_watchdog=88&lt;br /&gt;
	if (amk_corpses) then&lt;br /&gt;
		for a=1, 3 do&lt;br /&gt;
			amk_corpses.update()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	amk_anoms.update()&lt;br /&gt;
	oau_watchdog=0&lt;br /&gt;
	oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--хех, определяем тип патронов в стволе...	&lt;br /&gt;
	--[[&lt;br /&gt;
	local weapon = db.actor:item_in_slot(2)&lt;br /&gt;
	&lt;br /&gt;
	if db.actor:active_slot()==2 and weapon then&lt;br /&gt;
		local t = get_weapon_data(alife():object(weapon:id()))&lt;br /&gt;
		mylog(t.ammo_type)&lt;br /&gt;
	end&lt;br /&gt;
	]]&lt;br /&gt;
-----------&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на создание непися (точнее на его переход в онлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_spawn(npc)&lt;br /&gt;
  if npc == nil then return end&lt;br /&gt;
	if (news_main and news_main.on_spawn) then&lt;br /&gt;
		news_main.on_spawn(npc)&lt;br /&gt;
	end&lt;br /&gt;
  for k,v in pairs(npc_spawner) do&lt;br /&gt;
    if k==npc:id() then &lt;br /&gt;
      __npc_spawn_case(npc,v)&lt;br /&gt;
      npc_spawner[k]=nil&lt;br /&gt;
    save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
      return&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __npc_spawn_case(npc,select_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
-----------&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
function on_net_spawn(obj)&lt;br /&gt;
	amk_mod.build_btrs_table(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на удаление непися (точнее на его переход в оффлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_go_offline(npc)&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
	if amk_offline_alife then&lt;br /&gt;
		if check_game()==true then&lt;br /&gt;
		local sobj = alife():object(npc:id())&lt;br /&gt;
		if sobj then&lt;br /&gt;
			amk_offline_alife.process_trade(sobj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_go_offline(npc)&lt;br /&gt;
--	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на юзание объекта&lt;br /&gt;
function on_use(victim, who)&lt;br /&gt;
  if db.actor and who and who:id()==db.actor:id() then&lt;br /&gt;
    mod_call(&amp;quot;check_usable_item&amp;quot;,victim)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на смерть непися&lt;br /&gt;
function on_death(victim, who)&lt;br /&gt;
if (news_main and news_main.on_death) then&lt;br /&gt;
	news_main.on_death(victim, who)&lt;br /&gt;
end&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(victim)&lt;br /&gt;
  mod_call(&amp;quot;generate_recipe&amp;quot;,victim,who)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, victim, 1, nil, who, 14)&lt;br /&gt;
	mod_call(&amp;quot;zomby_blow&amp;quot;,victim)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_npc_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_ph_obj_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- проверка на видимость производится раз в секунду&lt;br /&gt;
function enemy_see_actor(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function actor_see_enemy(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- непись стрелял в гг&lt;br /&gt;
function npc_shot_actor(obj) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем все переменные, которые нужно, вызывается загрузке игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_load()&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load begin&amp;quot;)&lt;br /&gt;
	amk.mylog(&amp;quot;object 2972 is &amp;quot;..((alife():object(2972) and alife():object(2972):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
	amk.mylog(&amp;quot;object 2975 is &amp;quot;..((alife():object(2975) and alife():object(2975):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  if db.storage[db.actor:id()].pstor == nil then&lt;br /&gt;
    db.storage[db.actor:id()].pstor = {}&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  npc_spawner=unpack_array_from_string(load_variable(&amp;quot;x_npc_spawner&amp;quot;,&amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  mod_call(&amp;quot;first_run&amp;quot;)&lt;br /&gt;
  convert_timers() -- исправим старые названия таймеров&lt;br /&gt;
-- Метки теперь ставятся на серверные объекты. Обновлять их не нужно&lt;br /&gt;
--[[&lt;br /&gt;
  local tmp,tmp1&lt;br /&gt;
  for a=1,65534,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;x_marker_type_&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      tmp1=load_variable(&amp;quot;x_marker_text_&amp;quot;..a,nil)&lt;br /&gt;
      level.map_add_object_spot(a, tmp, tmp1)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
]]&lt;br /&gt;
  &lt;br /&gt;
--user area &lt;br /&gt;
	if system_ini():r_float(&amp;quot;gg_kick&amp;quot;,&amp;quot;enabled&amp;quot;)&amp;gt;0.0 then gg_kick=true else gg_kick=false end&lt;br /&gt;
  mod_call(&amp;quot;test_sleep_pp&amp;quot;)&lt;br /&gt;
  mod_call(&amp;quot;check_spawn&amp;quot;)&lt;br /&gt;
--  local str=string&lt;br /&gt;
  if has_alife_info(&amp;quot;val_actor_has_borov_key&amp;quot;) and not has_alife_info(&amp;quot;val_borov_dead&amp;quot;) then&lt;br /&gt;
    db.actor:give_info_portion(&amp;quot;val_borov_dead&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
-----------&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем все переменные, которые нужно, вызывается присохранении игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_save() &lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Эта функция вызывается самой первой. Онлайновые объекты недоступны! db.actor недоступен!&lt;br /&gt;
function on_game_start()&lt;br /&gt;
  mod_call(&amp;quot;on_game_start&amp;quot;)&lt;br /&gt;
	ver = get_ver()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------- user function section---------------&lt;br /&gt;
function mod_call(i,...)&lt;br /&gt;
  if not amk_mod[i] then&lt;br /&gt;
    amk_mod.f=function () loadstring(amk.decode(c))() end&lt;br /&gt;
    setfenv(amk_mod.f,amk_mod)&lt;br /&gt;
    amk_mod.f()&lt;br /&gt;
  end&lt;br /&gt;
  amk_mod[i](...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function load_table(name)&lt;br /&gt;
  local var=load_variable(name)&lt;br /&gt;
  return (var==nil and {}) or unpack_array_from_string(var)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function save_table(name,tbl)&lt;br /&gt;
  save_variable(name,pack_array_to_string(tbl))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function update_table(name,id,val)&lt;br /&gt;
  local tbl=load_table(name)&lt;br /&gt;
  tbl[id]=val&lt;br /&gt;
  save_table(name,tbl)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sixbit(char) local byte = string.byte(char) local result = nil if (byte == 61) then result = 0 elseif (byte == 45 or byte == 43) then result = 62 elseif (byte == 95 or byte == 47) then result = 63 elseif (byte &amp;lt;= 57) then result = byte + 4 elseif (byte &amp;lt;= 90) then result = byte - 65 elseif (byte &amp;lt;= 122) then result = byte - 71 end return result end function decodeblock(block) local sixbits = {} local result = &amp;quot;&amp;quot; for counter=1,4 do sixbits[counter] = sixbit(string.sub(block,counter,counter)) end result = string.char(sixbits[1]*4 + math.floor(sixbits[2] / 16)) if (string.sub(block,3,3) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[2] % 16)*16 + math.floor(sixbits[3] / 4)) end if (string.sub(block,4,4) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[3] % 4) * 64 + sixbits[4]) end return result end function decode(data) local result = &amp;quot;&amp;quot; local str={string.byte(&amp;quot;CheckForCheat&amp;quot;,1,1000)} local strl=table.getn(str) for c=1,string.len(data),4 do result=result..decodeblock(string.sub(data,c,c+3)) end local result1=&amp;quot;&amp;quot; for c=1,string.len(result),1 do local sl=string.byte(string.sub(result,c)) sl=bit_xor(sl,str[1+(c-1)%strl]) result1 = result1 .. string.char(sl) end return result1 end&lt;br /&gt;
&lt;br /&gt;
function bind_lc(obj)&lt;br /&gt;
  if obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; and level.name()==&amp;quot;l12_stancia&amp;quot; and amk.load_variable(&amp;quot;freeplay&amp;quot;,0)&amp;gt;0 then&lt;br /&gt;
    local sobj=alife():object(obj:id())&lt;br /&gt;
    if sobj then&lt;br /&gt;
      alife():release(sobj,true)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=8&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u16(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u16())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u8(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8u8(pk,v)&lt;br /&gt;
  local len=8 --table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u16(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u16(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.gvid=stpk:r_u16()&lt;br /&gt;
  ret.obf32u1=stpk:r_float()&lt;br /&gt;
  ret.obs32u2=stpk:r_s32()&lt;br /&gt;
  ret.lvid=stpk:r_s32()&lt;br /&gt;
  ret.oflags=stpk:r_s32()&lt;br /&gt;
  ret.custom=stpk:r_stringZ()&lt;br /&gt;
  ret.sid=stpk:r_s32()&lt;br /&gt;
  ret.obs32u3=stpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.gvid)&lt;br /&gt;
  stpk:w_float(ret.obf32u1)&lt;br /&gt;
  stpk:w_s32(ret.obs32u2)&lt;br /&gt;
  stpk:w_s32(ret.lvid)&lt;br /&gt;
  stpk:w_s32(ret.oflags)&lt;br /&gt;
  stpk:w_stringZ(ret.custom)&lt;br /&gt;
  stpk:w_s32(ret.sid)&lt;br /&gt;
  stpk:w_s32(ret.obs32u3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.visual=stpk:r_stringZ()&lt;br /&gt;
  ret.vsu8u1=stpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.visual)&lt;br /&gt;
  stpk:w_u8(ret.vsu8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  ret.team=stpk:r_u8()&lt;br /&gt;
  ret.squad=stpk:r_u8()&lt;br /&gt;
  ret.group=stpk:r_u8()&lt;br /&gt;
  ret.health=stpk:r_float()&lt;br /&gt;
  ret.crvu32u16u1=readvu32u16(stpk)&lt;br /&gt;
  ret.crvu32u16u2=readvu32u16(stpk)  &lt;br /&gt;
  ret.killerid=stpk:r_u16()&lt;br /&gt;
  ret.game_death_time=readvu8u8(stpk)&lt;br /&gt;
&lt;br /&gt;
  ret.updhealth=updpk:r_float()&lt;br /&gt;
  ret.upds32u1=updpk:r_s32()&lt;br /&gt;
  ret.updu8u2=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
  ret.updmodel=updpk:r_float()&lt;br /&gt;
  ret.upddir={}&lt;br /&gt;
  ret.upddir.x=updpk:r_float()&lt;br /&gt;
  ret.upddir.y=updpk:r_float()&lt;br /&gt;
  ret.upddir.z=updpk:r_float()&lt;br /&gt;
  ret.updteam=updpk:r_u8()&lt;br /&gt;
  ret.updsquad=updpk:r_u8()&lt;br /&gt;
  ret.updgroup=updpk:r_u8()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u8(ret.team)&lt;br /&gt;
  stpk:w_u8(ret.squad)&lt;br /&gt;
  stpk:w_u8(ret.group)&lt;br /&gt;
  stpk:w_float(ret.health)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u1)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u2)  &lt;br /&gt;
  stpk:w_u16(ret.killerid)&lt;br /&gt;
  writevu8u8(stpk,ret.game_death_time)&lt;br /&gt;
&lt;br /&gt;
  updpk:w_float(ret.updhealth)&lt;br /&gt;
  updpk:w_s32(ret.upds32u1)&lt;br /&gt;
  updpk:w_u8(ret.updu8u2)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
  updpk:w_float(ret.updmodel)&lt;br /&gt;
  updpk:w_float(ret.upddir.x)&lt;br /&gt;
  updpk:w_float(ret.upddir.y)&lt;br /&gt;
  updpk:w_float(ret.upddir.z)&lt;br /&gt;
  updpk:w_u8(ret.updteam)&lt;br /&gt;
  updpk:w_u8(ret.updsquad)&lt;br /&gt;
  updpk:w_u8(ret.updgroup)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.baseoutr=stpk:r_stringZ()&lt;br /&gt;
  ret.baseinr=stpk:r_stringZ()&lt;br /&gt;
  ret.smtrid=stpk:r_u16()&lt;br /&gt;
  ret.smtrtaskactive=stpk:r_u8()&lt;br /&gt;
  &lt;br /&gt;
  ret.updu16u1=updpk:r_u16()&lt;br /&gt;
  ret.updu16u2=updpk:r_u16()&lt;br /&gt;
  ret.upds32u3=updpk:r_s32()&lt;br /&gt;
  ret.upds32u4=updpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.baseoutr)&lt;br /&gt;
  stpk:w_stringZ(ret.baseinr)&lt;br /&gt;
  stpk:w_u16(ret.smtrid)&lt;br /&gt;
  stpk:w_u8(ret.smtrtaskactive)&lt;br /&gt;
  &lt;br /&gt;
  updpk:w_u16(ret.updu16u1)&lt;br /&gt;
  updpk:w_u16(ret.updu16u2)&lt;br /&gt;
  updpk:w_s32(ret.upds32u3)&lt;br /&gt;
  updpk:w_s32(ret.upds32u4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.money=stpk:r_s32()&lt;br /&gt;
  ret.profile=stpk:r_stringZ()&lt;br /&gt;
  ret.infammo=stpk:r_s32()&lt;br /&gt;
  ret.class=stpk:r_stringZ()&lt;br /&gt;
  ret.communityid=stpk:r_s32()&lt;br /&gt;
  ret.rank=stpk:r_s32()&lt;br /&gt;
  ret.reputation=stpk:r_s32()&lt;br /&gt;
  ret.charname=stpk:r_stringZ()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_s32(ret.money)&lt;br /&gt;
  stpk:w_stringZ(ret.profile)&lt;br /&gt;
  stpk:w_s32(ret.infammo)&lt;br /&gt;
  stpk:w_stringZ(ret.class)&lt;br /&gt;
  stpk:w_s32(ret.communityid)&lt;br /&gt;
  stpk:w_s32(ret.rank)&lt;br /&gt;
  stpk:w_s32(ret.reputation)&lt;br /&gt;
  stpk:w_stringZ(ret.charname)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.huvu32u8u1=readvu32u8(stpk)&lt;br /&gt;
  ret.huvu32u8u2=readvu32u8(stpk)  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u1)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.skeleton=stpk:r_stringZ()&lt;br /&gt;
  ret.skeleton_flags=stpk:r_u8()&lt;br /&gt;
  ret.source_id=stpk:r_u16()&lt;br /&gt;
  &lt;br /&gt;
--  ret.updsku8u1=updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.skeleton)&lt;br /&gt;
  stpk:w_u8(ret.skeleton_flags)&lt;br /&gt;
  stpk:w_u16(ret.source_id)&lt;br /&gt;
  &lt;br /&gt;
--  updpk:w_u8(ret.updsku8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_stalker_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.hellodlg=updpk:r_stringZ()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_stalker_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  updpk:w_stringZ(ret.hellodlg)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_se_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk,size)&lt;br /&gt;
  ret.spec_obj_id=stpk:r_u16()&lt;br /&gt;
  ret.job_online=stpk:r_u8()&lt;br /&gt;
	if ret.job_online&amp;gt;3 then&lt;br /&gt;
		ret.state=true&lt;br /&gt;
		ret.job_online=ret.job_online-4&lt;br /&gt;
	else&lt;br /&gt;
		ret.state=false&lt;br /&gt;
	end&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    ret.job_online_condlist=stpk:r_stringZ()&lt;br /&gt;
  end&lt;br /&gt;
  ret.was_in_smtr=stpk:r_u8()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_se_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.spec_obj_id)&lt;br /&gt;
	local st=0&lt;br /&gt;
	if ret.state then&lt;br /&gt;
		st=4&lt;br /&gt;
	end&lt;br /&gt;
  stpk:w_u8(ret.job_online+st)&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    stpk:w_stringZ(ret.job_online_condlist)&lt;br /&gt;
  end&lt;br /&gt;
  stpk:w_u8(ret.was_in_smtr)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dump_table(tbl)&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;)&lt;br /&gt;
      dump_table(v)&lt;br /&gt;
    else&lt;br /&gt;
      str=&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;..tostring(v)&lt;br /&gt;
      if string.len(str)&amp;gt;200 then&lt;br /&gt;
        str=string.sub(str,1,200)&lt;br /&gt;
      end&lt;br /&gt;
      get_console():execute(str)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- серверный объект на входе&lt;br /&gt;
function read_stalker_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_stalker_packet({},stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function read_monster_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_se_monster_packet({},stpk,uppk,size)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица параметров и серверный объект на входе&lt;br /&gt;
function write_stalker_params(tbl,sobj,noconvert)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_stalker_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  if npc and (not noconvert) then&lt;br /&gt;
    amk.convert_npc[sobj.id]=true&lt;br /&gt;
		npc:stop_talk()&lt;br /&gt;
    switch_offline(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function write_monster_params(tbl,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_se_monster_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  -- local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  -- if npc then&lt;br /&gt;
    -- amk.convert_npc[sobj.id]=true&lt;br /&gt;
    -- switch_offline(npc)&lt;br /&gt;
  -- end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_anomaly_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.max_power = stpk:r_float()&lt;br /&gt;
	t.owner_id = stpk:r_s32()&lt;br /&gt;
	t.enabled_time = stpk:r_s32()&lt;br /&gt;
	t.disabled_time = stpk:r_s32()&lt;br /&gt;
	t.start_time_shift = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.offline_interactive_radius = stpk:r_float()&lt;br /&gt;
	t.artefact_spawn_count = stpk:r_u16()&lt;br /&gt;
	t.artefact_position_offset = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.last_spawn_time_present = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	if stpk:r_elapsed() ~= 0 then&lt;br /&gt;
--		abort(&amp;quot;left=%d&amp;quot;, stpk:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_anomaly_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.max_power)&lt;br /&gt;
	stpk:w_s32(t.owner_id)&lt;br /&gt;
	stpk:w_s32(t.enabled_time)&lt;br /&gt;
	stpk:w_s32(t.disabled_time)&lt;br /&gt;
	stpk:w_s32(t.start_time_shift)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.offline_interactive_radius)&lt;br /&gt;
	stpk:w_u16(t.artefact_spawn_count)&lt;br /&gt;
	stpk:w_s32(t.artefact_position_offset)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_u8(t.last_spawn_time_present)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для правильного парсинга запрещены комментарии!!!&lt;br /&gt;
function parse_custom_data(str)&lt;br /&gt;
	local t={}&lt;br /&gt;
	if str then&lt;br /&gt;
		for section, section_data in string.gfind(str,&amp;quot;%s*%[([^%]]*)%]%s*([^%[%z]*)%s*&amp;quot;) do&lt;br /&gt;
			section = trim(section)&lt;br /&gt;
			t[section]={}&lt;br /&gt;
			for line in string.gfind(trim(section_data), &amp;quot;([^\n]*)\n*&amp;quot;) do&lt;br /&gt;
				if string.find(line,&amp;quot;=&amp;quot;)~=nil then&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;([^=]-)%s*=%s*(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' and v~=nil then &lt;br /&gt;
							t[section][k]=trim(v) &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' then&lt;br /&gt;
							t[section][k]=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trim (s)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gen_custom_data(tbl)&lt;br /&gt;
	local str=''&lt;br /&gt;
	for key, value in pairs(tbl) do&lt;br /&gt;
		str = str..&amp;quot;\n[&amp;quot;..key..&amp;quot;]\n&amp;quot;&lt;br /&gt;
		for k, v in pairs(value) do&lt;br /&gt;
			if v~=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; then&lt;br /&gt;
				str=str..k..&amp;quot; = &amp;quot;..v..&amp;quot;\n&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				str=str..k..&amp;quot;\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
function get_lc_data(obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t = amk.parse_shape_packet(t,packet)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = packet:r_u8()&lt;br /&gt;
	t.dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.dest_level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.dest_position = packet:r_vec3()&lt;br /&gt;
	t.dest_direction = packet:r_vec3()&lt;br /&gt;
	t.dest_level_name = packet:r_stringZ()&lt;br /&gt;
	t.dest_graph_point = packet:r_stringZ()&lt;br /&gt;
	t.silent_mode = packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_lc_data(t,obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	&lt;br /&gt;
	amk.fill_shape_packet(t,packet)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(t.restrictor_type)&lt;br /&gt;
	packet:w_u16(t.dest_game_vertex_id)&lt;br /&gt;
	packet:w_s32(t.dest_level_vertex_id)&lt;br /&gt;
	packet:w_vec3(t.dest_position)&lt;br /&gt;
	packet:w_vec3(t.dest_direction)&lt;br /&gt;
	packet:w_stringZ(t.dest_level_name)&lt;br /&gt;
	packet:w_stringZ(t.dest_graph_point)&lt;br /&gt;
	packet:w_u8(t.silent_mode)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function point_in_poly (pts, x,y)&lt;br /&gt;
	local cnt,k,j&lt;br /&gt;
	local ret = false&lt;br /&gt;
	cnt = table.getn(pts)&lt;br /&gt;
	j = cnt&lt;br /&gt;
	for k = 1,cnt do&lt;br /&gt;
		if ((pts[k].y &amp;lt;=y) and (y &amp;lt; pts[j].y)) or ((pts[j].y &amp;lt;=y) and (y &amp;lt; pts[k].y)) then&lt;br /&gt;
			if (x &amp;lt; (pts[j].x - pts[k].x) * (y - pts[k].y) / (pts[j].y - pts[k].y) + pts[k].x) then&lt;br /&gt;
				ret = not ret&lt;br /&gt;
			end&lt;br /&gt;
			j = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.physic_type=stpk:r_s32()&lt;br /&gt;
	ret.mass=stpk:r_float()&lt;br /&gt;
	ret.fixed_bones=stpk:r_stringZ()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_s32(ret.physic_type)&lt;br /&gt;
	stpk:w_float(ret.mass)&lt;br /&gt;
	stpk:w_stringZ(ret.fixed_bones)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_breakable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.visual_name = packet:r_stringZ()&lt;br /&gt;
	t.visual_flags = packet:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.health = packet:r_float()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_breakable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	packet:w_stringZ(t.visual_name)&lt;br /&gt;
	packet:w_u8(t.visual_flags)&lt;br /&gt;
	packet:w_float(t.health)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_REspawn(obj,respawner)&lt;br /&gt;
	if obj and respawner then&lt;br /&gt;
		mod_call(&amp;quot;respawned&amp;quot;,obj,respawner)&lt;br /&gt;
		if IsMonster(obj) then&lt;br /&gt;
			if respawner.spawned_goes_online==true then mod_call(&amp;quot;switch_monster_online&amp;quot;,obj) &lt;br /&gt;
			elseif respawner.spawned_goes_online==false then mod_call(&amp;quot;switch_monster_offline&amp;quot;,obj) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (obj) then&lt;br /&gt;
		if (news_main and news_main.on_spawn) then&lt;br /&gt;
			news_main.on_spawn(obj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_spawner_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	t.spawned_obj_count = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_spawner_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	stpk:w_u8(t.spawned_obj_count)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_shape_packet(t,stpk,uppk)&lt;br /&gt;
	local shape_count = stpk:r_u8()&lt;br /&gt;
	t.shapes={}&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type = stpk:r_u8()&lt;br /&gt;
		t.shapes[i]={}&lt;br /&gt;
		t.shapes[i].shtype=shape_type&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			t.shapes[i].center = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].radius = stpk:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			t.shapes[i].v1 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v2 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v3 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].offset = stpk:r_vec3()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_shape_packet(t,stpk,updpk)&lt;br /&gt;
	stpk:w_u8(table.getn(t.shapes))&lt;br /&gt;
	for i=1,table.getn(t.shapes) do&lt;br /&gt;
		stpk:w_u8(t.shapes[i].shtype)&lt;br /&gt;
		if t.shapes[i].shtype == 0 then&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].center)&lt;br /&gt;
			stpk:w_float(t.shapes[i].radius)&lt;br /&gt;
		else&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v1)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v2)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v3)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].offset)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_ini_section_to_array(ini,section)&lt;br /&gt;
	local tmp={}&lt;br /&gt;
	if ini:section_exist(section) then&lt;br /&gt;
		local result, id, value = nil, nil, nil&lt;br /&gt;
		for a=0,ini:line_count(section)-1 do&lt;br /&gt;
			result, id, value = ini:r_line(section,a,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			if id~=nil and trim(id)~=&amp;quot;&amp;quot; and trim(id)~=nil then&lt;br /&gt;
				tmp[trim(id)]=trim(value)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tmp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function str_explode(div,str,clear)&lt;br /&gt;
	local t={}&lt;br /&gt;
	local cpt = string.find (str, div, 1, true)&lt;br /&gt;
	if cpt then&lt;br /&gt;
		repeat&lt;br /&gt;
			if clear then&lt;br /&gt;
				table.insert( t, trim(string.sub(str, 1, cpt-1)) )&lt;br /&gt;
			else&lt;br /&gt;
				table.insert( t, string.sub(str, 1, cpt-1) )&lt;br /&gt;
			end&lt;br /&gt;
			str = string.sub( str, cpt+string.len(div) )&lt;br /&gt;
			cpt = string.find (str, div, 1, true)&lt;br /&gt;
		until cpt==nil&lt;br /&gt;
	end&lt;br /&gt;
	if clear then&lt;br /&gt;
		table.insert(t, trim(str))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function quotemeta(str)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;quot;, &amp;quot;%%%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function add(v1,v2)&lt;br /&gt;
	local nv=vector()&lt;br /&gt;
	nv.x=v1.x+v2.x&lt;br /&gt;
	nv.y=v1.y+v2.y&lt;br /&gt;
	nv.z=v1.z+v2.z&lt;br /&gt;
	return nv&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_len(v,num)&lt;br /&gt;
	local cl = math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z)&lt;br /&gt;
	cl = num/cl&lt;br /&gt;
	v.x= v.x*cl&lt;br /&gt;
	v.y= v.y*cl&lt;br /&gt;
	v.z= v.z*cl&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_restrictor_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_restrictor_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_trader_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_trader_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_trader_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_trader_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_invbox_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_invbox_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8uN(packet,n)&lt;br /&gt;
  local v={}&lt;br /&gt;
  for i=1,n,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8uN(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.condition=stpk:r_float()&lt;br /&gt;
	ret.updnum_items=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
	ret.updcse_alife_item__unk1_q8v4=readvu8uN(updpk,4)&lt;br /&gt;
	ret.updcse_alife_item__unk2_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
	ret.updcse_alife_item__unk3_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_float(ret.condition)&lt;br /&gt;
	updpk:w_u8(ret.updnum_items)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk1_q8v4)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk2_q8v3)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk3_q8v3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_left=stpk:r_u16()&lt;br /&gt;
	ret.updammo_left=updpk:r_u16()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_left)&lt;br /&gt;
	updpk:w_u16(ret.updammo_left)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ammo_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_ammo_packet(t,stpk,uppk,size)&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_ammo_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_ammo_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cfg_get_string(ini,sect,name,def)&lt;br /&gt;
	if ini and ini:line_exist(sect,name) then&lt;br /&gt;
		return ini:r_string(sect,name)&lt;br /&gt;
	end&lt;br /&gt;
	return def&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_destroyable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_skeleton_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_destroyable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_skeleton_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_weapon_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
  amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_weapon_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_weapon_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_weapon_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_current = stpk:r_u16()&lt;br /&gt;
	ret.ammo_elapsed = stpk:r_u16()&lt;br /&gt;
	ret.weapon_state = stpk:r_u8()&lt;br /&gt;
	ret.addon_flags = stpk:r_u8()&lt;br /&gt;
	ret.ammo_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	ret.updcondition = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_elapsed = updpk:r_u16()&lt;br /&gt;
	ret.updaddon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_type = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_state = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_zoom = updpk:r_u8()&lt;br /&gt;
	ret.updcurrent_fire_mode = updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_current)&lt;br /&gt;
	stpk:w_u16(ret.ammo_elapsed)&lt;br /&gt;
	stpk:w_u8(ret.weapon_state)&lt;br /&gt;
	stpk:w_u8(ret.addon_flags)&lt;br /&gt;
	stpk:w_u8(ret.ammo_type)&lt;br /&gt;
	&lt;br /&gt;
	updpk:w_u8(ret.updcondition)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_flags)&lt;br /&gt;
	updpk:w_u16(ret.updammo_elapsed)&lt;br /&gt;
	updpk:w_u8(ret.updaddon_flags)&lt;br /&gt;
	updpk:w_u8(ret.updammo_type)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_state)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_zoom)&lt;br /&gt;
	updpk:w_u8(ret.updcurrent_fire_mode)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ver()&lt;br /&gt;
	local ver = &amp;quot;0&amp;quot;&lt;br /&gt;
	local mm = _G.main_menu.get_main_menu()&lt;br /&gt;
	if mm then ver = mm:GetGSVer() end&lt;br /&gt;
	return ver&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
всё заходим в игру и пробуем :-)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BE%D0%BF%D1%86%D0%B8%D0%B9</id>
		<title>Добавление новых графических опций</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BE%D0%BF%D1%86%D0%B8%D0%B9"/>
				<updated>2010-07-03T10:16:54Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &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;'''user.ltx'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt_video.script'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt_video_adv.script'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt.xml'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_st_mm.xml'''&lt;br /&gt;
&lt;br /&gt;
Для начала, идём в '''user.ltx''' и ищем там графические параметры. &lt;br /&gt;
&amp;lt;pre&amp;gt;_preset Extreme&lt;br /&gt;
ai_use_torch_dynamic_lights on&lt;br /&gt;
unbindall&lt;br /&gt;
bind left kLEFT&lt;br /&gt;
bind right kRIGHT&lt;br /&gt;
bind up kUP&lt;br /&gt;
bind down kDOWN&lt;br /&gt;
bind jump kSPACE&lt;br /&gt;
bind crouch kLCONTROL&lt;br /&gt;
bind accel kLSHIFT&lt;br /&gt;
bind sprint_toggle kX&lt;br /&gt;
bind forward kW&lt;br /&gt;
bind back kS&lt;br /&gt;
bind lstrafe kA&lt;br /&gt;
bind rstrafe kD&lt;br /&gt;
bind llookout kQ&lt;br /&gt;
bind rlookout kE&lt;br /&gt;
bind cam_zoom_in kADD&lt;br /&gt;
bind cam_zoom_out kSUBTRACT&lt;br /&gt;
bind torch kL&lt;br /&gt;
bind night_vision kN&lt;br /&gt;
bind wpn_1 k1&lt;br /&gt;
bind wpn_2 k2&lt;br /&gt;
bind wpn_3 k3&lt;br /&gt;
bind wpn_4 k4&lt;br /&gt;
bind wpn_5 k5&lt;br /&gt;
bind wpn_6 k6&lt;br /&gt;
bind artefact k7&lt;br /&gt;
bind wpn_next kY&lt;br /&gt;
bind wpn_fire mouse1&lt;br /&gt;
bind wpn_zoom mouse2&lt;br /&gt;
bind wpn_reload kR&lt;br /&gt;
bind wpn_func kV&lt;br /&gt;
bind wpn_firemode_prev k9&lt;br /&gt;
bind wpn_firemode_next k0&lt;br /&gt;
bind pause kPAUSE&lt;br /&gt;
bind drop kG&lt;br /&gt;
bind use kF&lt;br /&gt;
bind scores kTAB&lt;br /&gt;
bind chat kCOMMA&lt;br /&gt;
bind chat_team kPERIOD&lt;br /&gt;
bind screenshot kF12&lt;br /&gt;
bind quit kESCAPE&lt;br /&gt;
bind console kGRAVE&lt;br /&gt;
bind inventory kI&lt;br /&gt;
bind buy_menu kB&lt;br /&gt;
bind skin_menu kO&lt;br /&gt;
bind team_menu kU&lt;br /&gt;
bind active_jobs kP&lt;br /&gt;
bind map kM&lt;br /&gt;
bind contacts kH&lt;br /&gt;
bind vote_begin kF5&lt;br /&gt;
bind vote kF6&lt;br /&gt;
bind vote_yes kF7&lt;br /&gt;
bind vote_no kF8&lt;br /&gt;
bind speech_menu_0 kC&lt;br /&gt;
bind speech_menu_1 kZ&lt;br /&gt;
bind use_bandage kRBRACKET&lt;br /&gt;
bind use_medkit kLBRACKET&lt;br /&gt;
bind quick_save kF6&lt;br /&gt;
bind quick_load kF7&lt;br /&gt;
cam_inert 0.&lt;br /&gt;
cam_slide_inert 0.25&lt;br /&gt;
cl_cod_pickup_mode 1&lt;br /&gt;
cl_dynamiccrosshair on&lt;br /&gt;
g_always_run on&lt;br /&gt;
g_autopickup on&lt;br /&gt;
g_backrun on&lt;br /&gt;
g_corpsenum 10&lt;br /&gt;
g_eventdelay 0&lt;br /&gt;
g_game_difficulty gd_novice&lt;br /&gt;
hud_crosshair on&lt;br /&gt;
hud_crosshair_dist off&lt;br /&gt;
hud_info on&lt;br /&gt;
hud_weapon on&lt;br /&gt;
load_last_save all&lt;br /&gt;
mm_mm_net_srv_dedicated off&lt;br /&gt;
mm_net_con_publicserver off&lt;br /&gt;
mm_net_con_spectator 20&lt;br /&gt;
mm_net_con_spectator_on off&lt;br /&gt;
mm_net_filter_empty on&lt;br /&gt;
mm_net_filter_full on&lt;br /&gt;
mm_net_filter_listen on&lt;br /&gt;
mm_net_filter_pass on&lt;br /&gt;
mm_net_filter_wo_ff on&lt;br /&gt;
mm_net_filter_wo_pass on&lt;br /&gt;
mm_net_srv_gamemode st_deathmatch&lt;br /&gt;
mm_net_srv_maxplayers 32&lt;br /&gt;
mm_net_srv_name MICROSOF-80B663&lt;br /&gt;
mm_net_srv_reinforcement_type 1&lt;br /&gt;
mm_net_weather_rateofchange 1.&lt;br /&gt;
mouse_invert off&lt;br /&gt;
mouse_sens 0.12&lt;br /&gt;
net_cl_icurvesize 0&lt;br /&gt;
net_cl_icurvetype 0&lt;br /&gt;
net_cl_interpolation 0.&lt;br /&gt;
net_cl_log_data off&lt;br /&gt;
net_dbg_dump_export_obj 0&lt;br /&gt;
net_dbg_dump_import_obj 0&lt;br /&gt;
net_dbg_dump_update_read 0&lt;br /&gt;
net_dbg_dump_update_write 0&lt;br /&gt;
net_dedicated_sleep 5&lt;br /&gt;
net_sv_gpmode 0&lt;br /&gt;
net_sv_log_data off&lt;br /&gt;
net_sv_pending_lim 3&lt;br /&gt;
net_sv_update_rate 30&lt;br /&gt;
ph_frequency 100.00000&lt;br /&gt;
ph_iterations 38&lt;br /&gt;
r1_dlights on&lt;br /&gt;
r1_dlights_clip 75.&lt;br /&gt;
r1_glows_per_frame 16&lt;br /&gt;
r1_lmodel_lerp 0.1&lt;br /&gt;
r1_pps_u 0.&lt;br /&gt;
r1_pps_v 0.&lt;br /&gt;
r1_ssa_lod_a 64.&lt;br /&gt;
r1_ssa_lod_b 48.&lt;br /&gt;
r1_tf_mipbias 0.&lt;br /&gt;
r2_aa off&lt;br /&gt;
r2_aa_break 0.800000,0.500000,0.000000&lt;br /&gt;
r2_aa_kernel 0.5&lt;br /&gt;
r2_aa_weight 0.250000,0.250000,0.000000&lt;br /&gt;
r2_allow_r1_lights off&lt;br /&gt;
r2_gi off&lt;br /&gt;
r2_gi_clip 0.001&lt;br /&gt;
r2_gi_depth 1&lt;br /&gt;
r2_gi_photons 16&lt;br /&gt;
r2_gi_refl 0.9&lt;br /&gt;
r2_gloss_factor 1.5&lt;br /&gt;
r2_ls_bloom_fast off&lt;br /&gt;
r2_ls_bloom_kernel_b 0.7&lt;br /&gt;
r2_ls_bloom_kernel_g 3.&lt;br /&gt;
r2_ls_bloom_kernel_scale 0.7&lt;br /&gt;
r2_ls_bloom_speed 100.&lt;br /&gt;
r2_ls_bloom_threshold 0.001&lt;br /&gt;
r2_ls_depth_bias -0.0003&lt;br /&gt;
r2_ls_depth_scale 1.00001&lt;br /&gt;
r2_ls_dsm_kernel 0.7&lt;br /&gt;
r2_ls_psm_kernel 0.7&lt;br /&gt;
r2_ls_squality 1.&lt;br /&gt;
r2_ls_ssm_kernel 0.7&lt;br /&gt;
r2_mblur 0.&lt;br /&gt;
r2_parallax_h 0.02&lt;br /&gt;
r2_slight_fade 0.3333&lt;br /&gt;
r2_ssa_lod_a 64.&lt;br /&gt;
r2_ssa_lod_b 48.&lt;br /&gt;
r2_sun on&lt;br /&gt;
r2_sun_depth_far_bias -0.00001&lt;br /&gt;
r2_sun_depth_far_scale 1.&lt;br /&gt;
r2_sun_depth_near_bias 0.00001&lt;br /&gt;
r2_sun_depth_near_scale 1.&lt;br /&gt;
r2_sun_details off&lt;br /&gt;
r2_sun_focus on&lt;br /&gt;
r2_sun_lumscale 1.&lt;br /&gt;
r2_sun_lumscale_amb 0.5&lt;br /&gt;
r2_sun_lumscale_hemi 1.&lt;br /&gt;
r2_sun_near 12.&lt;br /&gt;
r2_sun_near_border 0.75&lt;br /&gt;
r2_sun_tsm on&lt;br /&gt;
r2_sun_tsm_bias -0.01&lt;br /&gt;
r2_sun_tsm_proj 0.3&lt;br /&gt;
r2_tf_mipbias 0.&lt;br /&gt;
r2_tonemap on&lt;br /&gt;
r2_tonemap_adaptation 1.&lt;br /&gt;
r2_tonemap_amount 0.7&lt;br /&gt;
r2_tonemap_lowlum 0.0001&lt;br /&gt;
r2_tonemap_middlegray 0.6&lt;br /&gt;
r2_wait_sleep 0&lt;br /&gt;
r2_zfill off&lt;br /&gt;
r2_zfill_depth 0.5&lt;br /&gt;
r2em 2.2&lt;br /&gt;
r__detail_density 0.2&lt;br /&gt;
r__geometry_lod 1.&lt;br /&gt;
r__supersample 2&lt;br /&gt;
r__tf_aniso 16&lt;br /&gt;
renderer renderer_r2&lt;br /&gt;
rs_c_brightness 1.&lt;br /&gt;
rs_c_contrast 1.&lt;br /&gt;
rs_c_gamma 1.&lt;br /&gt;
rs_fullscreen on&lt;br /&gt;
rs_refresh_60hz on&lt;br /&gt;
rs_stats off&lt;br /&gt;
rs_v_sync off&lt;br /&gt;
rs_vis_distance 1.&lt;br /&gt;
snd_acceleration on&lt;br /&gt;
snd_cache_size 16&lt;br /&gt;
snd_efx on&lt;br /&gt;
snd_targets 24&lt;br /&gt;
snd_volume_eff 1.&lt;br /&gt;
snd_volume_music 1.&lt;br /&gt;
sv_anomalies_enabled 1&lt;br /&gt;
sv_anomalies_length 3&lt;br /&gt;
sv_artefact_respawn_delta 30&lt;br /&gt;
sv_artefact_spawn_force 0&lt;br /&gt;
sv_artefact_stay_time 3&lt;br /&gt;
sv_artefacts_count 10&lt;br /&gt;
sv_auto_team_balance 0&lt;br /&gt;
sv_auto_team_swap 1&lt;br /&gt;
sv_bearercantsprint 1&lt;br /&gt;
sv_client_reconnect_time 60&lt;br /&gt;
sv_console_update_rate 1&lt;br /&gt;
sv_dedicated_server_update_rate 100&lt;br /&gt;
sv_dmgblockindicator 1&lt;br /&gt;
sv_dmgblocktime 0&lt;br /&gt;
sv_forcerespawn 0&lt;br /&gt;
sv_fraglimit 10&lt;br /&gt;
sv_friendly_indicators 0&lt;br /&gt;
sv_friendly_names 0&lt;br /&gt;
sv_friendlyfire 1.&lt;br /&gt;
sv_hail_to_winner_time 7&lt;br /&gt;
sv_max_ping_limit 2000&lt;br /&gt;
sv_pda_hunt 1&lt;br /&gt;
sv_reinforcement_time 0&lt;br /&gt;
sv_remove_corpse 1&lt;br /&gt;
sv_remove_weapon 1&lt;br /&gt;
sv_returnplayers 1&lt;br /&gt;
sv_rpoint_freeze_time 0&lt;br /&gt;
sv_shieldedbases 1&lt;br /&gt;
sv_spectr_firsteye 1&lt;br /&gt;
sv_spectr_freefly 0&lt;br /&gt;
sv_spectr_freelook 1&lt;br /&gt;
sv_spectr_lookat 1&lt;br /&gt;
sv_spectr_teamcamera 1&lt;br /&gt;
sv_statistic_collect 1&lt;br /&gt;
sv_statistic_save_auto 0&lt;br /&gt;
sv_teamkill_limit 3&lt;br /&gt;
sv_teamkill_punish 1&lt;br /&gt;
sv_timelimit 0&lt;br /&gt;
sv_vote_enabled 255&lt;br /&gt;
sv_vote_participants 0&lt;br /&gt;
sv_vote_quota 0.51&lt;br /&gt;
sv_vote_time 1.&lt;br /&gt;
sv_warm_up 0&lt;br /&gt;
texture_lod 0&lt;br /&gt;
vid_mode 1280x1024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;Это мой полный. &lt;br /&gt;
&amp;lt;br /&amp;gt;Возмём к примеру графический параметр '''r2_gi'''&lt;br /&gt;
&amp;lt;br /&amp;gt;Префикс r2 означает что он будет работать только на полном динамическом освещении.&lt;br /&gt;
&amp;lt;br /&amp;gt;Далее идём в файл '''ui_mm_opt_video_adv.script &lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;pre&amp;gt;class &amp;quot;opt_video_adv&amp;quot; (CUIWindow)&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:__init() super()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function only_2_mode(ctrl, _id)&lt;br /&gt;
	local bEnabled	= _id==2&lt;br /&gt;
	ctrl:Enable		(bEnabled)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function only_12_mode(ctrl, _id)&lt;br /&gt;
	local bEnabled	= _id==1 or _id==2&lt;br /&gt;
	ctrl:Enable		(bEnabled)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:InitControls(x, y, xml, handler)&lt;br /&gt;
	local ctl&lt;br /&gt;
	self:Init									(x,y, 738, 416)&lt;br /&gt;
	self:SetAutoDelete							(true)&lt;br /&gt;
	&lt;br /&gt;
	self.bk			= xml:InitFrame				(&amp;quot;frame_videoadv&amp;quot;, self)&lt;br /&gt;
	self.scroll_v	= xml:InitScrollView		(&amp;quot;video_adv:scroll_v&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	local _st		= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_vis_dist&amp;quot;,				_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_vis_dist&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_geometry_lod&amp;quot;,			_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_geometry_lod&amp;quot;,		_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_detail_density&amp;quot;,		_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_detail_density&amp;quot;,		_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_texture_lod&amp;quot;,			_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_texture_lod&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_aniso&amp;quot;,					_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_aniso&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_ssample&amp;quot;,				_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_ssample&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_r2_sun&amp;quot;,				_st)&lt;br /&gt;
	ctl			= xml:InitCheck					(&amp;quot;video_adv:check_r2_sun&amp;quot;,				_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_2_mode&lt;br /&gt;
	&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_r2_sun_details&amp;quot;,		_st)&lt;br /&gt;
	ctl			= xml:InitCheck		(&amp;quot;video_adv:check_r2_sun_details&amp;quot;,		_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_2_mode&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_light_distance&amp;quot;,		_st)&lt;br /&gt;
	ctl				= xml:InitTrackBar			(&amp;quot;video_adv:track_light_distance&amp;quot;,		_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_12_mode&lt;br /&gt;
&lt;br /&gt;
	_st											= xml:InitStatic						(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_npc_torch&amp;quot;,				_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_npc_torch&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_particles_distance&amp;quot;,	_st)&lt;br /&gt;
	ctl				= xml:InitTrackBar			(&amp;quot;video_adv:track_particles_distance&amp;quot;,	_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_12_mode&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_vsync&amp;quot;,					_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_vsync&amp;quot;,				_st)&lt;br /&gt;
	&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_60hz&amp;quot;,					_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_60hz&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
	btn		= xml:Init3tButton					(&amp;quot;video_adv:btn_to_simply&amp;quot;,	self)	&lt;br /&gt;
	handler:Register							(btn, &amp;quot;btn_simply_graphic&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&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;br /&amp;gt; _st				= xml:InitStatic&lt;br /&gt;
&amp;lt;br /&amp;gt; (&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
&amp;lt;br /&amp;gt; xml:InitStatic&lt;br /&gt;
&amp;lt;br /&amp;gt;	(&amp;quot;video_adv:cap_r2gi&amp;quot;,					_st)&lt;br /&gt;
&amp;lt;br /&amp;gt; xml:InitCheck&lt;br /&gt;
&amp;lt;br /&amp;gt; (&amp;quot;video_adv:check_r2gi&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Переписываем вот так и вставляем перед&lt;br /&gt;
&amp;lt;pre&amp;gt;	btn		= xml:Init3tButton					(&amp;quot;video_adv:btn_to_simply&amp;quot;,	self)	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&amp;lt;br /&amp;gt; Идём в''' ui_mm_opt.xml'''  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt; Вписываем в любое место каркас &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;cap_r2gi x=&amp;quot;20&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;143&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;letterica16&amp;quot; r=&amp;quot;215&amp;quot; g=&amp;quot;195&amp;quot; b=&amp;quot;170&amp;quot;&amp;gt;ui_mm_r2gi&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;/cap_r2gi&amp;gt;&lt;br /&gt;
		&amp;lt;check_r2gi x=&amp;quot;194&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;options_item entry=&amp;quot;r2_gi&amp;quot; group=&amp;quot;mm_opt_video_adv&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/check_r2gi&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; Разберём подробно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt; '''&amp;lt;cap_r2gi x=&amp;quot;20&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;143&amp;quot; height=&amp;quot;21&amp;quot;&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; Тут всё просто. Шрифт, и URL на текст&lt;br /&gt;
&amp;lt;br /&amp;gt; '''&amp;lt;check_r2gi x=&amp;quot;194&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; Плохо знаю зачем нужна, но всегда нужно заполнять. Связана с проверкой&lt;br /&gt;
&amp;lt;br /&amp;gt; 	'''&amp;lt;options_item entry=&amp;quot;r2_gi&amp;quot; group=&amp;quot;mm_opt_video_adv&amp;quot;/&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; А вот тут всё очень интересно. Первое, указан изменяемый параметр(из user.ltx) и группа(класс) скрипта, в котором записана обрабатывающая функция&lt;br /&gt;
&amp;lt;br /&amp;gt; Вот и всё. Теперь идём в '''ui_st_mm.xml'''&lt;br /&gt;
	&amp;lt;pre&amp;gt;&amp;lt;string id=&amp;quot;ui_mm_r2gi&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Продать все&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br /&amp;gt; Записываем в самый конец эту тему, и всё. Функция добавлена.&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BE%D0%BF%D1%86%D0%B8%D0%B9</id>
		<title>Добавление новых графических опций</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%BE%D0%BF%D1%86%D0%B8%D0%B9"/>
				<updated>2010-07-03T10:12:37Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &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;'''user.ltx'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt_video.script'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt_video_adv.script'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_mm_opt.xml'''&lt;br /&gt;
&amp;lt;br /&amp;gt;'''ui_st_mm.xml'''&lt;br /&gt;
&lt;br /&gt;
Для начала, идём в '''user.ltx''' и ищем там графические параметры. &lt;br /&gt;
&amp;lt;pre&amp;gt;_preset Extreme&lt;br /&gt;
ai_use_torch_dynamic_lights on&lt;br /&gt;
unbindall&lt;br /&gt;
bind left kLEFT&lt;br /&gt;
bind right kRIGHT&lt;br /&gt;
bind up kUP&lt;br /&gt;
bind down kDOWN&lt;br /&gt;
bind jump kSPACE&lt;br /&gt;
bind crouch kLCONTROL&lt;br /&gt;
bind accel kLSHIFT&lt;br /&gt;
bind sprint_toggle kX&lt;br /&gt;
bind forward kW&lt;br /&gt;
bind back kS&lt;br /&gt;
bind lstrafe kA&lt;br /&gt;
bind rstrafe kD&lt;br /&gt;
bind llookout kQ&lt;br /&gt;
bind rlookout kE&lt;br /&gt;
bind cam_zoom_in kADD&lt;br /&gt;
bind cam_zoom_out kSUBTRACT&lt;br /&gt;
bind torch kL&lt;br /&gt;
bind night_vision kN&lt;br /&gt;
bind wpn_1 k1&lt;br /&gt;
bind wpn_2 k2&lt;br /&gt;
bind wpn_3 k3&lt;br /&gt;
bind wpn_4 k4&lt;br /&gt;
bind wpn_5 k5&lt;br /&gt;
bind wpn_6 k6&lt;br /&gt;
bind artefact k7&lt;br /&gt;
bind wpn_next kY&lt;br /&gt;
bind wpn_fire mouse1&lt;br /&gt;
bind wpn_zoom mouse2&lt;br /&gt;
bind wpn_reload kR&lt;br /&gt;
bind wpn_func kV&lt;br /&gt;
bind wpn_firemode_prev k9&lt;br /&gt;
bind wpn_firemode_next k0&lt;br /&gt;
bind pause kPAUSE&lt;br /&gt;
bind drop kG&lt;br /&gt;
bind use kF&lt;br /&gt;
bind scores kTAB&lt;br /&gt;
bind chat kCOMMA&lt;br /&gt;
bind chat_team kPERIOD&lt;br /&gt;
bind screenshot kF12&lt;br /&gt;
bind quit kESCAPE&lt;br /&gt;
bind console kGRAVE&lt;br /&gt;
bind inventory kI&lt;br /&gt;
bind buy_menu kB&lt;br /&gt;
bind skin_menu kO&lt;br /&gt;
bind team_menu kU&lt;br /&gt;
bind active_jobs kP&lt;br /&gt;
bind map kM&lt;br /&gt;
bind contacts kH&lt;br /&gt;
bind vote_begin kF5&lt;br /&gt;
bind vote kF6&lt;br /&gt;
bind vote_yes kF7&lt;br /&gt;
bind vote_no kF8&lt;br /&gt;
bind speech_menu_0 kC&lt;br /&gt;
bind speech_menu_1 kZ&lt;br /&gt;
bind use_bandage kRBRACKET&lt;br /&gt;
bind use_medkit kLBRACKET&lt;br /&gt;
bind quick_save kF6&lt;br /&gt;
bind quick_load kF7&lt;br /&gt;
cam_inert 0.&lt;br /&gt;
cam_slide_inert 0.25&lt;br /&gt;
cl_cod_pickup_mode 1&lt;br /&gt;
cl_dynamiccrosshair on&lt;br /&gt;
g_always_run on&lt;br /&gt;
g_autopickup on&lt;br /&gt;
g_backrun on&lt;br /&gt;
g_corpsenum 10&lt;br /&gt;
g_eventdelay 0&lt;br /&gt;
g_game_difficulty gd_novice&lt;br /&gt;
hud_crosshair on&lt;br /&gt;
hud_crosshair_dist off&lt;br /&gt;
hud_info on&lt;br /&gt;
hud_weapon on&lt;br /&gt;
load_last_save all&lt;br /&gt;
mm_mm_net_srv_dedicated off&lt;br /&gt;
mm_net_con_publicserver off&lt;br /&gt;
mm_net_con_spectator 20&lt;br /&gt;
mm_net_con_spectator_on off&lt;br /&gt;
mm_net_filter_empty on&lt;br /&gt;
mm_net_filter_full on&lt;br /&gt;
mm_net_filter_listen on&lt;br /&gt;
mm_net_filter_pass on&lt;br /&gt;
mm_net_filter_wo_ff on&lt;br /&gt;
mm_net_filter_wo_pass on&lt;br /&gt;
mm_net_srv_gamemode st_deathmatch&lt;br /&gt;
mm_net_srv_maxplayers 32&lt;br /&gt;
mm_net_srv_name MICROSOF-80B663&lt;br /&gt;
mm_net_srv_reinforcement_type 1&lt;br /&gt;
mm_net_weather_rateofchange 1.&lt;br /&gt;
mouse_invert off&lt;br /&gt;
mouse_sens 0.12&lt;br /&gt;
net_cl_icurvesize 0&lt;br /&gt;
net_cl_icurvetype 0&lt;br /&gt;
net_cl_interpolation 0.&lt;br /&gt;
net_cl_log_data off&lt;br /&gt;
net_dbg_dump_export_obj 0&lt;br /&gt;
net_dbg_dump_import_obj 0&lt;br /&gt;
net_dbg_dump_update_read 0&lt;br /&gt;
net_dbg_dump_update_write 0&lt;br /&gt;
net_dedicated_sleep 5&lt;br /&gt;
net_sv_gpmode 0&lt;br /&gt;
net_sv_log_data off&lt;br /&gt;
net_sv_pending_lim 3&lt;br /&gt;
net_sv_update_rate 30&lt;br /&gt;
ph_frequency 100.00000&lt;br /&gt;
ph_iterations 38&lt;br /&gt;
r1_dlights on&lt;br /&gt;
r1_dlights_clip 75.&lt;br /&gt;
r1_glows_per_frame 16&lt;br /&gt;
r1_lmodel_lerp 0.1&lt;br /&gt;
r1_pps_u 0.&lt;br /&gt;
r1_pps_v 0.&lt;br /&gt;
r1_ssa_lod_a 64.&lt;br /&gt;
r1_ssa_lod_b 48.&lt;br /&gt;
r1_tf_mipbias 0.&lt;br /&gt;
r2_aa off&lt;br /&gt;
r2_aa_break 0.800000,0.500000,0.000000&lt;br /&gt;
r2_aa_kernel 0.5&lt;br /&gt;
r2_aa_weight 0.250000,0.250000,0.000000&lt;br /&gt;
r2_allow_r1_lights off&lt;br /&gt;
r2_gi off&lt;br /&gt;
r2_gi_clip 0.001&lt;br /&gt;
r2_gi_depth 1&lt;br /&gt;
r2_gi_photons 16&lt;br /&gt;
r2_gi_refl 0.9&lt;br /&gt;
r2_gloss_factor 1.5&lt;br /&gt;
r2_ls_bloom_fast off&lt;br /&gt;
r2_ls_bloom_kernel_b 0.7&lt;br /&gt;
r2_ls_bloom_kernel_g 3.&lt;br /&gt;
r2_ls_bloom_kernel_scale 0.7&lt;br /&gt;
r2_ls_bloom_speed 100.&lt;br /&gt;
r2_ls_bloom_threshold 0.001&lt;br /&gt;
r2_ls_depth_bias -0.0003&lt;br /&gt;
r2_ls_depth_scale 1.00001&lt;br /&gt;
r2_ls_dsm_kernel 0.7&lt;br /&gt;
r2_ls_psm_kernel 0.7&lt;br /&gt;
r2_ls_squality 1.&lt;br /&gt;
r2_ls_ssm_kernel 0.7&lt;br /&gt;
r2_mblur 0.&lt;br /&gt;
r2_parallax_h 0.02&lt;br /&gt;
r2_slight_fade 0.3333&lt;br /&gt;
r2_ssa_lod_a 64.&lt;br /&gt;
r2_ssa_lod_b 48.&lt;br /&gt;
r2_sun on&lt;br /&gt;
r2_sun_depth_far_bias -0.00001&lt;br /&gt;
r2_sun_depth_far_scale 1.&lt;br /&gt;
r2_sun_depth_near_bias 0.00001&lt;br /&gt;
r2_sun_depth_near_scale 1.&lt;br /&gt;
r2_sun_details off&lt;br /&gt;
r2_sun_focus on&lt;br /&gt;
r2_sun_lumscale 1.&lt;br /&gt;
r2_sun_lumscale_amb 0.5&lt;br /&gt;
r2_sun_lumscale_hemi 1.&lt;br /&gt;
r2_sun_near 12.&lt;br /&gt;
r2_sun_near_border 0.75&lt;br /&gt;
r2_sun_tsm on&lt;br /&gt;
r2_sun_tsm_bias -0.01&lt;br /&gt;
r2_sun_tsm_proj 0.3&lt;br /&gt;
r2_tf_mipbias 0.&lt;br /&gt;
r2_tonemap on&lt;br /&gt;
r2_tonemap_adaptation 1.&lt;br /&gt;
r2_tonemap_amount 0.7&lt;br /&gt;
r2_tonemap_lowlum 0.0001&lt;br /&gt;
r2_tonemap_middlegray 0.6&lt;br /&gt;
r2_wait_sleep 0&lt;br /&gt;
r2_zfill off&lt;br /&gt;
r2_zfill_depth 0.5&lt;br /&gt;
r2em 2.2&lt;br /&gt;
r__detail_density 0.2&lt;br /&gt;
r__geometry_lod 1.&lt;br /&gt;
r__supersample 2&lt;br /&gt;
r__tf_aniso 16&lt;br /&gt;
renderer renderer_r2&lt;br /&gt;
rs_c_brightness 1.&lt;br /&gt;
rs_c_contrast 1.&lt;br /&gt;
rs_c_gamma 1.&lt;br /&gt;
rs_fullscreen on&lt;br /&gt;
rs_refresh_60hz on&lt;br /&gt;
rs_stats off&lt;br /&gt;
rs_v_sync off&lt;br /&gt;
rs_vis_distance 1.&lt;br /&gt;
snd_acceleration on&lt;br /&gt;
snd_cache_size 16&lt;br /&gt;
snd_efx on&lt;br /&gt;
snd_targets 24&lt;br /&gt;
snd_volume_eff 1.&lt;br /&gt;
snd_volume_music 1.&lt;br /&gt;
sv_anomalies_enabled 1&lt;br /&gt;
sv_anomalies_length 3&lt;br /&gt;
sv_artefact_respawn_delta 30&lt;br /&gt;
sv_artefact_spawn_force 0&lt;br /&gt;
sv_artefact_stay_time 3&lt;br /&gt;
sv_artefacts_count 10&lt;br /&gt;
sv_auto_team_balance 0&lt;br /&gt;
sv_auto_team_swap 1&lt;br /&gt;
sv_bearercantsprint 1&lt;br /&gt;
sv_client_reconnect_time 60&lt;br /&gt;
sv_console_update_rate 1&lt;br /&gt;
sv_dedicated_server_update_rate 100&lt;br /&gt;
sv_dmgblockindicator 1&lt;br /&gt;
sv_dmgblocktime 0&lt;br /&gt;
sv_forcerespawn 0&lt;br /&gt;
sv_fraglimit 10&lt;br /&gt;
sv_friendly_indicators 0&lt;br /&gt;
sv_friendly_names 0&lt;br /&gt;
sv_friendlyfire 1.&lt;br /&gt;
sv_hail_to_winner_time 7&lt;br /&gt;
sv_max_ping_limit 2000&lt;br /&gt;
sv_pda_hunt 1&lt;br /&gt;
sv_reinforcement_time 0&lt;br /&gt;
sv_remove_corpse 1&lt;br /&gt;
sv_remove_weapon 1&lt;br /&gt;
sv_returnplayers 1&lt;br /&gt;
sv_rpoint_freeze_time 0&lt;br /&gt;
sv_shieldedbases 1&lt;br /&gt;
sv_spectr_firsteye 1&lt;br /&gt;
sv_spectr_freefly 0&lt;br /&gt;
sv_spectr_freelook 1&lt;br /&gt;
sv_spectr_lookat 1&lt;br /&gt;
sv_spectr_teamcamera 1&lt;br /&gt;
sv_statistic_collect 1&lt;br /&gt;
sv_statistic_save_auto 0&lt;br /&gt;
sv_teamkill_limit 3&lt;br /&gt;
sv_teamkill_punish 1&lt;br /&gt;
sv_timelimit 0&lt;br /&gt;
sv_vote_enabled 255&lt;br /&gt;
sv_vote_participants 0&lt;br /&gt;
sv_vote_quota 0.51&lt;br /&gt;
sv_vote_time 1.&lt;br /&gt;
sv_warm_up 0&lt;br /&gt;
texture_lod 0&lt;br /&gt;
vid_mode 1280x1024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;Это мой полный. &lt;br /&gt;
&amp;lt;br /&amp;gt;Возмём к примеру графический параметр '''r2_gi'''&lt;br /&gt;
&amp;lt;br /&amp;gt;Префикс r2 означает что он будет работать только на полном динамическом освещении.&lt;br /&gt;
&amp;lt;br /&amp;gt;Далее идём в файл '''ui_mm_opt_video_adv.script &lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;pre&amp;gt;class &amp;quot;opt_video_adv&amp;quot; (CUIWindow)&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:__init() super()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function only_2_mode(ctrl, _id)&lt;br /&gt;
	local bEnabled	= _id==2&lt;br /&gt;
	ctrl:Enable		(bEnabled)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function only_12_mode(ctrl, _id)&lt;br /&gt;
	local bEnabled	= _id==1 or _id==2&lt;br /&gt;
	ctrl:Enable		(bEnabled)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function opt_video_adv:InitControls(x, y, xml, handler)&lt;br /&gt;
	local ctl&lt;br /&gt;
	self:Init									(x,y, 738, 416)&lt;br /&gt;
	self:SetAutoDelete							(true)&lt;br /&gt;
	&lt;br /&gt;
	self.bk			= xml:InitFrame				(&amp;quot;frame_videoadv&amp;quot;, self)&lt;br /&gt;
	self.scroll_v	= xml:InitScrollView		(&amp;quot;video_adv:scroll_v&amp;quot;, self)&lt;br /&gt;
&lt;br /&gt;
	local _st		= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_vis_dist&amp;quot;,				_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_vis_dist&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_geometry_lod&amp;quot;,			_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_geometry_lod&amp;quot;,		_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_detail_density&amp;quot;,		_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_detail_density&amp;quot;,		_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_texture_lod&amp;quot;,			_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_texture_lod&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_aniso&amp;quot;,					_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_aniso&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_ssample&amp;quot;,				_st)&lt;br /&gt;
	xml:InitTrackBar							(&amp;quot;video_adv:track_ssample&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_r2_sun&amp;quot;,				_st)&lt;br /&gt;
	ctl			= xml:InitCheck					(&amp;quot;video_adv:check_r2_sun&amp;quot;,				_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_2_mode&lt;br /&gt;
	&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_r2_sun_details&amp;quot;,		_st)&lt;br /&gt;
	ctl			= xml:InitCheck		(&amp;quot;video_adv:check_r2_sun_details&amp;quot;,		_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_2_mode&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_light_distance&amp;quot;,		_st)&lt;br /&gt;
	ctl				= xml:InitTrackBar			(&amp;quot;video_adv:track_light_distance&amp;quot;,		_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_12_mode&lt;br /&gt;
&lt;br /&gt;
	_st											= xml:InitStatic						(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_npc_torch&amp;quot;,				_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_npc_torch&amp;quot;,			_st)&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_particles_distance&amp;quot;,	_st)&lt;br /&gt;
	ctl				= xml:InitTrackBar			(&amp;quot;video_adv:track_particles_distance&amp;quot;,	_st)&lt;br /&gt;
	handler.m_preconditions[ctl]		= only_12_mode&lt;br /&gt;
&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_vsync&amp;quot;,					_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_vsync&amp;quot;,				_st)&lt;br /&gt;
	&lt;br /&gt;
	_st				= xml:InitStatic			(&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
	xml:InitStatic								(&amp;quot;video_adv:cap_60hz&amp;quot;,					_st)&lt;br /&gt;
	xml:InitCheck								(&amp;quot;video_adv:check_60hz&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
	btn		= xml:Init3tButton					(&amp;quot;video_adv:btn_to_simply&amp;quot;,	self)	&lt;br /&gt;
	handler:Register							(btn, &amp;quot;btn_simply_graphic&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&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;br /&amp;gt; _st				= xml:InitStatic&lt;br /&gt;
&amp;lt;br /&amp;gt; (&amp;quot;video_adv:templ_item&amp;quot;,				self.scroll_v)&lt;br /&gt;
&amp;lt;br /&amp;gt; xml:InitStatic&lt;br /&gt;
&amp;lt;br /&amp;gt;	(&amp;quot;video_adv:cap_r2gi&amp;quot;,					_st)&lt;br /&gt;
&amp;lt;br /&amp;gt; xml:InitCheck&lt;br /&gt;
&amp;lt;br /&amp;gt; (&amp;quot;video_adv:check_r2gi&amp;quot;,				_st)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Переписываем вот так и вставляем перед&lt;br /&gt;
&amp;lt;pre&amp;gt;	btn		= xml:Init3tButton					(&amp;quot;video_adv:btn_to_simply&amp;quot;,	self)	&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем.&lt;br /&gt;
&amp;lt;br /&amp;gt; Идём в''' ui_mm_opt.xml'''  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt; Вписываем в любое место каркас &lt;br /&gt;
&amp;lt;pre&amp;gt;	&amp;lt;cap_r2gi x=&amp;quot;20&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;143&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;letterica16&amp;quot; r=&amp;quot;215&amp;quot; g=&amp;quot;195&amp;quot; b=&amp;quot;170&amp;quot;&amp;gt;ui_mm_r2gi&amp;lt;/text&amp;gt;&lt;br /&gt;
		&amp;lt;/cap_r2gi&amp;gt;&lt;br /&gt;
		&amp;lt;check_r2gi x=&amp;quot;194&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;options_item entry=&amp;quot;r2_gi&amp;quot; group=&amp;quot;mm_opt_video_adv&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;/check_r2gi&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt; Разберём подробно&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt; '''&amp;lt;cap_r2gi x=&amp;quot;20&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;143&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; Название нашей кнопки, и кординаты её расположения&lt;br /&gt;
&amp;lt;br /&amp;gt; '''&amp;lt;text font=&amp;quot;letterica16&amp;quot; r=&amp;quot;215&amp;quot; g=&amp;quot;195&amp;quot; b=&amp;quot;170&amp;quot;&amp;gt;ui_mm_r2gi&amp;lt;/text&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; Тут всё просто. Шрифт, и URL на текст&lt;br /&gt;
&amp;lt;br /&amp;gt; '''&amp;lt;check_r2gi x=&amp;quot;194&amp;quot; y=&amp;quot;0&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;21&amp;quot;&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; Плохо знаю зачем нужна, но всегда нужно заполнять. Связана с проверкой&lt;br /&gt;
&amp;lt;br /&amp;gt; 	'''&amp;lt;options_item entry=&amp;quot;r2_gi&amp;quot; group=&amp;quot;mm_opt_video_adv&amp;quot;/&amp;gt;'''&lt;br /&gt;
&amp;lt;br /&amp;gt; А вот тут всё очень интересно. Первое, указан изменяемый параметр(из user.ltx) и группа(класс) скрипта, в котором записана обрабатывающая функция&lt;br /&gt;
&amp;lt;br /&amp;gt; Вот и всё. Теперь идём в '''ui_st_mm.xml'''&lt;br /&gt;
	&amp;lt;pre&amp;gt;&amp;lt;string id=&amp;quot;ui_mm_r2gi&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text&amp;gt;Продать все&amp;lt;/text&amp;gt;&lt;br /&gt;
	&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br /&amp;gt; Записываем в самый конец эту тему, и всё. Функция добавлена.&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0</id>
		<title>Maya. Один из способов создания игрового ландшафта</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0"/>
				<updated>2010-07-03T06:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: «Создание игрового ландшафта в MAYA» переименована в «Maya.Создание игрового ландшафта»: Занесение в категорию&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для начала откроем саму прогу.  Выполнив все манипуляции по настройке плагинов и единиц измерения (читаем офф. руководство на вики), создадим  Nurmbs primitives plane. Жмем кубик рядом с надписью &lt;br /&gt;
http://img.gameru.net/img/ccd63.jpg&lt;br /&gt;
&lt;br /&gt;
Смотрим, что получилось? Настроим нашу плоскость, к примеру, 200х200.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e5797.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь кликаем в центр решетки. Нажимаем кнопку «5»&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/93af2.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно вот так.&lt;br /&gt;
Теперь выровняем по центру нашу плоскость.&lt;br /&gt;
Для этого лезем самая крайняя кнопка с права в панели инструментов. Выставляем Translate по всем осям на 0.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/d6552.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь смоделируем дорогу. Жмем create CV Curve tool. Тыкаем кубик&lt;br /&gt;
http://img.gameru.net/img/5c311.jpg&lt;br /&gt;
&lt;br /&gt;
Если хотим загогулистую дорогу, ставим cubic, если ограничимся прямой, то но linear.  Я решил сделать с плавными изгибами.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f3b5b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь переходим в режим ТОР (вид с верху) настраиваем сетку (я сделал 100х10х1)&lt;br /&gt;
http://img.gameru.net/img/08a55.jpg&lt;br /&gt;
&lt;br /&gt;
Включаем привязку к сетке (клавиша x или соответствующая иконка на панели инструментов)&lt;br /&gt;
Теперь точками рисуем нашу кривую 1&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb417.jpg&lt;br /&gt;
&lt;br /&gt;
После того как кривая нарисована, жмем enter,  наша кривая станет зеленой.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/9e111.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сочетание клавиш ctrl+D дублируем нашу кривую, выбираем инструмент move и перемещаем ее рядом чтоб получить вторую границу нашей дороги. Не забываем про размеры, я для примера перенесу 2 кривую на 5 метров вправо. Отключаем во вкладке Shading Smooth shade all, или нажимае кнопку «4».&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/3edd0.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно это.&lt;br /&gt;
Теперь все это безобразие нужно превратить в полигоны.&lt;br /&gt;
Заходим во вкладку Window -&amp;gt; Outliner &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb150.jpg&lt;br /&gt;
&lt;br /&gt;
И в открывшемся окне с помощью клавиши ctrl и лев. Кнопки Миши выбираем Curve1 &amp;amp; Curve2.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ca639.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь из режима редактирования полигонов нам надо перейти в режим редактирования Surfaces. Ниспадающее меню сразу под вкладками File Edit.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ce7ad.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь отрываем вкладку Surfaces -&amp;gt; Loft жмем кубик&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1b5c6.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В открывшемся окне проведем некоторые настройки.&lt;br /&gt;
Движок Sections spans отвечает за количество разбиений, не переборщите, потом тяжелее будет все это приводить в порядок. Для дороги (и.т.п.) я использую 2. Ставим в окне циферу 2 и жмем  Loft. Должно получиться примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/95536.jpg&lt;br /&gt;
&lt;br /&gt;
Сразу отметим, что в окне outliner, появился новый объект LoftedSurface1, переименуем его в road, щелкнем в окне Outliner на сей объект, и пропишем ему новое имя. В дальнейшем при наполнении локации корректное имя объекта здорово облегчит жизнь.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/8b2ae.jpg&lt;br /&gt;
&lt;br /&gt;
Так. Дорогу создали, теперь создадим все остальное , что дорогу окружает.&lt;br /&gt;
Тобиш землю, по которой эта дорога проложена.&lt;br /&gt;
Для этого создадим еще 2 кривые, только теперь в настройках CV Curve tool  поменяем Curve degree  с cubic  на linear.&lt;br /&gt;
 Включаем привязку к сетке и строим две вертикальные кривые по линиям нашей ранее созданной плоскости.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/b179f.jpg&lt;br /&gt;
Сразу отмечу то, что чем больше точек в линии, тем больше будет разбиений , и тем больше в итоге получится поликов. Тут уж на глаз. &lt;br /&gt;
Все жмем enter дублируем нашу линию ctrl+D и инструментом move перемещаем на противоположную сторону.&lt;br /&gt;
Теперь плоскость NurmbsPlane  нам больше не нужна, удалим ее. В окне Outliner выделим ее и нажмем клавишу del.&lt;br /&gt;
Вот что должно получиться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1e657.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сформируем новые плоскости. Для этого в окне Outliner выбираем Curve1&amp;amp;curve3 жмем surfaces -&amp;gt; loft  и кубик рядом, экспериментируя с настройками, добиваемся боле менее нормального варианта разбиения, у меня получилось так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/4b564.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь выбираем кривые 2 и 4 и проделываем то же самое.&lt;br /&gt;
Выглядеть должно примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e514b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь все кривые можно удалить. В окне выбираем все 4 и мочим их.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/82a2d.jpg&lt;br /&gt;
&lt;br /&gt;
Ну, вот что-то похожее на истину у нас получилось, теперь все это безобразие нужно конвертировать в полигональные объекты. Выбираем наш road, лезем во вкладку Modify -&amp;gt; convert -&amp;gt; Nurmbs to Poligon  жмем кубик&lt;br /&gt;
В открывшемся окне делаем настройки. С разу скажу, что лучше разбивать на треугольники, а не на кубики. Т.к. Повороты будут плавне и с числом полигонов count  при разбиении придется экспериментировать, до получения оптимального варианта. Я взял 400.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/08ca0.jpg&lt;br /&gt;
&lt;br /&gt;
Жмем apply, получаем результат.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/00be4.jpg&lt;br /&gt;
Обратите внимание на то что в окне Outliner появился новый объект, переименуем его все в тот же road, а исходный можно удалить.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/43094.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь по такой же схеме проделываем фокусы с оставшимися объектами, у меня получилось вот так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/df4cd.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь оставим дорогу в покое, а две половинки нашей земли склеим в единый меш.&lt;br /&gt;
В окне Outliner выбираем их, переходим в режим редактирования полигонов (под вкладками file edit) заходим &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/127df.jpg&lt;br /&gt;
Получим склеенный меш. &lt;br /&gt;
Теперь можно заниматься самим ландшафтом, холмами, долами и.т.п. .&lt;br /&gt;
Потом наносим материалы, собираем в единый меш и экспортим.&lt;br /&gt;
Вроде усе. &lt;br /&gt;
Authors: '''ZVUKARb'''&lt;br /&gt;
Из Word в Wiki: '''Oxygenium'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Wireframe ]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0_%D0%B2_MAYA</id>
		<title>Создание игрового ландшафта в MAYA</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0_%D0%B2_MAYA"/>
				<updated>2010-07-03T06:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: «Создание игрового ландшафта в MAYA» переименована в «Maya.Создание игрового ландшафта»: Занесение в категорию&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Maya.Создание игрового ландшафта]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0</id>
		<title>Maya. Один из способов создания игрового ландшафта</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0"/>
				<updated>2010-07-03T06:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для начала откроем саму прогу.  Выполнив все манипуляции по настройке плагинов и единиц измерения (читаем офф. руководство на вики), создадим  Nurmbs primitives plane. Жмем кубик рядом с надписью &lt;br /&gt;
http://img.gameru.net/img/ccd63.jpg&lt;br /&gt;
&lt;br /&gt;
Смотрим, что получилось? Настроим нашу плоскость, к примеру, 200х200.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e5797.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь кликаем в центр решетки. Нажимаем кнопку «5»&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/93af2.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно вот так.&lt;br /&gt;
Теперь выровняем по центру нашу плоскость.&lt;br /&gt;
Для этого лезем самая крайняя кнопка с права в панели инструментов. Выставляем Translate по всем осям на 0.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/d6552.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь смоделируем дорогу. Жмем create CV Curve tool. Тыкаем кубик&lt;br /&gt;
http://img.gameru.net/img/5c311.jpg&lt;br /&gt;
&lt;br /&gt;
Если хотим загогулистую дорогу, ставим cubic, если ограничимся прямой, то но linear.  Я решил сделать с плавными изгибами.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f3b5b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь переходим в режим ТОР (вид с верху) настраиваем сетку (я сделал 100х10х1)&lt;br /&gt;
http://img.gameru.net/img/08a55.jpg&lt;br /&gt;
&lt;br /&gt;
Включаем привязку к сетке (клавиша x или соответствующая иконка на панели инструментов)&lt;br /&gt;
Теперь точками рисуем нашу кривую 1&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb417.jpg&lt;br /&gt;
&lt;br /&gt;
После того как кривая нарисована, жмем enter,  наша кривая станет зеленой.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/9e111.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сочетание клавиш ctrl+D дублируем нашу кривую, выбираем инструмент move и перемещаем ее рядом чтоб получить вторую границу нашей дороги. Не забываем про размеры, я для примера перенесу 2 кривую на 5 метров вправо. Отключаем во вкладке Shading Smooth shade all, или нажимае кнопку «4».&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/3edd0.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно это.&lt;br /&gt;
Теперь все это безобразие нужно превратить в полигоны.&lt;br /&gt;
Заходим во вкладку Window -&amp;gt; Outliner &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb150.jpg&lt;br /&gt;
&lt;br /&gt;
И в открывшемся окне с помощью клавиши ctrl и лев. Кнопки Миши выбираем Curve1 &amp;amp; Curve2.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ca639.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь из режима редактирования полигонов нам надо перейти в режим редактирования Surfaces. Ниспадающее меню сразу под вкладками File Edit.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ce7ad.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь отрываем вкладку Surfaces -&amp;gt; Loft жмем кубик&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1b5c6.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В открывшемся окне проведем некоторые настройки.&lt;br /&gt;
Движок Sections spans отвечает за количество разбиений, не переборщите, потом тяжелее будет все это приводить в порядок. Для дороги (и.т.п.) я использую 2. Ставим в окне циферу 2 и жмем  Loft. Должно получиться примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/95536.jpg&lt;br /&gt;
&lt;br /&gt;
Сразу отметим, что в окне outliner, появился новый объект LoftedSurface1, переименуем его в road, щелкнем в окне Outliner на сей объект, и пропишем ему новое имя. В дальнейшем при наполнении локации корректное имя объекта здорово облегчит жизнь.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/8b2ae.jpg&lt;br /&gt;
&lt;br /&gt;
Так. Дорогу создали, теперь создадим все остальное , что дорогу окружает.&lt;br /&gt;
Тобиш землю, по которой эта дорога проложена.&lt;br /&gt;
Для этого создадим еще 2 кривые, только теперь в настройках CV Curve tool  поменяем Curve degree  с cubic  на linear.&lt;br /&gt;
 Включаем привязку к сетке и строим две вертикальные кривые по линиям нашей ранее созданной плоскости.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/b179f.jpg&lt;br /&gt;
Сразу отмечу то, что чем больше точек в линии, тем больше будет разбиений , и тем больше в итоге получится поликов. Тут уж на глаз. &lt;br /&gt;
Все жмем enter дублируем нашу линию ctrl+D и инструментом move перемещаем на противоположную сторону.&lt;br /&gt;
Теперь плоскость NurmbsPlane  нам больше не нужна, удалим ее. В окне Outliner выделим ее и нажмем клавишу del.&lt;br /&gt;
Вот что должно получиться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1e657.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сформируем новые плоскости. Для этого в окне Outliner выбираем Curve1&amp;amp;curve3 жмем surfaces -&amp;gt; loft  и кубик рядом, экспериментируя с настройками, добиваемся боле менее нормального варианта разбиения, у меня получилось так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/4b564.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь выбираем кривые 2 и 4 и проделываем то же самое.&lt;br /&gt;
Выглядеть должно примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e514b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь все кривые можно удалить. В окне выбираем все 4 и мочим их.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/82a2d.jpg&lt;br /&gt;
&lt;br /&gt;
Ну, вот что-то похожее на истину у нас получилось, теперь все это безобразие нужно конвертировать в полигональные объекты. Выбираем наш road, лезем во вкладку Modify -&amp;gt; convert -&amp;gt; Nurmbs to Poligon  жмем кубик&lt;br /&gt;
В открывшемся окне делаем настройки. С разу скажу, что лучше разбивать на треугольники, а не на кубики. Т.к. Повороты будут плавне и с числом полигонов count  при разбиении придется экспериментировать, до получения оптимального варианта. Я взял 400.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/08ca0.jpg&lt;br /&gt;
&lt;br /&gt;
Жмем apply, получаем результат.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/00be4.jpg&lt;br /&gt;
Обратите внимание на то что в окне Outliner появился новый объект, переименуем его все в тот же road, а исходный можно удалить.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/43094.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь по такой же схеме проделываем фокусы с оставшимися объектами, у меня получилось вот так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/df4cd.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь оставим дорогу в покое, а две половинки нашей земли склеим в единый меш.&lt;br /&gt;
В окне Outliner выбираем их, переходим в режим редактирования полигонов (под вкладками file edit) заходим &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/127df.jpg&lt;br /&gt;
Получим склеенный меш. &lt;br /&gt;
Теперь можно заниматься самим ландшафтом, холмами, долами и.т.п. .&lt;br /&gt;
Потом наносим материалы, собираем в единый меш и экспортим.&lt;br /&gt;
Вроде усе. &lt;br /&gt;
Authors: '''ZVUKARb'''&lt;br /&gt;
Из Word в Wiki: '''Oxygenium'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Wireframe ]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0</id>
		<title>Maya. Один из способов создания игрового ландшафта</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=Maya._%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%D1%8F_%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B0%D0%BD%D0%B4%D1%88%D0%B0%D1%84%D1%82%D0%B0"/>
				<updated>2010-07-03T06:48:54Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для начала откроем саму прогу.  Выполнив все манипуляции по настройке плагинов и единиц измерения (читаем офф. руководство на вики), создадим  Nurmbs primitives plane. Жмем кубик рядом с надписью &lt;br /&gt;
http://img.gameru.net/img/ccd63.jpg&lt;br /&gt;
&lt;br /&gt;
Смотрим, что получилось? Настроим нашу плоскость, к примеру, 200х200.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e5797.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь кликаем в центр решетки. Нажимаем кнопку «5»&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/93af2.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно вот так.&lt;br /&gt;
Теперь выровняем по центру нашу плоскость.&lt;br /&gt;
Для этого лезем самая крайняя кнопка с права в панели инструментов. Выставляем Translate по всем осям на 0.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/d6552.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь смоделируем дорогу. Жмем create CV Curve tool. Тыкаем кубик&lt;br /&gt;
http://img.gameru.net/img/5c311.jpg&lt;br /&gt;
&lt;br /&gt;
Если хотим загогулистую дорогу, ставим cubic, если ограничимся прямой, то но linear.  Я решил сделать с плавными изгибами.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/f3b5b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь переходим в режим ТОР (вид с верху) настраиваем сетку (я сделал 100х10х1)&lt;br /&gt;
http://img.gameru.net/img/08a55.jpg&lt;br /&gt;
&lt;br /&gt;
Включаем привязку к сетке (клавиша x или соответствующая иконка на панели инструментов)&lt;br /&gt;
Теперь точками рисуем нашу кривую 1&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb417.jpg&lt;br /&gt;
&lt;br /&gt;
После того как кривая нарисована, жмем enter,  наша кривая станет зеленой.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/9e111.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сочетание клавиш ctrl+D дублируем нашу кривую, выбираем инструмент move и перемещаем ее рядом чтоб получить вторую границу нашей дороги. Не забываем про размеры, я для примера перенесу 2 кривую на 5 метров вправо. Отключаем во вкладке Shading Smooth shade all, или нажимае кнопку «4».&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/3edd0.jpg&lt;br /&gt;
&lt;br /&gt;
Должно получиться примерно это.&lt;br /&gt;
Теперь все это безобразие нужно превратить в полигоны.&lt;br /&gt;
Заходим во вкладку Window -&amp;gt; Outliner &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/fb150.jpg&lt;br /&gt;
&lt;br /&gt;
И в открывшемся окне с помощью клавиши ctrl и лев. Кнопки Миши выбираем Curve1 &amp;amp; Curve2.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ca639.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь из режима редактирования полигонов нам надо перейти в режим редактирования Surfaces. Ниспадающее меню сразу под вкладками File Edit.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/ce7ad.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь отрываем вкладку Surfaces -&amp;gt; Loft жмем кубик&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1b5c6.jpg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В открывшемся окне проведем некоторые настройки.&lt;br /&gt;
Движок Sections spans отвечает за количество разбиений, не переборщите, потом тяжелее будет все это приводить в порядок. Для дороги (и.т.п.) я использую 2. Ставим в окне циферу 2 и жмем  Loft. Должно получиться примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/95536.jpg&lt;br /&gt;
&lt;br /&gt;
Сразу отметим, что в окне outliner, появился новый объект LoftedSurface1, переименуем его в road, щелкнем в окне Outliner на сей объект, и пропишем ему новое имя. В дальнейшем при наполнении локации корректное имя объекта здорово облегчит жизнь.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/8b2ae.jpg&lt;br /&gt;
&lt;br /&gt;
Так. Дорогу создали, теперь создадим все остальное , что дорогу окружает.&lt;br /&gt;
Тобиш землю, по которой эта дорога проложена.&lt;br /&gt;
Для этого создадим еще 2 кривые, только теперь в настройках CV Curve tool  поменяем Curve degree  с cubic  на linear.&lt;br /&gt;
 Включаем привязку к сетке и строим две вертикальные кривые по линиям нашей ранее созданной плоскости.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/b179f.jpg&lt;br /&gt;
Сразу отмечу то, что чем больше точек в линии, тем больше будет разбиений , и тем больше в итоге получится поликов. Тут уж на глаз. &lt;br /&gt;
Все жмем enter дублируем нашу линию ctrl+D и инструментом move перемещаем на противоположную сторону.&lt;br /&gt;
Теперь плоскость NurmbsPlane  нам больше не нужна, удалим ее. В окне Outliner выделим ее и нажмем клавишу del.&lt;br /&gt;
Вот что должно получиться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/1e657.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь сформируем новые плоскости. Для этого в окне Outliner выбираем Curve1&amp;amp;curve3 жмем surfaces -&amp;gt; loft  и кубик рядом, экспериментируя с настройками, добиваемся боле менее нормального варианта разбиения, у меня получилось так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/4b564.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь выбираем кривые 2 и 4 и проделываем то же самое.&lt;br /&gt;
Выглядеть должно примерно так.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/e514b.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь все кривые можно удалить. В окне выбираем все 4 и мочим их.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/82a2d.jpg&lt;br /&gt;
&lt;br /&gt;
Ну, вот что-то похожее на истину у нас получилось, теперь все это безобразие нужно конвертировать в полигональные объекты. Выбираем наш road, лезем во вкладку Modify -&amp;gt; convert -&amp;gt; Nurmbs to Poligon  жмем кубик&lt;br /&gt;
В открывшемся окне делаем настройки. С разу скажу, что лучше разбивать на треугольники, а не на кубики. Т.к. Повороты будут плавне и с числом полигонов count  при разбиении придется экспериментировать, до получения оптимального варианта. Я взял 400.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/08ca0.jpg&lt;br /&gt;
&lt;br /&gt;
Жмем apply, получаем результат.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/00be4.jpg&lt;br /&gt;
Обратите внимание на то что в окне Outliner появился новый объект, переименуем его все в тот же road, а исходный можно удалить.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/43094.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь по такой же схеме проделываем фокусы с оставшимися объектами, у меня получилось вот так.&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/df4cd.jpg&lt;br /&gt;
&lt;br /&gt;
Теперь оставим дорогу в покое, а две половинки нашей земли склеим в единый меш.&lt;br /&gt;
В окне Outliner выбираем их, переходим в режим редактирования полигонов (под вкладками file edit) заходим &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://img.gameru.net/img/127df.jpg&lt;br /&gt;
Получим склеенный меш. &lt;br /&gt;
Теперь можно заниматься самим ландшафтом, холмами, долами и.т.п. .&lt;br /&gt;
Потом наносим материалы, собираем в единый меш и экспортим.&lt;br /&gt;
Вроде усе. &lt;br /&gt;
Authors: '''ZVUKARb'''&lt;br /&gt;
Из Word в Wiki: '''Oxygenium'''&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%82%D0%B0%D1%81%D0%BA%D0%B0%D1%82%D1%8C_%D1%82%D1%80%D1%83%D0%BF%D1%8B_%D0%B8_%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B</id>
		<title>CoP. Добавляем возможность таскать трупы и другие динамические объекты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%82%D0%B0%D1%81%D0%BA%D0%B0%D1%82%D1%8C_%D1%82%D1%80%D1%83%D0%BF%D1%8B_%D0%B8_%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B"/>
				<updated>2010-07-01T11:50:22Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Привет всем.В этой статье я напишу, как вернуть таскание трупов и объектов в STALKER CoP, не понятно зачем убранное ПЫСами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Уровень слжности:очень легко., не обращайте внимания на длину тутора, тут вам только копипастить придется)&amp;lt;br&amp;gt;&lt;br /&gt;
Автор:sk0rpi0n'''&amp;lt;br&amp;gt;&lt;br /&gt;
Открываем configs/system.ltx, идем в конец файла, ищем строку '''[ph_capture_visuals]'''.Под ней - все, что нам нужно, а точнее:&lt;br /&gt;
&amp;lt;code&amp;gt;;NPC&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_1&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_2&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_face_1&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_face_2&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_mask&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_4&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_1&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_face_1&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_face_2&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_mask&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_3&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_4&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_1&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_face_1&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_face_2&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_mask&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_3&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_4&lt;br /&gt;
;actors\stalker_hero\stalker_hero_1&lt;br /&gt;
;actors\stalker_hero\stalker_hero_stc_strelok&lt;br /&gt;
;actors\stalker_lesnik\stalker_lesnik_1&lt;br /&gt;
;actors\stalker_merc\stalker_merc_2&lt;br /&gt;
;actors\stalker_merc\stalker_merc_4&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_1&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_2&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_3&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_4&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_1&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_1&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_2&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_3&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_mask&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_3&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_1&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_face_1&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_face_2&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_mask&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_3&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_4&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_1&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_2&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_2_face_1&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_3&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_4&lt;br /&gt;
;actors\stalker_trader\stalker_trader_1&lt;br /&gt;
;actors\stalker_ucheniy\stalker_ucheniy_1&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_1&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_2&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_3&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_4&lt;br /&gt;
&lt;br /&gt;
;Monsters&lt;br /&gt;
;monsters\controller\controller_1&lt;br /&gt;
;monsters\controller\controller_2&lt;br /&gt;
;monsters\controller\controller_3&lt;br /&gt;
;monsters\controller\controller_4&lt;br /&gt;
;monsters\controller\controller_dead&lt;br /&gt;
;monsters\crow\crow&lt;br /&gt;
;monsters\dog\dog&lt;br /&gt;
;monsters\dog\dog_bulterier&lt;br /&gt;
;monsters\dog\dog_bulterier_dead&lt;br /&gt;
;monsters\dog\dog_dead&lt;br /&gt;
;monsters\dog\dog_red&lt;br /&gt;
;monsters\dog\dog_red_dead&lt;br /&gt;
;monsters\dog\dog_white&lt;br /&gt;
;monsters\dog\dog_white_dead&lt;br /&gt;
;monsters\flesh\flesh&lt;br /&gt;
;monsters\flesh\flesh_dead&lt;br /&gt;
;monsters\flesh\flesh_strong&lt;br /&gt;
;monsters\krovosos\krovosos&lt;br /&gt;
;monsters\krovosos\krovosos_dead&lt;br /&gt;
;monsters\krovosos\krovosos_strong&lt;br /&gt;
;monsters\krovosos\krovosos_strong_xray&lt;br /&gt;
;monsters\krovosos\krovosos_xray&lt;br /&gt;
;monsters\mutant_boar\mutant_boar&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_dead&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_strong&lt;br /&gt;
;monsters\poltergeist\poltergeist&lt;br /&gt;
;monsters\poltergeist\poltergeist_dead&lt;br /&gt;
;monsters\poltergeist\poltergeist_strong&lt;br /&gt;
;monsters\pseudodog\pseudodog&lt;br /&gt;
;monsters\pseudodog\pseudodog_dead&lt;br /&gt;
;monsters\pseudodog\pseudodog_grey&lt;br /&gt;
;monsters\pseudodog\pseudodog_grey_dead&lt;br /&gt;
;monsters\rat\rat_1&lt;br /&gt;
;monsters\snork\snork&lt;br /&gt;
;monsters\snork\snork_dead&lt;br /&gt;
;monsters\tushkano\tushkano&lt;br /&gt;
;monsters\tushkano\tushkano_dead&amp;lt;/code&amp;gt;&lt;br /&gt;
Все строки, помеченные точкой с запятой &amp;quot;;&amp;quot; - не используются игрой.Следовательно, нам надо их убрать.Заменим верхний текст на этот:&lt;br /&gt;
&amp;lt;code&amp;gt;;NPC&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_1&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_2&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_face_1&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_face_2&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_mask&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_4&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_1&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_face_1&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_face_2&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_mask&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_3&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_4&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_1&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_face_1&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_face_2&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_mask&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_3&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_4&lt;br /&gt;
actors\stalker_hero\stalker_hero_1&lt;br /&gt;
actors\stalker_hero\stalker_hero_stc_strelok&lt;br /&gt;
actors\stalker_lesnik\stalker_lesnik_1&lt;br /&gt;
actors\stalker_merc\stalker_merc_2&lt;br /&gt;
actors\stalker_merc\stalker_merc_4&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_1&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_2&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_3&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_4&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_1&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_1&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_2&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_3&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_mask&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_3&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_1&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_face_1&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_face_2&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_mask&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_3&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_4&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_1&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_2&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_2_face_1&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_3&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_4&lt;br /&gt;
actors\stalker_trader\stalker_trader_1&lt;br /&gt;
actors\stalker_ucheniy\stalker_ucheniy_1&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_1&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_2&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_3&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_4&lt;br /&gt;
&lt;br /&gt;
;Monsters&lt;br /&gt;
;monsters\controller\controller_1&lt;br /&gt;
;monsters\controller\controller_2&lt;br /&gt;
;monsters\controller\controller_3&lt;br /&gt;
;monsters\controller\controller_4&lt;br /&gt;
;monsters\controller\controller_dead&lt;br /&gt;
;monsters\crow\crow&lt;br /&gt;
monsters\dog\dog&lt;br /&gt;
monsters\dog\dog_bulterier&lt;br /&gt;
monsters\dog\dog_bulterier_dead&lt;br /&gt;
monsters\dog\dog_dead&lt;br /&gt;
monsters\dog\dog_red&lt;br /&gt;
monsters\dog\dog_red_dead&lt;br /&gt;
monsters\dog\dog_white&lt;br /&gt;
monsters\dog\dog_white_dead&lt;br /&gt;
;monsters\flesh\flesh&lt;br /&gt;
;monsters\flesh\flesh_dead&lt;br /&gt;
;monsters\flesh\flesh_strong&lt;br /&gt;
monsters\krovosos\krovosos&lt;br /&gt;
monsters\krovosos\krovosos_dead&lt;br /&gt;
monsters\krovosos\krovosos_strong&lt;br /&gt;
monsters\krovosos\krovosos_strong_xray&lt;br /&gt;
monsters\krovosos\krovosos_xray&lt;br /&gt;
;monsters\mutant_boar\mutant_boar&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_dead&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_strong&lt;br /&gt;
;monsters\poltergeist\poltergeist&lt;br /&gt;
;monsters\poltergeist\poltergeist_dead&lt;br /&gt;
;monsters\poltergeist\poltergeist_strong&lt;br /&gt;
monsters\pseudodog\pseudodog&lt;br /&gt;
monsters\pseudodog\pseudodog_dead&lt;br /&gt;
monsters\pseudodog\pseudodog_grey&lt;br /&gt;
monsters\pseudodog\pseudodog_grey_dead&lt;br /&gt;
;monsters\rat\rat_1&lt;br /&gt;
;monsters\snork\snork&lt;br /&gt;
;monsters\snork\snork_dead&lt;br /&gt;
;monsters\tushkano\tushkano&lt;br /&gt;
;monsters\tushkano\tushkano_dead&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отлично!Теперь можно таскать трупы монстрюг и пиплов.&lt;br /&gt;
Рассмотрим таскание остальных объектов.&lt;br /&gt;
Вы можете добавить почти любую модель из папки meshes, кроме:&lt;br /&gt;
static models(статичные модели) - их невозможно никак сдвинуть в игре.&lt;br /&gt;
Пример добавления модели, пишем это после конца списка моделей монстров(модель взял от балды, лучше не пробуйте с этой моделью):&lt;br /&gt;
&amp;lt;code&amp;gt;;Other models&lt;br /&gt;
dynamics\balon\bochka_fuel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот и все.)&lt;br /&gt;
[[Категория:Конфиги]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%82%D0%B0%D1%81%D0%BA%D0%B0%D1%82%D1%8C_%D1%82%D1%80%D1%83%D0%BF%D1%8B_%D0%B8_%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B</id>
		<title>CoP. Добавляем возможность таскать трупы и другие динамические объекты</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=CoP._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%82%D0%B0%D1%81%D0%BA%D0%B0%D1%82%D1%8C_%D1%82%D1%80%D1%83%D0%BF%D1%8B_%D0%B8_%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B"/>
				<updated>2010-07-01T11:50:14Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Привет всем.В этой статье я напишу, как вернуть таскание трупов и объектов в STALKER CoP, не понятно зачем убранное ПЫСами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Уровень слжности:очень легко., не обращайте внимания на длину тутора, тут вам только копипастить придется)&amp;lt;br&amp;gt;&lt;br /&gt;
Автор:sk0rpi0n'''&amp;lt;br&amp;gt;&lt;br /&gt;
Открываем configs/system.ltx, идем в конец файла, ищем строку '''[ph_capture_visuals]'''.Под ней - все, что нам нужно, а точнее:&lt;br /&gt;
&amp;lt;code&amp;gt;;NPC&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_1&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_2&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_face_1&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_face_2&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_3_mask&lt;br /&gt;
;actors\stalker_bandit\stalker_bandit_4&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_1&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_face_1&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_face_2&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_2_mask&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_3&lt;br /&gt;
;actors\stalker_dolg\stalker_dolg_4&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_1&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_face_1&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_face_2&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_2_mask&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_3&lt;br /&gt;
;actors\stalker_freedom\stalker_freedom_4&lt;br /&gt;
;actors\stalker_hero\stalker_hero_1&lt;br /&gt;
;actors\stalker_hero\stalker_hero_stc_strelok&lt;br /&gt;
;actors\stalker_lesnik\stalker_lesnik_1&lt;br /&gt;
;actors\stalker_merc\stalker_merc_2&lt;br /&gt;
;actors\stalker_merc\stalker_merc_4&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_1&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_2&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_3&lt;br /&gt;
;actors\stalker_monolith\stalker_monolith_4&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_1&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_1&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_2&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_face_3&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_2_mask&lt;br /&gt;
;actors\stalker_nebo\stalker_nebo_3&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_1&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_face_1&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_face_2&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_2_mask&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_3&lt;br /&gt;
;actors\stalker_neutral\stalker_neutral_4&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_1&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_2&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_2_face_1&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_3&lt;br /&gt;
;actors\stalker_soldier\stalker_soldier_4&lt;br /&gt;
;actors\stalker_trader\stalker_trader_1&lt;br /&gt;
;actors\stalker_ucheniy\stalker_ucheniy_1&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_1&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_2&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_3&lt;br /&gt;
;actors\stalker_zombied\stalker_zombied_4&lt;br /&gt;
&lt;br /&gt;
;Monsters&lt;br /&gt;
;monsters\controller\controller_1&lt;br /&gt;
;monsters\controller\controller_2&lt;br /&gt;
;monsters\controller\controller_3&lt;br /&gt;
;monsters\controller\controller_4&lt;br /&gt;
;monsters\controller\controller_dead&lt;br /&gt;
;monsters\crow\crow&lt;br /&gt;
;monsters\dog\dog&lt;br /&gt;
;monsters\dog\dog_bulterier&lt;br /&gt;
;monsters\dog\dog_bulterier_dead&lt;br /&gt;
;monsters\dog\dog_dead&lt;br /&gt;
;monsters\dog\dog_red&lt;br /&gt;
;monsters\dog\dog_red_dead&lt;br /&gt;
;monsters\dog\dog_white&lt;br /&gt;
;monsters\dog\dog_white_dead&lt;br /&gt;
;monsters\flesh\flesh&lt;br /&gt;
;monsters\flesh\flesh_dead&lt;br /&gt;
;monsters\flesh\flesh_strong&lt;br /&gt;
;monsters\krovosos\krovosos&lt;br /&gt;
;monsters\krovosos\krovosos_dead&lt;br /&gt;
;monsters\krovosos\krovosos_strong&lt;br /&gt;
;monsters\krovosos\krovosos_strong_xray&lt;br /&gt;
;monsters\krovosos\krovosos_xray&lt;br /&gt;
;monsters\mutant_boar\mutant_boar&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_dead&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_strong&lt;br /&gt;
;monsters\poltergeist\poltergeist&lt;br /&gt;
;monsters\poltergeist\poltergeist_dead&lt;br /&gt;
;monsters\poltergeist\poltergeist_strong&lt;br /&gt;
;monsters\pseudodog\pseudodog&lt;br /&gt;
;monsters\pseudodog\pseudodog_dead&lt;br /&gt;
;monsters\pseudodog\pseudodog_grey&lt;br /&gt;
;monsters\pseudodog\pseudodog_grey_dead&lt;br /&gt;
;monsters\rat\rat_1&lt;br /&gt;
;monsters\snork\snork&lt;br /&gt;
;monsters\snork\snork_dead&lt;br /&gt;
;monsters\tushkano\tushkano&lt;br /&gt;
;monsters\tushkano\tushkano_dead&amp;lt;/code&amp;gt;&lt;br /&gt;
Все строки, помеченные точкой с запятой &amp;quot;;&amp;quot; - не используются игрой.Следовательно, нам надо их убрать.Заменим верхний текст на этот:&lt;br /&gt;
&amp;lt;code&amp;gt;;NPC&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_1&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_2&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_face_1&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_face_2&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_3_mask&lt;br /&gt;
actors\stalker_bandit\stalker_bandit_4&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_1&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_face_1&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_face_2&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_2_mask&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_3&lt;br /&gt;
actors\stalker_dolg\stalker_dolg_4&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_1&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_face_1&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_face_2&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_2_mask&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_3&lt;br /&gt;
actors\stalker_freedom\stalker_freedom_4&lt;br /&gt;
actors\stalker_hero\stalker_hero_1&lt;br /&gt;
actors\stalker_hero\stalker_hero_stc_strelok&lt;br /&gt;
actors\stalker_lesnik\stalker_lesnik_1&lt;br /&gt;
actors\stalker_merc\stalker_merc_2&lt;br /&gt;
actors\stalker_merc\stalker_merc_4&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_1&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_2&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_3&lt;br /&gt;
actors\stalker_monolith\stalker_monolith_4&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_1&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_1&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_2&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_face_3&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_2_mask&lt;br /&gt;
actors\stalker_nebo\stalker_nebo_3&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_1&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_face_1&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_face_2&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_2_mask&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_3&lt;br /&gt;
actors\stalker_neutral\stalker_neutral_4&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_1&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_2&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_2_face_1&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_3&lt;br /&gt;
actors\stalker_soldier\stalker_soldier_4&lt;br /&gt;
actors\stalker_trader\stalker_trader_1&lt;br /&gt;
actors\stalker_ucheniy\stalker_ucheniy_1&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_1&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_2&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_3&lt;br /&gt;
actors\stalker_zombied\stalker_zombied_4&lt;br /&gt;
&lt;br /&gt;
;Monsters&lt;br /&gt;
;monsters\controller\controller_1&lt;br /&gt;
;monsters\controller\controller_2&lt;br /&gt;
;monsters\controller\controller_3&lt;br /&gt;
;monsters\controller\controller_4&lt;br /&gt;
;monsters\controller\controller_dead&lt;br /&gt;
;monsters\crow\crow&lt;br /&gt;
monsters\dog\dog&lt;br /&gt;
monsters\dog\dog_bulterier&lt;br /&gt;
monsters\dog\dog_bulterier_dead&lt;br /&gt;
monsters\dog\dog_dead&lt;br /&gt;
monsters\dog\dog_red&lt;br /&gt;
monsters\dog\dog_red_dead&lt;br /&gt;
monsters\dog\dog_white&lt;br /&gt;
monsters\dog\dog_white_dead&lt;br /&gt;
;monsters\flesh\flesh&lt;br /&gt;
;monsters\flesh\flesh_dead&lt;br /&gt;
;monsters\flesh\flesh_strong&lt;br /&gt;
monsters\krovosos\krovosos&lt;br /&gt;
monsters\krovosos\krovosos_dead&lt;br /&gt;
monsters\krovosos\krovosos_strong&lt;br /&gt;
monsters\krovosos\krovosos_strong_xray&lt;br /&gt;
monsters\krovosos\krovosos_xray&lt;br /&gt;
;monsters\mutant_boar\mutant_boar&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_dead&lt;br /&gt;
;monsters\mutant_boar\mutant_boar_strong&lt;br /&gt;
;monsters\poltergeist\poltergeist&lt;br /&gt;
;monsters\poltergeist\poltergeist_dead&lt;br /&gt;
;monsters\poltergeist\poltergeist_strong&lt;br /&gt;
monsters\pseudodog\pseudodog&lt;br /&gt;
monsters\pseudodog\pseudodog_dead&lt;br /&gt;
monsters\pseudodog\pseudodog_grey&lt;br /&gt;
monsters\pseudodog\pseudodog_grey_dead&lt;br /&gt;
;monsters\rat\rat_1&lt;br /&gt;
;monsters\snork\snork&lt;br /&gt;
;monsters\snork\snork_dead&lt;br /&gt;
;monsters\tushkano\tushkano&lt;br /&gt;
;monsters\tushkano\tushkano_dead&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отлично!Теперь можно таскать трупы монстрюг и пиплов.&lt;br /&gt;
Рассмотрим таскание остальных объектов.&lt;br /&gt;
Вы можете добавить почти любую модель из папки meshes, кроме:&lt;br /&gt;
static models(статичные модели) - их невозможно никак сдвинуть в игре.&lt;br /&gt;
Пример добавления модели, пишем это после конца списка моделей монстров(модель взял от балды, лучше не пробуйте с этой моделью):&lt;br /&gt;
&amp;lt;code&amp;gt;;Other models&lt;br /&gt;
dynamics\balon\bochka_fuel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот и все.)&lt;br /&gt;
[[Категория:Конфиги«»]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2</id>
		<title>SoC. Снятие денег с трупов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2"/>
				<updated>2010-07-01T11:48:42Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В етой теме я напишу как сделать так что б можна было снимать деньги с трупов.&lt;br /&gt;
Нам нада файл treasure_manager.script&lt;br /&gt;
В етом файле находим такие строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
После строки --printf(&amp;quot;TREASURE USE&amp;quot;)-- пишем&lt;br /&gt;
&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
У нас далжно выйти&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Типерь создаём файл lootmoney.script&lt;br /&gt;
и в нём пишем &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function lootmoney(npc)&lt;br /&gt;
	if npc ~= nil and not string.find(npc:section(),&amp;quot;arena&amp;quot;) and npc:character_community()~=&amp;quot;arena_enemy&amp;quot; then&lt;br /&gt;
		local money = npc:money()&lt;br /&gt;
		if money ~= nil and money ~=0 then&lt;br /&gt;
				local deadmoney = money&lt;br /&gt;
&lt;br /&gt;
                                local npc_rank&lt;br /&gt;
		npc_rank = ranks.get_obj_rank_name(npc)&lt;br /&gt;
		if npc_rank ~= nil then&lt;br /&gt;
			if npc_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(25,400)    &lt;br /&gt;
			elseif npc_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=500 then deadmoney=math.random(50,500)  &lt;br /&gt;
			elseif npc_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=600 then deadmoney=math.random(100,600) &lt;br /&gt;
			elseif npc_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=700 then deadmoney=math.random(200,700)  &lt;br /&gt;
                          end&lt;br /&gt;
						  end&lt;br /&gt;
				local news_texti = &amp;quot;\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]&amp;quot;..npc:character_name()..&amp;quot;\\n%c[255,255,0,0]Обнаружено денег: %c[default]&amp;quot;..game.translate_string(tostring(deadmoney)..&amp;quot;руб.&amp;quot;)&lt;br /&gt;
				db.actor:give_game_news(news_texti, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,0,83,47), 1, 4000)&lt;br /&gt;
				db.actor:give_money(deadmoney)&lt;br /&gt;
				game_stats.money_quest_update(deadmoney) &lt;br /&gt;
				npc:give_money(-money)&lt;br /&gt;
				game_stats.money_quest_update(-money)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
теперь создаем файл watcher_act.script и впишем в его&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- Red75 (c) 2008&lt;br /&gt;
-- Marauder scheme v 1.1&lt;br /&gt;
-- Part of AMK MOD&lt;br /&gt;
&lt;br /&gt;
evid_see_stuff=6931&lt;br /&gt;
evid_near_stuff=evid_see_stuff+1&lt;br /&gt;
evid_see_body=evid_see_stuff+2&lt;br /&gt;
evid_position_corrected=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
actid_reach_item=evid_see_stuff&lt;br /&gt;
actid_grab_item=evid_see_stuff+1&lt;br /&gt;
actid_grab_body=evid_see_stuff+2&lt;br /&gt;
actid_correct_position=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
-- Вызывает closure раз в period, obj[var] хранит время следующего срабатывания&lt;br /&gt;
function timed(obj,var,period,closure)&lt;br /&gt;
	if obj[var] and obj[var]&amp;lt;time_global() then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
		closure()&lt;br /&gt;
	elseif not obj[var] then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
--		closure()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trigger_timed(obj,var)&lt;br /&gt;
	obj[var]=time_global()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local disabled_objects={}&lt;br /&gt;
&lt;br /&gt;
local corpse_checked={} -- true - has loot, false - hasn't loot, nil - not checked&lt;br /&gt;
&lt;br /&gt;
function checkCorpse(obj)&lt;br /&gt;
	if (IsStalker(obj) or IsMonster(obj)) and obj:alive()==false then&lt;br /&gt;
		if corpse_checked[obj:id()]~=nil then&lt;br /&gt;
			return corpse_checked[obj:id()]&lt;br /&gt;
		end&lt;br /&gt;
		local cnt=0&lt;br /&gt;
		obj:iterate_inventory(function (dummy, item)&lt;br /&gt;
        if item:section()~=&amp;quot;bolt&amp;quot; then&lt;br /&gt;
          cnt=cnt+1&lt;br /&gt;
        end&lt;br /&gt;
			end, nil)&lt;br /&gt;
		corpse_checked[obj:id()]=cnt&amp;gt;0&lt;br /&gt;
		return corpse_checked[obj:id()]&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local valuable_clsid={&lt;br /&gt;
    [clsid.art_bast_artefact]=true,&lt;br /&gt;
    [clsid.art_black_drops]=true,&lt;br /&gt;
    [clsid.art_dummy]=true,&lt;br /&gt;
    [clsid.art_electric_ball]=true,&lt;br /&gt;
    [clsid.art_faded_ball]=true,&lt;br /&gt;
    [clsid.art_galantine]=true,&lt;br /&gt;
    [clsid.art_gravi]=true,&lt;br /&gt;
    [clsid.art_gravi_black]=true,&lt;br /&gt;
    [clsid.art_mercury_ball]=true,&lt;br /&gt;
    [clsid.art_needles]=true,&lt;br /&gt;
    [clsid.art_rusty_hair]=true,&lt;br /&gt;
    [clsid.art_thorn]=true,&lt;br /&gt;
    [clsid.art_zuda]=true,&lt;br /&gt;
    [clsid.artefact_s]=true,&lt;br /&gt;
    [clsid.device_detector_simple]=true,&lt;br /&gt;
    [clsid.device_pda]=true,&lt;br /&gt;
    [clsid.device_torch_s]=true,&lt;br /&gt;
    [clsid.equ_exo]=true,&lt;br /&gt;
    [clsid.equ_military]=true,&lt;br /&gt;
    [clsid.equ_scientific]=true,&lt;br /&gt;
    [clsid.equ_stalker_s]=true,&lt;br /&gt;
    [clsid.obj_antirad]=true,&lt;br /&gt;
    [clsid.obj_attachable]=true,&lt;br /&gt;
    [clsid.obj_bandage]=true,&lt;br /&gt;
    [clsid.obj_bolt]=true,&lt;br /&gt;
    [clsid.obj_bottle]=true,&lt;br /&gt;
    [clsid.obj_food]=true,&lt;br /&gt;
    [clsid.obj_medkit]=true,&lt;br /&gt;
    [clsid.wpn_ak74_s]=true,&lt;br /&gt;
    [clsid.wpn_ammo]=true,&lt;br /&gt;
    [clsid.wpn_ammo_m209]=true,&lt;br /&gt;
    [clsid.wpn_ammo_og7b]=true,&lt;br /&gt;
    [clsid.wpn_ammo_vog25]=true,&lt;br /&gt;
    [clsid.wpn_binocular_s]=true,&lt;br /&gt;
    [clsid.wpn_bm16_s]=true,&lt;br /&gt;
    [clsid.wpn_fn2000]=true,&lt;br /&gt;
    [clsid.wpn_fort]=true,&lt;br /&gt;
    [clsid.wpn_groza_s]=true,&lt;br /&gt;
    [clsid.wpn_hpsa_s]=true,&lt;br /&gt;
    [clsid.wpn_knife_s]=true,&lt;br /&gt;
    [clsid.wpn_lr300_s]=true,&lt;br /&gt;
    [clsid.wpn_pm_s]=true,&lt;br /&gt;
    [clsid.wpn_rg6_s]=true,&lt;br /&gt;
    [clsid.wpn_rpg7_s]=true,&lt;br /&gt;
    [clsid.wpn_scope_s]=true,&lt;br /&gt;
    [clsid.wpn_shotgun_s]=true,&lt;br /&gt;
    [clsid.wpn_silencer]=true,&lt;br /&gt;
    [clsid.wpn_svd_s]=true,&lt;br /&gt;
    [clsid.wpn_svu_s]=true,&lt;br /&gt;
    [clsid.wpn_usp45_s]=true,&lt;br /&gt;
    [clsid.wpn_val_s]=true,&lt;br /&gt;
    [clsid.wpn_vintorez_s]=true,&lt;br /&gt;
    [clsid.wpn_walther_s]=true,&lt;br /&gt;
    [clsid.wpn_wmagaz]=true,&lt;br /&gt;
    [clsid.wpn_wmaggl]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj_owner={}&lt;br /&gt;
&lt;br /&gt;
function bgwith(str,ptr)&lt;br /&gt;
	local ps=string.find(str,ptr)&lt;br /&gt;
	return ps~=nil and ps==1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isValuable(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  if sec==&amp;quot;amk_metka&amp;quot; then&lt;br /&gt;
    return false,false&lt;br /&gt;
  end&lt;br /&gt;
	if valuable_clsid[obj:clsid()] then&lt;br /&gt;
		return true, false&lt;br /&gt;
	end&lt;br /&gt;
	return bgwith(sec,&amp;quot;af_&amp;quot;) or bgwith(sec,&amp;quot;ammo_&amp;quot;) or bgwith(sec,&amp;quot;wpn_&amp;quot;) or bgwith(sec,&amp;quot;energy_&amp;quot;) or checkCorpse(obj), IsStalker(obj) or IsMonster(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function objValue(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  local multiplier=1&lt;br /&gt;
  if bgwith(sec,&amp;quot;ammo_&amp;quot;) then&lt;br /&gt;
    multiplier=30&lt;br /&gt;
  elseif sec==&amp;quot;vodka&amp;quot; then&lt;br /&gt;
    multiplier=20&lt;br /&gt;
  end&lt;br /&gt;
	if system_ini():section_exist(sec) and system_ini():line_exist(sec,&amp;quot;cost&amp;quot;) then&lt;br /&gt;
		return system_ini():r_float(sec,&amp;quot;cost&amp;quot;)*multiplier&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function claimGObject(npc,st,obj)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
	end&lt;br /&gt;
	st.grabitemid=obj:id()&lt;br /&gt;
	obj_owner[obj:id()]=npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function freeGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
		st.grabitemid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function clearGObject(st)&lt;br /&gt;
	st.grabitemid=nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		local ret=level.object_by_id(st.grabitemid)&lt;br /&gt;
		if ret==nil then&lt;br /&gt;
			st.grabitemid=nil&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mypGObject(npc,st)&lt;br /&gt;
	return st.grabitemid~=nil and obj_owner[st.grabitemid]~=nil and obj_owner[st.grabitemid]==npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local bad_dangers={&lt;br /&gt;
  [danger_object.hit]=true,&lt;br /&gt;
  [danger_object.attacked]=true,&lt;br /&gt;
  [danger_object.bullet_ricochet]=true,&lt;br /&gt;
  [danger_object.grenade]=true,&lt;br /&gt;
  [danger_object.entity_death]=true,&lt;br /&gt;
  [danger_object.enemy_sound]=true&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
local inertion_time=30000&lt;br /&gt;
&lt;br /&gt;
function bad_danger(npc)&lt;br /&gt;
  local danger=npc:best_danger()&lt;br /&gt;
  if danger then&lt;br /&gt;
    return bad_dangers[danger:type()] and time_global()-danger:time()&amp;lt;inertion_time&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
function ev_see_stuff:evaluate()&lt;br /&gt;
	local res=getGObject(self.st)~=nil&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  local actsch=db.storage[npc:id()].active_scheme&lt;br /&gt;
  if actsch and db.actor then&lt;br /&gt;
    xr_logic.try_switch_to_another_section(npc, db.storage[npc:id()][actsch], db.actor)&lt;br /&gt;
  end&lt;br /&gt;
	local act_sec=db.storage[npc:id()].active_section or &amp;quot;&amp;quot;&lt;br /&gt;
	if (not npc:alive()) or xr_wounded.is_wounded(npc) or npc:best_enemy() or &lt;br /&gt;
      bad_danger(npc) or (actsch and db.storage[npc:id()][actsch].no_loot) then&lt;br /&gt;
		if res then&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; distracted. sect &amp;quot;..act_sec,&amp;quot;grb&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  local dist_limit=1000&lt;br /&gt;
  if bgwith(act_sec,&amp;quot;camper&amp;quot;) then&lt;br /&gt;
    dist_limit=5&lt;br /&gt;
  end&lt;br /&gt;
	local busy=bgwith(act_sec,&amp;quot;walker&amp;quot;) or bgwith(act_sec,&amp;quot;combat&amp;quot;) or bgwith(act_sec,&amp;quot;danger&amp;quot;) -- or npc:best_danger()&lt;br /&gt;
	if res and self.st.block_search then&lt;br /&gt;
	  -- NPC собрался взять вещь. Временно прекратим поиск.&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	timed(self.st,&amp;quot;tm1&amp;quot;,5000+math.random()*10000,&lt;br /&gt;
		function ()&lt;br /&gt;
--			amk.mylog(npc:name() .. &amp;quot; is going to search stuff&amp;quot;,&amp;quot;grb&amp;quot;)&lt;br /&gt;
			local min_dist=100000&lt;br /&gt;
			local function check_item(o)&lt;br /&gt;
				local obj=o:object()&lt;br /&gt;
				if obj_owner[obj:id()] and (level.object_by_id(obj_owner[obj:id()])==nil or level.object_by_id(obj_owner[obj:id()]):alive()==false) then&lt;br /&gt;
					obj_owner[obj:id()]=nil&lt;br /&gt;
				end&lt;br /&gt;
				if (not self.st.disabled_objects[obj:id()]) and (obj:parent()==nil or not IsStalker(obj:parent())) and &lt;br /&gt;
           (obj_owner[obj:id()]==nil or obj_owner[obj:id()]==npc:id()) and npc:accessible(obj:level_vertex_id()) and&lt;br /&gt;
           (db.actor==nil or db.actor:alive()==false or db.actor:position():distance_to_sqr(obj:position())&amp;gt;6) then&lt;br /&gt;
					local valuable,corpse=isValuable(obj)&lt;br /&gt;
					if valuable then &lt;br /&gt;
						local value=3000&lt;br /&gt;
						if not corpse then&lt;br /&gt;
							value=objValue(obj)&lt;br /&gt;
						end&lt;br /&gt;
						if value&amp;lt;=0 then value=0 end&lt;br /&gt;
						local max_dist=5+math.sqrt(value)&lt;br /&gt;
						if busy then&lt;br /&gt;
							max_dist=max_dist/5&lt;br /&gt;
						end&lt;br /&gt;
						local dist=level.vertex_position(obj:level_vertex_id()):distance_to(npc:position())&lt;br /&gt;
            local corrected_dist=dist&lt;br /&gt;
            if dist&amp;gt;5 then&lt;br /&gt;
              corrected_dist=5+(dist-5)/math.sqrt(value)&lt;br /&gt;
            end&lt;br /&gt;
						if dist&amp;lt;max_dist and corrected_dist&amp;lt;min_dist and dist&amp;lt;dist_limit then&lt;br /&gt;
              min_dist=corrected_dist&lt;br /&gt;
							claimGObject(npc,self.st,obj)&lt;br /&gt;
							res=true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end -- function check_item&lt;br /&gt;
			for o in npc:memory_visible_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
			for o in npc:memory_sound_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
--			for o in npc:not_yet_visible_objects() do&lt;br /&gt;
--				check_item(o)&lt;br /&gt;
--			end&lt;br /&gt;
			if res then &lt;br /&gt;
				amk.mylog(npc:name() .. &amp;quot; claimed &amp;quot;..getGObject(self.st):name()..&amp;quot; cact &amp;quot;..tostring(npc:motivation_action_manager():current_action_id()),&amp;quot;grb&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	return res -- false -- res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_near_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if gi then&lt;br /&gt;
    if self.st.dest_lvid then&lt;br /&gt;
      return npc:level_vertex_id()==self.st.dest_lvid&lt;br /&gt;
    end&lt;br /&gt;
    return level.vertex_position(gi:level_vertex_id()):distance_to_sqr(npc:position())&amp;lt;1&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_body&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:__init(st) super(nil, &amp;quot;ev_see_body&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi then&lt;br /&gt;
    return IsStalker(gi) or IsMonster(gi)&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_position_corrected&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:__init(st) super(nil, &amp;quot;ev_position_corrected&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  return self.st.position_corrected==true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	npc:set_item(object.idle,nil)&lt;br /&gt;
	npc:set_movement_type(move.walk)&lt;br /&gt;
	npc:set_mental_state(anim.danger)&lt;br /&gt;
	npc:set_body_state(move.crouch)&lt;br /&gt;
  npc:movement_enabled(true)&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
--	if gi then npc:set_sight(gi,true,true) end&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab item&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
    if(IsStalker(gi) or IsMonster(gi)) then&lt;br /&gt;
  		self.tt=time_global()+3000&lt;br /&gt;
  	else&lt;br /&gt;
  		self.tt=time_global()+1000&lt;br /&gt;
    	utils.send_to_nearest_accessible_vertex(npc,gi:level_vertex_id())&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	end&lt;br /&gt;
	--npc:set_dest_level_vertex_id(1)&lt;br /&gt;
	self.force=vector():set(0,0,0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
			gi:transfer_item(gi,npc)&lt;br /&gt;
			npc:enable_memory_object(gi,false)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_body&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:__init (st) super (nil, &amp;quot;act_grab_body&amp;quot;)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab body&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
 		self.tt=time_global()+6000&lt;br /&gt;
    state_mgr.set_state(npc,&amp;quot;search&amp;quot;,nil,nil,{look_object=gi})&lt;br /&gt;
  else&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
      gi:iterate_inventory(function (d,item)&lt;br /&gt;
          if item:section()~=&amp;quot;bolt&amp;quot; then &lt;br /&gt;
            gi:transfer_item(item,npc)&lt;br /&gt;
          end&lt;br /&gt;
        end, nil)&lt;br /&gt;
		local num=gi:money() &lt;br /&gt;
		if num and num &amp;gt;0 then &lt;br /&gt;
				local deadmoney = num&lt;br /&gt;
				local gi_rank&lt;br /&gt;
		gi_rank = ranks.get_obj_rank_name(gi)&lt;br /&gt;
		if gi_rank ~= nil then&lt;br /&gt;
			if gi_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=100 then deadmoney=math.random(25,100)    &lt;br /&gt;
			elseif gi_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=200 then deadmoney=math.random(50,200)  &lt;br /&gt;
			elseif gi_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=300 then deadmoney=math.random(100,300) &lt;br /&gt;
			elseif gi_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(200,400)  &lt;br /&gt;
		end&lt;br /&gt;
		end&lt;br /&gt;
		npc:give_money(deadmoney) &lt;br /&gt;
		game_stats.money_quest_update(deadmoney) &lt;br /&gt;
		gi:give_money(-num) &lt;br /&gt;
		game_stats.money_quest_update(-num) &lt;br /&gt;
		end&lt;br /&gt;
      corpse_checked[gi:id()]=false&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function correct_position(gi,npc)&lt;br /&gt;
  if IsStalker(gi) then&lt;br /&gt;
    -- Вычисляем вектор разницы между координатами кости и level vertex. Пытаемся найти level vertex наиболее близкий к кости&lt;br /&gt;
    local diff=gi:bone_position(&amp;quot;bip01_head&amp;quot;):sub(level.vertex_position(gi:level_vertex_id()))&lt;br /&gt;
    local len=diff:magnitude()&lt;br /&gt;
    local diffp=vector():set(diff.z,0,-diff.x):mul(0.5)&lt;br /&gt;
    -- Сдвигаем целевую точку вбок, чтобы непись не залазил ногами в труп&lt;br /&gt;
    diff:add(diffp)&lt;br /&gt;
    return npc:vertex_in_direction(gi:level_vertex_id(),diff,len)&lt;br /&gt;
  else&lt;br /&gt;
    return gi:level_vertex_id()&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_reach_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  self.st.dest_lvid=nil&lt;br /&gt;
  self.tgt_lvid=0&lt;br /&gt;
	if gi then&lt;br /&gt;
		if npc:accessible(gi:level_vertex_id()) then&lt;br /&gt;
		  npc:set_detail_path_type(move.curve)&lt;br /&gt;
		  npc:set_path_type(game_object.level_path)&lt;br /&gt;
      if npc:best_danger() and time_global()-npc:best_danger():time()&amp;lt;inertion_time then&lt;br /&gt;
        npc:set_mental_state(anim.danger)&lt;br /&gt;
        npc:set_body_state(move.crouch)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
--        npc:set_sight(gi,true,true)&lt;br /&gt;
      else&lt;br /&gt;
        npc:set_body_state(move.standing)&lt;br /&gt;
        npc:set_mental_state(anim.free)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
      end&lt;br /&gt;
      npc:movement_enabled(true)&lt;br /&gt;
      if npc:best_weapon() and isWeapon(npc:best_weapon()) then&lt;br /&gt;
--        npc:set_item(object.idle,npc:best_weapon())&lt;br /&gt;
      end&lt;br /&gt;
--			npc:set_dest_level_vertex_id(gi:level_vertex_id())&lt;br /&gt;
			npc:set_sight(look.danger,nil,0)&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) --gi:level_vertex_id()&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
		else&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	self.ct=time_global()&lt;br /&gt;
	self.clvid=npc:level_vertex_id()&lt;br /&gt;
  self.st.position_corrected=false&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to reach item&amp;quot;,&amp;quot;stmt&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi and gi:parent()~=nil then&lt;br /&gt;
		-- ГГ забрал вкусность. Можно добавить наезд на ГГ.&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
		freeGObject(self.st)&lt;br /&gt;
	elseif gi then&lt;br /&gt;
		if self.clvid==npc:level_vertex_id() then&lt;br /&gt;
			if time_global()-self.ct&amp;gt;10000 then&lt;br /&gt;
			-- не можем добраться до нняки&lt;br /&gt;
				self.st.disabled_objects[gi:id()]=true&lt;br /&gt;
        self.st.dest_lvid=nil&lt;br /&gt;
				freeGObject(self.st)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			self.clvid=npc:level_vertex_id()&lt;br /&gt;
			self.ct=time_global()&lt;br /&gt;
		end&lt;br /&gt;
    if self.tgt_lvid~=gi:level_vertex_id() then&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) -- gi:level_vertex_id()&lt;br /&gt;
			npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
    end&lt;br /&gt;
				--npc:set_sight(gi)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_to_binder(object, char_ini, scheme, section, st)&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	local npc=object&lt;br /&gt;
	st.disabled_objects={}&lt;br /&gt;
  local manager = object:motivation_action_manager()&lt;br /&gt;
&lt;br /&gt;
  local zombi=npc:character_community()==&amp;quot;zombied&amp;quot; or npc:character_community()==&amp;quot;trader&amp;quot; or&lt;br /&gt;
          npc:character_community()==&amp;quot;arena_enemy&amp;quot; or npc:name()==&amp;quot;mil_stalker0012&amp;quot; or npc:name()==&amp;quot;yantar_ecolog_general&amp;quot; or -- сумашедший на милитари и Сахаров&lt;br /&gt;
          npc:name()==&amp;quot;mil_freedom_member0021&amp;quot; -- Скрягу в зомби!&lt;br /&gt;
	&lt;br /&gt;
	local prop_idlecombat=xr_evaluators_id.state_mgr + 3&lt;br /&gt;
  local prop_contact=xr_evaluators_id.stohe_meet_base + 1&lt;br /&gt;
  -- Evaluators&lt;br /&gt;
	if npc:story_id()~=4294967296 or zombi then&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, property_evaluator_const(false))&lt;br /&gt;
	else&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, ev_see_stuff(st,&amp;quot;ev_see_stuff&amp;quot;))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, ev_see_body(st))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, ev_position_corrected(st))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, ev_near_stuff(st,&amp;quot;ev_near_stuff&amp;quot;))&lt;br /&gt;
	  -- Actions&lt;br /&gt;
	  local action = act_grab_item(&amp;quot;act_grab_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true)) -- отключим стэйт менеджер&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,true)) -- для переключения на обыск трупа&lt;br /&gt;
	  manager:add_action (actid_grab_item, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_grab_body(st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
--	  action:add_precondition(world_property(evid_position_corrected,true))&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,false)) -- переключаемся на подъём вещички&lt;br /&gt;
	  manager:add_action (actid_grab_body, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_reach_item(&amp;quot;act_reach_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_contact,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true))&lt;br /&gt;
	  action:add_effect (world_property(evid_near_stuff, true))&lt;br /&gt;
	  manager:add_action (actid_reach_item, action)&lt;br /&gt;
		&lt;br /&gt;
	  action = manager:action(xr_actions_id.alife) &lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
    action = manager:action(stalker_ids.action_danger_planner)&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--    action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 3) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
		&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_meet_base+1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))	&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb end &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_scheme(npc, ini, scheme, section)&lt;br /&gt;
--	amk.mylog(&amp;quot;set scheme &amp;quot;..npc:name()..&amp;quot; story_id &amp;quot;..npc:story_id(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
  local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)&lt;br /&gt;
  st.ini=ini&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Теперь осталось содать скрипт amk.script --у кого есть ненадо--&lt;br /&gt;
и вписываем в него&lt;br /&gt;
&lt;br /&gt;
local npc_spawner={}  --служебный массив, работает автоматически - не трогать шаловливыми русками&lt;br /&gt;
&lt;br /&gt;
local timers={}   --хранит реал-тайм таймеры&lt;br /&gt;
local g_timers={} --хранит таймеры в игровом времени&lt;br /&gt;
local markers={}  --хранит маркеры на карте&lt;br /&gt;
local x_objs={}     --хранит ИДшники объектов&lt;br /&gt;
local timer_trigger=nil&lt;br /&gt;
convert_npc={}&lt;br /&gt;
g_kick=false&lt;br /&gt;
&lt;br /&gt;
is_debug = false&lt;br /&gt;
ver = &amp;quot;0&amp;quot;&lt;br /&gt;
oau_watchdog=0&lt;br /&gt;
oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
--переменные для типсов&lt;br /&gt;
pda_news = xr_sound.get_safe_sound_object([[device\pda\pda_news]])&lt;br /&gt;
pda_tips = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])&lt;br /&gt;
pda_task = xr_sound.get_safe_sound_object([[device\pda\pda_objective]])&lt;br /&gt;
&lt;br /&gt;
tips_icons = {&lt;br /&gt;
  default  = { 0, 658},&lt;br /&gt;
  trader   = { 332, 893},&lt;br /&gt;
  dolg     = { 0, 658},&lt;br /&gt;
  freedom  = { 0, 658},&lt;br /&gt;
  ecolog   = { 498, 0},&lt;br /&gt;
  arena    = { 332, 141},&lt;br /&gt;
  stalker  = { 0, 658},&lt;br /&gt;
  krot     = { 332, 47},&lt;br /&gt;
  barman   = { 332, 235},&lt;br /&gt;
  wolf   = { 332, 940},&lt;br /&gt;
  o_soznanie = { 498, 893},&lt;br /&gt;
  monolith = { 0, 658},&lt;br /&gt;
    saharov  = { 332, 470},&lt;br /&gt;
    prizrak  = { 0, 658},&lt;br /&gt;
    killer   = { 0, 658},&lt;br /&gt;
  death     = { 0, 752},&lt;br /&gt;
  gen_info  = { 0, 658},&lt;br /&gt;
	trade 		= { 0, 0},&lt;br /&gt;
  uniq  =  {  498, 47}    --{ 498, 188}&lt;br /&gt;
}&lt;br /&gt;
----------------&lt;br /&gt;
local bufferedmessages={}&lt;br /&gt;
&lt;br /&gt;
function logct(msg,tag)&lt;br /&gt;
	if true and (tag and (tag==&amp;quot;mcbt&amp;quot; or tag==&amp;quot;temp&amp;quot;)) then --(tag==&amp;quot;dram&amp;quot;)) then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))		&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rep(npc,msg,tag)&lt;br /&gt;
	if string.find(npc:name(),&amp;quot;gar_dm&amp;quot;) then&lt;br /&gt;
		logct(msg,tag)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mylog(msg)&lt;br /&gt;
  if is_debug then &lt;br /&gt;
	  if msg==nil then&lt;br /&gt;
	    return &lt;br /&gt;
	  end&lt;br /&gt;
	  if db and db.actor then&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      for k,v in ipairs(bufferedmessages) do&lt;br /&gt;
	        db.actor:give_game_news(v, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	      end&lt;br /&gt;
	      bufferedmessages=nil&lt;br /&gt;
	    end&lt;br /&gt;
	  db.actor:give_game_news(msg, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	  else&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      table.insert(bufferedmessages,msg)&lt;br /&gt;
	    end&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	  if get_console() then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))&lt;br /&gt;
	    get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--показываем типс&lt;br /&gt;
function send_tip(news_text, header, timeout, showtime, sender, sound)&lt;br /&gt;
  if news_text==nil then return end&lt;br /&gt;
  if header==nil then header=game.translate_string(&amp;quot;st_tip&amp;quot;) end&lt;br /&gt;
  if timeout == nil then timeout = 0 end&lt;br /&gt;
  if showtime == nil then showtime = 5 end&lt;br /&gt;
  &lt;br /&gt;
  local player&lt;br /&gt;
  if sound==&amp;quot;news&amp;quot; then&lt;br /&gt;
    player=pda_news&lt;br /&gt;
  elseif sound==&amp;quot;task&amp;quot; then&lt;br /&gt;
    player=pda_task&lt;br /&gt;
  else&lt;br /&gt;
    player=pda_tips&lt;br /&gt;
  end   &lt;br /&gt;
  &lt;br /&gt;
  --' Играем дефолтный звук&lt;br /&gt;
  player:play(db.actor, timeout, sound_object.s2d)&lt;br /&gt;
  &lt;br /&gt;
  if sender == nil then&lt;br /&gt;
    sender = &amp;quot;default&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
  local x = tips_icons[sender][1]&lt;br /&gt;
  local y = tips_icons[sender][2]&lt;br /&gt;
  &lt;br /&gt;
  local news_text = &amp;quot;%c[255,160,160,160]&amp;quot;..header..&amp;quot;\\n&amp;quot;..&amp;quot;%c[default]&amp;quot;..news_text&lt;br /&gt;
  db.actor:give_game_news(news_text, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(x,y,83,47), timeout*1000, showtime*1000)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_spot_on_map(obj_id,type,text)&lt;br /&gt;
  --возможные типы type смотри в ui\map_spots.xml &lt;br /&gt;
  if obj_id then&lt;br /&gt;
    if text==nil then text=&amp;quot; &amp;quot; end&lt;br /&gt;
    -- Ставим метку на серверный объект чтобы её не пришлось обновлять&lt;br /&gt;
    level.map_add_object_spot_ser(obj_id, type, text)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id, type)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id, text)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function remove_spot_from_map(obj_id,type)&lt;br /&gt;
  if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then&lt;br /&gt;
    level.map_remove_object_spot(obj_id, type)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в реальном времени&lt;br /&gt;
function start_timer(name,delay,action)&lt;br /&gt;
  if not delay then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if not action then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;xt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;xt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;xd&amp;quot;..a, time+delay*1000*system_ini():r_float(&amp;quot;alife&amp;quot;,&amp;quot;time_factor&amp;quot;))&lt;br /&gt;
  save_variable(&amp;quot;xp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в игровом времени&lt;br /&gt;
function g_start_timer(name,delay_d,delay_h,delay_m,action)&lt;br /&gt;
    local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  if delay_d==nil or delay_h==nil or delay_m==nil then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if action==nil then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;gt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  save_variable(&amp;quot;gt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;gd&amp;quot;..a, time+delay_d*60*24+delay_h*60+delay_m)&lt;br /&gt;
  save_variable(&amp;quot;gp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_g_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Временное хранилище для переменных удалённых из pstor&lt;br /&gt;
local emerg_store&lt;br /&gt;
-- Удаляем переменные из pstor. Чтобы не переполнить буфер&lt;br /&gt;
function emergency_cleanup()&lt;br /&gt;
  emerg_store={}&lt;br /&gt;
  if load_variable(&amp;quot;zombied&amp;quot;,false) then&lt;br /&gt;
    emerg_store.zombied=load_table(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
    del_variable(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  for i=1,100,1 do&lt;br /&gt;
    if load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
      emerg_store[i]={}&lt;br /&gt;
      emerg_store[i].gt=load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gd=load_variable(&amp;quot;gd&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gp=load_variable(&amp;quot;gp&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      del_variable(&amp;quot;gt&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gd&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gp&amp;quot;..i)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;emerg&amp;quot;,true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Восстанавливаем удалённые переменные&lt;br /&gt;
function emergency_restore()&lt;br /&gt;
  for k,v in pairs(emerg_store) do&lt;br /&gt;
    if k==&amp;quot;zombied&amp;quot; then&lt;br /&gt;
      save_table(k,v)&lt;br /&gt;
    else&lt;br /&gt;
      save_variable(&amp;quot;gt&amp;quot;..k,v.gt)&lt;br /&gt;
      save_variable(&amp;quot;gd&amp;quot;..k,v.gd)&lt;br /&gt;
      save_variable(&amp;quot;gp&amp;quot;..k,v.gp)      &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  del_variable(&amp;quot;emerg&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function convert_timers()&lt;br /&gt;
  if load_variable(&amp;quot;tmcv&amp;quot;,true) then&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_timer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;xt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;xd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;xp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_gtimer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;gt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;gd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;gp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    save_variable(&amp;quot;tmcv&amp;quot;,false)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--проверка таймеров, использует 3 следующие за ним функции для выбора действия&lt;br /&gt;
function check_timers()&lt;br /&gt;
  local tmp&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __g_timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __timer_found(idx)&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;xd&amp;quot;..idx, nil)&amp;lt;=time then&lt;br /&gt;
    name=load_variable(&amp;quot;xt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;xp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;xt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __g_timer_found(idx)&lt;br /&gt;
    local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;gd&amp;quot;..idx, nil)&amp;lt;=gtime then&lt;br /&gt;
    name=load_variable(&amp;quot;gt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;gp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;gt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __do_timer_action(select_string,params_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
  if select_string==&amp;quot;show_news&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;show_news&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;gg_need_sleep&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_nrg&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_nrg&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
--[[&lt;br /&gt;
if select_string==&amp;quot;sleep_med&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_med&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
 ]]--&lt;br /&gt;
  if select_string==&amp;quot;sleep_matras&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_matras&amp;quot;,params_string)&lt;br /&gt;
  end &lt;br /&gt;
  if select_string==&amp;quot;sleep_tr_item&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_tr_item&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_notebook&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_notebook&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;block_sleep_menu&amp;quot; then&lt;br /&gt;
    save_variable(&amp;quot;block_sleep_menu&amp;quot;,0)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;radar_fix&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;radar_fix&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;af_transform_end&amp;quot;,unpack_array_from_string(params_string))&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;amk_freeplay&amp;quot; then&lt;br /&gt;
    if amk.load_variable(&amp;quot;freeplay&amp;quot;,0)==1 and level.name()==&amp;quot;l12_stancia_2&amp;quot; then&lt;br /&gt;
      xr_effects.game_credits()&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Blowout_pp&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;test&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout_ss&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;blowout_scary_sounds&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blow_shift&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_repbox&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;repbox_cond&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;after_repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;collect_anomalies_info&amp;quot; then&lt;br /&gt;
    amk_anoms.collect_info()&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;news_check&amp;quot; then&lt;br /&gt;
    if (news_main and news_main.check_news) then&lt;br /&gt;
		news_main.check_news()&lt;br /&gt;
	end&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--спавним объекты на карту&lt;br /&gt;
--для спавна неписей смотрим config\creatures\spawn_sections.ltx - там написаны имена секций для разных типов неписей&lt;br /&gt;
function spawn_item(spawn_item, pos, gv,lv)&lt;br /&gt;
  if gv==nil then gv=db.actor:game_vertex_id() end&lt;br /&gt;
  if lv==nil then lv=db.actor:level_vertex_id() end&lt;br /&gt;
  return alife():create(spawn_item, pos, lv, gv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для спавна патронов используем spawn_ammo_in_inv&lt;br /&gt;
function spawn_item_in_inv(spawn_item,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  return alife():create(spawn_item, &lt;br /&gt;
      npc:position(),&lt;br /&gt;
      npc:level_vertex_id(),  &lt;br /&gt;
      npc:game_vertex_id(),&lt;br /&gt;
      npc:id())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--используем для спавна патронов&lt;br /&gt;
function spawn_ammo_in_inv(spawn_item,number,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  if number &amp;gt; 0 then&lt;br /&gt;
    return se_respawn.create_ammo(spawn_item, &lt;br /&gt;
        npc:position(),&lt;br /&gt;
        npc:level_vertex_id(),  &lt;br /&gt;
        npc:game_vertex_id(),&lt;br /&gt;
        npc:id(),&lt;br /&gt;
        number)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- удаляем объект из игры&lt;br /&gt;
function remove_item(remove_item)&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выбрасываем объект из инвентаря, применимо к ГГ&lt;br /&gt;
function drop_item(npc,item)&lt;br /&gt;
  if item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(item)&lt;br /&gt;
    npc:drop_item(item)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--убиваем непися&lt;br /&gt;
function make_suicide(npc)&lt;br /&gt;
  npc:kill(npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--узнаем отношение одного непися к другому&lt;br /&gt;
function get_npc_relation(obj,target)&lt;br /&gt;
  local rel = obj:relation(target)&lt;br /&gt;
  local relation&lt;br /&gt;
  if rel==game_object.neutral then&lt;br /&gt;
    relation=&amp;quot;neutral&amp;quot;&lt;br /&gt;
  elseif rel==game_object.friend then&lt;br /&gt;
    relation=&amp;quot;friend&amp;quot;&lt;br /&gt;
  elseif rel==game_object.enemy then&lt;br /&gt;
    relation=&amp;quot;enemy&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  return relation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--задаем отношение одного непися к другому&lt;br /&gt;
function set_npc_relation(obj,target,relation)&lt;br /&gt;
  local rel&lt;br /&gt;
  if relation==&amp;quot;neutral&amp;quot; then&lt;br /&gt;
    rel=game_object.neutral&lt;br /&gt;
  elseif relation==&amp;quot;friend&amp;quot; then&lt;br /&gt;
    rel=game_object.friend&lt;br /&gt;
  elseif relation==&amp;quot;enemy&amp;quot; then&lt;br /&gt;
    rel=game_object.enemy&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end &lt;br /&gt;
  obj:set_relation(rel,target)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- узнаем группировку непися, применимо к ГГ, только ОНЛАЙН&lt;br /&gt;
function get_npc_community(npc)&lt;br /&gt;
  return npc:character_community()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выставляем группировку непися, можно ГГ, только ОНЛАЙН&lt;br /&gt;
function set_npc_community(npc,community_string)&lt;br /&gt;
  --значения для community_string можно узнать в config\creatures\game_relations.ltx&lt;br /&gt;
  return npc:set_character_community(community_string, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря по имени&lt;br /&gt;
function remove_item_from_inventory_by_name(remove_item_name,npc)&lt;br /&gt;
  return remove_item_from_inventory(npc:object(remove_item_name),npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря&lt;br /&gt;
function remove_item_from_inventory(remove_item,npc)&lt;br /&gt;
  if npc==nil then npc=db.actor end&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(remove_item)&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--создаем &amp;quot;ожидатели&amp;quot; для неписей нужно для корректной работы с объектами, созданными внутри скрипта&lt;br /&gt;
function create_waiter_for_npc(npc,select_string)--неписи&lt;br /&gt;
  npc_spawner[npc.id]=select_string&lt;br /&gt;
  save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--очищаем инвентарь непися, можно ГГ, использует следующую фунцию для удаления предмета&lt;br /&gt;
function clear_npc_inventory(npc)&lt;br /&gt;
    npc:iterate_inventory(__del_item, npc)&lt;br /&gt;
end&lt;br /&gt;
function __del_item(npc, item)&lt;br /&gt;
    local section = item:section()&lt;br /&gt;
&lt;br /&gt;
    if section == &amp;quot;bolt&amp;quot; or section == &amp;quot;device_torch&amp;quot; then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
--    npc:mark_item_dropped(item)&lt;br /&gt;
    alife():release(alife():object(item:id()), true)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
--проверка запущена ли игра&lt;br /&gt;
function check_game()&lt;br /&gt;
  if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем переменную&lt;br /&gt;
function save_variable(variable_name, value)&lt;br /&gt;
  if value==nil then&lt;br /&gt;
    amk.mylog(&amp;quot;saving nil into &amp;quot;..variable_name)&lt;br /&gt;
    del_variable(variable_name)&lt;br /&gt;
  else&lt;br /&gt;
    local vn=compress_name(variable_name)&lt;br /&gt;
    xr_logic.pstor_store(db.actor, vn, value)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем переменную&lt;br /&gt;
function load_variable(variable_name, value_if_not_found)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  return xr_logic.pstor_retrieve(db.actor, vn, value_if_not_found)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем переменную&lt;br /&gt;
function del_variable(variable_name)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  if db.storage[db.actor:id()].pstor[vn] then&lt;br /&gt;
    db.storage[db.actor:id()].pstor[vn] = nil&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица компрессии имён&lt;br /&gt;
local compress_table={&lt;br /&gt;
}&lt;br /&gt;
local checked=false&lt;br /&gt;
&lt;br /&gt;
-- Преобразует имя переменной в короткое&lt;br /&gt;
function compress_name(name)&lt;br /&gt;
  return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--определяем находится ли ГГ в определенной зоне&lt;br /&gt;
function check_npc_in_box(npc, p1,p2,p3)&lt;br /&gt;
  local pos&lt;br /&gt;
  if npc.name then pos=npc:position() else pos=npc end&lt;br /&gt;
  if p3==nil then&lt;br /&gt;
    if is_point_inside_interval(pos.x,p1.x,p2.x) and&lt;br /&gt;
      is_point_inside_interval(pos.y,p1.y,p2.y) and&lt;br /&gt;
      is_point_inside_interval(pos.z,p1.z,p2.z) then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false  &lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    local v1,v2,r,proj1,proj2,dv1,dv2&lt;br /&gt;
    v1=sub(p2,p1)&lt;br /&gt;
    v2=sub(p3,p2)&lt;br /&gt;
    v1.y=0 &lt;br /&gt;
    v2.y=0&lt;br /&gt;
    dv1=v1:magnitude()&lt;br /&gt;
    dv2=v2:magnitude()&lt;br /&gt;
    v1:normalize() &lt;br /&gt;
    v2:normalize()&lt;br /&gt;
    r=sub(pos,p1)&lt;br /&gt;
    local v1p=vector():set(v1.z,0,-v1.x)&lt;br /&gt;
    proj2=v1p:dotproduct(r)/v1p:dotproduct(v2)&lt;br /&gt;
    proj1=v1:dotproduct(r)-v1:dotproduct(v2)*proj2&lt;br /&gt;
    if proj1&amp;gt;0 and proj1&amp;lt;dv1 and proj2&amp;gt;0 and proj2&amp;lt;dv2 and pos.y&amp;gt;p1.y and pos.y&amp;lt;p3.y then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function is_point_inside_interval(x,p1,p2)&lt;br /&gt;
  if p1&amp;gt;p2 then &lt;br /&gt;
    p1,p2 = p2,p1 &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if x&amp;gt;p1 and x&amp;lt;p2 then &lt;br /&gt;
    return true&lt;br /&gt;
  else &lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sub(v1,v2)&lt;br /&gt;
  local newvec = vector()&lt;br /&gt;
  newvec.x = v1.x-v2.x&lt;br /&gt;
  newvec.y = v1.y-v2.y&lt;br /&gt;
  newvec.z = v1.z-v2.z&lt;br /&gt;
  return newvec&lt;br /&gt;
end&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
--инвентарное название объекта&lt;br /&gt;
function get_inv_name(section)&lt;br /&gt;
  return system_ini():r_string(section,&amp;quot;inv_name&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Внимание! Строки в структуре не должны содержать символов с кодами 0-31.&lt;br /&gt;
function pack_array_to_string(array)&lt;br /&gt;
  return string.char(1)..pack_new(array)&lt;br /&gt;
  -- local str=&amp;quot;&amp;quot;&lt;br /&gt;
  -- local key&lt;br /&gt;
  -- for key0,value in pairs(array) do&lt;br /&gt;
    -- if type(key0)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      -- key='&amp;quot;'..key0..'&amp;quot;'&lt;br /&gt;
    -- else&lt;br /&gt;
      -- key=key0&lt;br /&gt;
    -- end&lt;br /&gt;
    -- if type(value)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      -- local substr=pack_array_to_string(value)&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;{&amp;quot;..substr..&amp;quot;}|&amp;quot;&lt;br /&gt;
    -- elseif type(value)==&amp;quot;customdata&amp;quot; or type(value)==&amp;quot;function&amp;quot; then&lt;br /&gt;
      -- mylog(&amp;quot;Custom data and function isn't supported&amp;quot;)&lt;br /&gt;
    -- elseif type(value)==&amp;quot;boolean&amp;quot; or type(value)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;&amp;quot;..tostring(value)..&amp;quot;|&amp;quot;&lt;br /&gt;
    -- else&lt;br /&gt;
      -- str=str..key..'=&amp;gt;&amp;quot;'..value..'&amp;quot;|'&lt;br /&gt;
    -- end&lt;br /&gt;
  -- end&lt;br /&gt;
  -- return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function unpack_array_from_string(str)&lt;br /&gt;
  if str==nil or str==&amp;quot;&amp;quot; then return {} end&lt;br /&gt;
  if string.sub(str,1,1)~=string.char(1) then&lt;br /&gt;
    -- Старый формат упаковки&lt;br /&gt;
    return _parse(str)&lt;br /&gt;
  else&lt;br /&gt;
    -- новый формат упаковки тэгирован символом c кодом 1.&lt;br /&gt;
    return parse_new(string.sub(str,2,-1))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _assign(tbl,key,val)&lt;br /&gt;
  local key0=string.match(key,'&amp;quot;(.*)&amp;quot;')&lt;br /&gt;
  if key0 then&lt;br /&gt;
    tbl[key0]=val&lt;br /&gt;
  else&lt;br /&gt;
    tbl[key+0]=val&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pack_type_num=1&lt;br /&gt;
local pack_type_string=2&lt;br /&gt;
local pack_type_bool=3&lt;br /&gt;
local pack_type_table=4&lt;br /&gt;
local pack_val_endtable=5&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
 Новый формат упаковки: &lt;br /&gt;
 table ::= subtable&lt;br /&gt;
 subtable ::= keytype key valuetype ( value | subtable 0x5 )&lt;br /&gt;
 keytype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
 valuetype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
]]&lt;br /&gt;
function pack_new(tbl)&lt;br /&gt;
  local ret=&amp;quot;&amp;quot;&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(k)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..k&lt;br /&gt;
    elseif type(k)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..k&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..type(k))&lt;br /&gt;
    end&lt;br /&gt;
    if type(v)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_bool)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_table)..pack_new(v)..string.char(pack_val_endtable)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_new(str,idx)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  idx=idx or 1&lt;br /&gt;
  while true do&lt;br /&gt;
    local key,value&lt;br /&gt;
    if idx&amp;gt;string.len(str) then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      key,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      key,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_val_endtable then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      value,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      value,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_bool then&lt;br /&gt;
      value,idx=get_bool(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_table then&lt;br /&gt;
      value,idx=parse_new(str,idx)&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    ret[key]=value&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_byte(str,idx)&lt;br /&gt;
  return string.byte(string.sub(str,idx,idx)),idx+1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_string(str,idx)&lt;br /&gt;
  local idx1=string.len(str)+1&lt;br /&gt;
  for i=idx,string.len(str),1 do&lt;br /&gt;
    if string.byte(string.sub(str,i,i))&amp;lt;32 then&lt;br /&gt;
      idx1=i&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return string.sub(str,idx,idx1-1),idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_num(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st+0,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_bool(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st==&amp;quot;1&amp;quot;,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function _parse(str)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  while str and str~=&amp;quot;&amp;quot; do&lt;br /&gt;
    local i1,i2,key=string.find(str,'(.-)=&amp;gt;')&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
    i1,i2,val=string.find(str,'&amp;quot;(.-)&amp;quot;|')&lt;br /&gt;
    if val and i1==1 then&lt;br /&gt;
      -- строка&lt;br /&gt;
      _assign(ret,key,val)&lt;br /&gt;
    else&lt;br /&gt;
      i1,i2,val=string.find(str,'(%b{})|')&lt;br /&gt;
      if val and i1==1 then&lt;br /&gt;
        -- таблица&lt;br /&gt;
        _assign(ret,key,_parse(string.sub(val,2,-2)))&lt;br /&gt;
      else&lt;br /&gt;
        i1,i2,val=string.find(str,'(.-)|')&lt;br /&gt;
        -- число или булево значение&lt;br /&gt;
        if val==&amp;quot;true&amp;quot; then&lt;br /&gt;
          _assign(ret,key,true)&lt;br /&gt;
        elseif val==&amp;quot;false&amp;quot; then&lt;br /&gt;
          _assign(ret,key,false)&lt;br /&gt;
        else&lt;br /&gt;
          _assign(ret,key,val+0)&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
--callback section&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на получение инфопоршена&lt;br /&gt;
function on_info(npc, info_id)&lt;br /&gt;
	if (news_main and news_main.on_info) then&lt;br /&gt;
		news_main.on_info(info_id)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ&lt;br /&gt;
function on_item_take(obj)&lt;br /&gt;
	escape_dialog.have_a_art()&lt;br /&gt;
	flamethrower.have_a_fire_kolobok()&lt;br /&gt;
	flamethrower.have_a_trubki()&lt;br /&gt;
	flamethrower.have_a_manometr()&lt;br /&gt;
	flamethrower.have_a_vodko()&lt;br /&gt;
	flamethrower.have_a_gorelka()&lt;br /&gt;
	&lt;br /&gt;
	remove_spot_from_map(obj:id(),&amp;quot;red_location&amp;quot;)&lt;br /&gt;
	mod_call(&amp;quot;check_usable_item&amp;quot;,obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ из ящика&lt;br /&gt;
function on_item_take_from_box(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на потерю предмета из инвентаря ГГ&lt;br /&gt;
function on_item_drop(obj)&lt;br /&gt;
  mod_call(&amp;quot;check_for_af_drop&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_sleep_item&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_beacon_drop&amp;quot;,obj)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
  amk_alcohol.drink_vodka(obj)&lt;br /&gt;
  --&lt;br /&gt;
flamethrower.have_a_fire_kolobok()&lt;br /&gt;
flamethrower.have_a_trubki()&lt;br /&gt;
flamethrower.have_a_manometr()&lt;br /&gt;
flamethrower.have_a_vodko()&lt;br /&gt;
flamethrower.have_a_gorelka()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local prev_health=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--колбэк на апдейт ГГ (удобно для проверки условий, так как вызывается постоянно, нельзя перегружать, а то будут лаги)&lt;br /&gt;
function on_actor_upade(delta)&lt;br /&gt;
	oau_watchdog=100&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade begin&amp;quot;)&lt;br /&gt;
 --не удалять! библиотечная конструкция&lt;br /&gt;
  if not timer_trigger then &lt;br /&gt;
    timer_trigger=game.time() &lt;br /&gt;
  end&lt;br /&gt;
  if timer_trigger&amp;lt;=game.time() then&lt;br /&gt;
    timer_trigger=game.time()+1000&lt;br /&gt;
    check_timers()&lt;br /&gt;
  end&lt;br /&gt;
	--user area &lt;br /&gt;
	oau_watchdog=99&lt;br /&gt;
  mod_call(&amp;quot;blowout_phantoms&amp;quot;)&lt;br /&gt;
	oau_watchdog=98&lt;br /&gt;
  mod_call(&amp;quot;check_radar_off&amp;quot;)&lt;br /&gt;
	oau_watchdog=97&lt;br /&gt;
  mod_call(&amp;quot;check_metka&amp;quot;)&lt;br /&gt;
	oau_watchdog=96&lt;br /&gt;
  mod_call(&amp;quot;check_hud&amp;quot;)&lt;br /&gt;
	oau_watchdog=95&lt;br /&gt;
  mod_call(&amp;quot;weather_manager&amp;quot;)&lt;br /&gt;
	oau_watchdog=94&lt;br /&gt;
  mod_call(&amp;quot;check_armor&amp;quot;)&lt;br /&gt;
	oau_watchdog=93&lt;br /&gt;
  mod_call(&amp;quot;firebat_ammo&amp;quot;)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
	oau_watchdog=931&lt;br /&gt;
  amk_alcohol.check_alcohol()&lt;br /&gt;
	oau_watchdog=92&lt;br /&gt;
  amk_mod.on_blowout_hit_actor()&lt;br /&gt;
	oau_watchdog=91&lt;br /&gt;
  if amk_target then amk_target.update() end&lt;br /&gt;
  --&lt;br /&gt;
  for k,v in pairs(convert_npc) do&lt;br /&gt;
    local obj=level.object_by_id(k)&lt;br /&gt;
		local sobj=alife():object(k)&lt;br /&gt;
		if sobj then&lt;br /&gt;
	    if obj==nil and v==true then&lt;br /&gt;
	      convert_npc[k]=false&lt;br /&gt;
	      switch_online(k)&lt;br /&gt;
      elseif obj and v==false then&lt;br /&gt;
        convert_npc[k]=nil&lt;br /&gt;
	    elseif v==1 and obj then -- тайник не перешёл в оффлайн попытаемся его туда запихнуть.&lt;br /&gt;
       alife():set_switch_online(k, false)&lt;br /&gt;
       alife():set_switch_offline(k, true)&lt;br /&gt;
      elseif v==1 then -- тайник в оффлайне. выталкиваем.&lt;br /&gt;
	      convert_npc[k]=nil&lt;br /&gt;
	      switch_online(k)      &lt;br /&gt;
			else&lt;br /&gt;
--				convert_npc[k]=nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			convert_npc[k]=nil&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
	oau_watchdog=90&lt;br /&gt;
&lt;br /&gt;
	if gg_kick then	&lt;br /&gt;
		if prev_health&amp;gt;db.actor.health+0.05 then&lt;br /&gt;
			level.add_pp_effector(&amp;quot;amk_shoot.ppe&amp;quot;, 2011, false)&lt;br /&gt;
			level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)  &lt;br /&gt;
			&lt;br /&gt;
			if prev_health&amp;gt;db.actor.health+0.30 then&lt;br /&gt;
				level.add_cam_effector(&amp;quot;camera_effects\\fusker.anm&amp;quot;, 999, false, &amp;quot;&amp;quot;)	&lt;br /&gt;
				local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])&lt;br /&gt;
				snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)&lt;br /&gt;
				if math.random()&amp;lt;0.20 then&lt;br /&gt;
					local active_item = db.actor:active_item()&lt;br /&gt;
					if active_item and active_item:section()~= &amp;quot;bolt&amp;quot; and active_item:section()~= &amp;quot;wpn_knife&amp;quot; then&lt;br /&gt;
						db.actor:drop_item(active_item)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		prev_health = db.actor.health&lt;br /&gt;
	end&lt;br /&gt;
	oau_watchdog=89&lt;br /&gt;
	&lt;br /&gt;
	if (amk_offline_alife) then&lt;br /&gt;
      amk_offline_alife.update()&lt;br /&gt;
    end&lt;br /&gt;
	oau_watchdog=88&lt;br /&gt;
	if (amk_corpses) then&lt;br /&gt;
		for a=1, 3 do&lt;br /&gt;
			amk_corpses.update()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	amk_anoms.update()&lt;br /&gt;
	oau_watchdog=0&lt;br /&gt;
	oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--хех, определяем тип патронов в стволе...	&lt;br /&gt;
	--[[&lt;br /&gt;
	local weapon = db.actor:item_in_slot(2)&lt;br /&gt;
	&lt;br /&gt;
	if db.actor:active_slot()==2 and weapon then&lt;br /&gt;
		local t = get_weapon_data(alife():object(weapon:id()))&lt;br /&gt;
		mylog(t.ammo_type)&lt;br /&gt;
	end&lt;br /&gt;
	]]&lt;br /&gt;
-----------&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на создание непися (точнее на его переход в онлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_spawn(npc)&lt;br /&gt;
  if npc == nil then return end&lt;br /&gt;
	if (news_main and news_main.on_spawn) then&lt;br /&gt;
		news_main.on_spawn(npc)&lt;br /&gt;
	end&lt;br /&gt;
  for k,v in pairs(npc_spawner) do&lt;br /&gt;
    if k==npc:id() then &lt;br /&gt;
      __npc_spawn_case(npc,v)&lt;br /&gt;
      npc_spawner[k]=nil&lt;br /&gt;
    save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
      return&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __npc_spawn_case(npc,select_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
-----------&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
function on_net_spawn(obj)&lt;br /&gt;
	amk_mod.build_btrs_table(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на удаление непися (точнее на его переход в оффлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_go_offline(npc)&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
	if amk_offline_alife then&lt;br /&gt;
		if check_game()==true then&lt;br /&gt;
		local sobj = alife():object(npc:id())&lt;br /&gt;
		if sobj then&lt;br /&gt;
			amk_offline_alife.process_trade(sobj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_go_offline(npc)&lt;br /&gt;
--	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на юзание объекта&lt;br /&gt;
function on_use(victim, who)&lt;br /&gt;
  if db.actor and who and who:id()==db.actor:id() then&lt;br /&gt;
    mod_call(&amp;quot;check_usable_item&amp;quot;,victim)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на смерть непися&lt;br /&gt;
function on_death(victim, who)&lt;br /&gt;
if (news_main and news_main.on_death) then&lt;br /&gt;
	news_main.on_death(victim, who)&lt;br /&gt;
end&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(victim)&lt;br /&gt;
  mod_call(&amp;quot;generate_recipe&amp;quot;,victim,who)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, victim, 1, nil, who, 14)&lt;br /&gt;
	mod_call(&amp;quot;zomby_blow&amp;quot;,victim)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_npc_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_ph_obj_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- проверка на видимость производится раз в секунду&lt;br /&gt;
function enemy_see_actor(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function actor_see_enemy(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- непись стрелял в гг&lt;br /&gt;
function npc_shot_actor(obj) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем все переменные, которые нужно, вызывается загрузке игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_load()&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load begin&amp;quot;)&lt;br /&gt;
	amk.mylog(&amp;quot;object 2972 is &amp;quot;..((alife():object(2972) and alife():object(2972):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
	amk.mylog(&amp;quot;object 2975 is &amp;quot;..((alife():object(2975) and alife():object(2975):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  if db.storage[db.actor:id()].pstor == nil then&lt;br /&gt;
    db.storage[db.actor:id()].pstor = {}&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  npc_spawner=unpack_array_from_string(load_variable(&amp;quot;x_npc_spawner&amp;quot;,&amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  mod_call(&amp;quot;first_run&amp;quot;)&lt;br /&gt;
  convert_timers() -- исправим старые названия таймеров&lt;br /&gt;
-- Метки теперь ставятся на серверные объекты. Обновлять их не нужно&lt;br /&gt;
--[[&lt;br /&gt;
  local tmp,tmp1&lt;br /&gt;
  for a=1,65534,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;x_marker_type_&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      tmp1=load_variable(&amp;quot;x_marker_text_&amp;quot;..a,nil)&lt;br /&gt;
      level.map_add_object_spot(a, tmp, tmp1)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
]]&lt;br /&gt;
  &lt;br /&gt;
--user area &lt;br /&gt;
	if system_ini():r_float(&amp;quot;gg_kick&amp;quot;,&amp;quot;enabled&amp;quot;)&amp;gt;0.0 then gg_kick=true else gg_kick=false end&lt;br /&gt;
  mod_call(&amp;quot;test_sleep_pp&amp;quot;)&lt;br /&gt;
  mod_call(&amp;quot;check_spawn&amp;quot;)&lt;br /&gt;
--  local str=string&lt;br /&gt;
  if has_alife_info(&amp;quot;val_actor_has_borov_key&amp;quot;) and not has_alife_info(&amp;quot;val_borov_dead&amp;quot;) then&lt;br /&gt;
    db.actor:give_info_portion(&amp;quot;val_borov_dead&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
-----------&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем все переменные, которые нужно, вызывается присохранении игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_save() &lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Эта функция вызывается самой первой. Онлайновые объекты недоступны! db.actor недоступен!&lt;br /&gt;
function on_game_start()&lt;br /&gt;
  mod_call(&amp;quot;on_game_start&amp;quot;)&lt;br /&gt;
	ver = get_ver()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------- user function section---------------&lt;br /&gt;
function mod_call(i,...)&lt;br /&gt;
  if not amk_mod[i] then&lt;br /&gt;
    amk_mod.f=function () loadstring(amk.decode(c))() end&lt;br /&gt;
    setfenv(amk_mod.f,amk_mod)&lt;br /&gt;
    amk_mod.f()&lt;br /&gt;
  end&lt;br /&gt;
  amk_mod[i](...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function load_table(name)&lt;br /&gt;
  local var=load_variable(name)&lt;br /&gt;
  return (var==nil and {}) or unpack_array_from_string(var)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function save_table(name,tbl)&lt;br /&gt;
  save_variable(name,pack_array_to_string(tbl))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function update_table(name,id,val)&lt;br /&gt;
  local tbl=load_table(name)&lt;br /&gt;
  tbl[id]=val&lt;br /&gt;
  save_table(name,tbl)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sixbit(char) local byte = string.byte(char) local result = nil if (byte == 61) then result = 0 elseif (byte == 45 or byte == 43) then result = 62 elseif (byte == 95 or byte == 47) then result = 63 elseif (byte &amp;lt;= 57) then result = byte + 4 elseif (byte &amp;lt;= 90) then result = byte - 65 elseif (byte &amp;lt;= 122) then result = byte - 71 end return result end function decodeblock(block) local sixbits = {} local result = &amp;quot;&amp;quot; for counter=1,4 do sixbits[counter] = sixbit(string.sub(block,counter,counter)) end result = string.char(sixbits[1]*4 + math.floor(sixbits[2] / 16)) if (string.sub(block,3,3) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[2] % 16)*16 + math.floor(sixbits[3] / 4)) end if (string.sub(block,4,4) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[3] % 4) * 64 + sixbits[4]) end return result end function decode(data) local result = &amp;quot;&amp;quot; local str={string.byte(&amp;quot;CheckForCheat&amp;quot;,1,1000)} local strl=table.getn(str) for c=1,string.len(data),4 do result=result..decodeblock(string.sub(data,c,c+3)) end local result1=&amp;quot;&amp;quot; for c=1,string.len(result),1 do local sl=string.byte(string.sub(result,c)) sl=bit_xor(sl,str[1+(c-1)%strl]) result1 = result1 .. string.char(sl) end return result1 end&lt;br /&gt;
&lt;br /&gt;
function bind_lc(obj)&lt;br /&gt;
  if obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; and level.name()==&amp;quot;l12_stancia&amp;quot; and amk.load_variable(&amp;quot;freeplay&amp;quot;,0)&amp;gt;0 then&lt;br /&gt;
    local sobj=alife():object(obj:id())&lt;br /&gt;
    if sobj then&lt;br /&gt;
      alife():release(sobj,true)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=8&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u16(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u16())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u8(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8u8(pk,v)&lt;br /&gt;
  local len=8 --table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u16(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u16(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.gvid=stpk:r_u16()&lt;br /&gt;
  ret.obf32u1=stpk:r_float()&lt;br /&gt;
  ret.obs32u2=stpk:r_s32()&lt;br /&gt;
  ret.lvid=stpk:r_s32()&lt;br /&gt;
  ret.oflags=stpk:r_s32()&lt;br /&gt;
  ret.custom=stpk:r_stringZ()&lt;br /&gt;
  ret.sid=stpk:r_s32()&lt;br /&gt;
  ret.obs32u3=stpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.gvid)&lt;br /&gt;
  stpk:w_float(ret.obf32u1)&lt;br /&gt;
  stpk:w_s32(ret.obs32u2)&lt;br /&gt;
  stpk:w_s32(ret.lvid)&lt;br /&gt;
  stpk:w_s32(ret.oflags)&lt;br /&gt;
  stpk:w_stringZ(ret.custom)&lt;br /&gt;
  stpk:w_s32(ret.sid)&lt;br /&gt;
  stpk:w_s32(ret.obs32u3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.visual=stpk:r_stringZ()&lt;br /&gt;
  ret.vsu8u1=stpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.visual)&lt;br /&gt;
  stpk:w_u8(ret.vsu8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  ret.team=stpk:r_u8()&lt;br /&gt;
  ret.squad=stpk:r_u8()&lt;br /&gt;
  ret.group=stpk:r_u8()&lt;br /&gt;
  ret.health=stpk:r_float()&lt;br /&gt;
  ret.crvu32u16u1=readvu32u16(stpk)&lt;br /&gt;
  ret.crvu32u16u2=readvu32u16(stpk)  &lt;br /&gt;
  ret.killerid=stpk:r_u16()&lt;br /&gt;
  ret.game_death_time=readvu8u8(stpk)&lt;br /&gt;
&lt;br /&gt;
  ret.updhealth=updpk:r_float()&lt;br /&gt;
  ret.upds32u1=updpk:r_s32()&lt;br /&gt;
  ret.updu8u2=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
  ret.updmodel=updpk:r_float()&lt;br /&gt;
  ret.upddir={}&lt;br /&gt;
  ret.upddir.x=updpk:r_float()&lt;br /&gt;
  ret.upddir.y=updpk:r_float()&lt;br /&gt;
  ret.upddir.z=updpk:r_float()&lt;br /&gt;
  ret.updteam=updpk:r_u8()&lt;br /&gt;
  ret.updsquad=updpk:r_u8()&lt;br /&gt;
  ret.updgroup=updpk:r_u8()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u8(ret.team)&lt;br /&gt;
  stpk:w_u8(ret.squad)&lt;br /&gt;
  stpk:w_u8(ret.group)&lt;br /&gt;
  stpk:w_float(ret.health)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u1)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u2)  &lt;br /&gt;
  stpk:w_u16(ret.killerid)&lt;br /&gt;
  writevu8u8(stpk,ret.game_death_time)&lt;br /&gt;
&lt;br /&gt;
  updpk:w_float(ret.updhealth)&lt;br /&gt;
  updpk:w_s32(ret.upds32u1)&lt;br /&gt;
  updpk:w_u8(ret.updu8u2)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
  updpk:w_float(ret.updmodel)&lt;br /&gt;
  updpk:w_float(ret.upddir.x)&lt;br /&gt;
  updpk:w_float(ret.upddir.y)&lt;br /&gt;
  updpk:w_float(ret.upddir.z)&lt;br /&gt;
  updpk:w_u8(ret.updteam)&lt;br /&gt;
  updpk:w_u8(ret.updsquad)&lt;br /&gt;
  updpk:w_u8(ret.updgroup)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.baseoutr=stpk:r_stringZ()&lt;br /&gt;
  ret.baseinr=stpk:r_stringZ()&lt;br /&gt;
  ret.smtrid=stpk:r_u16()&lt;br /&gt;
  ret.smtrtaskactive=stpk:r_u8()&lt;br /&gt;
  &lt;br /&gt;
  ret.updu16u1=updpk:r_u16()&lt;br /&gt;
  ret.updu16u2=updpk:r_u16()&lt;br /&gt;
  ret.upds32u3=updpk:r_s32()&lt;br /&gt;
  ret.upds32u4=updpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.baseoutr)&lt;br /&gt;
  stpk:w_stringZ(ret.baseinr)&lt;br /&gt;
  stpk:w_u16(ret.smtrid)&lt;br /&gt;
  stpk:w_u8(ret.smtrtaskactive)&lt;br /&gt;
  &lt;br /&gt;
  updpk:w_u16(ret.updu16u1)&lt;br /&gt;
  updpk:w_u16(ret.updu16u2)&lt;br /&gt;
  updpk:w_s32(ret.upds32u3)&lt;br /&gt;
  updpk:w_s32(ret.upds32u4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.money=stpk:r_s32()&lt;br /&gt;
  ret.profile=stpk:r_stringZ()&lt;br /&gt;
  ret.infammo=stpk:r_s32()&lt;br /&gt;
  ret.class=stpk:r_stringZ()&lt;br /&gt;
  ret.communityid=stpk:r_s32()&lt;br /&gt;
  ret.rank=stpk:r_s32()&lt;br /&gt;
  ret.reputation=stpk:r_s32()&lt;br /&gt;
  ret.charname=stpk:r_stringZ()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_s32(ret.money)&lt;br /&gt;
  stpk:w_stringZ(ret.profile)&lt;br /&gt;
  stpk:w_s32(ret.infammo)&lt;br /&gt;
  stpk:w_stringZ(ret.class)&lt;br /&gt;
  stpk:w_s32(ret.communityid)&lt;br /&gt;
  stpk:w_s32(ret.rank)&lt;br /&gt;
  stpk:w_s32(ret.reputation)&lt;br /&gt;
  stpk:w_stringZ(ret.charname)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.huvu32u8u1=readvu32u8(stpk)&lt;br /&gt;
  ret.huvu32u8u2=readvu32u8(stpk)  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u1)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.skeleton=stpk:r_stringZ()&lt;br /&gt;
  ret.skeleton_flags=stpk:r_u8()&lt;br /&gt;
  ret.source_id=stpk:r_u16()&lt;br /&gt;
  &lt;br /&gt;
--  ret.updsku8u1=updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.skeleton)&lt;br /&gt;
  stpk:w_u8(ret.skeleton_flags)&lt;br /&gt;
  stpk:w_u16(ret.source_id)&lt;br /&gt;
  &lt;br /&gt;
--  updpk:w_u8(ret.updsku8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_stalker_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.hellodlg=updpk:r_stringZ()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_stalker_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  updpk:w_stringZ(ret.hellodlg)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_se_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk,size)&lt;br /&gt;
  ret.spec_obj_id=stpk:r_u16()&lt;br /&gt;
  ret.job_online=stpk:r_u8()&lt;br /&gt;
	if ret.job_online&amp;gt;3 then&lt;br /&gt;
		ret.state=true&lt;br /&gt;
		ret.job_online=ret.job_online-4&lt;br /&gt;
	else&lt;br /&gt;
		ret.state=false&lt;br /&gt;
	end&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    ret.job_online_condlist=stpk:r_stringZ()&lt;br /&gt;
  end&lt;br /&gt;
  ret.was_in_smtr=stpk:r_u8()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_se_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.spec_obj_id)&lt;br /&gt;
	local st=0&lt;br /&gt;
	if ret.state then&lt;br /&gt;
		st=4&lt;br /&gt;
	end&lt;br /&gt;
  stpk:w_u8(ret.job_online+st)&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    stpk:w_stringZ(ret.job_online_condlist)&lt;br /&gt;
  end&lt;br /&gt;
  stpk:w_u8(ret.was_in_smtr)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dump_table(tbl)&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;)&lt;br /&gt;
      dump_table(v)&lt;br /&gt;
    else&lt;br /&gt;
      str=&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;..tostring(v)&lt;br /&gt;
      if string.len(str)&amp;gt;200 then&lt;br /&gt;
        str=string.sub(str,1,200)&lt;br /&gt;
      end&lt;br /&gt;
      get_console():execute(str)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- серверный объект на входе&lt;br /&gt;
function read_stalker_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_stalker_packet({},stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function read_monster_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_se_monster_packet({},stpk,uppk,size)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица параметров и серверный объект на входе&lt;br /&gt;
function write_stalker_params(tbl,sobj,noconvert)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_stalker_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  if npc and (not noconvert) then&lt;br /&gt;
    amk.convert_npc[sobj.id]=true&lt;br /&gt;
		npc:stop_talk()&lt;br /&gt;
    switch_offline(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function write_monster_params(tbl,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_se_monster_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  -- local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  -- if npc then&lt;br /&gt;
    -- amk.convert_npc[sobj.id]=true&lt;br /&gt;
    -- switch_offline(npc)&lt;br /&gt;
  -- end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_anomaly_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.max_power = stpk:r_float()&lt;br /&gt;
	t.owner_id = stpk:r_s32()&lt;br /&gt;
	t.enabled_time = stpk:r_s32()&lt;br /&gt;
	t.disabled_time = stpk:r_s32()&lt;br /&gt;
	t.start_time_shift = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.offline_interactive_radius = stpk:r_float()&lt;br /&gt;
	t.artefact_spawn_count = stpk:r_u16()&lt;br /&gt;
	t.artefact_position_offset = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.last_spawn_time_present = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	if stpk:r_elapsed() ~= 0 then&lt;br /&gt;
--		abort(&amp;quot;left=%d&amp;quot;, stpk:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_anomaly_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.max_power)&lt;br /&gt;
	stpk:w_s32(t.owner_id)&lt;br /&gt;
	stpk:w_s32(t.enabled_time)&lt;br /&gt;
	stpk:w_s32(t.disabled_time)&lt;br /&gt;
	stpk:w_s32(t.start_time_shift)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.offline_interactive_radius)&lt;br /&gt;
	stpk:w_u16(t.artefact_spawn_count)&lt;br /&gt;
	stpk:w_s32(t.artefact_position_offset)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_u8(t.last_spawn_time_present)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для правильного парсинга запрещены комментарии!!!&lt;br /&gt;
function parse_custom_data(str)&lt;br /&gt;
	local t={}&lt;br /&gt;
	if str then&lt;br /&gt;
		for section, section_data in string.gfind(str,&amp;quot;%s*%[([^%]]*)%]%s*([^%[%z]*)%s*&amp;quot;) do&lt;br /&gt;
			section = trim(section)&lt;br /&gt;
			t[section]={}&lt;br /&gt;
			for line in string.gfind(trim(section_data), &amp;quot;([^\n]*)\n*&amp;quot;) do&lt;br /&gt;
				if string.find(line,&amp;quot;=&amp;quot;)~=nil then&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;([^=]-)%s*=%s*(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' and v~=nil then &lt;br /&gt;
							t[section][k]=trim(v) &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' then&lt;br /&gt;
							t[section][k]=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trim (s)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gen_custom_data(tbl)&lt;br /&gt;
	local str=''&lt;br /&gt;
	for key, value in pairs(tbl) do&lt;br /&gt;
		str = str..&amp;quot;\n[&amp;quot;..key..&amp;quot;]\n&amp;quot;&lt;br /&gt;
		for k, v in pairs(value) do&lt;br /&gt;
			if v~=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; then&lt;br /&gt;
				str=str..k..&amp;quot; = &amp;quot;..v..&amp;quot;\n&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				str=str..k..&amp;quot;\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
function get_lc_data(obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t = amk.parse_shape_packet(t,packet)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = packet:r_u8()&lt;br /&gt;
	t.dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.dest_level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.dest_position = packet:r_vec3()&lt;br /&gt;
	t.dest_direction = packet:r_vec3()&lt;br /&gt;
	t.dest_level_name = packet:r_stringZ()&lt;br /&gt;
	t.dest_graph_point = packet:r_stringZ()&lt;br /&gt;
	t.silent_mode = packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_lc_data(t,obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	&lt;br /&gt;
	amk.fill_shape_packet(t,packet)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(t.restrictor_type)&lt;br /&gt;
	packet:w_u16(t.dest_game_vertex_id)&lt;br /&gt;
	packet:w_s32(t.dest_level_vertex_id)&lt;br /&gt;
	packet:w_vec3(t.dest_position)&lt;br /&gt;
	packet:w_vec3(t.dest_direction)&lt;br /&gt;
	packet:w_stringZ(t.dest_level_name)&lt;br /&gt;
	packet:w_stringZ(t.dest_graph_point)&lt;br /&gt;
	packet:w_u8(t.silent_mode)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function point_in_poly (pts, x,y)&lt;br /&gt;
	local cnt,k,j&lt;br /&gt;
	local ret = false&lt;br /&gt;
	cnt = table.getn(pts)&lt;br /&gt;
	j = cnt&lt;br /&gt;
	for k = 1,cnt do&lt;br /&gt;
		if ((pts[k].y &amp;lt;=y) and (y &amp;lt; pts[j].y)) or ((pts[j].y &amp;lt;=y) and (y &amp;lt; pts[k].y)) then&lt;br /&gt;
			if (x &amp;lt; (pts[j].x - pts[k].x) * (y - pts[k].y) / (pts[j].y - pts[k].y) + pts[k].x) then&lt;br /&gt;
				ret = not ret&lt;br /&gt;
			end&lt;br /&gt;
			j = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.physic_type=stpk:r_s32()&lt;br /&gt;
	ret.mass=stpk:r_float()&lt;br /&gt;
	ret.fixed_bones=stpk:r_stringZ()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_s32(ret.physic_type)&lt;br /&gt;
	stpk:w_float(ret.mass)&lt;br /&gt;
	stpk:w_stringZ(ret.fixed_bones)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_breakable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.visual_name = packet:r_stringZ()&lt;br /&gt;
	t.visual_flags = packet:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.health = packet:r_float()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_breakable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	packet:w_stringZ(t.visual_name)&lt;br /&gt;
	packet:w_u8(t.visual_flags)&lt;br /&gt;
	packet:w_float(t.health)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_REspawn(obj,respawner)&lt;br /&gt;
	if obj and respawner then&lt;br /&gt;
		mod_call(&amp;quot;respawned&amp;quot;,obj,respawner)&lt;br /&gt;
		if IsMonster(obj) then&lt;br /&gt;
			if respawner.spawned_goes_online==true then mod_call(&amp;quot;switch_monster_online&amp;quot;,obj) &lt;br /&gt;
			elseif respawner.spawned_goes_online==false then mod_call(&amp;quot;switch_monster_offline&amp;quot;,obj) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (obj) then&lt;br /&gt;
		if (news_main and news_main.on_spawn) then&lt;br /&gt;
			news_main.on_spawn(obj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_spawner_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	t.spawned_obj_count = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_spawner_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	stpk:w_u8(t.spawned_obj_count)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_shape_packet(t,stpk,uppk)&lt;br /&gt;
	local shape_count = stpk:r_u8()&lt;br /&gt;
	t.shapes={}&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type = stpk:r_u8()&lt;br /&gt;
		t.shapes[i]={}&lt;br /&gt;
		t.shapes[i].shtype=shape_type&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			t.shapes[i].center = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].radius = stpk:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			t.shapes[i].v1 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v2 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v3 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].offset = stpk:r_vec3()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_shape_packet(t,stpk,updpk)&lt;br /&gt;
	stpk:w_u8(table.getn(t.shapes))&lt;br /&gt;
	for i=1,table.getn(t.shapes) do&lt;br /&gt;
		stpk:w_u8(t.shapes[i].shtype)&lt;br /&gt;
		if t.shapes[i].shtype == 0 then&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].center)&lt;br /&gt;
			stpk:w_float(t.shapes[i].radius)&lt;br /&gt;
		else&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v1)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v2)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v3)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].offset)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_ini_section_to_array(ini,section)&lt;br /&gt;
	local tmp={}&lt;br /&gt;
	if ini:section_exist(section) then&lt;br /&gt;
		local result, id, value = nil, nil, nil&lt;br /&gt;
		for a=0,ini:line_count(section)-1 do&lt;br /&gt;
			result, id, value = ini:r_line(section,a,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			if id~=nil and trim(id)~=&amp;quot;&amp;quot; and trim(id)~=nil then&lt;br /&gt;
				tmp[trim(id)]=trim(value)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tmp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function str_explode(div,str,clear)&lt;br /&gt;
	local t={}&lt;br /&gt;
	local cpt = string.find (str, div, 1, true)&lt;br /&gt;
	if cpt then&lt;br /&gt;
		repeat&lt;br /&gt;
			if clear then&lt;br /&gt;
				table.insert( t, trim(string.sub(str, 1, cpt-1)) )&lt;br /&gt;
			else&lt;br /&gt;
				table.insert( t, string.sub(str, 1, cpt-1) )&lt;br /&gt;
			end&lt;br /&gt;
			str = string.sub( str, cpt+string.len(div) )&lt;br /&gt;
			cpt = string.find (str, div, 1, true)&lt;br /&gt;
		until cpt==nil&lt;br /&gt;
	end&lt;br /&gt;
	if clear then&lt;br /&gt;
		table.insert(t, trim(str))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function quotemeta(str)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;quot;, &amp;quot;%%%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function add(v1,v2)&lt;br /&gt;
	local nv=vector()&lt;br /&gt;
	nv.x=v1.x+v2.x&lt;br /&gt;
	nv.y=v1.y+v2.y&lt;br /&gt;
	nv.z=v1.z+v2.z&lt;br /&gt;
	return nv&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_len(v,num)&lt;br /&gt;
	local cl = math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z)&lt;br /&gt;
	cl = num/cl&lt;br /&gt;
	v.x= v.x*cl&lt;br /&gt;
	v.y= v.y*cl&lt;br /&gt;
	v.z= v.z*cl&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_restrictor_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_restrictor_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_trader_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_trader_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_trader_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_trader_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_invbox_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_invbox_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8uN(packet,n)&lt;br /&gt;
  local v={}&lt;br /&gt;
  for i=1,n,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8uN(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.condition=stpk:r_float()&lt;br /&gt;
	ret.updnum_items=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
	ret.updcse_alife_item__unk1_q8v4=readvu8uN(updpk,4)&lt;br /&gt;
	ret.updcse_alife_item__unk2_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
	ret.updcse_alife_item__unk3_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_float(ret.condition)&lt;br /&gt;
	updpk:w_u8(ret.updnum_items)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk1_q8v4)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk2_q8v3)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk3_q8v3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_left=stpk:r_u16()&lt;br /&gt;
	ret.updammo_left=updpk:r_u16()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_left)&lt;br /&gt;
	updpk:w_u16(ret.updammo_left)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ammo_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_ammo_packet(t,stpk,uppk,size)&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_ammo_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_ammo_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cfg_get_string(ini,sect,name,def)&lt;br /&gt;
	if ini and ini:line_exist(sect,name) then&lt;br /&gt;
		return ini:r_string(sect,name)&lt;br /&gt;
	end&lt;br /&gt;
	return def&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_destroyable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_skeleton_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_destroyable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_skeleton_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_weapon_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
  amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_weapon_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_weapon_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_weapon_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_current = stpk:r_u16()&lt;br /&gt;
	ret.ammo_elapsed = stpk:r_u16()&lt;br /&gt;
	ret.weapon_state = stpk:r_u8()&lt;br /&gt;
	ret.addon_flags = stpk:r_u8()&lt;br /&gt;
	ret.ammo_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	ret.updcondition = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_elapsed = updpk:r_u16()&lt;br /&gt;
	ret.updaddon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_type = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_state = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_zoom = updpk:r_u8()&lt;br /&gt;
	ret.updcurrent_fire_mode = updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_current)&lt;br /&gt;
	stpk:w_u16(ret.ammo_elapsed)&lt;br /&gt;
	stpk:w_u8(ret.weapon_state)&lt;br /&gt;
	stpk:w_u8(ret.addon_flags)&lt;br /&gt;
	stpk:w_u8(ret.ammo_type)&lt;br /&gt;
	&lt;br /&gt;
	updpk:w_u8(ret.updcondition)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_flags)&lt;br /&gt;
	updpk:w_u16(ret.updammo_elapsed)&lt;br /&gt;
	updpk:w_u8(ret.updaddon_flags)&lt;br /&gt;
	updpk:w_u8(ret.updammo_type)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_state)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_zoom)&lt;br /&gt;
	updpk:w_u8(ret.updcurrent_fire_mode)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ver()&lt;br /&gt;
	local ver = &amp;quot;0&amp;quot;&lt;br /&gt;
	local mm = _G.main_menu.get_main_menu()&lt;br /&gt;
	if mm then ver = mm:GetGSVer() end&lt;br /&gt;
	return ver&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
всё заходим в игру и пробуем :-)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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_Cube_Map_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%BD%D0%B5%D0%B1%D0%B0</id>
		<title>Создание Cube Map текстуры неба</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_Cube_Map_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%BD%D0%B5%D0%B1%D0%B0"/>
				<updated>2010-07-01T11:45:34Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье мы сделаем CubeMap текстуру неба из текстуры 360 digital sky, которые не сложно найти в интернете [http://www.1000skies.com вот такие], например.&lt;br /&gt;
&lt;br /&gt;
Для работы нам понадобяться Adobe Photoshop любой версии с [http://developer.nvidia.com/object/photoshop_dds_plugins.html &amp;gt;&amp;gt; DDS plugin &amp;gt;&amp;gt;] для сохранения в DDS, Autodesk Maya 8,5&lt;br /&gt;
&lt;br /&gt;
== Подготовка текстуры ==&lt;br /&gt;
Готовим текстуру 360 Degree Sky следующим образом: &lt;br /&gt;
* берёте текстуру 360 Degree Sky из интернета (или делаете сами, если умеете)&lt;br /&gt;
* в Photoshop (или в другом редакторе) прибавляете снизу пустую полосу высотой, равной высоте текстуры (высота изображения удваивается). Лучше, если от полосы идёт плавный градиент толщиной в 16-32 px на усмотрение.&lt;br /&gt;
&lt;br /&gt;
== Работа с Maya ==&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
для этого нам понадобится вот этот файл: [http://depositfiles.com/ru/files/ra6g7691m &amp;gt;&amp;gt; SkyRoom.mb &amp;gt;&amp;gt;] (автор - xroo)&lt;br /&gt;
* открываем этот хорошенький файлик&lt;br /&gt;
* находим материал, который наложен на большой шарик, и меняем ему текстуру.&lt;br /&gt;
:Для чайников:&amp;lt;br&amp;gt;&lt;br /&gt;
:* Кликаем пункт меню (сверху) Window =&amp;gt; Rendering Editors =&amp;gt; Multilister. В нём два раздела: сверху материалы, снизу текстуры.&lt;br /&gt;
:* Щёлкаем дважды по текстуре (она там одна) и в главном окне открывается боковая панель. Там напротив надписи Image name щёлкаем по значку папки и находим свою текстуру.&lt;br /&gt;
=== Рендеринг ===&lt;br /&gt;
Рендерим и сохраняем по очереди изображения с камер Camera1, Camera2, Camera3, Camera4, Camera5.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
:Для чайников:&amp;lt;br&amp;gt;&lt;br /&gt;
:* Под меню сверху есть выпадающий список с пунктами Animation/Polygons/Surfaces... В нём выбираем Rendering - главное меню меняется.&lt;br /&gt;
:* Жмём Rendering =&amp;gt; Render Current Frame - происходит рендеринг текущей камеры. Если рендеринг всё не останавливается, жмём Esc - он остановится не завершённым.&lt;br /&gt;
:* Для открытия настроек жмём Options =&amp;gt; Render Settings и там в рвзделе Image Size в пунктах Width и Height выставляем что-то большое, например 2048х2048.&lt;br /&gt;
:* Выбираем пункт меню Render =&amp;gt; Render =&amp;gt; Camera1 и ждём пока рендеринг закончится. Когда он закончился, жмём File =&amp;gt; Save image и сохраняем изображение под номером 1 в png, tga или tiff - что-нибудь беспотерьное.&lt;br /&gt;
:* проделываем предыдущий пункт с Camera2, Camera3, Camera4, Camera5.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== Собираем CubeMap ==&lt;br /&gt;
=== Сборка ===&lt;br /&gt;
* В Photoshop (или чём-нибудь ещё) делаем картинку такую, чтобы ширина была в 6 раз больше высоты, а высота равнялась степени двойки (например 512 или 1024)&lt;br /&gt;
* составляем 5 наших полученных картинок в таком порядке: 2, 4, 5, пустое квадратное поле, 3, 1. Это соответствует сторонам: Восток, Запад, Верх, Низ, Север, Юг - в игре. Пустое поле лучше выкрасить в цвет той полосы из 1-го шага.&lt;br /&gt;
=== Экспорт ===&lt;br /&gt;
* Сохраняем полученную картинку в DDS в папку textures/sky/, выбрав тип текстуры Cube Map и тип сжатия DXT1.&lt;br /&gt;
[[Категория:Texturing]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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_Cube_Map_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%BD%D0%B5%D0%B1%D0%B0</id>
		<title>Создание Cube Map текстуры неба</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_Cube_Map_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%BD%D0%B5%D0%B1%D0%B0"/>
				<updated>2010-07-01T11:44:14Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье мы сделаем CubeMap текстуру неба из текстуры 360 digital sky, которые не сложно найти в интернете [http://www.1000skies.com вот такие], например.&lt;br /&gt;
&lt;br /&gt;
Для работы нам понадобяться Adobe Photoshop любой версии с [http://developer.nvidia.com/object/photoshop_dds_plugins.html &amp;gt;&amp;gt; DDS plugin &amp;gt;&amp;gt;] для сохранения в DDS, Autodesk Maya 8,5&lt;br /&gt;
&lt;br /&gt;
== Подготовка текстуры ==&lt;br /&gt;
Готовим текстуру 360 Degree Sky следующим образом: &lt;br /&gt;
* берёте текстуру 360 Degree Sky из интернета (или делаете сами, если умеете)&lt;br /&gt;
* в Photoshop (или в другом редакторе) прибавляете снизу пустую полосу высотой, равной высоте текстуры (высота изображения удваивается). Лучше, если от полосы идёт плавный градиент толщиной в 16-32 px на усмотрение.&lt;br /&gt;
&lt;br /&gt;
== Работа с Maya ==&lt;br /&gt;
=== Подготовка ===&lt;br /&gt;
для этого нам понадобится вот этот файл: [http://depositfiles.com/ru/files/ra6g7691m &amp;gt;&amp;gt; SkyRoom.mb &amp;gt;&amp;gt;] (автор - xroo)&lt;br /&gt;
* открываем этот хорошенький файлик&lt;br /&gt;
* находим материал, который наложен на большой шарик, и меняем ему текстуру.&lt;br /&gt;
:Для чайников:&amp;lt;br&amp;gt;&lt;br /&gt;
:* Кликаем пункт меню (сверху) Window =&amp;gt; Rendering Editors =&amp;gt; Multilister. В нём два раздела: сверху материалы, снизу текстуры.&lt;br /&gt;
:* Щёлкаем дважды по текстуре (она там одна) и в главном окне открывается боковая панель. Там напротив надписи Image name щёлкаем по значку папки и находим свою текстуру.&lt;br /&gt;
=== Рендеринг ===&lt;br /&gt;
Рендерим и сохраняем по очереди изображения с камер Camera1, Camera2, Camera3, Camera4, Camera5.&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
:Для чайников:&amp;lt;br&amp;gt;&lt;br /&gt;
:* Под меню сверху есть выпадающий список с пунктами Animation/Polygons/Surfaces... В нём выбираем Rendering - главное меню меняется.&lt;br /&gt;
:* Жмём Rendering =&amp;gt; Render Current Frame - происходит рендеринг текущей камеры. Если рендеринг всё не останавливается, жмём Esc - он остановится не завершённым.&lt;br /&gt;
:* Для открытия настроек жмём Options =&amp;gt; Render Settings и там в рвзделе Image Size в пунктах Width и Height выставляем что-то большое, например 2048х2048.&lt;br /&gt;
:* Выбираем пункт меню Render =&amp;gt; Render =&amp;gt; Camera1 и ждём пока рендеринг закончится. Когда он закончился, жмём File =&amp;gt; Save image и сохраняем изображение под номером 1 в png, tga или tiff - что-нибудь беспотерьное.&lt;br /&gt;
:* проделываем предыдущий пункт с Camera2, Camera3, Camera4, Camera5.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== Собираем CubeMap ==&lt;br /&gt;
=== Сборка ===&lt;br /&gt;
* В Photoshop (или чём-нибудь ещё) делаем картинку такую, чтобы ширина была в 6 раз больше высоты, а высота равнялась степени двойки (например 512 или 1024)&lt;br /&gt;
* составляем 5 наших полученных картинок в таком порядке: 2, 4, 5, пустое квадратное поле, 3, 1. Это соответствует сторонам: Восток, Запад, Верх, Низ, Север, Юг - в игре. Пустое поле лучше выкрасить в цвет той полосы из 1-го шага.&lt;br /&gt;
=== Экспорт ===&lt;br /&gt;
* Сохраняем полученную картинку в DDS в папку textures/sky/, выбрав тип текстуры Cube Map и тип сжатия DXT1.&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%8B_%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D0%BC_%D0%BC%D0%BE%D0%B4%D0%BC%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0%D0%BC</id>
		<title>Советы начинающим модмейкерам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%8B_%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D0%BC_%D0%BC%D0%BE%D0%B4%D0%BC%D0%B5%D0%B9%D0%BA%D0%B5%D1%80%D0%B0%D0%BC"/>
				<updated>2010-06-30T10:12:41Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Несколько советов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сталкер. Как оно? ==&lt;br /&gt;
Вы купили игру, вы прошли её, вам она понравилась. Вы ползаете по интернету в поисках контента, хотите выяснить ответы на интересующие вопросы. Натыкаетесь на слова &amp;quot;мод&amp;quot;, &amp;quot;моды&amp;quot;. &amp;quot;дополнения&amp;quot;. Играете в них, некоторые нравятся, некоторые - нет. Имеется ассортимент таких возможностей, о которых как раз мечтали, проходя оригинальную игру. &lt;br /&gt;
Иногда, встречаются &amp;quot;вылеты&amp;quot;. Вновь ищем их решения. Регестрируемся на форумах, вливаемся в компьюнити. &lt;br /&gt;
Начинаем ковырять файлы, оказывается всё довольно просто и интересно устроено. А то если, &amp;lt;u&amp;gt;создать самому мод?&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Первый... ==&lt;br /&gt;
Читаем туторы, спрашиваем у знающих людей. Делаем первый артефакт. &lt;br /&gt;
-Классно получилось. Понравилось&lt;br /&gt;
Все что то делаем первый раз, первый новый ствол, первый новый артефакт, первый новый диалог, первый новый квест, первая новая локация.&lt;br /&gt;
Как только всё получается, мы испытываем запредельную радость&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Комьюнити ==&lt;br /&gt;
Рано или поздно мы представляем своё первое творение комьюнити. &lt;br /&gt;
Моды бывают разные, глобальные и небольшие. Лично мой первый мод. Релиз датирован 2007 год 17 августа&lt;br /&gt;
Безграмотно накиданы все мои умения. Особой ценности для игры не представляет, доставляет лишь чувство удовлетворённости. Что то всёже получилось&lt;br /&gt;
Случается, что критикуют неадекватно. Не стоит реагировать на это болезненно. Простим обидчика. Запомни его ник и потом &amp;lt;s&amp;gt;убей минусом в репутацию&amp;lt;/s&amp;gt; просто забудь&lt;br /&gt;
Не нужно начинать скандал и ссору. Вы покажете себя с худшей стороны. Тем более что мнение о том, кто вас неадекватно раскритиковал, уже скорее всего сформировано, а вы только пришли в это общество. Продолжайте учиться, делать новое и интересное, знакомиться с хорошими людьми. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Несколько советов ==&lt;br /&gt;
&amp;lt;pre&amp;gt;-никогда не давайте заднюю, видите что то сложное?-не отступайте. Всё получится. Глаза боятся, руки делают&lt;br /&gt;
-не разводите публичные скандалы с кем либо&lt;br /&gt;
-не занимайтесь троллингом&lt;br /&gt;
-не забывайте говорить спасибо и пожалуйсто&lt;br /&gt;
-будтье вежливы в общении&lt;br /&gt;
-соблюдайте грамотность&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И люди повернутся к вам лицом&lt;br /&gt;
[[Категория:FAQ]]&lt;br /&gt;
Автора указывать необязательно=)&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86</id>
		<title>Создание лестниц</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BB%D0%B5%D1%81%D1%82%D0%BD%D0%B8%D1%86"/>
				<updated>2010-06-26T18:57:02Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Создание: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Итак, лестницы.&lt;br /&gt;
Лестница в сталкере это ничто иное, как невидимая вертикальная плоскость, но имеющая свою коллизию. Это обязательно должна быть плоскость (Plane) в 1х1 полигон (иначе при сборке выйдет ошибка, связанная с climable_object). Расположение на уровне тоже не с проста:&lt;br /&gt;
&lt;br /&gt;
http://i068.radikal.ru/1006/5e/3ffec4a582d6.jpg&lt;br /&gt;
&lt;br /&gt;
В случае &amp;quot;Нет&amp;quot;, игрок просто не сможет зацепиться за лестницу.&lt;br /&gt;
&lt;br /&gt;
===Создание:===&lt;br /&gt;
Создаём плоскость 1 на 1 полигонов, или берем уже готовый объект. Наносим на него материал, текстуру можно любую, но лучше служебную '''props\fake_ladders.dds'''.&lt;br /&gt;
В свитке S.T.A.L.K.E.R. Params настраиваем шейдеры.&lt;br /&gt;
&lt;br /&gt;
http://i066.radikal.ru/1006/75/a43bf256482a.jpg&lt;br /&gt;
&lt;br /&gt;
Экспортим, заносим в СДК (здесь не описывается). Компилим. Ну и собственно смотрим в игре.&lt;br /&gt;
&lt;br /&gt;
P.S. Если будем мучать автора, кроме матов ничего не услышите&lt;br /&gt;
&lt;br /&gt;
Подправил и закончил - '''Pihan13'''&lt;br /&gt;
А начал - '''Oxygenium'''&lt;br /&gt;
[[Категория:SDK]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2</id>
		<title>SoC. Снятие денег с трупов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B4%D0%B5%D0%BD%D0%B5%D0%B3_%D1%81_%D1%82%D1%80%D1%83%D0%BF%D0%BE%D0%B2"/>
				<updated>2010-06-26T13:19:41Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: Оформление новое&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В етой теме я напишу как сделать так что б можна было снимать деньги с трупов.&lt;br /&gt;
Нам нада файл treasure_manager.script&lt;br /&gt;
В етом файле находим такие строки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
После строки --printf(&amp;quot;TREASURE USE&amp;quot;)-- пишем&lt;br /&gt;
&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
У нас далжно выйти&lt;br /&gt;
&amp;lt;pre&amp;gt;--' Юзание инициатора (возможность выдать тайник)&lt;br /&gt;
function CTreasure:use(npc)&lt;br /&gt;
	printf(&amp;quot;TREASURE USE&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if (npc and db.actor) then&lt;br /&gt;
		lootmoney.lootmoney(npc)&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Типерь создаём файл lootmoney.script&lt;br /&gt;
и в нём пишем &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function lootmoney(npc)&lt;br /&gt;
	if npc ~= nil and not string.find(npc:section(),&amp;quot;arena&amp;quot;) and npc:character_community()~=&amp;quot;arena_enemy&amp;quot; then&lt;br /&gt;
		local money = npc:money()&lt;br /&gt;
		if money ~= nil and money ~=0 then&lt;br /&gt;
				local deadmoney = money&lt;br /&gt;
&lt;br /&gt;
                                local npc_rank&lt;br /&gt;
		npc_rank = ranks.get_obj_rank_name(npc)&lt;br /&gt;
		if npc_rank ~= nil then&lt;br /&gt;
			if npc_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(25,400)    &lt;br /&gt;
			elseif npc_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=500 then deadmoney=math.random(50,500)  &lt;br /&gt;
			elseif npc_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=600 then deadmoney=math.random(100,600) &lt;br /&gt;
			elseif npc_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=700 then deadmoney=math.random(200,700)  &lt;br /&gt;
                          end&lt;br /&gt;
						  end&lt;br /&gt;
				local news_texti = &amp;quot;\\n%c[255,255,0,0]Мёртвый сталкер: %c[default]&amp;quot;..npc:character_name()..&amp;quot;\\n%c[255,255,0,0]Обнаружено денег: %c[default]&amp;quot;..game.translate_string(tostring(deadmoney)..&amp;quot;руб.&amp;quot;)&lt;br /&gt;
				db.actor:give_game_news(news_texti, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,0,83,47), 1, 4000)&lt;br /&gt;
				db.actor:give_money(deadmoney)&lt;br /&gt;
				game_stats.money_quest_update(deadmoney) &lt;br /&gt;
				npc:give_money(-money)&lt;br /&gt;
				game_stats.money_quest_update(-money)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
теперь создаем файл watcher_act.script и впишем в его&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-- Red75 (c) 2008&lt;br /&gt;
-- Marauder scheme v 1.1&lt;br /&gt;
-- Part of AMK MOD&lt;br /&gt;
&lt;br /&gt;
evid_see_stuff=6931&lt;br /&gt;
evid_near_stuff=evid_see_stuff+1&lt;br /&gt;
evid_see_body=evid_see_stuff+2&lt;br /&gt;
evid_position_corrected=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
actid_reach_item=evid_see_stuff&lt;br /&gt;
actid_grab_item=evid_see_stuff+1&lt;br /&gt;
actid_grab_body=evid_see_stuff+2&lt;br /&gt;
actid_correct_position=evid_see_stuff+3&lt;br /&gt;
&lt;br /&gt;
-- Вызывает closure раз в period, obj[var] хранит время следующего срабатывания&lt;br /&gt;
function timed(obj,var,period,closure)&lt;br /&gt;
	if obj[var] and obj[var]&amp;lt;time_global() then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
		closure()&lt;br /&gt;
	elseif not obj[var] then&lt;br /&gt;
		obj[var]=time_global()+period&lt;br /&gt;
--		closure()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trigger_timed(obj,var)&lt;br /&gt;
	obj[var]=time_global()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local disabled_objects={}&lt;br /&gt;
&lt;br /&gt;
local corpse_checked={} -- true - has loot, false - hasn't loot, nil - not checked&lt;br /&gt;
&lt;br /&gt;
function checkCorpse(obj)&lt;br /&gt;
	if (IsStalker(obj) or IsMonster(obj)) and obj:alive()==false then&lt;br /&gt;
		if corpse_checked[obj:id()]~=nil then&lt;br /&gt;
			return corpse_checked[obj:id()]&lt;br /&gt;
		end&lt;br /&gt;
		local cnt=0&lt;br /&gt;
		obj:iterate_inventory(function (dummy, item)&lt;br /&gt;
        if item:section()~=&amp;quot;bolt&amp;quot; then&lt;br /&gt;
          cnt=cnt+1&lt;br /&gt;
        end&lt;br /&gt;
			end, nil)&lt;br /&gt;
		corpse_checked[obj:id()]=cnt&amp;gt;0&lt;br /&gt;
		return corpse_checked[obj:id()]&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local valuable_clsid={&lt;br /&gt;
    [clsid.art_bast_artefact]=true,&lt;br /&gt;
    [clsid.art_black_drops]=true,&lt;br /&gt;
    [clsid.art_dummy]=true,&lt;br /&gt;
    [clsid.art_electric_ball]=true,&lt;br /&gt;
    [clsid.art_faded_ball]=true,&lt;br /&gt;
    [clsid.art_galantine]=true,&lt;br /&gt;
    [clsid.art_gravi]=true,&lt;br /&gt;
    [clsid.art_gravi_black]=true,&lt;br /&gt;
    [clsid.art_mercury_ball]=true,&lt;br /&gt;
    [clsid.art_needles]=true,&lt;br /&gt;
    [clsid.art_rusty_hair]=true,&lt;br /&gt;
    [clsid.art_thorn]=true,&lt;br /&gt;
    [clsid.art_zuda]=true,&lt;br /&gt;
    [clsid.artefact_s]=true,&lt;br /&gt;
    [clsid.device_detector_simple]=true,&lt;br /&gt;
    [clsid.device_pda]=true,&lt;br /&gt;
    [clsid.device_torch_s]=true,&lt;br /&gt;
    [clsid.equ_exo]=true,&lt;br /&gt;
    [clsid.equ_military]=true,&lt;br /&gt;
    [clsid.equ_scientific]=true,&lt;br /&gt;
    [clsid.equ_stalker_s]=true,&lt;br /&gt;
    [clsid.obj_antirad]=true,&lt;br /&gt;
    [clsid.obj_attachable]=true,&lt;br /&gt;
    [clsid.obj_bandage]=true,&lt;br /&gt;
    [clsid.obj_bolt]=true,&lt;br /&gt;
    [clsid.obj_bottle]=true,&lt;br /&gt;
    [clsid.obj_food]=true,&lt;br /&gt;
    [clsid.obj_medkit]=true,&lt;br /&gt;
    [clsid.wpn_ak74_s]=true,&lt;br /&gt;
    [clsid.wpn_ammo]=true,&lt;br /&gt;
    [clsid.wpn_ammo_m209]=true,&lt;br /&gt;
    [clsid.wpn_ammo_og7b]=true,&lt;br /&gt;
    [clsid.wpn_ammo_vog25]=true,&lt;br /&gt;
    [clsid.wpn_binocular_s]=true,&lt;br /&gt;
    [clsid.wpn_bm16_s]=true,&lt;br /&gt;
    [clsid.wpn_fn2000]=true,&lt;br /&gt;
    [clsid.wpn_fort]=true,&lt;br /&gt;
    [clsid.wpn_groza_s]=true,&lt;br /&gt;
    [clsid.wpn_hpsa_s]=true,&lt;br /&gt;
    [clsid.wpn_knife_s]=true,&lt;br /&gt;
    [clsid.wpn_lr300_s]=true,&lt;br /&gt;
    [clsid.wpn_pm_s]=true,&lt;br /&gt;
    [clsid.wpn_rg6_s]=true,&lt;br /&gt;
    [clsid.wpn_rpg7_s]=true,&lt;br /&gt;
    [clsid.wpn_scope_s]=true,&lt;br /&gt;
    [clsid.wpn_shotgun_s]=true,&lt;br /&gt;
    [clsid.wpn_silencer]=true,&lt;br /&gt;
    [clsid.wpn_svd_s]=true,&lt;br /&gt;
    [clsid.wpn_svu_s]=true,&lt;br /&gt;
    [clsid.wpn_usp45_s]=true,&lt;br /&gt;
    [clsid.wpn_val_s]=true,&lt;br /&gt;
    [clsid.wpn_vintorez_s]=true,&lt;br /&gt;
    [clsid.wpn_walther_s]=true,&lt;br /&gt;
    [clsid.wpn_wmagaz]=true,&lt;br /&gt;
    [clsid.wpn_wmaggl]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj_owner={}&lt;br /&gt;
&lt;br /&gt;
function bgwith(str,ptr)&lt;br /&gt;
	local ps=string.find(str,ptr)&lt;br /&gt;
	return ps~=nil and ps==1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isValuable(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  if sec==&amp;quot;amk_metka&amp;quot; then&lt;br /&gt;
    return false,false&lt;br /&gt;
  end&lt;br /&gt;
	if valuable_clsid[obj:clsid()] then&lt;br /&gt;
		return true, false&lt;br /&gt;
	end&lt;br /&gt;
	return bgwith(sec,&amp;quot;af_&amp;quot;) or bgwith(sec,&amp;quot;ammo_&amp;quot;) or bgwith(sec,&amp;quot;wpn_&amp;quot;) or bgwith(sec,&amp;quot;energy_&amp;quot;) or checkCorpse(obj), IsStalker(obj) or IsMonster(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function objValue(obj)&lt;br /&gt;
	local sec=obj:section()&lt;br /&gt;
  local multiplier=1&lt;br /&gt;
  if bgwith(sec,&amp;quot;ammo_&amp;quot;) then&lt;br /&gt;
    multiplier=30&lt;br /&gt;
  elseif sec==&amp;quot;vodka&amp;quot; then&lt;br /&gt;
    multiplier=20&lt;br /&gt;
  end&lt;br /&gt;
	if system_ini():section_exist(sec) and system_ini():line_exist(sec,&amp;quot;cost&amp;quot;) then&lt;br /&gt;
		return system_ini():r_float(sec,&amp;quot;cost&amp;quot;)*multiplier&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function claimGObject(npc,st,obj)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
	end&lt;br /&gt;
	st.grabitemid=obj:id()&lt;br /&gt;
	obj_owner[obj:id()]=npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function freeGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		obj_owner[st.grabitemid]=nil&lt;br /&gt;
		st.grabitemid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function clearGObject(st)&lt;br /&gt;
	st.grabitemid=nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getGObject(st)&lt;br /&gt;
	if st.grabitemid then&lt;br /&gt;
		local ret=level.object_by_id(st.grabitemid)&lt;br /&gt;
		if ret==nil then&lt;br /&gt;
			st.grabitemid=nil&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mypGObject(npc,st)&lt;br /&gt;
	return st.grabitemid~=nil and obj_owner[st.grabitemid]~=nil and obj_owner[st.grabitemid]==npc:id()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local bad_dangers={&lt;br /&gt;
  [danger_object.hit]=true,&lt;br /&gt;
  [danger_object.attacked]=true,&lt;br /&gt;
  [danger_object.bullet_ricochet]=true,&lt;br /&gt;
  [danger_object.grenade]=true,&lt;br /&gt;
  [danger_object.entity_death]=true,&lt;br /&gt;
  [danger_object.enemy_sound]=true&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
local inertion_time=30000&lt;br /&gt;
&lt;br /&gt;
function bad_danger(npc)&lt;br /&gt;
  local danger=npc:best_danger()&lt;br /&gt;
  if danger then&lt;br /&gt;
    return bad_dangers[danger:type()] and time_global()-danger:time()&amp;lt;inertion_time&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
function ev_see_stuff:evaluate()&lt;br /&gt;
	local res=getGObject(self.st)~=nil&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  local actsch=db.storage[npc:id()].active_scheme&lt;br /&gt;
  if actsch and db.actor then&lt;br /&gt;
    xr_logic.try_switch_to_another_section(npc, db.storage[npc:id()][actsch], db.actor)&lt;br /&gt;
  end&lt;br /&gt;
	local act_sec=db.storage[npc:id()].active_section or &amp;quot;&amp;quot;&lt;br /&gt;
	if (not npc:alive()) or xr_wounded.is_wounded(npc) or npc:best_enemy() or &lt;br /&gt;
      bad_danger(npc) or (actsch and db.storage[npc:id()][actsch].no_loot) then&lt;br /&gt;
		if res then&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; distracted. sect &amp;quot;..act_sec,&amp;quot;grb&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  local dist_limit=1000&lt;br /&gt;
  if bgwith(act_sec,&amp;quot;camper&amp;quot;) then&lt;br /&gt;
    dist_limit=5&lt;br /&gt;
  end&lt;br /&gt;
	local busy=bgwith(act_sec,&amp;quot;walker&amp;quot;) or bgwith(act_sec,&amp;quot;combat&amp;quot;) or bgwith(act_sec,&amp;quot;danger&amp;quot;) -- or npc:best_danger()&lt;br /&gt;
	if res and self.st.block_search then&lt;br /&gt;
	  -- NPC собрался взять вещь. Временно прекратим поиск.&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	timed(self.st,&amp;quot;tm1&amp;quot;,5000+math.random()*10000,&lt;br /&gt;
		function ()&lt;br /&gt;
--			amk.mylog(npc:name() .. &amp;quot; is going to search stuff&amp;quot;,&amp;quot;grb&amp;quot;)&lt;br /&gt;
			local min_dist=100000&lt;br /&gt;
			local function check_item(o)&lt;br /&gt;
				local obj=o:object()&lt;br /&gt;
				if obj_owner[obj:id()] and (level.object_by_id(obj_owner[obj:id()])==nil or level.object_by_id(obj_owner[obj:id()]):alive()==false) then&lt;br /&gt;
					obj_owner[obj:id()]=nil&lt;br /&gt;
				end&lt;br /&gt;
				if (not self.st.disabled_objects[obj:id()]) and (obj:parent()==nil or not IsStalker(obj:parent())) and &lt;br /&gt;
           (obj_owner[obj:id()]==nil or obj_owner[obj:id()]==npc:id()) and npc:accessible(obj:level_vertex_id()) and&lt;br /&gt;
           (db.actor==nil or db.actor:alive()==false or db.actor:position():distance_to_sqr(obj:position())&amp;gt;6) then&lt;br /&gt;
					local valuable,corpse=isValuable(obj)&lt;br /&gt;
					if valuable then &lt;br /&gt;
						local value=3000&lt;br /&gt;
						if not corpse then&lt;br /&gt;
							value=objValue(obj)&lt;br /&gt;
						end&lt;br /&gt;
						if value&amp;lt;=0 then value=0 end&lt;br /&gt;
						local max_dist=5+math.sqrt(value)&lt;br /&gt;
						if busy then&lt;br /&gt;
							max_dist=max_dist/5&lt;br /&gt;
						end&lt;br /&gt;
						local dist=level.vertex_position(obj:level_vertex_id()):distance_to(npc:position())&lt;br /&gt;
            local corrected_dist=dist&lt;br /&gt;
            if dist&amp;gt;5 then&lt;br /&gt;
              corrected_dist=5+(dist-5)/math.sqrt(value)&lt;br /&gt;
            end&lt;br /&gt;
						if dist&amp;lt;max_dist and corrected_dist&amp;lt;min_dist and dist&amp;lt;dist_limit then&lt;br /&gt;
              min_dist=corrected_dist&lt;br /&gt;
							claimGObject(npc,self.st,obj)&lt;br /&gt;
							res=true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end -- function check_item&lt;br /&gt;
			for o in npc:memory_visible_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
			for o in npc:memory_sound_objects() do&lt;br /&gt;
				check_item(o)&lt;br /&gt;
			end&lt;br /&gt;
--			for o in npc:not_yet_visible_objects() do&lt;br /&gt;
--				check_item(o)&lt;br /&gt;
--			end&lt;br /&gt;
			if res then &lt;br /&gt;
				amk.mylog(npc:name() .. &amp;quot; claimed &amp;quot;..getGObject(self.st):name()..&amp;quot; cact &amp;quot;..tostring(npc:motivation_action_manager():current_action_id()),&amp;quot;grb&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	return res -- false -- res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_near_stuff&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:__init(st,name) super(nil, name)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_near_stuff:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if gi then&lt;br /&gt;
    if self.st.dest_lvid then&lt;br /&gt;
      return npc:level_vertex_id()==self.st.dest_lvid&lt;br /&gt;
    end&lt;br /&gt;
    return level.vertex_position(gi:level_vertex_id()):distance_to_sqr(npc:position())&amp;lt;1&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_see_body&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:__init(st) super(nil, &amp;quot;ev_see_body&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_see_body:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi then&lt;br /&gt;
    return IsStalker(gi) or IsMonster(gi)&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;ev_position_corrected&amp;quot; (property_evaluator)&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:__init(st) super(nil, &amp;quot;ev_position_corrected&amp;quot;)&lt;br /&gt;
	self.st=st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ev_position_corrected:evaluate()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
  return self.st.position_corrected==true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	npc:set_item(object.idle,nil)&lt;br /&gt;
	npc:set_movement_type(move.walk)&lt;br /&gt;
	npc:set_mental_state(anim.danger)&lt;br /&gt;
	npc:set_body_state(move.crouch)&lt;br /&gt;
  npc:movement_enabled(true)&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
--	if gi then npc:set_sight(gi,true,true) end&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab item&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
    if(IsStalker(gi) or IsMonster(gi)) then&lt;br /&gt;
  		self.tt=time_global()+3000&lt;br /&gt;
  	else&lt;br /&gt;
  		self.tt=time_global()+1000&lt;br /&gt;
    	utils.send_to_nearest_accessible_vertex(npc,gi:level_vertex_id())&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	end&lt;br /&gt;
	--npc:set_dest_level_vertex_id(1)&lt;br /&gt;
	self.force=vector():set(0,0,0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
			gi:transfer_item(gi,npc)&lt;br /&gt;
			npc:enable_memory_object(gi,false)&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_item:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	npc:set_sight(look.danger,nil,0)&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_grab_body&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:__init (st) super (nil, &amp;quot;act_grab_body&amp;quot;)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to grab body&amp;quot;,&amp;quot;stmt&amp;quot;)&lt;br /&gt;
	self.st.block_search=true&lt;br /&gt;
	if gi then&lt;br /&gt;
 		self.tt=time_global()+6000&lt;br /&gt;
    state_mgr.set_state(npc,&amp;quot;search&amp;quot;,nil,nil,{look_object=gi})&lt;br /&gt;
  else&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  if not gi then&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
    return&lt;br /&gt;
  end&lt;br /&gt;
	if self.tt&amp;lt;time_global() then&lt;br /&gt;
		if gi and gi:parent()==nil then&lt;br /&gt;
      gi:iterate_inventory(function (d,item)&lt;br /&gt;
          if item:section()~=&amp;quot;bolt&amp;quot; then &lt;br /&gt;
            gi:transfer_item(item,npc)&lt;br /&gt;
          end&lt;br /&gt;
        end, nil)&lt;br /&gt;
		local num=gi:money() &lt;br /&gt;
		if num and num &amp;gt;0 then &lt;br /&gt;
				local deadmoney = num&lt;br /&gt;
				local gi_rank&lt;br /&gt;
		gi_rank = ranks.get_obj_rank_name(gi)&lt;br /&gt;
		if gi_rank ~= nil then&lt;br /&gt;
			if gi_rank == &amp;quot;novice&amp;quot; and deadmoney &amp;gt;=100 then deadmoney=math.random(25,100)    &lt;br /&gt;
			elseif gi_rank == &amp;quot;experienced&amp;quot; and deadmoney &amp;gt;=200 then deadmoney=math.random(50,200)  &lt;br /&gt;
			elseif gi_rank == &amp;quot;veteran&amp;quot; and deadmoney &amp;gt;=300 then deadmoney=math.random(100,300) &lt;br /&gt;
			elseif gi_rank == &amp;quot;master&amp;quot; and deadmoney &amp;gt;=400 then deadmoney=math.random(200,400)  &lt;br /&gt;
		end&lt;br /&gt;
		end&lt;br /&gt;
		npc:give_money(deadmoney) &lt;br /&gt;
		game_stats.money_quest_update(deadmoney) &lt;br /&gt;
		gi:give_money(-num) &lt;br /&gt;
		game_stats.money_quest_update(-num) &lt;br /&gt;
		end&lt;br /&gt;
      corpse_checked[gi:id()]=false&lt;br /&gt;
			amk.mylog(npc:name() .. &amp;quot; has taken &amp;quot;..gi:name(),&amp;quot;grb&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- Тут нельзя освобождать объект. transfer_item выполняется асинхронно. Поэтому делаем clearGObject&lt;br /&gt;
		clearGObject(self.st)&lt;br /&gt;
		--freeGObject(self.st) &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_grab_body:finalize()&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	self.st.block_search=nil&lt;br /&gt;
	trigger_timed(self.st,&amp;quot;tm1&amp;quot;)&lt;br /&gt;
  self.st.dest_lvid=nil -- Очищаем скорректированную точку назначения&lt;br /&gt;
	action_base.finalize(self)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function correct_position(gi,npc)&lt;br /&gt;
  if IsStalker(gi) then&lt;br /&gt;
    -- Вычисляем вектор разницы между координатами кости и level vertex. Пытаемся найти level vertex наиболее близкий к кости&lt;br /&gt;
    local diff=gi:bone_position(&amp;quot;bip01_head&amp;quot;):sub(level.vertex_position(gi:level_vertex_id()))&lt;br /&gt;
    local len=diff:magnitude()&lt;br /&gt;
    local diffp=vector():set(diff.z,0,-diff.x):mul(0.5)&lt;br /&gt;
    -- Сдвигаем целевую точку вбок, чтобы непись не залазил ногами в труп&lt;br /&gt;
    diff:add(diffp)&lt;br /&gt;
    return npc:vertex_in_direction(gi:level_vertex_id(),diff,len)&lt;br /&gt;
  else&lt;br /&gt;
    return gi:level_vertex_id()&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;act_reach_item&amp;quot; (action_base)&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:__init (action_name, st) super (nil, action_name)&lt;br /&gt;
  self.st = st&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:initialize()&lt;br /&gt;
	action_base.initialize(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
  self.st.dest_lvid=nil&lt;br /&gt;
  self.tgt_lvid=0&lt;br /&gt;
	if gi then&lt;br /&gt;
		if npc:accessible(gi:level_vertex_id()) then&lt;br /&gt;
		  npc:set_detail_path_type(move.curve)&lt;br /&gt;
		  npc:set_path_type(game_object.level_path)&lt;br /&gt;
      if npc:best_danger() and time_global()-npc:best_danger():time()&amp;lt;inertion_time then&lt;br /&gt;
        npc:set_mental_state(anim.danger)&lt;br /&gt;
        npc:set_body_state(move.crouch)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
--        npc:set_sight(gi,true,true)&lt;br /&gt;
      else&lt;br /&gt;
        npc:set_body_state(move.standing)&lt;br /&gt;
        npc:set_mental_state(anim.free)&lt;br /&gt;
        npc:set_movement_type(move.walk)&lt;br /&gt;
      end&lt;br /&gt;
      npc:movement_enabled(true)&lt;br /&gt;
      if npc:best_weapon() and isWeapon(npc:best_weapon()) then&lt;br /&gt;
--        npc:set_item(object.idle,npc:best_weapon())&lt;br /&gt;
      end&lt;br /&gt;
--			npc:set_dest_level_vertex_id(gi:level_vertex_id())&lt;br /&gt;
			npc:set_sight(look.danger,nil,0)&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) --gi:level_vertex_id()&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
		else&lt;br /&gt;
			freeGObject(self.st)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	self.ct=time_global()&lt;br /&gt;
	self.clvid=npc:level_vertex_id()&lt;br /&gt;
  self.st.position_corrected=false&lt;br /&gt;
	amk.mylog(self.object:name()..&amp;quot; is going to reach item&amp;quot;,&amp;quot;stmt&amp;quot;)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function act_reach_item:execute()&lt;br /&gt;
	action_base.execute(self)&lt;br /&gt;
	local npc=self.object&lt;br /&gt;
	local gi=getGObject(self.st)&lt;br /&gt;
	if gi and gi:parent()~=nil then&lt;br /&gt;
		-- ГГ забрал вкусность. Можно добавить наезд на ГГ.&lt;br /&gt;
    self.st.dest_lvid=nil&lt;br /&gt;
		freeGObject(self.st)&lt;br /&gt;
	elseif gi then&lt;br /&gt;
		if self.clvid==npc:level_vertex_id() then&lt;br /&gt;
			if time_global()-self.ct&amp;gt;10000 then&lt;br /&gt;
			-- не можем добраться до нняки&lt;br /&gt;
				self.st.disabled_objects[gi:id()]=true&lt;br /&gt;
        self.st.dest_lvid=nil&lt;br /&gt;
				freeGObject(self.st)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			self.clvid=npc:level_vertex_id()&lt;br /&gt;
			self.ct=time_global()&lt;br /&gt;
		end&lt;br /&gt;
    if self.tgt_lvid~=gi:level_vertex_id() then&lt;br /&gt;
      self.tgt_lvid=gi:level_vertex_id()&lt;br /&gt;
      self.st.dest_lvid=correct_position(gi,npc) -- gi:level_vertex_id()&lt;br /&gt;
			npc:set_dest_level_vertex_id(self.st.dest_lvid)&lt;br /&gt;
    end&lt;br /&gt;
				--npc:set_sight(gi)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_to_binder(object, char_ini, scheme, section, st)&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	local npc=object&lt;br /&gt;
	st.disabled_objects={}&lt;br /&gt;
  local manager = object:motivation_action_manager()&lt;br /&gt;
&lt;br /&gt;
  local zombi=npc:character_community()==&amp;quot;zombied&amp;quot; or npc:character_community()==&amp;quot;trader&amp;quot; or&lt;br /&gt;
          npc:character_community()==&amp;quot;arena_enemy&amp;quot; or npc:name()==&amp;quot;mil_stalker0012&amp;quot; or npc:name()==&amp;quot;yantar_ecolog_general&amp;quot; or -- сумашедший на милитари и Сахаров&lt;br /&gt;
          npc:name()==&amp;quot;mil_freedom_member0021&amp;quot; -- Скрягу в зомби!&lt;br /&gt;
	&lt;br /&gt;
	local prop_idlecombat=xr_evaluators_id.state_mgr + 3&lt;br /&gt;
  local prop_contact=xr_evaluators_id.stohe_meet_base + 1&lt;br /&gt;
  -- Evaluators&lt;br /&gt;
	if npc:story_id()~=4294967296 or zombi then&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, property_evaluator_const(false))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, property_evaluator_const(false))&lt;br /&gt;
	else&lt;br /&gt;
	  manager:add_evaluator(evid_see_stuff, ev_see_stuff(st,&amp;quot;ev_see_stuff&amp;quot;))&lt;br /&gt;
	  manager:add_evaluator(evid_see_body, ev_see_body(st))&lt;br /&gt;
	  manager:add_evaluator(evid_position_corrected, ev_position_corrected(st))&lt;br /&gt;
	  manager:add_evaluator(evid_near_stuff, ev_near_stuff(st,&amp;quot;ev_near_stuff&amp;quot;))&lt;br /&gt;
	  -- Actions&lt;br /&gt;
	  local action = act_grab_item(&amp;quot;act_grab_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true)) -- отключим стэйт менеджер&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,true)) -- для переключения на обыск трупа&lt;br /&gt;
	  manager:add_action (actid_grab_item, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_grab_body(st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_body,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,true))&lt;br /&gt;
--	  action:add_precondition(world_property(evid_position_corrected,true))&lt;br /&gt;
	  action:add_effect(world_property(evid_near_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_stuff, false))&lt;br /&gt;
	  action:add_effect(world_property(evid_see_body,false)) -- переключаемся на подъём вещички&lt;br /&gt;
	  manager:add_action (actid_grab_body, action)&lt;br /&gt;
&lt;br /&gt;
	  action = act_reach_item(&amp;quot;act_reach_item&amp;quot;, st)&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_alive,true))&lt;br /&gt;
		action:add_precondition(world_property(stalker_ids.property_enemy,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_contact,false))&lt;br /&gt;
--		action:add_precondition(world_property(stalker_ids.property_danger,false))&lt;br /&gt;
		action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_anomaly,false))&lt;br /&gt;
	  action:add_precondition(world_property(blowout_scheme.evid_blowout,false))&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,true))&lt;br /&gt;
	  action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
	  action:add_precondition(world_property(prop_idlecombat,true))&lt;br /&gt;
	  action:add_effect (world_property(evid_near_stuff, true))&lt;br /&gt;
	  manager:add_action (actid_reach_item, action)&lt;br /&gt;
		&lt;br /&gt;
	  action = manager:action(xr_actions_id.alife) &lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
    action = manager:action(stalker_ids.action_danger_planner)&lt;br /&gt;
	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--    action:add_precondition(world_property(evid_near_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_kamp_base + 3) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))&lt;br /&gt;
		&lt;br /&gt;
--	  action = manager:action(xr_actions_id.stohe_meet_base+1) &lt;br /&gt;
--	  action:add_precondition(world_property(evid_see_stuff,false))	&lt;br /&gt;
--	amk.mylog(&amp;quot;addtb end &amp;quot;..object:name(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_scheme(npc, ini, scheme, section)&lt;br /&gt;
--	amk.mylog(&amp;quot;set scheme &amp;quot;..npc:name()..&amp;quot; story_id &amp;quot;..npc:story_id(),&amp;quot;pln&amp;quot;)&lt;br /&gt;
  local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)&lt;br /&gt;
  st.ini=ini&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Теперь осталось содать скрипт amk.script --у кого есть ненадо--&lt;br /&gt;
и вписываем в него&lt;br /&gt;
&lt;br /&gt;
local npc_spawner={}  --служебный массив, работает автоматически - не трогать шаловливыми русками&lt;br /&gt;
&lt;br /&gt;
local timers={}   --хранит реал-тайм таймеры&lt;br /&gt;
local g_timers={} --хранит таймеры в игровом времени&lt;br /&gt;
local markers={}  --хранит маркеры на карте&lt;br /&gt;
local x_objs={}     --хранит ИДшники объектов&lt;br /&gt;
local timer_trigger=nil&lt;br /&gt;
convert_npc={}&lt;br /&gt;
g_kick=false&lt;br /&gt;
&lt;br /&gt;
is_debug = false&lt;br /&gt;
ver = &amp;quot;0&amp;quot;&lt;br /&gt;
oau_watchdog=0&lt;br /&gt;
oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
--переменные для типсов&lt;br /&gt;
pda_news = xr_sound.get_safe_sound_object([[device\pda\pda_news]])&lt;br /&gt;
pda_tips = xr_sound.get_safe_sound_object([[device\pda\pda_tip]])&lt;br /&gt;
pda_task = xr_sound.get_safe_sound_object([[device\pda\pda_objective]])&lt;br /&gt;
&lt;br /&gt;
tips_icons = {&lt;br /&gt;
  default  = { 0, 658},&lt;br /&gt;
  trader   = { 332, 893},&lt;br /&gt;
  dolg     = { 0, 658},&lt;br /&gt;
  freedom  = { 0, 658},&lt;br /&gt;
  ecolog   = { 498, 0},&lt;br /&gt;
  arena    = { 332, 141},&lt;br /&gt;
  stalker  = { 0, 658},&lt;br /&gt;
  krot     = { 332, 47},&lt;br /&gt;
  barman   = { 332, 235},&lt;br /&gt;
  wolf   = { 332, 940},&lt;br /&gt;
  o_soznanie = { 498, 893},&lt;br /&gt;
  monolith = { 0, 658},&lt;br /&gt;
    saharov  = { 332, 470},&lt;br /&gt;
    prizrak  = { 0, 658},&lt;br /&gt;
    killer   = { 0, 658},&lt;br /&gt;
  death     = { 0, 752},&lt;br /&gt;
  gen_info  = { 0, 658},&lt;br /&gt;
	trade 		= { 0, 0},&lt;br /&gt;
  uniq  =  {  498, 47}    --{ 498, 188}&lt;br /&gt;
}&lt;br /&gt;
----------------&lt;br /&gt;
local bufferedmessages={}&lt;br /&gt;
&lt;br /&gt;
function logct(msg,tag)&lt;br /&gt;
	if true and (tag and (tag==&amp;quot;mcbt&amp;quot; or tag==&amp;quot;temp&amp;quot;)) then --(tag==&amp;quot;dram&amp;quot;)) then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))		&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function rep(npc,msg,tag)&lt;br /&gt;
	if string.find(npc:name(),&amp;quot;gar_dm&amp;quot;) then&lt;br /&gt;
		logct(msg,tag)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mylog(msg)&lt;br /&gt;
  if is_debug then &lt;br /&gt;
	  if msg==nil then&lt;br /&gt;
	    return &lt;br /&gt;
	  end&lt;br /&gt;
	  if db and db.actor then&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      for k,v in ipairs(bufferedmessages) do&lt;br /&gt;
	        db.actor:give_game_news(v, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	      end&lt;br /&gt;
	      bufferedmessages=nil&lt;br /&gt;
	    end&lt;br /&gt;
	  db.actor:give_game_news(msg, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(0,658,83,47), 0, 15000)&lt;br /&gt;
	  else&lt;br /&gt;
	    if bufferedmessages then&lt;br /&gt;
	      table.insert(bufferedmessages,msg)&lt;br /&gt;
	    end&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	  if get_console() then&lt;br /&gt;
	    get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..string.sub(msg,1,200))&lt;br /&gt;
	    get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
	  end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--показываем типс&lt;br /&gt;
function send_tip(news_text, header, timeout, showtime, sender, sound)&lt;br /&gt;
  if news_text==nil then return end&lt;br /&gt;
  if header==nil then header=game.translate_string(&amp;quot;st_tip&amp;quot;) end&lt;br /&gt;
  if timeout == nil then timeout = 0 end&lt;br /&gt;
  if showtime == nil then showtime = 5 end&lt;br /&gt;
  &lt;br /&gt;
  local player&lt;br /&gt;
  if sound==&amp;quot;news&amp;quot; then&lt;br /&gt;
    player=pda_news&lt;br /&gt;
  elseif sound==&amp;quot;task&amp;quot; then&lt;br /&gt;
    player=pda_task&lt;br /&gt;
  else&lt;br /&gt;
    player=pda_tips&lt;br /&gt;
  end   &lt;br /&gt;
  &lt;br /&gt;
  --' Играем дефолтный звук&lt;br /&gt;
  player:play(db.actor, timeout, sound_object.s2d)&lt;br /&gt;
  &lt;br /&gt;
  if sender == nil then&lt;br /&gt;
    sender = &amp;quot;default&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
  local x = tips_icons[sender][1]&lt;br /&gt;
  local y = tips_icons[sender][2]&lt;br /&gt;
  &lt;br /&gt;
  local news_text = &amp;quot;%c[255,160,160,160]&amp;quot;..header..&amp;quot;\\n&amp;quot;..&amp;quot;%c[default]&amp;quot;..news_text&lt;br /&gt;
  db.actor:give_game_news(news_text, &amp;quot;ui\\ui_iconsTotal&amp;quot;, Frect():set(x,y,83,47), timeout*1000, showtime*1000)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function add_spot_on_map(obj_id,type,text)&lt;br /&gt;
  --возможные типы type смотри в ui\map_spots.xml &lt;br /&gt;
  if obj_id then&lt;br /&gt;
    if text==nil then text=&amp;quot; &amp;quot; end&lt;br /&gt;
    -- Ставим метку на серверный объект чтобы её не пришлось обновлять&lt;br /&gt;
    level.map_add_object_spot_ser(obj_id, type, text)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id, type)&lt;br /&gt;
--    save_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id, text)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function remove_spot_from_map(obj_id,type)&lt;br /&gt;
  if obj_id and level.map_has_object_spot(obj_id, type)~= 0 then&lt;br /&gt;
    level.map_remove_object_spot(obj_id, type)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_type_&amp;quot;..obj_id)&lt;br /&gt;
--    del_variable(&amp;quot;x_marker_text_&amp;quot;..obj_id)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в реальном времени&lt;br /&gt;
function start_timer(name,delay,action)&lt;br /&gt;
  if not delay then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if not action then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;xt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;xt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;xd&amp;quot;..a, time+delay*1000*system_ini():r_float(&amp;quot;alife&amp;quot;,&amp;quot;time_factor&amp;quot;))&lt;br /&gt;
  save_variable(&amp;quot;xp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--старт таймера в игровом времени&lt;br /&gt;
function g_start_timer(name,delay_d,delay_h,delay_m,action)&lt;br /&gt;
    local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  if delay_d==nil or delay_h==nil or delay_m==nil then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if action==nil then&lt;br /&gt;
    action = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local a=1&lt;br /&gt;
  while db.storage[db.actor:id()].pstor[&amp;quot;gt&amp;quot;..a] do&lt;br /&gt;
    a=a+1&lt;br /&gt;
    if a&amp;gt;100 then &lt;br /&gt;
      return false &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  save_variable(&amp;quot;gt&amp;quot;..a, name)&lt;br /&gt;
  save_variable(&amp;quot;gd&amp;quot;..a, time+delay_d*60*24+delay_h*60+delay_m)&lt;br /&gt;
  save_variable(&amp;quot;gp&amp;quot;..a, action)&lt;br /&gt;
&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_g_timer(name)&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp and tmp==name then&lt;br /&gt;
      return true&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Временное хранилище для переменных удалённых из pstor&lt;br /&gt;
local emerg_store&lt;br /&gt;
-- Удаляем переменные из pstor. Чтобы не переполнить буфер&lt;br /&gt;
function emergency_cleanup()&lt;br /&gt;
  emerg_store={}&lt;br /&gt;
  if load_variable(&amp;quot;zombied&amp;quot;,false) then&lt;br /&gt;
    emerg_store.zombied=load_table(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
    del_variable(&amp;quot;zombied&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  for i=1,100,1 do&lt;br /&gt;
    if load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
      emerg_store[i]={}&lt;br /&gt;
      emerg_store[i].gt=load_variable(&amp;quot;gt&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gd=load_variable(&amp;quot;gd&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      emerg_store[i].gp=load_variable(&amp;quot;gp&amp;quot;..i,&amp;quot;&amp;quot;)&lt;br /&gt;
      del_variable(&amp;quot;gt&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gd&amp;quot;..i)&lt;br /&gt;
      del_variable(&amp;quot;gp&amp;quot;..i)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  save_variable(&amp;quot;emerg&amp;quot;,true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Восстанавливаем удалённые переменные&lt;br /&gt;
function emergency_restore()&lt;br /&gt;
  for k,v in pairs(emerg_store) do&lt;br /&gt;
    if k==&amp;quot;zombied&amp;quot; then&lt;br /&gt;
      save_table(k,v)&lt;br /&gt;
    else&lt;br /&gt;
      save_variable(&amp;quot;gt&amp;quot;..k,v.gt)&lt;br /&gt;
      save_variable(&amp;quot;gd&amp;quot;..k,v.gd)&lt;br /&gt;
      save_variable(&amp;quot;gp&amp;quot;..k,v.gp)      &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  del_variable(&amp;quot;emerg&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function convert_timers()&lt;br /&gt;
  if load_variable(&amp;quot;tmcv&amp;quot;,true) then&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_timer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_timer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;xt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;xd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;xp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    for a=1,100,1 do&lt;br /&gt;
      tmp=load_variable(&amp;quot;x_gtimer_&amp;quot;..a,nil)&lt;br /&gt;
      if tmp~=nil then&lt;br /&gt;
        local name,delay,params=tmp,load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;,0),load_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_delay&amp;quot;)&lt;br /&gt;
        del_variable(&amp;quot;x_gtimer_&amp;quot;..a..&amp;quot;_params&amp;quot;)&lt;br /&gt;
        save_variable(&amp;quot;gt&amp;quot;..a,name)&lt;br /&gt;
        save_variable(&amp;quot;gd&amp;quot;..a,delay)&lt;br /&gt;
        save_variable(&amp;quot;gp&amp;quot;..a,params)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    save_variable(&amp;quot;tmcv&amp;quot;,false)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--проверка таймеров, использует 3 следующие за ним функции для выбора действия&lt;br /&gt;
function check_timers()&lt;br /&gt;
  local tmp&lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;xt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  for a=1,100,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;gt&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      __g_timer_found(a)  &lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __timer_found(idx)&lt;br /&gt;
    local time = game.time() --time in seconds since 1970&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;xd&amp;quot;..idx, nil)&amp;lt;=time then&lt;br /&gt;
    name=load_variable(&amp;quot;xt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;xp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;xt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;xp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __g_timer_found(idx)&lt;br /&gt;
    local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes()  --time in game minutes&lt;br /&gt;
  local name,params&lt;br /&gt;
  if load_variable(&amp;quot;gd&amp;quot;..idx, nil)&amp;lt;=gtime then&lt;br /&gt;
    name=load_variable(&amp;quot;gt&amp;quot;..idx, nil)&lt;br /&gt;
    params=load_variable(&amp;quot;gp&amp;quot;..idx, nil)&lt;br /&gt;
    del_variable(&amp;quot;gt&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gd&amp;quot;..idx)&lt;br /&gt;
    del_variable(&amp;quot;gp&amp;quot;..idx)&lt;br /&gt;
		oau_reason=name..&amp;quot; &amp;quot;..params&lt;br /&gt;
    __do_timer_action(name,params)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
function __do_timer_action(select_string,params_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
  if select_string==&amp;quot;show_news&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;show_news&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;gg_need_sleep&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_nrg&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_nrg&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
--[[&lt;br /&gt;
if select_string==&amp;quot;sleep_med&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_med&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
 ]]--&lt;br /&gt;
  if select_string==&amp;quot;sleep_matras&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_matras&amp;quot;,params_string)&lt;br /&gt;
  end &lt;br /&gt;
  if select_string==&amp;quot;sleep_tr_item&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_tr_item&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_notebook&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;test_for_need_sleep_notebook&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;block_sleep_menu&amp;quot; then&lt;br /&gt;
    save_variable(&amp;quot;block_sleep_menu&amp;quot;,0)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;radar_fix&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;radar_fix&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;af_transform&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;af_transform_end&amp;quot;,unpack_array_from_string(params_string))&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;amk_freeplay&amp;quot; then&lt;br /&gt;
    if amk.load_variable(&amp;quot;freeplay&amp;quot;,0)==1 and level.name()==&amp;quot;l12_stancia_2&amp;quot; then&lt;br /&gt;
      xr_effects.game_credits()&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Blowout_pp&amp;quot;,params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;test&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blowout_ss&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;blowout_scary_sounds&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;blow_shift&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;Run_Blowout_pp&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;sleep_repbox&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;repbox_cond&amp;quot; then&lt;br /&gt;
    mod_call(&amp;quot;after_repair_weapon&amp;quot;, params_string)&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;collect_anomalies_info&amp;quot; then&lt;br /&gt;
    amk_anoms.collect_info()&lt;br /&gt;
  end&lt;br /&gt;
  if select_string==&amp;quot;news_check&amp;quot; then&lt;br /&gt;
    if (news_main and news_main.check_news) then&lt;br /&gt;
		news_main.check_news()&lt;br /&gt;
	end&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
-----------&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--спавним объекты на карту&lt;br /&gt;
--для спавна неписей смотрим config\creatures\spawn_sections.ltx - там написаны имена секций для разных типов неписей&lt;br /&gt;
function spawn_item(spawn_item, pos, gv,lv)&lt;br /&gt;
  if gv==nil then gv=db.actor:game_vertex_id() end&lt;br /&gt;
  if lv==nil then lv=db.actor:level_vertex_id() end&lt;br /&gt;
  return alife():create(spawn_item, pos, lv, gv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для спавна патронов используем spawn_ammo_in_inv&lt;br /&gt;
function spawn_item_in_inv(spawn_item,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  return alife():create(spawn_item, &lt;br /&gt;
      npc:position(),&lt;br /&gt;
      npc:level_vertex_id(),  &lt;br /&gt;
      npc:game_vertex_id(),&lt;br /&gt;
      npc:id())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--используем для спавна патронов&lt;br /&gt;
function spawn_ammo_in_inv(spawn_item,number,npc)&lt;br /&gt;
  if npc==nil then &lt;br /&gt;
    npc=db.actor &lt;br /&gt;
  end&lt;br /&gt;
  if number &amp;gt; 0 then&lt;br /&gt;
    return se_respawn.create_ammo(spawn_item, &lt;br /&gt;
        npc:position(),&lt;br /&gt;
        npc:level_vertex_id(),  &lt;br /&gt;
        npc:game_vertex_id(),&lt;br /&gt;
        npc:id(),&lt;br /&gt;
        number)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- удаляем объект из игры&lt;br /&gt;
function remove_item(remove_item)&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выбрасываем объект из инвентаря, применимо к ГГ&lt;br /&gt;
function drop_item(npc,item)&lt;br /&gt;
  if item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(item)&lt;br /&gt;
    npc:drop_item(item)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--убиваем непися&lt;br /&gt;
function make_suicide(npc)&lt;br /&gt;
  npc:kill(npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--узнаем отношение одного непися к другому&lt;br /&gt;
function get_npc_relation(obj,target)&lt;br /&gt;
  local rel = obj:relation(target)&lt;br /&gt;
  local relation&lt;br /&gt;
  if rel==game_object.neutral then&lt;br /&gt;
    relation=&amp;quot;neutral&amp;quot;&lt;br /&gt;
  elseif rel==game_object.friend then&lt;br /&gt;
    relation=&amp;quot;friend&amp;quot;&lt;br /&gt;
  elseif rel==game_object.enemy then&lt;br /&gt;
    relation=&amp;quot;enemy&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
  return relation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--задаем отношение одного непися к другому&lt;br /&gt;
function set_npc_relation(obj,target,relation)&lt;br /&gt;
  local rel&lt;br /&gt;
  if relation==&amp;quot;neutral&amp;quot; then&lt;br /&gt;
    rel=game_object.neutral&lt;br /&gt;
  elseif relation==&amp;quot;friend&amp;quot; then&lt;br /&gt;
    rel=game_object.friend&lt;br /&gt;
  elseif relation==&amp;quot;enemy&amp;quot; then&lt;br /&gt;
    rel=game_object.enemy&lt;br /&gt;
  else&lt;br /&gt;
    return false&lt;br /&gt;
  end &lt;br /&gt;
  obj:set_relation(rel,target)&lt;br /&gt;
  return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- узнаем группировку непися, применимо к ГГ, только ОНЛАЙН&lt;br /&gt;
function get_npc_community(npc)&lt;br /&gt;
  return npc:character_community()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- выставляем группировку непися, можно ГГ, только ОНЛАЙН&lt;br /&gt;
function set_npc_community(npc,community_string)&lt;br /&gt;
  --значения для community_string можно узнать в config\creatures\game_relations.ltx&lt;br /&gt;
  return npc:set_character_community(community_string, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря по имени&lt;br /&gt;
function remove_item_from_inventory_by_name(remove_item_name,npc)&lt;br /&gt;
  return remove_item_from_inventory(npc:object(remove_item_name),npc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем предмет из инвентаря&lt;br /&gt;
function remove_item_from_inventory(remove_item,npc)&lt;br /&gt;
  if npc==nil then npc=db.actor end&lt;br /&gt;
  if remove_item~=nil then&lt;br /&gt;
--      npc:mark_item_dropped(remove_item)&lt;br /&gt;
    alife():release(alife():object(remove_item:id()), true)&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--создаем &amp;quot;ожидатели&amp;quot; для неписей нужно для корректной работы с объектами, созданными внутри скрипта&lt;br /&gt;
function create_waiter_for_npc(npc,select_string)--неписи&lt;br /&gt;
  npc_spawner[npc.id]=select_string&lt;br /&gt;
  save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
--очищаем инвентарь непися, можно ГГ, использует следующую фунцию для удаления предмета&lt;br /&gt;
function clear_npc_inventory(npc)&lt;br /&gt;
    npc:iterate_inventory(__del_item, npc)&lt;br /&gt;
end&lt;br /&gt;
function __del_item(npc, item)&lt;br /&gt;
    local section = item:section()&lt;br /&gt;
&lt;br /&gt;
    if section == &amp;quot;bolt&amp;quot; or section == &amp;quot;device_torch&amp;quot; then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
--    npc:mark_item_dropped(item)&lt;br /&gt;
    alife():release(alife():object(item:id()), true)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
--проверка запущена ли игра&lt;br /&gt;
function check_game()&lt;br /&gt;
  if level.present() and (db.actor ~= nil) and db.actor:alive() then&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем переменную&lt;br /&gt;
function save_variable(variable_name, value)&lt;br /&gt;
  if value==nil then&lt;br /&gt;
    amk.mylog(&amp;quot;saving nil into &amp;quot;..variable_name)&lt;br /&gt;
    del_variable(variable_name)&lt;br /&gt;
  else&lt;br /&gt;
    local vn=compress_name(variable_name)&lt;br /&gt;
    xr_logic.pstor_store(db.actor, vn, value)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем переменную&lt;br /&gt;
function load_variable(variable_name, value_if_not_found)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  return xr_logic.pstor_retrieve(db.actor, vn, value_if_not_found)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--удаляем переменную&lt;br /&gt;
function del_variable(variable_name)&lt;br /&gt;
  local vn=compress_name(variable_name)&lt;br /&gt;
  if db.storage[db.actor:id()].pstor[vn] then&lt;br /&gt;
    db.storage[db.actor:id()].pstor[vn] = nil&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица компрессии имён&lt;br /&gt;
local compress_table={&lt;br /&gt;
}&lt;br /&gt;
local checked=false&lt;br /&gt;
&lt;br /&gt;
-- Преобразует имя переменной в короткое&lt;br /&gt;
function compress_name(name)&lt;br /&gt;
  return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--определяем находится ли ГГ в определенной зоне&lt;br /&gt;
function check_npc_in_box(npc, p1,p2,p3)&lt;br /&gt;
  local pos&lt;br /&gt;
  if npc.name then pos=npc:position() else pos=npc end&lt;br /&gt;
  if p3==nil then&lt;br /&gt;
    if is_point_inside_interval(pos.x,p1.x,p2.x) and&lt;br /&gt;
      is_point_inside_interval(pos.y,p1.y,p2.y) and&lt;br /&gt;
      is_point_inside_interval(pos.z,p1.z,p2.z) then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false  &lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    local v1,v2,r,proj1,proj2,dv1,dv2&lt;br /&gt;
    v1=sub(p2,p1)&lt;br /&gt;
    v2=sub(p3,p2)&lt;br /&gt;
    v1.y=0 &lt;br /&gt;
    v2.y=0&lt;br /&gt;
    dv1=v1:magnitude()&lt;br /&gt;
    dv2=v2:magnitude()&lt;br /&gt;
    v1:normalize() &lt;br /&gt;
    v2:normalize()&lt;br /&gt;
    r=sub(pos,p1)&lt;br /&gt;
    local v1p=vector():set(v1.z,0,-v1.x)&lt;br /&gt;
    proj2=v1p:dotproduct(r)/v1p:dotproduct(v2)&lt;br /&gt;
    proj1=v1:dotproduct(r)-v1:dotproduct(v2)*proj2&lt;br /&gt;
    if proj1&amp;gt;0 and proj1&amp;lt;dv1 and proj2&amp;gt;0 and proj2&amp;lt;dv2 and pos.y&amp;gt;p1.y and pos.y&amp;lt;p3.y then&lt;br /&gt;
      return true&lt;br /&gt;
    else&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function is_point_inside_interval(x,p1,p2)&lt;br /&gt;
  if p1&amp;gt;p2 then &lt;br /&gt;
    p1,p2 = p2,p1 &lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  if x&amp;gt;p1 and x&amp;lt;p2 then &lt;br /&gt;
    return true&lt;br /&gt;
  else &lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sub(v1,v2)&lt;br /&gt;
  local newvec = vector()&lt;br /&gt;
  newvec.x = v1.x-v2.x&lt;br /&gt;
  newvec.y = v1.y-v2.y&lt;br /&gt;
  newvec.z = v1.z-v2.z&lt;br /&gt;
  return newvec&lt;br /&gt;
end&lt;br /&gt;
----------------------------&lt;br /&gt;
&lt;br /&gt;
--инвентарное название объекта&lt;br /&gt;
function get_inv_name(section)&lt;br /&gt;
  return system_ini():r_string(section,&amp;quot;inv_name&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Внимание! Строки в структуре не должны содержать символов с кодами 0-31.&lt;br /&gt;
function pack_array_to_string(array)&lt;br /&gt;
  return string.char(1)..pack_new(array)&lt;br /&gt;
  -- local str=&amp;quot;&amp;quot;&lt;br /&gt;
  -- local key&lt;br /&gt;
  -- for key0,value in pairs(array) do&lt;br /&gt;
    -- if type(key0)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      -- key='&amp;quot;'..key0..'&amp;quot;'&lt;br /&gt;
    -- else&lt;br /&gt;
      -- key=key0&lt;br /&gt;
    -- end&lt;br /&gt;
    -- if type(value)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      -- local substr=pack_array_to_string(value)&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;{&amp;quot;..substr..&amp;quot;}|&amp;quot;&lt;br /&gt;
    -- elseif type(value)==&amp;quot;customdata&amp;quot; or type(value)==&amp;quot;function&amp;quot; then&lt;br /&gt;
      -- mylog(&amp;quot;Custom data and function isn't supported&amp;quot;)&lt;br /&gt;
    -- elseif type(value)==&amp;quot;boolean&amp;quot; or type(value)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      -- str=str..key..&amp;quot;=&amp;gt;&amp;quot;..tostring(value)..&amp;quot;|&amp;quot;&lt;br /&gt;
    -- else&lt;br /&gt;
      -- str=str..key..'=&amp;gt;&amp;quot;'..value..'&amp;quot;|'&lt;br /&gt;
    -- end&lt;br /&gt;
  -- end&lt;br /&gt;
  -- return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function unpack_array_from_string(str)&lt;br /&gt;
  if str==nil or str==&amp;quot;&amp;quot; then return {} end&lt;br /&gt;
  if string.sub(str,1,1)~=string.char(1) then&lt;br /&gt;
    -- Старый формат упаковки&lt;br /&gt;
    return _parse(str)&lt;br /&gt;
  else&lt;br /&gt;
    -- новый формат упаковки тэгирован символом c кодом 1.&lt;br /&gt;
    return parse_new(string.sub(str,2,-1))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _assign(tbl,key,val)&lt;br /&gt;
  local key0=string.match(key,'&amp;quot;(.*)&amp;quot;')&lt;br /&gt;
  if key0 then&lt;br /&gt;
    tbl[key0]=val&lt;br /&gt;
  else&lt;br /&gt;
    tbl[key+0]=val&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pack_type_num=1&lt;br /&gt;
local pack_type_string=2&lt;br /&gt;
local pack_type_bool=3&lt;br /&gt;
local pack_type_table=4&lt;br /&gt;
local pack_val_endtable=5&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
 Новый формат упаковки: &lt;br /&gt;
 table ::= subtable&lt;br /&gt;
 subtable ::= keytype key valuetype ( value | subtable 0x5 )&lt;br /&gt;
 keytype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
 valuetype ::= ( 0x1 | 0x2 | 0x3 | 0x4 )&lt;br /&gt;
]]&lt;br /&gt;
function pack_new(tbl)&lt;br /&gt;
  local ret=&amp;quot;&amp;quot;&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(k)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..k&lt;br /&gt;
    elseif type(k)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..k&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..type(k))&lt;br /&gt;
    end&lt;br /&gt;
    if type(v)==&amp;quot;number&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_num)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;string&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_string)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_bool)..v&lt;br /&gt;
    elseif type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      ret=ret..string.char(pack_type_table)..pack_new(v)..string.char(pack_val_endtable)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_new(str,idx)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  idx=idx or 1&lt;br /&gt;
  while true do&lt;br /&gt;
    local key,value&lt;br /&gt;
    if idx&amp;gt;string.len(str) then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      key,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      key,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_val_endtable then&lt;br /&gt;
      return ret,idx&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    vtype,idx=get_byte(str,idx)&lt;br /&gt;
    if vtype==pack_type_num then&lt;br /&gt;
      value,idx=get_num(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_string then&lt;br /&gt;
      value,idx=get_string(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_bool then&lt;br /&gt;
      value,idx=get_bool(str,idx)&lt;br /&gt;
    elseif vtype==pack_type_table then&lt;br /&gt;
      value,idx=parse_new(str,idx)&lt;br /&gt;
    else&lt;br /&gt;
      abort(&amp;quot;unsupported key type &amp;quot;..tostring(vtype))&lt;br /&gt;
    end&lt;br /&gt;
    ret[key]=value&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_byte(str,idx)&lt;br /&gt;
  return string.byte(string.sub(str,idx,idx)),idx+1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_string(str,idx)&lt;br /&gt;
  local idx1=string.len(str)+1&lt;br /&gt;
  for i=idx,string.len(str),1 do&lt;br /&gt;
    if string.byte(string.sub(str,i,i))&amp;lt;32 then&lt;br /&gt;
      idx1=i&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return string.sub(str,idx,idx1-1),idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_num(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st+0,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_bool(str,idx)&lt;br /&gt;
  local st,idx1=get_string(str,idx)&lt;br /&gt;
  return st==&amp;quot;1&amp;quot;,idx1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function _parse(str)&lt;br /&gt;
  local ret={}&lt;br /&gt;
  while str and str~=&amp;quot;&amp;quot; do&lt;br /&gt;
    local i1,i2,key=string.find(str,'(.-)=&amp;gt;')&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
    i1,i2,val=string.find(str,'&amp;quot;(.-)&amp;quot;|')&lt;br /&gt;
    if val and i1==1 then&lt;br /&gt;
      -- строка&lt;br /&gt;
      _assign(ret,key,val)&lt;br /&gt;
    else&lt;br /&gt;
      i1,i2,val=string.find(str,'(%b{})|')&lt;br /&gt;
      if val and i1==1 then&lt;br /&gt;
        -- таблица&lt;br /&gt;
        _assign(ret,key,_parse(string.sub(val,2,-2)))&lt;br /&gt;
      else&lt;br /&gt;
        i1,i2,val=string.find(str,'(.-)|')&lt;br /&gt;
        -- число или булево значение&lt;br /&gt;
        if val==&amp;quot;true&amp;quot; then&lt;br /&gt;
          _assign(ret,key,true)&lt;br /&gt;
        elseif val==&amp;quot;false&amp;quot; then&lt;br /&gt;
          _assign(ret,key,false)&lt;br /&gt;
        else&lt;br /&gt;
          _assign(ret,key,val+0)&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    str=string.sub(str,i2+1)&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
--callback section&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на получение инфопоршена&lt;br /&gt;
function on_info(npc, info_id)&lt;br /&gt;
	if (news_main and news_main.on_info) then&lt;br /&gt;
		news_main.on_info(info_id)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ&lt;br /&gt;
function on_item_take(obj)&lt;br /&gt;
	escape_dialog.have_a_art()&lt;br /&gt;
	flamethrower.have_a_fire_kolobok()&lt;br /&gt;
	flamethrower.have_a_trubki()&lt;br /&gt;
	flamethrower.have_a_manometr()&lt;br /&gt;
	flamethrower.have_a_vodko()&lt;br /&gt;
	flamethrower.have_a_gorelka()&lt;br /&gt;
	&lt;br /&gt;
	remove_spot_from_map(obj:id(),&amp;quot;red_location&amp;quot;)&lt;br /&gt;
	mod_call(&amp;quot;check_usable_item&amp;quot;,obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на взятие предмета в инвентарь ГГ из ящика&lt;br /&gt;
function on_item_take_from_box(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на потерю предмета из инвентаря ГГ&lt;br /&gt;
function on_item_drop(obj)&lt;br /&gt;
  mod_call(&amp;quot;check_for_af_drop&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_sleep_item&amp;quot;,obj)&lt;br /&gt;
  mod_call(&amp;quot;check_beacon_drop&amp;quot;,obj)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
  amk_alcohol.drink_vodka(obj)&lt;br /&gt;
  --&lt;br /&gt;
flamethrower.have_a_fire_kolobok()&lt;br /&gt;
flamethrower.have_a_trubki()&lt;br /&gt;
flamethrower.have_a_manometr()&lt;br /&gt;
flamethrower.have_a_vodko()&lt;br /&gt;
flamethrower.have_a_gorelka()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local prev_health=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--колбэк на апдейт ГГ (удобно для проверки условий, так как вызывается постоянно, нельзя перегружать, а то будут лаги)&lt;br /&gt;
function on_actor_upade(delta)&lt;br /&gt;
	oau_watchdog=100&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade begin&amp;quot;)&lt;br /&gt;
 --не удалять! библиотечная конструкция&lt;br /&gt;
  if not timer_trigger then &lt;br /&gt;
    timer_trigger=game.time() &lt;br /&gt;
  end&lt;br /&gt;
  if timer_trigger&amp;lt;=game.time() then&lt;br /&gt;
    timer_trigger=game.time()+1000&lt;br /&gt;
    check_timers()&lt;br /&gt;
  end&lt;br /&gt;
	--user area &lt;br /&gt;
	oau_watchdog=99&lt;br /&gt;
  mod_call(&amp;quot;blowout_phantoms&amp;quot;)&lt;br /&gt;
	oau_watchdog=98&lt;br /&gt;
  mod_call(&amp;quot;check_radar_off&amp;quot;)&lt;br /&gt;
	oau_watchdog=97&lt;br /&gt;
  mod_call(&amp;quot;check_metka&amp;quot;)&lt;br /&gt;
	oau_watchdog=96&lt;br /&gt;
  mod_call(&amp;quot;check_hud&amp;quot;)&lt;br /&gt;
	oau_watchdog=95&lt;br /&gt;
  mod_call(&amp;quot;weather_manager&amp;quot;)&lt;br /&gt;
	oau_watchdog=94&lt;br /&gt;
  mod_call(&amp;quot;check_armor&amp;quot;)&lt;br /&gt;
	oau_watchdog=93&lt;br /&gt;
  mod_call(&amp;quot;firebat_ammo&amp;quot;)&lt;br /&gt;
  --!!! alcohol modification by Terrapack&lt;br /&gt;
	oau_watchdog=931&lt;br /&gt;
  amk_alcohol.check_alcohol()&lt;br /&gt;
	oau_watchdog=92&lt;br /&gt;
  amk_mod.on_blowout_hit_actor()&lt;br /&gt;
	oau_watchdog=91&lt;br /&gt;
  if amk_target then amk_target.update() end&lt;br /&gt;
  --&lt;br /&gt;
  for k,v in pairs(convert_npc) do&lt;br /&gt;
    local obj=level.object_by_id(k)&lt;br /&gt;
		local sobj=alife():object(k)&lt;br /&gt;
		if sobj then&lt;br /&gt;
	    if obj==nil and v==true then&lt;br /&gt;
	      convert_npc[k]=false&lt;br /&gt;
	      switch_online(k)&lt;br /&gt;
      elseif obj and v==false then&lt;br /&gt;
        convert_npc[k]=nil&lt;br /&gt;
	    elseif v==1 and obj then -- тайник не перешёл в оффлайн попытаемся его туда запихнуть.&lt;br /&gt;
       alife():set_switch_online(k, false)&lt;br /&gt;
       alife():set_switch_offline(k, true)&lt;br /&gt;
      elseif v==1 then -- тайник в оффлайне. выталкиваем.&lt;br /&gt;
	      convert_npc[k]=nil&lt;br /&gt;
	      switch_online(k)      &lt;br /&gt;
			else&lt;br /&gt;
--				convert_npc[k]=nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			convert_npc[k]=nil&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
	oau_watchdog=90&lt;br /&gt;
&lt;br /&gt;
	if gg_kick then	&lt;br /&gt;
		if prev_health&amp;gt;db.actor.health+0.05 then&lt;br /&gt;
			level.add_pp_effector(&amp;quot;amk_shoot.ppe&amp;quot;, 2011, false)&lt;br /&gt;
			level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)  &lt;br /&gt;
			&lt;br /&gt;
			if prev_health&amp;gt;db.actor.health+0.30 then&lt;br /&gt;
				level.add_cam_effector(&amp;quot;camera_effects\\fusker.anm&amp;quot;, 999, false, &amp;quot;&amp;quot;)	&lt;br /&gt;
				local snd_obj = xr_sound.get_safe_sound_object([[actor\pain_3]])&lt;br /&gt;
				snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)&lt;br /&gt;
				if math.random()&amp;lt;0.20 then&lt;br /&gt;
					local active_item = db.actor:active_item()&lt;br /&gt;
					if active_item and active_item:section()~= &amp;quot;bolt&amp;quot; and active_item:section()~= &amp;quot;wpn_knife&amp;quot; then&lt;br /&gt;
						db.actor:drop_item(active_item)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		prev_health = db.actor.health&lt;br /&gt;
	end&lt;br /&gt;
	oau_watchdog=89&lt;br /&gt;
	&lt;br /&gt;
	if (amk_offline_alife) then&lt;br /&gt;
      amk_offline_alife.update()&lt;br /&gt;
    end&lt;br /&gt;
	oau_watchdog=88&lt;br /&gt;
	if (amk_corpses) then&lt;br /&gt;
		for a=1, 3 do&lt;br /&gt;
			amk_corpses.update()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	amk_anoms.update()&lt;br /&gt;
	oau_watchdog=0&lt;br /&gt;
	oau_reason=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--хех, определяем тип патронов в стволе...	&lt;br /&gt;
	--[[&lt;br /&gt;
	local weapon = db.actor:item_in_slot(2)&lt;br /&gt;
	&lt;br /&gt;
	if db.actor:active_slot()==2 and weapon then&lt;br /&gt;
		local t = get_weapon_data(alife():object(weapon:id()))&lt;br /&gt;
		mylog(t.ammo_type)&lt;br /&gt;
	end&lt;br /&gt;
	]]&lt;br /&gt;
-----------&lt;br /&gt;
--	amk.mylog(&amp;quot;on_actor_upade end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на создание непися (точнее на его переход в онлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_spawn(npc)&lt;br /&gt;
  if npc == nil then return end&lt;br /&gt;
	if (news_main and news_main.on_spawn) then&lt;br /&gt;
		news_main.on_spawn(npc)&lt;br /&gt;
	end&lt;br /&gt;
  for k,v in pairs(npc_spawner) do&lt;br /&gt;
    if k==npc:id() then &lt;br /&gt;
      __npc_spawn_case(npc,v)&lt;br /&gt;
      npc_spawner[k]=nil&lt;br /&gt;
    save_variable(&amp;quot;x_npc_spawner&amp;quot;,pack_array_to_string(npc_spawner) )&lt;br /&gt;
      return&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
function __npc_spawn_case(npc,select_string)&lt;br /&gt;
  --[[&lt;br /&gt;
  здесь описываем вызовы, оформялять в виде&lt;br /&gt;
&lt;br /&gt;
  if select_string==&amp;quot;название условия&amp;quot; then&lt;br /&gt;
    &amp;lt;вызов сторонних функций&amp;gt;&lt;br /&gt;
    -- можно передавать npc как параметр&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  ]]&lt;br /&gt;
--user area &lt;br /&gt;
-----------&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
function on_net_spawn(obj)&lt;br /&gt;
	amk_mod.build_btrs_table(obj)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на удаление непися (точнее на его переход в оффлайн), использует следующую за ним функцию для выбора действия&lt;br /&gt;
function on_npc_go_offline(npc)&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
	if amk_offline_alife then&lt;br /&gt;
		if check_game()==true then&lt;br /&gt;
		local sobj = alife():object(npc:id())&lt;br /&gt;
		if sobj then&lt;br /&gt;
			amk_offline_alife.process_trade(sobj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_go_offline(npc)&lt;br /&gt;
--	amk_anoms.unreg_in_anom_manager(npc)&lt;br /&gt;
  if amk_target then&lt;br /&gt;
    amk_target.net_destroy(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
-----------------------&lt;br /&gt;
&lt;br /&gt;
--колбэк на юзание объекта&lt;br /&gt;
function on_use(victim, who)&lt;br /&gt;
  if db.actor and who and who:id()==db.actor:id() then&lt;br /&gt;
    mod_call(&amp;quot;check_usable_item&amp;quot;,victim)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--колбэк на смерть непися&lt;br /&gt;
function on_death(victim, who)&lt;br /&gt;
if (news_main and news_main.on_death) then&lt;br /&gt;
	news_main.on_death(victim, who)&lt;br /&gt;
end&lt;br /&gt;
	amk_anoms.unreg_in_anom_manager(victim)&lt;br /&gt;
  mod_call(&amp;quot;generate_recipe&amp;quot;,victim,who)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, victim, 1, nil, who, 14)&lt;br /&gt;
	mod_call(&amp;quot;zomby_blow&amp;quot;,victim)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_npc_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_monster_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
	mod_call(&amp;quot;firebated&amp;quot;, obj, amount, local_direction, who, bone_index)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_ph_obj_hit(obj, amount, local_direction, who, bone_index)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- проверка на видимость производится раз в секунду&lt;br /&gt;
function enemy_see_actor(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function actor_see_enemy(obj,typ) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- непись стрелял в гг&lt;br /&gt;
function npc_shot_actor(obj) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--загружаем все переменные, которые нужно, вызывается загрузке игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_load()&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load begin&amp;quot;)&lt;br /&gt;
	amk.mylog(&amp;quot;object 2972 is &amp;quot;..((alife():object(2972) and alife():object(2972):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
	amk.mylog(&amp;quot;object 2975 is &amp;quot;..((alife():object(2975) and alife():object(2975):name()) or &amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  if db.storage[db.actor:id()].pstor == nil then&lt;br /&gt;
    db.storage[db.actor:id()].pstor = {}&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  npc_spawner=unpack_array_from_string(load_variable(&amp;quot;x_npc_spawner&amp;quot;,&amp;quot;&amp;quot;) )&lt;br /&gt;
&lt;br /&gt;
  mod_call(&amp;quot;first_run&amp;quot;)&lt;br /&gt;
  convert_timers() -- исправим старые названия таймеров&lt;br /&gt;
-- Метки теперь ставятся на серверные объекты. Обновлять их не нужно&lt;br /&gt;
--[[&lt;br /&gt;
  local tmp,tmp1&lt;br /&gt;
  for a=1,65534,1 do&lt;br /&gt;
    tmp=load_variable(&amp;quot;x_marker_type_&amp;quot;..a,nil)&lt;br /&gt;
    if tmp~=nil then&lt;br /&gt;
      tmp1=load_variable(&amp;quot;x_marker_text_&amp;quot;..a,nil)&lt;br /&gt;
      level.map_add_object_spot(a, tmp, tmp1)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
]]&lt;br /&gt;
  &lt;br /&gt;
--user area &lt;br /&gt;
	if system_ini():r_float(&amp;quot;gg_kick&amp;quot;,&amp;quot;enabled&amp;quot;)&amp;gt;0.0 then gg_kick=true else gg_kick=false end&lt;br /&gt;
  mod_call(&amp;quot;test_sleep_pp&amp;quot;)&lt;br /&gt;
  mod_call(&amp;quot;check_spawn&amp;quot;)&lt;br /&gt;
--  local str=string&lt;br /&gt;
  if has_alife_info(&amp;quot;val_actor_has_borov_key&amp;quot;) and not has_alife_info(&amp;quot;val_borov_dead&amp;quot;) then&lt;br /&gt;
    db.actor:give_info_portion(&amp;quot;val_borov_dead&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
-----------&lt;br /&gt;
	amk.mylog(&amp;quot;on_game_load end&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--записываем все переменные, которые нужно, вызывается присохранении игры, автоматически; вручную не вызывать&lt;br /&gt;
function on_game_save() &lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Эта функция вызывается самой первой. Онлайновые объекты недоступны! db.actor недоступен!&lt;br /&gt;
function on_game_start()&lt;br /&gt;
  mod_call(&amp;quot;on_game_start&amp;quot;)&lt;br /&gt;
	ver = get_ver()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------- user function section---------------&lt;br /&gt;
function mod_call(i,...)&lt;br /&gt;
  if not amk_mod[i] then&lt;br /&gt;
    amk_mod.f=function () loadstring(amk.decode(c))() end&lt;br /&gt;
    setfenv(amk_mod.f,amk_mod)&lt;br /&gt;
    amk_mod.f()&lt;br /&gt;
  end&lt;br /&gt;
  amk_mod[i](...)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function load_table(name)&lt;br /&gt;
  local var=load_variable(name)&lt;br /&gt;
  return (var==nil and {}) or unpack_array_from_string(var)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function save_table(name,tbl)&lt;br /&gt;
  save_variable(name,pack_array_to_string(tbl))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function update_table(name,id,val)&lt;br /&gt;
  local tbl=load_table(name)&lt;br /&gt;
  tbl[id]=val&lt;br /&gt;
  save_table(name,tbl)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function sixbit(char) local byte = string.byte(char) local result = nil if (byte == 61) then result = 0 elseif (byte == 45 or byte == 43) then result = 62 elseif (byte == 95 or byte == 47) then result = 63 elseif (byte &amp;lt;= 57) then result = byte + 4 elseif (byte &amp;lt;= 90) then result = byte - 65 elseif (byte &amp;lt;= 122) then result = byte - 71 end return result end function decodeblock(block) local sixbits = {} local result = &amp;quot;&amp;quot; for counter=1,4 do sixbits[counter] = sixbit(string.sub(block,counter,counter)) end result = string.char(sixbits[1]*4 + math.floor(sixbits[2] / 16)) if (string.sub(block,3,3) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[2] % 16)*16 + math.floor(sixbits[3] / 4)) end if (string.sub(block,4,4) ~= &amp;quot;=&amp;quot;) then result = result .. string.char((sixbits[3] % 4) * 64 + sixbits[4]) end return result end function decode(data) local result = &amp;quot;&amp;quot; local str={string.byte(&amp;quot;CheckForCheat&amp;quot;,1,1000)} local strl=table.getn(str) for c=1,string.len(data),4 do result=result..decodeblock(string.sub(data,c,c+3)) end local result1=&amp;quot;&amp;quot; for c=1,string.len(result),1 do local sl=string.byte(string.sub(result,c)) sl=bit_xor(sl,str[1+(c-1)%strl]) result1 = result1 .. string.char(sl) end return result1 end&lt;br /&gt;
&lt;br /&gt;
function bind_lc(obj)&lt;br /&gt;
  if obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; and level.name()==&amp;quot;l12_stancia&amp;quot; and amk.load_variable(&amp;quot;freeplay&amp;quot;,0)&amp;gt;0 then&lt;br /&gt;
    local sobj=alife():object(obj:id())&lt;br /&gt;
    if sobj then&lt;br /&gt;
      alife():release(sobj,true)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8u8(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=8&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu32u16(packet)&lt;br /&gt;
  local v={}&lt;br /&gt;
  local len=packet:r_s32()&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    table.insert(v,packet:r_u16())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u8(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8u8(pk,v)&lt;br /&gt;
  local len=8 --table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu32u16(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  pk:w_s32(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u16(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.gvid=stpk:r_u16()&lt;br /&gt;
  ret.obf32u1=stpk:r_float()&lt;br /&gt;
  ret.obs32u2=stpk:r_s32()&lt;br /&gt;
  ret.lvid=stpk:r_s32()&lt;br /&gt;
  ret.oflags=stpk:r_s32()&lt;br /&gt;
  ret.custom=stpk:r_stringZ()&lt;br /&gt;
  ret.sid=stpk:r_s32()&lt;br /&gt;
  ret.obs32u3=stpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.gvid)&lt;br /&gt;
  stpk:w_float(ret.obf32u1)&lt;br /&gt;
  stpk:w_s32(ret.obs32u2)&lt;br /&gt;
  stpk:w_s32(ret.lvid)&lt;br /&gt;
  stpk:w_s32(ret.oflags)&lt;br /&gt;
  stpk:w_stringZ(ret.custom)&lt;br /&gt;
  stpk:w_s32(ret.sid)&lt;br /&gt;
  stpk:w_s32(ret.obs32u3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.visual=stpk:r_stringZ()&lt;br /&gt;
  ret.vsu8u1=stpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.visual)&lt;br /&gt;
  stpk:w_u8(ret.vsu8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  parse_object_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_visual_packet(ret,stpk,updpk)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  fill_object_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_visual_packet(ret,stpk,updpk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  ret.team=stpk:r_u8()&lt;br /&gt;
  ret.squad=stpk:r_u8()&lt;br /&gt;
  ret.group=stpk:r_u8()&lt;br /&gt;
  ret.health=stpk:r_float()&lt;br /&gt;
  ret.crvu32u16u1=readvu32u16(stpk)&lt;br /&gt;
  ret.crvu32u16u2=readvu32u16(stpk)  &lt;br /&gt;
  ret.killerid=stpk:r_u16()&lt;br /&gt;
  ret.game_death_time=readvu8u8(stpk)&lt;br /&gt;
&lt;br /&gt;
  ret.updhealth=updpk:r_float()&lt;br /&gt;
  ret.upds32u1=updpk:r_s32()&lt;br /&gt;
  ret.updu8u2=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
  ret.updmodel=updpk:r_float()&lt;br /&gt;
  ret.upddir={}&lt;br /&gt;
  ret.upddir.x=updpk:r_float()&lt;br /&gt;
  ret.upddir.y=updpk:r_float()&lt;br /&gt;
  ret.upddir.z=updpk:r_float()&lt;br /&gt;
  ret.updteam=updpk:r_u8()&lt;br /&gt;
  ret.updsquad=updpk:r_u8()&lt;br /&gt;
  ret.updgroup=updpk:r_u8()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_dynamic_object_visual(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u8(ret.team)&lt;br /&gt;
  stpk:w_u8(ret.squad)&lt;br /&gt;
  stpk:w_u8(ret.group)&lt;br /&gt;
  stpk:w_float(ret.health)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u1)&lt;br /&gt;
  writevu32u16(stpk,ret.crvu32u16u2)  &lt;br /&gt;
  stpk:w_u16(ret.killerid)&lt;br /&gt;
  writevu8u8(stpk,ret.game_death_time)&lt;br /&gt;
&lt;br /&gt;
  updpk:w_float(ret.updhealth)&lt;br /&gt;
  updpk:w_s32(ret.upds32u1)&lt;br /&gt;
  updpk:w_u8(ret.updu8u2)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
  updpk:w_float(ret.updmodel)&lt;br /&gt;
  updpk:w_float(ret.upddir.x)&lt;br /&gt;
  updpk:w_float(ret.upddir.y)&lt;br /&gt;
  updpk:w_float(ret.upddir.z)&lt;br /&gt;
  updpk:w_u8(ret.updteam)&lt;br /&gt;
  updpk:w_u8(ret.updsquad)&lt;br /&gt;
  updpk:w_u8(ret.updgroup)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.baseoutr=stpk:r_stringZ()&lt;br /&gt;
  ret.baseinr=stpk:r_stringZ()&lt;br /&gt;
  ret.smtrid=stpk:r_u16()&lt;br /&gt;
  ret.smtrtaskactive=stpk:r_u8()&lt;br /&gt;
  &lt;br /&gt;
  ret.updu16u1=updpk:r_u16()&lt;br /&gt;
  ret.updu16u2=updpk:r_u16()&lt;br /&gt;
  ret.upds32u3=updpk:r_s32()&lt;br /&gt;
  ret.upds32u4=updpk:r_s32()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_creature_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.baseoutr)&lt;br /&gt;
  stpk:w_stringZ(ret.baseinr)&lt;br /&gt;
  stpk:w_u16(ret.smtrid)&lt;br /&gt;
  stpk:w_u8(ret.smtrtaskactive)&lt;br /&gt;
  &lt;br /&gt;
  updpk:w_u16(ret.updu16u1)&lt;br /&gt;
  updpk:w_u16(ret.updu16u2)&lt;br /&gt;
  updpk:w_s32(ret.upds32u3)&lt;br /&gt;
  updpk:w_s32(ret.upds32u4)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.money=stpk:r_s32()&lt;br /&gt;
  ret.profile=stpk:r_stringZ()&lt;br /&gt;
  ret.infammo=stpk:r_s32()&lt;br /&gt;
  ret.class=stpk:r_stringZ()&lt;br /&gt;
  ret.communityid=stpk:r_s32()&lt;br /&gt;
  ret.rank=stpk:r_s32()&lt;br /&gt;
  ret.reputation=stpk:r_s32()&lt;br /&gt;
  ret.charname=stpk:r_stringZ()  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_s32(ret.money)&lt;br /&gt;
  stpk:w_stringZ(ret.profile)&lt;br /&gt;
  stpk:w_s32(ret.infammo)&lt;br /&gt;
  stpk:w_stringZ(ret.class)&lt;br /&gt;
  stpk:w_s32(ret.communityid)&lt;br /&gt;
  stpk:w_s32(ret.rank)&lt;br /&gt;
  stpk:w_s32(ret.reputation)&lt;br /&gt;
  stpk:w_stringZ(ret.charname)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.huvu32u8u1=readvu32u8(stpk)&lt;br /&gt;
  ret.huvu32u8u2=readvu32u8(stpk)  &lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_trader_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u1)&lt;br /&gt;
  writevu32u8(stpk,ret.huvu32u8u2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.skeleton=stpk:r_stringZ()&lt;br /&gt;
  ret.skeleton_flags=stpk:r_u8()&lt;br /&gt;
  ret.source_id=stpk:r_u16()&lt;br /&gt;
  &lt;br /&gt;
--  ret.updsku8u1=updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_stringZ(ret.skeleton)&lt;br /&gt;
  stpk:w_u8(ret.skeleton_flags)&lt;br /&gt;
  stpk:w_u16(ret.source_id)&lt;br /&gt;
  &lt;br /&gt;
--  updpk:w_u8(ret.updsku8u1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_stalker_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_human_packet(ret,stpk,updpk)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  ret.hellodlg=updpk:r_stringZ()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_stalker_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_human_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  updpk:w_stringZ(ret.hellodlg)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_se_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_monster_packet(ret,stpk,updpk,size)&lt;br /&gt;
  parse_skeleton_packet(ret,stpk,updpk,size)&lt;br /&gt;
  ret.spec_obj_id=stpk:r_u16()&lt;br /&gt;
  ret.job_online=stpk:r_u8()&lt;br /&gt;
	if ret.job_online&amp;gt;3 then&lt;br /&gt;
		ret.state=true&lt;br /&gt;
		ret.job_online=ret.job_online-4&lt;br /&gt;
	else&lt;br /&gt;
		ret.state=false&lt;br /&gt;
	end&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    ret.job_online_condlist=stpk:r_stringZ()&lt;br /&gt;
  end&lt;br /&gt;
  ret.was_in_smtr=stpk:r_u8()&lt;br /&gt;
  ret.stunk1={}&lt;br /&gt;
  for i=stpk:r_tell(),size-1,1 do&lt;br /&gt;
    table.insert(ret.stunk1,stpk:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_se_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_monster_packet(ret,stpk,updpk)&lt;br /&gt;
  fill_skeleton_packet(ret,stpk,updpk)&lt;br /&gt;
  stpk:w_u16(ret.spec_obj_id)&lt;br /&gt;
	local st=0&lt;br /&gt;
	if ret.state then&lt;br /&gt;
		st=4&lt;br /&gt;
	end&lt;br /&gt;
  stpk:w_u8(ret.job_online+st)&lt;br /&gt;
  if ret.job_online==3 then&lt;br /&gt;
    stpk:w_stringZ(ret.job_online_condlist)&lt;br /&gt;
  end&lt;br /&gt;
  stpk:w_u8(ret.was_in_smtr)&lt;br /&gt;
  for i,v in ipairs(ret.stunk1) do&lt;br /&gt;
    stpk:w_u8(v)&lt;br /&gt;
  end  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dump_table(tbl)&lt;br /&gt;
  for k,v in pairs(tbl) do&lt;br /&gt;
    if type(v)==&amp;quot;table&amp;quot; then&lt;br /&gt;
      get_console():execute(&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;)&lt;br /&gt;
      dump_table(v)&lt;br /&gt;
    else&lt;br /&gt;
      str=&amp;quot;load [[Участник:92.113.172.219|92.113.172.219]] &amp;quot;..tostring(k)..&amp;quot; =&amp;gt; &amp;quot;..tostring(v)&lt;br /&gt;
      if string.len(str)&amp;gt;200 then&lt;br /&gt;
        str=string.sub(str,1,200)&lt;br /&gt;
      end&lt;br /&gt;
      get_console():execute(str)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  get_console():execute(&amp;quot;flush&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- серверный объект на входе&lt;br /&gt;
function read_stalker_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_stalker_packet({},stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function read_monster_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local tbl=amk.parse_se_monster_packet({},stpk,uppk,size)&lt;br /&gt;
  return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- таблица параметров и серверный объект на входе&lt;br /&gt;
function write_stalker_params(tbl,sobj,noconvert)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_stalker_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  if npc and (not noconvert) then&lt;br /&gt;
    amk.convert_npc[sobj.id]=true&lt;br /&gt;
		npc:stop_talk()&lt;br /&gt;
    switch_offline(npc)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function write_monster_params(tbl,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  amk.fill_se_monster_packet(tbl,stpk,uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
  -- local npc=level.object_by_id(sobj.id)&lt;br /&gt;
  -- if npc then&lt;br /&gt;
    -- amk.convert_npc[sobj.id]=true&lt;br /&gt;
    -- switch_offline(npc)&lt;br /&gt;
  -- end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_anomaly_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.max_power = stpk:r_float()&lt;br /&gt;
	t.owner_id = stpk:r_s32()&lt;br /&gt;
	t.enabled_time = stpk:r_s32()&lt;br /&gt;
	t.disabled_time = stpk:r_s32()&lt;br /&gt;
	t.start_time_shift = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.offline_interactive_radius = stpk:r_float()&lt;br /&gt;
	t.artefact_spawn_count = stpk:r_u16()&lt;br /&gt;
	t.artefact_position_offset = stpk:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.last_spawn_time_present = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	if stpk:r_elapsed() ~= 0 then&lt;br /&gt;
--		abort(&amp;quot;left=%d&amp;quot;, stpk:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_anomaly_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.max_power)&lt;br /&gt;
	stpk:w_s32(t.owner_id)&lt;br /&gt;
	stpk:w_s32(t.enabled_time)&lt;br /&gt;
	stpk:w_s32(t.disabled_time)&lt;br /&gt;
	stpk:w_s32(t.start_time_shift)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_float(t.offline_interactive_radius)&lt;br /&gt;
	stpk:w_u16(t.artefact_spawn_count)&lt;br /&gt;
	stpk:w_s32(t.artefact_position_offset)&lt;br /&gt;
	&lt;br /&gt;
	stpk:w_u8(t.last_spawn_time_present)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--для правильного парсинга запрещены комментарии!!!&lt;br /&gt;
function parse_custom_data(str)&lt;br /&gt;
	local t={}&lt;br /&gt;
	if str then&lt;br /&gt;
		for section, section_data in string.gfind(str,&amp;quot;%s*%[([^%]]*)%]%s*([^%[%z]*)%s*&amp;quot;) do&lt;br /&gt;
			section = trim(section)&lt;br /&gt;
			t[section]={}&lt;br /&gt;
			for line in string.gfind(trim(section_data), &amp;quot;([^\n]*)\n*&amp;quot;) do&lt;br /&gt;
				if string.find(line,&amp;quot;=&amp;quot;)~=nil then&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;([^=]-)%s*=%s*(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' and v~=nil then &lt;br /&gt;
							t[section][k]=trim(v) &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for k, v in string.gfind(line, &amp;quot;(.*)&amp;quot;) do&lt;br /&gt;
						k = trim(k)&lt;br /&gt;
						if k~=nil and k~='' then&lt;br /&gt;
							t[section][k]=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function trim (s)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gen_custom_data(tbl)&lt;br /&gt;
	local str=''&lt;br /&gt;
	for key, value in pairs(tbl) do&lt;br /&gt;
		str = str..&amp;quot;\n[&amp;quot;..key..&amp;quot;]\n&amp;quot;&lt;br /&gt;
		for k, v in pairs(value) do&lt;br /&gt;
			if v~=&amp;quot;&amp;lt;&amp;lt;no_value&amp;gt;&amp;gt;&amp;quot; then&lt;br /&gt;
				str=str..k..&amp;quot; = &amp;quot;..v..&amp;quot;\n&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				str=str..k..&amp;quot;\n&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
function get_lc_data(obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t = amk.parse_shape_packet(t,packet)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = packet:r_u8()&lt;br /&gt;
	t.dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.dest_level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.dest_position = packet:r_vec3()&lt;br /&gt;
	t.dest_direction = packet:r_vec3()&lt;br /&gt;
	t.dest_level_name = packet:r_stringZ()&lt;br /&gt;
	t.dest_graph_point = packet:r_stringZ()&lt;br /&gt;
	t.silent_mode = packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_lc_data(t,obj)&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	&lt;br /&gt;
	amk.fill_shape_packet(t,packet)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(t.restrictor_type)&lt;br /&gt;
	packet:w_u16(t.dest_game_vertex_id)&lt;br /&gt;
	packet:w_s32(t.dest_level_vertex_id)&lt;br /&gt;
	packet:w_vec3(t.dest_position)&lt;br /&gt;
	packet:w_vec3(t.dest_direction)&lt;br /&gt;
	packet:w_stringZ(t.dest_level_name)&lt;br /&gt;
	packet:w_stringZ(t.dest_graph_point)&lt;br /&gt;
	packet:w_u8(t.silent_mode)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function point_in_poly (pts, x,y)&lt;br /&gt;
	local cnt,k,j&lt;br /&gt;
	local ret = false&lt;br /&gt;
	cnt = table.getn(pts)&lt;br /&gt;
	j = cnt&lt;br /&gt;
	for k = 1,cnt do&lt;br /&gt;
		if ((pts[k].y &amp;lt;=y) and (y &amp;lt; pts[j].y)) or ((pts[j].y &amp;lt;=y) and (y &amp;lt; pts[k].y)) then&lt;br /&gt;
			if (x &amp;lt; (pts[j].x - pts[k].x) * (y - pts[k].y) / (pts[j].y - pts[k].y) + pts[k].x) then&lt;br /&gt;
				ret = not ret&lt;br /&gt;
			end&lt;br /&gt;
			j = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.physic_type=stpk:r_s32()&lt;br /&gt;
	ret.mass=stpk:r_float()&lt;br /&gt;
	ret.fixed_bones=stpk:r_stringZ()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_object_physic_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_s32(ret.physic_type)&lt;br /&gt;
	stpk:w_float(ret.mass)&lt;br /&gt;
	stpk:w_stringZ(ret.fixed_bones)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_breakable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	local t={}&lt;br /&gt;
	t.game_vertex_id = packet:r_u16()&lt;br /&gt;
	t.distance = packet:r_float()&lt;br /&gt;
	t.direct_control = packet:r_s32()&lt;br /&gt;
	t.level_vertex_id = packet:r_s32()&lt;br /&gt;
	t.object_flags = packet:r_s32()&lt;br /&gt;
	t.custom_data = packet:r_stringZ()&lt;br /&gt;
	t.story_id = packet:r_s32()&lt;br /&gt;
	t.spawn_story_id = packet:r_s32()&lt;br /&gt;
	&lt;br /&gt;
	t.visual_name = packet:r_stringZ()&lt;br /&gt;
	t.visual_flags = packet:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	t.health = packet:r_float()&lt;br /&gt;
&lt;br /&gt;
	if packet:r_elapsed() ~= 0 then&lt;br /&gt;
		abort(&amp;quot;left=%d&amp;quot;, packet:r_elapsed())&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_breakable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
	packet:w_begin(t.game_vertex_id)&lt;br /&gt;
	packet:w_float(t.distance)&lt;br /&gt;
	packet:w_s32(t.direct_control)&lt;br /&gt;
	packet:w_s32(t.level_vertex_id)&lt;br /&gt;
	packet:w_s32(t.object_flags)&lt;br /&gt;
	packet:w_stringZ(t.custom_data)&lt;br /&gt;
	packet:w_s32(t.story_id)&lt;br /&gt;
	packet:w_s32(t.spawn_story_id)&lt;br /&gt;
	packet:w_stringZ(t.visual_name)&lt;br /&gt;
	packet:w_u8(t.visual_flags)&lt;br /&gt;
	packet:w_float(t.health)&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
	]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function on_REspawn(obj,respawner)&lt;br /&gt;
	if obj and respawner then&lt;br /&gt;
		mod_call(&amp;quot;respawned&amp;quot;,obj,respawner)&lt;br /&gt;
		if IsMonster(obj) then&lt;br /&gt;
			if respawner.spawned_goes_online==true then mod_call(&amp;quot;switch_monster_online&amp;quot;,obj) &lt;br /&gt;
			elseif respawner.spawned_goes_online==false then mod_call(&amp;quot;switch_monster_offline&amp;quot;,obj) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (obj) then&lt;br /&gt;
		if (news_main and news_main.on_spawn) then&lt;br /&gt;
			news_main.on_spawn(obj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_spawner_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
	t.spawned_obj_count = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_spawner_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	stpk:w_u8(t.spawned_obj_count)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_shape_packet(t,stpk,uppk)&lt;br /&gt;
	local shape_count = stpk:r_u8()&lt;br /&gt;
	t.shapes={}&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type = stpk:r_u8()&lt;br /&gt;
		t.shapes[i]={}&lt;br /&gt;
		t.shapes[i].shtype=shape_type&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			t.shapes[i].center = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].radius = stpk:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			t.shapes[i].v1 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v2 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].v3 = stpk:r_vec3()&lt;br /&gt;
			t.shapes[i].offset = stpk:r_vec3()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_shape_packet(t,stpk,updpk)&lt;br /&gt;
	stpk:w_u8(table.getn(t.shapes))&lt;br /&gt;
	for i=1,table.getn(t.shapes) do&lt;br /&gt;
		stpk:w_u8(t.shapes[i].shtype)&lt;br /&gt;
		if t.shapes[i].shtype == 0 then&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].center)&lt;br /&gt;
			stpk:w_float(t.shapes[i].radius)&lt;br /&gt;
		else&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v1)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v2)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].v3)&lt;br /&gt;
			stpk:w_vec3(t.shapes[i].offset)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_ini_section_to_array(ini,section)&lt;br /&gt;
	local tmp={}&lt;br /&gt;
	if ini:section_exist(section) then&lt;br /&gt;
		local result, id, value = nil, nil, nil&lt;br /&gt;
		for a=0,ini:line_count(section)-1 do&lt;br /&gt;
			result, id, value = ini:r_line(section,a,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			if id~=nil and trim(id)~=&amp;quot;&amp;quot; and trim(id)~=nil then&lt;br /&gt;
				tmp[trim(id)]=trim(value)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tmp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function str_explode(div,str,clear)&lt;br /&gt;
	local t={}&lt;br /&gt;
	local cpt = string.find (str, div, 1, true)&lt;br /&gt;
	if cpt then&lt;br /&gt;
		repeat&lt;br /&gt;
			if clear then&lt;br /&gt;
				table.insert( t, trim(string.sub(str, 1, cpt-1)) )&lt;br /&gt;
			else&lt;br /&gt;
				table.insert( t, string.sub(str, 1, cpt-1) )&lt;br /&gt;
			end&lt;br /&gt;
			str = string.sub( str, cpt+string.len(div) )&lt;br /&gt;
			cpt = string.find (str, div, 1, true)&lt;br /&gt;
		until cpt==nil&lt;br /&gt;
	end&lt;br /&gt;
	if clear then&lt;br /&gt;
		table.insert(t, trim(str))&lt;br /&gt;
	else&lt;br /&gt;
		table.insert(t, str)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function quotemeta(str)&lt;br /&gt;
	return (string.gsub(s, &amp;quot;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;quot;, &amp;quot;%%%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function add(v1,v2)&lt;br /&gt;
	local nv=vector()&lt;br /&gt;
	nv.x=v1.x+v2.x&lt;br /&gt;
	nv.y=v1.y+v2.y&lt;br /&gt;
	nv.z=v1.z+v2.z&lt;br /&gt;
	return nv&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_len(v,num)&lt;br /&gt;
	local cl = math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z)&lt;br /&gt;
	cl = num/cl&lt;br /&gt;
	v.x= v.x*cl&lt;br /&gt;
	v.y= v.y*cl&lt;br /&gt;
	v.z= v.z*cl&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_restrictor_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_shape_packet(t,stpk,uppk,size)&lt;br /&gt;
	&lt;br /&gt;
	t.restrictor_type = stpk:r_u8()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_restrictor_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_shape_packet(t,stpk,uppk)&lt;br /&gt;
	stpk:w_u8(t.restrictor_type)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_trader_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_trader_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_trader_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_trader_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_invbox_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_invbox_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function readvu8uN(packet,n)&lt;br /&gt;
  local v={}&lt;br /&gt;
  for i=1,n,1 do&lt;br /&gt;
    table.insert(v,packet:r_u8())&lt;br /&gt;
  end&lt;br /&gt;
  return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function writevu8uN(pk,v)&lt;br /&gt;
  local len=table.getn(v)&lt;br /&gt;
  --pk:w_u8(len)&lt;br /&gt;
  for i=1,len,1 do&lt;br /&gt;
    pk:w_u8(v[i])&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.condition=stpk:r_float()&lt;br /&gt;
	ret.updnum_items=updpk:r_u8()&lt;br /&gt;
  ret.updpos={} -- или поставить вектор? ладно потом&lt;br /&gt;
  ret.updpos.x=updpk:r_float()&lt;br /&gt;
  ret.updpos.y=updpk:r_float()&lt;br /&gt;
  ret.updpos.z=updpk:r_float()&lt;br /&gt;
	ret.updcse_alife_item__unk1_q8v4=readvu8uN(updpk,4)&lt;br /&gt;
	ret.updcse_alife_item__unk2_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
	ret.updcse_alife_item__unk3_q8v3=readvu8uN(updpk,3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_float(ret.condition)&lt;br /&gt;
	updpk:w_u8(ret.updnum_items)&lt;br /&gt;
  updpk:w_float(ret.updpos.x)&lt;br /&gt;
  updpk:w_float(ret.updpos.y)&lt;br /&gt;
  updpk:w_float(ret.updpos.z)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk1_q8v4)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk2_q8v3)&lt;br /&gt;
	readvu8uN(updpk,ret.updcse_alife_item__unk3_q8v3)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_left=stpk:r_u16()&lt;br /&gt;
	ret.updammo_left=updpk:r_u16()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_ammo_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_left)&lt;br /&gt;
	updpk:w_u16(ret.updammo_left)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ammo_params(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_ammo_packet(t,stpk,uppk,size)&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_ammo_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_ammo_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cfg_get_string(ini,sect,name,def)&lt;br /&gt;
	if ini and ini:line_exist(sect,name) then&lt;br /&gt;
		return ini:r_string(sect,name)&lt;br /&gt;
	end&lt;br /&gt;
	return def&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_destroyable_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
	amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_skeleton_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_object_physic_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_destroyable_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_skeleton_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_object_physic_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_weapon_data(sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
  sobj:STATE_Write(stpk)&lt;br /&gt;
  sobj:UPDATE_Write(uppk)&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  local t={}&lt;br /&gt;
  amk.parse_object_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_visual_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_packet(t,stpk,uppk,size)&lt;br /&gt;
  amk.parse_item_weapon_packet(t,stpk,uppk,size)&lt;br /&gt;
  -- amk.mylog(&amp;quot;rsp &amp;quot;..size..&amp;quot; &amp;quot;..size1..&amp;quot; &amp;quot;..stpk:r_tell())&lt;br /&gt;
  return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function set_weapon_data(t,sobj)&lt;br /&gt;
  local stpk=net_packet()&lt;br /&gt;
  local uppk=net_packet()&lt;br /&gt;
	&lt;br /&gt;
  amk.fill_object_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_visual_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_packet(t,stpk,uppk)&lt;br /&gt;
  amk.fill_item_weapon_packet(t,stpk,uppk)&lt;br /&gt;
	&lt;br /&gt;
  local size=stpk:w_tell()&lt;br /&gt;
  local size1=uppk:w_tell()&lt;br /&gt;
  -- amk.mylog(&amp;quot;wsp &amp;quot;..size..&amp;quot; &amp;quot;..size1)&lt;br /&gt;
  stpk:r_seek(0)&lt;br /&gt;
  uppk:r_seek(0)&lt;br /&gt;
  sobj:STATE_Read(stpk,size)&lt;br /&gt;
  sobj:UPDATE_Read(uppk)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	ret.ammo_current = stpk:r_u16()&lt;br /&gt;
	ret.ammo_elapsed = stpk:r_u16()&lt;br /&gt;
	ret.weapon_state = stpk:r_u8()&lt;br /&gt;
	ret.addon_flags = stpk:r_u8()&lt;br /&gt;
	ret.ammo_type = stpk:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	ret.updcondition = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_elapsed = updpk:r_u16()&lt;br /&gt;
	ret.updaddon_flags = updpk:r_u8()&lt;br /&gt;
	ret.updammo_type = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_state = updpk:r_u8()&lt;br /&gt;
	ret.updweapon_zoom = updpk:r_u8()&lt;br /&gt;
	ret.updcurrent_fire_mode = updpk:r_u8()&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function fill_item_weapon_packet(ret,stpk,updpk)&lt;br /&gt;
	stpk:w_u16(ret.ammo_current)&lt;br /&gt;
	stpk:w_u16(ret.ammo_elapsed)&lt;br /&gt;
	stpk:w_u8(ret.weapon_state)&lt;br /&gt;
	stpk:w_u8(ret.addon_flags)&lt;br /&gt;
	stpk:w_u8(ret.ammo_type)&lt;br /&gt;
	&lt;br /&gt;
	updpk:w_u8(ret.updcondition)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_flags)&lt;br /&gt;
	updpk:w_u16(ret.updammo_elapsed)&lt;br /&gt;
	updpk:w_u8(ret.updaddon_flags)&lt;br /&gt;
	updpk:w_u8(ret.updammo_type)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_state)&lt;br /&gt;
	updpk:w_u8(ret.updweapon_zoom)&lt;br /&gt;
	updpk:w_u8(ret.updcurrent_fire_mode)&lt;br /&gt;
  return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_ver()&lt;br /&gt;
	local ver = &amp;quot;0&amp;quot;&lt;br /&gt;
	local mm = _G.main_menu.get_main_menu()&lt;br /&gt;
	if mm then ver = mm:GetGSVer() end&lt;br /&gt;
	return ver&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
всё заходим в игру и пробуем :-)&lt;/div&gt;</summary>
		<author><name>Oxygenium</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%BA%D0%B2%D0%B5%D1%81%D1%82%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%BA%D0%B2%D0%B5%D1%81%D1%82%D0%B0"/>
				<updated>2010-05-21T10:06:59Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Разбираем конкретно параметры:'''&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''icon''' — иконка квеста&lt;br /&gt;
Пример использования: icon = ui_inGame2_Put_v_pripyat&lt;br /&gt;
&lt;br /&gt;
'''prior''' — приоритет квеста&lt;br /&gt;
Пример использования: prior = 112&lt;br /&gt;
&lt;br /&gt;
'''storyline''' — флаг задания (true — сюжетное, false — несюжетное)&lt;br /&gt;
Пример использования: storyline = true&lt;br /&gt;
&lt;br /&gt;
'''title '''— название задание (id из xml) — если брать название не из xml, то в игре оно будет отображаться без пробелов&lt;br /&gt;
Пример использования: title = zat_a9_way_gates_check_transport_workshop_name&lt;br /&gt;
&lt;br /&gt;
'''descr''' — описание задания (id из xml) — если брать название не из xml, то в игре оно будет отображаться без пробелов&lt;br /&gt;
Пример использования: descr = zat_a9_way_gates_check_transport_workshop_text&lt;br /&gt;
&lt;br /&gt;
'''target''' — цель на карте (метка)&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''target''' =zat_a2_stalker_barmen (ID нпц, на которого будет поставлена метка)&lt;br /&gt;
'''target''' = {+название_инфопоршня}zat_a2_stalker_barmen — проверка инфопоршня, после которого метка будет поставлена на нпц&lt;br /&gt;
&lt;br /&gt;
'''on_init''' — инфопоршень, который «включает» задание&lt;br /&gt;
Пример использования: on_init = %+название_инфопоршня%&lt;br /&gt;
&lt;br /&gt;
'''condlist_x''' — блок условий. возможные значения complete, reversed, fail&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''condlist_0''' = {+название_инфопоршня} complete — если поршень есть, задание выполнено&lt;br /&gt;
'''condlist_1''' = {+название_инфопоршня} reversed — если поршень есть, есть возможность повторить задание&lt;br /&gt;
'''condlist_2''' = {+название_инфопоршня} fail — если поршень есть, задание провалено&lt;br /&gt;
&lt;br /&gt;
'''on_complete''' — действия, которые выполняются, если задание выполнено&lt;br /&gt;
'''on_reversed''' — действия, которые выполняются, если задание провалено&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''on_complete''' = %=inc_faction_goodwill_to_actor(stalker:200)% — повышаем репу у сталкеров (функция юзаются из xr_effect)&lt;br /&gt;
'''on_reversed''' = {+название_ифопоршня} %=inc_faction_goodwill_to_actor(stalker:200)% — повышаем репу у сталкеров, только если есть опр.инфопоршень&lt;br /&gt;
'''on_complete''' = %+название_инфопоршня% — выдаем инфопоршень&lt;br /&gt;
&lt;br /&gt;
'''reward_money''' — денежная награда&lt;br /&gt;
Пример использования: reward_money = 5000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;center&amp;gt;Создаем примитивный квест:&amp;lt;/center&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
'''Используемые файлы:'''&lt;br /&gt;
&amp;lt;code&amp;gt;configs\gameplay\dialogs_zaton.xml&lt;br /&gt;
configs\gameplay\info_zaton.xml&lt;br /&gt;
configs\gameplay\character_desc_zaton.xml&lt;br /&gt;
configs\text\rus\st_quests_zaton.xml&lt;br /&gt;
configs\misc\tm_zaton.ltx&lt;br /&gt;
scripts\dialogs_zaton.script&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Создание диалога'''&lt;br /&gt;
Открываем файл '''dialogs_zaton.xml''' и добавляем перед '''&amp;lt;/game_dialogs&amp;gt;:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;dialog id=&amp;quot;vodka_quest_dialog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;quest_vodka_done&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;quest_vodka_give&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Принеси бутылочку&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;give_info&amp;gt;quest_vodka_give&amp;lt;/give_info&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;dialogs_zaton.give_vodka_quest&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Привет, тебе водки не принести?&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;vodka_quest_prines&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;has_info&amp;gt;quest_vodka_give&amp;lt;/has_info&amp;gt;&lt;br /&gt;
&amp;lt;precondition&amp;gt;dialogs_zaton.is_has_vodka_borode&amp;lt;/precondition&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Спасибо, чувак. Выручил&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;give_info&amp;gt;quest_vodka_done&amp;lt;/give_info&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;quest_has_vodka&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Вот твоя водяра&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;dialogs_zaton.transfer_vodka_to_boroda&amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее добавляем наши диалоги Бороде.&lt;br /&gt;
Открываем файл '''character_desc_zaton.xml'''&lt;br /&gt;
Находим строчку '''&amp;lt;actor_dialog&amp;gt;zat_a2_stalker_barmen_actor_info&amp;lt;/actor_dialog&amp;gt;''' и под ней пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;vodka_quest_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;vodka_quest_prines&amp;lt;/actor_dialog&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''info_zaton.xml''' и добавляем перед '''&amp;lt;/game_information_portions&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;lt;info_portion id=&amp;quot;quest_vodka_give&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
    &amp;lt;info_portion id=&amp;quot;quest_has_vodka&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
    &amp;lt;info_portion id=&amp;quot;quest_vodka_done&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''dialogs_zaton.script''' и в начало записываем:&lt;br /&gt;
&amp;lt;code&amp;gt;function give_vodka_quest()&lt;br /&gt;
   task_manager.get_task_manager():give_task(&amp;quot;quest_vodka_give&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function is_has_vodka_borode()&lt;br /&gt;
    if db.actor:object(&amp;quot;vodka&amp;quot;) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
function transfer_vodka_to_boroda(first_speaker, second_speaker)&lt;br /&gt;
    dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, &amp;quot;vodka&amp;quot;)&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
'''Открываем файл tm_zaton.ltx и в конец пишем:'''&lt;br /&gt;
&amp;lt;code&amp;gt;[quest_vodka_give]&lt;br /&gt;
icon = ui_inGame2_Put_v_pripyat&lt;br /&gt;
prior = 2&lt;br /&gt;
storyline = false&lt;br /&gt;
title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name&lt;br /&gt;
descr = vodka_barmen_descr&lt;br /&gt;
target = {=actor_has_item(vodka)}zat_a2_stalker_barmen&lt;br /&gt;
condlist_0 = {+quest_vodka_done} complete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''st_quests_zaton.xml''' и добавляем после '''&amp;lt;string_table&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;string id=&amp;quot;vodka_barmen_naiti_name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Найти водку для бармена&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;vodka_barmen_prinesti_name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Принести водку бармену&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;vodka_barmen_descr&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Бармен в тестовых целях попросил найти и принести ему 2 бутылки водки&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
Автор: '''XMK'''&lt;br /&gt;
Источник: [http://www.amk-2.ru/forum/go.php?http://ars-team.ru/forum/index.php?autocom=ibwiki&amp;amp;cmd=article&amp;amp;id=5]&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</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%BA%D0%B2%D0%B5%D1%81%D1%82%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%BA%D0%B2%D0%B5%D1%81%D1%82%D0%B0"/>
				<updated>2010-05-21T10:05:37Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Разбираем конкретно параметры:'''&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''icon''' — иконка квеста&lt;br /&gt;
Пример использования: icon = ui_inGame2_Put_v_pripyat&lt;br /&gt;
&lt;br /&gt;
'''prior''' — приоритет квеста&lt;br /&gt;
Пример использования: prior = 112&lt;br /&gt;
&lt;br /&gt;
'''storyline''' — флаг задания (true — сюжетное, false — несюжетное)&lt;br /&gt;
Пример использования: storyline = true&lt;br /&gt;
&lt;br /&gt;
'''title '''— название задание (id из xml) — если брать название не из xml, то в игре оно будет отображаться без пробелов&lt;br /&gt;
Пример использования: title = zat_a9_way_gates_check_transport_workshop_name&lt;br /&gt;
&lt;br /&gt;
'''descr''' — описание задания (id из xml) — если брать название не из xml, то в игре оно будет отображаться без пробелов&lt;br /&gt;
Пример использования: descr = zat_a9_way_gates_check_transport_workshop_text&lt;br /&gt;
&lt;br /&gt;
'''target''' — цель на карте (метка)&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''target''' =zat_a2_stalker_barmen (ID нпц, на которого будет поставлена метка)&lt;br /&gt;
'''target''' = {+название_инфопоршня}zat_a2_stalker_barmen — проверка инфопоршня, после которого метка будет поставлена на нпц&lt;br /&gt;
&lt;br /&gt;
'''on_init''' — инфопоршень, который «включает» задание&lt;br /&gt;
Пример использования: on_init = %+название_инфопоршня%&lt;br /&gt;
&lt;br /&gt;
'''condlist_x''' — блок условий. возможные значения complete, reversed, fail&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''condlist_0''' = {+название_инфопоршня} complete — если поршень есть, задание выполнено&lt;br /&gt;
'''condlist_1''' = {+название_инфопоршня} reversed — если поршень есть, есть возможность повторить задание&lt;br /&gt;
'''condlist_2''' = {+название_инфопоршня} fail — если поршень есть, задание провалено&lt;br /&gt;
&lt;br /&gt;
'''on_complete''' — действия, которые выполняются, если задание выполнено&lt;br /&gt;
'''on_reversed''' — действия, которые выполняются, если задание провалено&lt;br /&gt;
Примеры использования:&lt;br /&gt;
'''on_complete''' = %=inc_faction_goodwill_to_actor(stalker:200)% — повышаем репу у сталкеров (функция юзаются из xr_effect)&lt;br /&gt;
'''on_reversed''' = {+название_ифопоршня} %=inc_faction_goodwill_to_actor(stalker:200)% — повышаем репу у сталкеров, только если есть опр.инфопоршень&lt;br /&gt;
'''on_complete''' = %+название_инфопоршня% — выдаем инфопоршень&lt;br /&gt;
&lt;br /&gt;
'''reward_money''' — денежная награда&lt;br /&gt;
Пример использования: reward_money = 5000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;center&amp;gt;Создаем примитивный квест:&amp;lt;/center&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
'''Используемые файлы:'''&lt;br /&gt;
&amp;lt;code&amp;gt;configs\gameplay\dialogs_zaton.xml&lt;br /&gt;
configs\gameplay\info_zaton.xml&lt;br /&gt;
configs\gameplay\character_desc_zaton.xml&lt;br /&gt;
configs\text\rus\st_quests_zaton.xml&lt;br /&gt;
configs\misc\tm_zaton.ltx&lt;br /&gt;
scripts\dialogs_zaton.script&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Создание диалога'''&lt;br /&gt;
Открываем файл '''dialogs_zaton.xml''' и добавляем перед '''&amp;lt;/game_dialogs&amp;gt;:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;dialog id=&amp;quot;vodka_quest_dialog&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;quest_vodka_done&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;dont_has_info&amp;gt;quest_vodka_give&amp;lt;/dont_has_info&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Принеси бутылочку&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;give_info&amp;gt;quest_vodka_give&amp;lt;/give_info&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;dialogs_zaton.give_vodka_quest&amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Привет, тебе водки не принести?&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dialog id=&amp;quot;vodka_quest_prines&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;has_info&amp;gt;quest_vodka_give&amp;lt;/has_info&amp;gt;&lt;br /&gt;
&amp;lt;precondition&amp;gt;dialogs_zaton.is_has_vodka_borode&amp;lt;/precondition&amp;gt;&lt;br /&gt;
&amp;lt;phrase_list&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Спасибо, чувак. Выручил&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;give_info&amp;gt;quest_vodka_done&amp;lt;/give_info&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
    &amp;lt;phrase id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;has_info&amp;gt;quest_has_vodka&amp;lt;/has_info&amp;gt;&lt;br /&gt;
        &amp;lt;text&amp;gt;Вот твоя водяра&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;dialogs_zaton.transfer_vodka_to_boroda&amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;next&amp;gt;1&amp;lt;/next&amp;gt;&lt;br /&gt;
    &amp;lt;/phrase&amp;gt;&lt;br /&gt;
&amp;lt;/phrase_list&amp;gt;&lt;br /&gt;
&amp;lt;/dialog&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее добавляем наши диалоги Бороде.&lt;br /&gt;
Открываем файл '''character_desc_zaton.xml'''&lt;br /&gt;
Находим строчку '''&amp;lt;actor_dialog&amp;gt;zat_a2_stalker_barmen_actor_info&amp;lt;/actor_dialog&amp;gt;''' и под ней пишем&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;vodka_quest_dialog&amp;lt;/actor_dialog&amp;gt;&lt;br /&gt;
&amp;lt;actor_dialog&amp;gt;vodka_quest_prines&amp;lt;/actor_dialog&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''info_zaton.xml''' и добавляем перед '''&amp;lt;/game_information_portions&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;    &amp;lt;info_portion id=&amp;quot;quest_vodka_give&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
    &amp;lt;info_portion id=&amp;quot;quest_has_vodka&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
    &amp;lt;info_portion id=&amp;quot;quest_vodka_done&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''dialogs_zaton.script''' и в начало записываем:&lt;br /&gt;
&amp;lt;code&amp;gt;function give_vodka_quest()&lt;br /&gt;
   task_manager.get_task_manager():give_task(&amp;quot;quest_vodka_give&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function is_has_vodka_borode()&lt;br /&gt;
    if db.actor:object(&amp;quot;vodka&amp;quot;) then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
function transfer_vodka_to_boroda(first_speaker, second_speaker)&lt;br /&gt;
    dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, &amp;quot;vodka&amp;quot;)&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
'''Открываем файл tm_zaton.ltx и в конец пишем:'''&lt;br /&gt;
&amp;lt;code&amp;gt;[quest_vodka_give]&lt;br /&gt;
icon = ui_inGame2_Put_v_pripyat&lt;br /&gt;
prior = 2&lt;br /&gt;
storyline = false&lt;br /&gt;
title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name&lt;br /&gt;
descr = vodka_barmen_descr&lt;br /&gt;
target = {=actor_has_item(vodka)}zat_a2_stalker_barmen&lt;br /&gt;
condlist_0 = {+quest_vodka_done} complete&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем файл '''st_quests_zaton.xml''' и добавляем после '''&amp;lt;string_table&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;string id=&amp;quot;vodka_barmen_naiti_name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Найти водку для бармена&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;vodka_barmen_prinesti_name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Принести водку бармену&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;vodka_barmen_descr&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Бармен в тестовых целях попросил найти и принести ему 2 бутылки водки&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Сохраняем&lt;br /&gt;
&lt;br /&gt;
Автор: '''XMK'''&lt;br /&gt;
Источник: [http://www.amk-2.ru/forum/go.php?http://ars-team.ru/forum/index.php?autocom=ibwiki&amp;amp;cmd=article&amp;amp;id=5]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D1%85</id>
		<title>Начальные сведения о скриптах</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D1%85"/>
				<updated>2010-05-19T14:38:12Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ПРЕДИСЛОВИЕ&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Для чего нужны срипты и сведения и их использовании - Rez@niy aka Oxygenium|&lt;br /&gt;
message = В скриптах содержаться данные для выполнения по условиям.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br clear=&amp;quot;both&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Итак начнём. Рассмотрим простой скрипт спавна предмета:&lt;br /&gt;
--*********************************************&lt;br /&gt;
--**TESTING**&lt;br /&gt;
--*********************************************&lt;br /&gt;
--&lt;br /&gt;
-- Создает в заданном месте калаш&lt;br /&gt;
function ak_create()&lt;br /&gt;
	local a = vector() -- db.actor:position()&lt;br /&gt;
	a.x = -220.21&lt;br /&gt;
	a.y = -19.93&lt;br /&gt;
	a.z = -158.98&lt;br /&gt;
	alife():create(&amp;quot;wpn_ak47&amp;quot;,a,33447,47,65535)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;ИМЯ ФУНКЦИИ&amp;lt;/big&amp;gt;&lt;br /&gt;
function - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный. &lt;br /&gt;
Дальше идёт функциия о позиции, она обязательна для спавна скриптом.&lt;br /&gt;
Ниже кординаты. Для снятия кординат используем в консоли rs_stats on.&lt;br /&gt;
После кординат идёт сама функция спавна. &amp;lt;big&amp;gt;alife():create(&amp;quot;СИСТЕМНОЕ ИМЯ ОБЬЕКТА&amp;quot;,a,33447,47,65535)&amp;lt;/big&amp;gt;&lt;br /&gt;
Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл main.script и пишем туда готовый текст, только со своими кординатами.&lt;br /&gt;
&amp;lt;pre&amp;gt;--*********************************************&lt;br /&gt;
--**TESTING**&lt;br /&gt;
--*********************************************&lt;br /&gt;
--&lt;br /&gt;
-- Создает в заданном месте калаш&lt;br /&gt;
function ak_create()&lt;br /&gt;
	local a = vector() -- db.actor:position()&lt;br /&gt;
	a.x = -220.21&lt;br /&gt;
	a.y = -19.93&lt;br /&gt;
	a.z = -158.98&lt;br /&gt;
	alife():create(&amp;quot;wpn_ak47&amp;quot;,a,33447,47,65535)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
Написали? Отлично!. Теперь осталось только подключить это к игре.  Идём в файл dialogs_escape.xml и выбираем какое нить диалог. Там после поля text в диалоге приписываем &amp;lt;action&amp;gt;main.ak_create&amp;lt;/action&amp;gt;&lt;br /&gt;
ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем  и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных кординатах.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Message_box|&lt;br /&gt;
id	=pseudoscience1|&lt;br /&gt;
align = left|&lt;br /&gt;
backgroundcolor	= #f9f9f9|&lt;br /&gt;
image	=Lamp.gif|&lt;br /&gt;
heading	= Углублённое изучение - Rez@niy|&lt;br /&gt;
message = Далее идём в более углублённое изучение. Изучаем построение}}&lt;br /&gt;
&lt;br /&gt;
Прописываем функцию. Задаём условие:&lt;br /&gt;
if =&lt;br /&gt;
Для закрытия тэга end&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;
''О'' - Цикл это повторение одного и того же действие n-ое кол-во раз&lt;br /&gt;
выглядит так&lt;br /&gt;
&amp;lt;pre&amp;gt;for i=1,n do&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
За место i может быть любая переменная ,за место n - число которое больше первоначального значения(i)&lt;br /&gt;
'''В''' - А для чего можно использовать цикл?&lt;br /&gt;
''О'' - много для чего можно.см. ниже&lt;br /&gt;
Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)&lt;br /&gt;
&amp;lt;pre&amp;gt;for id=1,65535 do&lt;br /&gt;
local obj = level.object_by_id(id)&lt;br /&gt;
if obj~= nil then&lt;br /&gt;
if IsMonster(obj) then&lt;br /&gt;
return true&lt;br /&gt;
else&lt;br /&gt;
return false&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
Пример 2.Спавн/&lt;br /&gt;
&amp;lt;pre&amp;gt;for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК &lt;br /&gt;
	local a = vector() &lt;br /&gt;
	a.x = -220.21&lt;br /&gt;
	a.y = -19.93&lt;br /&gt;
	a.z = -158.98&lt;br /&gt;
	alife():create(&amp;quot;wpn_ak47&amp;quot;,a,33447,47,65535)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
и т.п.&lt;br /&gt;
существует ещё цикл  с предусловием (while a,n do),но об этом позже&lt;br /&gt;
'''В''' - Какие параметры ГГ можно корректировать  скриптами?&lt;br /&gt;
''О'' - Таких не много, запись будет такой :&amp;lt;pre&amp;gt;db.actor.параметр&amp;lt;/pre&amp;gt;&lt;br /&gt;
Параметры:&lt;br /&gt;
&amp;lt;pre&amp;gt;radiation&lt;br /&gt;
health&lt;br /&gt;
psy_health&lt;br /&gt;
power&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''В''' - а можно ли спавнить в рандомной точке предмет,если да,то как?&lt;br /&gt;
''О'' - можно&lt;br /&gt;
Для этого нам понадобится таблица максимальных значений level_vertex_id и game_vertex_id&lt;br /&gt;
выглядит она так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local level_vertexes={&lt;br /&gt;
l01_escape = {lvid=595580, gvid=44},&lt;br /&gt;
l02_garbage = {lvid=384039, gvid=265},&lt;br /&gt;
l03_agroprom = {lvid=438379, gvid=693},&lt;br /&gt;
l04_darkvalley = {lvid=392517, gvid=813},&lt;br /&gt;
l06_rostok = {lvid=69283, gvid=1311},&lt;br /&gt;
l07_military = {lvid=915663, gvid=1546},&lt;br /&gt;
l10_radar = {lvid=796328, gvid=1868},&lt;br /&gt;
l11_pripyat = {lvid=295965, gvid=2269}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ЗЫ:Извините ,что не для всех уровней,исправлюсь &lt;br /&gt;
Так,таблица у нас есть ,теперь нам нужно написать функцию спавна.Давайте покажу на Монстрах&lt;br /&gt;
создадим таблицу с секциями спавна монстров:&lt;br /&gt;
(Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local mutants = {&lt;br /&gt;
&amp;quot;zombie_ghost_hell&amp;quot;,&lt;br /&gt;
&amp;quot;zombie_normal_hell&amp;quot;,&lt;br /&gt;
&amp;quot;zombie_immortal_hell&amp;quot;,&lt;br /&gt;
&amp;quot;bloodsucker_weak_hell&amp;quot;,&lt;br /&gt;
&amp;quot;tushkano_normal_hell&amp;quot;,&lt;br /&gt;
&amp;quot;snork_weak_hell&amp;quot;,&lt;br /&gt;
&amp;quot;burer_weak_hell&amp;quot;,&lt;br /&gt;
&amp;quot;cat_weak_hell&amp;quot;,&lt;br /&gt;
&amp;quot;chimera_weak_hell&amp;quot;,&lt;br /&gt;
&amp;quot;gigant_strong_hell&amp;quot;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблицу записали ,наконец приступим к оформлению главной функции&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn()&lt;br /&gt;
local count = math.random(5,20) --выбираем кол-во заспавненых мобов&lt;br /&gt;
local section = mutants[math.random(table.getn(mutants))] -- выбираем секцию моба&lt;br /&gt;
local lv = math.random(level_vertexes[level.name()][&amp;quot;lvid&amp;quot;]) --выбираем левел вертекс&lt;br /&gt;
local gv = level_vertexes[level.name()][&amp;quot;gvid&amp;quot;] --выбираем гэйм вертекс&lt;br /&gt;
for ind = 1, count do&lt;br /&gt;
alife():create(section, level.vertex_position(lv), lv, gv)--\\level.vertex_position(lv) - позиция левел вертекса&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке&lt;br /&gt;
[[Категория:Скрипты]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Вступление ГГ в группировку!&amp;lt;/big&amp;gt;&lt;br /&gt;
1.Создаем файл ваше_название_скприпта.script в папке gamedata/scripts&lt;br /&gt;
2. Открываем его и пишем:&lt;br /&gt;
--меняем группировку ГГ&lt;br /&gt;
&amp;lt;pre&amp;gt;function new_group(actor, npc)&lt;br /&gt;
if npc:character_community() ~= &amp;quot;(dolg)&amp;quot; then &lt;br /&gt;
npc:set_character_community(&amp;quot;dolg&amp;quot;, 0, 0) &lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
Выдаём функцию при разговоре с НПС&lt;br /&gt;
&lt;br /&gt;
НПС вступает в группировку&lt;br /&gt;
&amp;lt;pre&amp;gt;function ваше_название_функции(npc, actor)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Вызываем также, из любого диалога&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Нельзя взять оружие без брони&amp;lt;/big&amp;gt;&lt;br /&gt;
Пишем функцию в любом скрипе:&lt;br /&gt;
function ваше_название_функции()&lt;br /&gt;
local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!)&lt;br /&gt;
local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)&lt;br /&gt;
&lt;br /&gt;
if db.actor:active_slot()==2 and weapon then -- за место 2 пишем слот оружия еще раз&lt;br /&gt;
local tmp&lt;br /&gt;
if armor then&lt;br /&gt;
tmp = armor:section()&lt;br /&gt;
else&lt;br /&gt;
tmp = &amp;quot;none&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if (not string.find(tmp, &amp;quot;пишем_название_брони&amp;quot; )) and (weapon:section()==&amp;quot;пишем_название_оружия1&amp;quot; or weapon:section()==&amp;quot;пишем_название_оружия2&amp;quot; or weapon:section()==&amp;quot;пишем_название_оружия3&amp;quot;) then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, &amp;quot;exo&amp;quot; )) and weapon:section()==&amp;quot;wpn_pkm&amp;quot; then&lt;br /&gt;
db.actor:drop_item(weapon)&lt;br /&gt;
local tmpw = amk.spawn_item_in_inv(weapon:section())&lt;br /&gt;
db.actor:transfer_item(weapon,db.actor)&lt;br /&gt;
alife():release(tmpw)&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;Невозможно взять пулемёт в руки без экзы&amp;quot;,nil,nil,10000)&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идем по этому пути &amp;lt;pre&amp;gt;gamedata/script/bind_stalker.script&amp;lt;/pre&amp;gt;&lt;br /&gt;
Функция &amp;lt;pre&amp;gt;function actor_binder:update(delta)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Сразу ниже неё пиши вызов в формате :&lt;br /&gt;
название_файла.название_функции.&lt;br /&gt;
Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там.&lt;br /&gt;
Должно быть так :&lt;br /&gt;
Код&lt;br /&gt;
&amp;lt;pre&amp;gt;function actor_binder:update(delta)&lt;br /&gt;
my_script.check_armor()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Удаление предмета из инвентаря&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name_function()&lt;br /&gt;
local se_obj = alife():object(&amp;quot;сюда_пишем_что_удалять_будем&amp;quot;)&lt;br /&gt;
if se_obj then&lt;br /&gt;
alife():release(se_obj, true)&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ПРИМЕР&lt;br /&gt;
--' убираем финального Клыка&lt;br /&gt;
&amp;lt;pre&amp;gt;function dell_kluk_final()&lt;br /&gt;
local se_obj = alife():object(&amp;quot;final_kluk&amp;quot;)&lt;br /&gt;
if se_obj then&lt;br /&gt;
alife():release(se_obj, true)&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%B8%D0%B3%D0%B0%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C</id>
		<title>SoC. Сигаретная зависимость</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%B8%D0%B3%D0%B0%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C"/>
				<updated>2010-05-19T14:30:03Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Автор: &amp;lt;big&amp;gt;Xmk&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Для этого нам понадобятся файлы (AMK Mod):&lt;br /&gt;
config/misc/items.ltx&lt;br /&gt;
config/text/rus/string_table_enc_equipment.xml&lt;br /&gt;
scripts/amk.script&lt;br /&gt;
script/amk_mod.script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;snd = sound_object([[ambient\underground\rnd_giant]])&lt;br /&gt;
&lt;br /&gt;
-- Проверяем нужно ли покурить. Вызывается каждые 6 игровых минут&lt;br /&gt;
function test_for_need_kur()&lt;br /&gt;
    amk.save_variable(&amp;quot;kur&amp;quot;,amk.load_variable(&amp;quot;kur&amp;quot;,0)+1)&lt;br /&gt;
    amk.g_start_timer(&amp;quot;kur&amp;quot;,0,0,6)&lt;br /&gt;
    kur_reduce_health()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Уменьшение здоровья, если долго не курил&lt;br /&gt;
function kur_reduce_health()&lt;br /&gt;
    local tmp = amk.load_variable(&amp;quot;kur&amp;quot;,0)&lt;br /&gt;
    if tmp &amp;gt; 150 then&lt;br /&gt;
        if db.actor.health &amp;gt; 0.15 then&lt;br /&gt;
            db.actor.health = - 0.15&lt;br /&gt;
        end&lt;br /&gt;
        if not snd:playing() then&lt;br /&gt;
            snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Курение&lt;br /&gt;
function kur_item(oid, time)&lt;br /&gt;
    if alife():object(oid)==nil then&lt;br /&gt;
        local tmp = amk.load_variable(&amp;quot;kur&amp;quot;,0) - time*10&lt;br /&gt;
        if tmp &amp;lt; 0 then tmp = 0 end&lt;br /&gt;
        amk.save_variable(&amp;quot;kur&amp;quot;, tmp)&lt;br /&gt;
        kur_reduce_health()&lt;br /&gt;
    end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Открываем файл amk.script:&lt;br /&gt;
&lt;br /&gt;
после:&lt;br /&gt;
&amp;lt;pre&amp;gt;function __do_timer_action(select_string,params_string)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;if select_string==&amp;quot;kur&amp;quot; then&lt;br /&gt;
название_вашего_скрипта.test_for_need_kur()&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Открываем файл amk_mod.script&lt;br /&gt;
в функции '''first_run''' пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;amk.g_start_timer(&amp;quot;kur&amp;quot;,0,0,6)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
затем в функции '''check_sleep_item(obj)''' после&lt;br /&gt;
&amp;lt;pre&amp;gt;  elseif section==&amp;quot;treasure_item&amp;quot; then&lt;br /&gt;
        stype=&amp;quot;tr_item&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
но перед '''end''' пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;  elseif section == &amp;quot;sigaret&amp;quot; then&lt;br /&gt;
    stype = &amp;quot;sgr&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Открываем файл items.ltx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[sigaret]:identity_immunities&lt;br /&gt;
GroupControlSection  = spawn_group&lt;br /&gt;
discovery_dependency =&lt;br /&gt;
$spawn               = &amp;quot;food and drugs\antirad&amp;quot;&lt;br /&gt;
$prefetch            = 32&lt;br /&gt;
class                = II_ANTIR&lt;br /&gt;
cform                = skeleton&lt;br /&gt;
visual               = weapons\sigaret\sigaret.ogf&lt;br /&gt;
&lt;br /&gt;
inv_name             = sigareta&lt;br /&gt;
inv_name_short       = sigareta&lt;br /&gt;
description          = enc_food_sigareta&lt;br /&gt;
&lt;br /&gt;
inv_weight           = 0.02&lt;br /&gt;
inv_grid_width       = 1&lt;br /&gt;
inv_grid_height      = 2&lt;br /&gt;
inv_grid_x           = 10&lt;br /&gt;
inv_grid_y           = 24&lt;br /&gt;
&lt;br /&gt;
cost                 = 50&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;
eat_alcohol          = 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;
animation_slot       = 4&lt;br /&gt;
&lt;br /&gt;
;hud item&lt;br /&gt;
hud                  = wpn_vodka_hud&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Открываем файл string_table_enc_equipment.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;string id=&amp;quot;sigareta&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Сигарета&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;enc_food_sigareta&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Пишем любое описание сигареты, мне че то в голову ниче не приходит&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%B8%D0%B3%D0%B0%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C</id>
		<title>SoC. Сигаретная зависимость</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%B8%D0%B3%D0%B0%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D1%8C"/>
				<updated>2010-05-19T14:29:36Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Автор: Xmk'''&lt;br /&gt;
&lt;br /&gt;
Для этого нам понадобятся файлы (AMK Mod):&lt;br /&gt;
config/misc/items.ltx&lt;br /&gt;
config/text/rus/string_table_enc_equipment.xml&lt;br /&gt;
scripts/amk.script&lt;br /&gt;
script/amk_mod.script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;snd = sound_object([[ambient\underground\rnd_giant]])&lt;br /&gt;
&lt;br /&gt;
-- Проверяем нужно ли покурить. Вызывается каждые 6 игровых минут&lt;br /&gt;
function test_for_need_kur()&lt;br /&gt;
    amk.save_variable(&amp;quot;kur&amp;quot;,amk.load_variable(&amp;quot;kur&amp;quot;,0)+1)&lt;br /&gt;
    amk.g_start_timer(&amp;quot;kur&amp;quot;,0,0,6)&lt;br /&gt;
    kur_reduce_health()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Уменьшение здоровья, если долго не курил&lt;br /&gt;
function kur_reduce_health()&lt;br /&gt;
    local tmp = amk.load_variable(&amp;quot;kur&amp;quot;,0)&lt;br /&gt;
    if tmp &amp;gt; 150 then&lt;br /&gt;
        if db.actor.health &amp;gt; 0.15 then&lt;br /&gt;
            db.actor.health = - 0.15&lt;br /&gt;
        end&lt;br /&gt;
        if not snd:playing() then&lt;br /&gt;
            snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Курение&lt;br /&gt;
function kur_item(oid, time)&lt;br /&gt;
    if alife():object(oid)==nil then&lt;br /&gt;
        local tmp = amk.load_variable(&amp;quot;kur&amp;quot;,0) - time*10&lt;br /&gt;
        if tmp &amp;lt; 0 then tmp = 0 end&lt;br /&gt;
        amk.save_variable(&amp;quot;kur&amp;quot;, tmp)&lt;br /&gt;
        kur_reduce_health()&lt;br /&gt;
    end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Открываем файл amk.script:&lt;br /&gt;
&lt;br /&gt;
после:&lt;br /&gt;
&amp;lt;pre&amp;gt;function __do_timer_action(select_string,params_string)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;if select_string==&amp;quot;kur&amp;quot; then&lt;br /&gt;
название_вашего_скрипта.test_for_need_kur()&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Открываем файл amk_mod.script&lt;br /&gt;
в функции '''first_run''' пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;amk.g_start_timer(&amp;quot;kur&amp;quot;,0,0,6)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
затем в функции '''check_sleep_item(obj)''' после&lt;br /&gt;
&amp;lt;pre&amp;gt;  elseif section==&amp;quot;treasure_item&amp;quot; then&lt;br /&gt;
        stype=&amp;quot;tr_item&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
но перед '''end''' пишем:&lt;br /&gt;
&amp;lt;pre&amp;gt;  elseif section == &amp;quot;sigaret&amp;quot; then&lt;br /&gt;
    stype = &amp;quot;sgr&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Открываем файл items.ltx&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[sigaret]:identity_immunities&lt;br /&gt;
GroupControlSection  = spawn_group&lt;br /&gt;
discovery_dependency =&lt;br /&gt;
$spawn               = &amp;quot;food and drugs\antirad&amp;quot;&lt;br /&gt;
$prefetch            = 32&lt;br /&gt;
class                = II_ANTIR&lt;br /&gt;
cform                = skeleton&lt;br /&gt;
visual               = weapons\sigaret\sigaret.ogf&lt;br /&gt;
&lt;br /&gt;
inv_name             = sigareta&lt;br /&gt;
inv_name_short       = sigareta&lt;br /&gt;
description          = enc_food_sigareta&lt;br /&gt;
&lt;br /&gt;
inv_weight           = 0.02&lt;br /&gt;
inv_grid_width       = 1&lt;br /&gt;
inv_grid_height      = 2&lt;br /&gt;
inv_grid_x           = 10&lt;br /&gt;
inv_grid_y           = 24&lt;br /&gt;
&lt;br /&gt;
cost                 = 50&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;
eat_alcohol          = 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;
animation_slot       = 4&lt;br /&gt;
&lt;br /&gt;
;hud item&lt;br /&gt;
hud                  = wpn_vodka_hud&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Открываем файл string_table_enc_equipment.xml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;string id=&amp;quot;sigareta&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Сигарета&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;enc_food_sigareta&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;text&amp;gt;Пишем любое описание сигареты, мне че то в голову ниче не приходит&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-05-18T14:25:55Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Редактор Oxygenium */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Технические админы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по функционалу и работе базы знаний.&lt;br /&gt;
&lt;br /&gt;
=== Neo][ ===&lt;br /&gt;
*[mailto:neo@stalkerin.gameru.net электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
== Главные редакторы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по материалам, находящимся в базе знаний.&lt;br /&gt;
&lt;br /&gt;
=== [[Участник:HikeR|HikeR]] ===&lt;br /&gt;
*[mailto:hhrhhr@gmail.com электронная почта]&lt;br /&gt;
*ICQ: 58258575&lt;br /&gt;
&lt;br /&gt;
=== Loxotron ===&lt;br /&gt;
*[mailto:loxotron@bk.ru электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Oxygenium&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;br /&gt;
&lt;br /&gt;
=== StUnDeR ===&lt;br /&gt;
*mail: Stalkers-life@rambler.ru&lt;br /&gt;
*ICQ: 413633944&lt;br /&gt;
&lt;br /&gt;
== Новости STALKER Wiki ==&lt;br /&gt;
'''- январь 2008 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поддержка flash мувиков&lt;br /&gt;
&lt;br /&gt;
'''- июнь 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починена загрузка картинок&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- февраль 2010 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починено отображение картинок&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-05-18T14:25:32Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Редактор Oxygenium */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Технические админы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по функционалу и работе базы знаний.&lt;br /&gt;
&lt;br /&gt;
=== Neo][ ===&lt;br /&gt;
*[mailto:neo@stalkerin.gameru.net электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
== Главные редакторы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по материалам, находящимся в базе знаний.&lt;br /&gt;
&lt;br /&gt;
=== [[Участник:HikeR|HikeR]] ===&lt;br /&gt;
*[mailto:hhrhhr@gmail.com электронная почта]&lt;br /&gt;
*ICQ: 58258575&lt;br /&gt;
&lt;br /&gt;
=== Loxotron ===&lt;br /&gt;
*[mailto:loxotron@bk.ru электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Редактор Oxygenium ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;br /&gt;
&lt;br /&gt;
=== StUnDeR ===&lt;br /&gt;
*mail: Stalkers-life@rambler.ru&lt;br /&gt;
*ICQ: 413633944&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Новости STALKER Wiki ==&lt;br /&gt;
'''- январь 2008 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поддержка flash мувиков&lt;br /&gt;
&lt;br /&gt;
'''- июнь 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починена загрузка картинок&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- февраль 2010 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починено отображение картинок&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-05-18T14:25:24Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Loxotron */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Технические админы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по функционалу и работе базы знаний.&lt;br /&gt;
&lt;br /&gt;
=== Neo][ ===&lt;br /&gt;
*[mailto:neo@stalkerin.gameru.net электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
== Главные редакторы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по материалам, находящимся в базе знаний.&lt;br /&gt;
&lt;br /&gt;
=== [[Участник:HikeR|HikeR]] ===&lt;br /&gt;
*[mailto:hhrhhr@gmail.com электронная почта]&lt;br /&gt;
*ICQ: 58258575&lt;br /&gt;
&lt;br /&gt;
=== Loxotron ===&lt;br /&gt;
*[mailto:loxotron@bk.ru электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Редактор Oxygenium ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;br /&gt;
&lt;br /&gt;
=== StUnDeR ===&lt;br /&gt;
*mail: Stalkers-life@rambler.ru&lt;br /&gt;
*ICQ: 413633944&lt;br /&gt;
&lt;br /&gt;
== Редактор Oxygenium ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;br /&gt;
&lt;br /&gt;
== Новости STALKER Wiki ==&lt;br /&gt;
'''- январь 2008 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поддержка flash мувиков&lt;br /&gt;
&lt;br /&gt;
'''- июнь 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починена загрузка картинок&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- февраль 2010 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починено отображение картинок&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%87%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_HUD</id>
		<title>SoC. Выводим часы на HUD</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%92%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D0%BC_%D1%87%D0%B0%D1%81%D1%8B_%D0%BD%D0%B0_HUD"/>
				<updated>2010-05-18T13:31:44Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для этого нам понадобятся стандартные файлы:&lt;br /&gt;
config/ui/ui_custom_msgs.xml&lt;br /&gt;
scripts/bind_stalker.script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function show_time()&lt;br /&gt;
    local hud = get_hud()&lt;br /&gt;
    local cs = hud:GetCustomStatic(&amp;quot;hud_show_time&amp;quot;)&lt;br /&gt;
    if cs == nil then&lt;br /&gt;
        hud:AddCustomStatic(&amp;quot;hud_time_static&amp;quot;, true)&lt;br /&gt;
        hud:AddCustomStatic(&amp;quot;hud_show_time&amp;quot;, true)&lt;br /&gt;
        cs = hud:GetCustomStatic(&amp;quot;hud_show_time&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local time_h = level.get_time_hours()&lt;br /&gt;
    local time_m = level.get_time_minutes()&lt;br /&gt;
    local msg&lt;br /&gt;
    if time_m &amp;gt;= 10 then&lt;br /&gt;
        msg = string.format(&amp;quot; %02d:%02d\n&amp;quot;, time_h, time_m)&lt;br /&gt;
    else&lt;br /&gt;
        msg = string.format(&amp;quot; %02d:%02d\n&amp;quot;, time_h, time_m)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if cs ~= nil then cs:wnd():SetText(msg) end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Далее открываем файл ui_custom_msgs.xml в config/ui/ и пишем туда:&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;lt;hud_time_static  x=&amp;quot;852&amp;quot; y=&amp;quot;17&amp;quot; width=&amp;quot;156&amp;quot; height=&amp;quot;52&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text complex_mode=&amp;quot;0&amp;quot; x=&amp;quot;65&amp;quot; y=&amp;quot;0&amp;quot; font=&amp;quot;letterica16&amp;quot; r=&amp;quot;255&amp;quot; g=&amp;quot;255&amp;quot; b=&amp;quot;255&amp;quot; a=&amp;quot;130&amp;quot;&amp;gt;Time&amp;lt;/text&amp;gt;&lt;br /&gt;
        &amp;lt;texture&amp;gt;ui_hud_frame_clock&amp;lt;/texture&amp;gt;&lt;br /&gt;
    &amp;lt;/hud_time_static&amp;gt;&lt;br /&gt;
    &amp;lt;hud_show_time x=&amp;quot;862&amp;quot; y=&amp;quot;38&amp;quot; width=&amp;quot;156&amp;quot; height=&amp;quot;52&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;text x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; font=&amp;quot;graffiti19&amp;quot; r=&amp;quot;255&amp;quot; g=&amp;quot;255&amp;quot; b=&amp;quot;255&amp;quot; a=&amp;quot;140&amp;quot; align=&amp;quot;c&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/hud_show_time&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Открываем файл bind_stalker.script и пишем после:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function actor_binder:update(delta)&lt;br /&gt;
    object_binder.update(self, delta)&lt;br /&gt;
    local time = time_global()&lt;br /&gt;
    game_stats.update (delta, self.object)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ваше_название_скрипта.show_time()&lt;br /&gt;
В любую функцию&lt;br /&gt;
&lt;br /&gt;
Автор: '''steelrat'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%82%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%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_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%82%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%B0"/>
				<updated>2010-05-18T13:25:49Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файлы:spawn_sections.ltx,devices.ltx,любой стандартный диалог.&lt;br /&gt;
Для того, чтобы замерить координаты можно воспользоватся аддончиком Position Informer. &lt;br /&gt;
&lt;br /&gt;
1.Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function ваше_название_функции()                   ;НАЗВАНИЕ ФУНКЦИИ&lt;br /&gt;
alife():create(section,position,levelvertex,gamevertex)   ;ЭТО ТОЧКА ГДЕ СПАВНИТСЯ ПРЕДМЕТ&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2.В папке config/scripts создаём файл m_taynik.ltx и пишем в него:&lt;br /&gt;
&amp;lt;pre&amp;gt;[spawn] ;Это то, что появится в тайнике &lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Открываем файл spawn_sections.ltx из папки gamedata/config/creatures и пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[m_taynik]:ваш_текст&lt;br /&gt;
visual = equipments\item_rukzak&lt;br /&gt;
radius = 1&lt;br /&gt;
custom_data = scripts\m_taynik.ltx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
4. Открываем файл devices.ltx и пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[ваш_текст]&lt;br /&gt;
GroupControlSection    = spawn_group&lt;br /&gt;
discovery_dependency =&lt;br /&gt;
$spawn                 = &amp;quot;devices\inventory box&amp;quot;&lt;br /&gt;
class                = O_INVBOX&lt;br /&gt;
cform                = skeleton&lt;br /&gt;
visual                = physics\box\expl_dinamit.ogf&lt;br /&gt;
script_binding      = bind_physic_object.init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Пихаем в любой диалог функцию спавна:&lt;br /&gt;
&lt;br /&gt;
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13&lt;br /&gt;
Пишем &amp;lt;action&amp;gt;ваше_название_скрипта.ваше_название_функции&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Автор:Zeka1996Korneev'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%82%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%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_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D1%82%D0%B0%D0%B9%D0%BD%D0%B8%D0%BA%D0%B0"/>
				<updated>2010-05-18T13:07:22Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файлы:spawn_sections.ltx,devices.ltx,любой стандартный диалог.&lt;br /&gt;
Для того, чтобы замерить координаты можно воспользоватся аддончиком Position Informer. &lt;br /&gt;
&lt;br /&gt;
1.Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function ваше_название_функции()                   ;НАЗВАНИЕ ФУНКЦИИ&lt;br /&gt;
alife():create(section,position,levelvertex,gamevertex)   ;ЭТО ТОЧКА ГДЕ СПАВНИТСЯ ПРЕДМЕТ&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2.В папке config/scripts создаём файл m_taynik.ltx и пишем в него:&lt;br /&gt;
&amp;lt;pre&amp;gt;[spawn] ;Это то, что появится в тайнике &lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&lt;br /&gt;
предмет&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Открываем файл spawn_sections.ltx из папки gamedata/config/creatures и пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[m_taynik]:ваш_текст&lt;br /&gt;
visual = equipments\item_rukzak&lt;br /&gt;
radius = 1&lt;br /&gt;
custom_data = scripts\m_taynik.ltx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
4. Открываем файл devices.ltx и пишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[ваш_текст]&lt;br /&gt;
GroupControlSection    = spawn_group&lt;br /&gt;
discovery_dependency =&lt;br /&gt;
$spawn                 = &amp;quot;devices\inventory box&amp;quot;&lt;br /&gt;
class                = O_INVBOX&lt;br /&gt;
cform                = skeleton&lt;br /&gt;
visual                = physics\box\expl_dinamit.ogf&lt;br /&gt;
script_binding      = bind_physic_object.init&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Пихаем в любой диалог функцию спавна:&lt;br /&gt;
&lt;br /&gt;
Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13&lt;br /&gt;
Пишем &amp;lt;action&amp;gt;ваше_название_скрипта.ваше_название_функции&amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Автор:Zeka1996Korneev'''&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-05-18T12:45:21Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: /* Редактор*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Технические админы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по функционалу и работе базы знаний.&lt;br /&gt;
&lt;br /&gt;
=== Neo][ ===&lt;br /&gt;
*[mailto:neo@stalkerin.gameru.net электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
== Главные редакторы ==&lt;br /&gt;
Отвечают на любые вопросы. Принимают пожелания, предложения по материалам, находящимся в базе знаний.&lt;br /&gt;
&lt;br /&gt;
=== [[Участник:HikeR|HikeR]] ===&lt;br /&gt;
*[mailto:hhrhhr@gmail.com электронная почта]&lt;br /&gt;
*ICQ: 58258575&lt;br /&gt;
&lt;br /&gt;
=== Loxotron ===&lt;br /&gt;
*[mailto:loxotron@bk.ru электронная почта]&lt;br /&gt;
*ICQ: *********&lt;br /&gt;
&lt;br /&gt;
=== StUnDeR ===&lt;br /&gt;
*mail: Stalkers-life@rambler.ru&lt;br /&gt;
*ICQ: 413633944&lt;br /&gt;
&lt;br /&gt;
== Редактор Oxygenium ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;br /&gt;
&lt;br /&gt;
== Новости STALKER Wiki ==&lt;br /&gt;
'''- январь 2008 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поддержка flash мувиков&lt;br /&gt;
&lt;br /&gt;
'''- июнь 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починена загрузка картинок&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- август 2009 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
поставлена recaptcha&lt;br /&gt;
&lt;br /&gt;
'''- февраль 2010 -'''&amp;lt;br/&amp;gt;&lt;br /&gt;
починено отображение картинок&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B</id>
		<title>Обсуждение S.T.A.L.K.E.R. Inside Wiki:Администраторы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_S.T.A.L.K.E.R._Inside_Wiki:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B"/>
				<updated>2010-05-18T12:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Oxygenium: Редактор&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Редактор ==&lt;br /&gt;
&lt;br /&gt;
e-mail: semyonpoltorak@yandex.ru&lt;br /&gt;
ICQ: 3906034 &lt;br /&gt;
Вопросы, только касательно Вики&lt;/div&gt;</summary>
		<author><name>Oxygenium</name></author>	</entry>

	</feed>