<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.crymod.net/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.crymod.net/index.php?feed=atom&amp;target=AndreyFilantrop&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3AContributions%2FAndreyFilantrop</id>
		<title>CryWiki Russia - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.crymod.net/index.php?feed=atom&amp;target=AndreyFilantrop&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3AContributions%2FAndreyFilantrop"/>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/AndreyFilantrop"/>
		<updated>2026-08-06T11:48:32Z</updated>
		<subtitle>Материал из CryWiki Russia</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A0%D0%B5%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BA%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5</id>
		<title>Реакция на прикосновение</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A0%D0%B5%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8%D0%BA%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5"/>
				<updated>2013-11-04T04:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья&lt;br /&gt;
|автор=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|совместимости=Все&lt;br /&gt;
|требования=Crysis Mod SDK 1.2; Sandbox 2; 3ds Max&lt;br /&gt;
|добавлена=02/02/11&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Реакция на прикосновение для растений ==&lt;br /&gt;
Далее по тексту для удобства чтения «изгиб от прикосновения для растительности или '''ИП'''».&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Изгиб от прикосновения это эффект, когда игрок, проходя мимо части растения, задевает ветви, заставляя их двигаться. Руководство подразумевает, что вы уже настроили растение для базового экспорта и детальную реакцию (синоним = '''детальный изгиб''') как описано в статье [[Детальная реакция для растительности]], и что у вас имеется базовое знание '''3ds Max''' и '''CryEngine''' экспортера. Эта процедура предназначена для больших листьев или веток, которые изгибаются при воздействии. Это типа установки костей или веревки, базирующееся на '''UV instancing'''. '''UV instancing''' означает повторение, точнее клонирование элементов с идентичной UV развёрткой — это очень важно для нас в создании '''ИП'''. Когда вы наберете в вашем редакторе '''Sandbox 2''' в консоли команду '''p_draw_helpers = 1''', то увидите, что все оригинальные большие кусты и деревья в '''Crysis''' имеют помимо непосредственной геометрии также еще два прокси, расположенных один в другом, в центре которых сама геометрия и располагается. А теперь нажмите '''Ctrl+G''', и попробуйте подойти вплотную к любому большому кусту, постреляйте в него или пройдите сквозь него. Вы увидите массу появившихся розовых палочек, которые дублируют форму каждой ветки иммитируя её скелет. О том, как эти палочки созданы — данная статья.&lt;br /&gt;
&lt;br /&gt;
== Установка ==&lt;br /&gt;
Для того чтобы изгибы прикосновений работали, вам нужен элемент растения, к которому уже применен UV-модификатор и правильно применен детальный изгиб. Вам также нужно по крайней мере 3 думми '''dummy''' и '''proxy mesh'''. Думми нужны чтобы создать деформирующий скелет, а прокси решает, когда скелет активируется (что-то типа '''AreaTrigger''', то есть триггерная зона).&lt;br /&gt;
&lt;br /&gt;
При установке изгибов прикосновением важно помнить, что система базируется на '''UV instancing'''. Установленный правильно, единственный '''UV-mapped mesh''' (меш к которому применем UV модификатор) работает как шаблон, позволяющий другим его клонам ('''instances''') этого же '''mesh''' использовать шаблонную думми-установку для симуляции изгибания. Если ваше растение состоит из нескольких различных листьев или веток, крайне важно, чтоб каждый уникальный '''mesh''' имел свою собственную думми установку. Таким образом, начинаем шоу: врубайте '''3ds Max''' и открывайте файл с вашим растением. После применения детальной реакции перед началом настройки '''ИП''' у вас должно уже быть растение такого вида (на картинке я для удобства выделил два прокси элемента, а геометрия растения не выделена):&lt;br /&gt;
&lt;br /&gt;
[[Файл:Before touch bending.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
То есть должна иметься:&lt;br /&gt;
# Сама геометрия растения с назначенным детальным изгибом,&lt;br /&gt;
# Прокси '''proxy_bending''' с настройкой как у меня (впрочем пока можете пропустить настройку, так как о ней речь пойдёт чуть дальше),&lt;br /&gt;
# '''obstruct_Ai''' прокси, который для нашего '''ИП''' не нужен, но его назначение описывается в статье [[Настройка деревьев]]. Настройте его сейчас, а то потом забудете: также как и всегда назначьте в субматериале '''Crytek Shader''', выберите из выпадающего списка '''«Obstruct»''' и установите галочку в '''«Physicalize»'''. Можете добавить прозрачность.&lt;br /&gt;
&lt;br /&gt;
Для этого руководства я буду использовать один любой элемент моего растения, а именно — лист, так как все мои листья с их ветками соответствуют выше заданному условию '''UV instancing''' (оба прокси и все элементы модели кроме листа я временно отщепил и спрятал).&lt;br /&gt;
&lt;br /&gt;
Этот лист который будет гнуться, когда игрок проходит через него. Для начала нам нужно создать и установить думми, которые будут формировать скелет. В '''3ds Max''' — смотрим на панель справа, вкладка '''Create/Helpers/Dummy''' . Необходимо по крайней мере 3 думми для установки, так что для этого примера создадим и назовем их '''branch1_1''', '''branch1_2''', and '''branch1_3'''. Важно, чтоб вы назвали думми в точности как описано, так как в противном случае движок не распознает их. Вы можете создать более детальный скелет за счет добавления большего количества думми, т.к я не знаю, какое максимальное их количество вообще возможно. Если у вас более чем одна ветко-установка, то следующая ветко-установка должна иметь думми с именами '''branch2_x'''. То что вы видите на рисунке ниже, это:&lt;br /&gt;
&lt;br /&gt;
# Мой отщепленный от всего растения листок в двух проекциях&lt;br /&gt;
# Три думми, с именами в точности как указано выше,&lt;br /&gt;
# Иерархия, появившаяся при нажатии в '''3dS Max''' кнопки '''Select by Name'''|, показывающая, что я создал думми и присоединил их к основной геометрии листа (обратите внимание, что '''branch1_1''' расположен ближе к основанию листа, а '''branch1_3''' на кончике листа).&lt;br /&gt;
&lt;br /&gt;
[[Файл:2 views.jpg]]&lt;br /&gt;
&lt;br /&gt;
Вторая часть изгиба от прикосновения это прокси. Это тот самый '''proxy_bending''' прокси, о котором шла речь выше. Поэтому, если его у вас ещё нет, самое время его создать. Создайте прокси, который окружает видимые части. Пусть он будет простым, так как он нужен только для определения, находится ли игрок рядом с растением и нужно ли скелету быть активированным. У кого он спрятан, верните его в сцену.&lt;br /&gt;
&lt;br /&gt;
Я не стал делать отдельную картинку для него, так как у меня он виден на первом изображении в этой статье — там это зелёный куб.&lt;br /&gt;
&lt;br /&gt;
== Материалы и экспорт ==&lt;br /&gt;
Так как прокси должны быть прикреплены к основной геометрии растения (повторяю это уже не первый раз, но это очень важно), нам потребуется мульти субматериал '''Multi-Sub Material.''' Ниже представлены '''Multi-Sub''' и '''Proxy Sub Material.''' '''Proxy''' материал должен быть назван '''proxy_bend.''' (у меня '''proxy_bending''' — но тоже работает) Должна стоять галочка в '''Physicalize''' и в выпадающем меню быть выбран '''«No Collide»'''. Не забудьте назначить этому мэшу правильный суб-материал '''sub-material'''. Как видите у меня на рисунке материала 2 окошка — это сделано в Adobe Photoshop, у вас в '''3ds Max''' естественно будет только одно. К тому же в моем материале модели '''zelenaya_botva''' целых 6 субматериалов. Это не принципиально, просто следуйте логике — чем больше субматериалов с назначенными текстурами, тем больше грузится память в редакторе. Поэтому для моего растения вполне достаточно трёх первых по списку '''id''' 1-3.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Proxybend mat.jpg]]&lt;br /&gt;
&lt;br /&gt;
{{Примечание|Очень важно помнить, что вы должны сначала ПОЛНОСТЬЮ подготовить материал именно с ПОЛНОСТЬЮ установленными субматериалами для обоих прокси, а потом уже его экспортировать в редактор.}}&lt;br /&gt;
&lt;br /&gt;
Вот как выглядят розовые палочки о которых шла речь в начале статьи (на заднем плане — сейчас камера игрока находится как раз внутри '''proxy_bending''') и два вышеописанных прокси относительно самой геометрии растения (на переднем плане).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Plant skelenon.jpg]]&lt;br /&gt;
&lt;br /&gt;
Консольные команды для получения такого результата приведены ниже.&lt;br /&gt;
&lt;br /&gt;
=== Отладка ===&lt;br /&gt;
Эти консольные команды вы можете использовать для отладки ваших ресурсов в редакторе:&lt;br /&gt;
&lt;br /&gt;
;p_draw_helpers 1: Показывает физикализированные сетки.&lt;br /&gt;
;e_debug_draw 1: Показывает используемую вашим объектом память текстур и сетки.&lt;br /&gt;
&lt;br /&gt;
Чтобы отключить их, замените 1 на 0.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Детальная реакция для растительности]]&lt;br /&gt;
* [[Настройка деревьев]]&lt;br /&gt;
* [[Использование инструмента Vegetation]]&lt;br /&gt;
* [[Процедурное разрушение 3D-объектов]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Официальная документация:Создание ресурсов:Основы]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T12:36:04Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
'''Префикс'''&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
'''Тип редактора свойств'''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл ''Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp'' &lt;br /&gt;
&lt;br /&gt;
== Триггерные порты ==&lt;br /&gt;
&lt;br /&gt;
Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип  ''In/OutputPortConfig_Void'' или ''In/OutputPortConfig_AnyType'' и не ''bool''.&lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Техническая документация]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T12:28:30Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
'''Префикс'''&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
'''Тип редактора свойств'''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл ''Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp'' &lt;br /&gt;
&lt;br /&gt;
== Триггерные порты ==&lt;br /&gt;
&lt;br /&gt;
Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип  ''In/OutputPortConfig_Void'' или ''In/OutputPortConfig_AnyType'' и не ''bool''.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T12:21:50Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Добавление портов Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
'''Префикс'''&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
'''Тип редактора свойств'''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл ''Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp'' &lt;br /&gt;
&lt;br /&gt;
== Триггерные порты ==&lt;br /&gt;
&lt;br /&gt;
Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип  ''In/OutputPortConfig_Void'' или ''In/OutputPortConfig_AnyType'' и не ''bool''.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T12:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
'''Prefix'''&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
'''Property Editor Type'''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T11:57:51Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Добавление портов Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
'''Prefix'''&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
'''Property Editor Type'''&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-size:medium&amp;quot;&amp;gt;'''Prefix'''&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-family:arial,helvetica,sans-serif&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;'''Property Editor Type'''&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T11:51:25Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Добавление портов Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-size:medium&amp;quot;&amp;gt;'''Prefix'''&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-family:arial,helvetica,sans-serif&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;'''Property Editor Type'''&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T11:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Prefix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
=== '''Prefix'''===&lt;br /&gt;
&lt;br /&gt;
=== '''Property Editor Type''' ===&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T11:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Добавление портов Input */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input ==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.&lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.&lt;br /&gt;
&lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
=== '''Prefix'''&amp;lt;br/&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
=== '''Property Editor Type''' ===&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
snd_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sound_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOUND&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialogline_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_DIALOG&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
clr_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
color_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_COLOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
tex_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
texture_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_TEXTURE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
obj_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
object_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_OBJECT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
file_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_FILE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
text_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_LOCAL_STRING&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
equip_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_EQUIP&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
reverbpreset_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_REVERBPRESET&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aianchor_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_ANCHOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aibehavior_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_BEHAVIOR&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aicharacter_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_CHARACTER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aipfpropertieslist_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AI_PFPROPERTIESLIST&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiterritory_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AITERRITORY&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
aiwave_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_AIWAVE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclass_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASS&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soclasses_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOCLASSES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sostates_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATES&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sopattern_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOSTATEPATTERN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soaction_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOACTION&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sohelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
sonavhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SONAVHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soanimhelper_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOANIMHELPER&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
soevent_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SOEVENT&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
gametoken_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_GAMETOKEN&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mat_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MATERIAL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
seq_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_SEQUENCE&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
mission_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_MISSIONOBJ&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
anim_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstate_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
animstateEx_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
bone_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
attachment_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
dialog_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamslot_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamname_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
matparamcharatt_&lt;br /&gt;
&lt;br /&gt;
| &lt;br /&gt;
IVariable::DT_USERITEMCB&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-07T11:00:59Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''. &lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. &lt;br /&gt;
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.&lt;br /&gt;
Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2013-02-03T14:22:17Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Дерево Выбора Поведений: концепция и анатомия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &lt;br /&gt;
&lt;br /&gt;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой логики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений&amp;lt;br/&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует. Вместо этого каждый клон ИИ получает копию '''selection variables''', которая полностью отражает выбранный статус ИИ. Дерево затем оценивается набором '''selection variables''', чтобы определить, какой статус соответствующий ИИ должен получить.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При каждом ИИ-обновлении в рамках ИИ системы (много фреймов в секунду):&lt;br /&gt;
&lt;br /&gt;
*Дерево ИИ переоценивает ИИ-ассоциированные '''Selection Variables'''.&lt;br /&gt;
*Если выбранное поведение является тем же, что и текущее, то ничего не происходит.&lt;br /&gt;
*Если выбранное поведение другое, тогда ИИ вызывает destructor текущего поведения.&lt;br /&gt;
*ИИ переходит в новое поведение и...&lt;br /&gt;
*Constructor нового поведения вызывается в ИИ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selection Variables ассоциированные с ИИ модифицируются несколькими путями.&lt;br /&gt;
&lt;br /&gt;
*ИИ система создает новые сигналы, которые передаются в систему поведения (например, система '''The Perception''' (система перцепции) определяет, что ИИ теперь может видеть игрока).&lt;br /&gt;
*...Сигналы получаются '''BHS''' принадлежащем ИИ и обрабатываются как определено в секции '''Signal Variable'''.&lt;br /&gt;
*Текущее поведение ИИ получает сигнал и непосредственно изменяет '''Selection Variable'''. &lt;br /&gt;
*ИИ система сама непосредственно изменяет '''Selection Variable''', принадлежащую ИИ (это обычно не требуется/в этом нет необходимости).&lt;br /&gt;
&lt;br /&gt;
Как пример, поведение может содержать логику условий смены поведений исходя из текущего окружения. Скажем, например, что наше поведение под названием «Investigate» имело сигнальный метод «OnSoundHeard», который получен от ИИ-системы, когда новый звук был зарегестрирован ИИ-перцепцией. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnSoundHeard = function( self, entity, fDistance )&lt;br /&gt;
  if (fDistance &amp;lt; 5) then&lt;br /&gt;
     AI.SetBehaviorVariable(entity.id, &amp;quot;AwareOfEnemy&amp;quot;, true);&lt;br /&gt;
  end&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так, если новый звук сгенерировался где-то совсем рядом с ИИ, произойдет обновление статуса поведения до состояния «Attack», хотя визуально цель еще не определена. &lt;br /&gt;
