<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.178.170.114&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=89.178.170.114&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/89.178.170.114"/>
		<updated>2026-06-13T23:16:50Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:31:57Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём, и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый способ, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 0 (день)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; состояние 0 (день) и состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
		        return 0  -- переключает всех мутантов/нпс на дневную работу&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ереключает всех мутантов/нпс на ночную работу&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726 Обсуждение тут]&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
[http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip Скачать Smartterrain and Waypoint Tools]&lt;br /&gt;
&lt;br /&gt;
[http://ifolder.ru/7179080 Зеркало на всякий случай]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:30:03Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 0 (день)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; состояние 0 (день) и состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
		        return 0  -- переключает всех мутантов/нпс на дневную работу&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- ереключает всех мутантов/нпс на ночную работу&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726 Обсуждение тут]&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
[http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip Скачать Smartterrain and Waypoint Tools]&lt;br /&gt;
&lt;br /&gt;
[http://ifolder.ru/7179080 Зеркало на всякий случай]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 0 (день)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; состояние 0 (день) и состояние 1 (ночь)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726 Обсуждение тут]&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
[http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip Скачать Smartterrain and Waypoint Tools]&lt;br /&gt;
&lt;br /&gt;
[http://ifolder.ru/7179080 Зеркало на всякий случай]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726 Обсуждение тут]&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
[http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip Скачать Smartterrain and Waypoint Tools]&lt;br /&gt;
&lt;br /&gt;
[http://ifolder.ru/7179080 Зеркало на всякий случай]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:27:38Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: /* Ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726 Обсуждение тут]&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
[http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip Скачать Smartterrain and Waypoint Tools]&lt;br /&gt;
&lt;br /&gt;
[http://ifolder.ru/7179080 Зеркало на всякий]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:25:06Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяем работу для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:21:36Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties (параметры рестриктора)&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties (параметры смарттеррейна)&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:19:10Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- онлайн = истина по дефолту&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:18:03Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties (основные параметры)&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties (параметры объекта)&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties (параметры шейпа объекта)&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker(прогуливающийся) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp(лагерь) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard(охранник) -&amp;gt; состояние 0, днем)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper(спящий) -&amp;gt; состояние 1, ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; состояние 0 и 1, днем/ночью)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- нпс будет использовать эту логику, &lt;br /&gt;
        ;-- если ST переключится в это состояние&lt;br /&gt;
	;-- в этом случае - состояние 0 (день)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- описывает нпс в этом состоянии: онлайн или офлайн&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- описывает рестрикторы (куда нпс могут/не могут пойти)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
        ;-- ввиду особого способа присвоения работ в  &lt;br /&gt;
        ;-- smart_terrain.script вы никогда не знаете, какая работа&lt;br /&gt;
	;-- будет использоваться каждым нпсом; если вы хотите быть уверенным&lt;br /&gt;
	;-- что конкретный нпс взял конкретную работу, тогда&lt;br /&gt;
	;-- вам нужно заюзать предикатную функцию; в этом слуае&lt;br /&gt;
	;-- мы хотим чтобы эта работа присвоилась мастеру бандиту&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:03:44Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&amp;lt;br&amp;gt;&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- &amp;quot;соеденительная секция&amp;quot; для логики, определяем ltx фаилом&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- пріоритет&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:01:27Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: /* Перевод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: /* Автор */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Участник:Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-12T00:00:48Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Добавляем &amp;quot;работу&amp;quot; (логика) для каждого нпс/мутанта из нашего ST(для каждого состояния). Предположии у ST их два: состояние 0 (описывает какие нпс/мутанты &amp;quot;работают&amp;quot; днем) и состояние 1 (ночью). У нас 3 бандита, определяемся:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (состояние 0) и kamp (состояние 1)&lt;br /&gt;
- bandit2: guard (состояние 0) и sleeper (состояние 1)&lt;br /&gt;
- bandit3: walker (состояние 0 и 1 &amp;lt;= он делает тоже и днём и ночью)&lt;br /&gt;
&lt;br /&gt;
У нас есть 3 способа добавить логику (работу) для каждого нпс/мутанта, мы будем использовать наиболее общепринятый, добавим логику в фаил config\misc\gulag_escape.ltx. Она должна выглядеть примерно так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Теперь нам нужно заскриптовать наш ST. Так что добавим наш код в фаил скрипта \gulag_escape.script. Есть еще несколько моментов, которые мы должны здесь доделать (каждый из этих шагов обязателен):&lt;br /&gt;
&lt;br /&gt;
- грузим логику (работу) для каждого нпс/мутанта и для каждого состояния -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Еще один момент о состояниях ST, всё зависит от того сколько у вас их в ST. Еще одна важной вещью является добавление логики для каждого состояния. Например в вашем ST такие состояния:&lt;br /&gt;
&lt;br /&gt;
0 - нпс оффлайн&amp;lt;br&amp;gt;&lt;br /&gt;
1 - нпс онлайн (день)&amp;lt;br&amp;gt;&lt;br /&gt;
2 - нпс онлайн (ночь)&amp;lt;br&amp;gt;&lt;br /&gt;
3 - нпс онлайн, они решили напасть на другой ST&amp;lt;br&amp;gt;&lt;br /&gt;
4 - нпс онлайн, актор напал на них&lt;br /&gt;
&lt;br /&gt;
К сведению, меня не прет заполнять такое большое количество таблиц, так что обычно я использую эту функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Используя функцию выше, мы можем загружать логику наподобие этой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- автоматически изменяется работа для каждого нпс/мутанта -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- убедитесь что наш ST будет использоваться только для бандитов -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Автор ==&lt;br /&gt;
&lt;br /&gt;
[[Участник:Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
== Перевод ==&lt;br /&gt;
[[Участник:Loxotron]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-11T23:30:11Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&amp;lt;br&amp;gt;&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Adding job (logic) for each npc/mutant from our ST (for each state). Let's say our ST have two states: state 0 (describes what npcs/mutants are doing during day) and state 1 (during night). We have 3 bandits, so say:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (state 0) and kamp (state 1)&lt;br /&gt;
- bandit2: guard (state 0) and sleeper (state 1)&lt;br /&gt;
- bandit3: walker (state 0 and 1 &amp;lt;= he's doing the same at day and night)&lt;br /&gt;
&lt;br /&gt;
There are at least 3 ways to add logic (job) for each npc/mutant, we will use the most common one, i.e. we will add logic to config\misc\gulag_escape.ltx file. It may looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Now we have to script our ST. In this case we will add our code to scripts\gulag_escape.script file. There are several things we need to do here (each of this steps is required):&lt;br /&gt;
&lt;br /&gt;
- load logic (jobs) for each npc/mutant, for each state -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One more thing about ST states, it's up to you how many states your ST have. The important thing is to add logic for each state. For instance your ST can have those states:&lt;br /&gt;
&lt;br /&gt;
0 - npcs are offline&lt;br /&gt;
1 - npcs are online (day)&lt;br /&gt;
2 - npcs are online (night)&lt;br /&gt;
3 - npcs are online, they decided to assault other ST&lt;br /&gt;
4 - npcs are online and actor attacks them&lt;br /&gt;
&lt;br /&gt;
And another thing, i'm sick when i have to fill so many tables, so i usually use this function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So using above function, we can load logic like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- automatically change job for each npc/mutant -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- ensure that our ST will be used only by bandits -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
[[Team:Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-11T23:27:56Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&lt;br /&gt;
&lt;br /&gt;
name of the stash (blue box) where items will be spawn when ST respawn will be called (optional)&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Adding job (logic) for each npc/mutant from our ST (for each state). Let's say our ST have two states: state 0 (describes what npcs/mutants are doing during day) and state 1 (during night). We have 3 bandits, so say:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (state 0) and kamp (state 1)&lt;br /&gt;
- bandit2: guard (state 0) and sleeper (state 1)&lt;br /&gt;
- bandit3: walker (state 0 and 1 &amp;lt;= he's doing the same at day and night)&lt;br /&gt;
&lt;br /&gt;
There are at least 3 ways to add logic (job) for each npc/mutant, we will use the most common one, i.e. we will add logic to config\misc\gulag_escape.ltx file. It may looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Now we have to script our ST. In this case we will add our code to scripts\gulag_escape.script file. There are several things we need to do here (each of this steps is required):&lt;br /&gt;
&lt;br /&gt;
- load logic (jobs) for each npc/mutant, for each state -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One more thing about ST states, it's up to you how many states your ST have. The important thing is to add logic for each state. For instance your ST can have those states:&lt;br /&gt;
&lt;br /&gt;
0 - npcs are offline&lt;br /&gt;
1 - npcs are online (day)&lt;br /&gt;
2 - npcs are online (night)&lt;br /&gt;
3 - npcs are online, they decided to assault other ST&lt;br /&gt;
4 - npcs are online and actor attacks them&lt;br /&gt;
&lt;br /&gt;
And another thing, i'm sick when i have to fill so many tables, so i usually use this function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So using above function, we can load logic like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- automatically change job for each npc/mutant -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- ensure that our ST will be used only by bandits -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
[[Team:Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-11T23:27:44Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- луа программированием&amp;lt;br&amp;gt;&lt;br /&gt;
- редактированием all.spawn&amp;lt;br&amp;gt;&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&amp;lt;br&amp;gt;&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&lt;br /&gt;
&lt;br /&gt;
name of the stash (blue box) where items will be spawn when ST respawn will be called (optional)&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Adding job (logic) for each npc/mutant from our ST (for each state). Let's say our ST have two states: state 0 (describes what npcs/mutants are doing during day) and state 1 (during night). We have 3 bandits, so say:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (state 0) and kamp (state 1)&lt;br /&gt;
- bandit2: guard (state 0) and sleeper (state 1)&lt;br /&gt;
- bandit3: walker (state 0 and 1 &amp;lt;= he's doing the same at day and night)&lt;br /&gt;
&lt;br /&gt;
There are at least 3 ways to add logic (job) for each npc/mutant, we will use the most common one, i.e. we will add logic to config\misc\gulag_escape.ltx file. It may looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Now we have to script our ST. In this case we will add our code to scripts\gulag_escape.script file. There are several things we need to do here (each of this steps is required):&lt;br /&gt;
&lt;br /&gt;
- load logic (jobs) for each npc/mutant, for each state -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One more thing about ST states, it's up to you how many states your ST have. The important thing is to add logic for each state. For instance your ST can have those states:&lt;br /&gt;
&lt;br /&gt;
0 - npcs are offline&lt;br /&gt;
1 - npcs are online (day)&lt;br /&gt;
2 - npcs are online (night)&lt;br /&gt;
3 - npcs are online, they decided to assault other ST&lt;br /&gt;
4 - npcs are online and actor attacks them&lt;br /&gt;
&lt;br /&gt;
And another thing, i'm sick when i have to fill so many tables, so i usually use this function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So using above function, we can load logic like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- automatically change job for each npc/mutant -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- ensure that our ST will be used only by bandits -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
[[Team:Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8</id>
		<title>SoC. Смартеррейны и гулаги</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BC%D0%B0%D1%80%D1%82%D0%B5%D1%80%D1%80%D0%B5%D0%B9%D0%BD%D1%8B_%D0%B8_%D0%B3%D1%83%D0%BB%D0%B0%D0%B3%D0%B8"/>
				<updated>2008-08-11T23:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;89.178.170.114: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В последнее время люди постоянно меня спрашивали как создать скрипт гулага для смартеррейнов. Чтобы постоянно не отвечать на каждое отдельное письмо, я решил написать небольшой тутор. Прежде чем начать, хотелось бы предупредить, что не являюсь экспертом в подобного рода вещах и некоторые моменты мне всё еще не ясны до конца, так что вероятно я не смогу объяснить всё правильно. Также я буду использовать ST как абревиатуру смартеррейна. Этот тутор посвящен НПС в ST, но он также сгодится и для мутантов. Предполагаю что вы знакомы с:&lt;br /&gt;
&lt;br /&gt;
- луа программированием&lt;br /&gt;
- редактированием all.spawn&lt;br /&gt;
- работа с вейпоинтами(патрульными путями)&lt;br /&gt;
- утилитами аи&lt;br /&gt;
&lt;br /&gt;
В первую очередить подумайте о своём ST, где бы его заспавнить, сколько нпс/мутантов будут в нем выполнять определенную &amp;quot;работу&amp;quot;, когда ST должен активироваться/отключаться, сколько и какие состояния будет у вашего ST и тд. Думаю, наиболее эффективный способ объяснить вам как это работает на примере. Давайте предположим.. мы хотим поставить ST(smart terrain) на Кордоне для 3х бандитов.&lt;br /&gt;
&lt;br /&gt;
1. Спавн ST:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[2515]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = smart_terrain&lt;br /&gt;
name         = esc_bandits_smart_terrain&lt;br /&gt;
position     = 131.02030944824,0.065616846084595,-248.9094543457&lt;br /&gt;
direction    = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id  = 635&lt;br /&gt;
distance        = 9.09999942779541&lt;br /&gt;
level_vertex_id = 363757&lt;br /&gt;
object_flags    = 0x==3e&lt;br /&gt;
custom_data     = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes        = shape0&lt;br /&gt;
shape0:type   = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 20.55957102775574&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_smart_terrain properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эта наиболее важная часть:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
type     = esc_bandits_smart_terrain&lt;br /&gt;
cond     = {-infoportion}&lt;br /&gt;
capacity = 3&lt;br /&gt;
squad    = 1&lt;br /&gt;
groups   = 5&lt;br /&gt;
respawn  = esc_respawn_inventory_box_0002&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''type''' название вашего нового ST(обязательно)&lt;br /&gt;
'''cond''' описывает условия, которые необходимы для выполнения(по желанию)&lt;br /&gt;
'''capacity''' количество мутантов/нпс, которое может вместить смарттеррейн(обязательно)&lt;br /&gt;
'''squad, groups''' - номер сквада и количество групп(по желанию)&lt;br /&gt;
'''respawn''' название тайника(синяя коробка) куда будут спавниться предметы, когда мы вызовем респавн в ST.(по желанию)&lt;br /&gt;
&lt;br /&gt;
name of the stash (blue box) where items will be spawn when ST respawn will be called (optional)&lt;br /&gt;
&lt;br /&gt;
2. Спавн нпс/мутантов и назначение(биндинг) их к нашему ST: для этого мы должны добавить каждому мутанту/нпс определенную логику:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[smart_terrains]&lt;br /&gt;
esc_bandits_smart_terrain = true&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... переведу потом, loxotron&lt;br /&gt;
&lt;br /&gt;
3. Adding job (logic) for each npc/mutant from our ST (for each state). Let's say our ST have two states: state 0 (describes what npcs/mutants are doing during day) and state 1 (during night). We have 3 bandits, so say:&lt;br /&gt;
&lt;br /&gt;
- bandit1: walker (state 0) and kamp (state 1)&lt;br /&gt;
- bandit2: guard (state 0) and sleeper (state 1)&lt;br /&gt;
- bandit3: walker (state 0 and 1 &amp;lt;= he's doing the same at day and night)&lt;br /&gt;
&lt;br /&gt;
There are at least 3 ways to add logic (job) for each npc/mutant, we will use the most common one, i.e. we will add logic to config\misc\gulag_escape.ltx file. It may looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
;-- bandit1 (walker -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
path_walk         = bandit1_walk&lt;br /&gt;
danger            = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
def_state_moving1 = patrol&lt;br /&gt;
def_state_moving2 = patrol&lt;br /&gt;
def_state_moving3 = patrol&lt;br /&gt;
meet              = no_meet&lt;br /&gt;
&lt;br /&gt;
;-- bandit1 (kamp -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit1_kamp]&lt;br /&gt;
active = kamp@esc_bandits_smart_terrain_bandit1&lt;br /&gt;
&lt;br /&gt;
[kamp@esc_bandits_smart_terrain_bandit1]&lt;br /&gt;
center_point = bandit_kamp&lt;br /&gt;
path_walk    = bandit_kamp_task&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (guard -&amp;gt; state 0, i.e. during day)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_walk = bandit2_walk&lt;br /&gt;
path_look = bandit2_look&lt;br /&gt;
danger    = danger_condition@esc_bandits_smart_terrain&lt;br /&gt;
&lt;br /&gt;
;-- bandit2 (sleeper -&amp;gt; state 1, i.e. during night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit2_sleeper]&lt;br /&gt;
active = sleeper@esc_bandits_smart_terrain_bandit2&lt;br /&gt;
&lt;br /&gt;
[sleeper@esc_bandits_smart_terrain_bandit2]&lt;br /&gt;
path_main = bandit2_sleep&lt;br /&gt;
wakeable  = false&lt;br /&gt;
&lt;br /&gt;
;-- bandit3 (guard -&amp;gt; state 0 and 1, i.e. during day/night)&lt;br /&gt;
[logic@esc_bandits_smart_terrain_bandit3_walker]&lt;br /&gt;
active = walker@esc_bandits_smart_terrain_bandit3&lt;br /&gt;
&lt;br /&gt;
[walker@esc_bandits_smart_terrain_bandit3]&lt;br /&gt;
path_walk = bandit3_walk&lt;br /&gt;
path_look = bandit3_look&lt;br /&gt;
&lt;br /&gt;
[danger_condition@esc_bandits_smart_terrain]&lt;br /&gt;
ignore_distance_corpse = 0&lt;br /&gt;
ignore_distance        = 0&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Now we have to script our ST. In this case we will add our code to scripts\gulag_escape.script file. There are several things we need to do here (each of this steps is required):&lt;br /&gt;
&lt;br /&gt;
- load logic (jobs) for each npc/mutant, for each state -&amp;gt; function load_job(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	t = {}&lt;br /&gt;
	;-- section is a &amp;quot;link&amp;quot; to logic defined in ltx file&lt;br /&gt;
	t.section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_walker&amp;quot;&lt;br /&gt;
	;-- no idea, probably describes after what time&lt;br /&gt;
	;-- npc will use this job again (?)&lt;br /&gt;
	t.idle = 0&lt;br /&gt;
	;-- no idea but i guess it's optional&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	;-- priority&lt;br /&gt;
	t.prior = 100&lt;br /&gt;
	;-- npc will use this logic if ST switched to this state&lt;br /&gt;
	;-- in this case - state 0 (day)&lt;br /&gt;
	t.state = {0}&lt;br /&gt;
	;-- no idea about squad and group&lt;br /&gt;
	t.squad = squad&lt;br /&gt;
	t.group = groups[1]&lt;br /&gt;
	;-- no idea what means position_threshold&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	;-- describes whether npc in this state is online or offline&lt;br /&gt;
	;-- online = true by default&lt;br /&gt;
	t.online = true&lt;br /&gt;
	;-- describes restrictors (where npc can/can't go)&lt;br /&gt;
	t.in_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	t.out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
	;-- because of the way how jobs are assigning by&lt;br /&gt;
	;-- smart_terrain.script you never know which job&lt;br /&gt;
	;-- will be used by which npc; if you want to ensure&lt;br /&gt;
	;-- that certain job is used by certain npc then&lt;br /&gt;
	;-- you have to use predicate function; in this case&lt;br /&gt;
	;-- we want this job to be used by expert (master) bandit&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit1_kamp&amp;quot;,&lt;br /&gt;
	idle = 0, timeout = 0, prior = 100, state = {1},squad = squad,&lt;br /&gt;
	group = groups[1], position_threshold = 100, online = true, in_rest = &amp;quot;&amp;quot;,&lt;br /&gt;
	out_rest = &amp;quot;&amp;quot;, predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 0 (day)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit2 -&amp;gt; state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit2_sleeper&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	;-- bandit3 -&amp;gt; state 0 (day) and state 1 (night)&lt;br /&gt;
	t = {section = &amp;quot;logic@esc_bandits_smart_terrain_bandit3_walker&amp;quot;,&lt;br /&gt;
	idle = 0, prior = 5, state = {0, 1}, squad = squad, group = groups[1],&lt;br /&gt;
	in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;}&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One more thing about ST states, it's up to you how many states your ST have. The important thing is to add logic for each state. For instance your ST can have those states:&lt;br /&gt;
&lt;br /&gt;
0 - npcs are offline&lt;br /&gt;
1 - npcs are online (day)&lt;br /&gt;
2 - npcs are online (night)&lt;br /&gt;
3 - npcs are online, they decided to assault other ST&lt;br /&gt;
4 - npcs are online and actor attacks them&lt;br /&gt;
&lt;br /&gt;
And another thing, i'm sick when i have to fill so many tables, so i usually use this function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function fill_tbl(section, idle, prior, states, squad, group, in_rest, out_rest, online, gulag_name)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	tbl.section = &amp;quot;logic@&amp;quot; .. gulag_name .. &amp;quot;_&amp;quot; .. section&lt;br /&gt;
	tbl.idle = idle&lt;br /&gt;
	tbl.prior = prior	&lt;br /&gt;
	tbl.state = {}&lt;br /&gt;
&lt;br /&gt;
	for index = 1, #states do&lt;br /&gt;
		table.insert(tbl.state, states[index])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl.squad = squad&lt;br /&gt;
	tbl.group = group&lt;br /&gt;
	tbl.in_rest = in_rest&lt;br /&gt;
	tbl.out_rest = out_rest&lt;br /&gt;
	tbl.online = online&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So using above function, we can load logic like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	local t = table.insert(sj, fill_tbl(&amp;quot;bandit1_walker&amp;quot;, 0, 100, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	t = table.insert(sj, fill_tbl(&amp;quot;bandit1_kamp&amp;quot;, 0, 100, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	t.timeout = 0&lt;br /&gt;
	t.position_threshold = 100&lt;br /&gt;
	t.predicate = function(obj_info) return obj_info.rank &amp;gt;= 900 end&lt;br /&gt;
	table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_walker&amp;quot;, 0, 5, {0}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit2_sleeper&amp;quot;, 0, 5, {1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
	table.insert(sj, fill_tbl(&amp;quot;bandit3_walker&amp;quot;, 0, 5, {0, 1}, squad, groups[1], &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, true, type))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- automatically change job for each npc/mutant -&amp;gt; function load_states(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return function(gulag)&lt;br /&gt;
		if not db.actor then&lt;br /&gt;
			return gulag.state&lt;br /&gt;
		end&lt;br /&gt;
		if level.get_time_hours() &amp;gt;= 5 and level.get_time_hours() &amp;lt;= 22 then&lt;br /&gt;
			return 0  -- switch all mutants/npc to daily job&lt;br /&gt;
		else&lt;br /&gt;
			return 1  -- switch all mutants/npc to nightly job&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- ensure that our ST will be used only by bandits -&amp;gt; function checkStalker(...)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if gulag_type == &amp;quot;esc_bandits_smart_terrain&amp;quot; then&lt;br /&gt;
	return npc_community == &amp;quot;bandit&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Author ==&lt;br /&gt;
&lt;br /&gt;
[[Team:Dez0wave]]&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
Обсуждение:&lt;br /&gt;
http://www.gsc-game.com/main.php?t=community&amp;amp;s=forums&amp;amp;s_game_type=xr&amp;amp;thm_page=77&amp;amp;thm_id=14712&amp;amp;sec_id=16&amp;amp;page=1#199726&lt;br /&gt;
&lt;br /&gt;
Используйте нашу утилиту для дебаггинга смартеррейнов и экспорта вейпоинтов:&lt;br /&gt;
&lt;br /&gt;
Скачать: http://sdk.stalker-game.com/ru/images/d/d7/Smartterrain_and_Waypoint_Tools_by_dez0wave.zip&lt;br /&gt;
&lt;br /&gt;
Зеркало: http://ifolder.ru/7179080&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>89.178.170.114</name></author>	</entry>

	</feed>