<?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=Singapur22</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=Singapur22"/>
		<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/Singapur22"/>
		<updated>2026-06-15T09:56:14Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_Bind_%D0%B8%D0%BB%D0%B8_%D0%BD%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0_Infoportions</id>
		<title>Разбор Bind или новая замена Infoportions</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_Bind_%D0%B8%D0%BB%D0%B8_%D0%BD%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0_Infoportions"/>
				<updated>2011-06-22T10:02:59Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: /* Различия и сходства Infoportion и Infoscript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание статьи==&lt;br /&gt;
В этой статье я расскажу о бинде объекта, о последовательности этапов класса бинда, о сохранении и загрузке переменных и на основе всех этих фактов, сделаю переменную, которая будет в некотором смысле напоминать инфопоршень.&lt;br /&gt;
&lt;br /&gt;
==Что такое Bind и как его используют?==&lt;br /&gt;
Итак, разберу сначала такую штуку, как bind. Для меня Bind - это повторение одного и того же действия в режиме alife (во время игры), производимого для определённого объекта, пока он не перейдёт в офлайн. Не работает во время паузы. Итак, как же используется бинд? Начну с самых верхов. У нас есть какая-нибудь секция. По умолчанию там присутствует такая строка:&lt;br /&gt;
 '''script_binding'''&lt;br /&gt;
И она ничему не равна. Как бы сказали скрипты: nil. Но есть такие секции, которым присвоены определённые значения script_binding. Например:&lt;br /&gt;
&lt;br /&gt;
 '''[actor]''':common_ph_friction_params_on_npc_death&lt;br /&gt;
 GroupControlSection		= spawn_group&lt;br /&gt;
 $spawn 					= &amp;quot;actor&amp;quot;&lt;br /&gt;
 $ed_icon				= ed\ed_actor&lt;br /&gt;
 $player 				= on&lt;br /&gt;
 $prefetch 				= 16&lt;br /&gt;
 cform                   = skeleton&lt;br /&gt;
 class                   = O_ACTOR&lt;br /&gt;
 money					= 40;&lt;br /&gt;
 rank					= 3;&lt;br /&gt;
 &amp;lt;big&amp;gt;'''script_binding			= bind_stalker.actor_init'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы видим, что актор (собственно, сам Меченый или, если выражаться правильней, Главный Герой, ГГ) имеет скриптовый бинд. Теперь люди, знакомые со скриптом bind_stalker, могли заметить там функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_init    (npc)&lt;br /&gt;
	npc:bind_object(actor_binder(npc))&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём её. Прямо с первой строки.&lt;br /&gt;
* '''actor_init''' - название функции&lt;br /&gt;
* '''npc''' - тот объект, у которого в секции имеется script_binding, будет каждый раз при переходе в онлайн, биндиться тем самым скриптом, указаным в script_binding. Т.к. всё вертится вокруг актора, то получается так, что актор всегда в онлайне, не считая его удаления (при выходе/перезагрузке или при переходе на др. локацию)&lt;br /&gt;
Вторая строка:&lt;br /&gt;
* '''bind_object''' - т.к. npc уже обсуждали, то скажу так: объект, получаемый скриптом через скриптовый бинд (на выходе '''npc''') является объектом, к которому обращение идёт через двоеточие ('''game_object*'''). Например, можно написать npc:position(). Для примера можно вставить такой код:&lt;br /&gt;
&amp;lt;lua&amp;gt;function actor_init    (npc)&lt;br /&gt;
	get_console():execute(npc:game_vertex_id())&lt;br /&gt;
	npc:bind_object(actor_binder(npc))&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
Я его не проверял, но, по идее, он должен вывести в консоль текущий гейм-вертекс актора. Будет это выглядеть как-то так:&lt;br /&gt;
 '''! Unknown command:  666'''&lt;br /&gt;
Это так будет, если гейм-вертекс актора будет аццкий - '''666'''.&lt;br /&gt;
&lt;br /&gt;
Итак... С обращением разобрались. Теперь разберём само обращение '''bind_object'''. Это обращение зашито в dll (скорее всего, в xrGame) и про него можно посмотреть в скрипте lua_help.script:&lt;br /&gt;
&amp;lt;c&amp;gt;function bind_object(object_binder*);&amp;lt;/c&amp;gt;&lt;br /&gt;
Сразу перейдём к следующим после bind_object словам, не забывая про '''object_binder*''' из lua_help.script&lt;br /&gt;
* '''actor_binder(npc)''' - это то, с помощью чего мы обращаемся. Если поднапряжёмся и вспомним, что было друмя строками выше, то поймём, что '''actor_binder(npc)''' - это и есть '''object_binder*'''. Но это не полное объяснение. Ещё надо добавить, что actor_binder - это класс в том же скрипте - bind_stalker, который носит назввание '''''actor_binder'''''. Как же он выглядит, это класс бинда:&lt;br /&gt;
&amp;lt;lua&amp;gt;class &amp;quot;actor_binder&amp;quot; (object_binder)&amp;lt;/lua&amp;gt;&lt;br /&gt;
А npc в скобках - это object_binder, который указан в скобках класса. &lt;br /&gt;
 &amp;quot;actor_binder&amp;quot; ('''object_binder''')&lt;br /&gt;
&lt;br /&gt;
Итак, мы разобрали построчно функцию '''actor_init''', но ещё не знаем, чем же различаются класс actor_binder и функция actor_init, начинающая этот бинд. Так вот в чём различия:&lt;br /&gt;
* actor_binder - это класс, который постоянно повторяется (биндится)&lt;br /&gt;
* actor_init - это вызываемая из секции конфига функция, которая начинает бинд, но она выполняется только один раз - при переходе объекта в онлайн и ждёт перехода объекта в режим офлайн или удаления этого объекта из игры. После того, как объект пропадает, функция отключается и при его следующем появлении в онлайне, выполняется снова.&lt;br /&gt;
&lt;br /&gt;
Но и бинд не длится вечно. Как я уже говорил, ''Bind - это повторение одного и того же действия в режиме alife (во время игры), производимого для определённого объекта, пока он не перейдёт в офлайн.'' Сам переход в офлайн происходит через net_destroy. Это я называю функцией класса. Теперь рассмотрим работу функций класса.&lt;br /&gt;
&lt;br /&gt;
 Я пока только начал подробное изучение биндеров и могу ошибиться в порядке выполнения функций класса типа bind. &lt;br /&gt;
 Тем не менее, у меня уже есть свой порядок выполнения функций класса bind.&lt;br /&gt;
* Сначала выполняется __init.&lt;br /&gt;
* Заетм идёт, load. Если сохранялись какие-то изменения.&lt;br /&gt;
* Потом происходит net_spawn&lt;br /&gt;
* Потом идёт update - бинд.&lt;br /&gt;
* Потом при сохранении происходит save.&lt;br /&gt;
* Затем net_destroy при офлайн переходе.&lt;br /&gt;
* Потом по идее net_spawn и reinit. Дальше всё с третьего шага (не уверен, что второй шаг тоже пропускается)&lt;br /&gt;
&lt;br /&gt;
На этапе net_destroy и net_spawn происходит множество других функций класса bind вроде take_item_from_box (колбэк на взятие предмета в инвентарь из inventory_box - тайника), on_item_drop (колбэк при выбрасывании предмета) и т.п. Тем не менее, некоторые функции класса (кроме главных, которые я перечислял в этапах) могут быть использованы на других этапах, но на update обычно происходят проверки. Не буду сейчас останавливаться на колбэках и перейду к следующему этапу - разбор сохранения.&lt;br /&gt;
&lt;br /&gt;
==Разбор сохранений==&lt;br /&gt;
&lt;br /&gt;
На самом деле сохранения я буду разбирать прямо сейчас. очень хочу что-нибудь полегче. Например, treasure_manager.&lt;br /&gt;
Посмотрим, что тут у нас...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;function CTreasure:save(p)&lt;br /&gt;
	--' Сохраняем размер таблицы&lt;br /&gt;
	local size = 0&lt;br /&gt;
	for k,v in pairs(self.treasure_info) do&lt;br /&gt;
		size = size + 1&lt;br /&gt;
	end&lt;br /&gt;
	p:w_u16(size)&lt;br /&gt;
	for k,v in pairs(self.treasure_info) do&lt;br /&gt;
		p:w_u16(v.target)&lt;br /&gt;
		p:w_bool(v.active)&lt;br /&gt;
		p:w_bool(v.done)&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По идее это save сохраняет всю указанную информацию объекте в sav файл сохранения в виде нет-пакета. Судя по некоторым строкам, которые, по идее могут кое-что прояснять... Особенно при вылете :) Например, &amp;quot;SAVE FILE IS CORRUPT&amp;quot;. Что же, попробую теперь разобрать загрузку:&lt;br /&gt;
&amp;lt;lua&amp;gt;--' Загружаем уровень сложности&lt;br /&gt;
local game_difficulty = reader:r_u8()&lt;br /&gt;
local load_treasure_manager = false      &lt;br /&gt;
if game_difficulty &amp;gt;= 128 then           &lt;br /&gt;
	game_difficulty = game_difficulty - 128&lt;br /&gt;
	load_treasure_manager = true           &lt;br /&gt;
end                                      &lt;br /&gt;
get_console():execute(&amp;quot;g_game_difficulty &amp;quot;..game_difficulty_by_num[game_difficulty])&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут явная загрузка уровня сложности. Слишком явная, судя по комментарию... Хватит лирики...  Разбираем!&lt;br /&gt;
* Сначала задаём переменной game_difficulty одну из переменных пакета. В данном случае переменная числовая.&lt;br /&gt;
* Присваиваем переменной load_treasure_manager булёвое (логическое) значение false.&lt;br /&gt;
* Проверяем, что если game_difficulty больше или равен 128, то:&lt;br /&gt;
** Вычитаем из game_difficulty 128&lt;br /&gt;
** Присваиваем переменной load_treasure_manager значение true&lt;br /&gt;
* Устанавливаем через консоль уровень сложности.&lt;br /&gt;
&lt;br /&gt;
Потом можно заметить:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
if load_treasure_manager == true then&lt;br /&gt;
	treasure_manager.load(reader)      &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это значит, что в будущем переменная load_treasure_manager будет играть особенную роль. По идее она отвечает за загрузку менеджера тайников. Точное значение сказать не смогу.&lt;br /&gt;
&lt;br /&gt;
Итак, какие же значения можно присваивать пакетным данным? Об этом сказано в ранее упоминаемом скрипте lua_help.script. А там... Лучше не буду писать, а то места много надо. Сами посмотрите. Я укажу лишь несколько значений:&lt;br /&gt;
* Булёвое. '''r_bool''' и '''w_bool'''&lt;br /&gt;
* Строковое. '''r_stringZ''' и '''w_stringZ'''&lt;br /&gt;
* Числовое. '''r_u8''' и '''w_u8'''&lt;br /&gt;
 Я не знаю точно, можно ли ставить (плавающую) запятую в числе, поэтому лучше берите целые числа где-то в области от -10&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt; до 10&amp;lt;sup&amp;gt;7&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Практика==&lt;br /&gt;
&lt;br /&gt;
Итак. Теперь попробую попрактиковаться... Вы со мной... для начала изменим функции класса bind с именами до такого вида (полностью заменяйте текст функции, которую я вам даю:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:net_spawn(data)&lt;br /&gt;
	printf(&amp;quot;actor net spawn&amp;quot;)		&lt;br /&gt;
&lt;br /&gt;
	level.show_indicators()&lt;br /&gt;
&lt;br /&gt;
	self.bCheckStart = true&lt;br /&gt;
	self.weapon_hide = false -- спрятано или нет оружие при разговоре.&lt;br /&gt;
	weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.&lt;br /&gt;
&lt;br /&gt;
	if object_binder.net_spawn(self,data) == false then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	db.add_actor(self.object)&lt;br /&gt;
	&lt;br /&gt;
	if self.st.disable_input_time == nil then&lt;br /&gt;
		level.enable_input()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	self.weather_manager:reset()&lt;br /&gt;
--	game_stats.initialize ()&lt;br /&gt;
&lt;br /&gt;
	if(actor_stats.add_to_ranking~=nil)then&lt;br /&gt;
		actor_stats.add_to_ranking(self.object:id())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--' Загружаем настройки дропа&lt;br /&gt;
	death_manager.init_drop_settings()&lt;br /&gt;
	&lt;br /&gt;
	--' В случае новой игры у нас этой переменной не будет. Иначе она загрузится из load&lt;br /&gt;
	if db.storage[&amp;quot;rekongstor_boolean&amp;quot;] == nil then&lt;br /&gt;
	db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
		&lt;br /&gt;
	if db.storage[&amp;quot;rekongstor_boolean&amp;quot;] == true then&lt;br /&gt;
		alife():create(&amp;quot;af_medusa&amp;quot;,vector():set(0,0,0),1,1,self.object:id())&lt;br /&gt;
		db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Лучше редактировать сначала load, а потом save, т.к. по любому сначала идёт загрузка...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:load(reader)&lt;br /&gt;
	printf(&amp;quot;actor_binder:load(): self.object:name()='%s'&amp;quot;, self.object:name())&lt;br /&gt;
	object_binder.load(self, reader)&lt;br /&gt;
	printf(&amp;quot;actor_binder:object_binder.load(): self.object:name()='%s'&amp;quot;, self.object:name())&lt;br /&gt;
&lt;br /&gt;
	--' Загружаем уровень сложности&lt;br /&gt;
	local game_difficulty = reader:r_u8()&lt;br /&gt;
	&lt;br /&gt;
	local load_treasure_manager = false      &lt;br /&gt;
	if game_difficulty &amp;gt;= 128 then           &lt;br /&gt;
		game_difficulty = game_difficulty - 128&lt;br /&gt;
		load_treasure_manager = true           &lt;br /&gt;
	end                                      &lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	get_console():execute(&amp;quot;g_game_difficulty &amp;quot;..game_difficulty_by_num[game_difficulty])&lt;br /&gt;
&lt;br /&gt;
	if reader:r_eof() then&lt;br /&gt;
		abort(&amp;quot;SAVE FILE IS CORRUPT&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local stored_input_time = reader:r_u8()&lt;br /&gt;
	if stored_input_time == true then&lt;br /&gt;
		self.st.disable_input_time = utils.r_CTime(reader)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--' проходит прежде всего. если данных в пакете нет, то по идее должен быть nil&lt;br /&gt;
		db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = reader:r_bool()&lt;br /&gt;
&lt;br /&gt;
	xr_logic.pstor_load_all(self.object, reader)&lt;br /&gt;
	self.weather_manager:load(reader)&lt;br /&gt;
&lt;br /&gt;
	sr_psy_antenna.load(reader)&lt;br /&gt;
	&lt;br /&gt;
	if load_treasure_manager == true then&lt;br /&gt;
		treasure_manager.load(reader)      &lt;br /&gt;
	end                                  &lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	task_manager.load(reader)&lt;br /&gt;
	self.actor_detector:load(reader)	&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
А теперь save:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function actor_binder:save(packet)&lt;br /&gt;
	&lt;br /&gt;
	local save_treasure_manager = true&lt;br /&gt;
	&lt;br /&gt;
	printf(&amp;quot;actor_binder:save(): self.object:name()='%s'&amp;quot;, self.object:name())&lt;br /&gt;
	object_binder.save(self, packet)&lt;br /&gt;
&lt;br /&gt;
	--' Сохраняем уровень сложности&lt;br /&gt;
	if save_treasure_manager == true then&lt;br /&gt;
		packet:w_u8(level.get_game_difficulty() + 128)&lt;br /&gt;
	else&lt;br /&gt;
		packet:w_u8(level.get_game_difficulty())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	--' Сохраняем данные об отключенном вводе&lt;br /&gt;
	if self.st.disable_input_time == nil then&lt;br /&gt;
		packet:w_bool(false)&lt;br /&gt;
	else&lt;br /&gt;
		packer:w_bool(true)&lt;br /&gt;
		utils.w_CTime(packet, self.st.disable_input_time)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--' save по-любому будет после новой игры. поэтому переменная у нас будет либо дефолтная (при net_spawn), либо загруженная (при load)&lt;br /&gt;
	packet:w_bool(db.storage[&amp;quot;rekongstor_boolean&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
	xr_logic.pstor_save_all(self.object, packet)&lt;br /&gt;
	self.weather_manager:save(packet)&lt;br /&gt;
&lt;br /&gt;
	sr_psy_antenna.save( packet )&lt;br /&gt;
	&lt;br /&gt;
	if save_treasure_manager == true then&lt;br /&gt;
		treasure_manager.save(packet)      &lt;br /&gt;
	end                                  &lt;br /&gt;
&lt;br /&gt;
	task_manager.save(packet)&lt;br /&gt;
	self.actor_detector:save(packet)	&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;	--' проходит прежде всего. если данных в пакете нет, то по идее должен быть nil&lt;br /&gt;
		db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = reader:r_bool()&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут происходит загрузка данных из сохранённого пакета в переменную, которая существует на протяжении игры. Точно не знаю, когда она прерывается, но это не имеет особого значения.&lt;br /&gt;
&lt;br /&gt;
* Я не уверен, но сначала происходит load. Если он не нашёл данные в пакете, то они равны nil. В этом случае переменная принимает данные из пакета.&lt;br /&gt;
* Load может и не происходить, но и так данные будут равны nil, потому что им ничто не присвоено. А в этом случае просто load не происходит и переменная никак не трогается.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lua&amp;gt;	--' В случае новой игры у нас этой переменной не будет. Иначе она загрузится из load&lt;br /&gt;
	if db.storage[&amp;quot;rekongstor_boolean&amp;quot;] == nil then&lt;br /&gt;
	db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if db.storage[&amp;quot;rekongstor_boolean&amp;quot;] == true then&lt;br /&gt;
		alife():create(&amp;quot;af_medusa&amp;quot;,vector():set(0,0,0),1,1,self.object:id())&lt;br /&gt;
		db.storage[&amp;quot;rekongstor_boolean&amp;quot;] = false&lt;br /&gt;
	end&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сначала происходит Load, но его я уже объяснил. Сейчас я объясняю net_spawn.&lt;br /&gt;
&lt;br /&gt;
Первое действие - проверка на существование переменной. Если мы начали новую игру, то тогда переменная равна nil, т.к. load её ещё не знает и мы её ещё не объявляли. А если переменной не существует, то мы ей объявляем значение true и она уже не nil, а принимает логическое значение.&lt;br /&gt;
&lt;br /&gt;
Второе действие. Если у переменной логическое значение равно true, то спавним артефакт медуза в инвентарь ГГ и объявляем значение false. Если было значение false, то не спавним. Как это работает? &lt;br /&gt;
* Мы начали новую игру&lt;br /&gt;
* ''(Возможно, идёт загрузка пакета и переменной, которая имеет значение nil. Мы опять присваиваем значение nil, т.е. ничего не меняется.)''&lt;br /&gt;
* Идёт проверка. Т.к. переменная = nil, то ей присваивается true.&lt;br /&gt;
* Идёт проверка. Т.к. переменная = true, То спавним артефакт (а вообще, можно произвести любое действие) и '''присваиваем переменной значение false'''&lt;br /&gt;
*** Больше ничего  не происходит - т.е. идёт бинд update&lt;br /&gt;
* Мы сохраняем игру (переходим на др. уровень)&lt;br /&gt;
* Идёт сохранение всех переменных, в том числе и нашей, а она равна false&lt;br /&gt;
&lt;br /&gt;
* Загружаем игру (загрузка др. уровня)&lt;br /&gt;
* Идёт загрузка пакета и переменной, которая имеет значение nil. Мы присваиваем значение false, т.е. то, которое было сохранено.&lt;br /&gt;
* Идёт проверка. Т.к. переменная = false, то ей ничего нового не присваивается (действие присваивания пропускается)&lt;br /&gt;
* Идёт проверка. Т.к. переменная = false, игра обходит действие и не происходит спавна и присвоения переменной false.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вот и всё. У меня скрипт нормально работает и спавнится только один артефакт. А теперь спросите, зачем это нужно? Значит вспоминаем не любимые многими модмейкерами инфопоршни. Именно с ними многие мучались при создании квестов. Сейчас я буду пробовать использование этих новых переменных, которым я пока дал название Info_Scripts в различных направлениях. Сейчас я знаю, что инфопоршни можно использовать с диалогами, квестами, энциклопедией и самими скриптами. В данном примере мы рассмотрели запрет на повторение действия без инфопоршня, но это было намного сложнее, нежели если бы мы создали инфопоршень. Тем не менее, это подробный разбор для отдельного случая. В последующих изменениях будет улучшена система выдачи этого добра и будет всё упрощено, в лучшем случае, до одной строчки. Но сначала надо создать скрипт, обрабатывающий всю эту информацию.&lt;br /&gt;
&lt;br /&gt;
==Различия и сходства Infoportion и Infoscript==&lt;br /&gt;
Чем отличается Infoportion от Infoscript:&lt;br /&gt;
* Получается из xml файла&lt;br /&gt;
* Относительно лёгкое использование в диалогах&lt;br /&gt;
* Относительно лёгкое использование в стандартных заданиях&lt;br /&gt;
* Помимо булёвых значений, может содержать информацию для выдачи статьи энциклопедии и/или задания&lt;br /&gt;
* Сложное использование в нестандартных заданиях, но есть возможность диалогов&lt;br /&gt;
&lt;br /&gt;
Чем отличается Infoscript от Infoportion:&lt;br /&gt;
* Получается из переменной скрипта&lt;br /&gt;
* Помимо булёвого значения, может принимать строковые и числовые&lt;br /&gt;
* '''Дальше не проверенная, но теоретически возможная информация:'''&lt;br /&gt;
** Сложное использование в диалогах (изучается сложность, направление на лёгкость - за основу dialog_manager.script) или лёгкий аналог&lt;br /&gt;
** Сложное использование в стандартных заданиях (изучается сложность, направление на лёгкость за основу task_manager.script)&lt;br /&gt;
** Не может выдать статью в энциклопедию (на проверке ключи и другие, если найду и эти не помогут set_article_key и set_article_id)&lt;br /&gt;
* Относительно лёгкое (при использовании упрощённого скрипта) использование при создании нестандартных квестов, но диалоги, скорее всего, придётся заменить&lt;br /&gt;
&lt;br /&gt;
Основное отличие infoportions от infoscripts в том, что состояние infoportions привязывается к объекту игры, и при удалении объекта, infoportion сбрасывается.&lt;br /&gt;
При этом infoscripts всегда привязаны к объекту actor.&lt;br /&gt;
&lt;br /&gt;
В чём их сходства?&lt;br /&gt;
* Оба могут использоваться в качестве булёвого значения&lt;br /&gt;
* Оба загружаются из файла сохранения (обычная переменная на такое не способна)&lt;br /&gt;
* Оба могут использоваться в нестандартных заданиях&lt;br /&gt;
* Оба могут использоваться в стандартных заданиях и диалогах&lt;br /&gt;
&lt;br /&gt;
===Проблема со стандартными заданиями и диалогами===&lt;br /&gt;
Есть такие теги, как infoportion_complete и infoportion_fail. Они оба обращаются к отдельно взятому инфопоршню. В диалогах почти также - has_info и dont_has_info. Это всё проверки на существование у игрока инфопоршня. Если такой будет, то задание либо выполняется, либо проваливается. Диалог/реплика либо присутствует, либо отсутствует. Но есть и такие теги, как precondition. Он, если вернёт false, то диалог или его реплика будут отсутствовать, если true, то наоборот. В заданиях теги такие - function_complete и function_fail. Они отвечают за возвращение функции true и false. При выполнении условий (возвращение функцией true), задание выполняется или, соответственно, проваливается. Но они обращаются лишь к функции, а вот какой инфоскрипт мы хотим взять, он умалчивает. Поэтому, пока придётся обходиться проверкой наличия инфоскрипта отдельно - через конкретное содержание функции. Но я попробую найти зацепки у диалогов и/или заданий, через которые можно получить уникальную информацию и послать её в функцию. Но это уже мои проблемы.&lt;br /&gt;
&lt;br /&gt;
===Что такое нестандартные задания?===&lt;br /&gt;
Это задания, которые регулируются через скрипт. О них я напишу в виде продолжения к этой статье. Они будут использоваться по такому типу:&lt;br /&gt;
* Мы в зоне выдачи задания?&lt;br /&gt;
* Мы согласились на выполнение задания?&lt;br /&gt;
* Нам выдали задание?&lt;br /&gt;
* Мы в зоне выполнения подзадания / у нас есть предмет для выполнения подзадания?&lt;br /&gt;
* Мы выполнили подзадание?&lt;br /&gt;
* Мы в зоне выполнения задания? &lt;br /&gt;
* Наше подзадание выполнено?&lt;br /&gt;
* Закончить выполнение задания.&lt;br /&gt;
** Выдать награду в виде денег, ранга или любой другой вещи, которые можно придумать.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В общем, у него есть свои плюсы. Например, можно легче сделать задание проверки определённого места в игре. Но минус один и причём большой. Нестандартные задания не могут занестись в КПК и отображаться при нажатии TAB. Но можно ставить метки на карты или, хотя бы, выводить информацию о задании в виде диалоговых окон или сноске на худ, что уже является неплохим утешением. Т.е. можно попробовать придумать специальный предмет, который собирает нестандартные задания и умеет с ними обращаться (например, выносить суть подквеста в худ). &lt;br /&gt;
&lt;br /&gt;
===Заключение===&lt;br /&gt;
Тем не менее, и тут у каждого свои плюсы и, чтобы вывести это новую небольшую технологию об использования инфоскриптов и нестандартных заданий на новый уровень развития, сократить разрыв с привычными инфопоршнями или вовсе обогнать их, придётся ещё поработать, повторить или узнать многие вещи, создать сложные скрипты, которые на выходе дают возможность обращения к ним лишь одной командой, придумать аналоги, вроде нестандартных квестов и получить обширное использование этой упрощённой технологии среди модмейкеров, а если повезёт, то и у разработчиков.&lt;br /&gt;
&lt;br /&gt;
Ждите новых статей по инфоскриптам!&lt;br /&gt;
&lt;br /&gt;
'''Я думаю, что эта статья достойна [[Обсуждение:Разбор Bind или новая замена Infoportions|обсуждения]]!'''&lt;br /&gt;
&lt;br /&gt;
==Дополнения==&lt;br /&gt;
* Возможно, получится создать аналог диалогу с помощью dialog_manager.script&lt;br /&gt;
* То же самое и для заданий! Скорее всего, можно будет использовать некоторые возможности task_maneger.script, чтобы занести задание в КПК.&lt;br /&gt;
* Сейчас появилась возможность, что выдать статью возможно - произвёл поиск по всем скриптам по article. Нашёл set_article_key и set_article_id. Буду пробовать.&lt;br /&gt;
* Ещё сейчас начну проверку по АМК скриптам. Там вроде что-то тоже упоминалось про сохранение и загрузку переменных.&lt;br /&gt;
-----&lt;br /&gt;
* Проверил АМК скрипты. Там присутствует загрузка переменных, но, в основном, роль у них одна - сохранение какой-нибудь стадии для скриптовых событий (выброса) или простое присваивание скриптам значения, которое должно сохраниться. У инфоскриптов, я бы сказал, аналогичное действие, но другая функция. Они существуют заместо стандартных инфопоршней и должны контролировать и облегчать создание диалогов и заданий, контролировать выдачу статей энциклопедии или простого каких-то действий, схожих с перечисленными.&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
 '''Скрипт bind_stalker с одиночной выдачей &amp;quot;Медузы&amp;quot;'''&lt;br /&gt;
 [http://intreface.narod.ru/bind_stalker.rar *.RAR (4087 Б)]&lt;br /&gt;
 [http://intreface.narod.ru/bind_stalker.script *.SCRIPT (15476 Б)]&lt;br /&gt;
&lt;br /&gt;
==Автор==&lt;br /&gt;
[[Участник:Rekongstor|Rekongstor]] ~19:30-22:54, 9 января 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn</id>
		<title>SoC. Respawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn"/>
				<updated>2010-10-11T17:01:21Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Респаун, один из самых часто задаваемый вопросов на форумах. Вот, решил написать статью, дабы не втирать одно и тоже каждому, кто не может с этим разобраться.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn NPC. ==&lt;br /&gt;
&lt;br /&gt;
Для создания респавна NPC, понадобится два файла: '''all.spawn''' и '''spawn_section.ltx'''. &lt;br /&gt;
&amp;lt;br&amp;gt;Это минимальный набор. Для полной настройки респавнера, нужны ещё '''character_desc_simulation.xml''' и '''npc_profile.xml'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' В '''all.spawn''' создаём секцию респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты (x,y,z)&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 10&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 0&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если используется программа '''XrSpawner''', то копируем любую секцию &amp;quot;respawn&amp;quot;; меняем имя объекта, координаты, и в окошке &amp;quot;скрипт&amp;quot; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' id респавн-секций из файла '''spawn_section.ltx'''. Цифры после запятой, означают отношение одной секции к другой. Если планируется одинаковое колличество респавна из каждой секции, то цифры ставить не требуется.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' колличество респавн-запросов за период времени, пока ГГ находится на локации. При переходе на другую локацию, счётчик '''max_count''' сбрасывается. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''min_count =''' минимальное колличество нпс, для экстренного респавна. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_spawn =''' колличество нпс за один цикл респавна.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Известно три типа '''medium, often, seldom'''. Обычно, используется тип '''medium'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions ='''Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions = {+инфо} 100, 0''' где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;'''2.''' В файле '''spawn_section.ltx''', создаём респавн-секции:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[esc_urody_respawn_1]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_1&amp;quot;&lt;br /&gt;
character_profile = sim_urody_novice&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = bandit&lt;br /&gt;
&lt;br /&gt;
[esc_urody_respawn_2]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_2&amp;quot;&lt;br /&gt;
character_profile = sim_urody_regular&lt;br /&gt;
spec_rank = regular&lt;br /&gt;
community = bandit&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''esc_urody_respawn_1''' id респавн-секции.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sim_urody_novice''' и '''sim_urody_regular''' классы профайлов нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''novice''' и '''regular''' ранги нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''bandit''' группировка нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' В файле '''npc_profile.xml''' регистрируем классы '''sim_urody_regular''' и '''sim_urody_novice'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;sim_urody_regular&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_regular&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;character id=&amp;quot;sim_urody_novice&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_novice&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём профили, в файле '''character_desc_simulation.xml''', с классами '''sim_urody_regular''' и '''sim_urody_novice''' и группировкой '''bandit'''.&lt;br /&gt;
&lt;br /&gt;
== Respawn монстров. ==&lt;br /&gt;
&lt;br /&gt;
В принципе, респавн мутантов идентичен респавну нпс. Но с одним лишь отличием, которое его значительно упрощает.&lt;br /&gt;
Вся настройка респавна мутантов, ограничивается секцией в файле &amp;quot;all.spawn&amp;quot;.&lt;br /&gt;
Вписываем секцию респавнера, как указано в -'''RESPAWN NPC'''-.&lt;br /&gt;
Все настройки идентичны, кроме строки '''respawn_section = '''.&lt;br /&gt;
В ней прописываем типы мутантов, из файла &amp;quot;se_respawn.script&amp;quot;. Такие как '''flesh_weak, flesh_normal, dog_weak, boar_strong, и т.д.'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
'''ОБЩИЕ НАСТРОЙКИ.'''&lt;br /&gt;
&lt;br /&gt;
Обязательные условия респавна:&lt;br /&gt;
&lt;br /&gt;
'''1.''' На локации обязательно должен быть хоть один гулаг для респавнящихся NPC и мутантов, так как количество NPC для респавна, ориентируется по доступным местам в гулагах.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Респавн производится, только если под гулагами есть доступные работы.&lt;br /&gt;
&lt;br /&gt;
'''3.''' На каждой локации, респавн ограничен определёнными типами неписей. Данные ограничения установлены в файле '''misc\smart_terrain_presets.ltx'''. Чтобы сделать возможным респавн неписей, не предусмотренных на данной локации. Надо в указанном файле, в секции нужной локации, дописать требуемые типы неписей.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для проверки созданного респавнера, можно не ждать когда сработает системный респавн, а вызвать принудительно респавн в нужной секции. Для этого, прописываем в любой логике, вызов функции '''%=respawner_spawn(имя респавнера)%'''. Где, &amp;quot;имя респавнера&amp;quot; - имя секции, созданной в файле all.spawn. Скобки обязательны. &lt;br /&gt;
&lt;br /&gt;
Например, можно создать рядом с зоной респавнера, временный рестриктор. И в кастом дате рестриктора, прописать вызов функции принудительного вызова респавна, в нужном респавнере, при входе ГГ в зону рестриктора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = sr_idle@in&lt;br /&gt;
&lt;br /&gt;
[sr_idle@in]&lt;br /&gt;
on_actor_inside = %=respawner_spawn(имя респавнера)% sr_idle@out&lt;br /&gt;
&lt;br /&gt;
[sr_idle@out]&lt;br /&gt;
on_actor_outside = sr_idle@in&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция принудительного вызова респавна, находится в файле '''xr_effects.script'''.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn предметов. ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Респавн предметов в инвентарных ящиках, несколько отличается от способа респавна NPC.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''1.''' Первое, что нам нужно сделать, это создать инвентарный ящик в файле &amp;quot;all.spawn&amp;quot;:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = inventory_box&lt;br /&gt;
name =  имя ящика&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffffba&lt;br /&gt;
&lt;br /&gt;
story_id = стори ай-ди ящика&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = equipments\item_box_01&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''2.''' Затем, в файле '''game_story_id.ltx''' регистрируем story_id ящика. (выбираем любое свободное число).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' Создаём респавнер в файле '''all.spawn'''. Координаты и размеры зоны респавнера, должны быть такими, чтоб инвентарный ящик поместился внутри зоны респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя_респавнера&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 2&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = список вещей респавна&lt;br /&gt;
idle_spawn = -1&lt;br /&gt;
parent = стори ай-ди ящика&lt;br /&gt;
item_spawn = true&lt;br /&gt;
max_count = 7&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 0.5,0,0   ;(ширина зоны респавнера, по X)&lt;br /&gt;
shape0:axis_y = 0,0.5,0   ;(высота зоны респавнера)&lt;br /&gt;
shape0:axis_z = 0,0,1     ;(ширина зоны респавнера, по Z)&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' список вещей респавна, в виде их спавн - секций. Как и в респавнерах неписей, возможна прописка соотношений между вещами. &lt;br /&gt;
&amp;lt;br&amp;gt;Например: respawn_section = wpn_pm,2, vodka,2, medkit,1, energy_drink,2, ammo_9x18_fmj,3  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Инвентарь не имеет типов спавна, поэтому ставится (-1).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''parent =''' Story_id инвентарного ящика (из game_story_id.ltx), в котором производить респавн вещей .&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''item_spawn =''' (true\false) возможность включения и отключения респавна. Можно задавать условия, например инфопоршнем или функцией (разумеется прописанной в xr_conditions.script).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' количество респав-циклов за определённый период времени. (Пока ГГ находится на локации. После перехода ГГ на другую локацию, счётчик сбрасывается).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём вызов респавна. Обычно вызов производится из '''smart_terrain'''. В &amp;quot;custom_data&amp;quot; любого подходящего '''smart_terrain''', под секцией [smart_terrain], вписываем вызов респавна:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
respawn = имя респавнера&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
И респавн будет производиться, при каждом пополнении нпс, под данным смартом.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Авторы статьи. ==&lt;br /&gt;
[[Singapur22]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Pihan13]] (дополнил и переоформил)&lt;br /&gt;
&amp;lt;br&amp;gt;[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn</id>
		<title>SoC. Respawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn"/>
				<updated>2010-10-11T16:59:51Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Респаун, один из самых часто задаваемый вопросов на форумах. Вот, решил написать статью, дабы не втирать одно и тоже каждому, кто не может с этим разобраться.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn NPC. ==&lt;br /&gt;
&lt;br /&gt;
Для создания респавна NPC, понадобится два файла: '''all.spawn''' и '''spawn_section.ltx'''. &lt;br /&gt;
&amp;lt;br&amp;gt;Это минимальный набор. Для полной настройки респавнера, нужны ещё '''character_desc_simulation.xml''' и '''npc_profile.xml'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' В '''all.spawn''' создаём секцию респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты (x,y,z)&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 10&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 0&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если используется программа '''XrSpawner''', то копируем любую секцию &amp;quot;respawn&amp;quot;; меняем имя объекта, координаты, и в окошке &amp;quot;скрипт&amp;quot; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' id респавн-секций из файла '''spawn_section.ltx'''. Цифры после запятой, означают отношение одной секции к другой. Если планируется одинаковое колличество респавна из каждой секции, то цифры ставить не требуется.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' колличество респавн-запросов за период времени, пока ГГ находится на локации. При переходе на другую локацию, счётчик '''max_count''' сбрасывается. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''min_count =''' минимальное колличество нпс, для экстренного респавна. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_spawn =''' колличество нпс за один цикл респавна.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Известно три типа '''medium, often, seldom'''. Обычно, используется тип '''medium'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions ='''Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions = {+инфо} 100, 0''' где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;'''2.''' В файле '''spawn_section.ltx''', создаём респавн-секции:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[esc_urody_respawn_1]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_1&amp;quot;&lt;br /&gt;
character_profile = sim_urody_novice&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = bandit&lt;br /&gt;
&lt;br /&gt;
[esc_urody_respawn_2]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_2&amp;quot;&lt;br /&gt;
character_profile = sim_urody_regular&lt;br /&gt;
spec_rank = regular&lt;br /&gt;
community = bandit&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''esc_urody_respawn_1''' id респавн-секции.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sim_urody_novice''' и '''sim_urody_regular''' классы профайлов нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''novice''' и '''regular''' ранги нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''bandit''' группировка нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' В файле '''npc_profile.xml''' регистрируем классы '''sim_urody_regular''' и '''sim_urody_novice'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;sim_urody_regular&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_regular&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;character id=&amp;quot;sim_urody_novice&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_novice&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём профили, в файле '''character_desc_simulation.xml''', с классами '''sim_urody_regular''' и '''sim_urody_novice''' и группировкой '''bandit'''.&lt;br /&gt;
&lt;br /&gt;
== Respawn монстров. ==&lt;br /&gt;
&lt;br /&gt;
В принципе, респавн мутантов идентичен респавну нпс. Но с одним лишь отличием, которое его значительно упрощает.&lt;br /&gt;
Вся настройка респавна мутантов, ограничивается секцией в файле &amp;quot;all.spawn&amp;quot;.&lt;br /&gt;
Вписываем секцию респавнера, как указано в -'''RESPAWN NPC'''-.&lt;br /&gt;
Все настройки идентичны, кроме строки '''respawn_section = '''.&lt;br /&gt;
В ней прописываем типы мутантов, из файла &amp;quot;se_respawn.script&amp;quot;. Такие как '''flesh_weak, flesh_normal, dog_weak, boar_strong, и т.д.'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
'''ОБЩИЕ НАСТРОЙКИ.'''&lt;br /&gt;
&lt;br /&gt;
Обязательные условия респавна:&lt;br /&gt;
&lt;br /&gt;
'''1.''' На локации обязательно должен быть хоть один гулаг для респавнящихся NPC и мутантов, так как количество NPC для респавна, ориентируется по доступным местам в гулагах.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Респавн производится, только если под гулагами есть доступные работы.&lt;br /&gt;
&lt;br /&gt;
'''3.''' На каждой локации, респавн ограничен определёнными типами неписей. Данные ограничения установлены в файле '''misc\smart_terrain_presets.ltx'''. Чтобы сделать возможным респавн неписей, не предусмотренных на данной локации. Надо в указанном файле, в секции нужной локации, дописать требуемые типы неписей.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для проверки созданного респавнера, можно не ждать когда сработает системный респавн, а вызвать принудительно респавн в нужной секции. Для этого, прописываем в любой логике, вызов функции '''%=respawner_spawn(имя респавнера)%'''. Где, &amp;quot;имя респавнера&amp;quot; - имя секции, созданной в файле all.spawn. Скобки обязательны. &lt;br /&gt;
&lt;br /&gt;
Например, можно создать рядом с зоной респавнера, временный рестриктор. И в кастом дате рестриктора, прописать вызов функции принудительного вызова респавна, в нужном респавнере, при входе ГГ в зону рестриктора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = sr_idle@in&lt;br /&gt;
&lt;br /&gt;
[sr_idle@in]&lt;br /&gt;
on_actor_inside = %=respawner_spawn(имя респавнера)% sr_idle@out&lt;br /&gt;
&lt;br /&gt;
[sr_idle@out]&lt;br /&gt;
on_actor_outside = sr_idle@in&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция принудительного вызова респавна, находится в файле '''xr_effects.script'''.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn предметов. ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Респавн предметов в инвентарных ящиках, несколько отличается от способа респавна NPC.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''1.''' Первое, что нам нужно сделать, это создать инвентарный ящик в файле &amp;quot;all.spawn&amp;quot;:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = inventory_box&lt;br /&gt;
name =  имя ящика&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffffba&lt;br /&gt;
&lt;br /&gt;
story_id = стори ай-ди ящика&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = equipments\item_box_01&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''2.''' Затем, в файле '''game_story_id.ltx''' регистрируем story_id ящика. (выбираем любое свободное число).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' Создаём респавнер в файле '''all.spawn'''. Координаты и размеры зоны респавнера, должны быть такими, чтоб инвентарный ящик поместился внутри зоны респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя_респавнера&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 2&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = список вещей респавна&lt;br /&gt;
idle_spawn = -1&lt;br /&gt;
parent = стори ай-ди ящика&lt;br /&gt;
item_spawn = true&lt;br /&gt;
max_count = 7&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 0.5,0,0   ;(ширина зоны респавнера, по X)&lt;br /&gt;
shape0:axis_y = 0,0.5,0   ;(высота зоны респавнера)&lt;br /&gt;
shape0:axis_z = 0,0,1     ;(ширина зоны респавнера, по Z)&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' список вещей респавна, в виде их спавн - секций. Как и в респавнерах неписей, возможна прописка соотношений между вещами. &lt;br /&gt;
&amp;lt;br&amp;gt;Например: respawn_section = wpn_pm,2, vodka,2, medkit,1, energy_drink,2, ammo_9x18_fmj,3  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Инвентарь не имеет типов спавна, поэтому ставится (-1).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''parent =''' Story_id инвентарного ящика (из game_story_id.ltx), в котором производить респавн вещей .&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''item_spawn =''' (true\false) возможность включения и отключения респавна. Можно задавать условия, например инфопоршнем или функцией (разумеется прописанной в xr_conditions.script).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' количество респав-циклов за определённый период времени. (Пока ГГ находится на уровне. После перехода ГГ на другой уровень, счётчик сбрасывается).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём вызов респавна. Обычно вызов производится из '''smart_terrain'''. В &amp;quot;custom_data&amp;quot; любого подходящего '''smart_terrain''', под секцией [smart_terrain], вписываем вызов респавна:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
respawn = имя респавнера&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
И респавн будет производиться, при каждом пополнении нпс, под данным смартом.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Авторы статьи. ==&lt;br /&gt;
[[Singapur22]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Pihan13]] (дополнил и переоформил)&lt;br /&gt;
&amp;lt;br&amp;gt;[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn</id>
		<title>SoC. Respawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn"/>
				<updated>2010-10-11T16:55:05Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Респаун, один из самых часто задаваемый вопросов на форумах. Вот, решил написать статью, дабы не втирать одно и тоже каждому, кто не может с этим разобраться.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn NPC. ==&lt;br /&gt;
&lt;br /&gt;
Для создания респавна NPC, понадобится два файла: '''all.spawn''' и '''spawn_section.ltx'''. &lt;br /&gt;
&amp;lt;br&amp;gt;Это минимальный набор. Для полной настройки респавнера, нужны ещё '''character_desc_simulation.xml''' и '''npc_profile.xml'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' В '''all.spawn''' создаём секцию респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты (x,y,z)&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 10&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 0&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если используется программа '''XrSpawner''', то копируем любую секцию &amp;quot;respawn&amp;quot;; меняем имя объекта, координаты, и в окошке &amp;quot;скрипт&amp;quot; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' id респавн-секций из файла '''spawn_section.ltx'''. Цифры после запятой, означают отношение одной секции к другой. Если планируется одинаковое колличество респавна из каждой секции, то цифры ставить не требуется.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' колличество респавн-запросов за период времени, пока ГГ находится на уровне. При переходе на другой уровень, счётчик '''max_count''' сбрасывается. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''min_count =''' минимальное колличество нпс, для экстренного респавна. (ставить не обязательно)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_spawn =''' колличество нпс за один цикл респавна.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Известно три типа '''medium, often, seldom'''. Обычно, используется тип '''medium'''.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions ='''Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''conditions = {+инфо} 100, 0''' где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;'''2.''' В файле '''spawn_section.ltx''', создаём респавн-секции:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[esc_urody_respawn_1]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_1&amp;quot;&lt;br /&gt;
character_profile = sim_urody_novice&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = bandit&lt;br /&gt;
&lt;br /&gt;
[esc_urody_respawn_2]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_2&amp;quot;&lt;br /&gt;
character_profile = sim_urody_regular&lt;br /&gt;
spec_rank = regular&lt;br /&gt;
community = bandit&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''esc_urody_respawn_1''' id респавн-секции.&lt;br /&gt;
&amp;lt;br&amp;gt;'''sim_urody_novice''' и '''sim_urody_regular''' классы профайлов нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''novice''' и '''regular''' ранги нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;'''bandit''' группировка нпс.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' В файле '''npc_profile.xml''' регистрируем классы '''sim_urody_regular''' и '''sim_urody_novice'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;sim_urody_regular&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_regular&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;character id=&amp;quot;sim_urody_novice&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_novice&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём профили, в файле '''character_desc_simulation.xml''', с классами '''sim_urody_regular''' и '''sim_urody_novice''' и группировкой '''bandit'''.&lt;br /&gt;
&lt;br /&gt;
== Respawn монстров. ==&lt;br /&gt;
&lt;br /&gt;
В принципе, респавн мутантов идентичен респавну нпс. Но с одним лишь отличием, которое его значительно упрощает.&lt;br /&gt;
Вся настройка респавна мутантов, ограничивается секцией в файле &amp;quot;all.spawn&amp;quot;.&lt;br /&gt;
Вписываем секцию респавнера, как указано в -'''RESPAWN NPC'''-.&lt;br /&gt;
Все настройки идентичны, кроме строки '''respawn_section = '''.&lt;br /&gt;
В ней прописываем типы мутантов, из файла &amp;quot;se_respawn.script&amp;quot;. Такие как '''flesh_weak, flesh_normal, dog_weak, boar_strong, и т.д.'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
'''ОБЩИЕ НАСТРОЙКИ.'''&lt;br /&gt;
&lt;br /&gt;
Обязательные условия респавна:&lt;br /&gt;
&lt;br /&gt;
'''1.''' На уровне обязательно должен быть хоть один гулаг для респавнящихся NPC и мутантов. Так как количество NPC для респавна, ориентируется по доступным местам в гулагах.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Респавн производится, только если под гулагами есть доступные работы.&lt;br /&gt;
&lt;br /&gt;
'''3.''' На каждом уровне, респавн ограничен определёнными типами неписей. Данные ограничения установлены в файле '''misc\smart_terrain_presets.ltx'''. Чтобы сделать возможным респавн неписей, не предусмотренных на данном уровне. Надо в секции нужного уровня, дописать требуемые типы неписей.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для проверки созданного респавнера, можно не ждать когда сработает системный респавн, а вызвать принудительно респавн в нужной секции. Для этого, прописываем в любой логике, вызов функции '''%=respawner_spawn(имя респавнера)%'''. Где, &amp;quot;имя респавнера&amp;quot; - имя секции, созданной в файле all.spawn. Скобки обязательны. &lt;br /&gt;
&lt;br /&gt;
Например, можно создать рядом с зоной респавнера, временный рестриктор. И в кастом дате рестриктора, прописать вызов функции принудительного вызова респавна, в нужном респавнере, при входе ГГ в зону рестриктора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[logic]&lt;br /&gt;
active = sr_idle@in&lt;br /&gt;
&lt;br /&gt;
[sr_idle@in]&lt;br /&gt;
on_actor_inside = %=respawner_spawn(имя респавнера)% sr_idle@out&lt;br /&gt;
&lt;br /&gt;
[sr_idle@out]&lt;br /&gt;
on_actor_outside = sr_idle@in&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция принудительного вызова респавна, находится в файле '''xr_effects.script'''.&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Respawn предметов. ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Респавн предметов в инвентарных ящиках, несколько отличается от способа респавна NPC.&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''1.''' Первое, что нам нужно сделать, это создать инвентарный ящик в файле &amp;quot;all.spawn&amp;quot;:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = inventory_box&lt;br /&gt;
name =  имя ящика&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffffba&lt;br /&gt;
&lt;br /&gt;
story_id = стори ай-ди ящика&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = equipments\item_box_01&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''2.''' Затем, в файле '''game_story_id.ltx''' регистрируем story_id ящика. (выбираем любое свободное число).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
'''3.''' Создаём респавнер в файле '''all.spawn'''. Координаты и размеры зоны респавнера, должны быть такими, чтоб инвентарный ящик поместился внутри зоны респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[10001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя_респавнера&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 2&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = список вещей респавна&lt;br /&gt;
idle_spawn = -1&lt;br /&gt;
parent = стори ай-ди ящика&lt;br /&gt;
item_spawn = true&lt;br /&gt;
max_count = 7&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 0.5,0,0   ;(ширина зоны респавнера, по X)&lt;br /&gt;
shape0:axis_y = 0,0.5,0   ;(высота зоны респавнера)&lt;br /&gt;
shape0:axis_z = 0,0,1     ;(ширина зоны респавнера, по Z)&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
&amp;lt;br&amp;gt;'''respawn_section =''' список вещей респавна, в виде их спавн - секций. Как и в респавнерах неписей, возможна прописка соотношений между вещами. &lt;br /&gt;
&amp;lt;br&amp;gt;Например: respawn_section = wpn_pm,2, vodka,2, medkit,1, energy_drink,2, ammo_9x18_fmj,3  &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''idle_spawn =''' тип спавна. Инвентарь не имеет типов спавна, поэтому ставится (-1).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''parent =''' Story_id инвентарного ящика (из game_story_id.ltx), в котором производить респавн вещей .&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''item_spawn =''' (true\false) возможность включения и отключения респавна. Можно задавать условия, например инфопоршнем или функцией (разумеется прописанной в xr_conditions.script).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;'''max_count =''' количество респав-циклов за определённый период времени. (Пока ГГ находится на уровне. После перехода ГГ на другой уровень, счётчик сбрасывается).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём вызов респавна. Обычно вызов производится из '''smart_terrain'''. В &amp;quot;custom_data&amp;quot; любого подходящего '''smart_terrain''', под секцией [smart_terrain], вписываем вызов респавна:&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
[smart_terrain]&lt;br /&gt;
respawn = имя респавнера&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
И респавн будет производиться, при каждом пополнении нпс, под данным смартом.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
-----------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
== Авторы статьи. ==&lt;br /&gt;
[[Singapur22]]&lt;br /&gt;
&amp;lt;br&amp;gt;[[Pihan13]] (дополнил и переоформил)&lt;br /&gt;
&amp;lt;br&amp;gt;[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B</id>
		<title>Классы</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B"/>
				<updated>2009-12-02T13:02:00Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;standart&amp;quot;&lt;br /&gt;
|+ Классы объектов используемых в Сталкере.&lt;br /&gt;
|-&lt;br /&gt;
|AMMO||Патроны&lt;br /&gt;
|-&lt;br /&gt;
|ARTEFACT||Артефакты (все, кроме артефактов электры)&lt;br /&gt;
|-&lt;br /&gt;
|A_OG7B||OG7B&lt;br /&gt;
|-&lt;br /&gt;
|A_VOG25||VOG25&lt;br /&gt;
|-&lt;br /&gt;
|A_M209||M209&lt;br /&gt;
|-&lt;br /&gt;
|AI_GRAPH||ai\graph point&lt;br /&gt;
|-&lt;br /&gt;
|AI_SPGRP||spawn_group_zone /spawn_group&lt;br /&gt;
|-&lt;br /&gt;
|AI_STL_S||m_stalker.ltx&lt;br /&gt;
|-&lt;br /&gt;
|AI_STL||[m_army_(боец)] [m_bandit_(боец)]&lt;br /&gt;
|-&lt;br /&gt;
|AI_CROW||Ворона&lt;br /&gt;
|-&lt;br /&gt;
|AI_DOG_R||[m_dog_e] (m_dog_.ltx)&lt;br /&gt;
|-&lt;br /&gt;
|AI_TRD_S||Торговец (Бывший класс AI_TRADE)&lt;br /&gt;
|-&lt;br /&gt;
|AI_PHANT||Фантомы монстров&lt;br /&gt;
|-&lt;br /&gt;
|AI_RAT_G||Группа крыс&lt;br /&gt;
|-&lt;br /&gt;
|AI_RAT||Крыса&lt;br /&gt;
|-&lt;br /&gt;
|C_HLCP_S||Вертолёт&lt;br /&gt;
|-&lt;br /&gt;
|D_PDA||КПК&lt;br /&gt;
|-&lt;br /&gt;
|D_SIMDET||Детекторы&lt;br /&gt;
|-&lt;br /&gt;
|E_STLK||equ_stalker Обмундирование людей(бывшие EQU_MLTR E_STLK)&lt;br /&gt;
|-&lt;br /&gt;
|EVENT||??tg_event&lt;br /&gt;
|-&lt;br /&gt;
|G_F1||Граната&lt;br /&gt;
|-&lt;br /&gt;
|G_RGD5||Граната&lt;br /&gt;
|-&lt;br /&gt;
|G_FAKE||Fake Missiles and Grenades_____Свойства CustomRocket&lt;br /&gt;
|-&lt;br /&gt;
|G_RPG7||Ракета вертолета (weapons\rpg_7\wpn_rpg_7_grenade.ogf)&lt;br /&gt;
|-&lt;br /&gt;
|II_BOLT||Болт&lt;br /&gt;
|-&lt;br /&gt;
|II_EXPLO||Взрывоопасные объекты — бочки, канистры и т. д.&lt;br /&gt;
|-&lt;br /&gt;
|II_DOC||item_document_01.ogf (Уникальное имя Documents)&lt;br /&gt;
|-&lt;br /&gt;
|II_ATTCH||Аттачибл объекты, рация и пр.&lt;br /&gt;
|-&lt;br /&gt;
|II_FOOD||Хавчик&lt;br /&gt;
|-&lt;br /&gt;
|II_BOTTL||Водка&lt;br /&gt;
|-&lt;br /&gt;
|II_ANTIR||Антирад&lt;br /&gt;
|-&lt;br /&gt;
|II_MEDKI||Аптечки&lt;br /&gt;
|-&lt;br /&gt;
|II_BANDG||Бинт&lt;br /&gt;
|-&lt;br /&gt;
|LVL_CHNG||level_changer&lt;br /&gt;
|-&lt;br /&gt;
|NW_ATTCH||custom_script_object (handradio было)&lt;br /&gt;
|-&lt;br /&gt;
|O_HLAMP||lights_hanging_lamp&lt;br /&gt;
|-&lt;br /&gt;
|O_PHYS_S||physic_object&lt;br /&gt;
|-&lt;br /&gt;
|O_SEARCH||search_light&lt;br /&gt;
|-&lt;br /&gt;
|O_BRKBL||breakable_object&lt;br /&gt;
|-&lt;br /&gt;
|O_ACTOR||actor&lt;br /&gt;
|-&lt;br /&gt;
|O_INVBOX||devices\inventory box&lt;br /&gt;
|-&lt;br /&gt;
|O_SWITCH||trigger&lt;br /&gt;
|-&lt;br /&gt;
|C_HLCP_S helicopter&lt;br /&gt;
|-&lt;br /&gt;
|P_DSTRBL||physic_destroyable_object&lt;br /&gt;
|-&lt;br /&gt;
|P_SKELET||ph_skeleton_object&lt;br /&gt;
|-&lt;br /&gt;
|RE_SPAWN||ai\respawn&lt;br /&gt;
|-&lt;br /&gt;
|SCRPTART||Артефакты электры &lt;br /&gt;
|-&lt;br /&gt;
|SPECT||spectator&lt;br /&gt;
|-&lt;br /&gt;
|SMRTTRRN||smart_terrain&lt;br /&gt;
|-&lt;br /&gt;
|SCRPTCAR||m_car&lt;br /&gt;
|-&lt;br /&gt;
|SCRIPTZN||script_zone&lt;br /&gt;
|-&lt;br /&gt;
|SCRPTOBJ||script_object&lt;br /&gt;
|-&lt;br /&gt;
|SM_BLOOD||Кровосос&lt;br /&gt;
|-&lt;br /&gt;
|SM_BOARW||Кабан&lt;br /&gt;
|-&lt;br /&gt;
|SM_BURER||Бюрер&lt;br /&gt;
|-&lt;br /&gt;
|SM_CAT_S||Кошка&lt;br /&gt;
|-&lt;br /&gt;
|SM_CHIMS||Химера&lt;br /&gt;
|-&lt;br /&gt;
|SM_CONTR||Контролер&lt;br /&gt;
|-&lt;br /&gt;
|SM_DOG_S||Сепой пес&lt;br /&gt;
|-&lt;br /&gt;
|SM_FLESH||Плоть&lt;br /&gt;
|-&lt;br /&gt;
|SM_IZLOM||[m_fracture_e] (по идее излом)&lt;br /&gt;
|-&lt;br /&gt;
|SM_GIANT||Псевдогигант&lt;br /&gt;
|-&lt;br /&gt;
|SM_POLTR||Полтергейст&lt;br /&gt;
|-&lt;br /&gt;
|SM_P_DOG||Псевдособака(Собака чернобыля)&lt;br /&gt;
|-&lt;br /&gt;
|SM_SNORK||Снорк&lt;br /&gt;
|-&lt;br /&gt;
|SM_TUSHK||Тушканчик (бывший AI_TUSH)&lt;br /&gt;
|-&lt;br /&gt;
|SM_ZOMBI||Зомби&lt;br /&gt;
|-&lt;br /&gt;
|SPC_RS_S||ai\space_restrictor&lt;br /&gt;
|-&lt;br /&gt;
|TORCH_S||device_torch&lt;br /&gt;
|-&lt;br /&gt;
|W_MOUNTD||wpn_pkm_trenoga.ogf&lt;br /&gt;
|-&lt;br /&gt;
|W_SILENC||wpn_addon_silencer&lt;br /&gt;
|-&lt;br /&gt;
|W_GLAUNC||wpn_addon_grenade_launcher&lt;br /&gt;
|-&lt;br /&gt;
|WP_WALTH||Вальтер&lt;br /&gt;
|-&lt;br /&gt;
|WP_VINT||Винторез&lt;br /&gt;
|-&lt;br /&gt;
|WP_VAL||ВАЛ&lt;br /&gt;
|-&lt;br /&gt;
|WP_USP45||usp45&lt;br /&gt;
|-&lt;br /&gt;
|WP_SVU||СВУ&lt;br /&gt;
|-&lt;br /&gt;
|WP_SHOTG||Дробовики&lt;br /&gt;
|-&lt;br /&gt;
|WP_RPG7||РПГ7&lt;br /&gt;
|-&lt;br /&gt;
|WP_RG6||РГ6&lt;br /&gt;
|-&lt;br /&gt;
|WP_PM||ПМ&lt;br /&gt;
|-&lt;br /&gt;
|WP_KNIFE||Нож&lt;br /&gt;
|-&lt;br /&gt;
|WP_HPSA||HPSA&lt;br /&gt;
|-&lt;br /&gt;
|WP_SVD||СВД&lt;br /&gt;
|-&lt;br /&gt;
|WP_GROZA||Гроза&lt;br /&gt;
|-&lt;br /&gt;
|WP_BM16||ВМ16&lt;br /&gt;
|-&lt;br /&gt;
|WP_BINOC||Бинокль&lt;br /&gt;
|-&lt;br /&gt;
|WP_LR300||LR300&lt;br /&gt;
|-&lt;br /&gt;
|WP_AK74||АК74&lt;br /&gt;
|-&lt;br /&gt;
|WP_SCOPE||Опт. Прицел&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standart&amp;quot;&lt;br /&gt;
|+ Аномалии и их классы&lt;br /&gt;
|Z_TEAMBS||zone_team_base&lt;br /&gt;
|-&lt;br /&gt;
|Z_MINCER||&lt;br /&gt;
|-&lt;br /&gt;
|Z_GALANT||&lt;br /&gt;
|-&lt;br /&gt;
|Z_AMEBA||[zone_ameba]&lt;br /&gt;
|-&lt;br /&gt;
|Z_RADIO||[zone_monolith] [zone_radioactive]&lt;br /&gt;
|-&lt;br /&gt;
|Z_NOGRAV||[zone_no_gravity]&lt;br /&gt;
|-&lt;br /&gt;
|Z_MBALD||[zone_campfire_mp_nolight] [zone_campfire_grill] [zone_flame] [zone_zhar] [zone_emi] [zone_flame_small] &lt;br /&gt;
[zone_mine_field] [zone_death] [zone_sarcofag] [zone_teleport] [zone_teleport_out]&lt;br /&gt;
|-&lt;br /&gt;
|Z_RUSTYH||[zone_rusty_hair]&lt;br /&gt;
|-&lt;br /&gt;
|Z_ZONE||[zone_teleport_monolith]&lt;br /&gt;
|-&lt;br /&gt;
|Z_TORRID||[torrid_zone] [fireball_zone]&lt;br /&gt;
|-&lt;br /&gt;
|ZS_MINCE||[zone_mincer] (статическая)&lt;br /&gt;
|-&lt;br /&gt;
|ZS_GALAN||[zone_gravi_zone] (статическая)&lt;br /&gt;
|-&lt;br /&gt;
|ZS_MBALD||[zone_buzz] [zone_mosquito_bald] [zone_witches_galantine] [zone_zharka_static] (статическая)&lt;br /&gt;
|-&lt;br /&gt;
|ZS_BFUZZ||[zone_burning_fuzz] (статическая)&lt;br /&gt;
|}&lt;br /&gt;
[[Категория:Справочники]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

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

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>SoC. Переход NPC в offline-online через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-07-06T13:54:22Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На многих форумах, часто задают такой вопрос '''&amp;quot;Как перевести нпс в offline, а затем в online, через скрипт?&amp;quot;'''. Но вразумительного ответа, так нигде и не дают. Перечисляют множество возможных операторов перевода, но при этом сами не уверены, работают они или нет. Просмотрев уже существующие скрипты, нашёл нужные операторы перевода мобов в '''offline-online'''.&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Итак. Вот сами операторы перевода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():set_switch_offline (id, value)&lt;br /&gt;
alife():set_switch_online (id, value)&lt;br /&gt;
alife():set_interactive (id, value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор '''set_interactive''', я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;big&amp;gt;'''Перевод в offline:'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, у нас есть уникальный нпс, которого нужно перевести в '''offline'''. Первое, что нам нужно сделать, это определить его '''id'''. Не '''sid''' из файла '''game_story_ids.ltx''', а '''id''' объекта. Некоторые причисляют их к одному и тому же параметру. Хотя это не так. '''Sid''' -это принудительно-зарегистрированный ключ инициализации объекта, для управления объектом в не зависимости от того, где он находится. '''Id''' -это порядковый номер объекта, который задаётся автоматически, при спавне.&lt;br /&gt;
Определение '''id''' может быть разнообразным. Всё зависит от ситуации и откуда наша функция будет вызываться. Но в любом случае, определение '''id''' объекта производится через его '''userdata'''.&lt;br /&gt;
Если наша функция будет вызываться из логики нпс, то '''userdata''' объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name(actor, npc)&lt;br /&gt;
...&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, '''actor''' и '''npc''' -переменные содержащие '''userdata''' актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит '''userdata актора''', а вторая '''userdata непися'''. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования.&lt;br /&gt;
Чтобы в данной ситуации определить его '''id''', не потребуется писать никаких действий, достаточно прописать определение '''id''' объекта, в том месте, где должно прописываться его '''id''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;npc:id()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в '''offline''', нам понадобится его '''sid''', через который мы и определим его '''userdata'''. Есть два способа определения '''userdata''' через '''sid'''. Первый способ, это определение через функцию '''level_object_by_sid()''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local npc = level_object_by_sid( sid объекта )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Второй способ, это определение через '''alife()''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local npc = alife():story_object( sid объекта )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в '''online'''. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре.&lt;br /&gt;
Предпочтительно конечно использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от '''error''', когда нпс будет и так находиться в '''offline'''.&lt;br /&gt;
Но у второго способа есть одно отличие от стандарта. '''Id''' объекта придётся определять не через функцию '''id()''', а через его переменную '''id''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;npc.id&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак. Вроде как определились с данными '''id'''. Теперь создадим саму функцию перевода нпс в '''offline'''.&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из логики нпс:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name(actor, npc)&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc:id(), true)&lt;br /&gt;
alife():set_switch_online (npc:id(), false)&lt;br /&gt;
alife():set_interactive (npc:id(), false)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name()&lt;br /&gt;
&lt;br /&gt;
local npc = alife():story_object( sid объекта )&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc.id, true)&lt;br /&gt;
alife():set_switch_online (npc.id, false)&lt;br /&gt;
alife():set_interactive (npc.id, false)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;big&amp;gt;'''Перевод в online:'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для перевода в '''online''', действуют те же условия. С некоторыми отличиями. Первый способ определения '''userdata''' через '''sid''', не допустим. Так как данный оператор действителен, только если объект находится в '''online'''. В любом другом случае, он выдаст ошибку.&lt;br /&gt;
И конечно же, когда нпс находится в '''offline''', логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.&lt;br /&gt;
&lt;br /&gt;
Итак, функция перевода нпс в '''online''':&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из другого скрипта,(если userdata не определена):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name()&lt;br /&gt;
&lt;br /&gt;
local npc = alife():story_object( sid объекта )&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc.id, false)&lt;br /&gt;
alife():set_switch_online (npc.id, true)&lt;br /&gt;
alife():set_interactive (npc.id, true)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Переводы в offline и в online производится не зависимо от того, где находится актор, хоть нос к носу с переводимым нпс.&lt;br /&gt;
Есть одно ограничение. Если в логике нпс, хоть где-то указано постоянное нахождение в '''online''', то перевод его в '''offline''' будет не возможен, пока данное указание не будет снято.&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Автор статьи &amp;lt;big&amp;gt;'''Singapur22'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: скрипты ]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82</id>
		<title>SoC. Переход NPC в offline-online через скрипт</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82"/>
				<updated>2009-07-06T13:51:37Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На многих форумах, часто задают такой вопрос '''&amp;quot;Как перевести нпс в offline, а затем в online, через скрипт?&amp;quot;'''. Но вразумительного ответа, так нигде и не дают. Перечисляют множество возможных операторов перевода, но при этом сами не уверены, работают они или нет. Просмотрев уже существующие скрипты, нашёл нужные операторы перевода мобов в '''offline-online'''.&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Итак. Вот сами операторы перевода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alife():set_switch_offline (id, value)&lt;br /&gt;
alife():set_switch_online (id, value)&lt;br /&gt;
alife():set_interactive (id, value)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Есть условие их использования. Данные операторы должны использоваться только вместе. Правда зачем нужен оператор '''set_interactive''', я не в курсе. Вроде и без него работает. Но в оригинальных скриптах он везде используется, поэтому я его не стал исключать.&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;big&amp;gt;'''Перевод в offline:'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Например, у нас есть уникальный нпс, которого нужно перевести в '''offline'''. Первое, что нам нужно сделать, это определить его '''id'''. Не '''sid''' из файла '''game_story_ids.ltx''', а '''id''' объекта. Некоторые причисляют их к одному и тому же параметру. Хотя это не так. '''Sid''' -это принудительно-зарегистрированный ключ инициализации объекта, для управления объектом в не зависимости от того, где он находится. '''Id''' -это порядковый номер объекта, который задаётся автоматически, при спавне.&lt;br /&gt;
Определение '''id''' может быть разнообразным. Всё зависит от ситуации и откуда наша функция будет вызываться. Но в любом случае, определение '''id''' объекта производится через его '''userdata'''.&lt;br /&gt;
Если наша функция будет вызываться из логики нпс, то '''userdata''' объекта будет передаваться в функцию автоматически. Главное правильно задать переменную в скобках наименования функции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name(actor, npc)&lt;br /&gt;
...&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, '''actor''' и '''npc''' -переменные содержащие '''userdata''' актора и непися, с логики которого данная функция вызывается, соответственно. Нужно всегда помнить, что в данной ситуации, первая переменная содержит '''userdata актора''', а вторая '''userdata непися'''. При этом, наименования переменных могут быть произвольными. Главное соблюдать порядок наименования.&lt;br /&gt;
Чтобы в данной ситуации определить его '''id''', не потребуется писать никаких действий, достаточно прописать определение '''id''' объекта, в том месте, где должно прописываться его '''id''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;npc:id()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если наша функция будет вызываться не из логики, а например из скрипта, где при определённых условиях, определённый непись будет переводиться в '''offline''', нам понадобится его '''sid''', через который мы и определим его '''userdata'''. Есть два способа определения '''userdata''' через '''sid'''. Первый способ, это определение через функцию '''level_object_by_sid()''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local npc = level_object_by_sid( sid объекта )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Второй способ, это определение через '''alife()''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local npc = alife():story_object( sid объекта )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При этом, первый способ срабатывает значительно быстрее, так как поиск объекта производится из списка объектов, находящихся в '''online'''. А, второй способ производит поиск объекта из списка всех объектов находящихся в игре.&lt;br /&gt;
Предпочтительно конечно использовать второй способ, так как при первом способе придётся писать дополнительные действия, для защиты от '''error''', когда нпс будет и так находиться в '''offline'''.&lt;br /&gt;
Но у второго способа есть одно отличие от стандарта. '''Id''' объекта придётся определять не через функцию '''id()''', а через его переменную '''id''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;npc.id&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак. Вроде как определились с данными '''id'''. Теперь создадим саму функцию перевода нпс в '''offline'''.&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из логики нпс:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name(actor, npc)&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc:id(), true)&lt;br /&gt;
alife():set_switch_online (npc:id(), false)&lt;br /&gt;
alife():set_interactive (npc:id(), false)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из другого скрипта, будет выглядеть так (если userdata не определена)''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name()&lt;br /&gt;
&lt;br /&gt;
local npc = alife():story_object( sid объекта )&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc.id, true)&lt;br /&gt;
alife():set_switch_online (npc.id, false)&lt;br /&gt;
alife():set_interactive (npc.id, false)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;big&amp;gt;'''Перевод в online:'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для перевода в '''online''', действуют те же условия. С некоторыми отличиями. Первый способ определения '''userdata''' через '''sid''', не допустим. Так как данный оператор действителен, только если объект находится в '''online'''. В любом другом случае, он выдаст ошибку.&lt;br /&gt;
И конечно же, когда нпс находится в '''offline''', логика на него не может быть воздействована, поэтому остаётся только вызов функции из другого скрипта.&lt;br /&gt;
&lt;br /&gt;
Итак, функция перевода нпс в '''online''':&lt;br /&gt;
&lt;br /&gt;
'''Для вызова функции из другого скрипта,(если userdata не определена):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function name()&lt;br /&gt;
&lt;br /&gt;
local npc = alife():story_object( sid объекта )&lt;br /&gt;
&lt;br /&gt;
if npc then&lt;br /&gt;
&lt;br /&gt;
alife():set_switch_offline (npc.id, false)&lt;br /&gt;
alife():set_switch_online (npc.id, true)&lt;br /&gt;
alife():set_interactive (npc.id, true)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Переводы в offline и в online производится не зависимо от того, где находится актор, хоть нос к носу с переводимым нпс.&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Автор статьи &amp;lt;big&amp;gt;'''Singapur22'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: скрипты ]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-07-05T06:37:41Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и sid объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol2&lt;br /&gt;
local  kol1 = 1&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) объект(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) объект(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по объектам). Где, при каждом цикле выбирается случайный объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. &lt;br /&gt;
Строку можно не указывать, если спавнится один объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных объектов и(или) возможных наборов объектов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы объектов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого объекта, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора объектов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --объект спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список объектов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных объектов и наборов объектов&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла '''spawn_sections.ltx''' --для спавна нпс. Или имена типов мутантов из файла '''se_respawn.script''' --для спавна мутантов.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F%D0%BC%D0%B8</id>
		<title>SoC. Спавн точек перехода между уровнями</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F%D0%BC%D0%B8"/>
				<updated>2009-07-04T15:56:31Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: Исправлено не правильное положение gv и lv координат, куда перебрасывать.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье я попытаюсь передать практический опыт скриптового создания точек перехода между уровнями. Файл ''all.spawn'' меняться не будет, поэтому такой механизм более удобен для совмещения модов и не требует начала новой игры.&lt;br /&gt;
&lt;br /&gt;
В качестве примера попробуем реализовать режим ''freeplay'' - продолжение игры после уничтожения О-Сознания. Для этого нужно создать как минимум две точки — возврат на ЧАЭС-1 со внутреннего дворика (после уничтожения О-Сознания) и переход из ЧАЭС-1 в Припять. К слову сказать, если вернуться на ЧАЭС-1, то там будет продолжать действовать таймер &amp;quot;выброса&amp;quot;, который в конце-концов включит &amp;quot;deadzone&amp;quot;. Отключить счетчик мне пока не удалось, но зато можно легко отключить сам &amp;quot;выброс&amp;quot; и всласть побегать по уровню.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Часть 1. Генерация работающего LEVEL_CHANGER ==&lt;br /&gt;
&lt;br /&gt;
Стандартной функции alife():create(…) недостаточно для создания полноценного level_changer. Собственно методика создания сложных объектов описана в статье [[Один из методов спавна]]. Сложность заключалась лишь в порядке полей и свойствах Shape. Неоценимую помощь в этом вопросе оказала утилита ACDC (created by bardak).&lt;br /&gt;
&lt;br /&gt;
Ниже я привожу код функции, которая создает и инициализирует level_changer:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function create_level_changer(&lt;br /&gt;
	p_story_id,	-- STORY_ID нового level_changer (понадобится нам позже)&lt;br /&gt;
	p_position,	-- вектор, координаты точки, в которой будет располагаться центр нового level_changer&lt;br /&gt;
	p_lvertex_id,	-- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer&lt;br /&gt;
	p_gvertex_id,	-- game_vertext_id   	&lt;br /&gt;
&lt;br /&gt;
	p_dest_lv,	-- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока &lt;br /&gt;
	p_dest_gv,	-- game_vertex_id&lt;br /&gt;
	p_dest_pos,	-- координаты точки, в которой на новом уровне окажется игрок&lt;br /&gt;
	p_dest_dir,	-- направрение взгляда игрока&lt;br /&gt;
	p_dest_level,	-- название уровня, например &amp;quot;L11_Pripyat&amp;quot;&lt;br /&gt;
	p_silent	-- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)&lt;br /&gt;
)&lt;br /&gt;
	local obj = alife():create(&amp;quot;level_changer&amp;quot;, p_position, p_lvertex_id, p_gvertex_id)&lt;br /&gt;
&lt;br /&gt;
	level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_object&lt;br /&gt;
	local game_vertex_id 			= packet:r_u16()&lt;br /&gt;
	local cse_alife_object__unk1_f32 	= packet:r_float()&lt;br /&gt;
	local cse_alife_object__unk2_u32 	= packet:r_u32()&lt;br /&gt;
	local level_vertex_id 			= packet:r_u32()&lt;br /&gt;
	local object_flags 			= packet:r_u32()&lt;br /&gt;
	local custom_data 			= packet:r_stringZ()&lt;br /&gt;
	local story_id 				= packet:r_u32()&lt;br /&gt;
	local spawn_story_id			= packet:r_u32()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	local shape_count 			= packet:r_u8()&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type 		= packet:r_u8()&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			local center 		= packet:r_vec3()&lt;br /&gt;
			local radius 		= packet:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			local axis_x_x = packet:r_float()&lt;br /&gt;
			local axis_x_y = packet:r_float()&lt;br /&gt;
			local axis_x_z = packet:r_float()&lt;br /&gt;
			local axis_y_x = packet:r_float()&lt;br /&gt;
			local axis_y_y = packet:r_float()&lt;br /&gt;
			local axis_y_z = packet:r_float()&lt;br /&gt;
			local axis_z_x = packet:r_float()&lt;br /&gt;
			local axis_z_y = packet:r_float()&lt;br /&gt;
			local axis_z_z = packet:r_float()&lt;br /&gt;
			local offset_x = packet:r_float()&lt;br /&gt;
			local offset_y = packet:r_float()&lt;br /&gt;
			local offset_z = packet:r_float()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_space_restrictor&lt;br /&gt;
	local restrictor_type 			= packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_level_changer&lt;br /&gt;
	local dest_game_vertex_id		= packet:r_u16()  &lt;br /&gt;
	local dest_level_vertex_id 		= packet:r_u32()  &lt;br /&gt;
	local dest_position 			= packet:r_vec3()&lt;br /&gt;
	local dest_direction 			= packet:r_vec3()&lt;br /&gt;
	local dest_level_name 			= packet:r_stringZ()&lt;br /&gt;
	local dest_graph_point 			= packet:r_stringZ()&lt;br /&gt;
	local silent_mode 			= packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	packet:w_begin(game_vertex_id)			-- game_vertex_id&lt;br /&gt;
	packet:w_float(cse_alife_object__unk1_f32)&lt;br /&gt;
	packet:w_u32(cse_alife_object__unk2_u32) &lt;br /&gt;
	packet:w_u32(level_vertex_id)			-- level_vertex_id&lt;br /&gt;
	packet:w_u32( bit_not(193) )			-- object_flags = -193 = 0xFFFFFF3E&lt;br /&gt;
	packet:w_stringZ(custom_data)&lt;br /&gt;
	packet:w_u32(p_story_id)			-- story_id&lt;br /&gt;
	packet:w_u32(spawn_story_id)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(1)			-- количество фигур&lt;br /&gt;
--		packet:w_u8(0)			-- тип фигуры: сфера&lt;br /&gt;
--		packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center&lt;br /&gt;
--		packet:w_float(3.0)&lt;br /&gt;
	packet:w_u8(1)			-- тип фигуры: box&lt;br /&gt;
	packet:w_float(2)	   -- axis_x_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_x&lt;br /&gt;
	packet:w_float(4)	   -- axis_y_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_y&lt;br /&gt;
	packet:w_float(4)	   -- axis_z_z&lt;br /&gt;
	packet:w_float(0)	   -- offset_x&lt;br /&gt;
	packet:w_float(0)	   -- offset_y&lt;br /&gt;
	packet:w_float(0)          -- offset_z&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(3)	 	   -- restrictor_type&lt;br /&gt;
&lt;br /&gt;
	packet:w_u16(p_dest_gv)			-- destination game_vertex_id&lt;br /&gt;
	packet:w_u32(p_dest_lv)			-- destination level_vertex_id&lt;br /&gt;
	packet:w_vec3(p_dest_pos)		-- destination position&lt;br /&gt;
	packet:w_vec3(p_dest_dir)		-- destination direction (направление взгляда)&lt;br /&gt;
	packet:w_stringZ(p_dest_level)		-- destination level name&lt;br /&gt;
	packet:w_stringZ(&amp;quot;start_actor_99&amp;quot;)	-- some string, always const&lt;br /&gt;
	packet:w_u8(p_silent)			-- 1 for silent level changing&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
&lt;br /&gt;
--	news_manager.send_tip(db.actor, &amp;quot;LC creation finished&amp;quot;, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Для shape типа &amp;quot;box&amp;quot; загрузка координат методом packet:r_matrix() окончилась неудачей. Я подозреваю, что не был прочитан вектор &amp;quot;offset&amp;quot;, но точной уверенности нет, поэтому пока остановился на покомпонентной выборке и сохранении координат.''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Часть 2. '''Создание точек перехода''' ==&lt;br /&gt;
&lt;br /&gt;
Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function exit_monolit()&lt;br /&gt;
	if (not has_alife_info(&amp;quot;freeplay_activated1&amp;quot;)) then&lt;br /&gt;
		create_level_changer(11410, vector():set(-13.26, 47.71, 46.57), 200, 2417,&lt;br /&gt;
			162109,&lt;br /&gt;
                        2384,&lt;br /&gt;
			vector():set( 375.615, 0.224, 27.737 ),&lt;br /&gt;
			vector():set(     0.0, 0.0  ,  0.0 ),&lt;br /&gt;
			&amp;quot;L12_Stancia&amp;quot;,&lt;br /&gt;
			1)&lt;br /&gt;
	&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;freeplay_activated1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	create_chaes2pripyat_exit()&lt;br /&gt;
&lt;br /&gt;
	-- актер перебрасывается в level_changer, возвращающий его на ЧАЭС, ко входу в бункер&lt;br /&gt;
	db.actor:set_actor_position( vector():set(-13.26, 47.71, 46.57) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function refuze_o_sozn()&lt;br /&gt;
	if (not has_alife_info(&amp;quot;freeplay_activated2&amp;quot;)) then&lt;br /&gt;
		create_level_changer(21410, vector():set(946.872, 6.0, 167.66), 240852, 2637,&lt;br /&gt;
			472710,&lt;br /&gt;
			2280,&lt;br /&gt;
			vector():set( 1062.15, -0.0982, -3.512 ),&lt;br /&gt;
			vector():set(    0.0 ,  0.0   , -1.0 ),&lt;br /&gt;
			&amp;quot;L12_Stancia&amp;quot;,&lt;br /&gt;
			1)&lt;br /&gt;
	&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;freeplay_activated2&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	create_chaes2pripyat_exit()&lt;br /&gt;
&lt;br /&gt;
	-- актер перебрасывается в level_changer, возвращающий его к правым воротам ЧАЭС&lt;br /&gt;
	db.actor:set_actor_position( vector():set(946.872, 6.0, 167.66) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function create_chaes2pripyat_exit()&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	if (not has_alife_info(	&amp;quot;exit_chaes2pripyat_created&amp;quot; )) then&lt;br /&gt;
		create_level_changer(31410, vector():set( 917.35, 0.419, -316.35 ), 403866, 2401,&lt;br /&gt;
			73868,&lt;br /&gt;
			2117,&lt;br /&gt;
			vector():set( 31.3, 3.0, 240.0 ),&lt;br /&gt;
			vector():set(  0.0, 0.0,  -1.0 ),&lt;br /&gt;
			&amp;quot;L11_Pripyat&amp;quot;,&lt;br /&gt;
			0)&lt;br /&gt;
&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;exit_chaes2pripyat_created&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Функцию '''exit_monolit''' я создал исключительно для тестирования, но решил оставить и тут. Вдруг кто-то захочет реализовать более сложный возврат: Меченого грузят в &amp;quot;грузовик смерти&amp;quot; и он снова приходит в себя на кордоне...''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция '''exit_monolit''' создает «тихий» переход на уровень ЧАЭС-1 и обычный - в начале уровня ЧАЭС-1 для возврата в Припять, после чего перебрасывает актера прямо внутрь созданного перехода. Функция '''refuze_o_sozn''' делает тоже самое, только игрок появляется перед воротами в правом верхем углу карты (мне кажется, что так более логично). Все телепорты защищаются уникальными info_portions, дабы избежать их повторного создания, ведь игрок может захотеть «закончить» игру несколько раз.&lt;br /&gt;
&lt;br /&gt;
Теперь подключение.&lt;br /&gt;
Во-первых надо добавить новые info-portions. Я решил не изменять оригинальные файлы игры, а сделал для них (ну и для других тоже) отдельный файл&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		config\gameplay\_info_sa.xml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
следующего вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;game_information_portions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay_activated1&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay_activated2&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;exit_chaes2pripyat_created&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/game_information_portions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь в этот файл можно будет добавлять новые info_portion, которые вы будете использовать в своих сюжетах.&lt;br /&gt;
Подключается этот файл в system.ltx в секции «info_portions»:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[info_portions]&lt;br /&gt;
;список xml файлов, содержащих info_portions&lt;br /&gt;
files = _info_sa, info_portions, ....................&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Кстати, именно так я рекомендую добавлять новые диалоги и новых персонажей. Это упростит процессы совмещения модов и аддонов.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующий шаг - подключение наших скриптов к игре. Для этого откройте файл &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		config\ui\ui_movies.xml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
найдите элементы «''mov_desire_''» (их пять, по количеству ложных концовок игры - все варианты общения с Монолитом). Внутри каждого элемента есть дочерние элементы «''function_on_stop''», которые задают функцию, запускающуюся сразу после ролика. Стандартное содержимое:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Функция '''xr_effects.game_credits''' запускает финальные титры. Именно ее и нужно заменить на вызов нашей функции _freeplay_sa.exit_monolit. Вот что должно получиться:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;_freeplay_sa.exit_monolit&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;!-- original:	&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;  --&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Старый элемент я советую не удалять, а закомментировать.''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чуть ниже «''mov_desire_5''» находится тэг ролика для концовки «Присоединение к О-Сознанию». Его мы трогать не будем - Меченый станет медузой. А вот после него - тэг для ролика «Отказ от О-Сознания»: «''mov_refuse_osoznanie''». Функцию завершения в нем заменим следующим образом:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;_freeplay_sa.refuze_o_sozn&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;!-- original:	&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;  --&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Можно запускать и, если есть сохранения перед монолитом и/или о-сознанием, тестировать. Первые переходы срабатывают «тихо» - запрос на смену уровня не выдается (в параметре p_silent задана 1). До перехода в Припять можно успеть добежать, пока не сработал выброс... Но это как-то неправильно, выброс надо остановить (он же произошел, пока мы были внутри станции). «По-честному» (скриптом, без модификации ''all.spawn'') таймер выброса отключить не получится, но зато выброс можно подавить небольшим «хаком». Найдите файл xr_logic.script, а в нем - функцию '''switch_to_section'''. Ее нужно модифицировать следующим образом:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- Выполняет переключение на указанную секцию, если задана.&lt;br /&gt;
-- Если section == nil, остается работать старая секция.&lt;br /&gt;
function switch_to_section(npc, st, section)&lt;br /&gt;
  if section == nil or section == &amp;quot;&amp;quot; then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- 15.03.2008 by SA:&lt;br /&gt;
  -- отключает &amp;quot;смертельные зоны&amp;quot; на ЧАЭС после запуска режима FREEPLAY&lt;br /&gt;
  -- 	таймер не отключается, но сам &amp;quot;выброс&amp;quot; не происходит&lt;br /&gt;
  if (section == &amp;quot;sr_aes_deadzone&amp;quot;) then&lt;br /&gt;
	if (has_alife_info(&amp;quot;freeplay_activated1&amp;quot;) or has_alife_info(&amp;quot;freeplay_activated2&amp;quot;)) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  ... далее без изменений ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный способ оставляет висящий на нулях таймер и все эффекты начала выброса, но сам «''выброс''» отключается.&lt;br /&gt;
&lt;br /&gt;
И последнее: переход ЧАЭС1-Припять необходимо отметить на карте. Для этого существует вполне «легальный» механизм. Находим файл '''level_tasks.script''' и в конце функции '''add_lchanger_location''' дописываем следующее:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		-- aes (++16.03.2008 by SA):&lt;br /&gt;
		obj = sim:story_object(31410)&lt;br /&gt;
		if obj then&lt;br /&gt;
			level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;To Pripyat&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь 31410 - story_id нашего level_changer, который создается нашей функцией '''create_chaes2pripyat_exit'''.&lt;br /&gt;
&lt;br /&gt;
На этом пока все (мелкие огрехи типа направления взгляда игрока после смены уровня исправлю позже).&lt;br /&gt;
Прошу тестировать и дополнять.&lt;br /&gt;
&lt;br /&gt;
С уважением, sarthur.&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F%D0%BC%D0%B8</id>
		<title>SoC. Спавн точек перехода между уровнями</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BF%D0%B0%D0%B2%D0%BD_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F%D0%BC%D0%B8"/>
				<updated>2009-07-04T15:46:52Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: исправлена ошибка в функции create_level_changer, Из-за которой переброс производился, всё время на Кордон.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В этой статье я попытаюсь передать практический опыт скриптового создания точек перехода между уровнями. Файл ''all.spawn'' меняться не будет, поэтому такой механизм более удобен для совмещения модов и не требует начала новой игры.&lt;br /&gt;
&lt;br /&gt;
В качестве примера попробуем реализовать режим ''freeplay'' - продолжение игры после уничтожения О-Сознания. Для этого нужно создать как минимум две точки — возврат на ЧАЭС-1 со внутреннего дворика (после уничтожения О-Сознания) и переход из ЧАЭС-1 в Припять. К слову сказать, если вернуться на ЧАЭС-1, то там будет продолжать действовать таймер &amp;quot;выброса&amp;quot;, который в конце-концов включит &amp;quot;deadzone&amp;quot;. Отключить счетчик мне пока не удалось, но зато можно легко отключить сам &amp;quot;выброс&amp;quot; и всласть побегать по уровню.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Часть 1. Генерация работающего LEVEL_CHANGER ==&lt;br /&gt;
&lt;br /&gt;
Стандартной функции alife():create(…) недостаточно для создания полноценного level_changer. Собственно методика создания сложных объектов описана в статье [[Один из методов спавна]]. Сложность заключалась лишь в порядке полей и свойствах Shape. Неоценимую помощь в этом вопросе оказала утилита ACDC (created by bardak).&lt;br /&gt;
&lt;br /&gt;
Ниже я привожу код функции, которая создает и инициализирует level_changer:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function create_level_changer(&lt;br /&gt;
	p_story_id,	-- STORY_ID нового level_changer (понадобится нам позже)&lt;br /&gt;
	p_position,	-- вектор, координаты точки, в которой будет располагаться центр нового level_changer&lt;br /&gt;
	p_lvertex_id,	-- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer&lt;br /&gt;
	p_gvertex_id,	-- game_vertext_id   	&lt;br /&gt;
&lt;br /&gt;
	p_dest_lv,	-- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока &lt;br /&gt;
	p_dest_gv,	-- game_vertex_id&lt;br /&gt;
	p_dest_pos,	-- координаты точки, в которой на новом уровне окажется игрок&lt;br /&gt;
	p_dest_dir,	-- направрение взгляда игрока&lt;br /&gt;
	p_dest_level,	-- название уровня, например &amp;quot;L11_Pripyat&amp;quot;&lt;br /&gt;
	p_silent	-- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)&lt;br /&gt;
)&lt;br /&gt;
	local obj = alife():create(&amp;quot;level_changer&amp;quot;, p_position, p_lvertex_id, p_gvertex_id)&lt;br /&gt;
&lt;br /&gt;
	level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
	obj:STATE_Write(packet)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_object&lt;br /&gt;
	local game_vertex_id 			= packet:r_u16()&lt;br /&gt;
	local cse_alife_object__unk1_f32 	= packet:r_float()&lt;br /&gt;
	local cse_alife_object__unk2_u32 	= packet:r_u32()&lt;br /&gt;
	local level_vertex_id 			= packet:r_u32()&lt;br /&gt;
	local object_flags 			= packet:r_u32()&lt;br /&gt;
	local custom_data 			= packet:r_stringZ()&lt;br /&gt;
	local story_id 				= packet:r_u32()&lt;br /&gt;
	local spawn_story_id			= packet:r_u32()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	local shape_count 			= packet:r_u8()&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		local shape_type 		= packet:r_u8()&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			-- sphere&lt;br /&gt;
			local center 		= packet:r_vec3()&lt;br /&gt;
			local radius 		= packet:r_float()&lt;br /&gt;
		else&lt;br /&gt;
			-- box&lt;br /&gt;
			local axis_x_x = packet:r_float()&lt;br /&gt;
			local axis_x_y = packet:r_float()&lt;br /&gt;
			local axis_x_z = packet:r_float()&lt;br /&gt;
			local axis_y_x = packet:r_float()&lt;br /&gt;
			local axis_y_y = packet:r_float()&lt;br /&gt;
			local axis_y_z = packet:r_float()&lt;br /&gt;
			local axis_z_x = packet:r_float()&lt;br /&gt;
			local axis_z_y = packet:r_float()&lt;br /&gt;
			local axis_z_z = packet:r_float()&lt;br /&gt;
			local offset_x = packet:r_float()&lt;br /&gt;
			local offset_y = packet:r_float()&lt;br /&gt;
			local offset_z = packet:r_float()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_space_restrictor&lt;br /&gt;
	local restrictor_type 			= packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_level_changer&lt;br /&gt;
	local dest_game_vertex_id		= packet:r_u16()  &lt;br /&gt;
	local dest_level_vertex_id 		= packet:r_u32()  &lt;br /&gt;
	local dest_position 			= packet:r_vec3()&lt;br /&gt;
	local dest_direction 			= packet:r_vec3()&lt;br /&gt;
	local dest_level_name 			= packet:r_stringZ()&lt;br /&gt;
	local dest_graph_point 			= packet:r_stringZ()&lt;br /&gt;
	local silent_mode 			= packet:r_u8()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	packet:w_begin(game_vertex_id)			-- game_vertex_id&lt;br /&gt;
	packet:w_float(cse_alife_object__unk1_f32)&lt;br /&gt;
	packet:w_u32(cse_alife_object__unk2_u32) &lt;br /&gt;
	packet:w_u32(level_vertex_id)			-- level_vertex_id&lt;br /&gt;
	packet:w_u32( bit_not(193) )			-- object_flags = -193 = 0xFFFFFF3E&lt;br /&gt;
	packet:w_stringZ(custom_data)&lt;br /&gt;
	packet:w_u32(p_story_id)			-- story_id&lt;br /&gt;
	packet:w_u32(spawn_story_id)&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(1)			-- количество фигур&lt;br /&gt;
--		packet:w_u8(0)			-- тип фигуры: сфера&lt;br /&gt;
--		packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center&lt;br /&gt;
--		packet:w_float(3.0)&lt;br /&gt;
	packet:w_u8(1)			-- тип фигуры: box&lt;br /&gt;
	packet:w_float(2)	   -- axis_x_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_x_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_x&lt;br /&gt;
	packet:w_float(4)	   -- axis_y_y&lt;br /&gt;
	packet:w_float(0)	   -- axis_y_z&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_x&lt;br /&gt;
	packet:w_float(0)	   -- axis_z_y&lt;br /&gt;
	packet:w_float(4)	   -- axis_z_z&lt;br /&gt;
	packet:w_float(0)	   -- offset_x&lt;br /&gt;
	packet:w_float(0)	   -- offset_y&lt;br /&gt;
	packet:w_float(0)          -- offset_z&lt;br /&gt;
&lt;br /&gt;
	packet:w_u8(3)	 	   -- restrictor_type&lt;br /&gt;
&lt;br /&gt;
	packet:w_u16(p_dest_gv)			-- destination game_vertex_id&lt;br /&gt;
	packet:w_u32(p_dest_lv)			-- destination level_vertex_id&lt;br /&gt;
	packet:w_vec3(p_dest_pos)		-- destination position&lt;br /&gt;
	packet:w_vec3(p_dest_dir)		-- destination direction (направление взгляда)&lt;br /&gt;
	packet:w_stringZ(p_dest_level)		-- destination level name&lt;br /&gt;
	packet:w_stringZ(&amp;quot;start_actor_99&amp;quot;)	-- some string, always const&lt;br /&gt;
	packet:w_u8(p_silent)			-- 1 for silent level changing&lt;br /&gt;
&lt;br /&gt;
	packet:r_seek(0)&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell())&lt;br /&gt;
&lt;br /&gt;
--	news_manager.send_tip(db.actor, &amp;quot;LC creation finished&amp;quot;, nil, nil, 30000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Для shape типа &amp;quot;box&amp;quot; загрузка координат методом packet:r_matrix() окончилась неудачей. Я подозреваю, что не был прочитан вектор &amp;quot;offset&amp;quot;, но точной уверенности нет, поэтому пока остановился на покомпонентной выборке и сохранении координат.''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Часть 2. '''Создание точек перехода''' ==&lt;br /&gt;
&lt;br /&gt;
Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function exit_monolit()&lt;br /&gt;
	if (not has_alife_info(&amp;quot;freeplay_activated1&amp;quot;)) then&lt;br /&gt;
		create_level_changer(11410, vector():set(-13.26, 47.71, 46.57), 200, 2417,&lt;br /&gt;
			2384,&lt;br /&gt;
			162109,&lt;br /&gt;
			vector():set( 375.615, 0.224, 27.737 ),&lt;br /&gt;
			vector():set(     0.0, 0.0  ,  0.0 ),&lt;br /&gt;
			&amp;quot;L12_Stancia&amp;quot;,&lt;br /&gt;
			1)&lt;br /&gt;
	&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;freeplay_activated1&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	create_chaes2pripyat_exit()&lt;br /&gt;
&lt;br /&gt;
	-- актер перебрасывается в level_changer, возвращающий его на ЧАЭС, ко входу в бункер&lt;br /&gt;
	db.actor:set_actor_position( vector():set(-13.26, 47.71, 46.57) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function refuze_o_sozn()&lt;br /&gt;
	if (not has_alife_info(&amp;quot;freeplay_activated2&amp;quot;)) then&lt;br /&gt;
		create_level_changer(21410, vector():set(946.872, 6.0, 167.66), 240852, 2637,&lt;br /&gt;
			2280,&lt;br /&gt;
			472710,&lt;br /&gt;
			vector():set( 1062.15, -0.0982, -3.512 ),&lt;br /&gt;
			vector():set(    0.0 ,  0.0   , -1.0 ),&lt;br /&gt;
			&amp;quot;L12_Stancia&amp;quot;,&lt;br /&gt;
			1)&lt;br /&gt;
	&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;freeplay_activated2&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	create_chaes2pripyat_exit()&lt;br /&gt;
&lt;br /&gt;
	-- актер перебрасывается в level_changer, возвращающий его к правым воротам ЧАЭС&lt;br /&gt;
	db.actor:set_actor_position( vector():set(946.872, 6.0, 167.66) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function create_chaes2pripyat_exit()&lt;br /&gt;
	-- создается переход из ЧАЭС в Припять&lt;br /&gt;
	if (not has_alife_info(	&amp;quot;exit_chaes2pripyat_created&amp;quot; )) then&lt;br /&gt;
		create_level_changer(31410, vector():set( 917.35, 0.419, -316.35 ), 403866, 2401,&lt;br /&gt;
			2117,&lt;br /&gt;
			73868,&lt;br /&gt;
			vector():set( 31.3, 3.0, 240.0 ),&lt;br /&gt;
			vector():set(  0.0, 0.0,  -1.0 ),&lt;br /&gt;
			&amp;quot;L11_Pripyat&amp;quot;,&lt;br /&gt;
			0)&lt;br /&gt;
&lt;br /&gt;
		db.actor:give_info_portion(&amp;quot;exit_chaes2pripyat_created&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Функцию '''exit_monolit''' я создал исключительно для тестирования, но решил оставить и тут. Вдруг кто-то захочет реализовать более сложный возврат: Меченого грузят в &amp;quot;грузовик смерти&amp;quot; и он снова приходит в себя на кордоне...''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция '''exit_monolit''' создает «тихий» переход на уровень ЧАЭС-1 и обычный - в начале уровня ЧАЭС-1 для возврата в Припять, после чего перебрасывает актера прямо внутрь созданного перехода. Функция '''refuze_o_sozn''' делает тоже самое, только игрок появляется перед воротами в правом верхем углу карты (мне кажется, что так более логично). Все телепорты защищаются уникальными info_portions, дабы избежать их повторного создания, ведь игрок может захотеть «закончить» игру несколько раз.&lt;br /&gt;
&lt;br /&gt;
Теперь подключение.&lt;br /&gt;
Во-первых надо добавить новые info-portions. Я решил не изменять оригинальные файлы игры, а сделал для них (ну и для других тоже) отдельный файл&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		config\gameplay\_info_sa.xml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
следующего вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1251&amp;quot; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;game_information_portions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay_activated1&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay_activated2&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;exit_chaes2pripyat_created&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/game_information_portions&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь в этот файл можно будет добавлять новые info_portion, которые вы будете использовать в своих сюжетах.&lt;br /&gt;
Подключается этот файл в system.ltx в секции «info_portions»:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[info_portions]&lt;br /&gt;
;список xml файлов, содержащих info_portions&lt;br /&gt;
files = _info_sa, info_portions, ....................&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Кстати, именно так я рекомендую добавлять новые диалоги и новых персонажей. Это упростит процессы совмещения модов и аддонов.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Следующий шаг - подключение наших скриптов к игре. Для этого откройте файл &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		config\ui\ui_movies.xml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
найдите элементы «''mov_desire_''» (их пять, по количеству ложных концовок игры - все варианты общения с Монолитом). Внутри каждого элемента есть дочерние элементы «''function_on_stop''», которые задают функцию, запускающуюся сразу после ролика. Стандартное содержимое:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Функция '''xr_effects.game_credits''' запускает финальные титры. Именно ее и нужно заменить на вызов нашей функции _freeplay_sa.exit_monolit. Вот что должно получиться:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;_freeplay_sa.exit_monolit&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;!-- original:	&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;  --&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
''Старый элемент я советую не удалять, а закомментировать.''&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чуть ниже «''mov_desire_5''» находится тэг ролика для концовки «Присоединение к О-Сознанию». Его мы трогать не будем - Меченый станет медузой. А вот после него - тэг для ролика «Отказ от О-Сознания»: «''mov_refuse_osoznanie''». Функцию завершения в нем заменим следующим образом:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;function_on_stop&amp;gt;_freeplay_sa.refuze_o_sozn&amp;lt;/function_on_stop&amp;gt;&lt;br /&gt;
&amp;lt;!-- original:	&amp;lt;function_on_stop&amp;gt;xr_effects.game_credits&amp;lt;/function_on_stop&amp;gt;  --&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Можно запускать и, если есть сохранения перед монолитом и/или о-сознанием, тестировать. Первые переходы срабатывают «тихо» - запрос на смену уровня не выдается (в параметре p_silent задана 1). До перехода в Припять можно успеть добежать, пока не сработал выброс... Но это как-то неправильно, выброс надо остановить (он же произошел, пока мы были внутри станции). «По-честному» (скриптом, без модификации ''all.spawn'') таймер выброса отключить не получится, но зато выброс можно подавить небольшим «хаком». Найдите файл xr_logic.script, а в нем - функцию '''switch_to_section'''. Ее нужно модифицировать следующим образом:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- Выполняет переключение на указанную секцию, если задана.&lt;br /&gt;
-- Если section == nil, остается работать старая секция.&lt;br /&gt;
function switch_to_section(npc, st, section)&lt;br /&gt;
  if section == nil or section == &amp;quot;&amp;quot; then&lt;br /&gt;
    return false&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- 15.03.2008 by SA:&lt;br /&gt;
  -- отключает &amp;quot;смертельные зоны&amp;quot; на ЧАЭС после запуска режима FREEPLAY&lt;br /&gt;
  -- 	таймер не отключается, но сам &amp;quot;выброс&amp;quot; не происходит&lt;br /&gt;
  if (section == &amp;quot;sr_aes_deadzone&amp;quot;) then&lt;br /&gt;
	if (has_alife_info(&amp;quot;freeplay_activated1&amp;quot;) or has_alife_info(&amp;quot;freeplay_activated2&amp;quot;)) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  ... далее без изменений ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный способ оставляет висящий на нулях таймер и все эффекты начала выброса, но сам «''выброс''» отключается.&lt;br /&gt;
&lt;br /&gt;
И последнее: переход ЧАЭС1-Припять необходимо отметить на карте. Для этого существует вполне «легальный» механизм. Находим файл '''level_tasks.script''' и в конце функции '''add_lchanger_location''' дописываем следующее:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		-- aes (++16.03.2008 by SA):&lt;br /&gt;
		obj = sim:story_object(31410)&lt;br /&gt;
		if obj then&lt;br /&gt;
			level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, &amp;quot;To Pripyat&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь 31410 - story_id нашего level_changer, который создается нашей функцией '''create_chaes2pripyat_exit'''.&lt;br /&gt;
&lt;br /&gt;
На этом пока все (мелкие огрехи типа направления взгляда игрока после смены уровня исправлю позже).&lt;br /&gt;
Прошу тестировать и дополнять.&lt;br /&gt;
&lt;br /&gt;
С уважением, sarthur.&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-17T10:15:56Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol2&lt;br /&gt;
local  kol1 = 1&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) объект(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) объект(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по объектам). Где, при каждом цикле выбирается случайный объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. &lt;br /&gt;
Строку можно не указывать, если спавнится один объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных объектов и(или) возможных наборов объектов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы объектов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого объекта, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора объектов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --объект спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список объектов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных объектов и наборов объектов&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла '''spawn_sections.ltx''' --для спавна нпс. Или имена типов мутантов из файла '''se_respawn.script''' --для спавна мутантов.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-16T07:24:20Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol1, kol2&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                else&lt;br /&gt;
                    kol1 = 1&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) объект(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) объект(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по объектам). Где, при каждом цикле выбирается случайный объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. &lt;br /&gt;
Строку можно не указывать, если спавнится один объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных объектов и(или) возможных наборов объектов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы объектов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого объекта, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора объектов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --объект спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список объектов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных объектов и наборов объектов&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла '''spawn_sections.ltx''' --для спавна нпс. Или имена типов мутантов из файла '''se_respawn.script''' --для спавна мутантов.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-16T07:21:25Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol1, kol2&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                else&lt;br /&gt;
                    kol1 = 1&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) объект(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) объект(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) объект(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество объектов, наборы объектов и количество каждого объекта в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по объектам). Где, при каждом цикле выбирается случайный объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по объектам). При каждом цикле выбирается случайный объект или набор объектов. &lt;br /&gt;
Строку можно не указывать, если спавнится один объект или набор объектов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных объектов и(или) возможных наборов объектов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы объектов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого объекта, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора объектов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --объект спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список объектов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Набор объектов, для спавна.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные объекты, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) объект(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных объектов и наборов объектов&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором объектов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый объект:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Как вы уже наверно поняли, спавнить можно не только объекты инвентаря, но и нпсов, и мутантов. Достаточно, вместо имени объекта, прописать имя секции из файла '''spawn_sections.ltx''' --для спавна нпс. Или имена типов мутантов из файла '''se_respawn.script''' --для спавна мутантов.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-15T13:47:44Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol1, kol2&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                else&lt;br /&gt;
                    kol1 = 1&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) предмет(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) предмет(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество предметов, наборы предметов и количество каждого предмета в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по предметам). Где, при каждом цикле выбирается случайный предмет или набор предметов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по предметам). При каждом цикле выбирается случайный предмет или набор предметов. &lt;br /&gt;
Строку можно не указывать, если спавнится один предмет или один набор предметов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol, rand)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных предметов и возможных наборов предметов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы предметов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого предмета, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора предметов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список предметов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные предметы, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных предметов и наборов предметов&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором предметов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-14T17:27:24Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_spawn_new(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol1, kol2&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                else&lt;br /&gt;
                    kol1 = 1&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) предмет(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) предмет(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество предметов, наборы предметов и количество каждого предмета в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по предметам). Где, при каждом цикле выбирается случайный предмет или набор предметов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по предметам). При каждом цикле выбирается случайный предмет или набор предметов. &lt;br /&gt;
Строку можно не указывать, если спавнится один предмет или один набор предметов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol, rand)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных предметов и возможных наборов предметов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы предметов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого предмета, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора предметов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список предметов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные предметы, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},&lt;br /&gt;
{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных предметов и наборов предметов&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором предметов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-14T17:23:39Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: Окончательная версия функции., обновление данных&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам, а так же возможность указывать не только координаты, но и id объектов, в том числе и нпс. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_spawn_new(items, tbl, kol)&lt;br /&gt;
local lv_id, gv_id, obj, item, ms, kol1, kol2&lt;br /&gt;
local id = 65535&lt;br /&gt;
local pos = vector()&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' then&lt;br /&gt;
        ms = math.random(#tbl)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(tbl) == 'table' and type(tbl[ms]) == 'table' then&lt;br /&gt;
        pos.x = tbl[ms][1]&lt;br /&gt;
        pos.y = tbl[ms][2]&lt;br /&gt;
        pos.z = tbl[ms][3]&lt;br /&gt;
        lv_id = tbl[ms][4]&lt;br /&gt;
        gv_id = tbl[ms][5]&lt;br /&gt;
    else&lt;br /&gt;
        if type(tbl) == 'table' and type(tbl[ms]) == 'number' then&lt;br /&gt;
            ms = tbl[ms]&lt;br /&gt;
            obj = level_object_by_sid (ms)&lt;br /&gt;
        elseif type(tbl) == 'table' and type(tbl[ms]) == 'string' or type(tbl) == 'string' then&lt;br /&gt;
            obj = db.actor&lt;br /&gt;
        elseif type(tbl) == 'number' then&lt;br /&gt;
            obj = level_object_by_sid (tbl)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        pos = obj:position()&lt;br /&gt;
        lv_id = obj:level_vertex_id()&lt;br /&gt;
        gv_id = obj:game_vertex_id()&lt;br /&gt;
        id = obj:id()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if kol == nil then&lt;br /&gt;
        kol = 1&lt;br /&gt;
    end&lt;br /&gt;
    for s=1, kol do&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = math.random(#items)&lt;br /&gt;
                if type(items[item]) == 'number' then&lt;br /&gt;
                    item = item - 1&lt;br /&gt;
                end&lt;br /&gt;
                if type(items[item+1]) == 'number' then&lt;br /&gt;
                    kol1 = items[item+1]&lt;br /&gt;
                else&lt;br /&gt;
                    kol1 = 1&lt;br /&gt;
                end&lt;br /&gt;
            item = items[item]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
        for i=1, kol1 do&lt;br /&gt;
            if type(item) == 'table' then&lt;br /&gt;
                for k, v in ipairs(item) do&lt;br /&gt;
                    if type(item[k+1]) == 'number' then&lt;br /&gt;
                        kol2 = item[k+1]&lt;br /&gt;
                    else&lt;br /&gt;
                        kol2 = 1&lt;br /&gt;
                    end&lt;br /&gt;
                    if type(item[k]) ~= 'number' then&lt;br /&gt;
                        for j=1, kol2 do&lt;br /&gt;
                            alife():create(v, pos, lv_id, gv_id, id)&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                alife():create(item, pos, lv_id, gv_id, id)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберём возможности функции.&lt;br /&gt;
Данная функция имеет 4 типа спавна:&lt;br /&gt;
&lt;br /&gt;
1. Рандомно, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
2. Рандомно, определённый(ые) предмет(ы).&lt;br /&gt;
3. В определённом месте, случайный(ые) предмет(ы) (из предлагаемого списка).&lt;br /&gt;
4. В определённом месте, определённый(ые) предмет(ы).&lt;br /&gt;
&lt;br /&gt;
Можно указывать количество предметов, наборы предметов и количество каждого предмета в наборе.&lt;br /&gt;
Так же, есть возможность указать количество циклов спавна (по предметам). Где, при каждом цикле выбирается случайный предмет или набор предметов.&lt;br /&gt;
&lt;br /&gt;
Функция является общей, а значит при запуске функции, нам потребуется передавать ей данные для спавна. Передача данных будет производиться из других функций.&lt;br /&gt;
&lt;br /&gt;
Функции с данными должны выглядеть так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = --таблица мест спавна&lt;br /&gt;
&lt;br /&gt;
local items = --таблица объектов спавна&lt;br /&gt;
&lt;br /&gt;
local kol = 5 --количество спавн-циклов (по предметам). При каждом цикле выбирается случайный предмет или набор предметов. Строку можно не указывать, если спавнится один предмет или один набор предметов.&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl, kol, rand) --если обе функции находятся в одном файле.&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если функция с данными прописывается в другом файле, то вместо '''this''' пишется имя файла без расширения, в котором находится общая функция. В нашем случае, это '''xr_effects.script'''.&lt;br /&gt;
Тоесть, получится так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;xr_effects.uni_random_spawn(items, tbl, kol, rand)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функции данных, для каждого типа спавна.&lt;br /&gt;
&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
'''1. Рандомно, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
         --Список мест спавна--&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500  --id Бармена&lt;br /&gt;
}&lt;br /&gt;
         --Список возможных объектов--&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
}         &lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таблица '''tbl''' содержит в себе разные типы мест для спавна. Такие как '''id''', '''актор''' и '''непосредственные координаты'''. Весь список данных записывается в фигурных скобках, через запятую. Непосредственные координаты, заключаются в дополнительные фигурные скобки, как в нашем примере.&lt;br /&gt;
Строки, могут содержать в себе любую информацию. Это не имеет значения, так как проверка идёт на тип значения 'string'. Если строка, то спавнить в инвентаре актора.&lt;br /&gt;
&lt;br /&gt;
Таблица '''items''' содержит в себе, список возможных предметов и возможных наборов предметов. Которые так же, вписываются в фигурные скобки, через запятую.&lt;br /&gt;
Наборы предметов, заключаются в дополнительные фигурные скобки.&lt;br /&gt;
После каждого предмета, можно указывать количество, через запятую.&lt;br /&gt;
Можно также указать количество спавна набора предметов, через запятую, после закрытия фигурной скобки набора.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa' --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, выбирается всего один объект, а значит в таблице '''items''' фигурные скобки ставить не обязательно. Что переделывает её, в простую переменную.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2. Рандомно, определённый список предметов:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = {&lt;br /&gt;
2040, -- id ящика&lt;br /&gt;
'actor', --строка, а значит инвентарь актора&lt;br /&gt;
{125.45,-1,117.88,35447,1213}, --координаты(x, y, z, lv_id, gv_id)&lt;br /&gt;
{134.526,0,70.318,36649,1229},&lt;br /&gt;
{102,0,128.98,32231,1219},&lt;br /&gt;
2041,&lt;br /&gt;
573,&lt;br /&gt;
500 --id Бармена&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local items = {{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2}} --Предмет спавна&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае, чтобы функция сообразила, что нам нужно заспавнить все прописанные предметы, список нужно заключить в двойные фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3. В определённом месте, случайный(ые) предмет(ы):'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040 -- id ящика&lt;br /&gt;
&lt;br /&gt;
local items = {&lt;br /&gt;
'af_medusa',2,&lt;br /&gt;
'af_cristall_flower',&lt;br /&gt;
{'af_dummy_battery',3,'af_fuzz_kolobok','af_night_star',2},{'bandage',10,'medkit_scientic','medkit_army',3,'medkit',5},2&lt;br /&gt;
} --Список возможных предметов и наборов предметов&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае, переменная '''tbl''' может иметь один из трёх типов '''(table, number, string)'''. Если указывается id ящика или нпс, то прописывается так, как указано на примере. В данном случае, '''tbl''' будет иметь, тип - number. Если указать актора, то тип будет string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = &amp;quot;actor&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну а если указывать непосредственные координаты, то tbl будет таблицей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local tbl = {{134.526,0,70.318,36649,1229}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Координаты, как и в случае с набором предметов, нужно заключить в двойные фигурные скобки, чтобы функция не воспринила их как набор id.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4. В определённом месте, определённый предмет:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function random_spawn_data_1()&lt;br /&gt;
local tbl = 2040&lt;br /&gt;
&lt;br /&gt;
local items = 'af_medusa'&lt;br /&gt;
&lt;br /&gt;
this.uni_spawn_new(items, tbl, kol)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну тут, всё уже понятно.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Всё. Теперь вызываем функцию '''random_spawn_data_1''', например из диалога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.random_spawn_data_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И любуемся результатом.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Версия функции окончательная.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Рандомный спавн объектов</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A0%D0%B0%D0%BD%D0%B4%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B0%D0%B2%D0%BD_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2009-06-12T17:22:21Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Предлагаю свой вариант рандомного спавна. В данном способе, нет проблем с проваливанием объектов под землю. Но рандомность, к сожалению фиксирована. Хотя, это даже к лучшему, так как появляется возможность спавнить только по укромным местам. Функция универсальна, что расширяет её возможности.&lt;br /&gt;
&lt;br /&gt;
Итак, в файле '''xr_effects.script''' вписываем новую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function uni_random_spawn(items, tbl)&lt;br /&gt;
local item, ms&lt;br /&gt;
local pos, lv_id, gv_id&lt;br /&gt;
&lt;br /&gt;
        if type(items) == 'table' then&lt;br /&gt;
            item = items[math.random(#items)]&lt;br /&gt;
        else&lt;br /&gt;
            item = items&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if type(tbl[1]) == 'table' then&lt;br /&gt;
            ms = math.random(#tbl)&lt;br /&gt;
            pos = vector()&lt;br /&gt;
            pos.x = tbl[ms][1]&lt;br /&gt;
            pos.y = tbl[ms][2]&lt;br /&gt;
            pos.z = tbl[ms][3]&lt;br /&gt;
            lv_id = tbl[ms][4]&lt;br /&gt;
            gv_id = tbl[ms][5]&lt;br /&gt;
        else&lt;br /&gt;
            pos = vector()&lt;br /&gt;
            pos.x = tbl[1]&lt;br /&gt;
            pos.y = tbl[2]&lt;br /&gt;
            pos.z = tbl[3]&lt;br /&gt;
            lv_id = tbl[4]&lt;br /&gt;
            gv_id = tbl[5]&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
alife():create(item, pos, lv_id, gv_id, 65535)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная функция является общей, и прямого вызова не имеет.&lt;br /&gt;
Для того, чтобы произвести рандомный спавн, создаём дополнительную функцию с данными, которую мы и будем вызывать.&lt;br /&gt;
&lt;br /&gt;
'''Для рандомного спавна, случайного обекта из определённого списка:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function my_spawn_1()&lt;br /&gt;
local items = {'item1','item2','item3','item4','item5'}&lt;br /&gt;
local tbl = {&lt;br /&gt;
{x1, y1, z1, lv1, gv1},&lt;br /&gt;
{x2, y2, z2, lv2, gv2},&lt;br /&gt;
{x3, y3, z3, lv3, gv3}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
     таблица '''items''' - список объектов, для рандомного выбора одного из них.&lt;br /&gt;
     таблица '''tbl''' - список секций с координатами мест спавна, для рандомного выбора одной из них.&lt;br /&gt;
                   Где, '''x, y, z, lv, gv''' - заменяются на реальные координаты '''pos.x, pos.y, pos.z'''&lt;br /&gt;
                                               и '''level_vertex_id, game_vertex_id''' соответственно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Для рандомного спавна определённого объекта:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function my_spawn_2()&lt;br /&gt;
local items = {'item1'}      --или 'item1'&lt;br /&gt;
local tbl = {&lt;br /&gt;
{x1, y1, z1, lv1, gv1},&lt;br /&gt;
{x2, y2, z2, lv2, gv2},&lt;br /&gt;
{x3, y3, z3, lv3, gv3}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сдесь у нас прописан всего один объект, который можно не заключать в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
'''Для спавна в определённом месте, случайного объекта из определённого списка:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function my_spawn_3()&lt;br /&gt;
local items = {'item1','item2','item3','item4','item5'}&lt;br /&gt;
local tbl = {{x1, y1, z1, lv1, gv1}}      --или {x1, y1, z1, lv1, gv1}&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Для спавна в определённом месте, определённого объекта:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function my_spawn_3()&lt;br /&gt;
local items = {'item1'}                   --или 'item1'&lt;br /&gt;
local tbl = {{x1, y1, z1, lv1, gv1}}      --или {x1, y1, z1, lv1, gv1}&lt;br /&gt;
&lt;br /&gt;
this.uni_random_spawn(items, tbl)&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов можно производить из любого места.&lt;br /&gt;
Для того, чтобы вызвать спавн из диалога, в нужном тэге прописываем вызов одной из функций с данными:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;action&amp;gt;xr_effects.my_spawn_1&amp;lt;/action&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как вызывать из других мест, пожалуй пояснять не нужно.&lt;br /&gt;
&lt;br /&gt;
[[скрипты]]&lt;br /&gt;
&lt;br /&gt;
-----------------------------&lt;br /&gt;
Автор скрипта: '''SINGAPUR22'''&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-23T14:41:43Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Одно из преимуществ динамических ltx, это пакетная настройка логики.&lt;br /&gt;
Может я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду.&lt;br /&gt;
Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей.&lt;br /&gt;
В статических ltx нам понадобится создавать 8 секций '''[logic]'''. Тоесть для каждого уолкера, своя секция логики.&lt;br /&gt;
В динамических ltx, данную проблему можно решить функционально.&lt;br /&gt;
&lt;br /&gt;
Делаем это так:&lt;br /&gt;
&lt;br /&gt;
Создаём 8 уолкеров в функции &amp;quot;'''load_job'''&amp;quot;. Обязательно с помощью счётчика &amp;quot;'''for-do'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кто ещё не знает, как это работает, то поясню.&lt;br /&gt;
Создаётся переменная '''i''', или любое другое имя. Назначается ей два, или три значения, (через запятую).&lt;br /&gt;
Где: &lt;br /&gt;
     '''первое значение''' = какое число задаётся при первом цикле счёта;&lt;br /&gt;
     '''второе значение''' = при достижении или переполнении какого числа, остановить счёт;&lt;br /&gt;
     '''третье значение''' = какое значение прибавлять, при каждом цикле счёта.&lt;br /&gt;
Если третье значение не задаётся, то при каждом цикле счёта, прибавляется '''1'''.&lt;br /&gt;
&lt;br /&gt;
Переменной &amp;quot;'''section'''&amp;quot; задаётся '''&amp;quot;имя секции&amp;quot;+переменная i'''. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной '''i'''.&lt;br /&gt;
Тоесть, '''&amp;quot;logic@kakashki_walker_1&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_2&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_3&amp;quot;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
В нашем случае, переменной &amp;quot;'''prior'''&amp;quot; задано значение '''9-i''', что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной '''i''' от числа '''9'''. В итоге, при каждом последующем цикле, переменной &amp;quot;'''prior'''&amp;quot; задаётся значение на '''1''' меньше предыдущего.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную '''ltx''', которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной '''t''', и ниже прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local ltx = &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь, в функции &amp;quot;'''load_ltx'''&amp;quot; создаём ltx файл для нашего гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function load_ltx(gname, type)&lt;br /&gt;
	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
		return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данным способом, мы возвращаем поиск секций логики, назад в функцию &amp;quot;'''load_job'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Теперь возвращаемся в функцию &amp;quot;'''load_job'''&amp;quot;, и в секции нашего гулага, внутри счётчика &amp;quot;'''for-do'''&amp;quot; прописываем логику уолкерам. Выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
     ltx = ltx.. &amp;quot;[logic@kakashki_walker_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;active = walker@kakashki_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
                 &amp;quot;[walker@kakashki_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_walk = walk_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_look = look_&amp;quot;..i..&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, так же как и в случае с переменной &amp;quot;'''section'''&amp;quot;, приписывается в конец имён секций и путей, значение переменной '''i'''.&lt;br /&gt;
В итоге получаем такие имена путей:&lt;br /&gt;
&lt;br /&gt;
'''walk_1, look_1; walk_2, look_2; walk_3, look_3;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:&lt;br /&gt;
&lt;br /&gt;
ltx = логика&lt;br /&gt;
&lt;br /&gt;
То, при каждом цикле счёта, новая секция будет накладываться на предыдущую, что приведёт к не хорошим последствиям.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Ну и создаём соответствующие секции поинтов путей, в файле all.spawn. И всё будет работать как часы.&lt;br /&gt;
&lt;br /&gt;
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-23T14:40:20Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Одно из преимуществ динамических ltx, это пакетная настройка логики.&lt;br /&gt;
Может я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду.&lt;br /&gt;
Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей.&lt;br /&gt;
В статических ltx нам понадобится создавать 8 секций '''[logic]'''. Тоесть для каждого уолкера, своя секция логики.&lt;br /&gt;
В динамических ltx, данную проблему можно решить функционально.&lt;br /&gt;
&lt;br /&gt;
Делаем это так:&lt;br /&gt;
&lt;br /&gt;
Создаём 8 уолкеров в функции &amp;quot;'''load_job'''&amp;quot;. Обязательно с помощью счётчика &amp;quot;'''for-do'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кто ещё не знает, как это работает, то поясню.&lt;br /&gt;
Создаётся переменная '''i''', или любое другое имя. Назначается ей два, или три значения, (через запятую).&lt;br /&gt;
Где: &lt;br /&gt;
     '''первое значение''' = какое число задаётся при первом цикле счёта;&lt;br /&gt;
     '''второе значение''' = при достижении или переполнении какого числа, остановить счёт;&lt;br /&gt;
     '''третье значение''' = какое значение прибавлять, при каждом цикле счёта.&lt;br /&gt;
Если третье значение не задаётся, то при каждом цикле счёта, прибавляется '''1'''.&lt;br /&gt;
&lt;br /&gt;
Переменной &amp;quot;'''section'''&amp;quot; задаётся '''&amp;quot;имя секции&amp;quot;+переменная i'''. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной '''i'''.&lt;br /&gt;
Тоесть, '''&amp;quot;logic@kakashki_walker_1&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_2&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_3&amp;quot;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
В нашем случае, переменной &amp;quot;'''prior'''&amp;quot; задано значение '''9-i''', что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной '''i''' от числа '''9'''. В итоге, при каждом последующем цикле, переменной &amp;quot;'''prior'''&amp;quot; задаётся значение на '''1''' меньше предыдущего.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную '''ltx''', которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной '''t''', и ниже прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local ltx = &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь, в функции &amp;quot;'''load_ltx'''&amp;quot; создаём ltx файл для нашего гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function load_ltx(gname, type)&lt;br /&gt;
	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
		return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данным способом, мы возвращаем поиск секций логики, назад в функцию &amp;quot;'''load_job'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Теперь возвращаемся в функцию &amp;quot;'''load_job'''&amp;quot;, и в секции нашего гулага, внутри счётчика &amp;quot;'''for-do'''&amp;quot; прописываем логику уолкерам. Выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
     ltx = ltx.. &amp;quot;[logic@kakashki_walker_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;active = walker@kakashki_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
                 &amp;quot;[walker@kakashki_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_walk = walk_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_look = look_&amp;quot;..i..&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, так же как и в случае с переменной &amp;quot;'''section'''&amp;quot;, приписывается в конец имён секций и путей, значение переменной '''i'''.&lt;br /&gt;
В итоге получаем такие имена путей:&lt;br /&gt;
&lt;br /&gt;
'''walk_1, look_1; walk_2, look_2; walk_3, look_3;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:&lt;br /&gt;
&lt;br /&gt;
ltx = логика&lt;br /&gt;
&lt;br /&gt;
То, при каждом цикле счёта, новая секция будет накладываться на предыдущую, что приведёт к не хорошим последствиям.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Ну и создаём соответствующие секции поинтов путей, в файле all.spawn. И всё будет работать как часы.&lt;br /&gt;
&lt;br /&gt;
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-23T14:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Одно из преимуществ динамических ltx, это пакетная настройка логики.&lt;br /&gt;
Может я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду.&lt;br /&gt;
Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей.&lt;br /&gt;
В статических ltx нам понадобится создавать 8 секций '''[logic]'''. Тоесть для каждого уолкера, своя секция логики.&lt;br /&gt;
В динамических ltx, данную проблему можно решить функционально.&lt;br /&gt;
&lt;br /&gt;
Делаем это так:&lt;br /&gt;
&lt;br /&gt;
Создаём 8 уолкеров в функции &amp;quot;'''load_job'''&amp;quot;. Обязательно с помощью счётчика &amp;quot;'''for-do'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кто ещё не знает, как это работает, то поясню.&lt;br /&gt;
Создаётся переменная '''i''', или любое другое имя. Назначается ей два, или три значения, (через запятую).&lt;br /&gt;
Где, '''первое значение''' = какое число задаётся при первом цикле счёта;&lt;br /&gt;
     '''второе значение''' = при достижении или переполнении какого числа, остановить счёт;&lt;br /&gt;
     '''третье значение''' = какое значение прибавлять, при каждом цикле счёта.&lt;br /&gt;
Если третье значение не задаётся, то при каждом цикле счёта, прибавляется '''1'''.&lt;br /&gt;
&lt;br /&gt;
Переменной &amp;quot;'''section'''&amp;quot; задаётся '''&amp;quot;имя секции&amp;quot;+переменная i'''. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной '''i'''.&lt;br /&gt;
Тоесть, '''&amp;quot;logic@kakashki_walker_1&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_2&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_3&amp;quot;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
В нашем случае, переменной &amp;quot;'''prior'''&amp;quot; задано значение '''9-i''', что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной '''i''' от числа '''9'''. В итоге, при каждом последующем цикле, переменной &amp;quot;'''prior'''&amp;quot; задаётся значение на '''1''' меньше предыдущего.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную '''ltx''', которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной '''t''', и ниже прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local ltx = &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь, в функции &amp;quot;'''load_ltx'''&amp;quot; создаём ltx файл для нашего гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function load_ltx(gname, type)&lt;br /&gt;
	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
		return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данным способом, мы возвращаем поиск секций логики, назад в функцию &amp;quot;'''load_job'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Теперь возвращаемся в функцию &amp;quot;'''load_job'''&amp;quot;, и в секции нашего гулага, внутри счётчика &amp;quot;'''for-do'''&amp;quot; прописываем логику уолкерам. Выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
     t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
          idle = 0,&lt;br /&gt;
          prior = 9-i, state = {0,1},&lt;br /&gt;
          in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
     table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
     ltx = ltx.. &amp;quot;[logic@kakashki_walker_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;active = walker@kakashki_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
                 &amp;quot;[walker@kakashki_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_walk = walk_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                 &amp;quot;path_look = look_&amp;quot;..i..&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, так же как и в случае с переменной &amp;quot;'''section'''&amp;quot;, приписывается в конец имён секций и путей, значение переменной '''i'''.&lt;br /&gt;
В итоге получаем такие имена путей:&lt;br /&gt;
&lt;br /&gt;
'''walk_1, look_1; walk_2, look_2; walk_3, look_3;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:&lt;br /&gt;
&lt;br /&gt;
ltx = логика&lt;br /&gt;
&lt;br /&gt;
То, при каждом цикле счёта, новая секция будет накладываться на предыдущую, что приведёт к не хорошим последствиям.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Ну и создаём соответствующие секции поинтов путей, в файле all.spawn. И всё будет работать как часы.&lt;br /&gt;
&lt;br /&gt;
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-23T14:33:01Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Одно из преимуществ динамических ltx, это пакетная настройка логики.&lt;br /&gt;
Может я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду.&lt;br /&gt;
Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей.&lt;br /&gt;
В статических ltx нам понадобится создавать 8 секций '''[logic]'''. Тоесть для каждого уолкера, своя секция логики.&lt;br /&gt;
В динамических ltx, данную проблему можно решить функционально.&lt;br /&gt;
&lt;br /&gt;
Делаем это так:&lt;br /&gt;
&lt;br /&gt;
Создаём 8 уолкеров в функции &amp;quot;'''load_job'''&amp;quot;. Обязательно с помощью счётчика &amp;quot;'''for-do'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;                  for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                       end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кто ещё не знает, как это работает, то поясню.&lt;br /&gt;
Создаётся переменная '''i''', или любое другое имя. Назначается ей два, или три значения, (через запятую).&lt;br /&gt;
Где, '''первое значение''' = какое число задаётся при первом цикле счёта;&lt;br /&gt;
     '''второе значение''' = при достижении или переполнении какого числа, остановить счёт;&lt;br /&gt;
     '''третье значение''' = какое значение прибавлять, при каждом цикле счёта.&lt;br /&gt;
Если третье значение не задаётся, то при каждом цикле счёта, прибавляется '''1'''.&lt;br /&gt;
&lt;br /&gt;
Переменной &amp;quot;'''section'''&amp;quot; задаётся '''&amp;quot;имя секции&amp;quot;+переменная i'''. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной '''i'''.&lt;br /&gt;
Тоесть, '''&amp;quot;logic@kakashki_walker_1&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_2&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_3&amp;quot;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
В нашем случае, переменной &amp;quot;'''prior'''&amp;quot; задано значение '''9-i''', что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной '''i''' от числа '''9'''. В итоге, при каждом последующем цикле, переменной &amp;quot;'''prior'''&amp;quot; задаётся значение на '''1''' меньше предыдущего.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную '''ltx''', которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной '''t''', и ниже прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local ltx = &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь, в функции &amp;quot;'''load_ltx'''&amp;quot; создаём ltx файл для нашего гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function load_ltx(gname, type)&lt;br /&gt;
	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
		return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данным способом, мы возвращаем поиск секций логики, назад в функцию &amp;quot;'''load_job'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Теперь возвращаемся в функцию &amp;quot;'''load_job'''&amp;quot;, и в секции нашего гулага, внутри счётчика &amp;quot;'''for-do'''&amp;quot; прописываем логику уолкерам. Выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;                   for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
			    ltx = ltx.. &amp;quot;[logic@kakashki_walker_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
					&amp;quot;active = walker@kakashki_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
					&amp;quot;[walker@kakashki_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
		                        &amp;quot;path_walk = walk_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		                        &amp;quot;path_look = look_&amp;quot;..i..&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                       end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, так же как и в случае с переменной &amp;quot;'''section'''&amp;quot;, приписывается в конец имён секций и путей, значение переменной '''i'''.&lt;br /&gt;
В итоге получаем такие имена путей:&lt;br /&gt;
&lt;br /&gt;
'''walk_1, look_1; walk_2, look_2; walk_3, look_3;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:&lt;br /&gt;
&lt;br /&gt;
ltx = логика&lt;br /&gt;
&lt;br /&gt;
То, при каждом цикле счёта, новая секция будет накладываться на предыдущую, что приведёт к не хорошим последствиям.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Ну и создаём соответствующие секции поинтов путей, в файле all.spawn. И всё будет работать как часы.&lt;br /&gt;
&lt;br /&gt;
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-23T14:30:58Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: дополнение&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Одно из преимуществ динамических ltx, это пакетная настройка логики.&lt;br /&gt;
Может я не так выразился, но по ходу действий, я думаю вам станет ясно, что я имел ввиду.&lt;br /&gt;
Например, нам нужно создать 8 уолкеров, с одинаковыми настройками логики, но при этом, разными поинтами путей.&lt;br /&gt;
В статических ltx нам понадобится создавать 8 секций '''[logic]'''. Тоесть для каждого уолкера, своя секция логики.&lt;br /&gt;
В динамических ltx, данную проблему можно решить функционально.&lt;br /&gt;
&lt;br /&gt;
Делаем это так:&lt;br /&gt;
&lt;br /&gt;
Создаём 8 уолкеров в функции &amp;quot;'''load_job'''&amp;quot;. Обязательно с помощью счётчика &amp;quot;'''for-do'''&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
                       &amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                       end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кто ещё не знает, как это работает, то поясню.&lt;br /&gt;
Создаётся переменная '''i''', или любое другое имя. Назначается ей два, или три значения, (через запятую).&lt;br /&gt;
Где, '''первое значение''' = какое число задаётся при первом цикле счёта;&lt;br /&gt;
     '''второе значение''' = при достижении или переполнении какого числа, остановить счёт;&lt;br /&gt;
     '''третье значение''' = какое значение прибавлять, при каждом цикле счёта.&lt;br /&gt;
Если третье значение не задаётся, то при каждом цикле счёта, прибавляется '''1'''.&lt;br /&gt;
&lt;br /&gt;
Переменной &amp;quot;'''section'''&amp;quot; задаётся '''&amp;quot;имя секции&amp;quot;+переменная i'''. В итоге, при каждом последующем цикле счёта, к имени секции будет приписываться в конце значение переменной '''i'''.&lt;br /&gt;
Тоесть, '''&amp;quot;logic@kakashki_walker_1&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_2&amp;quot;'''; '''&amp;quot;logic@kakashki_walker_3&amp;quot;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
В нашем случае, переменной &amp;quot;'''prior'''&amp;quot; задано значение '''9-i''', что делать не обязательно. Здесь при каждом цикле счёта, вычитается значение переменной '''i''' от числа '''9'''. В итоге, при каждом последующем цикле, переменной &amp;quot;'''prior'''&amp;quot; задаётся значение на '''1''' меньше предыдущего.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Итак, уолкеров создали. Теперь нам нужно задать им всем логику действий. Создаём переменную '''ltx''', которую мы будем использовать для динамических ltx. Для этого, подымаемся на самый верх файла, где прописано создание переменной '''t''', и ниже прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local ltx = &amp;quot;&amp;quot;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теперь, в функции &amp;quot;'''load_ltx'''&amp;quot; создаём ltx файл для нашего гулага:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;function load_ltx(gname, type)&lt;br /&gt;
	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
		return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данным способом, мы возвращаем поиск секций логики, назад в функцию &amp;quot;'''load_job'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Теперь возвращаемся в функцию &amp;quot;'''load_job'''&amp;quot;, и в секции нашего гулага, внутри счётчика &amp;quot;'''for-do'''&amp;quot; прописываем логику уолкерам. Выглядеть это будет так:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                       &amp;lt;pre&amp;gt;for i = 1, 8 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
&lt;br /&gt;
			    ltx = ltx.. &amp;quot;[logic@kakashki_walker_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
					&amp;quot;active = walker@kakashki_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
					&amp;quot;[walker@kakashki_&amp;quot;..i..&amp;quot;]\n&amp;quot;..&lt;br /&gt;
		                        &amp;quot;path_walk = walk_&amp;quot;..i..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		                        &amp;quot;path_look = look_&amp;quot;..i..&amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                       end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, так же как и в случае с переменной &amp;quot;'''section'''&amp;quot;, приписывается в конец имён секций и путей, значение переменной '''i'''.&lt;br /&gt;
В итоге получаем такие имена путей:&lt;br /&gt;
&lt;br /&gt;
'''walk_1, look_1; walk_2, look_2; walk_3, look_3;''' и т.д.&lt;br /&gt;
&lt;br /&gt;
Заметим, как мы прописали переменную ltx. Таким способом, мы при каждом цикле счёта, новую секцию логики пришиваем к секциям, пришитым к динамическому ltx при предыдущих циклах. Если прописать просто:&lt;br /&gt;
&lt;br /&gt;
ltx = логика&lt;br /&gt;
&lt;br /&gt;
То, при каждом цикле счёта, новая секция будет накладываться на предыдущую, что приведёт к не хорошим последствиям.&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Ну и создаём соответствующие секции поинтов путей, в файле all.spawn. И всё будет работать как часы.&lt;br /&gt;
&lt;br /&gt;
Не забываем, при создании секций поинтов, к именам путей пришить имя смарт террэйна.&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn</id>
		<title>SoC. Respawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn"/>
				<updated>2009-05-21T16:33:08Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Респаун, один из самых часто задаваемый вопросов на форумах. Вот, решил написать статью, дабы не втирать одно и тоже каждому, кто не может с этим разобраться.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------'''RESPAWN NPC'''-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для создания респавна, понадобится два файла, '''all.spawn''' и '''spawn_section.ltx'''. Это минимальный набор. Для полной настройки респавнера, нужны ещё '''character_desc_simulation.xml''' и '''npc_profile.xml'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' В '''all.spawn''' создаём секцию респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты (x,y,z)&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 10&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 0&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если используется программа '''XrSpawner''', то копируем любую секцию &amp;quot;respawn&amp;quot;; меняем имя объекта, координаты, и в окошке &amp;quot;скрипт&amp;quot; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
'''respawn_section =''' id респавн-секций из файла '''spawn_section.ltx'''. Цифры после запятой, означают отношение одной секции к другой. Если планируется одинаковое колличество респавна из каждой секции, то цифры ставить не требуется.&lt;br /&gt;
'''max_count =''' колличество респавн-запросов за период времени, пока ГГ находится на уровне. При переходе на другой уровень, счётчик '''max_count''' сбрасывается. (ставить не обязательно)&lt;br /&gt;
'''min_count =''' минимальное колличество нпс, для экстренного респавна. (ставить не обязательно)&lt;br /&gt;
'''max_spawn =''' колличество нпс за один цикл респавна.&lt;br /&gt;
'''idle_spawn =''' тип спавна. Известно три типа '''medium, often, seldom'''. Обычно, используется тип '''medium'''.&lt;br /&gt;
'''conditions ='''Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:&lt;br /&gt;
'''conditions = {+инфо} 100, 0''' где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2.''' В файле '''spawn_section.ltx''', создаём респавн-секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[esc_urody_respawn_1]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_1&amp;quot;&lt;br /&gt;
character_profile = sim_urody_novice&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = bandit&lt;br /&gt;
&lt;br /&gt;
[esc_urody_respawn_2]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_2&amp;quot;&lt;br /&gt;
character_profile = sim_urody_regular&lt;br /&gt;
spec_rank = regular&lt;br /&gt;
community = bandit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
'''esc_urody_respawn_1''' id респавн-секции.&lt;br /&gt;
'''sim_urody_novice''' и '''sim_urody_regular''' классы профайлов нпс.&lt;br /&gt;
'''novice''' и '''regular''' ранги нпс.&lt;br /&gt;
'''bandit''' группировка нпс.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3.''' В файле '''npc_profile.xml''' регистрируем классы '''sim_urody_regular''' и '''sim_urody_novice'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;sim_urody_regular&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_regular&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;character id=&amp;quot;sim_urody_novice&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_novice&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём профили, в файле '''character_desc_simulation.xml''', с классами '''sim_urody_regular''' и '''sim_urody_novice''' и группировкой '''bandit'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------'''RESPAWN MUTANTOV'''-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
В принципе, респавн мутантов идентичен респавну нпс. Но с одним лишь отличием, которое его значительно упрощает.&lt;br /&gt;
Вся настройка респавна мутантов, ограничивается секцией в файле &amp;quot;all.spawn&amp;quot;.&lt;br /&gt;
Вписываем секцию респавнера, как указано в -'''RESPAWN NPC'''-.&lt;br /&gt;
Все настройки идентичны, кроме строки '''respawn_section = '''.&lt;br /&gt;
В ней прописываем типы мутантов, из файла &amp;quot;se_respawn.script&amp;quot;. Такие как '''flesh_weak, flesh_normal, dog_weak, boar_strong, и т.д.'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------'''ОБЩИЕ НАСТРОЙКИ'''--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Обязательные условия респавна:&lt;br /&gt;
&lt;br /&gt;
'''1.''' На уровне обязательно должен быть хоть один гулаг для респавнящихся нпс и мутантов. Так как колличество неписей для респавна, ориентируется по доступным местам в гулагах.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Респавн производится, только если под гулагами есть доступные работы.&lt;br /&gt;
&lt;br /&gt;
'''3.''' На каждом уровне, респавн ограничен определёнными типами неписей. Данные ограничения установлены в файле '''misc\smart_terrain_presets.ltx'''. Чтобы сделать возможным респавн неписей, не предусмотренных на данном уровне. Надо в секции нужного уровня, дописать требуемые типы неписей.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для проверки созданного респавнера, можно не ждать когда сработает системный респавн, а вызвать принудительно респавн в нужной секции. Для этого, прописываем в любой логике, вызов функции '''%=respawner_spawn(имя респавнера)%'''. Где, &amp;quot;имя респавнера&amp;quot; - имя секции, созданой в файле all.spawn. Скобки обязательны. &lt;br /&gt;
&lt;br /&gt;
Например, можно создать рядом с зоной респавнера, временный рестриктор. И в кастом дате рестриктора, прописать вызов функции принудительного вызова респавна, в нужном респавнере, при входе ГГ в зону рестриктора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[logic]&lt;br /&gt;
active = sr_idle@in&lt;br /&gt;
&lt;br /&gt;
[sr_idle@in]&lt;br /&gt;
on_actor_inside = %=respawner_spawn(имя респавнера)% sr_idle@out&lt;br /&gt;
&lt;br /&gt;
[sr_idle@out]&lt;br /&gt;
on_actor_outside = sr_idle@in&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция принудительного вызова респавна, находится в файле '''xr_effects.script'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------'''RESPAWN ITEMS'''-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Респавн инвентаря в инвентарных ящиках, несколько отличается от способа респавна неписей.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' Первое, что нам нужно сделать, это создать инвентарный ящик в файле &amp;quot;all.spawn&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = inventory_box&lt;br /&gt;
name =  имя ящика&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffffba&lt;br /&gt;
&lt;br /&gt;
story_id = ай-ди ящика&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = equipments\item_box_01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2.''' Затем, в файле '''game_story_id.ltx''' регистрируем id ящика. (выбираем любое свободное число).&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3.''' Создаём респавнер в файле '''all.spawn'''. Координаты и размеры зоны респавнера, должны быть такими, чтоб инвентарный ящик поместился внутри зоны респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 2&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = список вещей респавна&lt;br /&gt;
idle_spawn = -1&lt;br /&gt;
parent = ай-ди ящика&lt;br /&gt;
item_spawn = true&lt;br /&gt;
max_count = 7&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 0.5,0,0   (ширина зоны респавнера, по X)&lt;br /&gt;
shape0:axis_y = 0,0.5,0   (высота зоны респавнера)&lt;br /&gt;
shape0:axis_z = 0,0,1     (ширина зоны респавнера, по Z)&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''respawn_section =''' список вещей респавна. Как и в респавнерах неписей, возможна прописка соотношений между вещами. Например:&lt;br /&gt;
                      respawn_section = wpn_pm,2, vodka,2, medkit,1, energy_drink,2, ammo_9x18_fmj,3  &lt;br /&gt;
&lt;br /&gt;
'''idle_spawn =''' тип спавна. Инвентарь не имеет типов спавна, поэтому ставится (-1).&lt;br /&gt;
&lt;br /&gt;
'''parent =''' ай-ди инвентарного ящика, в котором производить респавн вещей.&lt;br /&gt;
&lt;br /&gt;
'''item_spawn =''' (true\false) возможность включения и отключения респавна. Можно задавать условия.&lt;br /&gt;
&lt;br /&gt;
'''max_count =''' количество респав-циклов за определённый период времени. (Пока ГГ находится на уровне. После перехода ГГ на другой уровень, счётчик сбрасывается).&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём вызов респавна. Обычно вызов производится из '''smart_terrain'''. В &amp;quot;custom_data&amp;quot; любого подходящего '''smart_terrain''', под секцией [smart_terrain], вписываем вызов респавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[smart_terrain]&lt;br /&gt;
respawn = имя респавнера &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И респавн будет производиться, при каждом пополнении нпс, под данным смартом.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Автор статьи '''Singapur22'''.&lt;br /&gt;
[[Категория:скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-21T16:30:57Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-20T07:36:24Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле «script».&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом «'''smart_terrain'''» в файле «'''all.spawn'''» и гулаг в файле «'''gulag_уровень.script'''». Назначим ему имя, например «kakashki».&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции «'''load_ltx'''».&lt;br /&gt;
Для этого находим нужную функцию «'''load_ltx'''», и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная «ltx» может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле «'''all.spawn'''», и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-20T07:35:02Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле &amp;quot;script&amp;quot;.&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом &amp;quot;'''smart_terrain'''&amp;quot; в файле &amp;quot;'''all.spawn'''&amp;quot; и гулаг в файле &amp;quot;'''gulag_уровень.script'''&amp;quot;. Назначим ему имя, например &amp;quot;kakashki&amp;quot;.&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть в упомянутой выше функции &amp;quot;'''load_ltx'''&amp;quot;.&lt;br /&gt;
Для этого находим нужную функцию &amp;quot;'''load_ltx'''&amp;quot;, и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная &amp;quot;ltx&amp;quot; может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле &amp;quot;'''all.spawn'''&amp;quot;, и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: '''Singapur22'''&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)</id>
		<title>SoC. Гулаги (динамические LTX)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%93%D1%83%D0%BB%D0%B0%D0%B3%D0%B8_(%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_LTX)"/>
				<updated>2009-05-20T07:30:36Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;При создании гулага, не многие знают, что практически всю настройку логики гулагов, можно производить в файле &amp;quot;script&amp;quot;.&lt;br /&gt;
Такой способ построения достигается за счёт динамических ltx.&lt;br /&gt;
Попробую описать, каким образом это достигается. Я думаю, многие заметили в файлах с гулагами такую функцию:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это именно та функция, которая и отвечает за динамические ltx. В данном случае, она отключена.&lt;br /&gt;
Разберём простейший способ построения динамических ltx.&lt;br /&gt;
&lt;br /&gt;
Создаём стандартным способом &amp;quot;smart_terrain&amp;quot; в файле &amp;quot;all.spawn&amp;quot; и гулаг в файле &amp;quot;gulag_уровень.script&amp;quot;. Назначим ему имя, например &amp;quot;kakashki&amp;quot;.&lt;br /&gt;
Задаём ему несколько заданий. Например, зададим 3 кампа и двух уолкеров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;	if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
			&lt;br /&gt;
	                for i = 1, 3 do&lt;br /&gt;
             &lt;br /&gt;
	                        t = { section = &amp;quot;logic@kakashki_kamp&amp;quot;,&lt;br /&gt;
					idle = 0,&lt;br /&gt;
					prior = 8-i, state = {0,1},&lt;br /&gt;
					in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
				table.insert(sj, t)&lt;br /&gt;
			end&lt;br /&gt;
                        &lt;br /&gt;
                        for i = 1, 2 do&lt;br /&gt;
			&lt;br /&gt;
			        t = { section = &amp;quot;logic@kakashki_walker_&amp;quot;..i,&lt;br /&gt;
				        idle = 0,&lt;br /&gt;
				        prior = 9-i, state = {0,1},&lt;br /&gt;
				        in_rest = &amp;quot;&amp;quot;, out_rest = &amp;quot;&amp;quot;&lt;br /&gt;
			        }&lt;br /&gt;
			        table.insert(sj, t)&lt;br /&gt;
                        end		&lt;br /&gt;
&lt;br /&gt;
	end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как мы собираемся использовать динамические ltx, то дальнейшая настройка заданий будет производиться не в конфигурационных файлах, а непосредственно в этом же файле. То есть &lt;br /&gt;
&lt;br /&gt;
 в упомянутой выше функции &amp;quot;&amp;lt;big&amp;gt;load_ltx&amp;lt;/big&amp;gt;&amp;quot;. Для этого находим нужную функцию &amp;quot;&amp;lt;big&amp;gt;load_ltx&amp;lt;/big&amp;gt;&amp;quot;, и в ней создаём динамический ltx и прописываем требуемые схемы логики:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;--'------------------------------------------------------------------------&lt;br /&gt;
--' Dynamic ltx&lt;br /&gt;
--'------------------------------------------------------------------------&lt;br /&gt;
function load_ltx(gname, type)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if type == &amp;quot;kakashki&amp;quot; then&lt;br /&gt;
    local ltx = &amp;quot;[logic@kakashki_kamp]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;active = kamp@kakashki\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
	        &amp;quot;[kamp@kakashki]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;center_point = kamp\n&amp;quot;..&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
			&lt;br /&gt;
		&amp;quot;[logic@kakashki_walker_1]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_1\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_1]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_1\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_1\n&amp;quot;..&lt;br /&gt;
&lt;br /&gt;
                 &lt;br /&gt;
&lt;br /&gt;
                &amp;quot;[logic@kakashki_walker_2]\n&amp;quot;..&lt;br /&gt;
	        &amp;quot;active = walker@kakashki_2\n&amp;quot;..&lt;br /&gt;
                             &lt;br /&gt;
		&amp;quot;[walker@kakashki_2]\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_walk = walk_2\n&amp;quot;..&lt;br /&gt;
		&amp;quot;path_look = look_2\n&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
	return ltx&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где, кавычки обязательны, {\n} назначает новую строку в динамическом ltx, и {..} ставится для привязки строк между собой.&lt;br /&gt;
В последней строке схем, двоеточие ставить не нужно, так как привязывать больше нечего.&lt;br /&gt;
Переменная &amp;quot;ltx&amp;quot; может иметь любое другое имя.&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
Теперь создаём вэйпоинты путей, в файле &amp;quot;&amp;lt;sub&amp;gt;all.spawn&amp;lt;/sub&amp;gt;&amp;quot;, и можно смело идти проверять.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Продолжение следует.&lt;br /&gt;
&lt;br /&gt;
Автор: &amp;lt;big&amp;gt;Singapur22&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn</id>
		<title>SoC. Respawn</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._Respawn"/>
				<updated>2009-05-20T03:24:55Z</updated>
		
		<summary type="html">&lt;p&gt;Singapur22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Респаун, один из самых часто задаваемый вопросов на форумах. Вот, решил написать статью, дабы не втирать одно и тоже каждому, кто не может с этим разобраться.&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------'''RESPAWN NPC'''-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для создания респавна, понадобится два файла, '''all.spawn''' и '''spawn_section.ltx'''. Это минимальный набор. Для полной настройки респавнера, нужны ещё '''character_desc_simulation.xml''' и '''npc_profile.xml'''.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' В '''all.spawn''' создаём секцию респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты (x,y,z)&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 10&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = sphere&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
shape0:radius = 1&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 0&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если используется программа '''XrSpawner''', то копируем любую секцию &amp;quot;respawn&amp;quot;; меняем имя объекта, координаты, и в окошке &amp;quot;скрипт&amp;quot; прописываем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[respawn]&lt;br /&gt;
respawn_section = esc_urody_respawn_1,12, esc_urody_respawn_2,9&lt;br /&gt;
max_count = 8&lt;br /&gt;
min_count = 4&lt;br /&gt;
max_spawn = 2&lt;br /&gt;
idle_spawn = medium&lt;br /&gt;
conditions = 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
'''respawn_section =''' id респавн-секций из файла '''spawn_section.ltx'''. Цифры после запятой, означают отношение одной секции к другой. Если планируется одинаковое колличество респавна из каждой секции, то цифры ставить не требуется.&lt;br /&gt;
'''max_count =''' колличество респавн-запросов за период времени, пока ГГ находится на уровне. При переходе на другой уровень, счётчик '''max_count''' сбрасывается. (ставить не обязательно)&lt;br /&gt;
'''min_count =''' минимальное колличество нпс, для экстренного респавна. (ставить не обязательно)&lt;br /&gt;
'''max_spawn =''' колличество нпс за один цикл респавна.&lt;br /&gt;
'''idle_spawn =''' тип спавна. Известно три типа '''medium, often, seldom'''. Обычно, используется тип '''medium'''.&lt;br /&gt;
'''conditions ='''Условие респавна. Можно установить проверку условий (инфопоршень), где респавн будет происходить только при выполнении условия. Номер означает общий процент выполнения респавна. Например так:&lt;br /&gt;
'''conditions = {+инфо} 100, 0''' где, респавн будет происходить со сто-процентной вероятностью, только при наличии установленного инфопоршна.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2.''' В файле '''spawn_section.ltx''', создаём респавн-секции:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[esc_urody_respawn_1]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_1&amp;quot;&lt;br /&gt;
character_profile = sim_urody_novice&lt;br /&gt;
spec_rank = novice&lt;br /&gt;
community = bandit&lt;br /&gt;
&lt;br /&gt;
[esc_urody_respawn_2]:stalker&lt;br /&gt;
$spawn = &amp;quot;respawn\esc_urody_respawn_2&amp;quot;&lt;br /&gt;
character_profile = sim_urody_regular&lt;br /&gt;
spec_rank = regular&lt;br /&gt;
community = bandit&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где:&lt;br /&gt;
'''esc_urody_respawn_1''' id респавн-секции.&lt;br /&gt;
'''sim_urody_novice''' и '''sim_urody_regular''' классы профайлов нпс.&lt;br /&gt;
'''novice''' и '''regular''' ранги нпс.&lt;br /&gt;
'''bandit''' группировка нпс.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3.''' В файле '''npc_profile.xml''' регистрируем классы '''sim_urody_regular''' и '''sim_urody_novice'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;character id=&amp;quot;sim_urody_regular&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_regular&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;character id=&amp;quot;sim_urody_novice&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;class&amp;gt;sim_urody_novice&amp;lt;/class&amp;gt;&lt;br /&gt;
&amp;lt;/character&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём профили, в файле '''character_desc_simulation.xml''', с классами '''sim_urody_regular''' и '''sim_urody_novice''' и группировкой '''bandit'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------'''RESPAWN MUTANTOV'''-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
В принципе, респавн мутантов идентичен респавну нпс. Но с одним лишь отличием, которое его значительно упрощает.&lt;br /&gt;
Вся настройка респавна мутантов, ограничивается секцией в файле &amp;quot;all.spawn&amp;quot;.&lt;br /&gt;
Вписываем секцию респавнера, как указано в -'''RESPAWN NPC'''-.&lt;br /&gt;
Все настройки идентичны, кроме строки '''respawn_section = '''.&lt;br /&gt;
В ней прописываем типы мутантов, из файла &amp;quot;se_respawn.script&amp;quot;. Такие как '''flesh_weak, flesh_normal, dog_weak, boar_strong, и т.д.'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------'''ОБЩИЕ НАСТРОЙКИ'''--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Обязательные условия респавна:&lt;br /&gt;
&lt;br /&gt;
'''1.''' На уровне обязательно должен быть хоть один гулаг для респавнящихся нпс и мутантов. Так как колличество неписей для респавна, ориентируется по доступным местам в гулагах.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Респавн производится, только если под гулагами есть доступные работы.&lt;br /&gt;
&lt;br /&gt;
'''3.''' На каждом уровне, респавн ограничен определёнными типами неписей. Данные ограничения установлены в файле '''misc\smart_terrain_presets.ltx'''. Чтобы сделать возможным респавн неписей, не предусмотренных на данном уровне. Надо в секции нужного уровня, дописать требуемые типы неписей.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Для проверки созданного респавнера, можно не ждать когда сработает системный респавн, а вызвать принудительно респавн в нужной секции. Для этого, прописываем в любой логике, вызов функции '''%=respawner_spawn(имя респавнера)%'''. Где, &amp;quot;имя респавнера&amp;quot; - имя секции, созданой в файле all.spawn. Скобки обязательны. &lt;br /&gt;
&lt;br /&gt;
Например, можно создать рядом с зоной респавнера, временный рестриктор. И в кастом дате рестриктора, прописать вызов функции принудительного вызова респавна, в нужном респавнере, при входе ГГ в зону рестриктора:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[logic]&lt;br /&gt;
active = sr_idle@in&lt;br /&gt;
&lt;br /&gt;
[sr_idle@in]&lt;br /&gt;
on_actor_inside = %=respawner_spawn(имя респавнера)% sr_idle@out&lt;br /&gt;
&lt;br /&gt;
[sr_idle@out]&lt;br /&gt;
on_actor_outside = sr_idle@in&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция принудительного вызова респавна, находится в файле '''xr_effects.script'''.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------'''RESPAWN ITEMS'''-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Респавн инвентаря в инвентарных ящиках, несколько отличается от способа респавна неписей.&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''1.''' Первое, что нам нужно сделать, это создать инвентарный ящик в файле &amp;quot;all.spawn&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10000]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = inventory_box&lt;br /&gt;
name =  имя ящика&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 0&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffffba&lt;br /&gt;
&lt;br /&gt;
story_id = ай-ди ящика&lt;br /&gt;
&lt;br /&gt;
; cse_visual properties&lt;br /&gt;
visual_name = equipments\item_box_01&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''2.''' Затем, в файле '''game_story_id.ltx''' регистрируем id ящика. (выбираем любое свободное число).&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''3.''' Создаём респавнер в файле '''all.spawn'''. Координаты и размеры зоны респавнера, должны быть такими, чтоб инвентарный ящик поместился внутри зоны респавнера:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[10001]&lt;br /&gt;
; cse_abstract properties&lt;br /&gt;
section_name = respawn&lt;br /&gt;
name = имя респавнера&lt;br /&gt;
position = координаты x,y,z&lt;br /&gt;
direction = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_object properties&lt;br /&gt;
game_vertex_id = гейм-вертекс&lt;br /&gt;
distance = 2&lt;br /&gt;
level_vertex_id = левел-вертекс&lt;br /&gt;
object_flags = 0xffffff3e&lt;br /&gt;
custom_data = &amp;lt;&amp;lt;END&lt;br /&gt;
[respawn]&lt;br /&gt;
respawn_section = список вещей респавна&lt;br /&gt;
idle_spawn = -1&lt;br /&gt;
parent = ай-ди ящика&lt;br /&gt;
item_spawn = true&lt;br /&gt;
max_count = 7&lt;br /&gt;
END&lt;br /&gt;
&lt;br /&gt;
; cse_shape properties&lt;br /&gt;
shapes = shape0&lt;br /&gt;
shape0:type = box&lt;br /&gt;
shape0:axis_x = 0.5,0,0   (ширина зоны респавнера, по X)&lt;br /&gt;
shape0:axis_y = 0,0.5,0   (высота зоны респавнера)&lt;br /&gt;
shape0:axis_z = 0,0,1     (ширина зоны респавнера, по Z)&lt;br /&gt;
shape0:offset = 0,0,0&lt;br /&gt;
&lt;br /&gt;
; cse_alife_space_restrictor properties&lt;br /&gt;
restrictor_type = 3&lt;br /&gt;
&lt;br /&gt;
; se_respawn properties&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где: &lt;br /&gt;
&lt;br /&gt;
'''respawn_section =''' список вещей респавна. Как и в респавнерах неписей, возможна прописка соотношений между вещами. Например:&lt;br /&gt;
                      respawn_section = wpn_pm,2, vodka,2, medkit,1, energy_drink,2, ammo_9x18_fmj,3  &lt;br /&gt;
&lt;br /&gt;
'''idle_spawn =''' тип спавна. Инвентарь не имеет типов спавна, поэтому ставится (-1).&lt;br /&gt;
&lt;br /&gt;
'''parent =''' ай-ди инвентарного ящика, в котором производить респавн вещей.&lt;br /&gt;
&lt;br /&gt;
'''item_spawn =''' (true\false) возможность включения и отключения респавна. Можно задавать условия.&lt;br /&gt;
&lt;br /&gt;
'''max_count =''' количество респав-циклов за определённый период времени. (Пока ГГ находится на уровне. После перехода ГГ на другой уровень, счётчик сбрасывается).&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
'''4.''' Создаём вызов респавна. Обычно вызов производится из '''smart_terrain'''. В &amp;quot;custom_data&amp;quot; любого подходящего '''smart_terrain''', под секцией [smart_terrain], вписываем вызов респавна:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;[smart_terrain]&lt;br /&gt;
respawn = имя респавнера &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И респавн будет производиться, при каждом пополнении нпс, под данным смартом.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Автор статьи '''Singapur22'''.&lt;/div&gt;</summary>
		<author><name>Singapur22</name></author>	</entry>

	</feed>