&lt;br /&gt;
Следует отметить, что смена поведения не так уж тяжела для движка, но если ИИ постоянно меняет поведения, то это может стать сложно для дебага и следования за ним. При разработке соответствующего поведения, старайтесь не думать, что поведения являются индивидуальными действиями. Думайте о них больше, как об обеспечивающих относящихся к событию по логике действиях. Например, «FireFromCover» поведение может содержать действия сидения внутри укрытия некоторое время, выглядывания из-за укрытия в поисках цели, ведение слепого огня и покидание укрытия и стрельбу конкретно по цели. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Заимствование блоков поведения между разными BHS==&lt;br /&gt;
&lt;br /&gt;
Нет ОБЯЗАТЕЛЬНОЙ связи между '''BHS''' и поведениями, которое оно использует. Поведения могут свободно взаимно использоваться разними BHS пока поведение работает с конкретным ИИ-типом. Смотрите документацию по '''Поведениям''' и '''Голпайпам''' подробнее по поводу правильной настройки поведения. &lt;br /&gt;
&lt;br /&gt;
В помощь взаимному использованию базовых поведений, есть возможность обявить блоки поведения «'''Blocks'''». Они находятся в своих собственных  XML-файлах в той же директории (или поддиректориях), где и BHS-файлы.&lt;br /&gt;
&lt;br /&gt;
Чтобы продемонстрировать это на том же примере, должен быть файл под названием «Common.xml», сидящий в базовой «Selection Tree» папке.&lt;br /&gt;
&lt;br /&gt;
Это может выглядеть следующим образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Blocks&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonSignalVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
&amp;lt;/Blocks&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл может содержать любое число «'''Blocks'''», и каждый блок абсолютно отдельный относительно всех других «'''Blocks'''». Подразумевается, что они модульные и подгружаются в BHS-файлы, когда это необходимо. Чтобы включить '''Block''' в BHS, вы добавляете ссылку в соответствующую секцию. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве примера, наша '''selection variable''' секция может быть заменена на гораздо более короткую: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а '''signal variable''' секция - на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonSignalVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вы можете передать конкретный набор '''Selection Variables''' и '''Signal Variables''' всем вашим ИИ-типам. Использование такого формализма призвано сделать ваши файлы поведения более чистыми и управляемыми. &lt;br /&gt;
&lt;br /&gt;
Давайте повторно вернёмся в '''Leaf Translations'''  концепт из выше приведенного в статье материала. Скажем, мы определили другой логический блок таким образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Block name=&amp;quot;CommonBehaviorTree&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;CommonRoot&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Priority&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/Block&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете далее заменить порцию '''Дерева выбора''' '''BHS''' нашего гранта следующим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Ref name=&amp;quot;CommonBehaviorTree&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь из-за того, что у нас есть '''leaf translations''' секция, которая подменяет стандартные имена на ИИ-архетип специфичные имена поведения, всё будет работать. Таким образом вы можете разделять дерево поведений между множеством разнообразных ИИ-типов, но тем не менее иметь уникальные поведения, заданные для каждого листа дерева. Чтобы продемонстрировать это, нам понадобится другой ИИ-тип, называемый «Alien». Скажем, что мы ожидаем, чтобы «Alien» разделял те же самые базовые типы поведения. Мы можем дублировать '''BHS''' от «Grunt» и заменить «Leaf Translation» секцию на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;AlienIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;AlienInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;AlienAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предполагая, что те поведения существуют, «Alien» ИИ-тип будет готов, и всё ещё иметь уникальное ИИ поведение.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-02-01T11:43:33Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр. &lt;br /&gt;
&lt;br /&gt;
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ActivateOutput( pActInfo, 0, 3 ); &lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Input==&lt;br /&gt;
&lt;br /&gt;
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      InputPortConfig&amp;lt;int&amp;gt;(&amp;quot;someInput&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''. &lt;br /&gt;
&lt;br /&gt;
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:&lt;br /&gt;
&lt;br /&gt;
*имя '''input''' порта, описание порта и читаемое человеком имя порта.&lt;br /&gt;
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-14T10:18:08Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра:&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-14T10:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекоммендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;br /&gt;
Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  // ...&lt;br /&gt;
 &lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      OutputPortConfig&amp;lt;int&amp;gt;(&amp;quot;alertness&amp;quot;, _HELP(&amp;quot;useful help text&amp;quot;)),&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  // ...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. &lt;br /&gt;
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра:&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T08:55:32Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;br /&gt;
&lt;br /&gt;
Статья описывает шаги по внедрению нового нода '''Flowgraph'''. &lt;br /&gt;
&lt;br /&gt;
== Базовый код ==&lt;br /&gt;
&lt;br /&gt;
Рекоммендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.&lt;br /&gt;
&lt;br /&gt;
В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;stdafx.h&amp;quot;&lt;br /&gt;
#include &amp;quot;FlowBaseNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class CFlowNode_MyName : public CFlowBaseNode&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
  CFlowNode_MyName( SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  virtual void GetConfiguration( SFlowNodeConfig&amp;amp; config )&lt;br /&gt;
  {&lt;br /&gt;
    static const SInputPortConfig in_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    static const SOutputPortConfig out_config[] = {&lt;br /&gt;
      {0}&lt;br /&gt;
    };&lt;br /&gt;
    config.sDescription = _HELP( &amp;quot;A description of this flow node&amp;quot; );&lt;br /&gt;
    config.pInputPorts = in_config;&lt;br /&gt;
    config.pOutputPorts = out_config;&lt;br /&gt;
    config.nFlags = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )&lt;br /&gt;
  {&lt;br /&gt;
     switch (event)&lt;br /&gt;
     {&lt;br /&gt;
     };&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
REGISTER_FLOW_NODE(&amp;quot;FlowNodeGroup:MyName&amp;quot;, CFlowNode_MyName);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Добавление портов Output==&lt;br /&gt;
&lt;br /&gt;
'''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/Flowgraph</id>
		<title>Flowgraph</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/Flowgraph"/>
				<updated>2013-01-13T08:09:39Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Создание нового нода]]&lt;br /&gt;
Руководство показывает как создать новый нод Flowgraph на C++.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T08:07:18Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T08:05:06Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Игра]]&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T08:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Техническая документация]]&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T08:01:03Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Flowgraph]]&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0</id>
		<title>Создание нового нода</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0"/>
				<updated>2013-01-13T07:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: Новая страница: «{{в процессе перевода|дата=13 января 2013}}  Категория:Flowgraph {{Статья |переводчик=AndreyFilantrop |сло...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{в процессе перевода|дата=13 января 2013}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Flowgraph]]&lt;br /&gt;
{{Статья&lt;br /&gt;
|переводчик=AndreyFilantrop&lt;br /&gt;
|сложность=Средняя&lt;br /&gt;
|требования= Microsoft Visual Studio 2010&lt;br /&gt;
|добавлена=13/01/13&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Создание нового нода =&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/Flowgraph</id>
		<title>Flowgraph</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/Flowgraph"/>
				<updated>2013-01-13T07:50:36Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: Новая страница: «* Создание нового нода»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Создание нового нода]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%98%D0%B3%D1%80%D0%B0</id>
		<title>Игра</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%98%D0%B3%D1%80%D0%B0"/>
				<updated>2013-01-13T07:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* В этом разделе */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Игра =&lt;br /&gt;
Следующие темы описывают игровое программирование для CryENGINE.&lt;br /&gt;
&lt;br /&gt;
== В этом разделе ==&lt;br /&gt;
* [[Flowgraph]]&lt;br /&gt;
* [[GameObject]]&lt;br /&gt;
* [[Система транспорта]]&lt;br /&gt;
* [[Система оружия]]&lt;br /&gt;
* [[Пользовательский интерфейс]]&lt;br /&gt;
&lt;br /&gt;
== Дополнительная документация ==&lt;br /&gt;
* Документация по [[Карты действий|картам действий]] в разделе «[[Контроллер устройств и игрового управления]]».&lt;br /&gt;
* Раздел «[[Скриптинг в игре]]» в [[CryEngine 3 Free SDK:Скриптинг|документации по скриптингу]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Техническая документация]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-10-26T10:23:30Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Обзор */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &lt;br /&gt;
&lt;br /&gt;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений&amp;lt;br/&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует. Вместо этого каждый клон ИИ получает копию '''selection variables''', которая полностью отражает выбранный статус ИИ. Дерево затем оценивается набором '''selection variables''', чтобы определить, какой статус соответствующий ИИ должен получить.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При каждом ИИ-обновлении в рамках ИИ системы (много фреймов в секунду):&lt;br /&gt;
&lt;br /&gt;
*Дерево ИИ переоценивает ИИ-ассоциированные '''Selection Variables'''.&lt;br /&gt;
*Если выбранное поведение является тем же, что и текущее, то ничего не происходит.&lt;br /&gt;
*Если выбранное поведение другое, тогда ИИ вызывает destructor текущего поведения.&lt;br /&gt;
*ИИ переходит в новое поведение и...&lt;br /&gt;
*Constructor нового поведения вызывается в ИИ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selection Variables ассоциированные с ИИ модифицируются несколькими путями.&lt;br /&gt;
&lt;br /&gt;
*ИИ система создает новые сигналы, которые передаются в систему поведения (например, система '''The Perception''' (система перцепции) определяет, что ИИ теперь может видеть игрока).&lt;br /&gt;
*...Сигналы получаются '''BHS''' принадлежащем ИИ и обрабатываются как определено в секции '''Signal Variable'''.&lt;br /&gt;
*Текущее поведение ИИ получает сигнал и непосредственно изменяет '''Selection Variable'''. &lt;br /&gt;
*ИИ система сама непосредственно изменяет '''Selection Variable''', принадлежащую ИИ (это обычно не требуется/в этом нет необходимости).&lt;br /&gt;
&lt;br /&gt;
Как пример, поведение может содержать логику условий смены поведений исходя из текущего окружения. Скажем, например, что наше поведение под названием «Investigate» имело сигнальный метод «OnSoundHeard», который получен от ИИ-системы, когда новый звук был зарегестрирован ИИ-перцепцией. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnSoundHeard = function( self, entity, fDistance )&lt;br /&gt;
  if (fDistance &amp;lt; 5) then&lt;br /&gt;
     AI.SetBehaviorVariable(entity.id, &amp;quot;AwareOfEnemy&amp;quot;, true);&lt;br /&gt;
  end&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так, если новый звук сгенерировался где-то совсем рядом с ИИ, произойдет обновление статуса поведения до состояния «Attack», хотя визуально цель еще не определена. &lt;br /&gt;
&lt;br /&gt;
Следует отметить, что смена поведения не так уж тяжела для движка, но если ИИ постоянно меняет поведения, то это может стать сложно для дебага и следования за ним. При разработке соответствующего поведения, старайтесь не думать, что поведения являются индивидуальными действиями. Думайте о них больше, как об обеспечивающих относящихся к событию по логике действиях. Например, «FireFromCover» поведение может содержать действия сидения внутри укрытия некоторое время, выглядывания из-за укрытия в поисках цели, ведение слепого огня и покидание укрытия и стрельбу конкретно по цели. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Заимствование блоков поведения между разными BHS==&lt;br /&gt;
&lt;br /&gt;
Нет ОБЯЗАТЕЛЬНОЙ связи между '''BHS''' и поведениями, которое оно использует. Поведения могут свободно взаимно использоваться разними BHS пока поведение работает с конкретным ИИ-типом. Смотрите документацию по '''Поведениям''' и '''Голпайпам''' подробнее по поводу правильной настройки поведения. &lt;br /&gt;
&lt;br /&gt;
В помощь взаимному использованию базовых поведений, есть возможность обявить блоки поведения «'''Blocks'''». Они находятся в своих собственных  XML-файлах в той же директории (или поддиректориях), где и BHS-файлы.&lt;br /&gt;
&lt;br /&gt;
Чтобы продемонстрировать это на том же примере, должен быть файл под названием «Common.xml», сидящий в базовой «Selection Tree» папке.&lt;br /&gt;
&lt;br /&gt;
Это может выглядеть следующим образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Blocks&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonSignalVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
&amp;lt;/Blocks&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл может содержать любое число «'''Blocks'''», и каждый блок абсолютно отдельный относительно всех других «'''Blocks'''». Подразумевается, что они модульные и подгружаются в BHS-файлы, когда это необходимо. Чтобы включить '''Block''' в BHS, вы добавляете ссылку в соответствующую секцию. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве примера, наша '''selection variable''' секция может быть заменена на гораздо более короткую: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а '''signal variable''' секция - на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonSignalVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вы можете передать конкретный набор '''Selection Variables''' и '''Signal Variables''' всем вашим ИИ-типам. Использование такого формализма призвано сделать ваши файлы поведения более чистыми и управляемыми. &lt;br /&gt;
&lt;br /&gt;
Давайте повторно вернёмся в '''Leaf Translations'''  концепт из выше приведенного в статье материала. Скажем, мы определили другой логический блок таким образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Block name=&amp;quot;CommonBehaviorTree&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;CommonRoot&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Priority&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/Block&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете далее заменить порцию '''Дерева выбора''' '''BHS''' нашего гранта следующим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Ref name=&amp;quot;CommonBehaviorTree&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь из-за того, что у нас есть '''leaf translations''' секция, которая подменяет стандартные имена на ИИ-архетип специфичные имена поведения, всё будет работать. Таким образом вы можете разделять дерево поведений между множеством разнообразных ИИ-типов, но тем не менее иметь уникальные поведения, заданные для каждого листа дерева. Чтобы продемонстрировать это, нам понадобится другой ИИ-тип, называемый «Alien». Скажем, что мы ожидаем, чтобы «Alien» разделял те же самые базовые типы поведения. Мы можем дублировать '''BHS''' от «Grunt» и заменить «Leaf Translation» секцию на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;AlienIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;AlienInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;AlienAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предполагая, что те поведения существуют, «Alien» ИИ-тип будет готов, и всё ещё иметь уникальное ИИ поведение.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-10-26T10:22:06Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений&amp;lt;br/&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует. Вместо этого каждый клон ИИ получает копию '''selection variables''', которая полностью отражает выбранный статус ИИ. Дерево затем оценивается набором '''selection variables''', чтобы определить, какой статус соответствующий ИИ должен получить.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При каждом ИИ-обновлении в рамках ИИ системы (много фреймов в секунду):&lt;br /&gt;
&lt;br /&gt;
*Дерево ИИ переоценивает ИИ-ассоциированные '''Selection Variables'''.&lt;br /&gt;
*Если выбранное поведение является тем же, что и текущее, то ничего не происходит.&lt;br /&gt;
*Если выбранное поведение другое, тогда ИИ вызывает destructor текущего поведения.&lt;br /&gt;
*ИИ переходит в новое поведение и...&lt;br /&gt;
*Constructor нового поведения вызывается в ИИ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selection Variables ассоциированные с ИИ модифицируются несколькими путями.&lt;br /&gt;
&lt;br /&gt;
*ИИ система создает новые сигналы, которые передаются в систему поведения (например, система '''The Perception''' (система перцепции) определяет, что ИИ теперь может видеть игрока).&lt;br /&gt;
*...Сигналы получаются '''BHS''' принадлежащем ИИ и обрабатываются как определено в секции '''Signal Variable'''.&lt;br /&gt;
*Текущее поведение ИИ получает сигнал и непосредственно изменяет '''Selection Variable'''. &lt;br /&gt;
*ИИ система сама непосредственно изменяет '''Selection Variable''', принадлежащую ИИ (это обычно не требуется/в этом нет необходимости).&lt;br /&gt;
&lt;br /&gt;
Как пример, поведение может содержать логику условий смены поведений исходя из текущего окружения. Скажем, например, что наше поведение под названием «Investigate» имело сигнальный метод «OnSoundHeard», который получен от ИИ-системы, когда новый звук был зарегестрирован ИИ-перцепцией. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnSoundHeard = function( self, entity, fDistance )&lt;br /&gt;
  if (fDistance &amp;lt; 5) then&lt;br /&gt;
     AI.SetBehaviorVariable(entity.id, &amp;quot;AwareOfEnemy&amp;quot;, true);&lt;br /&gt;
  end&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так, если новый звук сгенерировался где-то совсем рядом с ИИ, произойдет обновление статуса поведения до состояния «Attack», хотя визуально цель еще не определена. &lt;br /&gt;
&lt;br /&gt;
Следует отметить, что смена поведения не так уж тяжела для движка, но если ИИ постоянно меняет поведения, то это может стать сложно для дебага и следования за ним. При разработке соответствующего поведения, старайтесь не думать, что поведения являются индивидуальными действиями. Думайте о них больше, как об обеспечивающих относящихся к событию по логике действиях. Например, «FireFromCover» поведение может содержать действия сидения внутри укрытия некоторое время, выглядывания из-за укрытия в поисках цели, ведение слепого огня и покидание укрытия и стрельбу конкретно по цели. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Заимствование блоков поведения между разными BHS==&lt;br /&gt;
&lt;br /&gt;
Нет ОБЯЗАТЕЛЬНОЙ связи между '''BHS''' и поведениями, которое оно использует. Поведения могут свободно взаимно использоваться разними BHS пока поведение работает с конкретным ИИ-типом. Смотрите документацию по '''Поведениям''' и '''Голпайпам''' подробнее по поводу правильной настройки поведения. &lt;br /&gt;
&lt;br /&gt;
В помощь взаимному использованию базовых поведений, есть возможность обявить блоки поведения «'''Blocks'''». Они находятся в своих собственных  XML-файлах в той же директории (или поддиректориях), где и BHS-файлы.&lt;br /&gt;
&lt;br /&gt;
Чтобы продемонстрировать это на том же примере, должен быть файл под названием «Common.xml», сидящий в базовой «Selection Tree» папке.&lt;br /&gt;
&lt;br /&gt;
Это может выглядеть следующим образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Blocks&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonSignalVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
&amp;lt;/Blocks&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл может содержать любое число «'''Blocks'''», и каждый блок абсолютно отдельный относительно всех других «'''Blocks'''». Подразумевается, что они модульные и подгружаются в BHS-файлы, когда это необходимо. Чтобы включить '''Block''' в BHS, вы добавляете ссылку в соответствующую секцию. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В качестве примера, наша '''selection variable''' секция может быть заменена на гораздо более короткую: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
а '''signal variable''' секция - на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;ref name=&amp;quot;CommonSignalVars&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, вы можете передать конкретный набор '''Selection Variables''' и '''Signal Variables''' всем вашим ИИ-типам. Использование такого формализма призвано сделать ваши файлы поведения более чистыми и управляемыми. &lt;br /&gt;
&lt;br /&gt;
Давайте повторно вернёмся в '''Leaf Translations'''  концепт из выше приведенного в статье материала. Скажем, мы определили другой логический блок таким образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Block name=&amp;quot;CommonBehaviorTree&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;CommonRoot&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Priority&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/Block&amp;gt;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете далее заменить порцию '''Дерева выбора''' '''BHS''' нашего гранта следующим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Ref name=&amp;quot;CommonBehaviorTree&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь из-за того, что у нас есть '''leaf translations''' секция, которая подменяет стандартные имена на ИИ-архетип специфичные имена поведения, всё будет работать. Таким образом вы можете разделять дерево поведений между множеством разнообразных ИИ-типов, но тем не менее иметь уникальные поведения, заданные для каждого листа дерева. Чтобы продемонстрировать это, нам понадобится другой ИИ-тип, называемый «Alien». Скажем, что мы ожидаем, чтобы «Alien» разделял те же самые базовые типы поведения. Мы можем дублировать '''BHS''' от «Grunt» и заменить «Leaf Translation» секцию на: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;AlienIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;AlienInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;AlienAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предполагая, что те поведения существуют, «Alien» ИИ-тип будет готов, и всё ещё иметь уникальное ИИ поведение.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-10-07T06:33:01Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений&amp;lt;br/&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует. Вместо этого каждый клон ИИ получает копию '''selection variables''', которая полностью отражает выбранный статус ИИ. Дерево затем оценивается набором '''selection variables''', чтобы определить, какой статус соответствующий ИИ должен получить.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При каждом ИИ-обновлении в рамках ИИ системы (много фреймов в секунду):&lt;br /&gt;
&lt;br /&gt;
*Дерево ИИ переоценивает ИИ-ассоциированные '''Selection Variables'''.&lt;br /&gt;
*Если выбранное поведение является тем же, что и текущее, то ничего не происходит.&lt;br /&gt;
*Если выбранное поведение другое, тогда ИИ вызывает destructor текущего поведения.&lt;br /&gt;
*ИИ переходит в новое поведение и...&lt;br /&gt;
*Constructor нового поведения вызывается в ИИ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selection Variables ассоциированные с ИИ модифицируются несколькими путями.&lt;br /&gt;
&lt;br /&gt;
*ИИ система создает новые сигналы, которые передаются в систему поведения (например, система '''The Perception''' (система перцепции) определяет, что ИИ теперь может видеть игрока).&lt;br /&gt;
*...Сигналы получаются '''BHS''' принадлежащем ИИ и обрабатываются как определено в секции '''Signal Variable'''.&lt;br /&gt;
*Текущее поведение ИИ получает сигнал и непосредственно изменяет '''Selection Variable'''. &lt;br /&gt;
*ИИ система сама непосредственно изменяет '''Selection Variable''', принадлежащую ИИ (это обычно не требуется/в этом нет необходимости).&lt;br /&gt;
&lt;br /&gt;
Как пример, поведение может содержать логику условий смены поведений исходя из текущего окружения. Скажем, например, что наше поведение под названием «Investigate» имело сигнальный метод «OnSoundHeard», который получен от ИИ-системы, когда новый звук был зарегестрирован ИИ-перцепцией. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnSoundHeard = function( self, entity, fDistance )&lt;br /&gt;
  if (fDistance &amp;lt; 5) then&lt;br /&gt;
     AI.SetBehaviorVariable(entity.id, &amp;quot;AwareOfEnemy&amp;quot;, true);&lt;br /&gt;
  end&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так, если новый звук сгенерировался где-то совсем рядом с ИИ, произойдет обновление статуса поведения до состояния «Attack», хотя визуально цель еще не определена. &lt;br /&gt;
&lt;br /&gt;
Следует отметить, что смена поведения не так уж тяжела для движка, но если ИИ постоянно меняет поведения, то это может стать сложно для дебага и следования за ним. При разработке соответствующего поведения, старайтесь не думать, что поведения являются индивидуальными действиями. Думайте о них больше, как об обеспечивающих относящихся к событию по логике действиях. Например, «FireFromCover» поведение может содержать действия сидения внутри укрытия некоторое время, выглядывания из-за укрытия в поисках цели, ведение слепого огня и покидание укрытия и стрельбу конкретно по цели. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Заимствование блоков поведения между разными BHS==&lt;br /&gt;
&lt;br /&gt;
Нет ОБЯЗАТЕЛЬНОЙ связи между '''BHS''' и поведениями, которое оно использует. Поведения могут свободно взаимно использоваться разними BHS пока поведение работает с конкретным ИИ-типом. Смотрите документацию по '''Поведениям''' и '''Голпайпам''' подробнее по поводу правильной настройки поведения. &lt;br /&gt;
&lt;br /&gt;
В помощь взаимному использованию базовых поведений, есть возможность обявить блоки поведения «'''Blocks'''». Они находятся в своих собственных  XML-файлах в той же директории (или поддиректориях), где и BHS-файлы.&lt;br /&gt;
&lt;br /&gt;
Чтобы продемонстрировать это на том же примере, должен быть файл под названием «Common.xml», сидящий в базовой «Selection Tree» папке.&lt;br /&gt;
&lt;br /&gt;
Это может выглядеть следующим образом: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Blocks&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
  &amp;lt;Block name=&amp;quot;CommonSignalVars&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Block&amp;gt;&lt;br /&gt;
&amp;lt;/Blocks&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл может содержать любое число «'''Blocks'''», и каждый блок абсолютно отдельный относительно всех других «'''Blocks'''».&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-09-21T10:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Оценка Дерева Выбора Поведений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений&amp;lt;br/&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует. Вместо этого каждый клон ИИ получает копию '''selection variables''', которая полностью отражает выбранный статус ИИ. Дерево затем оценивается набором '''selection variables''', чтобы определить, какой статус соответствующий ИИ должен получить.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При каждом ИИ-обновлении в рамках ИИ системы (много фреймов в секунду):&lt;br /&gt;
&lt;br /&gt;
*Дерево ИИ переоценивает ИИ-ассоциированные '''Selection Variables'''.&lt;br /&gt;
*Если выбранное поведение является тем же, что и текущее, то ничего не происходит.&lt;br /&gt;
*Если выбранное поведение другое, тогда ИИ вызывает destructor текущего поведения.&lt;br /&gt;
*ИИ переходит в новое поведение и...&lt;br /&gt;
*Constructor нового поведения вызывается в ИИ.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selection Variables ассоциированные с ИИ модифицируются несколькими путями.&lt;br /&gt;
&lt;br /&gt;
*ИИ система создает новые сигналы, которые передаются в систему поведения (например, система '''The Perception''' (система перцепции) определяет, что ИИ теперь может видеть игрока).&lt;br /&gt;
*...Сигналы получаются '''BHS''' принадлежащем ИИ и обрабатываются как определено в секции '''Signal Variable'''.&lt;br /&gt;
*Текущее поведение ИИ получает сигнал и непосредственно изменяет '''Selection Variable'''. &lt;br /&gt;
*ИИ система сама непосредственно изменяет '''Selection Variable''', принадлежащую ИИ (это обычно не требуется/в этом нет необходимости).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-09-10T10:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть несколько примечательных вещей, на которые следует обратить внимание, исходя из вышеописанных примеров. Имена листьев '''leaf''' должны соответствовать именам поведений. Либо необработанному имени поведения (GruntAttack), либо уже нанесенному имени (Attack). В примере обратите внимание, что «Attack» является листом для группировки поведения, называемой «Combat». Она имеет только один лист, но большее количество может быть добавлено позже. Для оценки любого из этих листьев, selection variable переменная «AwareOfEnemy» должна быть '''true'''. Т.к. «Attack» находится выше в структуре файла, если он проходит по условиям, то он будет выбран, даже если «Investigate» тоже доступен. И последнее что надо упомянуть, то что «Idle» поведение не имеет каких-то прикрепленных к нему условий. Сей факт делает его дефолтным поведением. Если в данный момент больше ничего не оценивается, чтобы быть действующим первее, то «Idle» будет выбрано. &lt;br /&gt;
&lt;br /&gt;
Не существует лимита переменных, нанесений на дефольное поведение, записей в поведении, которые могут быть определены в '''BHS'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оценка Дерева Выбора Поведений ==  &lt;br /&gt;
&lt;br /&gt;
Хорошее понимание того, как '''BHS''' оценивается поможет в понимании того, каким образом лучше создавать как поведения, так и само '''BHS'''. Как поведения, так и '''BHS''' не копируется для каждого клона ИИ, который его использует.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-22T10:04:16Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной. Должны быть определены имя, которое подходит под имя ожидаемого сигнала из ИИ системы, имя '''selection variable''', которое должно быть изменено, значение, в которое устанавливается '''selection variable'''.  &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''signal variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SignalVariables&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnHearSound&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnEnemySeen&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfSound&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Signal name=&amp;quot;OnNoTarget&amp;quot; variable=&amp;quot;AwareOfEnemy&amp;quot; value=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/SignalVariables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Leaf Translations:===&lt;br /&gt;
&lt;br /&gt;
Leaf Translations нужны для более ясного и более здравого определения дерева. Они обеспечивают перенесение общих имен поведений (которые обычно распределяются по ИИ) в архетип-специфические поведения. Это не является необходимым, если используется общедоступный (общий) BHS блок выбора, который будет обсуждаться в дальнейшем в данном документе. Хотя, они могут быть использованы, чтобы придать вашему дереву выбора более удобочитаемый облик.     &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''leaf translations''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;LeafTranslations&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Idle&amp;quot; target=&amp;quot;GruntIdle&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Investigate&amp;quot; target=&amp;quot;GruntInvestigate&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Map node=&amp;quot;Attack&amp;quot; target=&amp;quot;GruntAttack&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/LeafTranslations&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как отмечено, эта секция не обязательна, но для целей этого примера она будет приниматься. Это меняет вид того, как будет далее по тексту выглядеть наше дерево выбора '''selection tree'''. &lt;br /&gt;
&lt;br /&gt;
=== Selection tree ===&lt;br /&gt;
&lt;br /&gt;
Эта секция использует 3 вышеописанные компонента, чтобы определить доступные поведения для ИИ, и определяет, как откорректировать выбранные каждый раз, когда дерево оценивается (читается) заново. В порядке предложения их по имени, поведения организованы в структуру дерева. Каждый узел дерева представляет группировку поведений и условий, необходимых чтобы позволить читать дочерние узлы. Каждый '''leaf''' узел представляет ссылку на специфическое поведение и условия «'''condition'''», необходимое, чтобы пройти к нему, чтобы соответственно быть выбранным. &lt;br /&gt;
&lt;br /&gt;
Приоритет узлов определяется порядком в файле. Так, если два или более узлов будут подходить под текущее состояние '''selection variable''', то первый встреченный по списку расположения в дереве будет выбран. &lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection tree''' может выглядеть таким образом:    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Priority name=&amp;quot;Root&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Priority name=&amp;quot;Combat&amp;quot; condition=&amp;quot;AwareOfEnemy&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Leaf name=&amp;quot;Attack&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;/Priority&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Investigate&amp;quot; condition=&amp;quot;AwareOfSound&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Leaf name=&amp;quot;Idle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Priority&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-20T10:13:25Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Variables&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfSound&amp;quot; default=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;Variable name=&amp;quot;AwareOfEnemy&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Variables&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Signal Variables:===&lt;br /&gt;
&lt;br /&gt;
'''Signal Variables''' представляют возможность напрямую изменять переменные в '''ИИ''' '''BHS'''. Они приходят из ИИ системы и включают/выключают переменные объявленные в секции под названием «Переменные». Три параметра должны быть определены для каждой сигнальной переменной.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-20T10:01:42Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Selection Variables (Выбираемые переменные): Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Signal Variables (Сигнальные переменные): Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;br /&gt;
&lt;br /&gt;
3) Leaf Translations (Листы трансляции): Список отображения от общих имен до архетип-специфических имен поведений.&lt;br /&gt;
&lt;br /&gt;
4) The Selection Tree (Дерево выбора):  структура дерева, которая определяет, какие поведения являются приоритетными и какие условия должны быть выполнены. &lt;br /&gt;
&lt;br /&gt;
=== Selection Variables: ===&lt;br /&gt;
&lt;br /&gt;
'''Selection variables''' объявлены в своем собственном ​​разделе под названием «Переменные». Каждая переменная является всего лишь именно декларацией, представляющей булево значение (т.е. логическое)  '''true''' (правда) или '''false''' (ложь). Они могут быть включены/выключены извне как ИИ-системой, так и самими поведениями. Они являются концептуальными переключателями, которые необходимы чтобы выбирать текущее состояние поведения ИИ, использующего данное '''BHS'''. Кроме того, возможно передавать значение по умолчанию (хотя по умолчанию все значения установлены на положение «'''ложь'''»).&lt;br /&gt;
&lt;br /&gt;
Чтобы проиллюстрировать вышеизложенное, секция '''selection variable''' может выглядеть таким образом:&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-07T10:01:06Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Дерево Выбора Поведений: концепция и анатомия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' файлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Выбираемые переменные: Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Сигнальные переменные: Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-07T09:59:58Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Дерево Выбора Поведений содержит 4 компонента: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' фацлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Выбираемые переменные: Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Сигнальные переменные: Сигналы, как посылаемые ИИ системой, которые непосредственно изменяют состояние выбираемых переменных (см.пункт №1).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-07T09:58:20Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Обзор */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &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;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''.&lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' фацлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Выбираемые переменные: Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Сигнальные переменные: Сигналы, как посылаемые ИИ системой, которая непосредственно изменяет состояние выбираемых переменных (см.пункт №1).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-07T09:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Дерево Выбора Поведений содержит 4 компонента: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &lt;br /&gt;
&lt;br /&gt;
Диаграмма вышеуказанных поведений может выглядеть так:&lt;br /&gt;
&lt;br /&gt;
''-потом нарисую'' &lt;br /&gt;
&lt;br /&gt;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''. &lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' фацлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Выбираемые переменные: Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
&lt;br /&gt;
2) Сигнальные переменные: Сигналы, как посылаемые ИИ системой, которая непосредственно изменяет состояние выбираемых переменных (см.пункт №1).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-08-07T09:56:01Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятии сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &lt;br /&gt;
&lt;br /&gt;
Диаграмма вышеуказанных поведений может выглядеть так:&lt;br /&gt;
&lt;br /&gt;
''-потом нарисую'' &lt;br /&gt;
&lt;br /&gt;
Этот макет является ключом к функционированию ИИ в игре, т.к. он определяет все поведения, которые ИИ должен поддерживать в игре. Это, естественно, должно переводиться в '''BHS''' с набором для реализации подходящего поведения. &lt;br /&gt;
Все '''BHS''' должны быть определены внутри папки '''«Game»''' в директории «'''Scripts/AI/SelectionTrees'''». Новое дерево, добавляемое в эту папку, будет автоматически проявлено в игре при перезагрузке ИИ или при перезагрузке игры. Чтобы связать '''BHS''' с конкретным архетипом ИИ, загрузите архетип в редакторе, и используйте выпадающее меню для '''BehaviorSelectionTree''' параметра под вкладкой '''Class Properties'''. &lt;br /&gt;
&lt;br /&gt;
== Дерево Выбора Поведений: концепция и анатомия == &lt;br /&gt;
&lt;br /&gt;
'''BHS''' концепция предполагает, что в любой момент времени ИИ будет иметь одно поведение соответствующее текущему состоянию. Так, когда ИИ слышит какой-то звук, он начинает исследовать его, а когда видит врага - атакует его. Обратите внимание, что BHS не содержит информации о том, как ИИ переходит между состояниями, но содержит - только о том, как выбрать правильно поведение для правильного момента. &lt;br /&gt;
BHS определяется посредством '''XML''' скрипт-файла и должно быть пригодным для ИИ, чтобы он мог перейти в любое поведение. Если BHS недоступно, то ИИ может только поворачивать голову по направлению к цели, и '''«ai_debugdraw 1»''' будет показывать '''«No Behavior»''' в дебаге. &lt;br /&gt;
&lt;br /&gt;
'''BHS XML''' фацлы не содержат никакой скриптовой догики и являются чисто файлами данных, которые ИИ система рассматривает, когда решает, в каком поведении ИИ должен находиться в конкретный период времени. BHS также могут включать заменяемые блоки, позволяющие дизайнеру распределять базовое поведение между множеством ИИ.&lt;br /&gt;
&lt;br /&gt;
=== Дерево Выбора Поведений содержит 4 компонента: ===&lt;br /&gt;
&lt;br /&gt;
1) Выбираемые переменные: Переменные используются для определения условий, которые выбирают между статусами в Дереве.&lt;br /&gt;
2) Сигнальные переменные: Сигналы, как посылаемые ИИ системой, которая непосредственно изменяет состояние выбираемых переменных (см.пункт №1).&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-07-27T09:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;br /&gt;
&lt;br /&gt;
Давайте определим некий пример, на который в дальнейшем мы будем ссылаться в течение всей этой статьи. Скажем некий '''ИИ''', которого мы назовем «'''Grunt'''», имеет 3 поведения: '''idle''', '''alert''', и '''attack'''. (перевод этих названий соответственно: '''в режиме ожидания''' - т.е. дефолтное поведение, '''встревоженный''', '''боевое поведение'''). ИИ должен быть по определению в дефолтном поведении '''idle''', когда он не получает внешних стимулов; в состоянии '''alert''' он должен находиться, года он слышит что-то неизвестное, и наконец в состояние '''attack''' он перейдет, когда он визуально может уже видеть врага. Обратно в состояние '''idle''' он может перейти через некоторое время, если он на его протяжении не получает обновляющихся слуховых/визуальных стимулов. Чтобы поддерживать такую систему, '''ИИ''' должен иметь '''Дерево Выбора Поведений''' или '''BHS''', которое будет определять, какие условия ассоциируются с каким из поведений. Глобальная ИИ-система будет заботиться об обновлении ИИ перцепции (т.е. восприятия сигналов) и посылании сигналов событий, когда состояние перцепции ИИ меняется.  &lt;br /&gt;
&lt;br /&gt;
Диаграмма вышеуказанных поведений может выглядеть так:&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Скриптинг И.И.: Дерево выбора поведения</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F"/>
				<updated>2012-07-20T12:24:57Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: Новая страница: «{{В процессе перевода|автор=1|дата=20 июля 2012}}  {{Статья|автор= AndreyFilantrop |сложность=Средняя|сов...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В процессе перевода|автор=1|дата=20 июля 2012}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=20/07/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Дерево выбора поведения =&lt;br /&gt;
&lt;br /&gt;
== Обзор ==&lt;br /&gt;
&lt;br /&gt;
В то время как скрипты поведения представляют собой индивидуальную логическую обработку состояний в которых может находиться '''ИИ''', по прежнему должна существовать возможность выбора между ними, чтобы выбрать правильное поведение в любой момент игры. Дерево выбора поведений '''(BHS)''' определяет набор правил, которые позволяют ИИ системе сохранять необходимое поведение ИИ всё время. Каждый ИИ-тип должен быть связан с '''BHS''', и более чем один ИИ-тип может относиться к тому же '''BHS'''.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/CryEngine_3_Free_SDK:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2</id>
		<title>CryEngine 3 Free SDK:Создание ресурсов</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/CryEngine_3_Free_SDK:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2"/>
				<updated>2012-06-02T17:59:19Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
= Создание ресурсов =&lt;br /&gt;
Руководство по созданию ресурсов для CryENGINE представляет собой всеобъемлющее руководство для оказания помощи художникам, аниматорам, звукоинженерам по разработке и экспорту активов в CryENGINE. Настоящее руководство делится на следующие разделы руководств по: основам, моделированию, текстурированию, полибампу, анимации, кинематике, аудио, CryTools, фотошопу. &lt;br /&gt;
&lt;br /&gt;
= Введение =&lt;br /&gt;
&lt;br /&gt;
== Приступая к работе ==&lt;br /&gt;
В этом разделе представлен обзор арт пайплайна, типой файлов, компилятора ресурсов, руководств по разработке, также как и дальнейшей подготовке и оптимизации продуктов разработки. &lt;br /&gt;
&lt;br /&gt;
== Создание новых ресурсов для CryENGINE ==&lt;br /&gt;
* [[Моделирование]]: Обучает как моделировать статичные объекты, разрушаемые ресурсы, растительность, транспорт и оружие.&lt;br /&gt;
* [[Персонажи]]: Эта тема содержит всю необходимую информацию о создании персонажей для CryENGINE. Она включает моделирование персонажей, общий риг, риг с физикой и настройкой внутри CryENGINE. &lt;br /&gt;
* [[Текстурирование]]: Эта тема содержит руководства по подготовке различных видов текстур для использования в редакторе Sandbox.&lt;br /&gt;
* [[Материалы]]: Содержит информацию о настройке и создании материалов.&lt;br /&gt;
* [[Анимация]]: Руководства по анимации содержат информацию о лицевой анимации, CBA файлах, требованиях к костям, процедуральной анимации, группах движения, захвате движения и boid-моделях. &lt;br /&gt;
&lt;br /&gt;
== Добавочные темы ==&lt;br /&gt;
* [[Аудио]]: Это руководство по приготовлению звуков для CryENGINE.&lt;br /&gt;
* [[Кинематика]]: Обучает как создавать катсцены.&lt;br /&gt;
* [[Локализация]]: Информация о том, как готовить локализацию игровых ресурсов. &lt;br /&gt;
&lt;br /&gt;
==Технические ресурсы==&lt;br /&gt;
* [[Resource Compiler]]: Детальная инструкция как вручную или автоматически переводить первоначальные ресурсы в готовый скомпилированный продукт. &lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Документация]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/CryEngine_3_Free_SDK:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2</id>
		<title>CryEngine 3 Free SDK:Создание ресурсов</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/CryEngine_3_Free_SDK:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2"/>
				<updated>2012-06-02T05:50:07Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Создание ресурсов =&lt;br /&gt;
Руководство по созданию ресурсов для CryENGINE представляет собой всеобъемлющее руководство для оказания помощи художникам, аниматорам, звукоинженерам по разработке и экспорту активов в CryENGINE. Настоящее руководство делится на следующие разделы руководств по: основам, моделированию, текстурированию, полибампу, анимации, кинематике, аудио, CryTools, фотошопу. &lt;br /&gt;
&lt;br /&gt;
= Введение =&lt;br /&gt;
&lt;br /&gt;
== Приступая к работе ==&lt;br /&gt;
В этом разделе представлен обзор арт пайплайна, типой файлов, компилятора ресурсов, руководств по разработке, также как и дальнейшей подготовке и оптимизации продуктов разработки. &lt;br /&gt;
&lt;br /&gt;
== Создание новых ресурсов для CryENGINE ==&lt;br /&gt;
* [[Моделирование]] : Обучает как моделировать статичные объекты, разрушаемые ресурсы, растительность, транспорт и оружие.&lt;br /&gt;
* [[Персонажи]] : Эта тема содержит всю необходимую информацию о создании персонажей для CryENGINE. Она включает моделирование персонажей, общий риг, риг с физикой и настройкой внутри CryENGINE. &lt;br /&gt;
* [[Текстурирование]] : Эта тема содержит руководства по подготовке различных видов текстур для использования в редакторе Sandbox.&lt;br /&gt;
* [[Материалы]] : Содержит информацию о настройке и создании материалов.&lt;br /&gt;
* [[Анимация]] : Руководства по анимации содержат информацию о лицевой анимации, CBA файлах, требованиях к костям, процедуральной анимации, группах движения, захвате движения и boid-моделях. &lt;br /&gt;
&lt;br /&gt;
== Добавочные темы ==&lt;br /&gt;
* [[Аудио]] : Это руководство по приготовлению звуков для CryENGINE.&lt;br /&gt;
* [[Кинематика]] : Обучает как создавать катсцены.&lt;br /&gt;
* [[Локализация]] : Информация о том, как готовит локализацию игровых ресурсов. &lt;br /&gt;
&lt;br /&gt;
==Технические ресурсы==&lt;br /&gt;
* [[Resource Compiler]] : Детальная инструкция как вручную или автоматически переводить первоначальные ресурсы в готовый скомпилированный продукт. &lt;br /&gt;
&lt;br /&gt;
[[Категория:CryEngine 3 Free SDK:Документация]]&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T12:18:15Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Прием сигнала */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
   &lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука ('''readibility''', т.е. читабельность или наглядность), и затем достать их оружие. Обратите внимание, что измененяя его idle behavior, мы создаем дефолтный ответ по определению, который будет выполняться для любого behavior, в котором находится персонаж. В дальнейшем, мы можем захотеть переопределить этот ответ в других '''поведениях'''. Например, если мы хотим, чтобы персонаж реагировал по разному в зависимости от нахождения его в idle или attack behavior, мы добавим следующий ответ на функцию в '''CoverAttack.lua''' файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:SelectPipe(0, &amp;quot;cover_pindown&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где «cover_pindown» это голпайпа, которая заставляет парня спрятаться за ближайшим к цели укрытием. &lt;br /&gt;
Мы можем расширить это на других персонажей character: если имеется некая группа членов с разными характерами character (например, Scout, Rear и т.д.) и мы хотим заставить их реагировать также, мы должны добавить «ENEMY_SPOTTED» ответ также в их '''idle/attack''' behavior поведение.     &lt;br /&gt;
&lt;br /&gt;
Наконец, мы можем заставить парней переключить их поведение с '''idle''' на '''attack''', если они видят врага. Мы тогда добавим следующую строчку в '''character''' (Scripts/AI/Characters/Personalities/Cover.lua в примере):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
CoverIdle = {&lt;br /&gt;
  &lt;br /&gt;
  ENEMY_SPOTTED = *CoverAttack*,&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Наследование поведения ==&lt;br /&gt;
&lt;br /&gt;
Если специфические сигналы должны быть использованы в более чем одном поведении '''behavior''', то существует механизм наследования. Behavior классы могут либо прямо наследовать более общую реализацию под ключевым словом '''Base = [CRYENGINE:ParentBehaviorName]''' либо непрямо, как '''Idle behavior''' персонажа так и дефолтное '''default behavior''' (определенное в файле DEFAULT.lua) рассматриваются в качестве запасного варианта поведения, если сигнал не реализован в текущем поведении '''behavior'''.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T12:17:39Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука ('''readibility''', т.е. читабельность или наглядность), и затем достать их оружие. Обратите внимание, что измененяя его idle behavior, мы создаем дефолтный ответ по определению, который будет выполняться для любого behavior, в котором находится персонаж. В дальнейшем, мы можем захотеть переопределить этот ответ в других '''поведениях'''. Например, если мы хотим, чтобы персонаж реагировал по разному в зависимости от нахождения его в idle или attack behavior, мы добавим следующий ответ на функцию в '''CoverAttack.lua''' файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:SelectPipe(0, &amp;quot;cover_pindown&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где «cover_pindown» это голпайпа, которая заставляет парня спрятаться за ближайшим к цели укрытием. &lt;br /&gt;
Мы можем расширить это на других персонажей character: если имеется некая группа членов с разными характерами character (например, Scout, Rear и т.д.) и мы хотим заставить их реагировать также, мы должны добавить «ENEMY_SPOTTED» ответ также в их '''idle/attack''' behavior поведение.     &lt;br /&gt;
&lt;br /&gt;
Наконец, мы можем заставить парней переключить их поведение с '''idle''' на '''attack''', если они видят врага. Мы тогда добавим следующую строчку в '''character''' (Scripts/AI/Characters/Personalities/Cover.lua в примере):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
CoverIdle = {&lt;br /&gt;
  &lt;br /&gt;
  ENEMY_SPOTTED = *CoverAttack*,&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Наследование поведения ==&lt;br /&gt;
&lt;br /&gt;
Если специфические сигналы должны быть использованы в более чем одном поведении '''behavior''', то существует механизм наследования. Behavior классы могут либо прямо наследовать более общую реализацию под ключевым словом '''Base = [CRYENGINE:ParentBehaviorName]''' либо непрямо, как '''Idle behavior''' персонажа так и дефолтное '''default behavior''' (определенное в файле DEFAULT.lua) рассматриваются в качестве запасного варианта поведения, если сигнал не реализован в текущем поведении '''behavior'''.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T12:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука ('''readibility''', т.е. читабельность или наглядность), и затем достать их оружие. Обратите внимание, что измененяя его idle behavior, мы создаем дефолтный ответ по определению, который будет выполняться для любого behavior, в котором находится персонаж. В дальнейшем, мы можем захотеть переопределить этот ответ в других '''поведениях'''. Например, если мы хотим, чтобы персонаж реагировал по разному в зависимости от нахождения его в idle или attack behavior, мы добавим следующий ответ на функцию в '''CoverAttack.lua''' файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:SelectPipe(0, &amp;quot;cover_pindown&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где «cover_pindown» это голпайпа, которая заставляет парня спрятаться за ближайшим к цели укрытием. &lt;br /&gt;
Мы можем расширить это на других персонажей character: если имеется некая группа членов с разными характерами character (например, Scout, Rear и т.д.) и мы хотим заставить их реагировать также, мы должны добавить «ENEMY_SPOTTED» ответ также в их '''idle/attack''' behavior поведение.     &lt;br /&gt;
&lt;br /&gt;
Наконец, мы можем заставить парней переключить их поведение с '''idle''' на '''attack''', если они видят врага. Мы тогда добавим следующую строчку в '''character''' (Scripts/AI/Characters/Personalities/Cover.lua в примере):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
CoverIdle = {&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
  ENEMY_SPOTTED = *CoverAttack*,&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Наследование поведения ==&lt;br /&gt;
&lt;br /&gt;
Если специфические сигналы должны быть использованы в более чем одном поведении '''behavior''', то существует механизм наследования. Behavior классы могут либо прямо наследовать более общую реализацию под ключевым словом '''Base = [CRYENGINE:ParentBehaviorName]''' либо непрямо, как '''Idle behavior''' персонажа так и дефолтное '''default behavior''' (определенное в файле DEFAULT.lua) рассматриваются в качестве запасного варианта поведения, если сигнал не реализован в текущем поведении '''behavior'''.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;[[Категория:Официальная документация:Crysis 2 MOD SDK:Скриптинг]] &amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T10:42:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука ('''readibility''', т.е. читабельность или наглядность), и затем достать их оружие. Обратите внимание, что измененяя его idle behavior, мы создаем дефолтный ответ по определению, который будет выполняться для любого behavior, в котором находится персонаж. В дальнейшем, мы можем захотеть переопределить этот ответ в других '''поведениях'''. Например, если мы хотим, чтобы персонаж реагировал по разному в зависимости от нахождения его в idle или attack behavior, мы добавим следующий ответ на функцию в '''CoverAttack.lua''' файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:SelectPipe(0, &amp;quot;cover_pindown&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где «cover_pindown» это голпайпа, которая заставляет парня спрятаться за ближайшим к цели укрытием. &lt;br /&gt;
Мы можем расширить это на других персонажей character: если имеется некая группа членов с разными характерами character (например, Scout, Rear и т.д.) и мы хотим заставить их реагировать также, мы должны добавить «ENEMY_SPOTTED» ответ также в их '''idle/attack''' behavior поведение.     &lt;br /&gt;
&lt;br /&gt;
Наконец, мы можем заставить парней переключить их поведение с '''idle''' на '''attack''', если они видят врага. Мы тогда добавим следующую строчку в '''character''' (Scripts/AI/Characters/Personalities/Cover.lua в примере):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
CoverIdle = {&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
  ENEMY_SPOTTED = *CoverAttack*,&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Наследование поведения ==&lt;br /&gt;
&lt;br /&gt;
Если специфические сигналы должны быть использованы в более чем одном поведении '''behavior''', то существует механизм наследования. Behavior классы могут либо прямо наследовать более общую реализацию под ключевым словом '''Base = [CRYENGINE:ParentBehaviorName]''' либо непрямо, как '''Idle behavior''' персонажа так и дефолтное '''default behavior''' (определенное в файле DEFAULT.lua) рассматриваются в качестве запасного варианта поведения, если сигнал не реализован в текущем поведении '''behavior'''.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T10:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука ('''readibility''', т.е. читабельность или наглядность), и затем достать их оружие. Обратите внимание, что измененяя его idle behavior, мы создаем дефолтный ответ по определению, который будет выполняться для любого behavior, в котором находится персонаж. В дальнейшем, мы можем захотеть переопределить этот ответ в других '''поведениях'''. Например, если мы хотим, чтобы персонаж реагировал по разному в зависимости от нахождения его в idle или attack behavior, мы добавим следующий ответ на функцию в '''CoverAttack.lua''' файле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:SelectPipe(0, &amp;quot;cover_pindown&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где «cover_pindown» это голпайпа, которая заставляет парня спрятаться за ближайшим к цели укрытием. &lt;br /&gt;
Мы можем расширить это на других персонажей character: если имеется некая группа членов с разными характерами character (например, Scout, Rear и т.д.) и мы хотим заставить их реагировать также, мы должны добавить «ENEMY_SPOTTED» ответ также в их '''idle/attack''' behavior поведение.     &lt;br /&gt;
&lt;br /&gt;
Наконец, мы можем заставить парней переключить их поведение с '''idle''' на '''attack''', если они видят врага. Мы тогда добавим следующую строчку в '''character''' (Scripts/AI/Characters/Personalities/Cover.lua в примере):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
CoverIdle = {&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
  ENEMY_SPOTTED = *CoverAttack*,&lt;br /&gt;
},&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Наследование поведения ==&lt;br /&gt;
&lt;br /&gt;
Если специфические сигналы должны быть использованы в более чем одном поведении '''behavior''', то существует механизм наследования. Behavior классы могут либо прямо наследовать более общую реализацию под ключевым словом '''Base = [CRYENGINE:ParentBehaviorName]''' либо непрямо, как '''Idle behavior''' персонажа так и дефолтное '''default behavior''' (определенное в файле DEFAULT.lua) рассматриваются в качестве запасного варианта поведения, если сигнал не реализован в текущем поведении '''behavior'''.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-28T09:27:16Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Типичный пример это когда враг игрока замечает игрока: его «OnEnemySeen» системное событие вызывается, и давайте предположим, что он хочет известить его товарищей (товарищи с такойже группой id как у него). В этом дефолтном idle поведении (например, CoverAttack.lua если '''character''' является '''Cover'''), мы модифицируем его «OnEnemySeen» событие таким образом:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
OnEnemySeen = function( self, entity, fDistance )&lt;br /&gt;
  -- вызывается когда ИИ видит живого врага&lt;br /&gt;
  AI:Signal(SIGNALFILTER_GROUPONLY, 1, &amp;quot;ENEMY_SPOTTED&amp;quot;,entity.id);&lt;br /&gt;
end,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы определили новый сигнал называемый «'''ENEMY_SPOTTED'''».&lt;br /&gt;
Следующий шаг - определить ответную функцию. Будем считать, что другие члены группы имеют тот же character, тогда мы добавим ответную функцию в в то же idle behavior, в котором мы только что модифицировали «OnEnemySeen».  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
ENEMY_SPOTTED = function (self, entity, sender)&lt;br /&gt;
  entity:Readibility(&amp;quot;FIRST_HOSTILE_CONTACT&amp;quot;);&lt;br /&gt;
  entity:InsertSubpipe(0, &amp;quot;DRAW_GUN&amp;quot;);&lt;br /&gt;
End,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это заставит парней (включая и самого отправителя сигнала, который имеет такое же behavior) изменить их анимацию и произвести некоторый вид тревожного звука (readibility, т.е. читабельность или наглядность), и затем достать их оружие.&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-27T17:37:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Определение, кто будет получать сигнал */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе отправителя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в группе отправителя, например враги с такой же группой id, на всём уровне &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SPECIESONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности с таким же параметром '''species''' как и у отправителя, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_SUPERSPECIES &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности с таким же параметром '''species''' как и у отправителя,на всём уровне&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_HALFOFGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Половина сущностей в группе отправителя (нет способа определить какие именно сущности) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTGROUP &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_NEARESTINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Ближайшая сущность к отправителю в его группе, если она в его радиусе коммуникации &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_ANYONEINCOMM &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Все сущности в радиусе коммуникации отправителя&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALID_READIBILITY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
Это специальный вид сигнала, который используется чтобы заставить сущность получателя показать наглядное событие '''readability''' (звук/анимация).&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;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
MySignalName = function(self, entity, sender)&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
self: это behavior сущности&lt;br /&gt;
entity: сама сущность&lt;br /&gt;
sender: отправитель сигнала &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта функция на самом деле является вызовом, который также как системные события, может быть определен в текущем поведении behavior сущности получателя, в '''default idle behavior''' - дефолтном поведении (если он не присутствует в текущем поведении behavior) или в Scripts/AI/Behaviors/Default.lua скриптовом файле (если не присутствует в дефолтном поведении). Что касается системных событий, сигнал также может быть использован, чтобы заставить персонажа '''character'''  изменить своё поведение '''behavior'''; если мы добавим строчку как нижеследующая в файле персонажа character:   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Behaviour1 = {&lt;br /&gt;
    OnEnemySeen   = *Behaviour1*,&lt;br /&gt;
    OnEnemyMemory = *Behaviour2*,&lt;br /&gt;
    &amp;amp;#8230;&lt;br /&gt;
    MySignalName  = *MyNewBehaviour*,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это означает, что если '''character''' на текущий момент находится в поведении «Behaviour1» и получает сигнал MySignalName, выполнив функцию вызова выше него затем переключит его поведение на '''«MyNewBehaviour»'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Пример ==&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-26T07:06:36Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Посылание сигналов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;80%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе посылателя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ---- &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-26T07:04:29Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Определение, кто будет получать сигнал */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;100%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При помощи фильтра сигнала мы можем определять подмножество агентов, которые будут получать сигнал. &lt;br /&gt;
Параметр фильтра сигнала в вызове функции '''AI:Signal (...)''' может быть один из следующих:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;30%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Signal filter'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;70%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''Сигнал посылается к:'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Сущность определяется entity_id параметром (обычно сам посылатель но не обязательно) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_LASTOP&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
Цель последней операции сущности (если таковая имеется) &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_TARGET&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
Текущая цель внимания сущности &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | SIGNALFILTER_GROUPONLY &lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | Все сущности в группе посылателя, например враги с такой же группой id, на расстоянии коммуникации с &lt;br /&gt;
&lt;br /&gt;
отправителем&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ---- &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;30%&amp;quot; | --&lt;br /&gt;
| width=&amp;quot;70%&amp;quot; | ----&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-26T06:42:30Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: /* Посылание сигналов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;100%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	<entry>
		<id>http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B</id>
		<title>Скриптинг И.И.: Сигналы</title>
		<link rel="alternate" type="text/html" href="http://wiki.crymod.net/index.php/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_%D0%98.%D0%98.:_%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB%D1%8B"/>
				<updated>2012-04-26T06:41:28Z</updated>
		
		<summary type="html">&lt;p&gt;AndreyFilantrop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В_процессе_перевода}}&lt;br /&gt;
&lt;br /&gt;
{{Статья|автор= AndreyFilantrop |сложность=Средняя|совместимости=All|требования= Текстовый редактор, Crysis 2 Mod SDK. |добавлена=25/04/12}}&amp;lt;!-- The article’s topic (AI scripting…)--&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;
'''CryAISystem''' (система искусственного интеллекта '''CryEngine''') предлагает мощный, полностью настраиваемый инструмент для коммуникации '''ИИ''' сущностей друг с другом, которым является система сигналов. Сигнал это событие, которое может быть послано агентом другому единственного агенту (включая самого себя) или под-множеству всех агентов активных в настоящее время в игре. Мы уже встречались с концептом сигнала в секции по голпайпам (см. описание сигнальной цели более подробно). В настоящей секции мы опишем:&lt;br /&gt;
&lt;br /&gt;
-  как посылать сигналы от поведения агента к другим агентам&lt;br /&gt;
 &lt;br /&gt;
-  как определять подмножество агентов, которые получат посылаемый сигнал&lt;br /&gt;
&lt;br /&gt;
-  как  агент получатель может реагировать на посланный сигнал&lt;br /&gt;
&lt;br /&gt;
== Посылание сигналов==&lt;br /&gt;
&lt;br /&gt;
Метод посылания сигналов следующий:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
AI:Signal(Signal_filter, signal_type, *MySignalName*, sender_entity_id);&lt;br /&gt;
-- смысл этой записи:  &lt;br /&gt;
-- Некий ИИ Сигнал (Фильтр сигнала, тип сигнала, *Имя моего сигнала*, id сущности посылающей сигнал)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''Signal_filter:''' определяет подмножество агентов в игре, которые будут получать сигнал. Оно может быть выбрано из фиксированного набора символов, которые имеют префикс '''SIGNALFILTER_.''' Полный список доступных сигнальных фильтров представлен ниже.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;simple&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;10%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''signal_type'''&amp;lt;/div&amp;gt;&lt;br /&gt;
| style=&amp;quot;background: rgb(204, 204, 204);&amp;quot; width=&amp;quot;100%&amp;quot; | &amp;lt;div style=&amp;quot;color: rgb(0, 0, 0);&amp;quot;&amp;gt;'''описание'''&amp;lt;/div&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 1&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если она активна&lt;br /&gt;
и нет установки на игнорирование (см. AI:MakePuppetIgnorant более подробно)&lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | 0&lt;br /&gt;
| width=&amp;quot;60%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его только если нет установки на игнорирование  &lt;br /&gt;
|-&lt;br /&gt;
| width=&amp;quot;10%&amp;quot; | -1&lt;br /&gt;
| width=&amp;quot;80%&amp;quot; | сущность, получающая сигнал, будет обрабатывать его безоговорочно &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''MySignalName:''' фактический идентификатор сигнала. Это может быть любая не пустая строка; должна существовать функция с таким же именем или в его текущем поведении, его дефолтном поведении (default behavior), или в '''DEFAULT.lua''' скриптовом файле для того чтобы реагировать на полученный сигнал.&lt;br /&gt;
&lt;br /&gt;
'''entity_id:''' это '''id''' сущности получателя сигнала. Обычно вы можете захотеть прописать entity.id (или self.id если он вызывается из '''entity''' а не из её '''behavior'''), послать сигнал к самому отправителю, но вы также можете прописать любой другой id куда послать сигнал к другой сущности.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Определение, кто будет получать сигнал ==&lt;/div&gt;</summary>
		<author><name>AndreyFilantrop</name></author>	</entry>

	</feed>