<?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=ColR+iT</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=ColR+iT"/>
		<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/ColR_iT"/>
		<updated>2026-04-29T15:07:30Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<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:SoC._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0</id>
		<title>Обсуждение:SoC. Добавляем проводника</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:SoC._%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0"/>
				<updated>2012-11-26T10:18:21Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Сделал все как надо , только сделал чтобы при диологе на другой локации , а гг появляеться за картой че делать ?&lt;br /&gt;
&lt;br /&gt;
Ничего не делать, т.к. предоставленный вариант не более чем просто текст и как способ перемещения между локациями он не подходит.&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8_%D1%83_%D0%93%D0%93</id>
		<title>SoC. Изменение имени у ГГ</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8_%D1%83_%D0%93%D0%93"/>
				<updated>2012-10-16T17:26:30Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: Поправил цензуру.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Чтобы изменить имя у главного героя надо'''&lt;br /&gt;
Файл stable_bio_name.xml(лежит gamedata\config\text\rus)&lt;br /&gt;
Итак открываем этот файл и ищем строчку&lt;br /&gt;
&amp;lt;xml&amp;gt;&amp;lt;string id=&amp;quot;actor_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;&amp;lt;/xml&amp;gt;&lt;br /&gt;
И меняете на любое имя.&lt;br /&gt;
Все. Помоиму проще этого только сменить в ТЧ количество патронов у калаша.&lt;br /&gt;
&lt;br /&gt;
Автор: Dragon.lord23&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1</id>
		<title>Настройка логики. Часть 1</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1"/>
				<updated>2012-07-12T11:02:28Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема kamp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font size=6&amp;gt;Настройки логики&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Система флагов (path_walk, path_look)=&lt;br /&gt;
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем &amp;quot;'''''wp00'''''&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wp00|flag1|flag2'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_walk''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a=state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при перемещении (Только из раздела &amp;quot;Ходячие состояния&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''p=percent'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути *'''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_look''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a =state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов &amp;quot;Стоячие&amp;quot; и &amp;quot;Сидячие&amp;quot; состояния)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''t=msec''' - время в миллисекундах, которое персонаж должен смотреть в заданную точку.&amp;lt;br&amp;gt;&lt;br /&gt;
:'''*''' – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
:Для конечных (терминальных) вершин пути '''''path_walk''''', у которых не более 1-й соответствующей точки '''path_look''', значение '''''t''''' всегда считается бесконечным и его явно задавать не нужно.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:После поворота в точку '''''path_look''''', установить сигнал с именем '''''name'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''syn'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком '''''syn''''' не прибудут все персонажи с данным '''''team'''''-ом ('''''team''''' задается в виде текстовой строки в '''''customdata'''''). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою '''''idle''''' анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sigtm=signal'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает сигнал при вызове '''''time_callback'''''-а '''''state manager'''''-ом. Соответственно, если '''''t=0''''', то сигнал будет установлен после отыгрывания '''''init''''' анимации. Это используется, например, с анимацией '''''press''''', которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.&amp;lt;br&amp;gt;&lt;br /&gt;
:В пути '''''path_look''''' можно сделать:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;wp00|a=press|t=0|sigtm=pressed&amp;lt;/ini&amp;gt;&lt;br /&gt;
:А затем переключить схему:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_signal = pressed | другая_схема&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Более подробное описание путей.==&lt;br /&gt;
&lt;br /&gt;
Настройка:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_1.JPG]]&lt;br /&gt;
&lt;br /&gt;
На карту для каждого walker-а нужно поставить:&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_walk''''', по которому '''''walker''''' ходит.&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_look''''', состоящий из точек, в которые '''''walker''''' смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Walker'''''-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если персонаж должен стоять на месте, то ему задается одна точка пути '''''path_walk''''' и как минимум одна точка пути '''''path_look''''', хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила расстановки флажков в путях рассмотрим на нескольких примерах:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 1:===&lt;br /&gt;
&lt;br /&gt;
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_2.JPG]]&lt;br /&gt;
&lt;br /&gt;
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути '''''path_walk''''' существуют флажки.&amp;lt;br&amp;gt;&lt;br /&gt;
У каждого вейпоинта есть имя: '''''wp00''''', '''''wp01''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘'''|'''’. Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=threat''''' то персонаж пойдет в состоянии данжер, если '''''a=raid''''' то побежит с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_walk''''' используются анимации '''ТОЛЬКО''' из раздела «Ходячие состояния»!&lt;br /&gt;
&lt;br /&gt;
===Пример 2:===&lt;br /&gt;
[[Изображение:Logic_3.JPG]]&lt;br /&gt;
&lt;br /&gt;
Разговор персонажа.&lt;br /&gt;
&lt;br /&gt;
Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существуют следующие поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s = имя_звуковой_схемы''''' - (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
===Пример 3:===&lt;br /&gt;
[[Изображение:Logic_4.JPG]]&lt;br /&gt;
&lt;br /&gt;
В примере 3 используется только поле '''''s''''', чтобы задать тему разговора, и флажок '''''sc''''', чтобы показать, что звук проигрывается не разово, а периодически.&amp;lt;br&amp;gt;&lt;br /&gt;
Остальные параметры ('''''sp''''', '''''sf''''', '''''st''''') задавать НЕ РЕКОМЕНДУЕТСЯ, значения по умолчанию приемлемы для большинства скриптов.&amp;lt;br&amp;gt;&lt;br /&gt;
Параметр '''''sa''''' также использовать НЕ РЕКОМЕНДУЕТСЯ. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути '''''path_look''''', о котором будет написано ниже.&amp;lt;br&amp;gt;&lt;br /&gt;
Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 4:=== &lt;br /&gt;
усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_5.JPG]]&lt;br /&gt;
&lt;br /&gt;
Что добавилось в этом примере? Путь '''''path_look''''' с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее, в точках путей '''''path_walk''''' и '''''path_look''''', которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки (в ''ACDC'' поле '''''flags'''''). Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь персонаж будет останавливаться в точках '''''path_walk''''', помеченных флажком, и смотреть в точку '''''path_look''''', помеченную тем же самым флажком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если точка '''''path_walk'''''  не помечена флажком, персонаж проходит ее не останавливаясь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одной точке '''''path_walk''''' может соответствовать несколько точек '''''path_look'''''. Тогда персонаж выберем случайно одну из подходящих точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По аналогии с '''''path_walk''''', в точках пути '''''path_look''''' можно использовать различные флажки, меняющие поведение:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''p = 100''''' – вероятность, с которой персонаж посмотрит именно в эту точку. Значения '''''p''''' всех подходящих точек суммируются, т.е. если у одной точки '''''p = 100''''', а у другой '''''p = 300''''', то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).&lt;br /&gt;
Во избежание путаницы, рекомендуется задавать '''''p''''' так, чтобы их сумма составляла '''100'''.&lt;br /&gt;
По умолчанию у всех точек '''''p = 100'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''t = 5000''''' - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 5:===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_6.JPG]]&lt;br /&gt;
&lt;br /&gt;
В этом примере проходя через точку '''''wp00''''', персонаж с вероятностью 30% посмотрит в точку '''''wp00''''' в течение 5 секунд, но с вероятностью 70% посмотрит в точку '''''wp01''''' в течении 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию при остановках персонаж играет анимацию '''''idle''''', если он не в состоянии '''''crouch''''', либо анимацию '''''hide''''', если он в состоянии '''''crouch'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если требуется другая анимация, можно ее указать с помощью флажка:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''a = имя_анимации''''' - (по умолчанию '''''idle'''''). &amp;lt;br&amp;gt;&lt;br /&gt;
Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет  с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»!&lt;br /&gt;
&lt;br /&gt;
==Система флагов для монстров==&lt;br /&gt;
Флаги пути движения:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s=имя_звуковой_темы'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает звуковую тему на пути в данную точку ('''''idle''''', '''''eat''''', '''''attack''''', '''''attack_hit''''', '''''take_damage''''', '''''die''''', '''''threaten''''', '''''steal''''', '''''panic''''', '''''growling''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''с'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы вприсядку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''r'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы бег.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sig=name'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b=vis/invis'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Флаг, исключительно для кровососа. Управляет невидимостью ('''''vis''''' - отключена, '''''invis''''' - включена).&lt;br /&gt;
&lt;br /&gt;
Флаги пути обзора:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''t=msec'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Время в миллисекундах, которое нужно ждать, смотря в точку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''a=state'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Анимация ('''''stand_idle''''', '''''sit_idle''''', '''''lie_idle''''', '''''eat''''', '''''sleep''''', '''''rest''''', '''''attack''''', '''''look_around''''', '''''turn''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Случайный выбор пути==&lt;br /&gt;
По поводу точек пути '''''path_walk'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:[[Файл:Random_path.jpg]]&lt;br /&gt;
&lt;br /&gt;
Нам требуется, чтобы НПС стоящий в точке '''''p0''''' патрулировал территорию по двум цикличным маршрутам:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p1 -&amp;gt; p2 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p3 -&amp;gt; p4 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
Чтобы задать вариацию выбора маршрута относительно точки '''''p0''''', нужно в ссылке на следующую точку пути указать не одну, а две точки:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек '''''p1''''' или '''''p3'''''. После возврата в точку '''''p0''''' выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;а в точке '''''p1''''', также задать выбор:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(1), p3(1)&amp;lt;/ini&amp;gt;&lt;br /&gt;
'''НО!'''&lt;br /&gt;
Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема '''НЕ ПРИЕМЛЕМА''' и, лично у меня, вызывает вылет:[[Файл:Error_random_path.jpg]]&lt;br /&gt;
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(0.75), p3(0.25)&amp;lt;/ini&amp;gt;то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще.&lt;br /&gt;
&lt;br /&gt;
=Схемы поведения сталкеров.=&lt;br /&gt;
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема walker==&lt;br /&gt;
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;'''''    - основной путь, по которому ходит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;'''''    - путь, куда смотрит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team      = &amp;lt;имя_команды&amp;gt;''''' - команда для синхронизации&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving1 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving2 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она не слишком далеко ('''''rush''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving3 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она далеко ('''''sprint''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_standing = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker@pri_followers_leader_wave1_wait]&lt;br /&gt;
path_walk = wave1_leader_walk2&lt;br /&gt;
path_look = wave1_leader_look2&lt;br /&gt;
def_state_moving1 = assault&lt;br /&gt;
def_state_moving2 = assault&lt;br /&gt;
team = followers&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема remark==&lt;br /&gt;
Схема используется для синхронизации\связки других схем.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.&lt;br /&gt;
&lt;br /&gt;
'''[remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук ремарка, берётся из файла ''sound_theme.script''. По умолчанию  '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимация ремарка, по умолчанию '''''wait'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - куда смотрит сталкер. Есть следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значение&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' – без комментариев&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' – позиция вычисленная АИ автоматически&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;имя работы&amp;gt;,&amp;lt;имя гулага&amp;gt;''''' - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = logic@cit_killers_base_guard, cit_killers&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;path_name&amp;gt;,&amp;lt;point_number&amp;gt;''''' - можно указывать смотреть в вершину патрульного пути (&amp;lt;имя пути&amp;gt;,&amp;lt;имя точки&amp;gt;).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = cit_killers_kamp5,0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': теперь если значение не задано, то оно равно '''''nil''''' а не '''''actor''''', как было раньше.&amp;lt;br&amp;gt;&lt;br /&gt;
:То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение '''''nil''''', то персонаж развернется в позицию, которую посчитает АИ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': &amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''sound_end''''' – по окончании проигрывания звуковой схемы&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''anim_end''''' – по окончании проигрывания анимации&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[remark@esc_lager_volk2]&lt;br /&gt;
anim = guard_rac&lt;br /&gt;
snd = esc_wolf_radio&lt;br /&gt;
target = actor&lt;br /&gt;
on_signal = sound_end| remark@esc_lager_volk3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sleeper==&lt;br /&gt;
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sleeper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_main = &amp;lt;имя_пути&amp;gt;''''' - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[sleeper@esc_blockpost_sleep1]&lt;br /&gt;
path_main = sleep1&lt;br /&gt;
wakeable = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_sleeper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема kamp==&lt;br /&gt;
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.&amp;lt;br&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
'''[kamp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''center_point = &amp;lt;имя_пути&amp;gt;''''' – имя точки вокруг которой NPC будет устраиваться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние, в котором NPC будет идети к точке кампа. По умолчанию - '''''walk'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит.&amp;lt;br&amp;gt;&lt;br /&gt;
:Чтобы этого не случалось в секции кемпа указывать '''''path_walk''''' из одной точке, название которой '''''&amp;lt;path_kamp_name&amp;gt;_task''''':&amp;lt;ini&amp;gt;path_walk = &amp;lt;имя_пути&amp;gt;_task&amp;lt;/ini&amp;gt;Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[kamp@esc_blockpost_kamp1]&lt;br /&gt;
center_point = kamp_center&lt;br /&gt;
path_walk = kamp_center_task&lt;br /&gt;
def_state_moving = raid&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_kamp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема camper==&lt;br /&gt;
Свойства камперов:&lt;br /&gt;
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;&amp;lt;br&amp;gt;&lt;br /&gt;
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[camper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания.&lt;br /&gt;
:Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите камперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию - '''''assault'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути.&lt;br /&gt;
:По умолчанию - '''''sneak_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию - '''''hide'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''attack_sound = &amp;lt;имя_звуковой_темы&amp;gt;''''' - возможность переопределять снайперам/камперам звук атаки. По дефолту он равен звуковой теме '''''fight_attack'''''.&lt;br /&gt;
:Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''shoot = &amp;lt;тип_стрельбы&amp;gt;''''' - возможны следующие значения:&lt;br /&gt;
:*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - не стреляет вообще;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),&amp;lt;br&amp;gt;&lt;br /&gt;
:то он тупо продолжает стоять на старом месте и ждать следующей пули.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кампера. Используйте '''''walker''''' в таких случаях, а камперов стоить ставить для атак по путям и как снайперов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@dar_military_scout_hide]&lt;br /&gt;
path_walk = walk_hide&lt;br /&gt;
path_look = look_hide&lt;br /&gt;
radius = 10&lt;br /&gt;
no_retreat = true&lt;br /&gt;
def_state_moving = assault&lt;br /&gt;
def_state_campering = hide_na&lt;br /&gt;
shoot = always&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sniper==&lt;br /&gt;
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В кастом дате кемпера прописать:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;sniper = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@esc_blockpost_camper_day]&lt;br /&gt;
path_walk = camper_day_walk&lt;br /&gt;
path_look = camper_day_look&lt;br /&gt;
sniper = true&lt;br /&gt;
def_state_campering = threat&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Ставить снайперу только 2 точки '''''look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема follower== &lt;br /&gt;
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Пути не задаются&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[follower]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''leader = &amp;lt;number&amp;gt;''''' - '''''story_id''''' лидера из ''game.ltx'' (число!).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation_line = true/false''''' - постарается идти сбоку от лидера, в противном случае будет идти сзади.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''distance = &amp;lt;number&amp;gt;''''' - расстояние в метрах, на котором будет идти от лидера '''''attendant'''''. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state_if_leader_in_meet = &amp;lt;название_анимации&amp;gt;''''' - это есть строка с именем  состояния из '''''state_manager''''', которое будет назначено '''''follower'''''-ам, если командир пребывает в состоянии '''''meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_walk = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер идет за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_run = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер бежит за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_sprint = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер спринтует за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Не забыть прописать:&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrains]&lt;br /&gt;
none = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Иначе NPC засосёт в гулаг и никуда он не пойдёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все это происходит под гулагом, то вместо '''''story_id''''' лидера, мы прописываем его секцию логики в файле скрипта.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;lua&amp;gt;t = { section = &amp;quot;logic@bar_arena_follower_2&amp;quot;, &lt;br /&gt;
      idle    = 0,&lt;br /&gt;
      prior   = 7,&lt;br /&gt;
      state   = {0},&lt;br /&gt;
      squad   = squad,&lt;br /&gt;
      group   = groups[0],&lt;br /&gt;
      ...&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;В данном случае для параметра '''''leader''''' необоходимо указать строку '''''bar_arena_follower_2'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': в релизе игры данная схема не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_attendant.script''&lt;br /&gt;
&lt;br /&gt;
==Схема zoneguard==&lt;br /&gt;
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[zoneguard]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team = &amp;lt;имя_команды&amp;gt;''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_guard = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой игрок будет атакован.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_warn = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой NPC будет начинать разговор с игроком.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''walker_team = &amp;lt;имя_команды&amp;gt;''''' -  для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_greet = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук которой будет проигран при обнаружении игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - какую отыгрывает анимацию, если игрок ему не враждебен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[zoneguard]&lt;br /&gt;
path_walk = mil_freedom_zoneguard_walk_kill2&lt;br /&gt;
path_look = mil_freedom_zoneguard_look_kill2&lt;br /&gt;
zone_warn = mil_freedom_leader_warn_zone&lt;br /&gt;
zone_guard = mil_freedom_leader_kill_zone&lt;br /&gt;
no_move = true&lt;br /&gt;
team = freedom_bodyguards3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_zoneguard.script''&lt;br /&gt;
&lt;br /&gt;
==Схема wounded==&lt;br /&gt;
Схема раненного. Определяет поведение NPC в состоянии &amp;quot;раненный&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.&lt;br /&gt;
&lt;br /&gt;
'''[wounded]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он не видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state_see = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''psy_state = &amp;lt;PSY&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному '''''PSY'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_victim = &amp;lt;HP&amp;gt;|&amp;lt;параметр&amp;gt;''''' - куда будет смотреть NPC при значении уровня его здоровья равному '''''HP''''', возможные параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - числовое значение;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&lt;br /&gt;
:*'''''nil''''' - позиция вычисленная АИ автоматически.&lt;br /&gt;
'''''hp_cover = &amp;lt;HP&amp;gt;|true/false''''' - идти в укрытие или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_fight = &amp;lt;HP&amp;gt;|true/false''''' - разрешено воевать или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''syndata = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - синхропары для красоты.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить диалог, вместо стандартного '''''actor_help_wounded'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_start_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;xml&amp;gt;&amp;lt;precondition&amp;gt;dialogs.allow_wounded_dialog&amp;lt;/precondition&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
'''''Примечание''''': если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно.&lt;br /&gt;
:Для параметров '''''hp_state_see''''', '''''psy_state''''', '''''hp_victim''''', '''''hp_cover''''', '''''hp_fight''''' способ такой же.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы &amp;lt;small&amp;gt;(в качестве примера взята дефолтная настройка)'''''&amp;lt;/small&amp;gt;:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&lt;br /&gt;
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy&lt;br /&gt;
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|psy_shoot,psy_pain@wounded_psy_shoot,wounded_psy&lt;br /&gt;
hp_victim = 30|actor|10|nil&lt;br /&gt;
hp_cover = 30|true|10|false&lt;br /&gt;
hp_fight = 30|true|10|false&lt;br /&gt;
syndata = wounded@help&lt;br /&gt;
;best_pistol – проверка на то, что лучшее оружие NPC является пистолетом.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_wounded.script''&lt;br /&gt;
&lt;br /&gt;
==Схема rest==&lt;br /&gt;
Чувак гуляет, хавает, спит.&amp;lt;br&amp;gt;&lt;br /&gt;
Нормально не работает, посему в релизе не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_rest.script''&lt;br /&gt;
&lt;br /&gt;
==Схема heli_hunter==&lt;br /&gt;
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:&amp;lt;br&amp;gt;&lt;br /&gt;
В активную схему вставляется параметр:&amp;lt;ini&amp;gt;heli_hunter = {+info -info =func !func ~number}true/false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;ini&amp;gt;[camper@bar_freedom_attack_sniper_1]&lt;br /&gt;
path_walk = camper_1_walk&lt;br /&gt;
path_look = camper_1_look&lt;br /&gt;
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 &amp;lt;br&amp;gt;%=bar_freedom_angry_actor%&lt;br /&gt;
meet_talk_enabled = true&lt;br /&gt;
meet_dialog = bar_svoboda_dialog&lt;br /&gt;
heli_hunter = {-bar_ecolog_crush_heli_down} true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема patrol==&lt;br /&gt;
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[patrol]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt; &lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation = &amp;lt;параметр&amp;gt;''''' - описывет способ построения и не является обязательным. Возможны следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''back''''' - мужики идут чуть позади командира в два ряда (по умолчанию);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''line''''' - шеренга;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''around''''' - вокруг командира.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''commander = true/false''''' - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. '''''false''''' - по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''move_type = &amp;lt;название_анимации&amp;gt;''''' - задает изначальный режим перемещения, по умолчанию '''''patrol'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При остановке командора в '''''meet''''' мужики останавливаются.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;ret=0...2&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*0 - линия;&lt;br /&gt;
:*1 – вокруг старшего;&lt;br /&gt;
:*2 – по бокам.&lt;br /&gt;
&lt;br /&gt;
При движении командор работает как обычный '''''walker''''' и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано '''''a=assault''''', то командор помчится с орудием убийства на перевес, а остальные его откопируют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': что еще не сделано или глючит:&amp;lt;br&amp;gt;&lt;br /&gt;
:*нет возможности автоматически перестроить команду;&lt;br /&gt;
:*все идут молча;&lt;br /&gt;
:*командор пока не отдает команд;&lt;br /&gt;
:*не рекомендуется включать спринт.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[patrol@val_escort_captive_wait]&lt;br /&gt;
path_walk           = captive_wait_walk&lt;br /&gt;
path_look           = captive_wait_look&lt;br /&gt;
commander           = true&lt;br /&gt;
formation           = back&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_patrol.script''&lt;br /&gt;
&lt;br /&gt;
==Схема meet==&lt;br /&gt;
Схема позволяющая настроить ситуацию, когда НПС встречает актора.&lt;br /&gt;
&lt;br /&gt;
'''[meet]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_state/meet_state_wpn = &amp;lt;number&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' – задает анимацию и озвучку персонажа,&lt;br /&gt;
:в зависимости от расстояния до актера равному '''''number'''''. Для ситуации, когда актор безоружен и вооружён соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''victim/victim_wpn = &amp;lt;number&amp;gt;|&amp;lt;параметр&amp;gt;''''' - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное '''''number'''''.&lt;br /&gt;
:Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''actor''''' - смотреть на игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''story_id''''' - смотреть на персонажа со указанным '''''story_id''''';&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''nil''''' - никуда.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''use/use_wpn = true/false/self''''' - настройки юзабельности персонажа.&lt;br /&gt;
:При установки значения '''''self''''' NPC сам юзнет игрока, как только сможет дотянуться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - если актор будет замечен в указанном рестрикторе,&lt;br /&gt;
:то NPC будет отыгрывать заданную анимацию и произносить заданный звук.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''synpairs = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - Если при каком-то наборе условий&lt;br /&gt;
:встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''abuse = true/false''''' - по умолчанию '''''true''''', если '''''false''''', то неюзающийся противник не будет обижаться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''precond = usability/visibility'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любую строку можно задавать кондлистом ('''''{+info -info =func !func ~number}''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker]&lt;br /&gt;
meet = default_meet&amp;lt;/ini&amp;gt;Саму секцию '''''default_meet''''' задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[default_meet]&lt;br /&gt;
meet_state = 30|hello@hail|20|wait@wait&lt;br /&gt;
mmet_state_wpn = 30|backoff@threat_weap&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = false&lt;br /&gt;
syndata = hello@hail|backoff@threat_weap&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему '''''meet = no_meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 1'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait&lt;br /&gt;
meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap&lt;br /&gt;
victim = 50| actor&lt;br /&gt;
victim_wpn = 50| actor&lt;br /&gt;
use = true&amp;lt;&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 2'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info%&lt;br /&gt;
meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait&lt;br /&gt;
victim = 50|actor&lt;br /&gt;
victim_wpn = 50|actor&lt;br /&gt;
use = {-info2} self, false&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info2''''' – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''killactor''''' – функция в ''xr_effects.script'' которая обижает NPC на игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 3'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper]&lt;br /&gt;
path_walk = path_walk&lt;br /&gt;
path_look = path_look&lt;br /&gt;
meet = meet&lt;br /&gt;
&lt;br /&gt;
[meet]&lt;br /&gt;
meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = true&lt;br /&gt;
zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse&lt;br /&gt;
meet_dialog = {+info} dialog1, dialog2&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''true''''' – вместо анимации, атаковать игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая говорит, что мы имеем допуск к лагерю;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''warnzone''''' – рестриктор, в котором нас предупреждают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''kampzone''''' – рестриктор, в котором нас убивают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog1''''' – стартовый диалог NPC, если мы имеем допуск в лагерь;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog2''''' – стартовый диалог NPC, если мы не имеем допуск в лагерь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 2]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</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>2012-06-30T08:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что,как,зачем ==&lt;br /&gt;
Итак, я хочу рассказать вам как создать NPC через all.spawn.&lt;br /&gt;
Метод был выявлен мною путем проб и ошибок.&lt;br /&gt;
Конечно же у вас появился вопрос: « Ну а зачем же мучатся с all.spawn, если можно сделать тоже самое через скрипт?».&lt;br /&gt;
Ответ:&lt;br /&gt;
Хоть этот способ и не такой быстрый и легкий, но у него есть свои плюсы, необходимые многим, один из них - мы можем задать story id нашему NPC.(Можно прописать в секции нпс которого спауните в низу в файле spawn_sections.ltx Пример:story_id = 10000)&lt;br /&gt;
&amp;quot;А что дает нам это?&amp;quot;&lt;br /&gt;
Много чего, ну для примера - мы сможем поставить отметку на него.&lt;br /&gt;
Я не буду объяснять такие простые вещи как декомпиляция all.spawn и остальное, но если же вы все таки не знаете как, пишите мне в лс на Гейменаторе(stalkers-life, или Идиот)&lt;br /&gt;
Итак, хватит лишних слов, перейдем к работе...&lt;br /&gt;
&lt;br /&gt;
== Работаем!!! ==&lt;br /&gt;
&lt;br /&gt;
С помощью ACDC декомпилируем all.spawn&lt;br /&gt;
&lt;br /&gt;
Получаем кучу файлов типа : alife_l01_escape , way_l01_escape и тд.&lt;br /&gt;
&lt;br /&gt;
Создадим нового непися на Кордоне.&lt;br /&gt;
Открываем alife_l01_escape, и крутим в самый низ.&lt;br /&gt;
&lt;br /&gt;
Если у вас чистая игра и вы ничего не делали в Олл спавне то посленяя секция у вас будет под номером 869.&lt;br /&gt;
Добавляем туда вот такой код(в конец):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[870]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = stalker&lt;br /&gt;
name = noobik&lt;br /&gt;
position = -172.21215820313,-19.941787719727,-161.09272766113&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_trader_abstract properties&lt;br /&gt;
money = 5000&lt;br /&gt;
character_profile = esc_noobik&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 52&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 76655&lt;br /&gt;
object_flags = 0xffffffbf&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx&lt;br /&gt;
&lt;br /&gt;
; cse&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
none = true&lt;br /&gt;
END&lt;br /&gt;
story_id = 10000&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = actors\soldier\soldier_beret_1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_creature_abstract properties&lt;br /&gt;
g_team = 0&lt;br /&gt;
g_squad = 1&lt;br /&gt;
g_group = 2&lt;br /&gt;
health = 1&lt;br /&gt;
dynamic_out_restrictions =&lt;br /&gt;
dynamic_in_restrictions =&lt;br /&gt;
&lt;br /&gt;
upd:health = 1&lt;br /&gt;
upd:timestamp = 0&lt;br /&gt;
upd:creature_flags = 0&lt;br /&gt;
upd:position = -172.21215820313,-19.941787719727,-161.09272766113&lt;br /&gt;
upd:o_model = 0&lt;br /&gt;
upd:o_torso = 0.028013030067086,0,0.9996075630188&lt;br /&gt;
upd:g_team = 0&lt;br /&gt;
upd:g_squad = 1&lt;br /&gt;
upd:g_group = 2&lt;br /&gt;
&lt;br /&gt;
; cse_alife_monster_abstract properties&lt;br /&gt;
&lt;br /&gt;
upd:next_game_vertex_id = 65535&lt;br /&gt;
upd:prev_game_vertex_id = 65535&lt;br /&gt;
upd:distance_from_point = 0&lt;br /&gt;
upd:distance_to_point = 0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_human_abstract properties&lt;br /&gt;
predicate5 = 1,2,2,1,2&lt;br /&gt;
predicate4 = 0,1,1,1&lt;br /&gt;
&lt;br /&gt;
; cse_ph_skeleton properties&lt;br /&gt;
&lt;br /&gt;
upd:start_dialog =&lt;br /&gt;
&lt;br /&gt;
; se_stalker properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разъясню некоторые пункты, чтобы в след. раз не пришлось прибегать к тутору.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
section_name = stalker -//это для игры тут пишется к примеру если ето у тебя сталкера или бандюки то должно быть section_name = stalker&lt;br /&gt;
name = noobik -//пишем что хотим&lt;br /&gt;
position = -172.21215820313,-19.941787719727,-161.09272766113 -//позиция&lt;br /&gt;
direction = 0,0,0 -// направление взгляда(можно писать всегда нули)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse_alife_trader_abstract properties&lt;br /&gt;
money = 5000 -//его бабло&lt;br /&gt;
character_profile = esc_noobik -//ссылка на профиль в character_desc_локация(раз создаем в алайф эскейп значит и профиль будет искатсья в чарактер_деск_ескейп)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = 52 -// гейм вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = 76655 -//левел вертекс&lt;br /&gt;
object_flags = 0xffffffbf&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx -// ссылка на логику&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; cse[smart_terrains]&lt;br /&gt;
none = true&lt;br /&gt;
END&lt;br /&gt;
story_id = 10000 -//его стори айди&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = actors\soldier\soldier_beret_1 -// его визуал&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upd:health = 1&lt;br /&gt;
upd:timestamp = 0&lt;br /&gt;
upd:creature_flags = 0&lt;br /&gt;
upd:position = -172.21215820313,-19.941787719727,-161.09272766113 -//опять пишем позицию&lt;br /&gt;
upd:o_model = 0&lt;br /&gt;
upd:o_torso = 0.028013030067086,0,0.9996075630188&lt;br /&gt;
upd:g_team = 0&lt;br /&gt;
upd:g_squad = 1&lt;br /&gt;
upd:g_group = 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
upd:next_game_vertex_id = 65535-//честно не знаю что это, я всегда пишу эти цифры&lt;br /&gt;
upd:prev_game_vertex_id = 65535-//не знаю, но пишем всегда это&lt;br /&gt;
upd:distance_from_point = 0&lt;br /&gt;
upd:distance_to_point = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компилируем, получаем файл all.spawn.new , копируем его в геймдату/спавнс и переименовываем просто в олл спавн.&lt;br /&gt;
Это еще не все!&lt;br /&gt;
&lt;br /&gt;
теперь&lt;br /&gt;
&lt;br /&gt;
открываем файл character_desc_escape&lt;br /&gt;
&lt;br /&gt;
перед профилем волка вставляем это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;!---------------------------------------esc_noobik-----------------------------------------------------&amp;gt;&lt;br /&gt;
&amp;lt;specific_character id=&amp;quot;esc_noobik&amp;quot; team_default = &amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;name&amp;gt;Нубик&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;lt;icon&amp;gt;ui_npc_u_stalker_neytral_balon_1&amp;lt;/icon&amp;gt;&lt;br /&gt;
&amp;lt;bio&amp;gt;esc_noobik&amp;lt;/bio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class&amp;gt;esc_noobik&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;community&amp;gt;stalker&amp;lt;/community&amp;gt; &amp;lt;terrain_sect&amp;gt;stalker_terrain&amp;lt;/terrain_sect&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rank&amp;gt;434&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;lt;reputation&amp;gt;5&amp;lt;/reputation&amp;gt;&lt;br /&gt;
&amp;lt;money min=&amp;quot;600&amp;quot; max=&amp;quot;2000&amp;quot; infinitive=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;snd_config&amp;gt;characters_voice\human_01\stalker\&amp;lt;/snd_config&amp;gt;&lt;br /&gt;
&amp;lt;crouch_type&amp;gt;-1&amp;lt;/crouch_type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;visual&amp;gt;actors\soldier\soldier_beret_1&amp;lt;/visual&amp;gt;&lt;br /&gt;
&amp;lt;supplies&amp;gt;&lt;br /&gt;
[spawn] \n&lt;br /&gt;
wpn_pm \n&lt;br /&gt;
ammo_9x18_fmj = 1 \n&lt;br /&gt;
wpn_ak74u \n&lt;br /&gt;
ammo_5.45x39_fmj \n&lt;br /&gt;
&amp;lt;/supplies&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;gameplay\character_criticals_4.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
у нас будет чел с визуалом военного, иконкой волка, и голосом обычного сталкера&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
теперь создаем файл логики,&lt;br /&gt;
в папке config/scripts создаем файл noobik_logic.ltx&lt;br /&gt;
и пишем туды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = remark1&lt;br /&gt;
danger = danger_ignore&lt;br /&gt;
&lt;br /&gt;
[danger_ignore]&lt;br /&gt;
ignore_distance = 5&lt;br /&gt;
&lt;br /&gt;
[remark1]&lt;br /&gt;
no_move = true&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
все, он никуда не уйдет пока на него не нападут = )&lt;br /&gt;
&lt;br /&gt;
Теперь открываем файл game_story_ids&lt;br /&gt;
&lt;br /&gt;
и в самый низ вписываем:&lt;br /&gt;
10000 = &amp;quot;esc_noobik&amp;quot;&lt;br /&gt;
&lt;br /&gt;
теперь открываем файл npc_profile&lt;br /&gt;
вставляем сие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;character id=&amp;quot;esc_noobik&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;esc_noobik&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;specific_character&amp;gt;esc_noobik&amp;lt;/specific_character&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, мы на финишной прямой!&lt;br /&gt;
Открываем файл spawn_sections&lt;br /&gt;
&lt;br /&gt;
и в писываем:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[esc_noobik]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_noobik&amp;quot;&lt;br /&gt;
character_profile = esc_noobik&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = stalker&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все, все готово!&lt;br /&gt;
Начинаем новую игру, и видем сталкера с именем Нубик = )&lt;br /&gt;
&lt;br /&gt;
Можно сделать и так но НПС уйдет. Проще делать с логикой вместе.&lt;br /&gt;
Заместо:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
cfg = scripts\noobik_logic.ltx&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Лутчше написать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = remark&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
danger = danger_condition&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = wait&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[danger_condition]&lt;br /&gt;
ignore_distance = 0&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И тогда НПС будет стоять на месте. =)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&amp;lt;# И стоять НПС при такой логике будет до поры до времени, теперь ясно где все новички учатся изначально делать не правильно...&amp;lt;br&amp;gt;&lt;br /&gt;
Схема '''''remark''''' не предназначена выступать в роли активной схемы, она была создана для мягкого перехода между основными схемами, например '''''kamp''''' и '''''walker'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игнорирование этого момента приводит к нежелательным эффектам, как следствие возникают необоснованные обвинения в адрес X-Ray.&lt;br /&gt;
Если же всё равно делаете через ''all.spawn'', то почему бы не прописать НПС нормальную логику, при которой он действительно будет стоять на месте и даже, если в последующем его что-то отвлечёт, то он вернётся на место, а не останется стоят там, куда перебежал.&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@stay_at_position&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
danger = danger_condition&lt;br /&gt;
&lt;br /&gt;
[walker@stay_at_position]&lt;br /&gt;
path_walk = walker_stay_at_position_walk&lt;br /&gt;
path_look = walker_stay_at_position_look&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
&lt;br /&gt;
[danger_condition]&lt;br /&gt;
ignore_distance = 0&lt;br /&gt;
ignore_distance_corpse = 0&amp;lt;/ini&amp;gt;И в файл ''way_имя_локации.ltx'' вписать две точки:&amp;lt;ini&amp;gt;[walker_stay_at_position_walk]&lt;br /&gt;
points = p0&lt;br /&gt;
p0:name = name00&lt;br /&gt;
p0:flags = 0x1&lt;br /&gt;
p0:position = ;координаты на которых стоим&lt;br /&gt;
p0:game_vertex_id = ;гейм вертекс координат&lt;br /&gt;
p0:level_vertex_id = ;левел вертеск координат&lt;br /&gt;
&lt;br /&gt;
[walker_stay_at_position_look]&lt;br /&gt;
points = p0&lt;br /&gt;
p0:name = name00&lt;br /&gt;
p0:flags = 0x1&lt;br /&gt;
p0:position = ;координаты в которые смотрим&lt;br /&gt;
p0:game_vertex_id = ;гейм вертекс координат&lt;br /&gt;
p0:level_vertex_id = ;левел вертеск координат&amp;lt;/ini&amp;gt;&lt;br /&gt;
И никаких проблем с поведением НПС --#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Статью создал stalker-life'''&lt;br /&gt;
С поправками '''Melnik'''&lt;br /&gt;
Подкоректировал: '''Spaces'''&lt;br /&gt;
Замечание касательно логики: '''ColR_iT'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:Конфигурационные файлы]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-19T09:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема ph_door */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_idle==&lt;br /&gt;
Схема по сути ничего не делает, представляет некое промежуточное состояние объекта. Аналог схемы '''''sr_idle''''', только для физического объекта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если объект получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с объектом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''nonscript_usable = true/false''''' - возможность стандартных (нескриптовых) действий над объектом: взять объект в интерфейс, открыть инвентарь.&lt;br /&gt;
:В игре используется в одном случае - для объектов с именем секции '''''inventory_box''''', то беж тайников.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
hit_on_bone = 1|%+agroprom_u_light_4%|2|%+agroprom_u_light_4%|3|%+agroprom_u_light_4%|4|%+agroprom_u_light_4%&lt;br /&gt;
on_info = {+agroprom_u_light_4} nil %=turn_off_object%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_idle.script''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', транспорт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==Smart Terrein==&lt;br /&gt;
Под смарттеррейном понимается зона, зайдя в которую, сталкер попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. Если установлены условия выполнения работы, то при не выполнении этих условий он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
#Поставить '''''smart_terrain''''' с необходимым '''''shape'''''. Размер шейпа влияет только на производительность, поэтому его задаём как можно меньше;&amp;lt;br&amp;gt;&lt;br /&gt;
#В его '''''custom_data''''' прописать настройки;&amp;lt;br&amp;gt;&lt;br /&gt;
#Расставить пути для соответствующих схем поведения.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры '''''custom_data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''[smart_terrain]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;имя_гулага&amp;gt;''''' - тип гулага, как правило это его имя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''capacity = &amp;lt;number&amp;gt;''''' - максимальная вместимость в людях.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''offline = true/false''''' - может ли гулаг образоваться в оффлайне. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''squad = &amp;lt;squad&amp;gt;''''' - сквад, который будет проставлен всем сталкерам под гулагом (№ уровня).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''groups = &amp;lt;groups&amp;gt;''''' - набор '''''group''''' через запятые.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stay = min, max''''' - время пребывания NPC под '''''smart_terrain''''' (по умлочанию – навсегда).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = min, max''''' - время бездействия '''''smart_terrain''''' после ухода последнего NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - список условий, которые необходимы для создания гулага.&lt;br /&gt;
:Если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в '''''custom_data''''' логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан '''''squad''''' или '''''groups''''', то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T14:21:28Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.11.1. Смарттеррейн. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', транспорт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==Smart Terrein==&lt;br /&gt;
Под смарттеррейном понимается зона, зайдя в которую, сталкер попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. Если установлены условия выполнения работы, то при не выполнении этих условий он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
#Поставить '''''smart_terrain''''' с необходимым '''''shape'''''. Размер шейпа влияет только на производительность, поэтому его задаём как можно меньше;&amp;lt;br&amp;gt;&lt;br /&gt;
#В его '''''custom_data''''' прописать настройки;&amp;lt;br&amp;gt;&lt;br /&gt;
#Расставить пути для соответствующих схем поведения.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры '''''custom_data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''[smart_terrain]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;имя_гулага&amp;gt;''''' - тип гулага, как правило это его имя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''capacity = &amp;lt;number&amp;gt;''''' - максимальная вместимость в людях.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''offline = true/false''''' - может ли гулаг образоваться в оффлайне. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''squad = &amp;lt;squad&amp;gt;''''' - сквад, который будет проставлен всем сталкерам под гулагом (№ уровня).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''groups = &amp;lt;groups&amp;gt;''''' - набор '''''group''''' через запятые.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stay = min, max''''' - время пребывания NPC под '''''smart_terrain''''' (по умлочанию – навсегда).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = min, max''''' - время бездействия '''''smart_terrain''''' после ухода последнего NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - список условий, которые необходимы для создания гулага.&lt;br /&gt;
:Если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в '''''custom_data''''' логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан '''''squad''''' или '''''groups''''', то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T13:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема ph_car */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта, а именно БТР.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', транспорт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T13:50:21Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.12.2. Универсальная боевая схема: heli_combat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T13:50:01Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.12.1. Схема heli_move: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T13:49:41Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.12. Логика вертолёта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T13:49:12Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Принцип работы прожектора: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
*На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
*Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
*Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
*У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
*Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Схема heli_move===&lt;br /&gt;
&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&amp;lt;br&amp;gt;&lt;br /&gt;
Для схемы должен быть задан '''''path_move''''' – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно (но не обязательно) задать '''''path_look''''' – путь, в вершины которого вертолет может смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от '''''ai-nodes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в вершине пути '''''path_move''''' задан набор флажков, то вертолёт будет смотреть в любую из вершин '''''path_look''''', в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[heli_move]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_move = &amp;lt;имя_пути&amp;gt;''''' - путь полёта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые будет смотреть вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''engine_sound = true/false''''' - вкл/выкл звук двигателя вертолёта. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - неуязвимость. Если '''''true''''', вертолёт игнорирует все хиты. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''immortal = true/false''''' - бессмертие. Если '''''true''''', вертолёт получает повреждения, но не умирает. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute = true/false''''' -  отключает универсальные реплики пилотов вертолета. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rocket_delay = &amp;lt;number&amp;gt;''''' - задержка, в миллисекундах, между пусками ракет. По умолчанию берется из ltx (сейчас 1250 мсек).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''default_velocity = &amp;lt;number&amp;gt;''''' - скорость, в метрах в секунду, с которой летает вертолет, если не заданы другие параметры.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути '''''path_move''''':&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' – (сокр. от ''enemy'') задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из '''''path_look''''', которая соответствует данной вершине. Если задано '''''e=actor''''' (можно сокращённо '''''e=a'''''), то огонь будет вестись по актору. Если задано '''''e=число''''', стрелять будет по объекту со '''''story_id''''' равным числу.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – (сокр. от ''weapon'') каким оружием стрелять.&amp;lt;br&amp;gt;&lt;br /&gt;
::Возможные значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=1''''' – стрелять только пулемётом;&amp;lt;br&amp;gt;&lt;br /&gt;
:::*'''''w=2''''' – стрелять только ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
::По умолчанию стреляет всем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''v''''' - (сокр. от ''velocity'') задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла ''helicopter.ltx''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''dv''''' - (сокр. от ''destination velocity'') задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''flame''''' - начать дымить (как будто подбили).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''e''''' - работает так же как и в '''''path_move'''''. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути '''''path_move''''', которая соответствует данной вершине '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''w''''' – см. такой же параметр для пути '''''path_move'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''t''''' - (сокр. от ''time'') длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_move.script''&lt;br /&gt;
&lt;br /&gt;
===Универсальная боевая схема: heli_combat===&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в '''''custom data'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = true/false''''' - '''''true''''' означает игнорирование получения хита. Т.е. вертолёт не будет пытаться &amp;quot;отомстить&amp;quot; тому, от кого он получил хит.&lt;br /&gt;
'''''combat_enemy = &amp;lt;параметр&amp;gt;''''' - враг. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' - враг отсутствует;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_rocket = true/false''''' - можно ли вертолёту пользоваться ракетами.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_use_mgun = true/false''''' - можно ли вертолёту пользоваться пулемётом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_velocity = &amp;lt;number&amp;gt;''''' - скорость, с которой вертолет будет делать боевые заходы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_safe_altitude = &amp;lt;number&amp;gt;''''' - высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема '''''xr_hit'''''. Работает как у сталкеров. В ''xr_effects.script'' есть группа функций для работы с вертолётом из его '''''custom data''''':&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_set_enemy_actor''''' - сделать актёра врагом вертолёту;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_start_flame''''' - поджечь вертолёт;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''heli_die''''' - убить вертолёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\heli_combat.script''&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T12:02:27Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.3. Схема работы прожектора: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T12:01:31Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.11. Ph_oscillate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_oscillate==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_oscillate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''joint = &amp;lt;имя_кости&amp;gt;''''' - имя кости объекта к которой будет применена сила.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''period = &amp;lt;number&amp;gt;''''' - время прикладывания силы в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - собственно сила прикладывания в ньютонах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''correct_angle = &amp;lt;number&amp;gt;''''' - угол относительно оси Y.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным нарастанием. То есть в течении заданного периода времени сила вырастет с 0 до заявленного значения. После этого настает пауза (сила не применяется) на время '''''period/2'''''. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_oscillate&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&lt;br /&gt;
joint = bone05&lt;br /&gt;
period = 3000&lt;br /&gt;
force = 500&lt;br /&gt;
correct_angle = 5&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_oscillate.script''&lt;br /&gt;
&lt;br /&gt;
==Секция ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
'''[ph_heavy]'''.&lt;br /&gt;
&lt;br /&gt;
==Принцип работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках '''''look''''' пути, в которые смотрит прожекторщик, нужно прописать:&lt;br /&gt;
'''''sl=&amp;lt;имя_прожектора&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;wp00|sl=esc_sl1&amp;lt;/ini&amp;gt;&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T10:49:07Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.10. Ph_heavy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T10:39:34Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.9. Ph_car */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка управления наземным транспортом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_car]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''usable = {+info -info =func !func ~number}''''' - условия для юзабелености объекта. &lt;br /&gt;
'''''show_tips = true/false''''' - отображать ли подсказку. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_use = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' выполнились.&lt;br /&gt;
:По умолчанию - '''''tip_car_use'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_locked = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка, в случае, если условия для '''''usable''''' не выполнились. По умолчанию - '''''tip_car_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае, если параметр '''''usable''''' не установлен, то возможна настройка самостоятельного поведения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь движения транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_fire = &amp;lt;имя_пути&amp;gt;''''' - вероятно, точки пути по которым возможна стрельба.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''auto_fire = true/false''''' - разрешить стрелять на ходу. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_time = &amp;lt;number&amp;gt;''''' - время непрерывной стрельбы в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_rep = inf/&amp;lt;number&amp;gt;''''' - вероятно, время через которое возможна повторная стрельба. '''''inf = -1'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''fire_range = &amp;lt;number&amp;gt;''''' - сектор стрельбы. По умолчанию - 50 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - цель для стрельбы. Возможны следующие параметры:&lt;br /&gt;
:*'''''points''''' - стрелять в первую точку патрульного пути. Если путь не указан - вылет. Стоит по умолчанию;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - персонаж с указанным '''''story_id'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''track_target = true/false''''' - Некое подобие предупредительной стрельбы, не по цели, а чуть выше. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_vis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель будет в прямой видимости.&lt;br /&gt;
:В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_target_nvis = &amp;lt;параметр&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт, если цель пропадёт из&lt;br /&gt;
:области прямой видимости. В качестве параметра возможны два значения: '''''actor''''', '''''story_id''''' персонажа.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''invulnerable = true/false''''' - вкл./выкл. звук двигателя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''headlights = on/off''''' - вкл./выкл. свет от фар.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death_info = {+info -info =func !func ~number} %+info -info =func%''''' - что произойдёт при уничтожении транспорта.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''arrived'''''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_car@fire&lt;br /&gt;
&lt;br /&gt;
[ph_car@fire]&lt;br /&gt;
path_walk = pri_wave3_btr_walk&lt;br /&gt;
path_fire = pri_wave3_btr_look&lt;br /&gt;
fire_repeat = inf&lt;br /&gt;
auto_fire = true&lt;br /&gt;
on_target_vis = actor | ph_car@fight_actor2&lt;br /&gt;
on_death_info = pri_wave3_btr_dead&lt;br /&gt;
on_signal = arrived | ph_car@hunt_actor %+pri_wave3_btr_arrived%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_car.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T09:26:18Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.8. Ph_on_death */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_on_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты при разрушении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': использовать исключительно с разрушаемыми физическими объектами ('''''physic_destroyable_object''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_on_death&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&lt;br /&gt;
on_info = %=inc_counter(mon_destroy_generator) =x18_gluk%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_death.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T09:20:53Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.7. Ph_force */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_force==&lt;br /&gt;
&lt;br /&gt;
Схема позволяет пнуть предмет в указанную сторону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_force]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''force = &amp;lt;number&amp;gt;''''' - сила, которая прикладывается к объекту. Измеряется в убитых енотах.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время прикладывания силы к предмету (в миллисекундах).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка (в секундах) перед применением силы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point_index = &amp;lt;number&amp;gt;''''' - индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_idle&lt;br /&gt;
&lt;br /&gt;
[ph_idle]&lt;br /&gt;
on_info = {+rad_here_i_come} ph_force &lt;br /&gt;
&lt;br /&gt;
[ph_force]&lt;br /&gt;
force = 1500&lt;br /&gt;
time = 500&lt;br /&gt;
delay = 0&lt;br /&gt;
point = rad_barrel_drop&lt;br /&gt;
point_index = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_appforce.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T09:09:00Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.6. Ph_sound */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script'' из таблицы '''''ph_snd_themes'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - зацикленное воспроизведение звука. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_idle = &amp;lt;number&amp;gt;''''' - минимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_idle = &amp;lt;number&amp;gt;''''' - максимальное время простоя перед включением звука (мс). По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''random = true/false''''' - если '''''true''''', то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения. По умолчанию - '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_hit = true/false''''' - будет ли схема реагировать на нанесённый хит. По умолчанию - '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если задать '''''random = true''''' и '''''looped = true''''', то схема сыпется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Данная схема работает, мягко говоря, через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в '''''nil'''''. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим '''''on_signal = sound_end| nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В ''sound_theme.script'' в начале файла есть секция '''''ph_themes''''', в которой и описываются темы для физ объектов.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;lua&amp;gt;ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;] = {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) '''''ph_sound''''' можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор '''''bun_space_restrictor_sound1''''' на который как раз и повешан '''''ph_sound'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_sound&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&lt;br /&gt;
snd = gar_bandits_seryi&lt;br /&gt;
min_idle = 1000&lt;br /&gt;
max_idle = 5000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_sound.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T08:30:39Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.5. Ph_gate: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_gate==&lt;br /&gt;
&lt;br /&gt;
То же самое, что и '''''ph_door''''', но для ворот, состоящих из двух дверей:&lt;br /&gt;
&lt;br /&gt;
'''[ph_gate]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state - &amp;lt;параметр&amp;gt;''''' - состояние, в котором дверь находится при инициализации (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''open''''' - в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''closed''''' - в закрытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - в текущем (дефолтном или оставшемся от предыдущей схемы).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locking - &amp;lt;параметр&amp;gt;''''' - блокировка дверей (по умолчанию '''''none'''''). Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''stick''''' - прилипание дверей к крайним состояниям.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''soft''''' - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - не используется (мягкая блокировка возможна только в крайних положениях);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''hard''''' - блокировка двери с помощью границ. Ворота можно только сломать. Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''open''''' - блокировать в открытом состоянии;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''closed''''' - в закрытом;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''none''''' - в текущем.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - дверь не заблокирована&amp;lt;br&amp;gt;&lt;br /&gt;
'''''left_limit/right_limit = &amp;lt;number&amp;gt;''''' - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''breakable = true/false''''' -  определяет можно ли сломать ворота. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Звуковые параметры аналогичны ph_door'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_gate@locked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@locked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = hard&lt;br /&gt;
on_info = {+val_chase_start} ph_gate@unlocked&lt;br /&gt;
&lt;br /&gt;
[ph_gate@unlocked]&lt;br /&gt;
state = closed&lt;br /&gt;
locking = stick&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_gate.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-15T08:12:50Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.4. Кодовые замки: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_code==&lt;br /&gt;
Схема для осуществления ввода цифрового пароля.&lt;br /&gt;
При введении указанного кода выдает инфопоршн.&lt;br /&gt;
&lt;br /&gt;
'''[ph_code]'''&lt;br /&gt;
'''''code = &amp;lt;код&amp;gt;''''' - установка кода.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_code = {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе правильного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_check_code = &amp;lt;код&amp;gt; | {+info -info =func !func ~number}%+info -info =func%''''' - что произойдёт при вводе установленного пароля.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tips = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code&lt;br /&gt;
&lt;br /&gt;
[ph_code]&lt;br /&gt;
code = 1287975&lt;br /&gt;
on_code = nil %+rad_code_door_unlocked%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_code@lock&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&lt;br /&gt;
on_check_code1 = 2011533 | %+bun_codelock_open%&lt;br /&gt;
on_check_code2 = 342089 | %+bun_codelock_open%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_code.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</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:%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0</id>
		<title>Обсуждение:Настройка логики. Часть 0</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:%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0"/>
				<updated>2012-05-15T07:57:11Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Прошу пояснить, рестриктор из которого нельзя выходить, НПС должен спавнится в нём или он туда может прийти, но потом не уйдёт?&lt;br /&gt;
&lt;br /&gt;
После того, как зайдёт в него, выйти уже не сможет, будучи на работе с указанным '''''in_rest'''''.&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0</id>
		<title>Настройка логики. Часть 0</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0"/>
				<updated>2012-05-07T22:24:04Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 2. Скрипты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
'''GSC GameWorld'''&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=1. Скрипты=&lt;br /&gt;
&lt;br /&gt;
Скрипты, которые можно использовать при конструировании игровых сцен: '''ScriptList'''.&lt;br /&gt;
&lt;br /&gt;
Настройка смарттеррейнов: '''ScriptGulag'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==1.1. ГУЛАГ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==1.1.1. Что это такое? Особенности==&lt;br /&gt;
&lt;br /&gt;
Гулаг - средство объединения нескольких сталкеров под централизованным управлением.&lt;br /&gt;
&lt;br /&gt;
Основные особенности:&lt;br /&gt;
&lt;br /&gt;
* есть список работ гулага. Работа - настроенная схема поведения (или цепочка схем  поведения);&lt;br /&gt;
* работы имеют приоритеты;&lt;br /&gt;
* гулаг назначает на работы сталкеров начиная с работ с наивысшим приоритетом;&lt;br /&gt;
* гулаг имеет состояния. Состояние - набор работ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==1.1.2. Как добавить новый тип гулага==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Установка на уровне===&lt;br /&gt;
&lt;br /&gt;
*Необходимо установить зону '''smart_terrain''', которая бы накрывала место захвата свежих душ (место спауна сталкеров). Необходимо помнить, что название зоны будет являться префиксом для патрульных путей, относящихся к этому гулагу.&lt;br /&gt;
&lt;br /&gt;
*В '''custom_data''' зоны необходимо прописать настройку гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[gulag1]&lt;br /&gt;
type = &amp;lt;тип_гулага&amp;gt;&lt;br /&gt;
squad = &amp;lt;squad&amp;gt;&lt;br /&gt;
groups = &amp;lt;groups&amp;gt;&lt;br /&gt;
capacity = &amp;lt;capacity&amp;gt;&lt;br /&gt;
idle = min[, max]                   ;время бездействия после роспуска гулага, умолчание=0&lt;br /&gt;
stay = min[, max]                   ;время, на которое сталкер останется, умолчание=навсегда&lt;br /&gt;
duration = min[, max]               ;время существования данного типа гулага, умолчание=всегда&lt;br /&gt;
preconditions = info1[, info2, ...] ;чтобы данный тип гулага образовался, нужно присутствие всех infoportions&lt;br /&gt;
p = number                          ;вероятность попадания сталкера под смарт терейн в процентах&lt;br /&gt;
offline = true/false                ;может ли данный гулаг образоваться в офлайне&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Параметр||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;тип_гулага&amp;gt;'''||От него зависит набор и настройка работ.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;squad&amp;gt;'''||Все люди в гулаге будут иметь данный сквад. При отпускании на волю им будет восстанавливаться их родной сквад из редактора.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;groups&amp;gt;'''||Перечень групп, которые будут сетиться для той или иной работы. Задается строкой чисел, разделенных запятыми.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;capacity&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;
*Необходимо в ''gulag_tasks.script'' внести настройку работ для данного типа гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;t = { section  = &amp;quot;kamp1@gar_bandits&amp;quot;, &lt;br /&gt;
      idle     = 0,&lt;br /&gt;
      prior    = 1, &lt;br /&gt;
      state    = {0},&lt;br /&gt;
      group    = groups[0]&lt;br /&gt;
      in_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
      out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Возможные параметры||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''section'''||секция логики в файле ''config\misc\gulag_название_уровня.ltx''.&lt;br /&gt;
|-&lt;br /&gt;
|'''idle'''||Время в мс. между запусками работы. Если оно отлично от 0, то работа может сетится только раз  в заданное время. Если работа просечена – то обнуляться она не будет. Нужно для того чтобы раз в интервал отправлять патрули и другие конечные работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''prior'''||Приоритет. Сперва заполняются работы с более высоким приоритетом.&lt;br /&gt;
|-&lt;br /&gt;
|'''state'''||Таблица с перечнем состояний гулага, в которых доступна данная работа.&lt;br /&gt;
|-&lt;br /&gt;
|'''group'''||Группа для текущей работы, из перечисленных в кастом дате зоны. Массив индексируется начиная с 1. &lt;br /&gt;
|-&lt;br /&gt;
|'''in_rest''', '''out_rest'''||Установленные рестрикторы для персонажа на текущей работе. '''''in''''' - рестрикторы из которых запрещено выходить и '''''out''''' - рестрикторы в которые запрещено входить.&lt;br /&gt;
|-&lt;br /&gt;
|'''info_rest'''||Устанавливаются рестрикторы, вне зоны которых, персонаж на текущей работе будет игнорировать раздражитель.&lt;br /&gt;
|-&lt;br /&gt;
|'''position_threshold'''||Расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''timeout'''||Время, которым задается длительность выполнения работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''online'''||Возможность выполнять работу только в онлайне&lt;br /&gt;
|-&lt;br /&gt;
|'''idle_after_death'''||Устанавливается время в течение которого данная работа будет недоступна после её освобождения .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Необходимо в ''gulag_tasks.script'' добавить функцию просчета состояния для данного типа гулага (см пример в коде - функция '''''loadStates()''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''gulag_tasks.ltx'' создать описание каждой работы. Пример смотри в данном файле. Каждая работа должна описываться отдельной секцией (за исключением работ, которые кушают один и те же настройки, например '''''kamp'''''). Имена секций следует давать в соответствии с соглашением ('''''[walker1@имя зоны]''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''xr_gulag.script'' добавить функцию проверки на допустимость персонажа к гулагу (см пример в коде - '''''check_npc()''''').&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 1]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0</id>
		<title>Настройка логики. Часть 0</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0"/>
				<updated>2012-05-07T22:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 1. Changes Log */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
'''GSC GameWorld'''&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=2. Скрипты=&lt;br /&gt;
&lt;br /&gt;
Скрипты, которые можно использовать при конструировании игровых сцен: '''ScriptList'''.&lt;br /&gt;
&lt;br /&gt;
Настройка смарттеррейнов: '''ScriptGulag'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1. ГУЛАГ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1.1. Что это такое? Особенности==&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;
==2.1.2. Как добавить новый тип гулага==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Установка на уровне===&lt;br /&gt;
&lt;br /&gt;
*Необходимо установить зону '''smart_terrain''', которая бы накрывала место захвата свежих душ (место спауна сталкеров). Необходимо помнить, что название зоны будет являться префиксом для патрульных путей, относящихся к этому гулагу.&lt;br /&gt;
&lt;br /&gt;
*В '''custom_data''' зоны необходимо прописать настройку гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[gulag1]&lt;br /&gt;
type = &amp;lt;тип_гулага&amp;gt;&lt;br /&gt;
squad = &amp;lt;squad&amp;gt;&lt;br /&gt;
groups = &amp;lt;groups&amp;gt;&lt;br /&gt;
capacity = &amp;lt;capacity&amp;gt;&lt;br /&gt;
idle = min[, max]                   ;время бездействия после роспуска гулага, умолчание=0&lt;br /&gt;
stay = min[, max]                   ;время, на которое сталкер останется, умолчание=навсегда&lt;br /&gt;
duration = min[, max]               ;время существования данного типа гулага, умолчание=всегда&lt;br /&gt;
preconditions = info1[, info2, ...] ;чтобы данный тип гулага образовался, нужно присутствие всех infoportions&lt;br /&gt;
p = number                          ;вероятность попадания сталкера под смарт терейн в процентах&lt;br /&gt;
offline = true/false                ;может ли данный гулаг образоваться в офлайне&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Параметр||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;тип_гулага&amp;gt;'''||От него зависит набор и настройка работ.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;squad&amp;gt;'''||Все люди в гулаге будут иметь данный сквад. При отпускании на волю им будет восстанавливаться их родной сквад из редактора.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;groups&amp;gt;'''||Перечень групп, которые будут сетиться для той или иной работы. Задается строкой чисел, разделенных запятыми.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;capacity&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;
*Необходимо в ''gulag_tasks.script'' внести настройку работ для данного типа гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;t = { section  = &amp;quot;kamp1@gar_bandits&amp;quot;, &lt;br /&gt;
      idle     = 0,&lt;br /&gt;
      prior    = 1, &lt;br /&gt;
      state    = {0},&lt;br /&gt;
      group    = groups[0]&lt;br /&gt;
      in_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
      out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Возможные параметры||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''section'''||секция логики в файле ''config\misc\gulag_название_уровня.ltx''.&lt;br /&gt;
|-&lt;br /&gt;
|'''idle'''||Время в мс. между запусками работы. Если оно отлично от 0, то работа может сетится только раз  в заданное время. Если работа просечена – то обнуляться она не будет. Нужно для того чтобы раз в интервал отправлять патрули и другие конечные работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''prior'''||Приоритет. Сперва заполняются работы с более высоким приоритетом.&lt;br /&gt;
|-&lt;br /&gt;
|'''state'''||Таблица с перечнем состояний гулага, в которых доступна данная работа.&lt;br /&gt;
|-&lt;br /&gt;
|'''group'''||Группа для текущей работы, из перечисленных в кастом дате зоны. Массив индексируется начиная с 1. &lt;br /&gt;
|-&lt;br /&gt;
|'''in_rest''', '''out_rest'''||Установленные рестрикторы для персонажа на текущей работе. '''''in''''' - рестрикторы из которых запрещено выходить и '''''out''''' - рестрикторы в которые запрещено входить.&lt;br /&gt;
|-&lt;br /&gt;
|'''info_rest'''||Устанавливаются рестрикторы, вне зоны которых, персонаж на текущей работе будет игнорировать раздражитель.&lt;br /&gt;
|-&lt;br /&gt;
|'''position_threshold'''||Расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''timeout'''||Время, которым задается длительность выполнения работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''online'''||Возможность выполнять работу только в онлайне&lt;br /&gt;
|-&lt;br /&gt;
|'''idle_after_death'''||Устанавливается время в течение которого данная работа будет недоступна после её освобождения .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Необходимо в ''gulag_tasks.script'' добавить функцию просчета состояния для данного типа гулага (см пример в коде - функция '''''loadStates()''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''gulag_tasks.ltx'' создать описание каждой работы. Пример смотри в данном файле. Каждая работа должна описываться отдельной секцией (за исключением работ, которые кушают один и те же настройки, например '''''kamp'''''). Имена секций следует давать в соответствии с соглашением ('''''[walker1@имя зоны]''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''xr_gulag.script'' добавить функцию проверки на допустимость персонажа к гулагу (см пример в коде - '''''check_npc()''''').&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 1]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-07T20:29:50Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.11. Смарттерейны и гулаги. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==3.10.4. Кодовые замки:==&lt;br /&gt;
&lt;br /&gt;
При введении указанного кода выдает инфопоршн&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_code@lock&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&amp;lt;br&amp;gt;&lt;br /&gt;
code = 1243&amp;lt;br&amp;gt;&lt;br /&gt;
on_code = %+infoportion%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_code.script&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
=Смарттерейны и гулаги.=&lt;br /&gt;
&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-07T20:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.3. Схема работы прожектора: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==3.10.4. Кодовые замки:==&lt;br /&gt;
&lt;br /&gt;
При введении указанного кода выдает инфопоршн&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_code@lock&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&amp;lt;br&amp;gt;&lt;br /&gt;
code = 1243&amp;lt;br&amp;gt;&lt;br /&gt;
on_code = %+infoportion%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_code.script&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
==3.11. Смарттерейны и гулаги.==&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T20:29:00Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Набор дополнительных настроек логики у разных объектов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_cutscene]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого переносится игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого смотрит игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''pp_effector = &amp;lt;имя_постэффекта&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cam_effector = &amp;lt;имя_анимации_камеры&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''cameff_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_cutscene&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&lt;br /&gt;
point = agr_cutscene_walk&lt;br /&gt;
look = agr_cutscene_look&lt;br /&gt;
cam_effector = agroprom_demo&lt;br /&gt;
on_signal = cameff_end | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_cutscene.script''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 4]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-07T20:28:00Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.11.1.1. Стандартные типы смарттеррейнов. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==3.10.4. Кодовые замки:==&lt;br /&gt;
&lt;br /&gt;
При введении указанного кода выдает инфопоршн&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_code@lock&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&amp;lt;br&amp;gt;&lt;br /&gt;
code = 1243&amp;lt;br&amp;gt;&lt;br /&gt;
on_code = %+infoportion%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_code.script&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
==3.11. Смарттерейны и гулаги.==&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0</id>
		<title>Настройка логики. Часть 0</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0"/>
				<updated>2012-05-07T19:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Установка в коде */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
'''GSC GameWorld'''&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=1. Changes Log=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;NULL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=2. Скрипты=&lt;br /&gt;
&lt;br /&gt;
Скрипты, которые можно использовать при конструировании игровых сцен: '''ScriptList'''.&lt;br /&gt;
&lt;br /&gt;
Настройка смарттеррейнов: '''ScriptGulag'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1. ГУЛАГ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1.1. Что это такое? Особенности==&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;
==2.1.2. Как добавить новый тип гулага==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Установка на уровне===&lt;br /&gt;
&lt;br /&gt;
*Необходимо установить зону '''smart_terrain''', которая бы накрывала место захвата свежих душ (место спауна сталкеров). Необходимо помнить, что название зоны будет являться префиксом для патрульных путей, относящихся к этому гулагу.&lt;br /&gt;
&lt;br /&gt;
*В '''custom_data''' зоны необходимо прописать настройку гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[gulag1]&lt;br /&gt;
type = &amp;lt;тип_гулага&amp;gt;&lt;br /&gt;
squad = &amp;lt;squad&amp;gt;&lt;br /&gt;
groups = &amp;lt;groups&amp;gt;&lt;br /&gt;
capacity = &amp;lt;capacity&amp;gt;&lt;br /&gt;
idle = min[, max]                   ;время бездействия после роспуска гулага, умолчание=0&lt;br /&gt;
stay = min[, max]                   ;время, на которое сталкер останется, умолчание=навсегда&lt;br /&gt;
duration = min[, max]               ;время существования данного типа гулага, умолчание=всегда&lt;br /&gt;
preconditions = info1[, info2, ...] ;чтобы данный тип гулага образовался, нужно присутствие всех infoportions&lt;br /&gt;
p = number                          ;вероятность попадания сталкера под смарт терейн в процентах&lt;br /&gt;
offline = true/false                ;может ли данный гулаг образоваться в офлайне&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Параметр||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;тип_гулага&amp;gt;'''||От него зависит набор и настройка работ.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;squad&amp;gt;'''||Все люди в гулаге будут иметь данный сквад. При отпускании на волю им будет восстанавливаться их родной сквад из редактора.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;groups&amp;gt;'''||Перечень групп, которые будут сетиться для той или иной работы. Задается строкой чисел, разделенных запятыми.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;capacity&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;
*Необходимо в ''gulag_tasks.script'' внести настройку работ для данного типа гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;t = { section  = &amp;quot;kamp1@gar_bandits&amp;quot;, &lt;br /&gt;
      idle     = 0,&lt;br /&gt;
      prior    = 1, &lt;br /&gt;
      state    = {0},&lt;br /&gt;
      group    = groups[0]&lt;br /&gt;
      in_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
      out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Возможные параметры||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''section'''||секция логики в файле ''config\misc\gulag_название_уровня.ltx''.&lt;br /&gt;
|-&lt;br /&gt;
|'''idle'''||Время в мс. между запусками работы. Если оно отлично от 0, то работа может сетится только раз  в заданное время. Если работа просечена – то обнуляться она не будет. Нужно для того чтобы раз в интервал отправлять патрули и другие конечные работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''prior'''||Приоритет. Сперва заполняются работы с более высоким приоритетом.&lt;br /&gt;
|-&lt;br /&gt;
|'''state'''||Таблица с перечнем состояний гулага, в которых доступна данная работа.&lt;br /&gt;
|-&lt;br /&gt;
|'''group'''||Группа для текущей работы, из перечисленных в кастом дате зоны. Массив индексируется начиная с 1. &lt;br /&gt;
|-&lt;br /&gt;
|'''in_rest''', '''out_rest'''||Установленные рестрикторы для персонажа на текущей работе. '''''in''''' - рестрикторы из которых запрещено выходить и '''''out''''' - рестрикторы в которые запрещено входить.&lt;br /&gt;
|-&lt;br /&gt;
|'''info_rest'''||Устанавливаются рестрикторы, вне зоны которых, персонаж на текущей работе будет игнорировать раздражитель.&lt;br /&gt;
|-&lt;br /&gt;
|'''position_threshold'''||Расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''timeout'''||Время, которым задается длительность выполнения работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''online'''||Возможность выполнять работу только в онлайне&lt;br /&gt;
|-&lt;br /&gt;
|'''idle_after_death'''||Устанавливается время в течение которого данная работа будет недоступна после её освобождения .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Необходимо в ''gulag_tasks.script'' добавить функцию просчета состояния для данного типа гулага (см пример в коде - функция '''''loadStates()''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''gulag_tasks.ltx'' создать описание каждой работы. Пример смотри в данном файле. Каждая работа должна описываться отдельной секцией (за исключением работ, которые кушают один и те же настройки, например '''''kamp'''''). Имена секций следует давать в соответствии с соглашением ('''''[walker1@имя зоны]''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''xr_gulag.script'' добавить функцию проверки на допустимость персонажа к гулагу (см пример в коде - '''''check_npc()''''').&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 1]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0</id>
		<title>Настройка логики. Часть 0</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_0"/>
				<updated>2012-05-07T19:48:14Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Часть 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
'''GSC GameWorld'''&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
=1. Changes Log=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;NULL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=2. Скрипты=&lt;br /&gt;
&lt;br /&gt;
Скрипты, которые можно использовать при конструировании игровых сцен: '''ScriptList'''.&lt;br /&gt;
&lt;br /&gt;
Настройка смарттеррейнов: '''ScriptGulag'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1. ГУЛАГ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==2.1.1. Что это такое? Особенности==&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;
==2.1.2. Как добавить новый тип гулага==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Установка на уровне===&lt;br /&gt;
&lt;br /&gt;
*Необходимо установить зону '''smart_terrain''', которая бы накрывала место захвата свежих душ (место спауна сталкеров). Необходимо помнить, что название зоны будет являться префиксом для патрульных путей, относящихся к этому гулагу.&lt;br /&gt;
&lt;br /&gt;
*В '''custom_data''' зоны необходимо прописать настройку гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;[gulag1]&lt;br /&gt;
type = &amp;lt;тип_гулага&amp;gt;&lt;br /&gt;
squad = &amp;lt;squad&amp;gt;&lt;br /&gt;
groups = &amp;lt;groups&amp;gt;&lt;br /&gt;
capacity = &amp;lt;capacity&amp;gt;&lt;br /&gt;
idle = min[, max]                   ;время бездействия после роспуска гулага, умолчание=0&lt;br /&gt;
stay = min[, max]                   ;время, на которое сталкер останется, умолчание=навсегда&lt;br /&gt;
duration = min[, max]               ;время существования данного типа гулага, умолчание=всегда&lt;br /&gt;
preconditions = info1[, info2, ...] ;чтобы данный тип гулага образовался, нужно присутствие всех infoportions&lt;br /&gt;
p = number                          ;вероятность попадания сталкера под смарт терейн в процентах&lt;br /&gt;
offline = true/false                ;может ли данный гулаг образоваться в офлайне&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Параметр||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;тип_гулага&amp;gt;'''||От него зависит набор и настройка работ.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;squad&amp;gt;'''||Все люди в гулаге будут иметь данный сквад. При отпускании на волю им будет восстанавливаться их родной сквад из редактора.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;groups&amp;gt;'''||Перечень групп, которые будут сетиться для той или иной работы. Задается строкой чисел, разделенных запятыми.&lt;br /&gt;
|-&lt;br /&gt;
|'''&amp;lt;capacity&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;
*Необходимо в ''gulag_tasks.script'' внести настройку работ для данного типа гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;t = { section  = &amp;quot;kamp1@gar_bandits&amp;quot;, &lt;br /&gt;
      idle     = 0,&lt;br /&gt;
      prior    = 1, &lt;br /&gt;
      state    = {0},&lt;br /&gt;
      group    = groups[0]&lt;br /&gt;
      in_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
      out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard highlight&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Возможные параметры||Описание&lt;br /&gt;
|-&lt;br /&gt;
|'''section'''||секция логики в файле ''config\misc\gulag_название_уровня.ltx''.&lt;br /&gt;
|-&lt;br /&gt;
|'''idle'''||Время в мс. между запусками работы. Если оно отлично от 0, то работа может сетится только раз  в заданное время. Если работа просечена – то обнуляться она не будет. Нужно для того чтобы раз в интервал отправлять патрули и другие конечные работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''prior'''||Приоритет. Сперва заполняются работы с более высоким приоритетом.&lt;br /&gt;
|-&lt;br /&gt;
|'''state'''||Таблица с перечнем состояний гулага, в которых доступна данная работа.&lt;br /&gt;
|-&lt;br /&gt;
|'''group'''||Группа для текущей работы, из перечисленных в кастом дате зоны. Массив индексируется начиная с 1. &lt;br /&gt;
|-&lt;br /&gt;
|'''in_rest''', '''out_rest'''||Установленные рестрикторы для персонажа на текущей работе. '''''in''''' - рестрикторы из которых запрещено выходить и '''''out''''' - рестрикторы в которые запрещено входить.&lt;br /&gt;
|-&lt;br /&gt;
|'''info_rest'''||Устанавливаются рестрикторы, вне зоны которых, персонаж на текущей работе будет игнорировать раздражитель.&lt;br /&gt;
|-&lt;br /&gt;
|'''position_threshold'''||Расстояние до места работы при котором персонаж в онлайне считается достигшим места работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''timeout'''||Время, которым задается длительность выполнения работы.&lt;br /&gt;
|-&lt;br /&gt;
|'''online'''||Возможность выполнять работу только в онлайне&lt;br /&gt;
|-&lt;br /&gt;
|'''idle_after_death'''||Устанавливается время в течение которого данная работа будет недоступна после её освобождения .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Необходимо в ''gulag_tasks.script'' добавить функцию просчета состояния для данного типа гулага (см пример в коде - функция '''''loadStates()''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''gulag_tasks.ltx'' создать описание каждой работы. Пример смотри в данном файле. Каждая работа должна описываться отдельной секцией (за исключением работ, которые кушают один и те же настройки, например '''''kamp'''''). Имена секций следует давать в соответствии с соглашением ('''''[walker1@имя зоны]''''').&lt;br /&gt;
&lt;br /&gt;
*В файле ''xr_gulag.script'' добавить функцию проверки на допустимость персонажа к гулагу (см пример в коде - '''''check_npc()''''').&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 3&amp;gt;[[Часть 1]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1</id>
		<title>Настройка логики. Часть 1</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1"/>
				<updated>2012-05-07T19:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема meet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font size=6&amp;gt;Настройки логики&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Система флагов (path_walk, path_look)=&lt;br /&gt;
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем &amp;quot;'''''wp00'''''&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wp00|flag1|flag2'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_walk''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a=state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при перемещении (Только из раздела &amp;quot;Ходячие состояния&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''p=percent'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути *'''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_look''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a =state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов &amp;quot;Стоячие&amp;quot; и &amp;quot;Сидячие&amp;quot; состояния)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''t=msec''' - время в миллисекундах, которое персонаж должен смотреть в заданную точку.&amp;lt;br&amp;gt;&lt;br /&gt;
:'''*''' – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
:Для конечных (терминальных) вершин пути '''''path_walk''''', у которых не более 1-й соответствующей точки '''path_look''', значение '''''t''''' всегда считается бесконечным и его явно задавать не нужно.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:После поворота в точку '''''path_look''''', установить сигнал с именем '''''name'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''syn'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком '''''syn''''' не прибудут все персонажи с данным '''''team'''''-ом ('''''team''''' задается в виде текстовой строки в '''''customdata'''''). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою '''''idle''''' анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sigtm=signal'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает сигнал при вызове '''''time_callback'''''-а '''''state manager'''''-ом. Соответственно, если '''''t=0''''', то сигнал будет установлен после отыгрывания '''''init''''' анимации. Это используется, например, с анимацией '''''press''''', которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.&amp;lt;br&amp;gt;&lt;br /&gt;
:В пути '''''path_look''''' можно сделать:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;wp00|a=press|t=0|sigtm=pressed&amp;lt;/ini&amp;gt;&lt;br /&gt;
:А затем переключить схему:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_signal = pressed | другая_схема&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Более подробное описание путей.==&lt;br /&gt;
&lt;br /&gt;
Настройка:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_1.JPG]]&lt;br /&gt;
&lt;br /&gt;
На карту для каждого walker-а нужно поставить:&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_walk''''', по которому '''''walker''''' ходит.&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_look''''', состоящий из точек, в которые '''''walker''''' смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Walker'''''-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если персонаж должен стоять на месте, то ему задается одна точка пути '''''path_walk''''' и как минимум одна точка пути '''''path_look''''', хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила расстановки флажков в путях рассмотрим на нескольких примерах:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 1:===&lt;br /&gt;
&lt;br /&gt;
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_2.JPG]]&lt;br /&gt;
&lt;br /&gt;
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути '''''path_walk''''' существуют флажки.&amp;lt;br&amp;gt;&lt;br /&gt;
У каждого вейпоинта есть имя: '''''wp00''''', '''''wp01''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘'''|'''’. Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=threat''''' то персонаж пойдет в состоянии данжер, если '''''a=raid''''' то побежит с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_walk''''' используются анимации '''ТОЛЬКО''' из раздела «Ходячие состояния»!&lt;br /&gt;
&lt;br /&gt;
===Пример 2:===&lt;br /&gt;
[[Изображение:Logic_3.JPG]]&lt;br /&gt;
&lt;br /&gt;
Разговор персонажа.&lt;br /&gt;
&lt;br /&gt;
Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существуют следующие поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s = имя_звуковой_схемы''''' - (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
===Пример 3:===&lt;br /&gt;
[[Изображение:Logic_4.JPG]]&lt;br /&gt;
&lt;br /&gt;
В примере 3 используется только поле '''''s''''', чтобы задать тему разговора, и флажок '''''sc''''', чтобы показать, что звук проигрывается не разово, а периодически.&amp;lt;br&amp;gt;&lt;br /&gt;
Остальные параметры ('''''sp''''', '''''sf''''', '''''st''''') задавать НЕ РЕКОМЕНДУЕТСЯ, значения по умолчанию приемлемы для большинства скриптов.&amp;lt;br&amp;gt;&lt;br /&gt;
Параметр '''''sa''''' также использовать НЕ РЕКОМЕНДУЕТСЯ. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути '''''path_look''''', о котором будет написано ниже.&amp;lt;br&amp;gt;&lt;br /&gt;
Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 4:=== &lt;br /&gt;
усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_5.JPG]]&lt;br /&gt;
&lt;br /&gt;
Что добавилось в этом примере? Путь '''''path_look''''' с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее, в точках путей '''''path_walk''''' и '''''path_look''''', которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки (в ''ACDC'' поле '''''flags'''''). Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь персонаж будет останавливаться в точках '''''path_walk''''', помеченных флажком, и смотреть в точку '''''path_look''''', помеченную тем же самым флажком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если точка '''''path_walk'''''  не помечена флажком, персонаж проходит ее не останавливаясь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одной точке '''''path_walk''''' может соответствовать несколько точек '''''path_look'''''. Тогда персонаж выберем случайно одну из подходящих точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По аналогии с '''''path_walk''''', в точках пути '''''path_look''''' можно использовать различные флажки, меняющие поведение:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''p = 100''''' – вероятность, с которой персонаж посмотрит именно в эту точку. Значения '''''p''''' всех подходящих точек суммируются, т.е. если у одной точки '''''p = 100''''', а у другой '''''p = 300''''', то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).&lt;br /&gt;
Во избежание путаницы, рекомендуется задавать '''''p''''' так, чтобы их сумма составляла '''100'''.&lt;br /&gt;
По умолчанию у всех точек '''''p = 100'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''t = 5000''''' - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 5:===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_6.JPG]]&lt;br /&gt;
&lt;br /&gt;
В этом примере проходя через точку '''''wp00''''', персонаж с вероятностью 30% посмотрит в точку '''''wp00''''' в течение 5 секунд, но с вероятностью 70% посмотрит в точку '''''wp01''''' в течении 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию при остановках персонаж играет анимацию '''''idle''''', если он не в состоянии '''''crouch''''', либо анимацию '''''hide''''', если он в состоянии '''''crouch'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если требуется другая анимация, можно ее указать с помощью флажка:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''a = имя_анимации''''' - (по умолчанию '''''idle'''''). &amp;lt;br&amp;gt;&lt;br /&gt;
Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет  с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»!&lt;br /&gt;
&lt;br /&gt;
==Система флагов для монстров==&lt;br /&gt;
Флаги пути движения:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s=имя_звуковой_темы'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает звуковую тему на пути в данную точку ('''''idle''''', '''''eat''''', '''''attack''''', '''''attack_hit''''', '''''take_damage''''', '''''die''''', '''''threaten''''', '''''steal''''', '''''panic''''', '''''growling''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''с'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы вприсядку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''r'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы бег.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sig=name'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b=vis/invis'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Флаг, исключительно для кровососа. Управляет невидимостью ('''''vis''''' - отключена, '''''invis''''' - включена).&lt;br /&gt;
&lt;br /&gt;
Флаги пути обзора:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''t=msec'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Время в миллисекундах, которое нужно ждать, смотря в точку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''a=state'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Анимация ('''''stand_idle''''', '''''sit_idle''''', '''''lie_idle''''', '''''eat''''', '''''sleep''''', '''''rest''''', '''''attack''''', '''''look_around''''', '''''turn''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Случайный выбор пути==&lt;br /&gt;
По поводу точек пути '''''path_walk'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:[[Файл:Random_path.jpg]]&lt;br /&gt;
&lt;br /&gt;
Нам требуется, чтобы НПС стоящий в точке '''''p0''''' патрулировал территорию по двум цикличным маршрутам:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p1 -&amp;gt; p2 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p3 -&amp;gt; p4 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
Чтобы задать вариацию выбора маршрута относительно точки '''''p0''''', нужно в ссылке на следующую точку пути указать не одну, а две точки:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек '''''p1''''' или '''''p3'''''. После возврата в точку '''''p0''''' выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;а в точке '''''p1''''', также задать выбор:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(1), p3(1)&amp;lt;/ini&amp;gt;&lt;br /&gt;
'''НО!'''&lt;br /&gt;
Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема '''НЕ ПРИЕМЛЕМА''' и, лично у меня, вызывает вылет:[[Файл:Error_random_path.jpg]]&lt;br /&gt;
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(0.75), p3(0.25)&amp;lt;/ini&amp;gt;то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще.&lt;br /&gt;
&lt;br /&gt;
=Схемы поведения сталкеров.=&lt;br /&gt;
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема walker==&lt;br /&gt;
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;'''''    - основной путь, по которому ходит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;'''''    - путь, куда смотрит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team      = &amp;lt;имя_команды&amp;gt;''''' - команда для синхронизации&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving1 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving2 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она не слишком далеко ('''''rush''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving3 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она далеко ('''''sprint''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_standing = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker@pri_followers_leader_wave1_wait]&lt;br /&gt;
path_walk = wave1_leader_walk2&lt;br /&gt;
path_look = wave1_leader_look2&lt;br /&gt;
def_state_moving1 = assault&lt;br /&gt;
def_state_moving2 = assault&lt;br /&gt;
team = followers&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема remark==&lt;br /&gt;
Схема используется для синхронизации\связки других схем.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.&lt;br /&gt;
&lt;br /&gt;
'''[remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук ремарка, берётся из файла ''sound_theme.script''. По умолчанию  '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимация ремарка, по умолчанию '''''wait'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - куда смотрит сталкер. Есть следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значение&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' – без комментариев&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' – позиция вычисленная АИ автоматически&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;имя работы&amp;gt;,&amp;lt;имя гулага&amp;gt;''''' - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = logic@cit_killers_base_guard, cit_killers&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;path_name&amp;gt;,&amp;lt;point_number&amp;gt;''''' - можно указывать смотреть в вершину патрульного пути (&amp;lt;имя пути&amp;gt;,&amp;lt;имя точки&amp;gt;).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = cit_killers_kamp5,0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': теперь если значение не задано, то оно равно '''''nil''''' а не '''''actor''''', как было раньше.&amp;lt;br&amp;gt;&lt;br /&gt;
:То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение '''''nil''''', то персонаж развернется в позицию, которую посчитает АИ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': &amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''sound_end''''' – по окончании проигрывания звуковой схемы&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''anim_end''''' – по окончании проигрывания анимации&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[remark@esc_lager_volk2]&lt;br /&gt;
anim = guard_rac&lt;br /&gt;
snd = esc_wolf_radio&lt;br /&gt;
target = actor&lt;br /&gt;
on_signal = sound_end| remark@esc_lager_volk3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sleeper==&lt;br /&gt;
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sleeper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_main = &amp;lt;имя_пути&amp;gt;''''' - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[sleeper@esc_blockpost_sleep1]&lt;br /&gt;
path_main = sleep1&lt;br /&gt;
wakeable = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_sleeper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема kamp==&lt;br /&gt;
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.&amp;lt;br&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
'''[kamp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''center_point = &amp;lt;имя_пути&amp;gt;''''' – имя точки вокруг которой NPC будет устраиваться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние, в котором NPC будет идети к точке кампа. По умолчанию - '''''ran'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит.&amp;lt;br&amp;gt;&lt;br /&gt;
:Чтобы этого не случалось в секции кемпа указывать '''''path_walk''''' из одной точке, название которой '''''&amp;lt;path_kamp_name&amp;gt;_task''''':&amp;lt;ini&amp;gt;path_walk = &amp;lt;имя_пути&amp;gt;_task&amp;lt;/ini&amp;gt;Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[kamp@esc_blockpost_kamp1]&lt;br /&gt;
center_point = kamp_center&lt;br /&gt;
path_walk = kamp_center_task&lt;br /&gt;
def_state_moving = raid&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_kamp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема camper==&lt;br /&gt;
Свойства камперов:&lt;br /&gt;
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;&amp;lt;br&amp;gt;&lt;br /&gt;
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[camper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания.&lt;br /&gt;
:Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите камперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию - '''''assault'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути.&lt;br /&gt;
:По умолчанию - '''''sneak_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию - '''''hide'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''attack_sound = &amp;lt;имя_звуковой_темы&amp;gt;''''' - возможность переопределять снайперам/камперам звук атаки. По дефолту он равен звуковой теме '''''fight_attack'''''.&lt;br /&gt;
:Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''shoot = &amp;lt;тип_стрельбы&amp;gt;''''' - возможны следующие значения:&lt;br /&gt;
:*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - не стреляет вообще;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),&amp;lt;br&amp;gt;&lt;br /&gt;
:то он тупо продолжает стоять на старом месте и ждать следующей пули.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кампера. Используйте '''''walker''''' в таких случаях, а камперов стоить ставить для атак по путям и как снайперов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@dar_military_scout_hide]&lt;br /&gt;
path_walk = walk_hide&lt;br /&gt;
path_look = look_hide&lt;br /&gt;
radius = 10&lt;br /&gt;
no_retreat = true&lt;br /&gt;
def_state_moving = assault&lt;br /&gt;
def_state_campering = hide_na&lt;br /&gt;
shoot = always&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sniper==&lt;br /&gt;
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В кастом дате кемпера прописать:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;sniper = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@esc_blockpost_camper_day]&lt;br /&gt;
path_walk = camper_day_walk&lt;br /&gt;
path_look = camper_day_look&lt;br /&gt;
sniper = true&lt;br /&gt;
def_state_campering = threat&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Ставить снайперу только 2 точки '''''look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема follower== &lt;br /&gt;
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Пути не задаются&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[follower]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''leader = &amp;lt;number&amp;gt;''''' - '''''story_id''''' лидера из ''game.ltx'' (число!).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation_line = true/false''''' - постарается идти сбоку от лидера, в противном случае будет идти сзади.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''distance = &amp;lt;number&amp;gt;''''' - расстояние в метрах, на котором будет идти от лидера '''''attendant'''''. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state_if_leader_in_meet = &amp;lt;название_анимации&amp;gt;''''' - это есть строка с именем  состояния из '''''state_manager''''', которое будет назначено '''''follower'''''-ам, если командир пребывает в состоянии '''''meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_walk = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер идет за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_run = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер бежит за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_sprint = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер спринтует за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Не забыть прописать:&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrains]&lt;br /&gt;
none = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Иначе NPC засосёт в гулаг и никуда он не пойдёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все это происходит под гулагом, то вместо '''''story_id''''' лидера, мы прописываем его секцию логики в файле скрипта.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;lua&amp;gt;t = { section = &amp;quot;logic@bar_arena_follower_2&amp;quot;, &lt;br /&gt;
      idle    = 0,&lt;br /&gt;
      prior   = 7,&lt;br /&gt;
      state   = {0},&lt;br /&gt;
      squad   = squad,&lt;br /&gt;
      group   = groups[0],&lt;br /&gt;
      ...&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;В данном случае для параметра '''''leader''''' необоходимо указать строку '''''bar_arena_follower_2'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': в релизе игры данная схема не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_attendant.script''&lt;br /&gt;
&lt;br /&gt;
==Схема zoneguard==&lt;br /&gt;
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[zoneguard]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team = &amp;lt;имя_команды&amp;gt;''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_guard = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой игрок будет атакован.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_warn = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой NPC будет начинать разговор с игроком.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''walker_team = &amp;lt;имя_команды&amp;gt;''''' -  для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_greet = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук которой будет проигран при обнаружении игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - какую отыгрывает анимацию, если игрок ему не враждебен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[zoneguard]&lt;br /&gt;
path_walk = mil_freedom_zoneguard_walk_kill2&lt;br /&gt;
path_look = mil_freedom_zoneguard_look_kill2&lt;br /&gt;
zone_warn = mil_freedom_leader_warn_zone&lt;br /&gt;
zone_guard = mil_freedom_leader_kill_zone&lt;br /&gt;
no_move = true&lt;br /&gt;
team = freedom_bodyguards3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_zoneguard.script''&lt;br /&gt;
&lt;br /&gt;
==Схема wounded==&lt;br /&gt;
Схема раненного. Определяет поведение NPC в состоянии &amp;quot;раненный&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.&lt;br /&gt;
&lt;br /&gt;
'''[wounded]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он не видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state_see = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''psy_state = &amp;lt;PSY&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному '''''PSY'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_victim = &amp;lt;HP&amp;gt;|&amp;lt;параметр&amp;gt;''''' - куда будет смотреть NPC при значении уровня его здоровья равному '''''HP''''', возможные параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - числовое значение;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&lt;br /&gt;
:*'''''nil''''' - позиция вычисленная АИ автоматически.&lt;br /&gt;
'''''hp_cover = &amp;lt;HP&amp;gt;|true/false''''' - идти в укрытие или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_fight = &amp;lt;HP&amp;gt;|true/false''''' - разрешено воевать или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''syndata = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - синхропары для красоты.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить диалог, вместо стандартного '''''actor_help_wounded'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_start_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;xml&amp;gt;&amp;lt;precondition&amp;gt;dialogs.allow_wounded_dialog&amp;lt;/precondition&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
'''''Примечание''''': если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно.&lt;br /&gt;
:Для параметров '''''hp_state_see''''', '''''psy_state''''', '''''hp_victim''''', '''''hp_cover''''', '''''hp_fight''''' способ такой же.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы &amp;lt;small&amp;gt;(в качестве примера взята дефолтная настройка)'''''&amp;lt;/small&amp;gt;:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&lt;br /&gt;
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy&lt;br /&gt;
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|psy_shoot,psy_pain@wounded_psy_shoot,wounded_psy&lt;br /&gt;
hp_victim = 30|actor|10|nil&lt;br /&gt;
hp_cover = 30|true|10|false&lt;br /&gt;
hp_fight = 30|true|10|false&lt;br /&gt;
syndata = wounded@help&lt;br /&gt;
;best_pistol – проверка на то, что лучшее оружие NPC является пистолетом.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_wounded.script''&lt;br /&gt;
&lt;br /&gt;
==Схема rest==&lt;br /&gt;
Чувак гуляет, хавает, спит.&amp;lt;br&amp;gt;&lt;br /&gt;
Нормально не работает, посему в релизе не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_rest.script''&lt;br /&gt;
&lt;br /&gt;
==Схема heli_hunter==&lt;br /&gt;
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:&amp;lt;br&amp;gt;&lt;br /&gt;
В активную схему вставляется параметр:&amp;lt;ini&amp;gt;heli_hunter = {+info -info =func !func ~number}true/false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;ini&amp;gt;[camper@bar_freedom_attack_sniper_1]&lt;br /&gt;
path_walk = camper_1_walk&lt;br /&gt;
path_look = camper_1_look&lt;br /&gt;
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 &amp;lt;br&amp;gt;%=bar_freedom_angry_actor%&lt;br /&gt;
meet_talk_enabled = true&lt;br /&gt;
meet_dialog = bar_svoboda_dialog&lt;br /&gt;
heli_hunter = {-bar_ecolog_crush_heli_down} true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема patrol==&lt;br /&gt;
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[patrol]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt; &lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation = &amp;lt;параметр&amp;gt;''''' - описывет способ построения и не является обязательным. Возможны следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''back''''' - мужики идут чуть позади командира в два ряда (по умолчанию);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''line''''' - шеренга;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''around''''' - вокруг командира.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''commander = true/false''''' - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. '''''false''''' - по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''move_type = &amp;lt;название_анимации&amp;gt;''''' - задает изначальный режим перемещения, по умолчанию '''''patrol'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При остановке командора в '''''meet''''' мужики останавливаются.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;ret=0...2&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*0 - линия;&lt;br /&gt;
:*1 – вокруг старшего;&lt;br /&gt;
:*2 – по бокам.&lt;br /&gt;
&lt;br /&gt;
При движении командор работает как обычный '''''walker''''' и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано '''''a=assault''''', то командор помчится с орудием убийства на перевес, а остальные его откопируют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': что еще не сделано или глючит:&amp;lt;br&amp;gt;&lt;br /&gt;
:*нет возможности автоматически перестроить команду;&lt;br /&gt;
:*все идут молча;&lt;br /&gt;
:*командор пока не отдает команд;&lt;br /&gt;
:*не рекомендуется включать спринт.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[patrol@val_escort_captive_wait]&lt;br /&gt;
path_walk           = captive_wait_walk&lt;br /&gt;
path_look           = captive_wait_look&lt;br /&gt;
commander           = true&lt;br /&gt;
formation           = back&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_patrol.script''&lt;br /&gt;
&lt;br /&gt;
==Схема meet==&lt;br /&gt;
Схема позволяющая настроить ситуацию, когда НПС встречает актора.&lt;br /&gt;
&lt;br /&gt;
'''[meet]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_state/meet_state_wpn = &amp;lt;number&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' – задает анимацию и озвучку персонажа,&lt;br /&gt;
:в зависимости от расстояния до актера равному '''''number'''''. Для ситуации, когда актор безоружен и вооружён соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''victim/victim_wpn = &amp;lt;number&amp;gt;|&amp;lt;параметр&amp;gt;''''' - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное '''''number'''''.&lt;br /&gt;
:Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''actor''''' - смотреть на игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''story_id''''' - смотреть на персонажа со указанным '''''story_id''''';&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''nil''''' - никуда.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''use/use_wpn = true/false/self''''' - настройки юзабельности персонажа.&lt;br /&gt;
:При установки значения '''''self''''' NPC сам юзнет игрока, как только сможет дотянуться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - если актор будет замечен в указанном рестрикторе,&lt;br /&gt;
:то NPC будет отыгрывать заданную анимацию и произносить заданный звук.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''synpairs = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - Если при каком-то наборе условий&lt;br /&gt;
:встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''abuse = true/false''''' - по умолчанию '''''true''''', если '''''false''''', то неюзающийся противник не будет обижаться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''precond = usability/visibility'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любую строку можно задавать кондлистом ('''''{+info -info =func !func ~number}''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker]&lt;br /&gt;
meet = default_meet&amp;lt;/ini&amp;gt;Саму секцию '''''default_meet''''' задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[default_meet]&lt;br /&gt;
meet_state = 30|hello@hail|20|wait@wait&lt;br /&gt;
mmet_state_wpn = 30|backoff@threat_weap&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = false&lt;br /&gt;
syndata = hello@hail|backoff@threat_weap&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему '''''meet = no_meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 1'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait&lt;br /&gt;
meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap&lt;br /&gt;
victim = 50| actor&lt;br /&gt;
victim_wpn = 50| actor&lt;br /&gt;
use = true&amp;lt;&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 2'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info%&lt;br /&gt;
meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait&lt;br /&gt;
victim = 50|actor&lt;br /&gt;
victim_wpn = 50|actor&lt;br /&gt;
use = {-info2} self, false&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info2''''' – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''killactor''''' – функция в ''xr_effects.script'' которая обижает NPC на игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 3'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper]&lt;br /&gt;
path_walk = path_walk&lt;br /&gt;
path_look = path_look&lt;br /&gt;
meet = meet&lt;br /&gt;
&lt;br /&gt;
[meet]&lt;br /&gt;
meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = true&lt;br /&gt;
zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse&lt;br /&gt;
meet_dialog = {+info} dialog1, dialog2&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''true''''' – вместо анимации, атаковать игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая говорит, что мы имеем допуск к лагерю;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''warnzone''''' – рестриктор, в котором нас предупреждают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''kampzone''''' – рестриктор, в котором нас убивают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog1''''' – стартовый диалог NPC, если мы имеем допуск в лагерь;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog2''''' – стартовый диалог NPC, если мы не имеем допуск в лагерь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 2]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2</id>
		<title>Настройка логики. Часть 2</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2"/>
				<updated>2012-05-07T19:46:42Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Спавн монстров дневных и ночных */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Секции.=&lt;br /&gt;
==Секция combat==&lt;br /&gt;
Показывает, что происходит, когда NPC срывается в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info =  {+info -info =func !func ~number}%+info -info =func%''''' -  эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В следующем примере сталкер сражается:&amp;lt;br&amp;gt;&lt;br /&gt;
:*по-камперски, если враг - актёр и он дальше Х метров;&lt;br /&gt;
:*по-монолитовски, если любой враг дальше Y метров;&lt;br /&gt;
:*иначе - движковый бой.&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = ...&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, &amp;lt;br&amp;gt;{=fighting_ge_Y_meters} monolith&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;function fighting_dist_ge_20(actor, npc)&lt;br /&gt;
    return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) &amp;gt;= 400 &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
'''''Примечание''''': 400 – это 20&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = nil&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = zombied&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом   '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Помните(!)''''': оверрайд всегда будет перекрывать настройку в секции '''''combat'''''. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker1&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker1]&lt;br /&gt;
...&lt;br /&gt;
[walker2]&lt;br /&gt;
...&lt;br /&gt;
[walker3]&lt;br /&gt;
...&lt;br /&gt;
combat_type = monolith&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = camper&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_effects.script'' есть функция отключающая секцию '''''combat''''' - '''''disable_combat_handler'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Секция death==&lt;br /&gt;
Схема показывает, что происходит при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_death = death@mil_freedom_max_combat1&lt;br /&gt;
&lt;br /&gt;
[death@mil_freedom_max_combat1]&lt;br /&gt;
on_info = %=military_max_dead +sar2_death_47%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_death.script''&lt;br /&gt;
&lt;br /&gt;
==Cекция hit==&lt;br /&gt;
Схема показывает, что происходит при нанесении повреждения NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit = hit'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[hit]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если NPC нанесён хит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit''''' НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_hit = on_hit@agr_factory_hold_fake&lt;br /&gt;
&lt;br /&gt;
[on_hit@agr_factory_hold_fake]&lt;br /&gt;
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_hit.script''&lt;br /&gt;
&lt;br /&gt;
==Секция actor_dialogs==&lt;br /&gt;
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''actor_dialogs = actor_dialogs'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[actor_dialogs]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''id = &amp;lt;название_диалога&amp;gt;''''' - доступные диалоги, перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''disable = &amp;lt;название_диалога&amp;gt;''''' - запрещенные диалоги, тоже через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
actor_dialogs = actor_dialogs&lt;br /&gt;
&lt;br /&gt;
[actor_dialbr&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значениеogs]&lt;br /&gt;
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
==Секция use==&lt;br /&gt;
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.&lt;br /&gt;
&lt;br /&gt;
'''''on_use = use'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[use]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_use = use@mil_dolg_leader&lt;br /&gt;
 &lt;br /&gt;
[use@mil_dolg_leader]&lt;br /&gt;
on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_use.script''&lt;br /&gt;
&lt;br /&gt;
==Секция combat_ignore==&lt;br /&gt;
Если для NPC установлена данная секция то он, не переходит в боевой режим.&amp;lt;br&amp;gt;&lt;br /&gt;
Для секции нет дополнительных полей.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = combat_ignore'''''&lt;br /&gt;
&lt;br /&gt;
'''[combat_ignore]'''&lt;br /&gt;
&lt;br /&gt;
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker] '''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для оверрайда задать значение '''''always''''', то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20м;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_actor''''' - текущий враг актёр?;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''check_fighting''''' - проверка (по '''''story_id''''') того, что нашим врагом есть хотя бы кто-то один из списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat_ignore.script''&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_character_supplies==&lt;br /&gt;
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в в его профиле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[dont_spawn_character_supplies]'''&lt;br /&gt;
&lt;br /&gt;
==Секция threshold==&lt;br /&gt;
Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''threshold = threshold'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[threshold]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_ignore_distance = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_monster = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': второй параметр следует менять '''ОЧЕНЬ''' осторожно. Помните, в него нужно вписывать значение ''от 0 до 1''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
threshold = threshold@mil_fbarier&lt;br /&gt;
&lt;br /&gt;
[threshold@mil_fbarier]&lt;br /&gt;
max_ignore_distance = 150&lt;br /&gt;
ignore_monster = 0.1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
==Секция Danger==&lt;br /&gt;
Секцию необходимо указывать '''только для какой-то конкретной схемы'''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''danger = danger_condition'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[danger_condition]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется &amp;quot;живая&amp;quot; опасность (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_grenade = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется граната (15 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_corpse = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется труп (10 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_hit = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется хит (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_sound = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется звук (50 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_grenade = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о гранате (20000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_corpse = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о трупе (10000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_hit = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о хите (60000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_sound = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о звуке (15000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_ricochet = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о рикошете (30000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_expiration_time = &amp;lt;number&amp;gt;''''' - время, через которое денжер перестанет быть акутальным. (5000 миллисекунд по умолчанию)&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': NPC в принципе игнорируют авто с секцией '''''m_car'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера '''''danger_condition@1''''', '''''danger_condition@2''''' и так далее.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[camper@dar_military_scout_camper3]&lt;br /&gt;
...&lt;br /&gt;
danger = danger_condition@scout&lt;br /&gt;
&lt;br /&gt;
[danger_condition@scout]&lt;br /&gt;
ignore_distance       = 10&lt;br /&gt;
ignore_distance_grenade = 10&lt;br /&gt;
ignore_distance_corpse  = 0&lt;br /&gt;
ignore_distance_danger_hit     = 20&lt;br /&gt;
ignore_distance_sound   = 0 &lt;br /&gt;
danger_inertion_time_hit = 1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata_1006\scripts\xr_danger.script''&lt;br /&gt;
&lt;br /&gt;
==Секция game_info==&lt;br /&gt;
&amp;quot;Обучает&amp;quot; NPC рассказывать у костра истории и легенды. Секция прописывается в '''''custom_data''''' NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[game_info]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stories = &amp;quot;&amp;lt;название_звуковой_темы&amp;gt;&amp;quot;''''' - имена звуковых тем из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несколько тем перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
Существуют следующие истории и легенды:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_01''''' - Граница зоны и граната за 1 действие;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_02''''' - Про трамплин и про камешки;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_03''''' - Про то, как группа Вильнова вернулась;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_04''''' - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_05''''' - Про то, как духманам с контролером сражаться;br&amp;gt;&lt;br /&gt;
:*'''''story_06''''' - Про дверцу, водку и избушку;br&amp;gt;&lt;br /&gt;
:*'''''legend_01''''' - Про эксперимент в Зоне, который производят инопланетяне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_02''''' - Об особо засекреченных лабораториях в зоне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_03''''' - Легенда о проводнике;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_04''''' - Легенда о темном Сталкере;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_05''''' - Легенда о том что глубоко в Зоне спать нельзя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[game_info]&lt;br /&gt;
stories = &amp;quot;story_04, legend_03, legend_04&amp;quot;&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_loot==&lt;br /&gt;
Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в '''''custom_data''''' персонажа прописать следующую секцию:&amp;lt;br&amp;gt;&lt;br /&gt;
'''[dont_spawn_loot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\death_manager.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды=&lt;br /&gt;
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_keep_when_attacked = true/false''''' - NPC продолжает игнорировать бой, даже если в него стреляют – ''только в случае стрельбы игрока''!!!&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_type = {+info –info =func !func ~number} &amp;lt;параметр&amp;gt;''''' - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''camper'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''monolith'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''zombied'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat = {+info –info =func !func ~number} %+info -info =func%''''' - определяет поведение NPC при его уходе в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''companion_enabled = true/false''''' - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы ''xr_attendant.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Отметки на минимапе==&lt;br /&gt;
Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр '''''show_spot'''''. Возможно наличие условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_spot = {+info -info =func !func ~number} true/false''''' - показывать или нет на карте. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
=Схемы для монстров=&lt;br /&gt;
&lt;br /&gt;
==Схема mob_walker==&lt;br /&gt;
Работает аналогично схеме обычного '''''walker'''''. Но есть некоторые отличия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_reset = true/false''''' - не сбрасывать '''''action''''' предыдущей схемы (если нужно сохранить, например, звук). По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кровосососов можно управлять невидимостью, для этого необходимо указать параметр '''''state''''':&lt;br /&gt;
:'''''state = invis/vis''''' - включить/выключить невидимость.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_walker]&lt;br /&gt;
path_walk = x18_snork_walk_1&lt;br /&gt;
path_look = x18_snork_look&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_eluder==&lt;br /&gt;
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_eluder]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path  = &amp;lt;имя_пути&amp;gt;''''' - работает как обычно path_walk. Набор точек патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_capture = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_release = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага больше этого, то он переходит под '''''eluder'''''. По умолчанию – 10 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': '''работает нестабильно'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_eluder]&lt;br /&gt;
path = dar_way_checker&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_eluder.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_remark==&lt;br /&gt;
Ремарковая схема, только не для сталкеров, а для монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state = &amp;lt;параметр&amp;gt;''''' - специфическое состояние данного конкретного монстра (для кровососов - невидимость).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog_cond = {+info, =func, -info, !func ~number}''''' - условия для открытия окна диалога.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимации монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim.head = &amp;lt;название_анимации&amp;gt;''''' - анимации головы монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip = &amp;lt;параметр&amp;gt;''''' - какой значок под светится, при наведении на него курсора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - какой звук издает.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время проигрывания анимаций, используется только для отладки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_remark@hold]&lt;br /&gt;
anim = stand_idle_0&lt;br /&gt;
time = 50000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\mob_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_jump==&lt;br /&gt;
Схема '''''mob_jump''''' служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_jump]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_jump = &amp;lt;имя_пути&amp;gt;''''' - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).&lt;br /&gt;
:Реальная точка учитывает позицию '''''path_jump[0]''''' + смещение, заданное с помощью '''''offset'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ph_jump_factor = &amp;lt;number&amp;gt;''''' - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.&lt;br /&gt;
:Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''offset = &amp;lt;vector&amp;gt;''''' - смещение по осям '''''x''''', '''''y''''', '''''z''''' соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': фактически '''''mob_jump''''' - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал '''''jumped'''''. Т.е. '''''on_signal = jumped | имя_схемы_или_nil''''' – является обязательным параметром в схеме, чтобы знать куда переходить дальше.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе позиции используется первая точка патрульного пути (0-вой индекс).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_jump]&lt;br /&gt;
path_jump = aes_snork_jump1&lt;br /&gt;
ph_jump_factor = 1.8&lt;br /&gt;
offset = 0,0,0&lt;br /&gt;
on_signal = jumped | mob_walker2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_jump.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_camp==&lt;br /&gt;
&lt;br /&gt;
Свойства схемы:&lt;br /&gt;
:*Сидит на позиции, смотрит в точку;&lt;br /&gt;
:*Можно задать несколько позиций и время смены позиции;&lt;br /&gt;
:*Перемещается между позициями бегом;&lt;br /&gt;
:*При виде врага переходит под универсальную схему (комбат/паника и т.д);&lt;br /&gt;
:*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;&lt;br /&gt;
:*Если враг уходит далеко - монстр возвращается на позицию;&lt;br /&gt;
&lt;br /&gt;
'''[mob_camp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которых будет находиться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которые будет смотреть монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_change_point = &amp;lt;number&amp;gt;''''' - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius  = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус  от врага до camp-точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''skip_transfer_enemy = true/false''''' – управляет передачей врагов от друзей. Если установлено в '''''true''''' и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные '''''group''''' разнести).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше '''''home_min_radius''''' - атакуем врага, пока враг не исчезнет или дистанция не будет больше '''''home_max_radius'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.&amp;lt;br&amp;gt;&lt;br /&gt;
Выбор текущей позиции производится случайным образом.&amp;lt;br&amp;gt;&lt;br /&gt;
Индексы точек пути для '''''path_home''''' и '''''path_look''''' должны совпадать (т.е. монстр сидит во второй точке '''''path_home''''' и смотрит во вторую точку '''''path_look''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Единственным необходимым параметром является '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обязательные требованием является:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''home_min_radius &amp;lt; home_max_radius''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_camp]&lt;br /&gt;
path_home = aes2_snork_walk3&lt;br /&gt;
path_look = aes2_snork_look3&lt;br /&gt;
home_min_radius  = 10&lt;br /&gt;
home_max_radius = 15&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_camp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_home==&lt;br /&gt;
Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на '''''mob_home''''', а старые гулаги постепенно переводить на '''''mob_home'''''. У кого рестрикторы работают хорошо и красиво, их можно не трогать. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_home]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - точка, вокруг которой будут держаться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''aggressive_home''''' - в назначенную точку '''''path_home''''' монстры бегут а не идут.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание:&amp;lt;br&amp;gt;&lt;br /&gt;
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри '''''home_min''''' радиуса, иначе прячутся в укрытия. Отсюда следует, что '''''home_min_radius''''' желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. '''''home_max_radius''''' сделан по принципу большого рестриктера в схеме '''''mob_camp'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': добавлена возможность задания минимального и максимального радиусов для схемы '''''mob_home''''' в флагах первой точки пути ('''''path_home'''''). Для этого введены флаги '''''minr''''' и '''''maxr'''''. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из '''''секции'''''. Если не задано ни там, ни там, то берутся дефолтные значения.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_home@gar_boars_nest]&lt;br /&gt;
path_home = home&lt;br /&gt;
home_min_radius = 25&lt;br /&gt;
home_max_radius = 50&lt;br /&gt;
aggressive_home&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_home.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_fake_death==&lt;br /&gt;
&lt;br /&gt;
Появилась схема '''''mob_fake_death''''' для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_fake_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При входе в схему зомби падает, при выходе из схемы встает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_fake_death]&lt;br /&gt;
on_actor_dist_le = 5 | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_fake_death.script''&lt;br /&gt;
&lt;br /&gt;
=Секции для монстров=&lt;br /&gt;
&lt;br /&gt;
==Секция mob_combat==&lt;br /&gt;
Секция работает аналогично схеме '''''combat''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = mob_combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@val_sos_bs]&lt;br /&gt;
...&lt;br /&gt;
on_combat = mob_combat&lt;br /&gt;
&lt;br /&gt;
[mob_combat]&lt;br /&gt;
on_info = nil %=disable_combat_handler%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_combat.script''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция mob_death==&lt;br /&gt;
Секция работает аналогично схеме '''''death''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = mob_death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти монстра.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@gar_boars_nest_rush]&lt;br /&gt;
...&lt;br /&gt;
on_death = mob_death@gar_boars_rush&lt;br /&gt;
&lt;br /&gt;
[mob_death@gar_boars_rush]&lt;br /&gt;
on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_death.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды для монстров=&lt;br /&gt;
'''''actor_friendly = true/false''''' - если '''''true''''', то монстр не атакует актера, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''npc_friendly = true/false''''' - если '''''true''''', то монстр не атакует сталкеров и монстров, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''friendly = true/false''''' - если '''''true''''', то монстр не атакует никого до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''braindead = true/false''''' - если '''''true''''', то монстр игнорирует любые атаки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Общая секция spawner=&lt;br /&gt;
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в ''Level editor'' флажок '''''no_move_in_offline''''' и отключен '''''can_switch_offline'''''. Спавнер прописывается в '''''custom_data''''' объекта перед секцией '''''logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия для спавна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как объект заспавнился, его берет под управление скрипт '''''Logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[spawner]&lt;br /&gt;
cond = {+esc_boar_dogs_restrictor}&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_spawner.script''&lt;br /&gt;
&lt;br /&gt;
==Спавн монстров дневных и ночных==&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {=is_day}''''' – спавнить монстра только днем (если надо ночью, то пишем {!is_day})&amp;lt;br&amp;gt;&lt;br /&gt;
'''''check_distance = true''''' – проверка на наличие персонажа рядом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_distance = 100''''' – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 3]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T19:46:10Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.2. Схема работы кнопки, секция [ph_button] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_cutscene]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого переносится игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого смотрит игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''pp_effector = &amp;lt;имя_постэффекта&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cam_effector = &amp;lt;имя_анимации_камеры&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''cameff_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_cutscene&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&lt;br /&gt;
point = agr_cutscene_walk&lt;br /&gt;
look = agr_cutscene_look&lt;br /&gt;
cam_effector = agroprom_demo&lt;br /&gt;
on_signal = cameff_end | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_cutscene.script''&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==Схема ph_button==&lt;br /&gt;
&lt;br /&gt;
Схема работы кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_button]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_blend = true/false''''' – плаваня, сглаженная анимация.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' – анимация, которая отыгрывается при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_press = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - что произойдёт при нажатии на кнопку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tooltip - &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''. Подсказка при наведении.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы:'''''&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_button@rad_on&lt;br /&gt;
&lt;br /&gt;
[ph_button@rad_on]&lt;br /&gt;
anim_blend  = true&lt;br /&gt;
anim        = lab_primary_switcher_idle&lt;br /&gt;
tooltip     = tips_rad_switcher_press&lt;br /&gt;
on_press    = ph_button@rad_off % +bar_deactivate_radar_done%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_button.script''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 4]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2</id>
		<title>Настройка логики. Часть 2</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2"/>
				<updated>2012-05-07T19:39:00Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Секция mob_death */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Секции.=&lt;br /&gt;
==Секция combat==&lt;br /&gt;
Показывает, что происходит, когда NPC срывается в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info =  {+info -info =func !func ~number}%+info -info =func%''''' -  эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В следующем примере сталкер сражается:&amp;lt;br&amp;gt;&lt;br /&gt;
:*по-камперски, если враг - актёр и он дальше Х метров;&lt;br /&gt;
:*по-монолитовски, если любой враг дальше Y метров;&lt;br /&gt;
:*иначе - движковый бой.&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = ...&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, &amp;lt;br&amp;gt;{=fighting_ge_Y_meters} monolith&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;function fighting_dist_ge_20(actor, npc)&lt;br /&gt;
    return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) &amp;gt;= 400 &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
'''''Примечание''''': 400 – это 20&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = nil&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = zombied&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом   '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Помните(!)''''': оверрайд всегда будет перекрывать настройку в секции '''''combat'''''. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker1&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker1]&lt;br /&gt;
...&lt;br /&gt;
[walker2]&lt;br /&gt;
...&lt;br /&gt;
[walker3]&lt;br /&gt;
...&lt;br /&gt;
combat_type = monolith&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = camper&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_effects.script'' есть функция отключающая секцию '''''combat''''' - '''''disable_combat_handler'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Секция death==&lt;br /&gt;
Схема показывает, что происходит при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_death = death@mil_freedom_max_combat1&lt;br /&gt;
&lt;br /&gt;
[death@mil_freedom_max_combat1]&lt;br /&gt;
on_info = %=military_max_dead +sar2_death_47%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_death.script''&lt;br /&gt;
&lt;br /&gt;
==Cекция hit==&lt;br /&gt;
Схема показывает, что происходит при нанесении повреждения NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit = hit'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[hit]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если NPC нанесён хит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit''''' НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_hit = on_hit@agr_factory_hold_fake&lt;br /&gt;
&lt;br /&gt;
[on_hit@agr_factory_hold_fake]&lt;br /&gt;
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_hit.script''&lt;br /&gt;
&lt;br /&gt;
==Секция actor_dialogs==&lt;br /&gt;
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''actor_dialogs = actor_dialogs'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[actor_dialogs]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''id = &amp;lt;название_диалога&amp;gt;''''' - доступные диалоги, перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''disable = &amp;lt;название_диалога&amp;gt;''''' - запрещенные диалоги, тоже через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
actor_dialogs = actor_dialogs&lt;br /&gt;
&lt;br /&gt;
[actor_dialbr&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значениеogs]&lt;br /&gt;
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
==Секция use==&lt;br /&gt;
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.&lt;br /&gt;
&lt;br /&gt;
'''''on_use = use'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[use]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_use = use@mil_dolg_leader&lt;br /&gt;
 &lt;br /&gt;
[use@mil_dolg_leader]&lt;br /&gt;
on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_use.script''&lt;br /&gt;
&lt;br /&gt;
==Секция combat_ignore==&lt;br /&gt;
Если для NPC установлена данная секция то он, не переходит в боевой режим.&amp;lt;br&amp;gt;&lt;br /&gt;
Для секции нет дополнительных полей.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = combat_ignore'''''&lt;br /&gt;
&lt;br /&gt;
'''[combat_ignore]'''&lt;br /&gt;
&lt;br /&gt;
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker] '''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для оверрайда задать значение '''''always''''', то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20м;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_actor''''' - текущий враг актёр?;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''check_fighting''''' - проверка (по '''''story_id''''') того, что нашим врагом есть хотя бы кто-то один из списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat_ignore.script''&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_character_supplies==&lt;br /&gt;
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в в его профиле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[dont_spawn_character_supplies]'''&lt;br /&gt;
&lt;br /&gt;
==Секция threshold==&lt;br /&gt;
Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''threshold = threshold'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[threshold]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_ignore_distance = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_monster = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': второй параметр следует менять '''ОЧЕНЬ''' осторожно. Помните, в него нужно вписывать значение ''от 0 до 1''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
threshold = threshold@mil_fbarier&lt;br /&gt;
&lt;br /&gt;
[threshold@mil_fbarier]&lt;br /&gt;
max_ignore_distance = 150&lt;br /&gt;
ignore_monster = 0.1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
==Секция Danger==&lt;br /&gt;
Секцию необходимо указывать '''только для какой-то конкретной схемы'''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''danger = danger_condition'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[danger_condition]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется &amp;quot;живая&amp;quot; опасность (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_grenade = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется граната (15 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_corpse = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется труп (10 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_hit = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется хит (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_sound = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется звук (50 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_grenade = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о гранате (20000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_corpse = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о трупе (10000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_hit = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о хите (60000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_sound = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о звуке (15000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_ricochet = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о рикошете (30000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_expiration_time = &amp;lt;number&amp;gt;''''' - время, через которое денжер перестанет быть акутальным. (5000 миллисекунд по умолчанию)&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': NPC в принципе игнорируют авто с секцией '''''m_car'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера '''''danger_condition@1''''', '''''danger_condition@2''''' и так далее.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[camper@dar_military_scout_camper3]&lt;br /&gt;
...&lt;br /&gt;
danger = danger_condition@scout&lt;br /&gt;
&lt;br /&gt;
[danger_condition@scout]&lt;br /&gt;
ignore_distance       = 10&lt;br /&gt;
ignore_distance_grenade = 10&lt;br /&gt;
ignore_distance_corpse  = 0&lt;br /&gt;
ignore_distance_danger_hit     = 20&lt;br /&gt;
ignore_distance_sound   = 0 &lt;br /&gt;
danger_inertion_time_hit = 1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata_1006\scripts\xr_danger.script''&lt;br /&gt;
&lt;br /&gt;
==Секция game_info==&lt;br /&gt;
&amp;quot;Обучает&amp;quot; NPC рассказывать у костра истории и легенды. Секция прописывается в '''''custom_data''''' NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[game_info]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stories = &amp;quot;&amp;lt;название_звуковой_темы&amp;gt;&amp;quot;''''' - имена звуковых тем из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несколько тем перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
Существуют следующие истории и легенды:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_01''''' - Граница зоны и граната за 1 действие;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_02''''' - Про трамплин и про камешки;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_03''''' - Про то, как группа Вильнова вернулась;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_04''''' - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_05''''' - Про то, как духманам с контролером сражаться;br&amp;gt;&lt;br /&gt;
:*'''''story_06''''' - Про дверцу, водку и избушку;br&amp;gt;&lt;br /&gt;
:*'''''legend_01''''' - Про эксперимент в Зоне, который производят инопланетяне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_02''''' - Об особо засекреченных лабораториях в зоне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_03''''' - Легенда о проводнике;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_04''''' - Легенда о темном Сталкере;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_05''''' - Легенда о том что глубоко в Зоне спать нельзя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[game_info]&lt;br /&gt;
stories = &amp;quot;story_04, legend_03, legend_04&amp;quot;&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_loot==&lt;br /&gt;
Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в '''''custom_data''''' персонажа прописать следующую секцию:&amp;lt;br&amp;gt;&lt;br /&gt;
'''[dont_spawn_loot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\death_manager.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды=&lt;br /&gt;
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_keep_when_attacked = true/false''''' - NPC продолжает игнорировать бой, даже если в него стреляют – ''только в случае стрельбы игрока''!!!&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_type = {+info –info =func !func ~number} &amp;lt;параметр&amp;gt;''''' - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''camper'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''monolith'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''zombied'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat = {+info –info =func !func ~number} %+info -info =func%''''' - определяет поведение NPC при его уходе в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''companion_enabled = true/false''''' - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы ''xr_attendant.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Отметки на минимапе==&lt;br /&gt;
Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр '''''show_spot'''''. Возможно наличие условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_spot = {+info -info =func !func ~number} true/false''''' - показывать или нет на карте. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
=Схемы для монстров=&lt;br /&gt;
&lt;br /&gt;
==Схема mob_walker==&lt;br /&gt;
Работает аналогично схеме обычного '''''walker'''''. Но есть некоторые отличия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_reset = true/false''''' - не сбрасывать '''''action''''' предыдущей схемы (если нужно сохранить, например, звук). По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кровосососов можно управлять невидимостью, для этого необходимо указать параметр '''''state''''':&lt;br /&gt;
:'''''state = invis/vis''''' - включить/выключить невидимость.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_walker]&lt;br /&gt;
path_walk = x18_snork_walk_1&lt;br /&gt;
path_look = x18_snork_look&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_eluder==&lt;br /&gt;
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_eluder]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path  = &amp;lt;имя_пути&amp;gt;''''' - работает как обычно path_walk. Набор точек патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_capture = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_release = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага больше этого, то он переходит под '''''eluder'''''. По умолчанию – 10 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': '''работает нестабильно'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_eluder]&lt;br /&gt;
path = dar_way_checker&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_eluder.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_remark==&lt;br /&gt;
Ремарковая схема, только не для сталкеров, а для монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state = &amp;lt;параметр&amp;gt;''''' - специфическое состояние данного конкретного монстра (для кровососов - невидимость).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog_cond = {+info, =func, -info, !func ~number}''''' - условия для открытия окна диалога.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимации монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim.head = &amp;lt;название_анимации&amp;gt;''''' - анимации головы монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip = &amp;lt;параметр&amp;gt;''''' - какой значок под светится, при наведении на него курсора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - какой звук издает.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время проигрывания анимаций, используется только для отладки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_remark@hold]&lt;br /&gt;
anim = stand_idle_0&lt;br /&gt;
time = 50000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\mob_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_jump==&lt;br /&gt;
Схема '''''mob_jump''''' служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_jump]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_jump = &amp;lt;имя_пути&amp;gt;''''' - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).&lt;br /&gt;
:Реальная точка учитывает позицию '''''path_jump[0]''''' + смещение, заданное с помощью '''''offset'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ph_jump_factor = &amp;lt;number&amp;gt;''''' - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.&lt;br /&gt;
:Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''offset = &amp;lt;vector&amp;gt;''''' - смещение по осям '''''x''''', '''''y''''', '''''z''''' соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': фактически '''''mob_jump''''' - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал '''''jumped'''''. Т.е. '''''on_signal = jumped | имя_схемы_или_nil''''' – является обязательным параметром в схеме, чтобы знать куда переходить дальше.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе позиции используется первая точка патрульного пути (0-вой индекс).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_jump]&lt;br /&gt;
path_jump = aes_snork_jump1&lt;br /&gt;
ph_jump_factor = 1.8&lt;br /&gt;
offset = 0,0,0&lt;br /&gt;
on_signal = jumped | mob_walker2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_jump.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_camp==&lt;br /&gt;
&lt;br /&gt;
Свойства схемы:&lt;br /&gt;
:*Сидит на позиции, смотрит в точку;&lt;br /&gt;
:*Можно задать несколько позиций и время смены позиции;&lt;br /&gt;
:*Перемещается между позициями бегом;&lt;br /&gt;
:*При виде врага переходит под универсальную схему (комбат/паника и т.д);&lt;br /&gt;
:*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;&lt;br /&gt;
:*Если враг уходит далеко - монстр возвращается на позицию;&lt;br /&gt;
&lt;br /&gt;
'''[mob_camp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которых будет находиться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которые будет смотреть монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_change_point = &amp;lt;number&amp;gt;''''' - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius  = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус  от врага до camp-точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''skip_transfer_enemy = true/false''''' – управляет передачей врагов от друзей. Если установлено в '''''true''''' и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные '''''group''''' разнести).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше '''''home_min_radius''''' - атакуем врага, пока враг не исчезнет или дистанция не будет больше '''''home_max_radius'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.&amp;lt;br&amp;gt;&lt;br /&gt;
Выбор текущей позиции производится случайным образом.&amp;lt;br&amp;gt;&lt;br /&gt;
Индексы точек пути для '''''path_home''''' и '''''path_look''''' должны совпадать (т.е. монстр сидит во второй точке '''''path_home''''' и смотрит во вторую точку '''''path_look''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Единственным необходимым параметром является '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обязательные требованием является:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''home_min_radius &amp;lt; home_max_radius''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_camp]&lt;br /&gt;
path_home = aes2_snork_walk3&lt;br /&gt;
path_look = aes2_snork_look3&lt;br /&gt;
home_min_radius  = 10&lt;br /&gt;
home_max_radius = 15&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_camp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_home==&lt;br /&gt;
Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на '''''mob_home''''', а старые гулаги постепенно переводить на '''''mob_home'''''. У кого рестрикторы работают хорошо и красиво, их можно не трогать. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_home]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - точка, вокруг которой будут держаться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''aggressive_home''''' - в назначенную точку '''''path_home''''' монстры бегут а не идут.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание:&amp;lt;br&amp;gt;&lt;br /&gt;
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри '''''home_min''''' радиуса, иначе прячутся в укрытия. Отсюда следует, что '''''home_min_radius''''' желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. '''''home_max_radius''''' сделан по принципу большого рестриктера в схеме '''''mob_camp'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': добавлена возможность задания минимального и максимального радиусов для схемы '''''mob_home''''' в флагах первой точки пути ('''''path_home'''''). Для этого введены флаги '''''minr''''' и '''''maxr'''''. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из '''''секции'''''. Если не задано ни там, ни там, то берутся дефолтные значения.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_home@gar_boars_nest]&lt;br /&gt;
path_home = home&lt;br /&gt;
home_min_radius = 25&lt;br /&gt;
home_max_radius = 50&lt;br /&gt;
aggressive_home&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_home.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_fake_death==&lt;br /&gt;
&lt;br /&gt;
Появилась схема '''''mob_fake_death''''' для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_fake_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При входе в схему зомби падает, при выходе из схемы встает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_fake_death]&lt;br /&gt;
on_actor_dist_le = 5 | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_fake_death.script''&lt;br /&gt;
&lt;br /&gt;
=Секции для монстров=&lt;br /&gt;
&lt;br /&gt;
==Секция mob_combat==&lt;br /&gt;
Секция работает аналогично схеме '''''combat''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = mob_combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@val_sos_bs]&lt;br /&gt;
...&lt;br /&gt;
on_combat = mob_combat&lt;br /&gt;
&lt;br /&gt;
[mob_combat]&lt;br /&gt;
on_info = nil %=disable_combat_handler%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_combat.script''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция mob_death==&lt;br /&gt;
Секция работает аналогично схеме '''''death''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = mob_death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти монстра.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@gar_boars_nest_rush]&lt;br /&gt;
...&lt;br /&gt;
on_death = mob_death@gar_boars_rush&lt;br /&gt;
&lt;br /&gt;
[mob_death@gar_boars_rush]&lt;br /&gt;
on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_death.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды для монстров=&lt;br /&gt;
'''''actor_friendly = true/false''''' - если '''''true''''', то монстр не атакует актера, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''npc_friendly = true/false''''' - если '''''true''''', то монстр не атакует сталкеров и монстров, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''friendly = true/false''''' - если '''''true''''', то монстр не атакует никого до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''braindead = true/false''''' - если '''''true''''', то монстр игнорирует любые атаки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Общая секция spawner=&lt;br /&gt;
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в ''Level editor'' флажок '''''no_move_in_offline''''' и отключен '''''can_switch_offline'''''. Спавнер прописывается в '''''custom_data''''' объекта перед секцией '''''logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия для спавна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как объект заспавнился, его берет под управление скрипт '''''Logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[spawner]&lt;br /&gt;
cond = {+esc_boar_dogs_restrictor}&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_spawner.script''&lt;br /&gt;
&lt;br /&gt;
==Спавн монстров дневных и ночных==&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {=is_day}''''' – спавнить монстра только днем (если надо ночью, то пишем {!is_day})&amp;lt;br&amp;gt;&lt;br /&gt;
'''''check_distance = true''''' – проверка на наличие персонажа рядом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_distance = 100''''' – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 3]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T19:33:44Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Часть 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_cutscene]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого переносится игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого смотрит игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''pp_effector = &amp;lt;имя_постэффекта&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cam_effector = &amp;lt;имя_анимации_камеры&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''cameff_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_cutscene&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&lt;br /&gt;
point = agr_cutscene_walk&lt;br /&gt;
look = agr_cutscene_look&lt;br /&gt;
cam_effector = agroprom_demo&lt;br /&gt;
on_signal = cameff_end | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_cutscene.script''&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 4]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1</id>
		<title>Настройка логики. Часть 1</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1"/>
				<updated>2012-05-07T19:32:26Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема meet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font size=6&amp;gt;Настройки логики&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Система флагов (path_walk, path_look)=&lt;br /&gt;
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем &amp;quot;'''''wp00'''''&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wp00|flag1|flag2'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_walk''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a=state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при перемещении (Только из раздела &amp;quot;Ходячие состояния&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''p=percent'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути *'''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_look''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a =state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов &amp;quot;Стоячие&amp;quot; и &amp;quot;Сидячие&amp;quot; состояния)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''t=msec''' - время в миллисекундах, которое персонаж должен смотреть в заданную точку.&amp;lt;br&amp;gt;&lt;br /&gt;
:'''*''' – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
:Для конечных (терминальных) вершин пути '''''path_walk''''', у которых не более 1-й соответствующей точки '''path_look''', значение '''''t''''' всегда считается бесконечным и его явно задавать не нужно.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:После поворота в точку '''''path_look''''', установить сигнал с именем '''''name'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''syn'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком '''''syn''''' не прибудут все персонажи с данным '''''team'''''-ом ('''''team''''' задается в виде текстовой строки в '''''customdata'''''). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою '''''idle''''' анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sigtm=signal'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает сигнал при вызове '''''time_callback'''''-а '''''state manager'''''-ом. Соответственно, если '''''t=0''''', то сигнал будет установлен после отыгрывания '''''init''''' анимации. Это используется, например, с анимацией '''''press''''', которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.&amp;lt;br&amp;gt;&lt;br /&gt;
:В пути '''''path_look''''' можно сделать:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;wp00|a=press|t=0|sigtm=pressed&amp;lt;/ini&amp;gt;&lt;br /&gt;
:А затем переключить схему:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_signal = pressed | другая_схема&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Более подробное описание путей.==&lt;br /&gt;
&lt;br /&gt;
Настройка:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_1.JPG]]&lt;br /&gt;
&lt;br /&gt;
На карту для каждого walker-а нужно поставить:&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_walk''''', по которому '''''walker''''' ходит.&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_look''''', состоящий из точек, в которые '''''walker''''' смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Walker'''''-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если персонаж должен стоять на месте, то ему задается одна точка пути '''''path_walk''''' и как минимум одна точка пути '''''path_look''''', хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила расстановки флажков в путях рассмотрим на нескольких примерах:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 1:===&lt;br /&gt;
&lt;br /&gt;
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_2.JPG]]&lt;br /&gt;
&lt;br /&gt;
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути '''''path_walk''''' существуют флажки.&amp;lt;br&amp;gt;&lt;br /&gt;
У каждого вейпоинта есть имя: '''''wp00''''', '''''wp01''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘'''|'''’. Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=threat''''' то персонаж пойдет в состоянии данжер, если '''''a=raid''''' то побежит с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_walk''''' используются анимации '''ТОЛЬКО''' из раздела «Ходячие состояния»!&lt;br /&gt;
&lt;br /&gt;
===Пример 2:===&lt;br /&gt;
[[Изображение:Logic_3.JPG]]&lt;br /&gt;
&lt;br /&gt;
Разговор персонажа.&lt;br /&gt;
&lt;br /&gt;
Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существуют следующие поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s = имя_звуковой_схемы''''' - (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
===Пример 3:===&lt;br /&gt;
[[Изображение:Logic_4.JPG]]&lt;br /&gt;
&lt;br /&gt;
В примере 3 используется только поле '''''s''''', чтобы задать тему разговора, и флажок '''''sc''''', чтобы показать, что звук проигрывается не разово, а периодически.&amp;lt;br&amp;gt;&lt;br /&gt;
Остальные параметры ('''''sp''''', '''''sf''''', '''''st''''') задавать НЕ РЕКОМЕНДУЕТСЯ, значения по умолчанию приемлемы для большинства скриптов.&amp;lt;br&amp;gt;&lt;br /&gt;
Параметр '''''sa''''' также использовать НЕ РЕКОМЕНДУЕТСЯ. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути '''''path_look''''', о котором будет написано ниже.&amp;lt;br&amp;gt;&lt;br /&gt;
Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 4:=== &lt;br /&gt;
усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_5.JPG]]&lt;br /&gt;
&lt;br /&gt;
Что добавилось в этом примере? Путь '''''path_look''''' с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее, в точках путей '''''path_walk''''' и '''''path_look''''', которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки (в ''ACDC'' поле '''''flags'''''). Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь персонаж будет останавливаться в точках '''''path_walk''''', помеченных флажком, и смотреть в точку '''''path_look''''', помеченную тем же самым флажком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если точка '''''path_walk'''''  не помечена флажком, персонаж проходит ее не останавливаясь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одной точке '''''path_walk''''' может соответствовать несколько точек '''''path_look'''''. Тогда персонаж выберем случайно одну из подходящих точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По аналогии с '''''path_walk''''', в точках пути '''''path_look''''' можно использовать различные флажки, меняющие поведение:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''p = 100''''' – вероятность, с которой персонаж посмотрит именно в эту точку. Значения '''''p''''' всех подходящих точек суммируются, т.е. если у одной точки '''''p = 100''''', а у другой '''''p = 300''''', то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).&lt;br /&gt;
Во избежание путаницы, рекомендуется задавать '''''p''''' так, чтобы их сумма составляла '''100'''.&lt;br /&gt;
По умолчанию у всех точек '''''p = 100'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''t = 5000''''' - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 5:===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_6.JPG]]&lt;br /&gt;
&lt;br /&gt;
В этом примере проходя через точку '''''wp00''''', персонаж с вероятностью 30% посмотрит в точку '''''wp00''''' в течение 5 секунд, но с вероятностью 70% посмотрит в точку '''''wp01''''' в течении 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию при остановках персонаж играет анимацию '''''idle''''', если он не в состоянии '''''crouch''''', либо анимацию '''''hide''''', если он в состоянии '''''crouch'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если требуется другая анимация, можно ее указать с помощью флажка:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''a = имя_анимации''''' - (по умолчанию '''''idle'''''). &amp;lt;br&amp;gt;&lt;br /&gt;
Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет  с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»!&lt;br /&gt;
&lt;br /&gt;
==Система флагов для монстров==&lt;br /&gt;
Флаги пути движения:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s=имя_звуковой_темы'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает звуковую тему на пути в данную точку ('''''idle''''', '''''eat''''', '''''attack''''', '''''attack_hit''''', '''''take_damage''''', '''''die''''', '''''threaten''''', '''''steal''''', '''''panic''''', '''''growling''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''с'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы вприсядку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''r'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы бег.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sig=name'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b=vis/invis'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Флаг, исключительно для кровососа. Управляет невидимостью ('''''vis''''' - отключена, '''''invis''''' - включена).&lt;br /&gt;
&lt;br /&gt;
Флаги пути обзора:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''t=msec'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Время в миллисекундах, которое нужно ждать, смотря в точку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''a=state'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Анимация ('''''stand_idle''''', '''''sit_idle''''', '''''lie_idle''''', '''''eat''''', '''''sleep''''', '''''rest''''', '''''attack''''', '''''look_around''''', '''''turn''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Случайный выбор пути==&lt;br /&gt;
По поводу точек пути '''''path_walk'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:[[Файл:Random_path.jpg]]&lt;br /&gt;
&lt;br /&gt;
Нам требуется, чтобы НПС стоящий в точке '''''p0''''' патрулировал территорию по двум цикличным маршрутам:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p1 -&amp;gt; p2 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p3 -&amp;gt; p4 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
Чтобы задать вариацию выбора маршрута относительно точки '''''p0''''', нужно в ссылке на следующую точку пути указать не одну, а две точки:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек '''''p1''''' или '''''p3'''''. После возврата в точку '''''p0''''' выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;а в точке '''''p1''''', также задать выбор:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(1), p3(1)&amp;lt;/ini&amp;gt;&lt;br /&gt;
'''НО!'''&lt;br /&gt;
Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема '''НЕ ПРИЕМЛЕМА''' и, лично у меня, вызывает вылет:[[Файл:Error_random_path.jpg]]&lt;br /&gt;
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(0.75), p3(0.25)&amp;lt;/ini&amp;gt;то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще.&lt;br /&gt;
&lt;br /&gt;
=Схемы поведения сталкеров.=&lt;br /&gt;
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема walker==&lt;br /&gt;
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;'''''    - основной путь, по которому ходит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;'''''    - путь, куда смотрит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team      = &amp;lt;имя_команды&amp;gt;''''' - команда для синхронизации&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving1 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving2 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она не слишком далеко ('''''rush''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving3 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она далеко ('''''sprint''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_standing = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker@pri_followers_leader_wave1_wait]&lt;br /&gt;
path_walk = wave1_leader_walk2&lt;br /&gt;
path_look = wave1_leader_look2&lt;br /&gt;
def_state_moving1 = assault&lt;br /&gt;
def_state_moving2 = assault&lt;br /&gt;
team = followers&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема remark==&lt;br /&gt;
Схема используется для синхронизации\связки других схем.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.&lt;br /&gt;
&lt;br /&gt;
'''[remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук ремарка, берётся из файла ''sound_theme.script''. По умолчанию  '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимация ремарка, по умолчанию '''''wait'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - куда смотрит сталкер. Есть следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значение&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' – без комментариев&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' – позиция вычисленная АИ автоматически&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;имя работы&amp;gt;,&amp;lt;имя гулага&amp;gt;''''' - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = logic@cit_killers_base_guard, cit_killers&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;path_name&amp;gt;,&amp;lt;point_number&amp;gt;''''' - можно указывать смотреть в вершину патрульного пути (&amp;lt;имя пути&amp;gt;,&amp;lt;имя точки&amp;gt;).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = cit_killers_kamp5,0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': теперь если значение не задано, то оно равно '''''nil''''' а не '''''actor''''', как было раньше.&amp;lt;br&amp;gt;&lt;br /&gt;
:То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение '''''nil''''', то персонаж развернется в позицию, которую посчитает АИ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': &amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''sound_end''''' – по окончании проигрывания звуковой схемы&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''anim_end''''' – по окончании проигрывания анимации&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[remark@esc_lager_volk2]&lt;br /&gt;
anim = guard_rac&lt;br /&gt;
snd = esc_wolf_radio&lt;br /&gt;
target = actor&lt;br /&gt;
on_signal = sound_end| remark@esc_lager_volk3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sleeper==&lt;br /&gt;
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sleeper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_main = &amp;lt;имя_пути&amp;gt;''''' - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[sleeper@esc_blockpost_sleep1]&lt;br /&gt;
path_main = sleep1&lt;br /&gt;
wakeable = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_sleeper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема kamp==&lt;br /&gt;
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.&amp;lt;br&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
'''[kamp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''center_point = &amp;lt;имя_пути&amp;gt;''''' – имя точки вокруг которой NPC будет устраиваться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние, в котором NPC будет идети к точке кампа. По умолчанию - '''''ran'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит.&amp;lt;br&amp;gt;&lt;br /&gt;
:Чтобы этого не случалось в секции кемпа указывать '''''path_walk''''' из одной точке, название которой '''''&amp;lt;path_kamp_name&amp;gt;_task''''':&amp;lt;ini&amp;gt;path_walk = &amp;lt;имя_пути&amp;gt;_task&amp;lt;/ini&amp;gt;Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[kamp@esc_blockpost_kamp1]&lt;br /&gt;
center_point = kamp_center&lt;br /&gt;
path_walk = kamp_center_task&lt;br /&gt;
def_state_moving = raid&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_kamp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема camper==&lt;br /&gt;
Свойства камперов:&lt;br /&gt;
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;&amp;lt;br&amp;gt;&lt;br /&gt;
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[camper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания.&lt;br /&gt;
:Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите камперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию - '''''assault'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути.&lt;br /&gt;
:По умолчанию - '''''sneak_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию - '''''hide'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''attack_sound = &amp;lt;имя_звуковой_темы&amp;gt;''''' - возможность переопределять снайперам/камперам звук атаки. По дефолту он равен звуковой теме '''''fight_attack'''''.&lt;br /&gt;
:Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''shoot = &amp;lt;тип_стрельбы&amp;gt;''''' - возможны следующие значения:&lt;br /&gt;
:*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - не стреляет вообще;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),&amp;lt;br&amp;gt;&lt;br /&gt;
:то он тупо продолжает стоять на старом месте и ждать следующей пули.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кампера. Используйте '''''walker''''' в таких случаях, а камперов стоить ставить для атак по путям и как снайперов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@dar_military_scout_hide]&lt;br /&gt;
path_walk = walk_hide&lt;br /&gt;
path_look = look_hide&lt;br /&gt;
radius = 10&lt;br /&gt;
no_retreat = true&lt;br /&gt;
def_state_moving = assault&lt;br /&gt;
def_state_campering = hide_na&lt;br /&gt;
shoot = always&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sniper==&lt;br /&gt;
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В кастом дате кемпера прописать:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;sniper = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@esc_blockpost_camper_day]&lt;br /&gt;
path_walk = camper_day_walk&lt;br /&gt;
path_look = camper_day_look&lt;br /&gt;
sniper = true&lt;br /&gt;
def_state_campering = threat&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Ставить снайперу только 2 точки '''''look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема follower== &lt;br /&gt;
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Пути не задаются&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[follower]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''leader = &amp;lt;number&amp;gt;''''' - '''''story_id''''' лидера из ''game.ltx'' (число!).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation_line = true/false''''' - постарается идти сбоку от лидера, в противном случае будет идти сзади.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''distance = &amp;lt;number&amp;gt;''''' - расстояние в метрах, на котором будет идти от лидера '''''attendant'''''. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state_if_leader_in_meet = &amp;lt;название_анимации&amp;gt;''''' - это есть строка с именем  состояния из '''''state_manager''''', которое будет назначено '''''follower'''''-ам, если командир пребывает в состоянии '''''meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_walk = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер идет за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_run = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер бежит за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_sprint = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер спринтует за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Не забыть прописать:&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrains]&lt;br /&gt;
none = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Иначе NPC засосёт в гулаг и никуда он не пойдёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все это происходит под гулагом, то вместо '''''story_id''''' лидера, мы прописываем его секцию логики в файле скрипта.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;lua&amp;gt;t = { section = &amp;quot;logic@bar_arena_follower_2&amp;quot;, &lt;br /&gt;
      idle    = 0,&lt;br /&gt;
      prior   = 7,&lt;br /&gt;
      state   = {0},&lt;br /&gt;
      squad   = squad,&lt;br /&gt;
      group   = groups[0],&lt;br /&gt;
      ...&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;В данном случае для параметра '''''leader''''' необоходимо указать строку '''''bar_arena_follower_2'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': в релизе игры данная схема не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_attendant.script''&lt;br /&gt;
&lt;br /&gt;
==Схема zoneguard==&lt;br /&gt;
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[zoneguard]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team = &amp;lt;имя_команды&amp;gt;''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_guard = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой игрок будет атакован.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_warn = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой NPC будет начинать разговор с игроком.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''walker_team = &amp;lt;имя_команды&amp;gt;''''' -  для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_greet = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук которой будет проигран при обнаружении игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - какую отыгрывает анимацию, если игрок ему не враждебен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[zoneguard]&lt;br /&gt;
path_walk = mil_freedom_zoneguard_walk_kill2&lt;br /&gt;
path_look = mil_freedom_zoneguard_look_kill2&lt;br /&gt;
zone_warn = mil_freedom_leader_warn_zone&lt;br /&gt;
zone_guard = mil_freedom_leader_kill_zone&lt;br /&gt;
no_move = true&lt;br /&gt;
team = freedom_bodyguards3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_zoneguard.script''&lt;br /&gt;
&lt;br /&gt;
==Схема wounded==&lt;br /&gt;
Схема раненного. Определяет поведение NPC в состоянии &amp;quot;раненный&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.&lt;br /&gt;
&lt;br /&gt;
'''[wounded]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он не видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state_see = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''psy_state = &amp;lt;PSY&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному '''''PSY'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_victim = &amp;lt;HP&amp;gt;|&amp;lt;параметр&amp;gt;''''' - куда будет смотреть NPC при значении уровня его здоровья равному '''''HP''''', возможные параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - числовое значение;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&lt;br /&gt;
:*'''''nil''''' - позиция вычисленная АИ автоматически.&lt;br /&gt;
'''''hp_cover = &amp;lt;HP&amp;gt;|true/false''''' - идти в укрытие или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_fight = &amp;lt;HP&amp;gt;|true/false''''' - разрешено воевать или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''syndata = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - синхропары для красоты.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить диалог, вместо стандартного '''''actor_help_wounded'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_start_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;xml&amp;gt;&amp;lt;precondition&amp;gt;dialogs.allow_wounded_dialog&amp;lt;/precondition&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
'''''Примечание''''': если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно.&lt;br /&gt;
:Для параметров '''''hp_state_see''''', '''''psy_state''''', '''''hp_victim''''', '''''hp_cover''''', '''''hp_fight''''' способ такой же.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы &amp;lt;small&amp;gt;(в качестве примера взята дефолтная настройка)'''''&amp;lt;/small&amp;gt;:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&lt;br /&gt;
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy&lt;br /&gt;
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|psy_shoot,psy_pain@wounded_psy_shoot,wounded_psy&lt;br /&gt;
hp_victim = 30|actor|10|nil&lt;br /&gt;
hp_cover = 30|true|10|false&lt;br /&gt;
hp_fight = 30|true|10|false&lt;br /&gt;
syndata = wounded@help&lt;br /&gt;
;best_pistol – проверка на то, что лучшее оружие NPC является пистолетом.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_wounded.script''&lt;br /&gt;
&lt;br /&gt;
==Схема rest==&lt;br /&gt;
Чувак гуляет, хавает, спит.&amp;lt;br&amp;gt;&lt;br /&gt;
Нормально не работает, посему в релизе не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_rest.script''&lt;br /&gt;
&lt;br /&gt;
==Схема heli_hunter==&lt;br /&gt;
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:&amp;lt;br&amp;gt;&lt;br /&gt;
В активную схему вставляется параметр:&amp;lt;ini&amp;gt;heli_hunter = {+info -info =func !func ~number}true/false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;ini&amp;gt;[camper@bar_freedom_attack_sniper_1]&lt;br /&gt;
path_walk = camper_1_walk&lt;br /&gt;
path_look = camper_1_look&lt;br /&gt;
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 &amp;lt;br&amp;gt;%=bar_freedom_angry_actor%&lt;br /&gt;
meet_talk_enabled = true&lt;br /&gt;
meet_dialog = bar_svoboda_dialog&lt;br /&gt;
heli_hunter = {-bar_ecolog_crush_heli_down} true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема patrol==&lt;br /&gt;
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[patrol]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt; &lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation = &amp;lt;параметр&amp;gt;''''' - описывет способ построения и не является обязательным. Возможны следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''back''''' - мужики идут чуть позади командира в два ряда (по умолчанию);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''line''''' - шеренга;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''around''''' - вокруг командира.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''commander = true/false''''' - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. '''''false''''' - по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''move_type = &amp;lt;название_анимации&amp;gt;''''' - задает изначальный режим перемещения, по умолчанию '''''patrol'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При остановке командора в '''''meet''''' мужики останавливаются.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;ret=0...2&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*0 - линия;&lt;br /&gt;
:*1 – вокруг старшего;&lt;br /&gt;
:*2 – по бокам.&lt;br /&gt;
&lt;br /&gt;
При движении командор работает как обычный '''''walker''''' и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано '''''a=assault''''', то командор помчится с орудием убийства на перевес, а остальные его откопируют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': что еще не сделано или глючит:&amp;lt;br&amp;gt;&lt;br /&gt;
:*нет возможности автоматически перестроить команду;&lt;br /&gt;
:*все идут молча;&lt;br /&gt;
:*командор пока не отдает команд;&lt;br /&gt;
:*не рекомендуется включать спринт.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[patrol@val_escort_captive_wait]&lt;br /&gt;
path_walk           = captive_wait_walk&lt;br /&gt;
path_look           = captive_wait_look&lt;br /&gt;
commander           = true&lt;br /&gt;
formation           = back&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_patrol.script''&lt;br /&gt;
&lt;br /&gt;
==Схема meet==&lt;br /&gt;
Схема позволяющая настроить ситуацию, когда НПС встречает актора.&lt;br /&gt;
&lt;br /&gt;
'''[meet]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_state/meet_state_wpn = &amp;lt;number&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' – задает анимацию и озвучку персонажа,&lt;br /&gt;
:в зависимости от расстояния до актера равному '''''number'''''. Для ситуации, когда актор безоружен и вооружён соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''victim/victim_wpn = &amp;lt;number&amp;gt;|&amp;lt;параметр&amp;gt;''''' - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное '''''number'''''.&lt;br /&gt;
:Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''actor''''' - смотреть на игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''story_id''''' - смотреть на персонажа со указанным '''''story_id''''';&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''nil''''' - никуда.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''use/use_wpn = true/false/self''''' - настройки юзабельности персонажа.&lt;br /&gt;
:При установки значения '''''self''''' NPC сам юзнет игрока, как только сможет дотянуться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - если актор будет замечен в указанном рестрикторе,&lt;br /&gt;
:то NPC будет отыгрывать заданную анимацию и произносить заданный звук.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''synpairs = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - Если при каком-то наборе условий&lt;br /&gt;
:встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''abuse = true/false''''' - по умолчанию '''''true''''', если '''''false''''', то неюзающийся противник не будет обижаться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''precond = usability/visibility'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любую строку можно задавать кондлистом ('''''{+info -info =func !func ~number}''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker]&lt;br /&gt;
meet = default_meet&amp;lt;/ini&amp;gt;Саму секцию '''''default_meet''''' задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[default_meet]&lt;br /&gt;
meet_state = 30|hello@hail|20|wait@wait&lt;br /&gt;
mmet_state_wpn = 30|backoff@threat_weap&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = false&lt;br /&gt;
syndata = hello@hail|backoff@threat_weap&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему '''''meet = no_meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 1'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait&lt;br /&gt;
meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap&lt;br /&gt;
victim = 50| actor&lt;br /&gt;
victim_wpn = 50| actor&lt;br /&gt;
use = true&amp;lt;&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 2'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info%&lt;br /&gt;
meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait&lt;br /&gt;
victim = 50|actor&lt;br /&gt;
victim_wpn = 50|actor&lt;br /&gt;
use = {-info2} self, false&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info2''''' – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''killactor''''' – функция в ''xr_effects.script'' которая обижает NPC на игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 3'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper]&lt;br /&gt;
path_walk = path_walk&lt;br /&gt;
path_look = path_look&lt;br /&gt;
meet = meet&lt;br /&gt;
&lt;br /&gt;
[meet]&lt;br /&gt;
meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = true&lt;br /&gt;
zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse&lt;br /&gt;
meet_dialog = {+info} dialog1, dialog2&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''true''''' – вместо анимации, атаковать игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая говорит, что мы имеем допуск к лагерю;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''warnzone''''' – рестриктор, в котором нас предупреждают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''kampzone''''' – рестриктор, в котором нас убивают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog1''''' – стартовый диалог NPC, если мы имеем допуск в лагерь;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog2''''' – стартовый диалог NPC, если мы не имеем допуск в лагерь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 2]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-07T19:31:25Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.13. Meet_manager */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==3.10.4. Кодовые замки:==&lt;br /&gt;
&lt;br /&gt;
При введении указанного кода выдает инфопоршн&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_code@lock&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&amp;lt;br&amp;gt;&lt;br /&gt;
code = 1243&amp;lt;br&amp;gt;&lt;br /&gt;
on_code = %+infoportion%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_code.script&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
==3.11. Смарттерейны и гулаги.==&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.1.1. Стандартные типы смарттеррейнов.==&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтоб сталкер не захватывался, допишите ему в custom data следующую строку:&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если сталкер уже под каким-то smart terrain, то остальные smart terrain он будет игнорировать.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===campers===&lt;br /&gt;
Кемперы. custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = campers&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = от 1 до 3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk1, camper_look1&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk2, camper_look2&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk3, camper_look3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===walkers===&lt;br /&gt;
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.&amp;lt;br&amp;gt;&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = walkers&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = от 1 до 3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk1, walker_look1&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk2, walker_look2&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk3, walker_look3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===search===&lt;br /&gt;
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.&amp;lt;br&amp;gt;&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = search&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
search_walk, search_look&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Схема следующая:&amp;lt;br&amp;gt;&lt;br /&gt;
1.	Персонаж ходит по точкам, смотрит по сторонам&amp;lt;br&amp;gt;&lt;br /&gt;
2.	В определенных точках останавливается и что-то высматривает (caution, search, hide)&amp;lt;br&amp;gt;&lt;br /&gt;
3.	При этом говорит определенные реплики (…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rest===&lt;br /&gt;
Отдых. Сталкер по очереди то sleeper, то walker, то rest(ест еду, пьёт водку).&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = rest&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
rest – путь из двух вершинок (возможно из 1). В одной сидит, в другую смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
sleep - путь из двух вершинок (возможно из 1). В одной спит, в другую смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
rest_walk, rest_look&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1</id>
		<title>Настройка логики. Часть 1</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_1"/>
				<updated>2012-05-07T19:30:50Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема Patrol */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;font size=6&amp;gt;Настройки логики&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Система флагов (path_walk, path_look)=&lt;br /&gt;
В точках путей можно задавать флаги, изменяющие поведение персонажа. Флаги задаются прямо в имени '''''waypoint'''''-а, например, для точки с именем &amp;quot;'''''wp00'''''&amp;quot;:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wp00|flag1|flag2'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_walk''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a=state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при перемещении (Только из раздела &amp;quot;Ходячие состояния&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''p=percent'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Вероятность остановиться в точке в процентах (0 – 100). По умолчанию 100, т.е. сталкер никогда не проходит мимо точек остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы. Если нужно установить сигнал после поворота – используйте соответствующий флажок пути *'''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Флаги точек пути '''''path_look''''':&amp;lt;br&amp;gt;&lt;br /&gt;
*'''a =state'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Выбирает состояние тела при стоянии (или сидении) на месте. (Из разделов &amp;quot;Стоячие&amp;quot; и &amp;quot;Сидячие&amp;quot; состояния)&amp;lt;br&amp;gt;&lt;br /&gt;
:Список состояний можно взять в ''gamedata\scripts\state_lib.script''&amp;lt;br&amp;gt;&lt;br /&gt;
*'''t=msec''' - время в миллисекундах, которое персонаж должен смотреть в заданную точку.&amp;lt;br&amp;gt;&lt;br /&gt;
:'''*''' – бесконечное время. Допустимы значения в диапазоне [1000, 30000], по умолчанию – 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
:Для конечных (терминальных) вершин пути '''''path_walk''''', у которых не более 1-й соответствующей точки '''path_look''', значение '''''t''''' всегда считается бесконечным и его явно задавать не нужно.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sig=name'''&amp;lt;br&amp;gt;&lt;br /&gt;
:После поворота в точку '''''path_look''''', установить сигнал с именем '''''name'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''syn'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Наличие флажка задержит установку сигнала до тех пор, пока в точку с флажком '''''syn''''' не прибудут все персонажи с данным '''''team'''''-ом ('''''team''''' задается в виде текстовой строки в '''''customdata'''''). До тех пор, пока остальные персонажи не прибудут, ожидающей персонаж будет отыгрывать свою '''''idle''''' анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
*'''sigtm=signal'''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает сигнал при вызове '''''time_callback'''''-а '''''state manager'''''-ом. Соответственно, если '''''t=0''''', то сигнал будет установлен после отыгрывания '''''init''''' анимации. Это используется, например, с анимацией '''''press''''', которая состоит из двух частей: 1 - нажимаем на кнопку, 2 - опускаем руку.&amp;lt;br&amp;gt;&lt;br /&gt;
:В пути '''''path_look''''' можно сделать:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;wp00|a=press|t=0|sigtm=pressed&amp;lt;/ini&amp;gt;&lt;br /&gt;
:А затем переключить схему:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_signal = pressed | другая_схема&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Более подробное описание путей.==&lt;br /&gt;
&lt;br /&gt;
Настройка:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_1.JPG]]&lt;br /&gt;
&lt;br /&gt;
На карту для каждого walker-а нужно поставить:&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_walk''''', по которому '''''walker''''' ходит.&amp;lt;br&amp;gt;&lt;br /&gt;
#Путь '''''path_look''''', состоящий из точек, в которые '''''walker''''' смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Walker'''''-ов может быть 1 или больше. Они могут действовать независимо, или взаимодействовать друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если персонаж должен стоять на месте, то ему задается одна точка пути '''''path_walk''''' и как минимум одна точка пути '''''path_look''''', хотя и можно не задавать точку взгляда вовсе (игра автоматически определит точку по умолчанию ту, в которую НПС смотрел изначально), делать этого не следует.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Правила расстановки флажков в путях рассмотрим на нескольких примерах:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 1:===&lt;br /&gt;
&lt;br /&gt;
Персонаж патрулирует территорию вокруг двух домиков. Маршрут строится следующим образом: &amp;lt;br&amp;gt;&lt;br /&gt;
[[Изображение:Logic_2.JPG]]&lt;br /&gt;
&lt;br /&gt;
Как сделать, чтобы персонаж между определенными точками бежал или крался? Для этого в пути '''''path_walk''''' существуют флажки.&amp;lt;br&amp;gt;&lt;br /&gt;
У каждого вейпоинта есть имя: '''''wp00''''', '''''wp01''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
Флажки задаются в имени. Их нужно отделять от самого имени с помощью символа ‘'''|'''’. Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=threat''''' то персонаж пойдет в состоянии данжер, если '''''a=raid''''' то побежит с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_walk''''' используются анимации '''ТОЛЬКО''' из раздела «Ходячие состояния»!&lt;br /&gt;
&lt;br /&gt;
===Пример 2:===&lt;br /&gt;
[[Изображение:Logic_3.JPG]]&lt;br /&gt;
&lt;br /&gt;
Разговор персонажа.&lt;br /&gt;
&lt;br /&gt;
Чтобы персонаж говорил, перемещаясь по маршруту, нужно определить в каждой точке список тем, на которые он может говорить. Для этого существуют следующие поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s = имя_звуковой_схемы''''' - (по умолчанию звук отключен). Несколько тем можно перечислять через запятую.&lt;br /&gt;
&lt;br /&gt;
===Пример 3:===&lt;br /&gt;
[[Изображение:Logic_4.JPG]]&lt;br /&gt;
&lt;br /&gt;
В примере 3 используется только поле '''''s''''', чтобы задать тему разговора, и флажок '''''sc''''', чтобы показать, что звук проигрывается не разово, а периодически.&amp;lt;br&amp;gt;&lt;br /&gt;
Остальные параметры ('''''sp''''', '''''sf''''', '''''st''''') задавать НЕ РЕКОМЕНДУЕТСЯ, значения по умолчанию приемлемы для большинства скриптов.&amp;lt;br&amp;gt;&lt;br /&gt;
Параметр '''''sa''''' также использовать НЕ РЕКОМЕНДУЕТСЯ. Если нужно стартовать звук одновременно с анимацией, лучше воспользоваться полями пути '''''path_look''''', о котором будет написано ниже.&amp;lt;br&amp;gt;&lt;br /&gt;
Если персонаж не только ходит по маршруту, но должен также останавливаться и играть анимации, нужно задать ему путь '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 4:=== &lt;br /&gt;
усовершенствуем пример 1, чтобы персонаж, проходя мимо проема между домами, останавливался и заглядывал в него:&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_5.JPG]]&lt;br /&gt;
&lt;br /&gt;
Что добавилось в этом примере? Путь '''''path_look''''' с двумя точками. Связь между точками этого пути рекомендуется сразу же удалить в редакторе, поскольку она все равно не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее, в точках путей '''''path_walk''''' и '''''path_look''''', которые обведены на рисунке пунктирной линией, в редакторе ставим общие флажки (в ''ACDC'' поле '''''flags'''''). Например, в верхней паре точек ставим флажок 0, а в нижней паре точек – флажок 1.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь персонаж будет останавливаться в точках '''''path_walk''''', помеченных флажком, и смотреть в точку '''''path_look''''', помеченную тем же самым флажком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если точка '''''path_walk'''''  не помечена флажком, персонаж проходит ее не останавливаясь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одной точке '''''path_walk''''' может соответствовать несколько точек '''''path_look'''''. Тогда персонаж выберем случайно одну из подходящих точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По аналогии с '''''path_walk''''', в точках пути '''''path_look''''' можно использовать различные флажки, меняющие поведение:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''p = 100''''' – вероятность, с которой персонаж посмотрит именно в эту точку. Значения '''''p''''' всех подходящих точек суммируются, т.е. если у одной точки '''''p = 100''''', а у другой '''''p = 300''''', то персонаж посмотрит в первую с вероятностью 25%! (т.е. 100 из 400).&lt;br /&gt;
Во избежание путаницы, рекомендуется задавать '''''p''''' так, чтобы их сумма составляла '''100'''.&lt;br /&gt;
По умолчанию у всех точек '''''p = 100'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''t = 5000''''' - время, на которое персонаж задержится в этой точке (по умолчанию 5000 мсек)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Пример 5:===&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Logic_6.JPG]]&lt;br /&gt;
&lt;br /&gt;
В этом примере проходя через точку '''''wp00''''', персонаж с вероятностью 30% посмотрит в точку '''''wp00''''' в течение 5 секунд, но с вероятностью 70% посмотрит в точку '''''wp01''''' в течении 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По умолчанию при остановках персонаж играет анимацию '''''idle''''', если он не в состоянии '''''crouch''''', либо анимацию '''''hide''''', если он в состоянии '''''crouch'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если требуется другая анимация, можно ее указать с помощью флажка:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''a = имя_анимации''''' - (по умолчанию '''''idle'''''). &amp;lt;br&amp;gt;&lt;br /&gt;
Пишеться '''''a=anim''''', где '''''anim''''' – название анимации. Если мы напишем '''''a=hide''''', то персонаж сядет в состоянии данжер, если '''''a=guard''''', то встанет  с оружием наизготовку и т.д. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': В точках пути '''''path_look''''' используются анимации '''ТОЛЬКО''' из раздела «Стоячие и сидячие состояния»!&lt;br /&gt;
&lt;br /&gt;
==Система флагов для монстров==&lt;br /&gt;
Флаги пути движения:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''s=имя_звуковой_темы'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает звуковую тему на пути в данную точку ('''''idle''''', '''''eat''''', '''''attack''''', '''''attack_hit''''', '''''take_damage''''', '''''die''''', '''''threaten''''', '''''steal''''', '''''panic''''', '''''growling''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''с'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы вприсядку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''r'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Устанавливает положение ходьбы бег.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sig=name'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Установить сигнал с именем '''''name''''' сразу по прибытию в точку (до поворота) для последующей его проверки с помощью поля '''''on_signal''''' логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b=vis/invis'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Флаг, исключительно для кровососа. Управляет невидимостью ('''''vis''''' - отключена, '''''invis''''' - включена).&lt;br /&gt;
&lt;br /&gt;
Флаги пути обзора:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''t=msec'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Время в миллисекундах, которое нужно ждать, смотря в точку.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''a=state'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:Анимация ('''''stand_idle''''', '''''sit_idle''''', '''''lie_idle''''', '''''eat''''', '''''sleep''''', '''''rest''''', '''''attack''''', '''''look_around''''', '''''turn''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Случайный выбор пути==&lt;br /&gt;
По поводу точек пути '''''path_walk'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Есть ещё один интересный факт: следующую точку пути '''''path_walk''''' можно задавать рандомно.&amp;lt;br&amp;gt;&lt;br /&gt;
Например:[[Файл:Random_path.jpg]]&lt;br /&gt;
&lt;br /&gt;
Нам требуется, чтобы НПС стоящий в точке '''''p0''''' патрулировал территорию по двум цикличным маршрутам:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p1 -&amp;gt; p2 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''p0 -&amp;gt; p3 -&amp;gt; p4 -&amp;gt; p0'''''&amp;lt;br&amp;gt;&lt;br /&gt;
Чтобы задать вариацию выбора маршрута относительно точки '''''p0''''', нужно в ссылке на следующую точку пути указать не одну, а две точки:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;Таким не хитрым образом, НПС для продолжения пути рандомно выберет одну из предложенных точек '''''p1''''' или '''''p3'''''. После возврата в точку '''''p0''''' выбор проследует вновь. Варьировать выбор можно в любой точки, например, можно сделать так:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p0:links = p1(1), p3(1)&amp;lt;/ini&amp;gt;а в точке '''''p1''''', также задать выбор:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(1), p3(1)&amp;lt;/ini&amp;gt;&lt;br /&gt;
'''НО!'''&lt;br /&gt;
Не следует делать выбор между двумя путями, если в пути одна точка! Вот такая схема '''НЕ ПРИЕМЛЕМА''' и, лично у меня, вызывает вылет:[[Файл:Error_random_path.jpg]]&lt;br /&gt;
Цифры в скобках, означают ту самую вероятность с которой НПС пойдёт в точку. Если цифры задать одинаковые, то и вероятность выбора для каждой точки будет равная, если же, например, в одной из точек указать значение 0.75, а в другой 0.25:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;p1:links = p2(0.75), p3(0.25)&amp;lt;/ini&amp;gt;то соответственно в точку '''''p2''''' НПС будет ходить в три раза чаще.&lt;br /&gt;
&lt;br /&gt;
=Схемы поведения сталкеров.=&lt;br /&gt;
Есть определенный набор схем, которые описывают поведение персонажа. Они прописываются у него в custom_data или, в случае гулага, в соответствующих файлах, описывающих работы данного гулага. Ниже приведен перечень этих схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В файле ''gamedata\scripts\modules.script'' указаны все загружаемые схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема walker==&lt;br /&gt;
Это базовая схема, по которой персонаж, перемещается по патрульному пути ('''''path_walk''''') и останавливается в определенных точках и выполняет соответствующие действия. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;'''''    - основной путь, по которому ходит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;'''''    - путь, куда смотрит NPC&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team      = &amp;lt;имя_команды&amp;gt;''''' - команда для синхронизации&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving1 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она близко ('''''patrol''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving2 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она не слишком далеко ('''''rush''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving3 = &amp;lt;название_анимации&amp;gt;'''''  - состояние, в котором NPC движется к первой точке пути, если она далеко ('''''sprint''''' по умолчанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_standing = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние в котором он стоит и смотрит на точку, если в этой точке не задана другое состояние.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В точках '''''path_walk''''', которым соответствуют точки пути '''''path_look''''' (стоят одинаковые флажки) персонаж останавливается и смотрит в определенную точку, при этом отыгрывая (или не отыгрывая) определенную анимацию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker@pri_followers_leader_wave1_wait]&lt;br /&gt;
path_walk = wave1_leader_walk2&lt;br /&gt;
path_look = wave1_leader_look2&lt;br /&gt;
def_state_moving1 = assault&lt;br /&gt;
def_state_moving2 = assault&lt;br /&gt;
team = followers&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема remark==&lt;br /&gt;
Схема используется для синхронизации\связки других схем.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': не используйте эту схему в качестве активной - это вызовет неправильное поведение NPC.&lt;br /&gt;
&lt;br /&gt;
'''[remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_synс = true/false''''' - по умолчанию '''''false'''''. Указывает на то необходимо ли синхронизировать звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук ремарка, берётся из файла ''sound_theme.script''. По умолчанию  '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимация ремарка, по умолчанию '''''wait'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''target = &amp;lt;параметр&amp;gt;''''' - куда смотрит сталкер. Есть следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значение&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''actor''''' – без комментариев&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil''''' – позиция вычисленная АИ автоматически&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;имя работы&amp;gt;,&amp;lt;имя гулага&amp;gt;''''' - смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг NPC, для которого задана данная секция ремарка).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = logic@cit_killers_base_guard, cit_killers&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*'''''&amp;lt;path_name&amp;gt;,&amp;lt;point_number&amp;gt;''''' - можно указывать смотреть в вершину патрульного пути (&amp;lt;имя пути&amp;gt;,&amp;lt;имя точки&amp;gt;).&amp;lt;br&amp;gt;&lt;br /&gt;
:Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;target = cit_killers_kamp5,0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': теперь если значение не задано, то оно равно '''''nil''''' а не '''''actor''''', как было раньше.&amp;lt;br&amp;gt;&lt;br /&gt;
:То есть если вы хотите чтобы персонаж в ремарке смотрел на актера - необходимо явно прописывать это. Если задано значение '''''nil''''', то персонаж развернется в позицию, которую посчитает АИ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандартные сигналы '''''remark'''''а для параметра переключения схемы '''''on_signal''''': &amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''sound_end''''' – по окончании проигрывания звуковой схемы&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''anim_end''''' – по окончании проигрывания анимации&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''action_end''''' – по окончании проигрывания и того и другого, если они синхронизированы&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[remark@esc_lager_volk2]&lt;br /&gt;
anim = guard_rac&lt;br /&gt;
snd = esc_wolf_radio&lt;br /&gt;
target = actor&lt;br /&gt;
on_signal = sound_end| remark@esc_lager_volk3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sleeper==&lt;br /&gt;
Схема сидящего и спящего NPC. Необходимо поставить патрульный путь, минимум из 1-го поинта. Спящий будет садиться спать в первой точке пути, и разворачиваться при этом в сторону нулевой точки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sleeper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_main = &amp;lt;имя_пути&amp;gt;''''' - точка в которой NPC будет спать - второй поинт, развернувшись в нулевой поинт.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''wakeable = true/false''''' – может ли проснуться быстро (если '''''true''''', то спит на корточках и во сне бормочет).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если путь состоит из двух точек, то связь нужно делать от первой точки к нулевой (либо двунаправленную).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[sleeper@esc_blockpost_sleep1]&lt;br /&gt;
path_main = sleep1&lt;br /&gt;
wakeable = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_sleeper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема kamp==&lt;br /&gt;
Схема сталкера, сидящего в определенном радиусе вокруг указанной точки (у костра), и располагающегося лицом к этой точке.&amp;lt;br&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
'''[kamp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''center_point = &amp;lt;имя_пути&amp;gt;''''' – имя точки вокруг которой NPC будет устраиваться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' - насколько далеко сталкер будет сидеть от центра лагеря. По умолчанию - 2 метра.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - дефолтное состояние, в котором NPC будет идети к точке кампа. По умолчанию - '''''ran'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Если точка кампа находится в костре, то в оффлайне сталкера прийдут на нее, а когда они перейдут в онлайн, то окажуться внутри костра, где и получат хит.&amp;lt;br&amp;gt;&lt;br /&gt;
:Чтобы этого не случалось в секции кемпа указывать '''''path_walk''''' из одной точке, название которой '''''&amp;lt;path_kamp_name&amp;gt;_task''''':&amp;lt;ini&amp;gt;path_walk = &amp;lt;имя_пути&amp;gt;_task&amp;lt;/ini&amp;gt;Если точка кемпа расположена в чистом поле то, '''''path_walk''''' прописывать необязательно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[kamp@esc_blockpost_kamp1]&lt;br /&gt;
center_point = kamp_center&lt;br /&gt;
path_walk = kamp_center_task&lt;br /&gt;
def_state_moving = raid&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_kamp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема camper==&lt;br /&gt;
Свойства камперов:&lt;br /&gt;
* кампер стоит на точке и смотрит в направлении, куда Вы его поставили в редакторе или передвигается по патрульным путям;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы переключаются на универсальный комбат, только если видят врага ближе чем в 30 метрах. Если он выжил, он возвращается в состояние кампера;&amp;lt;br&amp;gt;&lt;br /&gt;
* В любых других случаях действуют по собственной скриптовой схеме. Если видим врага - стреляем. Если слышим дэнжер - то смотрим в направление в данжере. Если видим гранату - убегаем от гранаты. Если видели врага, а враг исчез, то смотрим в точку, где видели последний раз врага;&amp;lt;br&amp;gt;&lt;br /&gt;
* камперы не сражаются в движении. Если они видят врага - они останавливаются, стреляют, а потом продолжают движение.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[camper]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''radius = &amp;lt;number&amp;gt;''''' – если расстояние между NPC и противником меньше указанного, то он уходит в универсальный комбат. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_retreat = true/false''''' - NPC при виде врага не будет ломиться на ближайшую точку '''''path_walk''''', а сразу перейдет в режим убивания.&lt;br /&gt;
:Нужно это в том случае, если вы хотите сделать сценку, когда одни ребята наезжают на других. Ставите камперов с вышеуказанным флажком. Они идут по своим патрульным путям и выносят врагов.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC движется на ближайшую точку пути при враге. По умолчанию - '''''assault'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_moving_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, во время движения на ближайшую точку пути.&lt;br /&gt;
:По умолчанию - '''''sneak_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC ожидает врага, находясь на пути. По умолчанию - '''''hide'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''def_state_campering_fire = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором NPC отстреливается от врага, находясь на пути. По умолчанию '''''hide_fire'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''attack_sound = &amp;lt;имя_звуковой_темы&amp;gt;''''' - возможность переопределять снайперам/камперам звук атаки. По дефолту он равен звуковой теме '''''fight_attack'''''.&lt;br /&gt;
:Можно изменить на любое другое (для сценических потребностей) либо вообще отключить, прописав значение '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''shoot = &amp;lt;тип_стрельбы&amp;gt;''''' - возможны следующие значения:&lt;br /&gt;
:*'''''always''''' - значение по умолчанию, стреляет всегда, когда можно;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''none''''' - не стреляет вообще;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''terminal''''' - стреляет только когда находится на последней точки патрульного пути. Это сделано для облегчения построение атакующих сцен.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кампера есть один большой минус – когда ему наносится хит и он не знает откуда хит наносится (не видит противника, не слышит выстрела),&amp;lt;br&amp;gt;&lt;br /&gt;
:то он тупо продолжает стоять на старом месте и ждать следующей пули.&amp;lt;br&amp;gt;&lt;br /&gt;
:Ввиду этого не стоит расставлять кемперов в случае, когда сталкеры должны защищаться и держать позицию в том случае, если есть несколько направлений, откуда игрок или стелкеры смогут атаковать поставленного кампера. Используйте '''''walker''''' в таких случаях, а камперов стоить ставить для атак по путям и как снайперов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@dar_military_scout_hide]&lt;br /&gt;
path_walk = walk_hide&lt;br /&gt;
path_look = look_hide&lt;br /&gt;
radius = 10&lt;br /&gt;
no_retreat = true&lt;br /&gt;
def_state_moving = assault&lt;br /&gt;
def_state_campering = hide_na&lt;br /&gt;
shoot = always&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sniper==&lt;br /&gt;
Разновидность кампера. Отличаются тем, что стреляют только одиночными выстрелами и не смотрят по точкам патрульного пути, а сканируют пространство между ними. Скорость сканирования от точки к точке фиксирована и равна 20 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В кастом дате кемпера прописать:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;sniper = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper@esc_blockpost_camper_day]&lt;br /&gt;
path_walk = camper_day_walk&lt;br /&gt;
path_look = camper_day_look&lt;br /&gt;
sniper = true&lt;br /&gt;
def_state_campering = threat&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Ставить снайперу только 2 точки '''''look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_camper.script''&lt;br /&gt;
&lt;br /&gt;
==Схема follower== &lt;br /&gt;
NPC идет за NPC-лидером. Если до лидера расстояние менее 5 метров, то он идет, если от 5 до 20 – бежит в режиме '''''run''''', если свыше 20 – догоняет в режиме '''''sprint'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Пути не задаются&amp;lt;/u&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[follower]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''leader = &amp;lt;number&amp;gt;''''' - '''''story_id''''' лидера из ''game.ltx'' (число!).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation_line = true/false''''' - постарается идти сбоку от лидера, в противном случае будет идти сзади.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''distance = &amp;lt;number&amp;gt;''''' - расстояние в метрах, на котором будет идти от лидера '''''attendant'''''. По умолчанию – 1,5 метра, если идет цепью, то 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state_if_leader_in_meet = &amp;lt;название_анимации&amp;gt;''''' - это есть строка с именем  состояния из '''''state_manager''''', которое будет назначено '''''follower'''''-ам, если командир пребывает в состоянии '''''meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_walk = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер идет за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_run = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер бежит за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim_sprint = &amp;lt;название_анимации&amp;gt;''''' - состояние, в котором фолловер спринтует за лидером.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': Не забыть прописать:&lt;br /&gt;
&amp;lt;ini&amp;gt;[smart_terrains]&lt;br /&gt;
none = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Иначе NPC засосёт в гулаг и никуда он не пойдёт.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все это происходит под гулагом, то вместо '''''story_id''''' лидера, мы прописываем его секцию логики в файле скрипта.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;lua&amp;gt;t = { section = &amp;quot;logic@bar_arena_follower_2&amp;quot;, &lt;br /&gt;
      idle    = 0,&lt;br /&gt;
      prior   = 7,&lt;br /&gt;
      state   = {0},&lt;br /&gt;
      squad   = squad,&lt;br /&gt;
      group   = groups[0],&lt;br /&gt;
      ...&lt;br /&gt;
    }&amp;lt;/lua&amp;gt;В данном случае для параметра '''''leader''''' необоходимо указать строку '''''bar_arena_follower_2'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': в релизе игры данная схема не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_attendant.script''&lt;br /&gt;
&lt;br /&gt;
==Схема zoneguard==&lt;br /&gt;
У NPC есть две зоны (может быть одна). Он ходит по путям, но когда игрок заходит в зону, отрывает от дел, подбегает к игроку, наставляет на игрока оружие (может кричать, может говорить), если игрок заходит во вторую зону – атакует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[zoneguard]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''team = &amp;lt;имя_команды&amp;gt;''''' - имя команды синхронизированных '''''zoneguard'''''-ов (из всей команды только 1 будет реагировать на игрока).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_guard = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой игрок будет атакован.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone_warn = &amp;lt;имя_зоны&amp;gt;''''' - зона в пределах которой NPC будет начинать разговор с игроком.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''walker_team = &amp;lt;имя_команды&amp;gt;''''' -  для схемы перемещения его в состоянии '''''walker''''' (если не задан, используется значение из поля '''''team''''').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_move = true/false''''' - персонаж окликнет игрока с места и не будет подбегать к нему.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_greet = &amp;lt;название_звуковой_темы&amp;gt;''''' - звук которой будет проигран при обнаружении игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_friends = true/false''''' - будет игнорировать дружественных ему персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_cond = {+info -info =func !func ~number}''''' - условия, при которых NPC игнорирует игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_danger = true/false''''' - отыгрывать или нет угрожающую анимацию будучи нейтралом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - какую отыгрывает анимацию, если игрок ему не враждебен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_anim_sync = true/false''''' - будет ли синхронизирован звук с анимацией.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[zoneguard]&lt;br /&gt;
path_walk = mil_freedom_zoneguard_walk_kill2&lt;br /&gt;
path_look = mil_freedom_zoneguard_look_kill2&lt;br /&gt;
zone_warn = mil_freedom_leader_warn_zone&lt;br /&gt;
zone_guard = mil_freedom_leader_kill_zone&lt;br /&gt;
no_move = true&lt;br /&gt;
team = freedom_bodyguards3&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_zoneguard.script''&lt;br /&gt;
&lt;br /&gt;
==Схема wounded==&lt;br /&gt;
Схема раненного. Определяет поведение NPC в состоянии &amp;quot;раненный&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': не рекомендуется задавать схему в качестве активной.&lt;br /&gt;
&lt;br /&gt;
'''[wounded]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он не видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_state_see = &amp;lt;HP&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при значении уровня его здоровья равному '''''HP''''', когда он видит игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''psy_state = &amp;lt;PSY&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - поведение NPC при псиатаках, в зависимости от уровня пси-здоровья равному '''''PSY'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_victim = &amp;lt;HP&amp;gt;|&amp;lt;параметр&amp;gt;''''' - куда будет смотреть NPC при значении уровня его здоровья равному '''''HP''''', возможные параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_id''''' - числовое значение;&lt;br /&gt;
:*'''''actor''''' - без комментариев;&lt;br /&gt;
:*'''''nil''''' - позиция вычисленная АИ автоматически.&lt;br /&gt;
'''''hp_cover = &amp;lt;HP&amp;gt;|true/false''''' - идти в укрытие или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hp_fight = &amp;lt;HP&amp;gt;|true/false''''' - разрешено воевать или нет, в зависимости от значения уровня здоровья равному '''''HP'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''syndata = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - синхропары для красоты.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить диалог, вместо стандартного '''''actor_help_wounded'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''help_start_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': желательно, чтобы все установленные актёрские диалоги для раненых имели условие их появления следующего вида:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;xml&amp;gt;&amp;lt;precondition&amp;gt;dialogs.allow_wounded_dialog&amp;lt;/precondition&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
'''''Примечание''''': если необходимо поставить несколько состояний, в зависимости от разного значения уровня здоровья, то сами состояния нужно разделять символом ‘|’:&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь определятся два состояния при уровне здоровья 30 и 10 соответственно.&lt;br /&gt;
:Для параметров '''''hp_state_see''''', '''''psy_state''''', '''''hp_victim''''', '''''hp_cover''''', '''''hp_fight''''' способ такой же.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы &amp;lt;small&amp;gt;(в качестве примера взята дефолтная настройка)'''''&amp;lt;/small&amp;gt;:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;hp_state= 30|help_me@help|10|wounded_heavy@help_heavy&lt;br /&gt;
hp_state_see = 30|wounded@help_see|10|wounded_heavy@help_heavy&lt;br /&gt;
psy_state = 50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|psy_shoot,psy_pain@wounded_psy_shoot,wounded_psy&lt;br /&gt;
hp_victim = 30|actor|10|nil&lt;br /&gt;
hp_cover = 30|true|10|false&lt;br /&gt;
hp_fight = 30|true|10|false&lt;br /&gt;
syndata = wounded@help&lt;br /&gt;
;best_pistol – проверка на то, что лучшее оружие NPC является пистолетом.&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_wounded.script''&lt;br /&gt;
&lt;br /&gt;
==Схема rest==&lt;br /&gt;
Чувак гуляет, хавает, спит.&amp;lt;br&amp;gt;&lt;br /&gt;
Нормально не работает, посему в релизе не используется.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_rest.script''&lt;br /&gt;
&lt;br /&gt;
==Схема heli_hunter==&lt;br /&gt;
Хелихантер может стрелять либо не стрелять по вертолету в зависимости от условий. Делается это так:&amp;lt;br&amp;gt;&lt;br /&gt;
В активную схему вставляется параметр:&amp;lt;ini&amp;gt;heli_hunter = {+info -info =func !func ~number}true/false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;ini&amp;gt;[camper@bar_freedom_attack_sniper_1]&lt;br /&gt;
path_walk = camper_1_walk&lt;br /&gt;
path_look = camper_1_look&lt;br /&gt;
on_info = {+bar_freedom_attack_ecolog} camper1@bar_freedom_attack_sniper_1 &amp;lt;br&amp;gt;%=bar_freedom_angry_actor%&lt;br /&gt;
meet_talk_enabled = true&lt;br /&gt;
meet_dialog = bar_svoboda_dialog&lt;br /&gt;
heli_hunter = {-bar_ecolog_crush_heli_down} true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если раньше оверрайд понимал только значения '''''true''''' либо '''''false''''', то сейчас он понимает кондлист, который если возвращает '''''true''''' - то стрельба по вертолету в данной схеме разрешена.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Схема patrol==&lt;br /&gt;
Итак, есть предварительная система патруля. Представляет собой вариацию '''''kamp''''' только в состоянии ходьбы. Для ее работы прописываем в '''''custom_data''''' следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[patrol]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь по которому ходит NPC.&amp;lt;br&amp;gt; &lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - точки в которые смотрит NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''formation = &amp;lt;параметр&amp;gt;''''' - описывет способ построения и не является обязательным. Возможны следующие варианты:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''back''''' - мужики идут чуть позади командира в два ряда (по умолчанию);&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''line''''' - шеренга;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''around''''' - вокруг командира.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''commander = true/false''''' - будет ли NPC назначен командиром, желательно, чтобы такой красивый он был один. '''''false''''' - по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''move_type = &amp;lt;название_анимации&amp;gt;''''' - задает изначальный режим перемещения, по умолчанию '''''patrol'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При остановке командора в '''''meet''''' мужики останавливаются.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если командор помирает, то автоматически будет выбран другой. Командиром становится тот, кто первый попал под схему. Способы построения задаются в вейпоинтах следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;ret=0...2&amp;lt;/ini&amp;gt;&lt;br /&gt;
:*0 - линия;&lt;br /&gt;
:*1 – вокруг старшего;&lt;br /&gt;
:*2 – по бокам.&lt;br /&gt;
&lt;br /&gt;
При движении командор работает как обычный '''''walker''''' и сопровождающие его кадры повторяют его действия. То есть, если в параметрах вейпоинта прописано '''''a=assault''''', то командор помчится с орудием убийства на перевес, а остальные его откопируют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': что еще не сделано или глючит:&amp;lt;br&amp;gt;&lt;br /&gt;
:*нет возможности автоматически перестроить команду;&lt;br /&gt;
:*все идут молча;&lt;br /&gt;
:*командор пока не отдает команд;&lt;br /&gt;
:*не рекомендуется включать спринт.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[patrol@val_escort_captive_wait]&lt;br /&gt;
path_walk           = captive_wait_walk&lt;br /&gt;
path_look           = captive_wait_look&lt;br /&gt;
commander           = true&lt;br /&gt;
formation           = back&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_patrol.script''&lt;br /&gt;
&lt;br /&gt;
==Схема meet==&lt;br /&gt;
Схема позволяющая настроить ситуацию, когда НПС встречает актора.&lt;br /&gt;
&lt;br /&gt;
'''[meet]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_state/meet_state_wpn = &amp;lt;number&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' – задает анимацию и озвучку персонажа,&lt;br /&gt;
:в зависимости от расстояния до актера равному '''''number'''''. Для ситуации, когда актор безоружен и вооружён соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''victim/victim_wpn = &amp;lt;number&amp;gt;|&amp;lt;параметр&amp;gt;''''' - задает объект, на который должен будет смотреть персонаж, в зависимости от расстояния равное '''''number'''''.&lt;br /&gt;
:Для ситуации, когда актор безоружен и вооружён соответственно. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''actor''''' - смотреть на игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''story_id''''' - смотреть на персонажа со указанным '''''story_id''''';&amp;lt;br&amp;gt;&lt;br /&gt;
::*'''''nil''''' - никуда.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''use/use_wpn = true/false/self''''' - настройки юзабельности персонажа.&lt;br /&gt;
:При установки значения '''''self''''' NPC сам юзнет игрока, как только сможет дотянуться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - если актор будет замечен в указанном рестрикторе,&lt;br /&gt;
:то NPC будет отыгрывать заданную анимацию и произносить заданный звук.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''meet_dialog = &amp;lt;название_диалога&amp;gt;''''' - возможность установить стартовый диалог NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''synpairs = &amp;lt;название_анимации&amp;gt;@&amp;lt;название_звуковой_темы&amp;gt;''''' - Если при каком-то наборе условий&lt;br /&gt;
:встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''abuse = true/false''''' - по умолчанию '''''true''''', если '''''false''''', то неюзающийся противник не будет обижаться.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''precond = usability/visibility'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Любую строку можно задавать кондлистом ('''''{+info -info =func !func ~number}''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[walker]&lt;br /&gt;
meet = default_meet&amp;lt;/ini&amp;gt;Саму секцию '''''default_meet''''' задавать не надо. Все настройки и так возьмутся из дефолта. По дефолту встреча настроена со следующими параметрами:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[default_meet]&lt;br /&gt;
meet_state = 30|hello@hail|20|wait@wait&lt;br /&gt;
mmet_state_wpn = 30|backoff@threat_weap&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = false&lt;br /&gt;
syndata = hello@hail|backoff@threat_weap&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему '''''meet = no_meet'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 1'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50| hello@talk_hello| 20| wait@wait| 10| ward@wait&lt;br /&gt;
meet_state_wpn = 50| hello@talk_hello| 20| threat@threat_weap&lt;br /&gt;
victim = 50| actor&lt;br /&gt;
victim_wpn = 50| actor&lt;br /&gt;
use = true&amp;lt;&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 2'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[meet]&lt;br /&gt;
meet_state = 50|{+info} threat_fire %=killactor% ,walk@ {+info} talk_abuse, wait|10|walk %+info%&lt;br /&gt;
meet_state_wpn = 50|{+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait&lt;br /&gt;
victim = 50|actor&lt;br /&gt;
victim_wpn = 50|actor&lt;br /&gt;
use = {-info2} self, false&lt;br /&gt;
use_wpn = false&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая указывает что мы уже опустили оружие и были достаточно близко к NPC;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info2''''' – инфопорция, которая устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''killactor''''' – функция в ''xr_effects.script'' которая обижает NPC на игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Ситуация 3'''.&amp;lt;br&amp;gt;&lt;br /&gt;
Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[camper]&lt;br /&gt;
path_walk = path_walk&lt;br /&gt;
path_look = path_look&lt;br /&gt;
meet = meet&lt;br /&gt;
&lt;br /&gt;
[meet]&lt;br /&gt;
meet_state = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
meet_state_wpn = 30|{+info} wait, threat@ {+info} talk_hello, threat_back&lt;br /&gt;
victim = 30|actor&lt;br /&gt;
victim_wpn = 30|actor&lt;br /&gt;
use = true&lt;br /&gt;
use_wpn = true&lt;br /&gt;
zone = warnzone|{-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse&lt;br /&gt;
meet_dialog = {+info} dialog1, dialog2&amp;lt;/ini&amp;gt;Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''true''''' – вместо анимации, атаковать игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''info''''' – инфопорция, которая говорит, что мы имеем допуск к лагерю;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''warnzone''''' – рестриктор, в котором нас предупреждают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''kampzone''''' – рестриктор, в котором нас убивают;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog1''''' – стартовый диалог NPC, если мы имеем допуск в лагерь;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog2''''' – стартовый диалог NPC, если мы не имеем допуск в лагерь.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 2]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4</id>
		<title>Настройка логики. Часть 4</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_4"/>
				<updated>2012-05-07T18:13:24Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.14.	Отметки на минимапе */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
==3.10.3. Схема работы прожектора:==&lt;br /&gt;
&lt;br /&gt;
В точках look пути, в которые смотрит прожекторщик, нужно прописать&lt;br /&gt;
sl=имя_прожектора&lt;br /&gt;
&lt;br /&gt;
Например&amp;lt;br&amp;gt;&lt;br /&gt;
wp00|sl=esc_sl1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда при повороте в эту точку персонаж повернет в нее и прожектор.&lt;br /&gt;
&lt;br /&gt;
==3.10.4. Кодовые замки:==&lt;br /&gt;
&lt;br /&gt;
При введении указанного кода выдает инфопоршн&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_code@lock&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_code@lock]&amp;lt;br&amp;gt;&lt;br /&gt;
code = 1243&amp;lt;br&amp;gt;&lt;br /&gt;
on_code = %+infoportion%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_code.script&lt;br /&gt;
&lt;br /&gt;
==3.10.5. Ph_gate:==&lt;br /&gt;
&lt;br /&gt;
	То же самое, что и ph_door, но для ворот, состоящих из двух дверей:&lt;br /&gt;
Вместо параметров closed и locked сейчас используются параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
state: состояние, в котором дверь находится при инициализации (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
open - в открытом&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем (дефолтном или оставшемся от предыдущей схемы)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
locking: блокировка дверей (по умолчанию none)&amp;lt;br&amp;gt;&lt;br /&gt;
stick - прилипание дверей к крайним состояниям (пока в процессе настройки)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
soft - дверь заблокирована с помощью силы, т.е. можно ее открыть/пробить машиной&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - не используется (мягкая блокировка возможна только в крайних положениях) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hard - блокировка двери с помощью границ. Ворота можно только сломать&lt;br /&gt;
Состояния в этом положении:&amp;lt;br&amp;gt;&lt;br /&gt;
open - блокировать в открытом состоянии&amp;lt;br&amp;gt;&lt;br /&gt;
closed - в закрытом&amp;lt;br&amp;gt;&lt;br /&gt;
none - в текущем&amp;lt;br&amp;gt;&lt;br /&gt;
    	&lt;br /&gt;
none - дверь не заблокирована&lt;br /&gt;
&lt;br /&gt;
Общие параметры:&lt;br /&gt;
left_limit, right_limit - задают угол [0-180] открытия каждой из створок ворот. По умолчанию - 100 градусов. &amp;lt;br&amp;gt;&lt;br /&gt;
breakable - (true/false) определяет можно ли сломать ворота. По умолчанию true.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Звуковые параметры аналогичны ph_door&amp;lt;br&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
[ph_gate@locked] ;блокировка в открытом состоянии, неразбиваемые.&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = soft&amp;lt;br&amp;gt;&lt;br /&gt;
left_limit = 130&amp;lt;br&amp;gt;&lt;br /&gt;
rigt_limit = 60&amp;lt;br&amp;gt;&lt;br /&gt;
breakable = false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@opened]&amp;lt;br&amp;gt;&lt;br /&gt;
state = opened&amp;lt;br&amp;gt;&lt;br /&gt;
locking = stick&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_gate@closed]&amp;lt;br&amp;gt;&lt;br /&gt;
state = closeded&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	Файл: \gamedata\scripts\ph_gate.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.6. Ph_sound==&lt;br /&gt;
&lt;br /&gt;
Прописывается у физического объекта какие звуки он выдает (изначально планировался как матюгальник).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = имя темы из файла sound_theme.script из таблицы ph_snd_themes&amp;lt;br&amp;gt;&lt;br /&gt;
*looped = true/false зацикленое воспроизведение звука (default - false)&amp;lt;br&amp;gt;&lt;br /&gt;
*min_idle = минимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*max_idle = максимальное время простоя перед включением звука (мс)&amp;lt;br&amp;gt;&lt;br /&gt;
*random = true/false (def - false). Если = true, то из темы будет выбран рандомный звук и таким образом звуки будут играться до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NB! Если мы задаем random = true и looped = true, то версия сыпется&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также поддерждивается кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
Данная схема работает через задницу, поэтому зацикленный звук будет продолжать отыгрываться, даже если объект уходит в nil. В связи с этим надо создавать новую секцию, которая бы отыгрывала одиночный короткий звук, после которого (поскольку он будет точно также играться раз за разом) ставим on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример подобной извращенной логики:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_sound&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting&amp;lt;br&amp;gt;&lt;br /&gt;
looped = true&amp;lt;br&amp;gt;&lt;br /&gt;
max_idle = 5000&amp;lt;br&amp;gt;&lt;br /&gt;
on_actor_in_zone = gar_seryi_factory| ph_sound@end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_sound@end]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = gar_seryi_shooting_2&amp;lt;br&amp;gt;&lt;br /&gt;
looped = false&amp;lt;br&amp;gt;&lt;br /&gt;
on_signal = sound_end| nil&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	Кроме того специфическим образом создается звуковая схема.&amp;lt;br&amp;gt;&lt;br /&gt;
В sound_theme.script  в начале файла есть секция ph_themes в которой и описываются темы для физ объектов. &amp;lt;br&amp;gt;&lt;br /&gt;
Например:&amp;lt;br&amp;gt;&lt;br /&gt;
ph_snd_themes[&amp;quot;gar_seryi_shooting&amp;quot;]	= {[[characters_voice\human_01\scenario\garbage\distance_shooting]]}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме того (незадекларированная фича) ph_sound можно вешать на рестрикторы. Но за правильность работы в таком случае никто ответственности не несет.&amp;lt;br&amp;gt; Однако в оригинале такое встречается, например в бункере Выжигателя мозгов есть рестриктор bun_space_restrictor_sound1 на который как раз и повешан ph_sound.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: \gamedata\scripts\ph_sound.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.7. Ph_force==&lt;br /&gt;
&lt;br /&gt;
	Схема позволяет пнуть предмет в указанную сторону. Прописывается в кастом дате предмета.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	force = сила, которая прикладывается к объекту. Измеряется в убитых енотах&amp;lt;br&amp;gt;&lt;br /&gt;
	time = время прикладывания силы к предмету (в секундах)&amp;lt;br&amp;gt;&lt;br /&gt;
	*delay = задержка (в секундах) перед применением силы&amp;lt;br&amp;gt;&lt;br /&gt;
	point =  имя патрульного пути, точки которого будут использованы как цели (куда направлять предмет)&amp;lt;br&amp;gt;&lt;br /&gt;
	point_index = индекс точки патрульного пути, в стону которого полетит предмет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.8. Ph_on_death==&lt;br /&gt;
&lt;br /&gt;
Схема для отслеживания разрушения физического объекта и выдавания по такому случаю различных эффектов&amp;lt;br&amp;gt;&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_on_death&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_on_death]&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = %эффекты%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Юзать исключительно с разрушаемыми физ. Объектами&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.9. Ph_car==&lt;br /&gt;
&lt;br /&gt;
Настройка возможности игроку управлять машиной.&amp;lt;br&amp;gt;&lt;br /&gt;
секция: [ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
поле:   usable = &amp;lt;condlist&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
usable - кондлист возвращающий true (по умолчанию) или false. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_car&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_car]&amp;lt;br&amp;gt;&lt;br /&gt;
usable = {+val_actor_has_car_key}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе этой схемы можно сделать машину, которая зведется только если у актера есть ключ именно от нее.&lt;br /&gt;
&lt;br /&gt;
==3.10.10. Ph_heavy==&lt;br /&gt;
Прописывается в физ объектах, которые запрещены для швыряния бюрерам и полтергейстам. Например, если они должны лежать на конкретном месте (типа документов сюжетных) или слишком громоздки по габаритам, чтобы их можно было красиво кидать.&lt;br /&gt;
В кастом дате пишем:&lt;br /&gt;
&lt;br /&gt;
[ph_heavy]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.10.11. Ph_oscillate==&lt;br /&gt;
Схема предназначена для плавного раскачивания физики (лампы, висящие зомби и т.д.)&lt;br /&gt;
Пример логики&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_oscillate]&amp;lt;br&amp;gt;&lt;br /&gt;
joint = provod   - имя кости к которой будет применена сила&amp;lt;br&amp;gt;&lt;br /&gt;
force = 5         - собственно сила (в ньютонах)&amp;lt;br&amp;gt;&lt;br /&gt;
period = 1000    - время прикладывания силы.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сила прикладывается к кости объекта с линейным наростанием. То есть в течении заданого периода времени сила вырастет с 0 до заявленого значения. После этого настает пауза (сила не применяется) на время period/2. После окончания паузы сила применяется так же, как и в начале, но в обратном направлении.&lt;br /&gt;
&lt;br /&gt;
==3.11. Смарттерейны и гулаги.==&lt;br /&gt;
==3.11.1. Смарттеррейн.==&lt;br /&gt;
Под смарттеррейном мы понимаем зону, зайдя в которую, сталкер на некоторое время попадает под гулаг и начинает выполнять работу, предусмотренную этим гулагом. После некоторого времени он выходит из-под гулага и ходит свободно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как поставить smart terrain?&amp;lt;br&amp;gt;&lt;br /&gt;
Для всех smart terrain нужно:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	Поставить smart terrain с необходимым shape. Большой shape не рекомендуется (размер влияет на производительность).&amp;lt;br&amp;gt;&lt;br /&gt;
2)	В его custom data прописать настройки.&amp;lt;br&amp;gt;&lt;br /&gt;
3)	Расставить пути для соответствующих схем поведения. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true(по дефолту)/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом (№ уровня)&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain (по умлочанию – навсегда)&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
Имена путей для схем поведения всегда должны начинаться с имени данного smart terrain. Например, esc_smart_ambush_vagon_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если пути для smart terrain на нескольких человек (campers, walkers), то их имена должны заканчиваться всегда на цифру (esc_smart_ambush_vagon_walk1, esc_smart_ambush_vagon_walk2) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Гулагов под одним smart terrain может быть несколько. Их можно настраивать в секциях [gulag2], [gulag3] и т.д. При входе сталкера под smart terrain будет случайно выбран один из доступных на данный момент гулагов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.1.1. Стандартные типы смарттеррейнов.==&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтоб сталкер не захватывался, допишите ему в custom data следующую строку:&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если сталкер уже под каким-то smart terrain, то остальные smart terrain он будет игнорировать.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===campers===&lt;br /&gt;
Кемперы. custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = campers&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = от 1 до 3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk1, camper_look1&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk2, camper_look2&amp;lt;br&amp;gt;&lt;br /&gt;
camper_walk3, camper_look3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===walkers===&lt;br /&gt;
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.&amp;lt;br&amp;gt;&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = walkers&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = от 1 до 3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk1, walker_look1&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk2, walker_look2&amp;lt;br&amp;gt;&lt;br /&gt;
walker_walk3, walker_look3&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===search===&lt;br /&gt;
Ходячие. На базе этого можна сделать поиск, обыск и куча всего.&amp;lt;br&amp;gt;&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = search&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
search_walk, search_look&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Схема следующая:&amp;lt;br&amp;gt;&lt;br /&gt;
1.	Персонаж ходит по точкам, смотрит по сторонам&amp;lt;br&amp;gt;&lt;br /&gt;
2.	В определенных точках останавливается и что-то высматривает (caution, search, hide)&amp;lt;br&amp;gt;&lt;br /&gt;
3.	При этом говорит определенные реплики (…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===rest===&lt;br /&gt;
Отдых. Сталкер по очереди то sleeper, то walker, то rest(ест еду, пьёт водку).&lt;br /&gt;
custom data:&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = rest&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = 1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пути:&amp;lt;br&amp;gt;&lt;br /&gt;
rest – путь из двух вершинок (возможно из 1). В одной сидит, в другую смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
sleep - путь из двух вершинок (возможно из 1). В одной спит, в другую смотрит.&amp;lt;br&amp;gt;&lt;br /&gt;
rest_walk, rest_look&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.2. Гулаги.==&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;
Г) Гулаг имеет состояния. Каждое состояние характеризуется своим набором работ, отличным от набора работ в любом другом состоянии гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Гулаг создается следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Необходимо четко определить набор состояний гулага: день, ночь, спокойное, при тревоге и так далее. Для простых гулагов достаточно одного состояния, для крутых и сложных – желательно разные. Это придает разнообразия и смотрится лучше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Определяем  максимальное количество людей, которым гулаг может управлять. То есть определяем вместимость гулага. Она должна быть такой, чтобы в любом состоянии гулага гарантированно нашлось занятие для каждого человека.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Для каждого состояния гулага определяется набор работ. Эти работы могут быть как активного плана (часовой, патруль, и так далее), так и пассивного плана (сидят вокруг костра, спят). Каждая работа имеет свой приоритет. Соответственно пассивные работы должны иметь меньший приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Ставится в редакторе количество людей, которые должны быть под гулагом, и накрываются зонкой smart_terrain (источник ошибок – иногда ставят space_restictor). Зонке нужно давать осмысленное название. Это же название будет являться префиксом к названием всех патрульных путей, относящихся к этому же гулагу. Например если вы назвали зонку esc_blockpost, то все патрульные пути должны начинаться с этого префикса, например esc_blockpost_guard_walk. В custom_data зоны необходимо прописать настройку гулага.&amp;lt;br&amp;gt;&lt;br /&gt;
[gulag1] &amp;lt;br&amp;gt;&lt;br /&gt;
type = тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
capacity = макс. вместимость в людях&amp;lt;br&amp;gt;&lt;br /&gt;
*offline = может ли гулаг образоваться в offline (true/false)&lt;br /&gt;
*squad = squad, который будет проставлен всем сталкерам под гулагом&lt;br /&gt;
*groups = набор group через запятые&lt;br /&gt;
*stay = min, max время пребывания npc под smart_terrain&lt;br /&gt;
*idle = min, max время бездействия smart_terrain после ухода последнего npc&lt;br /&gt;
*cond = список условий, которые необходимы для создания гулага {+info –info =func !func} – если условие не выполняется, то гулаг распускается, а все его подопечные начинают управляться прописанной в custom_data логикой.&lt;br /&gt;
*respawn = имя респауна (вызывает респаунер с заданым именем каждый раз, когда кто-то из самрттеррейна заступает на работу)&lt;br /&gt;
&lt;br /&gt;
Capacity нужно задавать всегда. Она может быть равна или меньше числа работ.&amp;lt;br&amp;gt;&lt;br /&gt;
Указывать тип гулага нужно без кавычек.&amp;lt;br&amp;gt;&lt;br /&gt;
Полем offline можно задать, чтоб гулаг не образовывался в офлайн. Т.е. существовать в офлайн он может, а образовываться – нет.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не задан squad или groups, то соответствующие свойства сталкеров не будут изменяться.&amp;lt;br&amp;gt;&lt;br /&gt;
Все времена задаются в часах игрового времени и могут быть дробными.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. В скрипте \gamedata\scripts\gulag_название_уровня.script необходимо прописать условия, при которых сталкеры берутся под конкретный гулаг. В функцию checkNPC необходимо прописать условие:&lt;br /&gt;
&amp;lt;lua&amp;gt;if gulag_type == &amp;quot;gar_dolg&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;dolg&amp;quot;&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В эту функцию пока передается два параметра, тип гулага и комьюнити персонажа. В данном случае под гулаг с типом gar_dolg будут приниматься все персонажи, относящиеся к группировке Долг.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать переключение состояний гулага. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function loadStates(gname, type)&amp;lt;br&amp;gt;&lt;br /&gt;
в нее передается имя зонки и тип гулага. Состояние гулага описывается в виде функции, возвращающей номер состояния гулага. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
	   if level.get_time_hours() &amp;gt;= 7 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- день&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ночь&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
В данном случае если сейчас между 7 и 22 часов, то гулаг находится в дневном состоянии, иначе в ночном.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. В файле \gamedata\scripts\gulag_название_уровня.script необходимо описать должности гулага. В функции loadJob загружаются все допустимые работы. В саму функцию передаются следующие параметры:&amp;lt;br&amp;gt;&lt;br /&gt;
function loadJob(sj, gname, type, squad, groups)&amp;lt;br&amp;gt;&lt;br /&gt;
sj – сама табличка работ гулагов,&amp;lt;br&amp;gt;&lt;br /&gt;
gname – имя нашей зонки смар-тиррейна. Оно используется как префикс.&amp;lt;br&amp;gt;&lt;br /&gt;
Type – тип гулага&amp;lt;br&amp;gt;&lt;br /&gt;
Squad, groups – таблички сквадов и групп, если нам нужно переопределять родные группы сталкеров на какие либо другие. В каждой работе можно указать какой сквад и группа сетится сталкеру при установке на работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Примерное описание работ гулага:&amp;lt;br&amp;gt;&lt;br /&gt;
Данный гулаг описывает поведение только одного человека, обычно их гораздо больше. Данный человек в нулевом состоянии(день) делает одну работу, в первом состоянии(ночь) делает другую работу.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Garbage maniac&lt;br /&gt;
if type == &amp;quot;gar_maniac&amp;quot; then&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_camper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {0},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;, &lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
	t = { section   = &amp;quot;logic@gar_maniac_sleeper&amp;quot;,&lt;br /&gt;
	      idle      = 0,&lt;br /&gt;
	      prior     = 5,&lt;br /&gt;
	      state     = {1},&lt;br /&gt;
	      squad     = squad,&lt;br /&gt;
	      groups    = groups[1],&lt;br /&gt;
	      in_rest   = &amp;quot;&amp;quot;,&lt;br /&gt;
	      out_rest  = &amp;quot;&amp;quot;,&lt;br /&gt;
	      info_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	table.insert(sj, t)		&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Описание полей:&amp;lt;br&amp;gt;&lt;br /&gt;
Idle – пауза между повторным выполнениями одного и того же задания. В данном случае паузы нет. Обычно пауза ставится на патруль.&amp;lt;br&amp;gt;&lt;br /&gt;
Prior – приоритет задания. Сперва сталкеры занимают более приоритетные задания. Чем больше число, тем выше приоритет.&amp;lt;br&amp;gt;&lt;br /&gt;
In_rest, out_rest   -  рестрикторы, которые устанавливаются персонажу на данное задание.&amp;lt;br&amp;gt;&lt;br /&gt;
Section – секция в \gamedata\config\misc\gulag_название_уровня.ltx,  где указываются реальные настройки схемы поведения, которая соответствует текущей работе.&amp;lt;br&amp;gt;&lt;br /&gt;
Group сталкера будет выбран из массива groups, который задан в custom data. Массив индексируется начиная с 1.&amp;lt;br&amp;gt;&lt;br /&gt;
Info_rest – задает ся имя рестриктора и все денжеры снаружи этого рестриктора не попадают внутрь для человека, находящегося на этой работе&amp;lt;br&amp;gt;&lt;br /&gt;
Также в описании работы может быть указаны дополнительные условия, при которых сталкер может занять данную работу. Например: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;predicate = function(obj) &lt;br /&gt;
        return obj:profile_name() == &amp;quot;soldier_commander&amp;quot;			           &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
то есть данную работу сможет выполнять лишь персонаж с профилем soldier_commander.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. В \gamedata\config\misc\gulag_название_уровня.ltx необходимо указать, какие схемы поведения соответсвуют той или иной работе. Например в случае с вышерассмотренным гулагом gar_maniac:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;;----------------------------&lt;br /&gt;
;-- GARBAGE MANIAC&lt;br /&gt;
;----------------------------&lt;br /&gt;
[logic@gar_maniac_camper]&lt;br /&gt;
active = camper@gar_maniac_camper&lt;br /&gt;
&lt;br /&gt;
[camper@gar_maniac_camper]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
&lt;br /&gt;
[logic@gar_maniac_sleeper]&lt;br /&gt;
active = sleeper@gar_maniac_sleeper&lt;br /&gt;
&lt;br /&gt;
[sleeper@gar_maniac_sleeper]&lt;br /&gt;
path_main = sleep&lt;br /&gt;
wakeable = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
Настройка здесь соответствует настроке в обычной кастом дате сталкера, с разницей:&amp;lt;br&amp;gt;&lt;br /&gt;
1)	пути следует указывать без префикса. То есть если зонка носила название gar_maniac, то пути следует на уровне ставить с названием gar_maniac_walk1, однако в gamedata\config\misc\gulag_название_уровня.ltx следует указывать только walk1.&amp;lt;br&amp;gt;&lt;br /&gt;
2)	в именах секций схем поведения после @ добавлять название гулага и, возможно, дополнительные сведения (например, walker2@rad_antena_gate)&amp;lt;br&amp;gt;&lt;br /&gt;
3)	в именах секций logic для каждой работы добавлять после @ имя гулага, дополнительные сведения и имя секции активной схемы поведения (например, logic@rad_antena_gate_walker2).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В работах для гулагов поля leader больше нет. Есть поле dependent. Работа может быть занята только тогда, когда работа с именем dependent уже занята. Например, follower может быть назначен только тогода, когда уже кто-то назначен на работу лидера (имя работы лидера теперь в поле dependent). Естественно, что приоритет работ, от которых зависят другие, должен быть больше чем у них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.11.3. Новые особенности смарттеррейнов==&lt;br /&gt;
Возможности нового смарттеррейна (СТ):&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.&amp;lt;br&amp;gt;&lt;br /&gt;
2) Сталкеры идут на ближайшие работы.&amp;lt;br&amp;gt;&lt;br /&gt;
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.&amp;lt;br&amp;gt;&lt;br /&gt;
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.&amp;lt;br&amp;gt;&lt;br /&gt;
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.&amp;lt;br&amp;gt;&lt;br /&gt;
6) Работы могут находиться на разных уровнях.&amp;lt;br&amp;gt;&lt;br /&gt;
7) Скриптовая зона СТ теперь не используется для захвата персонажей.&amp;lt;br&amp;gt;&lt;br /&gt;
8) Симуляция заключается в миграции персонажей между разными СТ.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что нужно переделать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1) Персонажи могут быть двух типов: либо для СТ, либо для самостоятельной работы под логикой из custom data. У первых логики в custom data не должно быть. У вторых должно быть прописано, что они не хотят ни в один СТ. (см ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
2) Нельзя под СТ отправлять сталкеров в nil. Вместо nil дайте им пути. Например, walker-ы в рестрикторе вместо nil в рестрикторе. (есть abort на такой случай)&amp;lt;br&amp;gt;&lt;br /&gt;
3) Всех участников созданных сцен поставьте рядом с местами работ, а не в кучу. Так им не придётся полчаса разбредаться по местам работ: они сразу позанимают ближайшие. В custom data им пропишите, что до окончания сцены они могут быть только в этом СТ. (см. ниже)&amp;lt;br&amp;gt;&lt;br /&gt;
4) Незначительно переделать функции predicate() и функции переключения состояния СТ. (см. ниже)&lt;br /&gt;
5) Проследите, чтоб под СТ в логиках в поле active было прописано только имя секции и ничего больше (никаких там процентов и фигурных скобок). Для персонажей не предназначенных под СТ это не играет роли.&lt;br /&gt;
6) Переименуйте в custom data СТ секцию [gulag1] в секцию [smart_terrain].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------- Настройки: -------------&lt;br /&gt;
&lt;br /&gt;
---- Разрешения персонажам идти в определённые СТ ----&lt;br /&gt;
&lt;br /&gt;
Разрешения персонажам идти в определённые СТ задаются в custom data секцией [smart_terrains]. В ней можно задавать пары &amp;quot;имя_СТ = condlist&amp;quot;. Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
strn_1 = условие1&amp;lt;br&amp;gt;&lt;br /&gt;
strn_2 = условие2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для какого-то smart_terrain условие выполнилось, он называется эксклюзивным.&amp;lt;br&amp;gt;&lt;br /&gt;
Если у объекта появился хоть один эксклюзивный smart terrain, то он будет согласен идти только в него.&lt;br /&gt;
Если не появилось ни одного эксклюзивного, то он согласен идти в любой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть зарезервированное сочетание &amp;quot;none=true&amp;quot;. Если оно указано, то персонаж никогда не пойдёт ни в один СТ. Такой персонаж будет работать только под своей логикой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно задать, кого принимает СТ. В дополнение к старому механизму (функции checkNpc() в файлах gulag_*.script) можно в custom data СТ написать:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
communities = группирвка1, группировка2, ...&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если это поле не задано, то проверяется старым механизмом. Если задано, то под СТ возьмутся только персонажи указанных группировок (учтите, старый механизм тоже вызовется).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций predicate() ----&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В эти функции вместо game_object будет передаваться табличка с информацией о персонаже. Там есть поля:&amp;lt;br&amp;gt;&lt;br /&gt;
name&amp;lt;br&amp;gt;&lt;br /&gt;
community&amp;lt;br&amp;gt;&lt;br /&gt;
class_id&amp;lt;br&amp;gt;&lt;br /&gt;
story_id&amp;lt;br&amp;gt;&lt;br /&gt;
profile_name&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно, чтобы работа занималась только снайперами, то в предикате нужно писать:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
predicate = function(npc_info)&lt;br /&gt;
        return npc_info.is_sniper == true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Изменение функций переключения состояния СТ ----&lt;br /&gt;
&lt;br /&gt;
Обращайтесь индивидуально. Все переделки связаны с работой этой функции в офлайне. Например, таблица gulag.Object[] не содержит game_object-ы, если персонаж в офлайне и т.п.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---- Состояния работ online/offline&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
t = { section = &amp;quot;logic@ЧЧЧЧЧЧЧЧ&amp;quot;, &lt;br /&gt;
        idle = 0,&lt;br /&gt;
        prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
        online = true,&lt;br /&gt;
        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
table.insert(sj, t)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Варианты задания этого поля&amp;lt;br&amp;gt;&lt;br /&gt;
online = true - на этой работе персонаж всегда в онлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online = false - на этой работе персонаж всегда в офлайне,&amp;lt;br&amp;gt;&lt;br /&gt;
online не задано - на этой работе персонаж может прыгать онлайн&amp;lt;-&amp;gt;офлайн по своему усмотрению.&amp;lt;br&amp;gt;&lt;br /&gt;
3.11.3.1. Более доступное описание новых смарттеррейнов&amp;lt;br&amp;gt;&lt;br /&gt;
	Теперь о смарттерейнов для дизанеров, то есть не на LUA, а по-русски.&amp;lt;br&amp;gt;&lt;br /&gt;
Для того, чтобы пренести смарттеррейн на новую схему, делаем следующее:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Пишем в кастом дате где [gulag1] -&amp;gt; [smart_terrain]&amp;lt;br&amp;gt;&lt;br /&gt;
2. В кастом дате товарищей по смарттеррейну пишем &amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
sar_monolith_sklad(название гулага) = {кондлист} - если только в 1 смарттеррейн сталкер сможет прийти, то пишем true.&amp;lt;br&amp;gt;&lt;br /&gt;
Если этот товарищ не должен работать под смарттеррейнами, то пишем ему в кастом дату.&amp;lt;br&amp;gt;&lt;br /&gt;
[smart_terrains]&amp;lt;br&amp;gt;&lt;br /&gt;
none = true&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==3.12. Логика вертолёта==&lt;br /&gt;
Общие сведения:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вертолёт работает на «логике».&amp;lt;br&amp;gt;&lt;br /&gt;
На вертолёт реагируют аномалии.&amp;lt;br&amp;gt;&lt;br /&gt;
Вертолёт не обрабатывает столкновения с геометрией и физикой пока он не сбит.&amp;lt;br&amp;gt;&lt;br /&gt;
Попадания в область кабины, где сидит первый пилот, в десятки раз более болезненны для вертолёта.&amp;lt;br&amp;gt;&lt;br /&gt;
У вертолёта есть универсальная боевая схема на манер сталкеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Пилоты вертолета реагируют репликами на события: хит, видит врага, поврежден (задымился), падает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.12.1. Схема heli_move:==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
Позволяет летать вертолёту по патрульному пути, регулировать скорость, зависать, стрелять по различным целям.&lt;br /&gt;
&lt;br /&gt;
Для схемы должен быть задан path_move – путь, по которому будет летать вертолёт. Он может содержать одну вершину, если нужно, чтоб вертолёт висел на месте.&lt;br /&gt;
&lt;br /&gt;
Можно (но не обязательно) задать path_look – путь, в вершины которого вертолет может смотреть.&lt;br /&gt;
&lt;br /&gt;
Вершины этих путей могут быть поставлены где угодно в пределах ограничивающего бокса уровня. Они не зависят от ai-nodes.&lt;br /&gt;
&lt;br /&gt;
По пути вертолёт летает без учёта связей между вершинами. Он летает от вершины к вершине в порядке возрастания их номера (т.е. в порядке, в котором их поставили на уровень). &lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать точно по вершинам пути. При желании можно сделать ювелирный пролёт под мостом.&lt;br /&gt;
&lt;br /&gt;
Вертолёт старается летать как можно быстрее. Пояснение: если ему задать, что в следующей вершине пути он должен иметь скорость 10 м/с, а его максимальная скорость установлена в 30 м/с, то он не станет сразу лететь 10 м/с. Он сначала будет разгоняться вплоть до 30 м/с и только на подлёте к целевой вершине начнёт тормозить с расчётом прибыть в неё имея 10 м/с.&lt;br /&gt;
 &lt;br /&gt;
Если в вершине пути path_move задан набор флажков, то вертолёт будет смотреть в любую из вершин path_look, в которых задан такой же набор флажков. Поворачиваться к этой точке вертолёт начнёт с предыдущей вершины пути. На данном этапе вертолет не может, зависнув в одном месте, смотреть поочередно в несколько точек path_look&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
*engine_sound = true/false (по умолчанию true)&lt;br /&gt;
Вкл/выкл звук двигателя вертолёта.&lt;br /&gt;
&lt;br /&gt;
*invulnerable = true/false (по умолчанию false)&lt;br /&gt;
Неуязвимость. Если true, вертолёт игнорирует все хиты.&lt;br /&gt;
&lt;br /&gt;
*immortal = true/false (по умолчанию false)&lt;br /&gt;
Бессмертие. Если true, вертолёт получает повреждения, но не умирает.&lt;br /&gt;
&lt;br /&gt;
*mute = true/false (по умолчанию false)&lt;br /&gt;
Отключает универсальные реплики пилотов вертолета.&lt;br /&gt;
&lt;br /&gt;
*rocket_delay = msec (время в миллисекундах реального времени)&lt;br /&gt;
	Задержака между пусками ракет. По дефолту берется из ltx (сейчас 1250 мсек)&lt;br /&gt;
&lt;br /&gt;
*default_velocity = m/sec (скорость с которой летает вертолет, если не заданы другие параметры)&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_move:&lt;br /&gt;
&lt;br /&gt;
«e» – (сокр. от enemy) задание врага (цели). Стрелять по этой цели вертолёт начнёт уже в предыдущей вершине. Если значение не задано, то будет стрелять в точку из path_look, которая соответствует данной вершине. Если задано «e=actor» (можно сокращённо «e=a»), то огонь будет вестись по актёру. Если задано «e=число», стрелять будет по объекту со story id равным числу.&lt;br /&gt;
&lt;br /&gt;
«w» – (сокр. от weapon) каким оружием стрелять. Возможные значения: w=1 – стрелять только пулемётом; w=2 – стрелять только ракетами. По умолчанию стреляет из всего.&lt;br /&gt;
&lt;br /&gt;
«v» - (сокр. от velocity) задание максимальной скорости (в м/с) на участке пути от данной вершины до следующей. Если этот параметр не задан, то умолчание берётся из файла helicopter.ltx.&lt;br /&gt;
&lt;br /&gt;
«dv» - (сокр. от destination velocity) задание скорости (в м/с), которую вертолёт должен иметь в момент прибытия в данную вершину.&lt;br /&gt;
&lt;br /&gt;
«die» - убить вертолёт.&lt;br /&gt;
&lt;br /&gt;
«flame» - начать дымить (как будто подбили).&lt;br /&gt;
&lt;br /&gt;
Параметры, задаваемые в именах вершин пути path_look:&lt;br /&gt;
&lt;br /&gt;
«e» - работает так же как и в path_move. Разница в том, что стрелять по указанной цели вертолёт начнёт лишь тогда, когда прибудет в вершину пути path_move, которая соответствует данной вершине path_look.&lt;br /&gt;
&lt;br /&gt;
«w» – см. такой же параметр для пути path_move.&lt;br /&gt;
&lt;br /&gt;
«t» - (сокр. от time) длительность времени (в мс реального времени), на протяжении которого вертолёт будет смотреть в данную точку. Если этот параметр не задан, то вертолёт пронесётся без остановки, но постарается на ходу развернуться к этой вершине.&lt;br /&gt;
&lt;br /&gt;
==3.12.2. Универсальная боевая схема: heli_combat ==&lt;br /&gt;
Общие сведения:&lt;br /&gt;
&lt;br /&gt;
В универсальной боевой схеме вертолёт не привязан к путям.&lt;br /&gt;
&lt;br /&gt;
Вертолёт не видит никого. Узнать о враге вертолёт может только при получении хита или из параметра в custom data.&lt;br /&gt;
&lt;br /&gt;
Вертолёт стреляет по врагу, если видит его. Если не видит – ищет, облетая вокруг точки, где последний раз видел. Если долго не видит врага – забывает его. Если врага задали принудительно из текущей секции схемы поведения, то он не забудет его, пока находится в этой секции.&lt;br /&gt;
&lt;br /&gt;
Настройки:&lt;br /&gt;
&lt;br /&gt;
Отдельной секции для этой схемы поведения нет. Поэтому настройки производятся в секции текущей схемы поведения:&lt;br /&gt;
&lt;br /&gt;
combat_ignore = true/false&lt;br /&gt;
true означает игнорирование получения хита. Т.е. вертолёт не будет пытаться «отомстить» тому, от кого он получил хит.&lt;br /&gt;
&lt;br /&gt;
combat_enemy = nil/actor/StoryID&lt;br /&gt;
С помощью этого параметра можно задать вертолёту конкретного врага. nil – нету врага; actor – игрок; SID – числовое story id врага.&lt;br /&gt;
&lt;br /&gt;
combat_use_rocket = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться рокетами.&lt;br /&gt;
&lt;br /&gt;
combat_use_mgun = true/false&lt;br /&gt;
Можно ли вертолёту пользоваться пулемётом.&lt;br /&gt;
&lt;br /&gt;
combat_velocity = &amp;lt;число&amp;gt;&lt;br /&gt;
Скорсть, с которой вертолет будет делать боевые заходы&lt;br /&gt;
&lt;br /&gt;
combat_safe_altitude = &amp;lt;число&amp;gt;&lt;br /&gt;
Высота, относительно самой высокой точки геометрии на уровне ниже которой вертолет не будет опускаться в боевой схеме (может быть отрицательным)&lt;br /&gt;
&lt;br /&gt;
К вертолёту подключена схема xr_hit. Работает как у сталкеров. В xr_effects есть группа функций для работы с вертолётом из его custom data:&lt;br /&gt;
&lt;br /&gt;
heli_set_enemy_actor - сделать актёра врагом вертолёту&lt;br /&gt;
heli_start_flame - поджечь вертолёт&lt;br /&gt;
heli_die - убить вертолёт&lt;br /&gt;
&lt;br /&gt;
combat_velocity =	- боевая скорость в этой секции указывается в м/с&lt;br /&gt;
combat_safe_altitude =	- высота боевая в метрах, может принимать отрицательные значения&lt;br /&gt;
combat_use_rocket =	- true/false использовать ли ракеты в этой секции&lt;br /&gt;
combat_use_mgun = 	- true/false использовать ли пулемет в этой секции&lt;br /&gt;
&lt;br /&gt;
==3.13. Meet_manager==&lt;br /&gt;
&lt;br /&gt;
Синтаксис:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
meet = meet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[walker]&amp;lt;br&amp;gt;&lt;br /&gt;
meet = meet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[meet]&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state 		= 30| state@sound| 20| state@sound| 10| state@sound&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state_wpn 	= 30| state@sound| 20| state@sound| 10| state@sound&amp;lt;br&amp;gt;&lt;br /&gt;
victim 			= 30| nil| 20| actor&amp;lt;br&amp;gt;&lt;br /&gt;
victim_wpn 		= 30| nil| 20| actor&amp;lt;br&amp;gt;&lt;br /&gt;
use			= self&amp;lt;br&amp;gt;&lt;br /&gt;
use_wpn		= false&amp;lt;br&amp;gt;&lt;br /&gt;
zone			= name| state@sound&amp;lt;br&amp;gt;&lt;br /&gt;
meet_dialog		= dialog_id&amp;lt;br&amp;gt;&lt;br /&gt;
synpairs		= state@sound|state@sound&amp;lt;br&amp;gt;&lt;br /&gt;
abuse			= true/false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вся настройка встречи отныне будет производится в отдельной секции. В секции logic или в текущей схеме можно будет указать, какую именно секцию с настройкой нужно использовать. Секция, которая указана в секции logic будет влиять на обработку встречи свободногулящим сталкером.&lt;br /&gt;
&lt;br /&gt;
Перечень полей:&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state, meet_state_wpn – задает анимацию и озвучку персонажа, в зависимости от расстояния до актера. Для случая если актер безоружен либо вооружен соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
victim, victim_wpn – задает объект, на который должен будет смотреть персонаж. Возможные параметры: nil – никуда не смотрит, actor – смотрит на игрока, story_id – номер стори айди персонажа, на которого нужно будет смотреть.&amp;lt;br&amp;gt;&lt;br /&gt;
use, use_wpn – настройки юзабельности персонажа. Возможны три варианта: true, false, self. При self НПС сам юзнет игрока, как только сможет дотянуться &amp;lt;br&amp;gt;&lt;br /&gt;
zone – Содержит набор имен рестрикторов, а также анимаций и озвучки, которую НПС будет отыгрывать, если игрок будет замечен в рестрикторе&amp;lt;br&amp;gt;&lt;br /&gt;
meet_dialog – стартовый диалог НПС.&amp;lt;br&amp;gt;&lt;br /&gt;
synpairs – cодержит набор пар состояние_тела@звуковая_тема. Если при каком то наборе условий встреча будет отыгрывать именно это состояние и эту звуковую тему – то они будут синхронизироваться по рандомным анимациям состояния тела.&amp;lt;br&amp;gt;&lt;br /&gt;
аbuse – по умолчанию true, если false, то неюзающийся противник не будет обижаться.&amp;lt;br&amp;gt;&lt;br /&gt;
Любую строку(в общей схеме они написаны строчными буквами) можно задавать кондлистом. ( {+info1 –info2} ward %+info%  )&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для облегчения настройки встречи сделана возможность упрощенного  задания дефолта:&lt;br /&gt;
&lt;br /&gt;
[walker]&amp;lt;br&amp;gt;&lt;br /&gt;
meet = default_meet&lt;br /&gt;
&lt;br /&gt;
Саму секцию [default_meet] задавать не надо. Все настройки и так  возьмутся из дефолта.&lt;br /&gt;
&lt;br /&gt;
Теперь о том, как с помощью этого конструктора собрать ту реакцию на актера, которая вам нужна (Во всех примерах зеленым цветом выделены состояния state_manager, синим – звуковые темы):&lt;br /&gt;
&lt;br /&gt;
===Ситуация 1===&lt;br /&gt;
	Игрок вдалеке подзывает нас рукой, при приближении просит убрать оружие, потом согласен говорить.&lt;br /&gt;
&lt;br /&gt;
[meet]&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state 		= 50| hello@talk_hello| 20| wait@wait| 10| ward@wait&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state_wpn 	= 50| hello@talk_hello| 20| threat@threat_weap&amp;lt;br&amp;gt;&lt;br /&gt;
victim 			= 50| actor&amp;lt;br&amp;gt;&lt;br /&gt;
victim_wpn 		= 50| actor&amp;lt;br&amp;gt;&lt;br /&gt;
use			= true&amp;lt;br&amp;gt;&lt;br /&gt;
use_wpn		= false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ситуация 2===&lt;br /&gt;
	Сталкер завидя нас просит убрать оружие. После этого подходит и заговаривает с нами. Если мы начинаем уходить от него или достаем оружие – начинает нас стрелять.&lt;br /&gt;
&lt;br /&gt;
[meet]&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state		= 50| {+info} threat_fire %=killactor%, walk@ {+info} talk_abuse, wait | 10 | walk %+info%; wait | 2 | threat;state&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state_wpn 	= 50| {+info} threat_fire %=killactor%, threat@ {+info} talk_abuse, wait&amp;lt;br&amp;gt;&lt;br /&gt;
victim 			= 50| actor&amp;lt;br&amp;gt;&lt;br /&gt;
victim_wpn 		= 50| actor&amp;lt;br&amp;gt;&lt;br /&gt;
use			= {-info2} self, false&amp;lt;br&amp;gt;&lt;br /&gt;
use_wpn		= false&lt;br /&gt;
&lt;br /&gt;
Здесь: info – инфоропшн, который указывает что мы уже опустили оружие и были достаточно близко к НПС&amp;lt;br&amp;gt;&lt;br /&gt;
Info2 – инфопоршн, который устанавливается в диалоге и говорит что персонаж уже сказал нам все, что хотел.&amp;lt;br&amp;gt;&lt;br /&gt;
Killactor – функция в xr_effects которая обижает НПС на игрока.&lt;br /&gt;
&lt;br /&gt;
===Ситуация 3===&lt;br /&gt;
	Персонаж ходит по патрульному пути на заставе лагеря. Если игрок имеет допуск в лагерь – пропускает его и здоровается, иначе сперва отпугивает, а если игрок пробрался в лагерь – то обижается на него. При этом диалог зависит от того, имеет игрок допуск в лагерь или нет.&lt;br /&gt;
&lt;br /&gt;
[camper]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = path_walk&amp;lt;br&amp;gt;&lt;br /&gt;
path_look = path_look&amp;lt;br&amp;gt;&lt;br /&gt;
meet = meet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[meet]&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state 		= 30| {+info} wait, threat@ {+info} talk_hello, threat_back&amp;lt;br&amp;gt;&lt;br /&gt;
meet_state_wpn 	= 30| {+info} wait, threat@ {+info} talk_hello, threat_back &amp;lt;br&amp;gt;&lt;br /&gt;
victim 			= 30| actor&amp;lt;br&amp;gt;&lt;br /&gt;
victim_wpn 		= 30| actor&amp;lt;br&amp;gt;&lt;br /&gt;
use			= true&amp;lt;br&amp;gt;&lt;br /&gt;
use_wpn		= true&amp;lt;br&amp;gt;&lt;br /&gt;
zone			= warnzone| {-info} threat@ {-info} threat_back|kampzone| {-info} true@ {-info} talk_abuse&amp;lt;br&amp;gt;&lt;br /&gt;
meet_dialog		= {+info} dialog1, dialog2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь:&amp;lt;br&amp;gt;&lt;br /&gt;
True – вместо анимации, атаковать игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
Info – Инфопоршн, который говорит что мы имеем допуск к лагерю&amp;lt;br&amp;gt;&lt;br /&gt;
Warnzone – рестриктор, в котором нас предупреждают&amp;lt;br&amp;gt;&lt;br /&gt;
Kampzone – рестриктор, в котором нас убивают&amp;lt;br&amp;gt;&lt;br /&gt;
Dialog1 – стартовый диалог НПС, если мы имеем допуск в лагерь&amp;lt;br&amp;gt;&lt;br /&gt;
Dialog2 – стартовый диалог НПС, если мы не имеем допуск в лагерь.&amp;lt;br&amp;gt;&lt;br /&gt;
Дефолтные настройки:&amp;lt;br&amp;gt;&lt;br /&gt;
	По дефолту встреча настроена со следующими параметрами:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		meet_state		= 30|hello@hail|20|wait@wait&amp;lt;br&amp;gt;&lt;br /&gt;
		meet_state_wpn	= 30|backoff@threat_weap&amp;lt;br&amp;gt;&lt;br /&gt;
		victim		= 30|actor&amp;lt;br&amp;gt;&lt;br /&gt;
		victim_wpn		= 30|actor&amp;lt;br&amp;gt;&lt;br /&gt;
		use			= true&amp;lt;br&amp;gt;&lt;br /&gt;
		use_wpn		= false&amp;lt;br&amp;gt;&lt;br /&gt;
		syndata		= hello@hail|backoff@threat_weap&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB: Если нужно, чтобы сталкер не разговаривал с игроком в данной секции, необходимо прописать ему meet = no_meet&lt;br /&gt;
&lt;br /&gt;
==3.15.	Передача параметров в функции.==&lt;br /&gt;
Ниже перечислен набор функций к которым можно обращаться из кастом даты и при этом передавать в них переменные.&lt;br /&gt;
&lt;br /&gt;
NB! Во всех функциях xr_conditions и xr_effects, которые обращались к гулагам по имени, теперь можно использовать как имя, так и story id. Причем если мы указываем имя, то использовать функцию можно только, когда гулаг находится в онлайне, а если мы вешаем на самрттеррейн story_id, то можем обращаться к гулагу и в оффлайне.&lt;br /&gt;
&lt;br /&gt;
Описание функций с параметрами присутствующих в '''xr_conditions''' и '''xr_effects'''.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_conditions.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|actor_in_zone(restr)|| Функция проверки, что актёр в рестрикторе restr&lt;br /&gt;
|-&lt;br /&gt;
|actor_out_zone(restr)|| Функция проверки, что актёр не в рестрикторе restr&lt;br /&gt;
|- &lt;br /&gt;
|actor_enemy|| Функция проверки что актор - враг. Например: {=actor_enemy} означает &amp;quot;если актёр враг&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
|killactor|| Функция обижающая НПС на игрока. Например: on_info = {+failed} %=killactor% то при появлении поршня failed, НПС станет врагом актору&lt;br /&gt;
|- &lt;br /&gt;
|fighting_dist_ge(p)||Универсальная функция для combat_ignore, проверка расстояния для игрока(в метрах).&lt;br /&gt;
|-&lt;br /&gt;
|distance_to_obj_le(sid:dist)||Проверка дистанции до обьекта заданного story_id.&lt;br /&gt;
Можно использовать, например, в секции follower для определения того, что сталкер подошел на нужную дистанцию к лидеру&amp;lt;br&amp;gt;и переключать в другую секцию (лидер при этом стоит где-то в ремарке). Эта ситуация возникает, когда после боя надо&lt;br /&gt;
&amp;lt;br&amp;gt;подогнать одного сталкера к другому, а ихних позиций мы не знаем. Если используется в секции follower, то dist надо ставить&amp;lt;br&amp;gt; большим distance фолловера, поскольку если поставить их одинаковыми, то данная функция не всегда будет срабатывать.&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|heli_health_le(health)||Аналогично предыдущему, только для вертолета.&lt;br /&gt;
|-&lt;br /&gt;
|enemy_group(group1:group2:...)||Проверка на принадлежность врага к одной из групп (правильность работы пока не проверялась).&lt;br /&gt;
|-&lt;br /&gt;
|health_le(health)||Проверка того, что здоровье npc &amp;lt;= health.&lt;br /&gt;
|-&lt;br /&gt;
|hitted_by(sid1:sid2:...)||Проверка того, что удар был нанесен кем-то из npc, указанных в списке. npc задаются с помощью story_id. Функцию удобно использовать в секции hit.&lt;br /&gt;
Пример:&lt;br /&gt;
   [hit]&lt;br /&gt;
   on_info = {=hitted_by(407:408)} %+val_escort_combat%.&lt;br /&gt;
|-&lt;br /&gt;
|killed_by(sid1:sid2:...)||Аналогично предыдущему, но для случая смерти npc. Используется в секции death..&lt;br /&gt;
|-&lt;br /&gt;
|is_alive(sid)&amp;lt;br\&amp;gt;is_alive_one(sid1:sid2:...)&amp;lt;br\&amp;gt;is_alive_all(sid1:sid2:...) || Проверка того, что один, один из нескольких или все из списка соответственно npc, заданные по story_id живы.&lt;br /&gt;
|-&lt;br /&gt;
|is_dead(sid)&amp;lt;br&amp;gt;is_dead_one(sid1:sid2:...)&amp;lt;br&amp;gt;is_dead_all(sid1:sid2:...)||Аналогично предыдущему, только проверка на &amp;quot;мертвость&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|check_fighting(sid1:sid2:...)||Проверка того, не является ли кто-то из перечисленных (с помощью story_id) npc врагом данного. Как правило используется в combat_ignore_cond.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_empty(gulag_name)||Проверка того, что гулаг пуст или вообще не существует.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_population_le(gulag_name:num)||Проверка того, что количество народу в гулаге &amp;lt;= num.&lt;br /&gt;
|-&lt;br /&gt;
|gulag_casualities_ge(gulag_name:num)||Проверка того, что гулаг понес потери =&amp;gt; num.&lt;br /&gt;
NB! Потери гулага не обнуляются, так что с этой функцией работать аккуратно.&lt;br /&gt;
|-&lt;br /&gt;
|signal(строка)||Проверяет, установлен ли у данного НПС в текущей схеме указанный сигнал.&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | &amp;lt;big&amp;gt;xr_effects.script&amp;lt;/big&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|heli_set_enemy(story_id)||Cделать npc с указанным story_id врагом веротелу. В одной секции можно задавать только 1 врага.&lt;br /&gt;
|- &lt;br /&gt;
|set_gulag_enemy_actor(gulag_name)||Сделать актера врагом для данного гулага&lt;br /&gt;
|- &lt;br /&gt;
|hit_npc(direction:bone:power:impulse:reverse)||Нанести хит по npc.&lt;br /&gt;
Параметры:&lt;br /&gt;
   direction - если строка, то считается, что это имя пути и в сторону первой точки производится &amp;lt;br&amp;gt;толчек. Если же это число,  то оно рассматривается как story_id персонажа от которого должен &amp;lt;br&amp;gt;поступить хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара&lt;br /&gt;
   impulse - импульс&lt;br /&gt;
   reverse (true/false) - изменение направления удара на противоположное. по умолчанию false.&lt;br /&gt;
Пример:&lt;br /&gt;
   [death]&lt;br /&gt;
   on_info = {=killed_by(404)} %=hit_npc(404:bip01_spine1:100:2000)%, {=killed_by(405)} %=hit_npc(405:bip01_spine1:100:2000)%&lt;br /&gt;
|- &lt;br /&gt;
|set_friends(sid1:sid2:...)&amp;lt;br&amp;gt;set_enemies(sid1:sid2:...)||Установить друзьями/врагами данного npc и указанных в списке по story_id.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd(snd_name:delay=0)||Играть звук в голове актёра.&lt;br /&gt;
snd_name - путь к звуку относительно папки sounds&lt;br /&gt;
delay - задержка перед проигрыванием. По умолчанию 0 – проигрываем сразу.&lt;br /&gt;
|- &lt;br /&gt;
|play_snd_now (sid:snd_name)||Играть звук от указанного объекта.&lt;br /&gt;
*звук играется об объекта с указанным story id, без задержки с громкостью 1. Указывается не имя звуковой схемы, а имя файла.&lt;br /&gt;
|- &lt;br /&gt;
|hit_obj(sid, bone, power, impulse, hit_src=npc:position())||Дать обьекту, заданому story_id, хит. Отличается тем, что может прописываться в любой кастом дате. &lt;br /&gt;
Параметры: &lt;br /&gt;
actor, npc, p[sid,bone,power,impulse,hit_src=npc:position()]&lt;br /&gt;
   sid - story_id обьекта, по которому наносится хит.&lt;br /&gt;
   bone - строка. Имя кости, по которой наносится удар.&lt;br /&gt;
   power - сила удара.&lt;br /&gt;
   impulse - импульс.&lt;br /&gt;
   hit_src (необязательный параметр) - точка (waypoint), из которой по объекту наносится хит. &amp;lt;br&amp;gt;Если не задано, то берется позиция обьекта, из которого была вызвана данная функция.&lt;br /&gt;
|- &lt;br /&gt;
|actor_has_item(section)||Проверка на наличие у игрока соответствующего предмета. Проверка проходит по секции в ltx.&lt;br /&gt;
|- &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; style=&amp;quot;background-color:#dbe5f1;&amp;quot; | '''Функции для работы с HUD'ом.'''&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui_elements(...)&amp;lt;br\&amp;gt;enable_ui_elements(...)||Отключение/включение элементов HUD'а.&lt;br /&gt;
Параметры:&lt;br /&gt;
   weapon - спрятать/показать руки с оружием.&lt;br /&gt;
   input - отключить/включить клавиатуру.&lt;br /&gt;
   hud - спрятать/показать индикаторы на экране.&lt;br /&gt;
   all - отключить/включить все элементы.&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
   on_info = %=disable_ui_elements(weapon:input)%&lt;br /&gt;
|- &lt;br /&gt;
|disable_ui&amp;lt;br\&amp;gt;enable_ui||Аналогичны вызовам disable_ui_elements(all), enable_ui_elements(all) соответственно, только сокращённые. Вызываются без скобок и параметров.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=enable_ui%&lt;br /&gt;
|- &lt;br /&gt;
|run_cam_effector(file_name)|| Функция запуска camera_effector'а. file_name (указывается без расширения) - это имя анимационного файла (с расширением anm) из папки gamedata\anims\camera_effects\.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=run_cam_effector(prison_0)%&lt;br /&gt;
|- &lt;br /&gt;
|run_postprocess(file_name:id:loop)||Запуск постпроцесса.&lt;br /&gt;
Параметры:&lt;br /&gt;
   file_name - имя файла постпроцесса (без расширения) из папки gamedata\anims. Указывается без расширения.&lt;br /&gt;
   id - номер постпроцесса. Задается опционально. Используется в stop_postprocess.&lt;br /&gt;
   loop - (true/false) определяет зацикленность постпроцесса. Опциональный параметр. По умолчанию false.&lt;br /&gt;
|- &lt;br /&gt;
|stop_postprocess(id)||Принудительная остановка постпроцесса. id - номер постпроцесса заданный в run_postprocess.&lt;br /&gt;
|- &lt;br /&gt;
|drop_actor_inventory(имя_пути)||Выбрасываем все предметы из инвентаря актера в первую точку заданного&lt;br /&gt;
пути.&lt;br /&gt;
Пример:&lt;br /&gt;
   on_info = %=drop_actor_inventory(drop_point)%&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==3.16. Настройка звуковых групп.==&lt;br /&gt;
	Новый принцип создания звуковых групп:&amp;lt;br&amp;gt;&lt;br /&gt;
1. Каждый персонаж по умолчанию считается находящимся в уникальной саундгруппе.&amp;lt;br&amp;gt;&lt;br /&gt;
2. Для того, чтобы объеденить нескольких персонажей в единую саундгруппу, необходимо в секции логики прописать soundgroup = &amp;lt;текстовая строка&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Звуковые группы должны быть уникальными в пределах уровня, а еще лучше в пределах всей игры. Для этого указывайте в звуковой группе идентификатор уровня и сценки, например:&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = bar_dolg_kampfire1&amp;lt;br&amp;gt;&lt;br /&gt;
3. Объеденять в звуковые группы необходимо персонажей сидящих в кемпе и идущих в патрулях. А также при других схожих ситуациях. &amp;lt;br&amp;gt;&lt;br /&gt;
4. Дабы избежать ошибок при обижании, наподобие той, которая сейчас проявляется в лагере на эксейпе, необходимо чтобы все НПС, логически относящиеся к одному лагерю имели одинаковый team, squad, group&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&amp;lt;br&amp;gt;&lt;br /&gt;
[kamp@esc_bridge_post1]&amp;lt;br&amp;gt;&lt;br /&gt;
center_point = kamp_point&amp;lt;br&amp;gt;&lt;br /&gt;
soundgroup = esc_bridge_soldiers&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Оригинальный doc ([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/logic_setup.doc Ссылка])&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Доки скриптеров 1935([http://stalkerin.gameru.net//downloads/other/for_wiki_articles/doc_scripters.rar Ссылка])&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2</id>
		<title>Настройка логики. Часть 2</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_2"/>
				<updated>2012-05-07T18:12:46Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Оверрайды */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Секции.=&lt;br /&gt;
==Секция combat==&lt;br /&gt;
Показывает, что происходит, когда NPC срывается в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info =  {+info -info =func !func ~number}%+info -info =func%''''' -  эффекты, которые вызываются когда NPC уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для задания различных типов скриптовых боёв для различных ситуаций используется параметр '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В следующем примере сталкер сражается:&amp;lt;br&amp;gt;&lt;br /&gt;
:*по-камперски, если враг - актёр и он дальше Х метров;&lt;br /&gt;
:*по-монолитовски, если любой враг дальше Y метров;&lt;br /&gt;
:*иначе - движковый бой.&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = ...&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = {=fighting_actor =fighting_ge_X_meters} camper, &amp;lt;br&amp;gt;{=fighting_ge_Y_meters} monolith&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример такой функции: нам надо чтобы на расстоянии свыше 20 метров npc переходил бы в кемперский комбат.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;lua&amp;gt;function fighting_dist_ge_20(actor, npc)&lt;br /&gt;
    return db.storage[npc:id()].enemy:position():distance_to ( npc:position() ) &amp;gt;= 400 &lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
'''''Примечание''''': 400 – это 20&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. Мы пишем квадрат нужного нам расстояния, для экономии системных ресурсов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё один пример. Сталкер ходит под симуляцией, но у него бой не движковый, а всегда зомбированый:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = nil&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = zombied&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в разных секциях для персонажа требуются разные типы боя или разные условия, то можно воспользоваться оверрайдом   '''''combat_type'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Помните(!)''''': оверрайд всегда будет перекрывать настройку в секции '''''combat'''''. Т.е., если у вас логика на три секции и в двух из них нужен камперский комбат, а в третьей - монолитовский, то можно задать так:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker1&lt;br /&gt;
on_combat = combat&lt;br /&gt;
&lt;br /&gt;
[walker1]&lt;br /&gt;
...&lt;br /&gt;
[walker2]&lt;br /&gt;
...&lt;br /&gt;
[walker3]&lt;br /&gt;
...&lt;br /&gt;
combat_type = monolith&lt;br /&gt;
&lt;br /&gt;
[combat]&lt;br /&gt;
combat_type = camper&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_effects.script'' есть функция отключающая секцию '''''combat''''' - '''''disable_combat_handler'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Секция death==&lt;br /&gt;
Схема показывает, что происходит при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются при смерти NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_death = death@mil_freedom_max_combat1&lt;br /&gt;
&lt;br /&gt;
[death@mil_freedom_max_combat1]&lt;br /&gt;
on_info = %=military_max_dead +sar2_death_47%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_death.script''&lt;br /&gt;
&lt;br /&gt;
==Cекция hit==&lt;br /&gt;
Схема показывает, что происходит при нанесении повреждения NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit = hit'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[hit]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если NPC нанесён хит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_hit''''' НЕ СРАБАТЫВАЕТ на звук выстрела, только на попадание по сталкеру! Это сделано, потому что выстрел в воздух в общем случае не должен восприниматься как агрессия (игрок отстреливает, скажем, собак, а на него срывается охрана).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_hit = on_hit@agr_factory_hold_fake&lt;br /&gt;
&lt;br /&gt;
[on_hit@agr_factory_hold_fake]&lt;br /&gt;
on_info = {=hit_by_actor} %+agr_krot_skirmish_start%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_hit.script''&lt;br /&gt;
&lt;br /&gt;
==Секция actor_dialogs==&lt;br /&gt;
Показывает, какие диалоги будут доступны или недоступны игроку при разговоре с этим NPC. Пишется практически в любой схеме.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''actor_dialogs = actor_dialogs'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[actor_dialogs]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''id = &amp;lt;название_диалога&amp;gt;''''' - доступные диалоги, перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''disable = &amp;lt;название_диалога&amp;gt;''''' - запрещенные диалоги, тоже через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
actor_dialogs = actor_dialogs&lt;br /&gt;
&lt;br /&gt;
[actor_dialbr&amp;gt;&lt;br /&gt;
:*'''''story_id''''' – числовое значениеogs]&lt;br /&gt;
id = yantar_general_ucheniy_talk_start,yantar_general_ucheniy_talk_end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_meet.script''&lt;br /&gt;
&lt;br /&gt;
==Секция use==&lt;br /&gt;
Схема показывает, что произойдет, если игрок попытается взаимодействовать с NPC.&lt;br /&gt;
&lt;br /&gt;
'''''on_use = use'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[use]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые вызываются в случае, если игрок попытается взаимодействовать с NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
on_use = use@mil_dolg_leader&lt;br /&gt;
 &lt;br /&gt;
[use@mil_dolg_leader]&lt;br /&gt;
on_info = {=gulag_empty(mil_lager)} %+mil_dolg_leader_reward%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_use.script''&lt;br /&gt;
&lt;br /&gt;
==Секция combat_ignore==&lt;br /&gt;
Если для NPC установлена данная секция то он, не переходит в боевой режим.&amp;lt;br&amp;gt;&lt;br /&gt;
Для секции нет дополнительных полей.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore = combat_ignore'''''&lt;br /&gt;
&lt;br /&gt;
'''[combat_ignore]'''&lt;br /&gt;
&lt;br /&gt;
В любой другой схеме можно задать оверрайд, который позволит игнорировать бой только по выполнению условия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker] '''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если для оверрайда задать значение '''''always''''', то в данной схеме NPC будет игнорировать бой всегда, пока не перейдет в схему, где бой не игнорируется.&amp;lt;br&amp;gt;&lt;br /&gt;
Таким образом, можно задавать игнорирование боя только будучи под определённой схемой, в отличии от секции, которая запрещает бой в любом случае.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''xr_condition.script'' есть функции, используемые для работы с кондлистом оверрайда:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge_20''''' - текущий враг на расстоянии больше или равном 20м;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_dist_ge''''' – универсальная функция, проверка расстояния для игрока;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''fighting_actor''''' - текущий враг актёр?;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''check_fighting''''' - проверка (по '''''story_id''''') того, что нашим врагом есть хотя бы кто-то один из списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования секции:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat_ignore.script''&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_character_supplies==&lt;br /&gt;
Если прописать эту секцию в кастом дату персонажу, то у него внутри не заспавниться стандартный набор барахла, прописанный в в его профиле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[dont_spawn_character_supplies]'''&lt;br /&gt;
&lt;br /&gt;
==Секция threshold==&lt;br /&gt;
Есть возможность изменять у сталкеров параметры, по которым они атакуют монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''threshold = threshold'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[threshold]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_ignore_distance = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 15 метров). Сталкер будет всегда атаковать монстров, которые находятся внутри данного радиуса.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_monster = &amp;lt;number&amp;gt;''''' - (в данный момент дефолт 0). Параметр от 0 до 1. Если функция оценки монстра ниже, чем этот параметр, и монстр находится за пределами вышеуказанного радиуса - он будет атакован. В данный момент все настроено так, что сталкеры вообще не атакуют монстров находящихся дальше чем 15 метров от них.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': второй параметр следует менять '''ОЧЕНЬ''' осторожно. Помните, в него нужно вписывать значение ''от 0 до 1''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
...&lt;br /&gt;
threshold = threshold@mil_fbarier&lt;br /&gt;
&lt;br /&gt;
[threshold@mil_fbarier]&lt;br /&gt;
max_ignore_distance = 150&lt;br /&gt;
ignore_monster = 0.1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
==Секция Danger==&lt;br /&gt;
Секцию необходимо указывать '''только для какой-то конкретной схемы'''!&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''danger = danger_condition'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[danger_condition]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется &amp;quot;живая&amp;quot; опасность (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_grenade = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется граната (15 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_corpse = &amp;lt;number&amp;gt;''''' - расстояние свыше которого игнорируется труп (10 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_hit = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется хит (150 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ignore_distance_sound = &amp;lt;number&amp;gt;''''' -  расстояние свыше которого игнорируется звук (50 метров по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_grenade = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о гранате (20000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_corpse = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о трупе (10000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_hit = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о хите (60000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_sound = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о звуке (15000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_inertion_time_ricochet = &amp;lt;number&amp;gt;''''' - время, спустя которое, NPC забудет о рикошете (30000 миллисекунд по умолчанию).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''danger_expiration_time = &amp;lt;number&amp;gt;''''' - время, через которое денжер перестанет быть акутальным. (5000 миллисекунд по умолчанию)&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': NPC в принципе игнорируют авто с секцией '''''m_car'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если надо, чтобы в разных случаях сталкер игнорировал разные типы данжеров, создается несколько секций данжера '''''danger_condition@1''''', '''''danger_condition@2''''' и так далее.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[camper@dar_military_scout_camper3]&lt;br /&gt;
...&lt;br /&gt;
danger = danger_condition@scout&lt;br /&gt;
&lt;br /&gt;
[danger_condition@scout]&lt;br /&gt;
ignore_distance       = 10&lt;br /&gt;
ignore_distance_grenade = 10&lt;br /&gt;
ignore_distance_corpse  = 0&lt;br /&gt;
ignore_distance_danger_hit     = 20&lt;br /&gt;
ignore_distance_sound   = 0 &lt;br /&gt;
danger_inertion_time_hit = 1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata_1006\scripts\xr_danger.script''&lt;br /&gt;
&lt;br /&gt;
==Секция game_info==&lt;br /&gt;
&amp;quot;Обучает&amp;quot; NPC рассказывать у костра истории и легенды. Секция прописывается в '''''custom_data''''' NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[game_info]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stories = &amp;quot;&amp;lt;название_звуковой_темы&amp;gt;&amp;quot;''''' - имена звуковых тем из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несколько тем перечислять через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
Существуют следующие истории и легенды:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_01''''' - Граница зоны и граната за 1 действие;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_02''''' - Про трамплин и про камешки;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_03''''' - Про то, как группа Вильнова вернулась;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_04''''' - Про то, как Костя Федорин наткнулся на артефакт и пропал на радаре;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''story_05''''' - Про то, как духманам с контролером сражаться;br&amp;gt;&lt;br /&gt;
:*'''''story_06''''' - Про дверцу, водку и избушку;br&amp;gt;&lt;br /&gt;
:*'''''legend_01''''' - Про эксперимент в Зоне, который производят инопланетяне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_02''''' - Об особо засекреченных лабораториях в зоне;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_03''''' - Легенда о проводнике;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_04''''' - Легенда о темном Сталкере;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''legend_05''''' - Легенда о том что глубоко в Зоне спать нельзя.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[game_info]&lt;br /&gt;
stories = &amp;quot;story_04, legend_03, legend_04&amp;quot;&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция dont_spawn_loot==&lt;br /&gt;
Всякого рода сюжетные персонажи, которые должны быть пустыми после смерти (например раненные или пленные), оказываются не пустыми. Чтобы это исправить необходимо в '''''custom_data''''' персонажа прописать следующую секцию:&amp;lt;br&amp;gt;&lt;br /&gt;
'''[dont_spawn_loot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\death_manager.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды=&lt;br /&gt;
Настройки, которые меняют поведение общих схем, в зависимости от активной в данный момент обычной схемы (все они необязательны).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''combat_ignore_cond = {+info –info =func !func ~number}''''' – условия для игнорирования боя.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_keep_when_attacked = true/false''''' - NPC продолжает игнорировать бой, даже если в него стреляют – ''только в случае стрельбы игрока''!!!&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_type = {+info –info =func !func ~number} &amp;lt;параметр&amp;gt;''''' - тип боя которым будет пользоваться NPC из данной схемы. Возможны следующие значения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''camper'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''monolith'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''zombied'''''&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''nil'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat = {+info –info =func !func ~number} %+info -info =func%''''' - определяет поведение NPC при его уходе в бой.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''companion_enabled = true/false''''' - cвободноходящие сталкеры могут наниматься как компаньоны. Оверрайд существует, но не используется из-за недоработанной схемы ''xr_attendant.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_combat.script''&lt;br /&gt;
&lt;br /&gt;
==Отметки на минимапе==&lt;br /&gt;
Появилась возможность не показывать сталкеров на минимапе и на карте (прятать жёлтые и красные точки). Для этого в секции логики или в текущей схеме указываем параметр '''''show_spot'''''. Возможно наличие условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_spot = {+info -info =func !func ~number} true/false''''' - показывать или нет на карте. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\stalker_generic.script''&lt;br /&gt;
&lt;br /&gt;
=Схемы для монстров=&lt;br /&gt;
&lt;br /&gt;
==Схема mob_walker==&lt;br /&gt;
Работает аналогично схеме обычного '''''walker'''''. Но есть некоторые отличия:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_walker]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_walk = &amp;lt;имя_пути&amp;gt;''''' - путь перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь обзора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_reset = true/false''''' - не сбрасывать '''''action''''' предыдущей схемы (если нужно сохранить, например, звук). По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': У кровосососов можно управлять невидимостью, для этого необходимо указать параметр '''''state''''':&lt;br /&gt;
:'''''state = invis/vis''''' - включить/выключить невидимость.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_walker]&lt;br /&gt;
path_walk = x18_snork_walk_1&lt;br /&gt;
path_look = x18_snork_look&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_walker.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_eluder==&lt;br /&gt;
Монстр перемещается по точкам патрульного пути (не учитывая связи между точками), держась на расстоянии от игрока, при этом придерживаясь своего пути, выходя из под схемы при слишком близком приближении к игроку, и возвращаясь обратно, когда расстояние увеличиться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_eluder]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path  = &amp;lt;имя_пути&amp;gt;''''' - работает как обычно path_walk. Набор точек патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_capture = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под этой схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_release = &amp;lt;number&amp;gt;''''' - время, которое монстр находится под универсальной схемой. По умолчанию – 10 секунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага меньше этого, то он переходит под универсальную схему. По умолчанию – 5 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''max_dist = &amp;lt;number&amp;gt;''''' - если расстояние до врага больше этого, то он переходит под '''''eluder'''''. По умолчанию – 10 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': '''работает нестабильно'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_eluder]&lt;br /&gt;
path = dar_way_checker&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_eluder.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_remark==&lt;br /&gt;
Ремарковая схема, только не для сталкеров, а для монстров.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_remark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''state = &amp;lt;параметр&amp;gt;''''' - специфическое состояние данного конкретного монстра (для кровососов - невидимость).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dialog_cond = {+info, =func, -info, !func ~number}''''' - условия для открытия окна диалога.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim = &amp;lt;название_анимации&amp;gt;''''' - анимации монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''anim.head = &amp;lt;название_анимации&amp;gt;''''' - анимации головы монстра, перечисляются через запятую.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip = &amp;lt;параметр&amp;gt;''''' - какой значок под светится, при наведении на него курсора.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;название_звуковой_темы&amp;gt;''''' - какой звук издает.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time = &amp;lt;number&amp;gt;''''' - время проигрывания анимаций, используется только для отладки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_remark@hold]&lt;br /&gt;
anim = stand_idle_0&lt;br /&gt;
time = 50000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\mob_remark.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_jump==&lt;br /&gt;
Схема '''''mob_jump''''' служит для задания прыжков монстров без каких либо проверок и ограничений (расстояние, углы и т.д.). Указывается позиция с помощью патрульного пути, смещение относительно этой позиции и физический фактор прыжка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_jump]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_jump = &amp;lt;имя_пути&amp;gt;''''' - путь, с помощью которого мы задаем 1 целевую точку прыжка (с нулевым индексом).&lt;br /&gt;
:Реальная точка учитывает позицию '''''path_jump[0]''''' + смещение, заданное с помощью '''''offset'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''ph_jump_factor = &amp;lt;number&amp;gt;''''' - влияет на время прыжка. Визуально с помощью него задается кривизна траектории полёта.&lt;br /&gt;
:Чем он больше, тем прыжок более острый, быстрый (меньше дуга). По умолчанию 1.8.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''offset = &amp;lt;vector&amp;gt;''''' - смещение по осям '''''x''''', '''''y''''', '''''z''''' соответственно, с помощью которого задается реальная точка в пространстве (может не находится на аи-ноде). &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью данной схемы можно делать: перепрыгивание со здания на здание, выпрыгивание из окна, перепрыгивание высоких ограждений и др.&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': фактически '''''mob_jump''''' - это не состояние, а разовое действие. При переходе в него монстр разворачивается в сторону прыжка и прыгает, поднимая сигнал '''''jumped'''''. Т.е. '''''on_signal = jumped | имя_схемы_или_nil''''' – является обязательным параметром в схеме, чтобы знать куда переходить дальше.&amp;lt;br&amp;gt;&lt;br /&gt;
При выборе позиции используется первая точка патрульного пути (0-вой индекс).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[mob_jump]&lt;br /&gt;
path_jump = aes_snork_jump1&lt;br /&gt;
ph_jump_factor = 1.8&lt;br /&gt;
offset = 0,0,0&lt;br /&gt;
on_signal = jumped | mob_walker2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_jump.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_camp==&lt;br /&gt;
&lt;br /&gt;
Свойства схемы:&lt;br /&gt;
:*Сидит на позиции, смотрит в точку;&lt;br /&gt;
:*Можно задать несколько позиций и время смены позиции;&lt;br /&gt;
:*Перемещается между позициями бегом;&lt;br /&gt;
:*При виде врага переходит под универсальную схему (комбат/паника и т.д);&lt;br /&gt;
:*Задаются минимальная и максимальная дистанции от врага до текущей camp-позиции;&lt;br /&gt;
:*Если враг уходит далеко - монстр возвращается на позицию;&lt;br /&gt;
&lt;br /&gt;
'''[mob_camp]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которых будет находиться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_look = &amp;lt;имя_пути&amp;gt;''''' - путь, состоящий из точек, в которые будет смотреть монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''time_change_point = &amp;lt;number&amp;gt;''''' - время изменения текущей camp-точки. По умолчанию - 10000 миллисекунд.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius  = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до camp-точки. По умолчанию - 30 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус  от врага до camp-точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''skip_transfer_enemy = true/false''''' – управляет передачей врагов от друзей. Если установлено в '''''true''''' и видит дружественного монстра, то его враги также становятся врагами.(для этого нужно всех монстров в разные '''''group''''' разнести).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Минимальный и максимальный радиус необходимы для игнорирования врага, если он убежал далеко и для возврата на текущую позицию. Учитывается дистанция от врага до текущей позиции. Если дистанция меньше '''''home_min_radius''''' - атакуем врага, пока враг не исчезнет или дистанция не будет больше '''''home_max_radius'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Две дистанции необходимы для того, чтобы избежать ситуации, когда игрок стоит на границе радиуса действия и входит/выходит в зону и монстр бегает то в свою camp-позицию, то на врага.&amp;lt;br&amp;gt;&lt;br /&gt;
Выбор текущей позиции производится случайным образом.&amp;lt;br&amp;gt;&lt;br /&gt;
Индексы точек пути для '''''path_home''''' и '''''path_look''''' должны совпадать (т.е. монстр сидит во второй точке '''''path_home''''' и смотрит во вторую точку '''''path_look''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Единственным необходимым параметром является '''''path_look'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Если не установлен '''''path_home''''', в качестве камперской точки учитывается позиция и нода объекта при спауне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы монстр смотрел в разные точки на кампер-позиции, '''''path_look''''' может состоять из нескольких точек.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обязательные требованием является:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''home_min_radius &amp;lt; home_max_radius''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*Количество точек путей '''''path_look''''' и '''''path_home должно быть равным.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
P.S. '''''mob_camp''''' можно использовать как альтернативу к монстрам под рестрикторами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_camp]&lt;br /&gt;
path_home = aes2_snork_walk3&lt;br /&gt;
path_look = aes2_snork_look3&lt;br /&gt;
home_min_radius  = 10&lt;br /&gt;
home_max_radius = 15&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_camp.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_home==&lt;br /&gt;
Схема является ещё одним решением по замене рестрикторов. Рекомендую все следующие гулаги монстров делать на '''''mob_home''''', а старые гулаги постепенно переводить на '''''mob_home'''''. У кого рестрикторы работают хорошо и красиво, их можно не трогать. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_home]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path_home = &amp;lt;имя_пути&amp;gt;''''' - точка, вокруг которой будут держаться монстр.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_min_radius = &amp;lt;number&amp;gt;''''' - минимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 20 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''home_max_radius = &amp;lt;number&amp;gt;''''' - максимальный радиус от врага до '''''path_home''''' точки. По умолчанию - 40 метров.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''aggressive_home''''' - в назначенную точку '''''path_home''''' монстры бегут а не идут.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание:&amp;lt;br&amp;gt;&lt;br /&gt;
Монстры держатся вокруг точек пути path_home. В атаке бросаются на врага, если враг внутри '''''home_min''''' радиуса, иначе прячутся в укрытия. Отсюда следует, что '''''home_min_radius''''' желательно делать таким, чтобы внутри было достаточно каверов. В айдле тоже обычно расходятся по каверам. '''''home_max_radius''''' сделан по принципу большого рестриктера в схеме '''''mob_camp'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': добавлена возможность задания минимального и максимального радиусов для схемы '''''mob_home''''' в флагах первой точки пути ('''''path_home'''''). Для этого введены флаги '''''minr''''' и '''''maxr'''''. В случае, если радиусы заданы и в секции и во флагах, то значение радиуса берется из '''''секции'''''. Если не задано ни там, ни там, то берутся дефолтные значения.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_home@gar_boars_nest]&lt;br /&gt;
path_home = home&lt;br /&gt;
home_min_radius = 25&lt;br /&gt;
home_max_radius = 50&lt;br /&gt;
aggressive_home&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_home.script''&lt;br /&gt;
&lt;br /&gt;
==Схема mob_fake_death==&lt;br /&gt;
&lt;br /&gt;
Появилась схема '''''mob_fake_death''''' для зомби. Необходимо для сценок, когда игрок идёт, а вокруг него начинают подниматься зомби.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_fake_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При входе в схему зомби падает, при выходе из схемы встает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[mob_fake_death]&lt;br /&gt;
on_actor_dist_le = 5 | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_fake_death.script''&lt;br /&gt;
&lt;br /&gt;
=Секции для монстров=&lt;br /&gt;
&lt;br /&gt;
==Секция mob_combat==&lt;br /&gt;
Секция работает аналогично схеме '''''combat''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_combat = mob_combat'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_combat]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {+info -info =func !func ~number}%+info -info =func%''''' - эффекты, которые вызываются когда монстр уходит в бой. Вызываются при каждом апдейте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@val_sos_bs]&lt;br /&gt;
...&lt;br /&gt;
on_combat = mob_combat&lt;br /&gt;
&lt;br /&gt;
[mob_combat]&lt;br /&gt;
on_info = nil %=disable_combat_handler%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_combat.script''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Секция mob_death==&lt;br /&gt;
Секция работает аналогично схеме '''''death''''' для NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''on_death = mob_death'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[mob_death]'''&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+info -info =func !func ~number} %+info -info =func% - эффекты, которые вызываются при смерти монстра.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[logic@gar_boars_nest_rush]&lt;br /&gt;
...&lt;br /&gt;
on_death = mob_death@gar_boars_rush&lt;br /&gt;
&lt;br /&gt;
[mob_death@gar_boars_rush]&lt;br /&gt;
on_info = {=killed_by_actor} %=inc_counter(gar_boars_counter)%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\mob_death.script''&lt;br /&gt;
&lt;br /&gt;
=Оверрайды для монстров=&lt;br /&gt;
'''''actor_friendly = true/false''''' - если '''''true''''', то монстр не атакует актера, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''npc_friendly = true/false''''' - если '''''true''''', то монстр не атакует сталкеров и монстров, до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''friendly = true/false''''' - если '''''true''''', то монстр не атакует никого до первой атаки на него.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''braindead = true/false''''' - если '''''true''''', то монстр игнорирует любые атаки.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Общая секция spawner=&lt;br /&gt;
Эта секция, которая присутствует как у NPC, так и у монстров, спавнит их по определенному условию (выводит в онлайн). Для того, чтобы они появились в данной точке, им надо поставить в настройках в ''Level editor'' флажок '''''no_move_in_offline''''' и отключен '''''can_switch_offline'''''. Спавнер прописывается в '''''custom_data''''' объекта перед секцией '''''logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия для спавна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если условия спавна не будет выполняться, то объект не заспавниться, а если он заспавнился и условие перестает выполняться, то объект будет спавнером уведен в оффалйн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как объект заспавнился, его берет под управление скрипт '''''Logic'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования секции''''':&amp;lt;ini&amp;gt;[spawner]&lt;br /&gt;
cond = {+esc_boar_dogs_restrictor}&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\xr_spawner.script''&lt;br /&gt;
&lt;br /&gt;
==Спавн монстров дневных и ночных==&lt;br /&gt;
'''[spawner]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {=is_day}''''' – спавнить монстра только днем (если надо ночью, то пишем {!is_day})&amp;lt;br&amp;gt;&lt;br /&gt;
'''''check_distance = true''''' – проверка на наличие персонажа рядом.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''min_distance = 100''''' – если игрок ближе указанной дистанции, то монстр не заспавниться (по дефолту 150 метров, но на самом деле это много).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size = 5&amp;gt;[[Часть 3]]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T12:33:46Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10.1. Схема работы двери, секция [ph_door] */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_cutscene]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого переносится игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого смотрит игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''pp_effector = &amp;lt;имя_постэффекта&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cam_effector = &amp;lt;имя_анимации_камеры&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''cameff_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_cutscene&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&lt;br /&gt;
point = agr_cutscene_walk&lt;br /&gt;
look = agr_cutscene_look&lt;br /&gt;
cam_effector = agroprom_demo&lt;br /&gt;
on_signal = cameff_end | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_cutscene.script''&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==Схема ph_door==&lt;br /&gt;
Схема для работы двери.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''Примечание''''': для двустворчатых ворот задается все аналогично.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[ph_door]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''locked = true/false''''' - заперта ли дверь. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''closed = true/false''''' - закрыта ли дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''show_tips = true/false''''' - нужно ли показывать подсказку при наведении на дверь. По умолчанию '''''true'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_open = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_open''''', иначе '''''tip_door_locked'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''tip_close = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
:Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта. Если '''''locked''''' равен '''''false''''', то по умолчанию '''''tip_door_close''''', иначе пустое значение.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_open_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке открыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_start = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран при попытке закрыть дверь.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd_close_stop = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''. Звук, который будет отыгран, когда дверь захлопнется до конца.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use = {+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт, если актор взаимодействует с дверью.&lt;br /&gt;
:Обычно используется для переключения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_on_bone = &amp;lt;number&amp;gt;|{+info -info =func !func ~number} %+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - определяет, что произойдёт,&lt;br /&gt;
:если дверь получит хит по кости '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''no_force = true/false''''' - по умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = ph_door@locked&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&lt;br /&gt;
locked = true&lt;br /&gt;
snd_open_start = trader_door_unlock&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%&lt;br /&gt;
&lt;br /&gt;
[ph_door@closed]&lt;br /&gt;
closed = true&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@open %-esc_close_door%&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&lt;br /&gt;
&lt;br /&gt;
[ph_door@open]&lt;br /&gt;
closed = false&lt;br /&gt;
locked = false&lt;br /&gt;
on_use = ph_door@closed&lt;br /&gt;
on_info = {+esc_close_door} ph_door@closed&lt;br /&gt;
snd_open_start = trader_door_open_start&lt;br /&gt;
snd_close_start = trader_door_close_start&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\ph_door.script''&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T12:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.14. Sr_cutscene */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
Эта схема предназначена для проведения анимации камеры c некоторым эффектом ('''''pp_effector'''''). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути '''''point''''' и ориентации его взгляда на начало пути '''''look''''', потери управления игроком и начала анимации камеры '''''cam_effector''''' по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_cutscene]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого переносится игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - путь в первую точку которого смотрит игрок.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''pp_effector = &amp;lt;имя_постэффекта&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\'' и содержащий эффект (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cam_effector = &amp;lt;имя_анимации_камеры&amp;gt;''''' - файл, расположенный в папке ''gamedata\anims\camera_effects\'' и содержащий анимацию камеры (имя файла пишется без расширения).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''cameff_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_cutscene&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&lt;br /&gt;
point = agr_cutscene_walk&lt;br /&gt;
look = agr_cutscene_look&lt;br /&gt;
cam_effector = agroprom_demo&lt;br /&gt;
on_signal = cameff_end | nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_cutscene.script''&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-07T11:57:40Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.13. Sr_sleep и настройка снов. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sleep==&lt;br /&gt;
Появилась возможность задавать зоны сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sleep]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - условия, при выполнении которых сон будет возможен.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy/all''''' - задает тип сна разрешенный в данной зоне (по умолчанию '''''all'''''). Влияет (группирует) только на не сценарные сны.&lt;br /&gt;
'''''dream_prob = &amp;lt;number&amp;gt;''''' - вероятность просмотра не сценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле '''''cond''''' задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в управляемом файле.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле ''misc\dream.ltx'' задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''videos'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видео файлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция '''''dreams'''''. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular_probability = &amp;lt;number&amp;gt;''''' - вероятность проигрывания обычных сновидений в целом;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''regular = &amp;lt;секции&amp;gt;''''' - список секций с настройками для обычных сновидений;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''scene = &amp;lt;секции&amp;gt;''''' - список секций с настройками для сценарных сновидений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''probability = &amp;lt;number&amp;gt;''''' - чем больше, тем больше вероятность проигрывания сна;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = nightmare/normal/happy''''' - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''dream = &amp;lt;название&amp;gt;''''' - имя поля из секции '''''videos''''';&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number} - условия срабатывания;&amp;lt;br&amp;gt;&lt;br /&gt;
'''''to_regular = &amp;lt;number&amp;gt;,&amp;lt;тип&amp;gt;''''' - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;'''''number'''''&amp;gt;, &amp;lt;'''''тип'''''&amp;gt; аналогичны '''''probability''''' и '''''type''''' из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': до релиза данная схема дошла сильно порезанной, все параметры в управляющем файле были закомментированы, поэтому данная схема не работает, если быть точнее, то ничего не делает.&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sleep.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-04T19:16:02Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.12. Sr_teleport */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_teleport==&lt;br /&gt;
Схема позволяет телепортировать актора в пределах локации.&lt;br /&gt;
&lt;br /&gt;
'''[sr_teleport]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''point = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда переместится актор.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''look = &amp;lt;имя_пути&amp;gt;''''' - патрульный путь из одной точки, куда будет смотреть актор после перемещения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''prob = &amp;lt;number&amp;gt;''''' - вероятность перемещения в заданную точку. По умолчанию - 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка срабатывания телепорта в миллисекундах. По умолчанию - 900.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Телепорты желательно ставить совместно с особой аномальной зоной (партиклом). Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_teleport&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&lt;br /&gt;
point1 = aes2_teleport_walk_exit1&lt;br /&gt;
look1 = aes2_teleport_look_exit1&lt;br /&gt;
prob1 = 10&lt;br /&gt;
point2 = aes2_teleport_walk_exit2&lt;br /&gt;
look2 = aes2_teleport_look_exit2&lt;br /&gt;
prob2 = 20&lt;br /&gt;
timeout = 0&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_teleport.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-04T18:18:08Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема sr_psy_antenna */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_psy_antenna@good_helmet&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-04T18:17:03Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.11. Sr_psy_antenna */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_psy_antenna]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''eff_intensity = &amp;lt;number&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения интенсивности излучения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hit_intensity = &amp;lt;nymber&amp;gt;''''' - увеличение/уменьшение в процентах от базового значения наносимого повреждения.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''phantom_prob = &amp;lt;nymber&amp;gt;''''' - вероятность проявления фантомов в процентах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''postprocess = &amp;lt;имя_постэффекта&amp;gt;''''' - файл постэффекта, относительно папки ''gamedata\anims''. Расширение ставить обязательно! По умолчанию - ''psy_antenna.ppe''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mute_sound_threshold = &amp;lt;number&amp;gt;''''' - предел до которого можно занижать звук уровня. 0 - глушит полностью, стоит по умолчанию.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[sr_psy_antenna@good_helmet]&lt;br /&gt;
eff_intensity = -10&lt;br /&gt;
hit_intensity = 0&lt;br /&gt;
phantom_prob = 45&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_psy_antenna.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T17:22:29Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.10. Набор дополнительных настроек логики у разных объектов. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Набор дополнительных настроек логики у разных объектов=&lt;br /&gt;
Для всех физических объектов есть секция '''''ph_idle''''', поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T17:21:09Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема sr_tip */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10. Набор дополнительных настроек логики у разных объектов.==&lt;br /&gt;
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T17:20:06Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.10 Sr_timer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' = строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_timer==&lt;br /&gt;
Схема использовать для производства каких либо действий в зависимости от состояния таймера.&lt;br /&gt;
&lt;br /&gt;
'''[sr_timer]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = dec/inc''''' - тип счётчика.&lt;br /&gt;
:*'''''dec''''' - декриментирующий, т.е. обратный отсчёт;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''inc''''' - инрементирующий, т.е. отчёт по возрастанию.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''start_value = &amp;lt;number&amp;gt;''''' - начальное значение счетчика в реальных миллисекундах.&lt;br /&gt;
:Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_value = &amp;lt;number&amp;gt;|%+info -info =func% &amp;lt;название_схемы&amp;gt;''''' - производит действие в зависимости от состояния счётчика.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''string = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_timer@1&lt;br /&gt;
 &lt;br /&gt;
[sr_timer@1]&lt;br /&gt;
type = dec&lt;br /&gt;
start_value = 1000000&lt;br /&gt;
on_value = 5 | %=play_snd(characters_voice\scenario\radar\rad_hat_2)% | 0 | nil %=aes_kill_actor%&lt;br /&gt;
on_actor_outside = sr_idle&lt;br /&gt;
on_info = {+bar_deactivate_radar_done} nil&lt;br /&gt;
string = st_helmet_countdown&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_timer.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10. Набор дополнительных настроек логики у разных объектов.==&lt;br /&gt;
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T17:01:35Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.9. Sr_sound_act */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' = строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound_act==&lt;br /&gt;
Схема играет звук в голове актера. Всякие там переговоры по ПДА и прочие фейки.&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound_act]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - имя звукового файла относительно папки ''gamedata\sounds''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay_max = &amp;lt;number&amp;gt;''''' - между проигрыванием звука будет взят случайный промежуток между '''''delay''''' и '''''delay_max'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''theme = &amp;lt;название_звуковой_темы&amp;gt;''''' - имя темы из файла ''sound_theme.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''stereo = true/false''''' - при установке этого параметра к файлу, который задан параметром '''''snd''''' или в звуковой теме,&lt;br /&gt;
:автоматически будут добавляться суффиксы '''''_r''''' и '''''_l''''' для загрузки левого и правого каналов и, соответственно, всё это будет проигрываться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound_act&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&lt;br /&gt;
theme = sar_monolith_call&lt;br /&gt;
delay = 10000&lt;br /&gt;
delay_max = 15000&lt;br /&gt;
stereo = true&lt;br /&gt;
on_info = {+sar2_monolith_miracle} sr_idle@end&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_sound2d.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.10 Sr_timer==&lt;br /&gt;
&lt;br /&gt;
Пример использования:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_timer@1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = dec&amp;lt;br&amp;gt;&lt;br /&gt;
start_value = 10000&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 0 | sr_timer@2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@2]&amp;lt;br&amp;gt;&lt;br /&gt;
type = inc&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 15000 | nil %+info1%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описания полей:&amp;lt;br&amp;gt;&lt;br /&gt;
type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec).&amp;lt;br&amp;gt;&lt;br /&gt;
Если поле не задано -  счетчик будет инкриментирующий&amp;lt;br&amp;gt;&lt;br /&gt;
start_value - начальное значение счетчика в РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по специфическому условию on_value. В общем случае on_value Можно использовать для производства каких либо действий в зависимости от состояния счетчика. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_value = 5000| %+info1% | 1000| %+info2%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10. Набор дополнительных настроек логики у разных объектов.==&lt;br /&gt;
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T16:45:11Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* Схема sr_sound */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt;''''' - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' = строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.9. Sr_sound_act==&lt;br /&gt;
Итого, схема, которая играет саунд в голове актера. Всякие там переговоры по ПДА и прочие фейки&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = ambient\random\new_drone1     --имя звукового файла&amp;lt;br&amp;gt;&lt;br /&gt;
*delay = 2000                          --задержка перед проигрыванием &amp;lt;br&amp;gt;&lt;br /&gt;
*delay_max = 4000		-- между проигрыванием звука будет взят случайный промежуток между delay и delay_max.&amp;lt;br&amp;gt;&lt;br /&gt;
*on_signal = sound_end | nil           --по сигналу можно перейти в другую секцию.&amp;lt;br&amp;gt;&lt;br /&gt;
theme =  &amp;lt;имя темы из ph_sound_themes&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* stereo = true/false (по умолчанию false). При установке этого параметра к файлу, который задан параметром snd или в звуковой теме будут добавляться (автоматически) суффиксы _r и _l для загрузки левого и правого каналов и, соответственно, вся эта фигня будет играться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз. Схема поддерживает кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.10 Sr_timer==&lt;br /&gt;
&lt;br /&gt;
Пример использования:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_timer@1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = dec&amp;lt;br&amp;gt;&lt;br /&gt;
start_value = 10000&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 0 | sr_timer@2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@2]&amp;lt;br&amp;gt;&lt;br /&gt;
type = inc&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 15000 | nil %+info1%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описания полей:&amp;lt;br&amp;gt;&lt;br /&gt;
type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec).&amp;lt;br&amp;gt;&lt;br /&gt;
Если поле не задано -  счетчик будет инкриментирующий&amp;lt;br&amp;gt;&lt;br /&gt;
start_value - начальное значение счетчика в РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по специфическому условию on_value. В общем случае on_value Можно использовать для производства каких либо действий в зависимости от состояния счетчика. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_value = 5000| %+info1% | 1000| %+info2%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10. Набор дополнительных настроек логики у разных объектов.==&lt;br /&gt;
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3</id>
		<title>Настройка логики. Часть 3</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3"/>
				<updated>2012-05-03T16:43:54Z</updated>
		
		<summary type="html">&lt;p&gt;ColR iT: /* 3.9.8. Sr_particle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Шаблон:Настройка логики}}&lt;br /&gt;
&lt;br /&gt;
=Скрипт logic=&lt;br /&gt;
&lt;br /&gt;
Скрипт '''''logic''''' управляет переключением схем.&amp;lt;br&amp;gt;&lt;br /&gt;
В '''''custom_data''''' любого персонажа (кроме свободных) должна присутствовать секция '''''[logic]'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции, на которые ссылается секция '''''[logic]''''' должны находится в файлах ''gamedata\scripts\xr_effects.script'' или ''gamedata\scripts\xr_conditions.script''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В секции должно присутствовать одно из полей:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''active = &amp;lt;название_схемы&amp;gt;''''' - активная схема, запускающаяся первой.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''cfg = &amp;lt;имя_ltx_файла_с_настройками&amp;gt;''''' - способ задавать логику персонажа, вынося её во внешний файл (путь учитывается относительно папки ''gamedata\config\scripts'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример. Настройки простого '''''walker''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переключение схем выполняется с помощью дополнительных условий схемы '''''logic''''', которые прописываются в секции текущей активной схемы. Существуют следующие условия переключения:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_le_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока меньше либо равно '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_dist_ge_nvis = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если дистанция в метрах до игрока больше '''''number''''' без проверки на видимость.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_signal = &amp;lt;имя_сигнала&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает по приходу сигнала '''''имя_сигнала''''' от текущей активной схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_info = &amp;lt;название_схемы&amp;gt;''''' - срабатывает всегда.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - срабатывает через '''''number''''' миллисекунд после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_game_timer = &amp;lt;number&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – срабатывает через '''''number''''' секунд игрового времени, после включения схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер в находится в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_not_in_zone = &amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если актер не в указанной зоне (указывается имя рестриктора).&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' – если NPC со '''''story_id''''' равному '''''number''''', в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_npc_not_in_zone = &amp;lt;number&amp;gt;|&amp;lt;имя_зоны&amp;gt;|&amp;lt;название_схемы&amp;gt;''''' - если NPC со '''''story_id''''' равному '''''number''''', не в указанной зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_inside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок внутри нее (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''on_actor_outside = &amp;lt;название_схемы&amp;gt;''''' - зона проверяет, находится ли игрок за ее пределами (используется со '''''space_restrictor''''').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': если происходит переключение между несколькими одноименными схемами (например несколькими '''''walker'''''), то их можно нумеровать: '''''walker1''''', '''''walker2''''', хотя предпочтительнее через символ ''''@'''&amp;lt;nowiki&amp;gt;'&amp;lt;/nowiki&amp;gt; давать более информативные названия: '''''walker@day''''', '''''walker@alarm''''' и т.д.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C любыми из вышеперечисленных параметров можно работать следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info2 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_info3 = {…} %…%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
и так далее до посинения&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А также условия для переключения на описанные выше секции.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''combat_ignore_cond = '''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_hit ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_death ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_combat ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_use ='''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Синтаксис скрипта Logic==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы персонаж ходил по пути '''''walk1''''', а при приближении игрока на дистанцию 5 метров, переключался на путь '''''walk2''''' (но только при условии, что он видит игрока), нужно написать следующее:&amp;lt;br&amp;gt;&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker@first&lt;br /&gt;
&lt;br /&gt;
[walker@first]&lt;br /&gt;
path_walk = walk1&lt;br /&gt;
path_look = look1&lt;br /&gt;
on_actor_dist_le = 5 | walker@second&lt;br /&gt;
&lt;br /&gt;
[walker@second]&lt;br /&gt;
path_walk = walk2&lt;br /&gt;
path_look = look2&amp;lt;/ini&amp;gt;&lt;br /&gt;
Выше рассмотрено безусловное переключение секций.&amp;lt;br&amp;gt;&lt;br /&gt;
Перед именем секции в фигурных скобках '''''{}''''' можно задавать дополнительные '''''условия''''', а после имени секции - так называемые &amp;quot;'''''эффекты'''''&amp;quot;, которые заключить в знаки процента '''''%%'''''. Эффекты будут применены только в случае выполнения условий, если таковых нет то эффект выполнится безусловно.&amp;lt;br&amp;gt;&lt;br /&gt;
Можно не задавать переход на другую схему указывая её имя, а задать только условия и/или эффекты. Тогда активной останется действующая схема, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, схема активирована не будет. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {условие} walker@second %эффекты%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Условия могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - требуется присутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - требуется отсутствие инфопорции &amp;quot;'''''infoportion'''''&amp;quot; у актора;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернула '''''true''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''!function''''' - требуется, чтобы функция &amp;quot;'''''function'''''&amp;quot; вернулся '''''false''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''~number''''' - вероятность выполнения условия.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эффекты могут быть следующими:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''+infoportion''''' - в случае включения секции у актора будет установлен инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''-infoportion''''' - в случае включения секции у актора будет убрана инфопорция &amp;quot;'''''infoportion'''''&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''=function''''' - в случае включения секции стартует функция &amp;quot;'''''function'''''&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для условия переключения схемы '''''{~number}''''' определён следующий расчёт:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:'''''number''''' сравнивается со случайным числом в диапазоне от 1 до 100, если '''''number''''' больше, то считается, что условие вернуло истину, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_in_zone = restrictor_name | {~30} walker@second&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Если условий несколько, например:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~20} walker@second, {~55} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:В таком случае, переход на схему '''''walker@second''''' произойдёт с вероятностью 20%, на схему '''''walker@third''''' с вероятностью 55-20=35% и на схему '''''walker@fourth''''' с оставшейся вероятностью 100-55=45%.&amp;lt;br&amp;gt;&lt;br /&gt;
:Условия в данном случае необходимо выставлять исключительно в порядке возрастания.&amp;lt;br&amp;gt;&lt;br /&gt;
:Неудачный пример:&lt;br /&gt;
:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {~40} walker@second, {~25} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
:Здесь переход на схему '''''walker@third''''' никогда не будет определён, а вероятность перехода на схему '''''walker@fourth''''' составит 60%.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': несколько условия или эффектов разделяются пробелами:&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1 -info_2 +info_3} walker@second %+info_4 =func%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен '''''info_1''''', будет включена схема '''''walker@second''''', иначе, если установлен '''''info_2''''', будет включена схема '''''walker@third''''', иначе будет включен '''''walker@fourth''''':&amp;lt;ini&amp;gt;on_actor_dist_le = 5 | {+info_1} walker@second, {+info_2} walker@third, walker@fourth&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В описанном выше поле '''''active''''' секции '''''logic''''', можно также задавать условия, например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = {=actor_friend} walker@friendly, walker@enemy&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В логических условиях теперь принимается ключевое слово '''''never''''', которое означает, что условие ложно. Например:&amp;lt;ini&amp;gt;&lt;br /&gt;
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %=gar_dm_bandits_fight%&amp;lt;/ini&amp;gt;&lt;br /&gt;
Вышеприведенная конструкция включает игнорирование боя, если у NPC враг игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции '''''never'''''. Таким образом, выбор секции '''''never''''' равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример работы с секцией '''''nil'''''. &lt;br /&gt;
Секция '''''nil''''' выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись один раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие. Например:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = nil %+esc_actor_inside%&amp;lt;/ini&amp;gt;&lt;br /&gt;
То есть, при входе актера в рестриктор выдается инфопорция и рестриктор уходит в секцию '''''nil''''', больше не проверяя наличие игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': обратно из секции '''''nil''''' под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.&lt;br /&gt;
&lt;br /&gt;
==Пример достаточно сложной логики== &lt;br /&gt;
&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
&lt;br /&gt;
[hit]&lt;br /&gt;
on_info = %+alert%&lt;br /&gt;
&lt;br /&gt;
[death]&lt;br /&gt;
on_info = %+alert +trup3%&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = walk_svoboda3&lt;br /&gt;
path_look = look_svoboda3&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
on_timer = 25000 | remark&lt;br /&gt;
&lt;br /&gt;
[remark]&lt;br /&gt;
anim = idle&lt;br /&gt;
snd = stalker_talk_kampfire&lt;br /&gt;
no_move = true&lt;br /&gt;
no_rotate = true&lt;br /&gt;
on_hit = hit&lt;br /&gt;
on_death = death&lt;br /&gt;
combat_ignore_cond = {-alert}&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
Рассмотрим ее пошагово.&amp;lt;br&amp;gt;&lt;br /&gt;
Вначале сталкер работает по схеме '''''walker'''''. При этом он игнорирует бой, пока не будет поставлен инфопоршн '''''alert''''. Он ждет 25 секунд, после чего переходит в схему '''''remark'''''. В ремарке он проигрывает анимацию '''''idle''''', говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут ('''''on_hit''''') или убьют ('''''on_death'''''), будет поставлен инфопоршн '''''alert''''' и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн '''''trup3''''' который сообщит о том, что этот NPC убит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А  вот логика его противника:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = walker&lt;br /&gt;
combat_ignore = combat_ignore&lt;br /&gt;
&lt;br /&gt;
[walker]&lt;br /&gt;
path_walk = soldier_walk1&lt;br /&gt;
path_look = soldier_look1&lt;br /&gt;
combat_ignore_cond = always&lt;br /&gt;
team = assault_group&lt;br /&gt;
on_signal = assault | camper&lt;br /&gt;
&lt;br /&gt;
[camper]&lt;br /&gt;
path_walk = soldier_walk1_2&lt;br /&gt;
path_look = soldier_look1_2&lt;br /&gt;
radius = 5&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+trup1 +trup2 +trup3} walker2&lt;br /&gt;
&lt;br /&gt;
[walker2]&amp;lt;br&amp;gt;&lt;br /&gt;
path_walk = soldier_walk1_3&lt;br /&gt;
path_look = soldier_look1_3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[combat_ignore]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Он идет в схеме '''''walker''''', игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы '''''assault_group'''''. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал '''''assault''''', то переходит в схему '''''camper'''''. В этой схеме у него не прописан '''''combat_ignore''''', поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн '''''trup1''''', '''''trup2''''' или '''''trup3''''' и когда все трое будут убиты, то он переключится на схему '''''walker2''''' (подойдет к костру).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Схемы логики space_restrictor=&lt;br /&gt;
&lt;br /&gt;
'''''Общее замечание''''': Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.&lt;br /&gt;
&lt;br /&gt;
==Схема sr_idle==	&lt;br /&gt;
Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.&amp;lt;br&amp;gt;&lt;br /&gt;
Сама по себе схема ничего не делает.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_idle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''on_actor_inside = nil %+esc_actor_inside%'''''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что после срабатывания проверки активная схема переключается в '''''nil''''', чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать '''''nil'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = {+val_raid_start -esc_return -esc_trader_speak} nil %=esc_return_dv +esc_return +esc_trader_speak%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_idle.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_no_weapon==&lt;br /&gt;
Данная схема убирает оружие у игрока при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_no_weapon]'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_no_weapon&lt;br /&gt;
&lt;br /&gt;
[sr_no_weapon]&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_no_weapon.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_sound==&lt;br /&gt;
&lt;br /&gt;
Схема предназначена для отыгрывание звука при входе актора в '''''space_restrictor'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_sound]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''snd = &amp;lt;путь_звукового_файла&amp;gt; - перечень имён звуков разделенных запятыми (путь учитывается относительно папки ''gamedata\sounds'').&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = &amp;lt;параметр&amp;gt;''''' - типы звуков через запятые. Для удобства введены типы наборов звуков в таблице '''''sound_types''''' управляющего файла. Всего их три:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''floor_wooden''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''rats_panic''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''random'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''delay = &amp;lt;number&amp;gt;''''' - задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''idle = &amp;lt;number&amp;gt;''''' - длина периода игнорирования входа в зону после начала последнего проигранного звука.&lt;br /&gt;
:Чтоб, например, &amp;quot;завывание&amp;quot; было не чаще, чем раз в несколько минут. Указывается в секундах игрового времени. По умолчанию 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''rnd = &amp;lt;number&amp;gt;''''' - вероятность (в процентах) того, что звук отыграется. По умолчанию 100.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''position = &amp;lt;имя_пути&amp;gt;''''' - задает имя пути, в вершинах которого может отыграться звук.&lt;br /&gt;
:Есть зарезервированное значение '''''random'''''. Оно означает случайное место в радиусе от 15 до 50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_velocity = &amp;lt;number&amp;gt;''''' - скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''slide_sound_once = true\false''''' - в случае значения '''''true''''' - проиграть звук один раз, даже если он не дошел до последней точки пути,&lt;br /&gt;
:иначе если '''''false''''' – и если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''play_at_actor = true/false''''' - заставляет звук играться от позиции актера постоянно.&lt;br /&gt;
:Если он будет равен '''''true''''' и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''sound_end'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обязательно нужно задать либо '''''snd''''', либо '''''type'''''. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актора в рестриктор отыгрывается случайный звук из этого списка.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_sound@shooting&lt;br /&gt;
&lt;br /&gt;
[sr_sound@shooting]&lt;br /&gt;
snd = characters_voice\scenario\garbage\grey_grey_1&lt;br /&gt;
play_at_actor = true&lt;br /&gt;
on_signal = sound_end| nil&lt;br /&gt;
on_timer = 20000| nil&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью '''''slide_velocity'''''. Пример:&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_sound&lt;br /&gt;
&lt;br /&gt;
[sr_sound]&lt;br /&gt;
type = random&lt;br /&gt;
position = way&lt;br /&gt;
slide_velocity = 8&lt;br /&gt;
slide_sound_once = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ''gamedata\scripts\sr_sound.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_tip==&lt;br /&gt;
Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_tip]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_текса&amp;gt;''''' = строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''type = news/tips''''' - параметр рудиментарный и не на что не влияет.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''sender = &amp;lt;параметр&amp;gt;''''' - задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение.&lt;br /&gt;
:По умолчанию это иконка торговца. Возможны следующие значения: '''''default, trader, dolg, freedom, ecolog, arena, stalker, krot, barman, wolf, o_soznanie, monolith, saharov, prizrak, killer'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''cond = {+info -info =func !func ~number}''''' - необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''single = true/false''''' - если параметр в '''''true''''', то типс будет выдан только один раз. По умолчанию '''''false'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''timeout = &amp;lt;number&amp;gt;''''' - задержка вывода сообщения в секундах. По умолчанию - 0.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''showtime = &amp;lt;number&amp;gt;''''' - время показа сообщения на экране. Задаётся в милисекундах. По умолчанию - 5000.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''tip_sended''''', только в случае установленного параметра '''''single'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_tip&lt;br /&gt;
&lt;br /&gt;
[sr_tip] &lt;br /&gt;
name = rad_barman_spam&lt;br /&gt;
type = tips&lt;br /&gt;
cond = {+bar_deactivate_radar_done} &lt;br /&gt;
sender = barman&lt;br /&gt;
on_actor_inside = nil&lt;br /&gt;
showtime = 25000&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
файл ''gamedata\scripts\sr_tip.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_light==&lt;br /&gt;
Зона, в которой фонарики у NPC будут включены независимо от времени суток.&lt;br /&gt;
&lt;br /&gt;
'''[sr_light]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''light_on = true/false''''' - включен/выключен свет.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_light&lt;br /&gt;
&lt;br /&gt;
[sr_light]&lt;br /&gt;
light_on = true&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_light.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_territory==&lt;br /&gt;
&lt;br /&gt;
Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.&lt;br /&gt;
Пока что она отлавливает только хиты и смерть NPC.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_territory]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_hit = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при нанесении хита от актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''territory_death = {+info -info =func !func ~number} %+info -info =func%''''' - эффекты, которые произойдут при смерти от &amp;quot;рук&amp;quot; актора, будучи в этой зоне.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_territory@1&lt;br /&gt;
&lt;br /&gt;
[sr_territory@1]&lt;br /&gt;
territory_death = sr_idle@1 %+bar_arena_territory_death%&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_territory.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_mapspot==&lt;br /&gt;
При входе в рестриктор он сам себя подсвечивает на карте.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_mapspot]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''hint = &amp;lt;имя_текса&amp;gt;''''' - строка с '''''id''''' текста зарегистрированного в папке ''gamedata\config\text''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''location = &amp;lt;имя_метки&amp;gt;''''' - имя типа метки, зарегистрированное в файле ''config\ui\map_spots.xml'' и всех, что в него включены инклюдами. По умолчанию - '''''crlc_small'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
 &lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_actor_inside = sr_mapspot&lt;br /&gt;
&lt;br /&gt;
[sr_mapspot]&lt;br /&gt;
hint = gar_swamp&lt;br /&gt;
location = crcl_big&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_mapspot.script''&lt;br /&gt;
&lt;br /&gt;
==Схема sr_particle==&lt;br /&gt;
Данная система отыгрывает партиклы, как статичные, так и движущиеся, в указанном месте и в указанное время.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[sr_particle]'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''name = &amp;lt;имя_партикла&amp;gt;''''' - путь до партикла относительно файла ''particles.xr''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''path = &amp;lt;имя_пути&amp;gt;''''' - точки движения партикла. Возможны два случая:&lt;br /&gt;
:#Когда указывается путь анимации камеры (путь учитывается относительно папки ''gamedata\anims'');&amp;lt;br&amp;gt;&lt;br /&gt;
:#Когда указывается имя патрульного пути.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''mode = &amp;lt;параметр&amp;gt;''''' - параметр обязательный и имеет два значения:&lt;br /&gt;
:* 1 - устанавливается в случае указания анимации камеры для параметра '''''path''''';&amp;lt;br&amp;gt;&lt;br /&gt;
:* 2 - устанавливается в случае указания патрульного пути для параметра '''''path'''''.&amp;lt;br&amp;gt;&lt;br /&gt;
'''''looped = true/false''''' - флаг зацикленности партиклов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Примечание''''': для пути движения партикла, когда установлена анимация движения камеры, для имени файла необходимо ставить расширение '''''.anm''''' (например ''arena.anm'').&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поддерживается сигнал '''''particle_end'''''.&lt;br /&gt;
&lt;br /&gt;
В вейпоинтах патрульного пути можно задавать флаги:&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''s=&amp;lt;название_звуковой_темы&amp;gt;''''' - звук проигрываемый во время движения;&amp;lt;br&amp;gt;&lt;br /&gt;
:*'''''d=&amp;lt;number&amp;gt;''''' - время задержки перед проигрыванием, задается в миллисекундах. По умолчанию - 0.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
При '''''looped = true''''', по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал '''''particle_end''''' выдаваться не будет.&amp;lt;br&amp;gt;&lt;br /&gt;
При '''''looped = false''''' сигнал будет выдан, когда все источники партиклов отыграют.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная схема отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''''Пример использования схемы''''':&amp;lt;ini&amp;gt;[logic]&lt;br /&gt;
active = sr_idle&lt;br /&gt;
&lt;br /&gt;
[sr_idle]&lt;br /&gt;
on_info = {+sar_mon_poltergeist_1_spawn} sr_particle&lt;br /&gt;
&lt;br /&gt;
[sr_particle]&lt;br /&gt;
name = anomaly2\gravity_blast_03      &lt;br /&gt;
path = sar_poltergeist_1_way                  &lt;br /&gt;
mode = 2 				&lt;br /&gt;
looped = false               &lt;br /&gt;
on_signal = particle_end | sr_idle@2&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл: ''gamedata\scripts\sr_particle.script''&lt;br /&gt;
&lt;br /&gt;
==3.9.9. Sr_sound_act==&lt;br /&gt;
Итого, схема, которая играет саунд в голове актера. Всякие там переговоры по ПДА и прочие фейки&lt;br /&gt;
&lt;br /&gt;
[sr_sound_act]&amp;lt;br&amp;gt;&lt;br /&gt;
snd = ambient\random\new_drone1     --имя звукового файла&amp;lt;br&amp;gt;&lt;br /&gt;
*delay = 2000                          --задержка перед проигрыванием &amp;lt;br&amp;gt;&lt;br /&gt;
*delay_max = 4000		-- между проигрыванием звука будет взят случайный промежуток между delay и delay_max.&amp;lt;br&amp;gt;&lt;br /&gt;
*on_signal = sound_end | nil           --по сигналу можно перейти в другую секцию.&amp;lt;br&amp;gt;&lt;br /&gt;
theme =  &amp;lt;имя темы из ph_sound_themes&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* stereo = true/false (по умолчанию false). При установке этого параметра к файлу, который задан параметром snd или в звуковой теме будут добавляться (автоматически) суффиксы _r и _l для загрузки левого и правого каналов и, соответственно, вся эта фигня будет играться.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если указывается тема, то звук будет играть зациклено, случайным образом выбирая один из звуков прописанных в теме, если указывается звук, то он отыгрывается один раз. Схема поддерживает кондлист.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.10 Sr_timer==&lt;br /&gt;
&lt;br /&gt;
Пример использования:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_timer@1&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@1]&amp;lt;br&amp;gt;&lt;br /&gt;
type = dec&amp;lt;br&amp;gt;&lt;br /&gt;
start_value = 10000&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 0 | sr_timer@2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_timer@2]&amp;lt;br&amp;gt;&lt;br /&gt;
type = inc&amp;lt;br&amp;gt;&lt;br /&gt;
on_value = 15000 | nil %+info1%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описания полей:&amp;lt;br&amp;gt;&lt;br /&gt;
type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec).&amp;lt;br&amp;gt;&lt;br /&gt;
Если поле не задано -  счетчик будет инкриментирующий&amp;lt;br&amp;gt;&lt;br /&gt;
start_value - начальное значение счетчика в РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по специфическому условию on_value. В общем случае on_value Можно использовать для производства каких либо действий в зависимости от состояния счетчика. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_value = 5000| %+info1% | 1000| %+info2%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.11. Sr_psy_antenna==&lt;br /&gt;
Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.&lt;br /&gt;
&lt;br /&gt;
Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга. &lt;br /&gt;
&lt;br /&gt;
eff_intensity = 	- увеличение/уменьшение в % от базового значения интенсивности излучения.&lt;br /&gt;
hit_ intensity = 	- увеличение/уменьшение в % от базового значения наносимого повреждения.&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая добавляет 70% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
eff_intensity = 70&amp;lt;br&amp;gt;&lt;br /&gt;
hit_ intensity = 70&lt;br /&gt;
&lt;br /&gt;
Пример зоны, которая убирает 30% излучения:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_psy_antenna&lt;br /&gt;
&lt;br /&gt;
[sr_psy_antenna]&amp;lt;br&amp;gt;&lt;br /&gt;
intensity = -30&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в версии '''SOC 1.0000''' добавлена возможность задавать вероятность проявления фантомов и тайминг их &amp;quot;живучести&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
phantom_prob = 40 - вероятность проявления фантомов в процентах&amp;lt;br&amp;gt;&lt;br /&gt;
min_phantom_idle = 3000 - мин время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
max_phantom_idle = 5000 - макс время их существования в состоянии idle&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.12. Sr_teleport==&lt;br /&gt;
Собственно, телепорт. Настраиваются следующим образом:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = sr_teleport&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_teleport]&amp;lt;br&amp;gt;&lt;br /&gt;
timeout = 0&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point1 = point1&amp;lt;br&amp;gt;&lt;br /&gt;
look1 = look1&amp;lt;br&amp;gt;&lt;br /&gt;
prob1 = 10&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
point2 = point2&amp;lt;br&amp;gt;&lt;br /&gt;
look2 = look2&amp;lt;br&amp;gt;&lt;br /&gt;
prob2 = 20&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где:&amp;lt;br&amp;gt;&lt;br /&gt;
timeout - задержка в срабатывании телепорта в миллисекундах.&amp;lt;br&amp;gt;&lt;br /&gt;
point - одноточечный патрульный путь куда переместить&amp;lt;br&amp;gt;&lt;br /&gt;
look - одноточечный патрульный путь куда повернуть.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.13. Sr_sleep и настройка снов.==&lt;br /&gt;
&lt;br /&gt;
Появилась возможность задавать зоны сна.&lt;br /&gt;
&lt;br /&gt;
[sr_sleep]&lt;br /&gt;
*cond = &amp;lt;condlist&amp;gt;&lt;br /&gt;
*type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.&lt;br /&gt;
*dream_prob = &amp;lt;число от 0 до 100&amp;gt; - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.&lt;br /&gt;
&lt;br /&gt;
Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.&amp;lt;br&amp;gt;&lt;br /&gt;
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В файле misc\dream.ltx задаются настройки снов.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция videos.&amp;lt;br&amp;gt;&lt;br /&gt;
Полями задаются пути к видеофайлам со снами.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Секция dreams. Поля:&amp;lt;br&amp;gt;&lt;br /&gt;
regular_probability = &amp;lt;число от 0 до 100&amp;gt; - вероятность проигрывания обычных сновидений в целом &amp;lt;br&amp;gt;&lt;br /&gt;
regular - список секций с настройками для обычных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
scene - список секций с настройками для сценарных сновидений&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки обычных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
probability = &amp;lt;число больше 0&amp;gt; - чем больше, тем больше вероятность проигрывания сна.&amp;lt;br&amp;gt;&lt;br /&gt;
type = nightmare/normal/happy - тип сна.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Настройки сценарных сновидений:&amp;lt;br&amp;gt;&lt;br /&gt;
dream - имя поля из секции videos&amp;lt;br&amp;gt;&lt;br /&gt;
cond = &amp;lt;condlist&amp;gt; - условия срабатывания&amp;lt;br&amp;gt;&lt;br /&gt;
to_regular = &amp;lt;вероятность,тип&amp;gt; - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. &amp;lt;вероятность, тип&amp;gt; аналогичны probability и type из настроек обычных сновидений соответственно.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.9.14. Sr_cutscene==&lt;br /&gt;
&lt;br /&gt;
	Эта схема предназначена для проведения анимации камеры c некоторым эффектом &lt;br /&gt;
(pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[sr_cutscene]&amp;lt;br&amp;gt;&lt;br /&gt;
point = &amp;lt;имя пути&amp;gt; - путь в первую точку которого переносится игрок&amp;lt;br&amp;gt;&lt;br /&gt;
look = &amp;lt;имя пути&amp;gt; - путь в первую точку которого смотрит игрок&amp;lt;br&amp;gt;&lt;br /&gt;
*pp_effector = &amp;lt;имя файла с эффектом&amp;gt; - файл, расположенный в папке &amp;lt;br&amp;gt;&lt;br /&gt;
gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
cam_effector = &amp;lt;имя файла с анимацией камеры&amp;gt; - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10. Набор дополнительных настроек логики у разных объектов.==&lt;br /&gt;
Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.&lt;br /&gt;
&lt;br /&gt;
==3.10.1. Схема работы двери, секция [ph_door]==&lt;br /&gt;
&lt;br /&gt;
NB! Для двухстворчатых ворот задается все аналогично.&lt;br /&gt;
&lt;br /&gt;
locked = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Заперта ли дверь. По дефолту – false.&lt;br /&gt;
&lt;br /&gt;
Closed = false\true&amp;lt;br&amp;gt;&lt;br /&gt;
	Закрыта ли дверь. По дефолту - true&lt;br /&gt;
&lt;br /&gt;
tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.&lt;br /&gt;
&lt;br /&gt;
tip_close = (если locked == false, то tip_door_close, иначе пустое значение)&amp;lt;br&amp;gt;&lt;br /&gt;
	Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.&lt;br /&gt;
&lt;br /&gt;
snd_init = Звук, который будет отыгран сразу при включении схемы.&lt;br /&gt;
&lt;br /&gt;
snd_open_start = Звук, который будет отыгран при попытке открыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.&lt;br /&gt;
&lt;br /&gt;
snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.&lt;br /&gt;
&lt;br /&gt;
Примеры:&amp;lt;br&amp;gt;&lt;br /&gt;
	Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_door@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = true&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+esc_trader_can_leave} ph_door@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_door@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
locked = false&amp;lt;br&amp;gt;&lt;br /&gt;
snd_init = trader_door_unlock&amp;lt;br&amp;gt;&lt;br /&gt;
snd_open_start = trader_door_open_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_start = trader_door_close_start&amp;lt;br&amp;gt;&lt;br /&gt;
snd_close_stop = trader_door_close_stop&amp;lt;br&amp;gt;&lt;br /&gt;
файл \gamedata\scripts\ph_door.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.10.2. Схема работы кнопки, секция [ph_button]==&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку переключает секции и выдает инфопоршн.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active      = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend  = false&amp;lt;br&amp;gt;&lt;br /&gt;
anim        = button_false&amp;lt;br&amp;gt;&lt;br /&gt;
on_press    = ph_button@unlocked %+cit_jail_door_opened%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on_press – что происходит при нажатии&amp;lt;br&amp;gt;&lt;br /&gt;
anim – анимация, которая отигрывается при нажатии на кнопку&amp;lt;br&amp;gt;&lt;br /&gt;
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл \Gamedata\scripts\ph_button.script&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.&amp;lt;br&amp;gt;&lt;br /&gt;
Пример настройки кнопки:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@active&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@active]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_idle&amp;lt;br&amp;gt;&lt;br /&gt;
tooltip = tips_labx16switcher_press&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@deactivated %+terrain_test%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@deactivated]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = lab_switcher_off&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того чтобы сообщение не потеряло адекватность при различных настройках клавиатуры сообщение следует писать с использованием токенов. Например:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;xml&amp;gt;&lt;br /&gt;
&amp;lt;string id=&amp;quot;tips_labx16switcher_press&amp;quot;&amp;gt; &lt;br /&gt;
    &amp;lt;text&amp;gt;Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)&amp;lt;/text&amp;gt;&lt;br /&gt;
&amp;lt;/string&amp;gt;&lt;br /&gt;
&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[logic]&amp;lt;br&amp;gt;&lt;br /&gt;
active = ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@locked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_false – анимация несрабатывания кнопки.&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[ph_button@unlocked]&amp;lt;br&amp;gt;&lt;br /&gt;
anim = button_true&amp;lt;br&amp;gt;&lt;br /&gt;
on_info = {-val_prisoner_door_unlocked} ph_button@locked&amp;lt;br&amp;gt;&lt;br /&gt;
on_press = ph_button@locked %-val_prisoner_door_unlocked%&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[[Часть 4]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:A-Life]][[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>ColR iT</name></author>	</entry>

	</feed>