<?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=188.134.33.164&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.134.33.164&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.134.33.164"/>
		<updated>2026-04-29T19:31:26Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%A7%D0%90%D0%AD%D0%A1</id>
		<title>Выброс на ЧАЭС</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%A7%D0%90%D0%AD%D0%A1"/>
				<updated>2012-05-25T07:56:49Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: /* Отключаем эффекты серую окр.среду и эффекты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Открываем sr_aes_deadzone.script&lt;br /&gt;
&lt;br /&gt;
== Отключение повреждение ==&lt;br /&gt;
В функции action_postprocess:update_hit (delta) удаляем строки: db.actor:hit (h) и db.actor:hit (h);.&lt;br /&gt;
&lt;br /&gt;
== Отключаем эффекты серую окр.среду и эффекты ==&lt;br /&gt;
В функции '''action_postprocess:reset_scheme ()''' значение self.gray_amplitude = 1.0 меняем на self.gray_amplitude = 0.0&lt;br /&gt;
&lt;br /&gt;
Так, повреждения актору отключили, серую окр.среду отключили. Но у нас остались точки на экране и двоится в глазах ГГ. Уберем PPEffector. Убираем строки из action_postprocess:reset_scheme ():&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
	self.pp 							= PPEffector (self.object:id () + 2000, self);&lt;br /&gt;
	self.pp.params.noise				= noise ();&lt;br /&gt;
	self.pp:start						();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы вывели из строя схему sr_aes_deadzone. За землетрясение отвечает xr_effects.aes_earthshake(npc)&lt;br /&gt;
&lt;br /&gt;
== Автор статьи ==&lt;br /&gt;
[[Участник:vllzl]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</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>2012-05-25T07:52:31Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: /* Дополняет авторы: vllzl */&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.&lt;br /&gt;
&lt;br /&gt;
Ниже я привожу код функции, которая создает и инициализирует level_changer (пишется в созданный нами файл '''_freeplay_sa.script'''): НИЧЕГО НЕ ПОДСТАВЛЯЙТЕ! &lt;br /&gt;
&amp;lt;lua&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;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Часть 2. '''Создание точек перехода''' ==&lt;br /&gt;
&lt;br /&gt;
Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты (тоже в файл '''_freeplay_sa.script''')&lt;br /&gt;
&amp;lt;lua&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;/lua&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;lua&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;/lua&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&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;br /&gt;
== Дополняет авторы: vllzl ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
«По-честному» (скриптом, без модификации ''all.spawn'') таймер выброса отключить не получится.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно удалить таймер скриптом (удаляет рестриктор из игры)&lt;br /&gt;
Для этого в начале всех функций в sr_timer.script и sr_aes_deadzone.script написать:&lt;br /&gt;
&amp;lt;code&amp;gt;if not has_alife_info(&amp;quot;freeplay_activated1&amp;quot;) or (&amp;quot;freeplay_activated2&amp;quot;) then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Удалит таймер и выброс из игры во фриплее. Vllzl&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D0%BC%D0%BE%D0%B4_%D0%BD%D0%B0_5%2B</id>
		<title>Создаем мод на 5+</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D0%BC%D0%BE%D0%B4_%D0%BD%D0%B0_5%2B"/>
				<updated>2012-05-25T07:44:02Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: Новая страница: «== Фриплей == #REDIRECT SoC. Спавн точек перехода между уровнями Потом в файлах sr_aes_deadzone.script и sr_ti...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Фриплей ==&lt;br /&gt;
#REDIRECT [[SoC. Спавн точек перехода между уровнями]]&lt;br /&gt;
Потом в файлах sr_aes_deadzone.script и sr_timer.script в начале всех функций пиши:&lt;br /&gt;
&amp;lt;code&amp;gt;if not has_alife_info(&amp;quot;freeplay_activated1&amp;quot;) or (&amp;quot;freeplay_activated2&amp;quot;) then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Квесты ==&lt;br /&gt;
#REDIRECT [[SoC. Однотипные квесты]]&lt;br /&gt;
&lt;br /&gt;
== Диалог ==&lt;br /&gt;
#REDIRECT [[SoC. Создание диалогов]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D1%84%D1%80%D0%B8%D0%BF%D0%BB%D0%B5%D0%B9_%D0%B7%D0%B0_%D0%BF%D0%B0%D1%80%D1%83-%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D1%83_%D0%BC%D0%B8%D0%BD%D1%83%D1%82.</id>
		<title>SoC. Создаем фриплей за пару-тройку минут.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D1%84%D1%80%D0%B8%D0%BF%D0%BB%D0%B5%D0%B9_%D0%B7%D0%B0_%D0%BF%D0%B0%D1%80%D1%83-%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D1%83_%D0%BC%D0%B8%D0%BD%D1%83%D1%82."/>
				<updated>2012-05-24T15:26:12Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: /* Сами скрипты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Отключение смертельных зон на ЧАЭС-2 ==&lt;br /&gt;
Открываем '''sr_aes_deadzone.script'''. В начале функций: action_postprocess:reset_scheme (), action_postprocess:deactivate(), action_postprocess:update_params (), action_postprocess:update_hit (delta) напишите это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Это значит, что «зона» будет работать до подачи этого поршня. Но поршня нету.&lt;br /&gt;
&lt;br /&gt;
== Поршни ==&lt;br /&gt;
Открывает config/gameplay/info_l19stanciya.xml&lt;br /&gt;
Туда дописываем где-нибудь:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;game_end&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Таймеры на ЧАЭС-1 и в X-16 ==&lt;br /&gt;
В файле '''sr_timer.script''' все свяжем с новым поршнем freeplay. Опустошите файл и напишите в нем:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Таймер с выводом изображения на экран.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local k,v = 0,0&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;action_timer&amp;quot;&lt;br /&gt;
function action_timer:__init(obj, storage)&lt;br /&gt;
	self.object = obj&lt;br /&gt;
	self.st = storage&lt;br /&gt;
end&lt;br /&gt;
function action_timer:update(delta)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	local actor = db.actor&lt;br /&gt;
	if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	-- Высчитываем сколько времени уже работает счетчик&lt;br /&gt;
	local nn = time_global() - db.storage[self.object:id()].activation_time&lt;br /&gt;
	&lt;br /&gt;
	-- Изменяем значение счетчика&lt;br /&gt;
	local value_time = 0&lt;br /&gt;
	if self.st.type == &amp;quot;inc&amp;quot; then&lt;br /&gt;
		value_time = self.st.start_value + nn&lt;br /&gt;
	else&lt;br /&gt;
		value_time = self.st.start_value - nn&lt;br /&gt;
	end&lt;br /&gt;
	if value_time &amp;lt;= 0 then&lt;br /&gt;
		value_time = 0&lt;br /&gt;
	end&lt;br /&gt;
	-- Формируем строку счетчика&lt;br /&gt;
	local hours = math.floor(value_time/3600000)&lt;br /&gt;
	local minutes = math.floor(value_time/60000 - hours*60)&lt;br /&gt;
	local seconds = math.floor(value_time/1000 - hours*3600 - minutes*60)&lt;br /&gt;
	local str = tostring(hours)..&amp;quot;:&amp;quot;..sr_timer.time2str(minutes)..&amp;quot;:&amp;quot;..sr_timer.time2str(seconds)&lt;br /&gt;
&lt;br /&gt;
	self.st.timer:SetTextST(str)&lt;br /&gt;
&lt;br /&gt;
	-- Определяем нужно ли куда то переходить.&lt;br /&gt;
	for k,v in pairs(self.st.on_value) do&lt;br /&gt;
		if (self.st.type == &amp;quot;dec&amp;quot; and value_time &amp;lt;= v.dist) or&lt;br /&gt;
		   (self.st.type == &amp;quot;inc&amp;quot; and value_time &amp;gt;= v.dist)&lt;br /&gt;
		then&lt;br /&gt;
			-- Обработка значения.&lt;br /&gt;
			xr_logic.switch_to_section(self.object, self.st, xr_logic.pick_section_from_condlist(db.actor, self.object, v.state))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
function action_timer:deactivate(delta)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	self.st.ui:RemoveCustomStatic(self.st.timer_id)&lt;br /&gt;
	if self.st.string ~= nil then&lt;br /&gt;
		self.st.ui:RemoveCustomStatic(&amp;quot;hud_timer_text&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
--function action_timer:save()&lt;br /&gt;
--	xr_logic.pstor_store( self.object, &amp;quot;timer_value&amp;quot;, self.state )	&lt;br /&gt;
--end&lt;br /&gt;
&lt;br /&gt;
function time2str(n)&lt;br /&gt;
	if n &amp;gt;= 10 then&lt;br /&gt;
		return tostring(n)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;0&amp;quot;..tostring(n)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
function add_to_binder(obj, ini, scheme, section, storage)&lt;br /&gt;
	local action = action_timer(obj, storage)&lt;br /&gt;
	xr_logic.subscribe_action_for_events(obj, storage, action)&lt;br /&gt;
end&lt;br /&gt;
function set_scheme(obj, ini, scheme, section, gulag_name)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	local st = xr_logic.assign_storage_and_bind(obj, ini, scheme, section)&lt;br /&gt;
	st.logic = xr_logic.cfg_get_switch_conditions(ini, section, obj)&lt;br /&gt;
	st.type = utils.cfg_get_string( ini, section, &amp;quot;type&amp;quot;, obj, false, &amp;quot;&amp;quot;, &amp;quot;inc&amp;quot;)&lt;br /&gt;
	if st.type ~= &amp;quot;inc&amp;quot; and st.type ~= &amp;quot;dec&amp;quot; then&lt;br /&gt;
		abort(&amp;quot;ERROR: wrong sr_timer type. Section [%s], Restrictor [%s]&amp;quot;, section, obj:name())&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if st.type == &amp;quot;dec&amp;quot; then&lt;br /&gt;
		st.start_value = utils.cfg_get_number(ini, section, &amp;quot;start_value&amp;quot;, obj, true)&lt;br /&gt;
	else&lt;br /&gt;
		st.start_value = utils.cfg_get_number(ini, section, &amp;quot;start_value&amp;quot;, obj, false, 0)&lt;br /&gt;
	end&lt;br /&gt;
	-- Вычитываем значения перехода.&lt;br /&gt;
	st.on_value = parse_data(obj, utils.cfg_get_string(ini, section, &amp;quot;on_value&amp;quot;, obj, false, &amp;quot;&amp;quot;))&lt;br /&gt;
	st.timer_id = utils.cfg_get_string( ini, section, &amp;quot;timer_id&amp;quot;, obj, false, &amp;quot;&amp;quot;, &amp;quot;hud_timer&amp;quot;)&lt;br /&gt;
	st.string	= utils.cfg_get_string( ini, section, &amp;quot;string&amp;quot;, obj, false, &amp;quot;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	st.ui = get_hud()&lt;br /&gt;
	st.ui:AddCustomStatic(st.timer_id, true)&lt;br /&gt;
	st.timer = st.ui:GetCustomStatic(st.timer_id):wnd()&lt;br /&gt;
	&lt;br /&gt;
	if st.string ~= nil then&lt;br /&gt;
		st.ui:AddCustomStatic(&amp;quot;hud_timer_text&amp;quot;, true)&lt;br /&gt;
		local timer_text = st.ui:GetCustomStatic(&amp;quot;hud_timer_text&amp;quot;):wnd()&lt;br /&gt;
		timer_text:SetTextST(st.string)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_data(npc,s)&lt;br /&gt;
	local t = {}&lt;br /&gt;
&lt;br /&gt;
    if s then&lt;br /&gt;
		for name in string.gfind( s, &amp;quot;(%|*%d+%|[^%|]+)%p*&amp;quot; ) do&lt;br /&gt;
			local dat = {	dist = nil,&lt;br /&gt;
							state = nil}	&lt;br /&gt;
			&lt;br /&gt;
			local t_pos = string.find( name, &amp;quot;|&amp;quot;, 1, true )&lt;br /&gt;
						&lt;br /&gt;
			local dist = string.sub( name, 1, t_pos - 1 )&lt;br /&gt;
			local state	= string.sub( name, t_pos + 1)&lt;br /&gt;
			&lt;br /&gt;
				&lt;br /&gt;
			dat.dist = tonumber(dist)&lt;br /&gt;
			if state then&lt;br /&gt;
				dat.state = xr_logic.parse_condlist(npc, dist, state, state)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(t, dat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Землетрясение и подключение скриптов ==&lt;br /&gt;
Находим функцию xr_effects.aes_earthshake в начале напишите:&lt;br /&gt;
&amp;lt;code&amp;gt;if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем ui_credits.xml. &lt;br /&gt;
Находим:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;function_on_stop&amp;gt;xr_effects.after_credits&amp;lt;/function_on_stop&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Меняем на:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;function_on_stop&amp;gt;freeplay.set_lchanger&amp;lt;/function_on_stop&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Сами скрипты ==&lt;br /&gt;
Создаем в папке /scripts файл freeplay.script. Пихаем туда:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
-- Спавним левел-чейнджер&lt;br /&gt;
function spawn_level_changer(sid, from_pos, from_level, dest_pos, dest_level, hint, mode, dest_dir)&lt;br /&gt;
&lt;br /&gt;
local vertexes = {&lt;br /&gt;
l01_escape = {lvid=594266, gvid=0},&lt;br /&gt;
l04_darkvalley = {lvid=121712, gvid=815},&lt;br /&gt;
l11_pripyat = {lvid=142116, gvid=2270},&lt;br /&gt;
l12_stancia = {lvid=405348, gvid=2400},&lt;br /&gt;
l12_stancia_2 = {lvid=9914, gvid=2517}&lt;br /&gt;
-- l12_stancia_2 = {lvid=227423, gvid=2635}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj = alife():create(&amp;quot;level_changer&amp;quot;, from_pos, vertexes[from_level][&amp;quot;lvid&amp;quot;], vertexes[from_level][&amp;quot;gvid&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
if obj then&lt;br /&gt;
&lt;br /&gt;
	level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, hint)&lt;br /&gt;
&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
&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_s32()&lt;br /&gt;
	local level_vertex_id = packet:r_s32()&lt;br /&gt;
	local object_flags = packet:r_s32()&lt;br /&gt;
	local custom_data = packet:r_stringZ()&lt;br /&gt;
	local story_id = packet:r_s32()&lt;br /&gt;
	local cse_alife_object__unk3_u32 = packet:r_s32()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	local shape_count = packet:r_u8()&lt;br /&gt;
	local shape_type&lt;br /&gt;
	local center&lt;br /&gt;
	local radius&lt;br /&gt;
&lt;br /&gt;
	if shape_count == 0 then&lt;br /&gt;
		shape_type = 0&lt;br /&gt;
		center = vector():set(0,0,0)&lt;br /&gt;
		radius = 10.0&lt;br /&gt;
		shape_count = 1&lt;br /&gt;
	else&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;
				local center = packet:r_vec3()&lt;br /&gt;
				local radius = packet:r_float()&lt;br /&gt;
			else&lt;br /&gt;
				local v1 = packet:r_vec3()&lt;br /&gt;
				local v2 = packet:r_vec3()&lt;br /&gt;
				local v3 = packet:r_vec3()&lt;br /&gt;
				local v4 = packet:r_vec3()&lt;br /&gt;
			end&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_alife_level_changer&lt;br /&gt;
	local dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	local dest_level_vertex_id = packet:r_s32()&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;
	if packet:r_elapsed() ~= 0 then get_console():execute(&amp;quot;left=&amp;quot;..packet:r_elapsed()) end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_object&lt;br /&gt;
	packet:w_u16(game_vertex_id)&lt;br /&gt;
	packet:w_float(cse_alife_object__unk1_f32)&lt;br /&gt;
	packet:w_s32(cse_alife_object__unk2_u32)&lt;br /&gt;
	packet:w_s32(level_vertex_id)&lt;br /&gt;
	packet:w_s32(object_flags)&lt;br /&gt;
	packet:w_stringZ(custom_data)&lt;br /&gt;
	packet:w_s32(sid)&lt;br /&gt;
	packet:w_s32(cse_alife_object__unk3_u32)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	packet:w_u8(shape_count)&lt;br /&gt;
&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		packet:w_u8(shape_type)&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,0))&lt;br /&gt;
			packet:w_float(3)&lt;br /&gt;
		else&lt;br /&gt;
			packet:w_vec3(vector():set(3,0,0))&lt;br /&gt;
			packet:w_vec3(vector():set(0,3,0))&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,3))&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,0))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_space_restrictor&lt;br /&gt;
	packet:w_u8(restrictor_type)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_level_changer&lt;br /&gt;
	packet:w_u16(vertexes[dest_level][&amp;quot;gvid&amp;quot;])&lt;br /&gt;
	packet:w_s32(vertexes[dest_level][&amp;quot;lvid&amp;quot;])&lt;br /&gt;
	packet:w_vec3(dest_pos)&lt;br /&gt;
	if dest_dir then &lt;br /&gt;
		packet:w_vec3(dest_dir)&lt;br /&gt;
	else&lt;br /&gt;
		packet:w_vec3(dest_direction)&lt;br /&gt;
	end&lt;br /&gt;
	packet:w_stringZ(dest_level)&lt;br /&gt;
	packet:w_stringZ(dest_graph_point)&lt;br /&gt;
	packet:w_u8(mode)&lt;br /&gt;
&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Удаление лишних переходов&lt;br /&gt;
function disable_sar_entrance()&lt;br /&gt;
for i=1,65535 do&lt;br /&gt;
	local obj = alife():object(i)&lt;br /&gt;
	if obj and obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; then&lt;br /&gt;
		alife():release(obj, true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Спавн всех нужных переходов&lt;br /&gt;
function set_lchanger()&lt;br /&gt;
&lt;br /&gt;
if not db.actor or not has_alife_info(&amp;quot;game_end&amp;quot;) then&lt;br /&gt;
	xr_effects.after_credits()&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
level.add_pp_effector(&amp;quot;teleport.ppe&amp;quot;, 2008, false)&lt;br /&gt;
&lt;br /&gt;
-- Кордон - Темная долина&lt;br /&gt;
spawn_level_changer(6001, vector():set(368.9,15.17,-42.65), &amp;quot;l01_escape&amp;quot;, vector():set(-44.77, 0.43, -541.35), &amp;quot;l04_darkvalley&amp;quot;, &amp;quot;to_darkvalley&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС - Припять&lt;br /&gt;
spawn_level_changer(6002, vector():set(918.1,-0.1,-401.96), &amp;quot;l12_stancia&amp;quot;, vector():set(31.28,1.135,420.61), &amp;quot;l11_pripyat&amp;quot;, &amp;quot;to_pripyat&amp;quot;, 0, vector():set(0,-3.1,0))&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС2 - ЧАЭС&lt;br /&gt;
-- spawn_level_changer(6003, vector():set(554.52,150,201), &amp;quot;l12_stancia_2&amp;quot;, vector():set(117.6,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, &amp;quot;to_aes&amp;quot;, 1, vector():set(0,-1.5,0))&lt;br /&gt;
spawn_level_changer(6003, vector():set(-42.15,-0.02,56.03), &amp;quot;l12_stancia_2&amp;quot;, vector():set(126,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, &amp;quot;to_aes&amp;quot;, 0, vector():set(0,-1.5,0))&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС - ЧАЭС2&lt;br /&gt;
spawn_level_changer(6004, vector():set(117.6,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, vector():set(-42.15,-0.02,64), &amp;quot;l12_stancia_2&amp;quot;, &amp;quot;to_aes&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
-- Удаление лишних переходов&lt;br /&gt;
disable_sar_entrance()&lt;br /&gt;
&lt;br /&gt;
-- Перемещаем актора, засчитываем все задания&lt;br /&gt;
db.actor:set_actor_position(vector():set(1035.12,-0.0999,229.564))&lt;br /&gt;
set_complete_tasks()&lt;br /&gt;
&lt;br /&gt;
-- Ставим стандартную погоду&lt;br /&gt;
level.set_weather(&amp;quot;default&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Пометим&lt;br /&gt;
mark_lc()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Отмечаем на карте новые точки перехода&lt;br /&gt;
function mark_lc()&lt;br /&gt;
local obj = alife():story_object(6001)&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_darkvalley&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
local obj = alife():story_object(6002)&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;
local obj = alife():story_object(6003)&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_aes&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
local obj = alife():story_object(6004)&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_aes&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
if has_alife_info(&amp;quot;freeplay&amp;quot;) and (level.name()==&amp;quot;l12_stancia&amp;quot; or level.name()==&amp;quot;l12_stancia_2&amp;quot; or level.name()==&amp;quot;l11_pripyat&amp;quot; or level.name()==&amp;quot;l10_radar&amp;quot;) then&lt;br /&gt;
	level.set_weather(&amp;quot;default&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Засчитываем задание &amp;quot;Убить Стрелка&amp;quot;&lt;br /&gt;
function set_complete_tasks()&lt;br /&gt;
if has_alife_info(&amp;quot;aes2_monolit_teleport_ready_final&amp;quot;) and not has_alife_info(&amp;quot;freeplay&amp;quot;) and (level.name()==&amp;quot;l12_stancia&amp;quot; or level.name()==&amp;quot;l12_stancia_2&amp;quot;) then&lt;br /&gt;
	db.actor:iterate_inventory(del_q_items,db.actor)&lt;br /&gt;
	db.actor:give_info_portion(&amp;quot;cit_fail_first_task&amp;quot;)&lt;br /&gt;
	db.actor:give_info_portion(&amp;quot;freeplay&amp;quot;)&lt;br /&gt;
	db.actor:disable_info_portion(&amp;quot;game_end&amp;quot;)&lt;br /&gt;
	db.gameover_credits_started = false&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Удаляем ненужные квестовые предметы&lt;br /&gt;
function del_q_items(npc, item)&lt;br /&gt;
	if item==nil or alife():object(item:id())==nil then return end&lt;br /&gt;
	local section = item:section()&lt;br /&gt;
	if section==&amp;quot;gunslinger_flash&amp;quot; or &lt;br /&gt;
		section==&amp;quot;good_psy_helmet&amp;quot; or &lt;br /&gt;
		section==&amp;quot;bad_psy_helmet&amp;quot; or &lt;br /&gt;
		section==&amp;quot;decoder&amp;quot; or&lt;br /&gt;
		section==&amp;quot;pri_decoder_documents&amp;quot; then&lt;br /&gt;
			alife():release(alife():object(item:id()), true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- Copyright 2007-2008 DEXXX ---------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
If you're going to use the whole of this script or its parts in your own creative &lt;br /&gt;
developments for the S.T.A.L.K.E.R. game, please don't become such a goddamn &lt;br /&gt;
motherfucker like the notorious author of the ABC Mod - Carbrobro. Leave the &lt;br /&gt;
copyrights, note the real author(s) and don't claim others' ideas and their &lt;br /&gt;
realization to be your own ones. It's just simple Modmakers' Ethics. Thank you!&lt;br /&gt;
&lt;br /&gt;
Если вы собираетесь использовать данный скрипт целиком или частично в своих &lt;br /&gt;
разработках по игре S.T.A.L.K.E.R., пожалуйста не опускайтесь до уровня печально &lt;br /&gt;
известного автора ABC мода - Carbrobro. Не удаляйте копирайты, указывайте настоящего &lt;br /&gt;
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Ведь это элементарная &lt;br /&gt;
этика модостроителей! Спасибо за понимание.&lt;br /&gt;
&lt;br /&gt;
]]--&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Авторы ==&lt;br /&gt;
&amp;lt;big&amp;gt;Скрипты&amp;lt;/big&amp;gt;&lt;br /&gt;
Взято из OGSM.&lt;br /&gt;
&amp;lt;big&amp;gt;Статья&amp;lt;/big&amp;gt;&lt;br /&gt;
vllzl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Благодарность ==&lt;br /&gt;
Автору мода OGSM&lt;/div&gt;</summary>
		<author><name>188.134.33.164</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D1%84%D1%80%D0%B8%D0%BF%D0%BB%D0%B5%D0%B9_%D0%B7%D0%B0_%D0%BF%D0%B0%D1%80%D1%83-%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D1%83_%D0%BC%D0%B8%D0%BD%D1%83%D1%82.</id>
		<title>SoC. Создаем фриплей за пару-тройку минут.</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC_%D1%84%D1%80%D0%B8%D0%BF%D0%BB%D0%B5%D0%B9_%D0%B7%D0%B0_%D0%BF%D0%B0%D1%80%D1%83-%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D1%83_%D0%BC%D0%B8%D0%BD%D1%83%D1%82."/>
				<updated>2012-05-24T14:36:13Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: Новая страница: «== Отключение смертельных зон на ЧАЭС-2 == Открываем '''sr_aes_deadzone.script'''. В начале функций: action_post...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Отключение смертельных зон на ЧАЭС-2 ==&lt;br /&gt;
Открываем '''sr_aes_deadzone.script'''. В начале функций: action_postprocess:reset_scheme (), action_postprocess:deactivate(), action_postprocess:update_params (), action_postprocess:update_hit (delta) напишите это:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Это значит, что «зона» будет работать до подачи этого поршня. Но поршня нету.&lt;br /&gt;
&lt;br /&gt;
== Поршни ==&lt;br /&gt;
Открывает config/gameplay/info_l19stanciya.xml&lt;br /&gt;
Туда дописываем где-нибудь:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;freeplay&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
	&amp;lt;info_portion id=&amp;quot;game_end&amp;quot;&amp;gt;&amp;lt;/info_portion&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Таймеры на ЧАЭС-1 и в X-16 ==&lt;br /&gt;
В файле '''sr_timer.script''' все свяжем с новым поршнем freeplay. Опустошите файл и напишите в нем:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Таймер с выводом изображения на экран.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local k,v = 0,0&lt;br /&gt;
&lt;br /&gt;
class &amp;quot;action_timer&amp;quot;&lt;br /&gt;
function action_timer:__init(obj, storage)&lt;br /&gt;
	self.object = obj&lt;br /&gt;
	self.st = storage&lt;br /&gt;
end&lt;br /&gt;
function action_timer:update(delta)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	local actor = db.actor&lt;br /&gt;
	if xr_logic.try_switch_to_another_section(self.object, self.st, actor) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	-- Высчитываем сколько времени уже работает счетчик&lt;br /&gt;
	local nn = time_global() - db.storage[self.object:id()].activation_time&lt;br /&gt;
	&lt;br /&gt;
	-- Изменяем значение счетчика&lt;br /&gt;
	local value_time = 0&lt;br /&gt;
	if self.st.type == &amp;quot;inc&amp;quot; then&lt;br /&gt;
		value_time = self.st.start_value + nn&lt;br /&gt;
	else&lt;br /&gt;
		value_time = self.st.start_value - nn&lt;br /&gt;
	end&lt;br /&gt;
	if value_time &amp;lt;= 0 then&lt;br /&gt;
		value_time = 0&lt;br /&gt;
	end&lt;br /&gt;
	-- Формируем строку счетчика&lt;br /&gt;
	local hours = math.floor(value_time/3600000)&lt;br /&gt;
	local minutes = math.floor(value_time/60000 - hours*60)&lt;br /&gt;
	local seconds = math.floor(value_time/1000 - hours*3600 - minutes*60)&lt;br /&gt;
	local str = tostring(hours)..&amp;quot;:&amp;quot;..sr_timer.time2str(minutes)..&amp;quot;:&amp;quot;..sr_timer.time2str(seconds)&lt;br /&gt;
&lt;br /&gt;
	self.st.timer:SetTextST(str)&lt;br /&gt;
&lt;br /&gt;
	-- Определяем нужно ли куда то переходить.&lt;br /&gt;
	for k,v in pairs(self.st.on_value) do&lt;br /&gt;
		if (self.st.type == &amp;quot;dec&amp;quot; and value_time &amp;lt;= v.dist) or&lt;br /&gt;
		   (self.st.type == &amp;quot;inc&amp;quot; and value_time &amp;gt;= v.dist)&lt;br /&gt;
		then&lt;br /&gt;
			-- Обработка значения.&lt;br /&gt;
			xr_logic.switch_to_section(self.object, self.st, xr_logic.pick_section_from_condlist(db.actor, self.object, v.state))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
function action_timer:deactivate(delta)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	self.st.ui:RemoveCustomStatic(self.st.timer_id)&lt;br /&gt;
	if self.st.string ~= nil then&lt;br /&gt;
		self.st.ui:RemoveCustomStatic(&amp;quot;hud_timer_text&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
--function action_timer:save()&lt;br /&gt;
--	xr_logic.pstor_store( self.object, &amp;quot;timer_value&amp;quot;, self.state )	&lt;br /&gt;
--end&lt;br /&gt;
&lt;br /&gt;
function time2str(n)&lt;br /&gt;
	if n &amp;gt;= 10 then&lt;br /&gt;
		return tostring(n)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;0&amp;quot;..tostring(n)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
function add_to_binder(obj, ini, scheme, section, storage)&lt;br /&gt;
	local action = action_timer(obj, storage)&lt;br /&gt;
	xr_logic.subscribe_action_for_events(obj, storage, action)&lt;br /&gt;
end&lt;br /&gt;
function set_scheme(obj, ini, scheme, section, gulag_name)&lt;br /&gt;
if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&lt;br /&gt;
	local st = xr_logic.assign_storage_and_bind(obj, ini, scheme, section)&lt;br /&gt;
	st.logic = xr_logic.cfg_get_switch_conditions(ini, section, obj)&lt;br /&gt;
	st.type = utils.cfg_get_string( ini, section, &amp;quot;type&amp;quot;, obj, false, &amp;quot;&amp;quot;, &amp;quot;inc&amp;quot;)&lt;br /&gt;
	if st.type ~= &amp;quot;inc&amp;quot; and st.type ~= &amp;quot;dec&amp;quot; then&lt;br /&gt;
		abort(&amp;quot;ERROR: wrong sr_timer type. Section [%s], Restrictor [%s]&amp;quot;, section, obj:name())&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if st.type == &amp;quot;dec&amp;quot; then&lt;br /&gt;
		st.start_value = utils.cfg_get_number(ini, section, &amp;quot;start_value&amp;quot;, obj, true)&lt;br /&gt;
	else&lt;br /&gt;
		st.start_value = utils.cfg_get_number(ini, section, &amp;quot;start_value&amp;quot;, obj, false, 0)&lt;br /&gt;
	end&lt;br /&gt;
	-- Вычитываем значения перехода.&lt;br /&gt;
	st.on_value = parse_data(obj, utils.cfg_get_string(ini, section, &amp;quot;on_value&amp;quot;, obj, false, &amp;quot;&amp;quot;))&lt;br /&gt;
	st.timer_id = utils.cfg_get_string( ini, section, &amp;quot;timer_id&amp;quot;, obj, false, &amp;quot;&amp;quot;, &amp;quot;hud_timer&amp;quot;)&lt;br /&gt;
	st.string	= utils.cfg_get_string( ini, section, &amp;quot;string&amp;quot;, obj, false, &amp;quot;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	st.ui = get_hud()&lt;br /&gt;
	st.ui:AddCustomStatic(st.timer_id, true)&lt;br /&gt;
	st.timer = st.ui:GetCustomStatic(st.timer_id):wnd()&lt;br /&gt;
	&lt;br /&gt;
	if st.string ~= nil then&lt;br /&gt;
		st.ui:AddCustomStatic(&amp;quot;hud_timer_text&amp;quot;, true)&lt;br /&gt;
		local timer_text = st.ui:GetCustomStatic(&amp;quot;hud_timer_text&amp;quot;):wnd()&lt;br /&gt;
		timer_text:SetTextST(st.string)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_data(npc,s)&lt;br /&gt;
	local t = {}&lt;br /&gt;
&lt;br /&gt;
    if s then&lt;br /&gt;
		for name in string.gfind( s, &amp;quot;(%|*%d+%|[^%|]+)%p*&amp;quot; ) do&lt;br /&gt;
			local dat = {	dist = nil,&lt;br /&gt;
							state = nil}	&lt;br /&gt;
			&lt;br /&gt;
			local t_pos = string.find( name, &amp;quot;|&amp;quot;, 1, true )&lt;br /&gt;
						&lt;br /&gt;
			local dist = string.sub( name, 1, t_pos - 1 )&lt;br /&gt;
			local state	= string.sub( name, t_pos + 1)&lt;br /&gt;
			&lt;br /&gt;
				&lt;br /&gt;
			dat.dist = tonumber(dist)&lt;br /&gt;
			if state then&lt;br /&gt;
				dat.state = xr_logic.parse_condlist(npc, dist, state, state)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(t, dat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Землетрясение и подключение скриптов ==&lt;br /&gt;
Находим функцию xr_effects.aes_earthshake в начале напишите:&lt;br /&gt;
&amp;lt;code&amp;gt;if not has_alife_info(&amp;quot;freeplay&amp;quot;) then&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем ui_credits.xml. &lt;br /&gt;
Находим:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;function_on_stop&amp;gt;xr_effects.after_credits&amp;lt;/function_on_stop&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Меняем на:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;function_on_stop&amp;gt;freeplay.set_lchanger&amp;lt;/function_on_stop&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Сами скрипты ==&lt;br /&gt;
Создаем в папке /scripts файл freeplay.script. Пихаем туда:&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
-- Спавним левел-чейнджер&lt;br /&gt;
function spawn_level_changer(sid, from_pos, from_level, dest_pos, dest_level, hint, mode, dest_dir)&lt;br /&gt;
&lt;br /&gt;
local vertexes = {&lt;br /&gt;
l01_escape = {lvid=594266, gvid=0},&lt;br /&gt;
l04_darkvalley = {lvid=121712, gvid=815},&lt;br /&gt;
l11_pripyat = {lvid=142116, gvid=2270},&lt;br /&gt;
l12_stancia = {lvid=405348, gvid=2400},&lt;br /&gt;
l12_stancia_2 = {lvid=9914, gvid=2517}&lt;br /&gt;
-- l12_stancia_2 = {lvid=227423, gvid=2635}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local obj = alife():create(&amp;quot;level_changer&amp;quot;, from_pos, vertexes[from_level][&amp;quot;lvid&amp;quot;], vertexes[from_level][&amp;quot;gvid&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
if obj then&lt;br /&gt;
&lt;br /&gt;
	level.map_add_object_spot(obj.id, &amp;quot;level_changer&amp;quot;, hint)&lt;br /&gt;
&lt;br /&gt;
	local packet = net_packet()&lt;br /&gt;
&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_s32()&lt;br /&gt;
	local level_vertex_id = packet:r_s32()&lt;br /&gt;
	local object_flags = packet:r_s32()&lt;br /&gt;
	local custom_data = packet:r_stringZ()&lt;br /&gt;
	local story_id = packet:r_s32()&lt;br /&gt;
	local cse_alife_object__unk3_u32 = packet:r_s32()&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	local shape_count = packet:r_u8()&lt;br /&gt;
	local shape_type&lt;br /&gt;
	local center&lt;br /&gt;
	local radius&lt;br /&gt;
&lt;br /&gt;
	if shape_count == 0 then&lt;br /&gt;
		shape_type = 0&lt;br /&gt;
		center = vector():set(0,0,0)&lt;br /&gt;
		radius = 10.0&lt;br /&gt;
		shape_count = 1&lt;br /&gt;
	else&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;
				local center = packet:r_vec3()&lt;br /&gt;
				local radius = packet:r_float()&lt;br /&gt;
			else&lt;br /&gt;
				local v1 = packet:r_vec3()&lt;br /&gt;
				local v2 = packet:r_vec3()&lt;br /&gt;
				local v3 = packet:r_vec3()&lt;br /&gt;
				local v4 = packet:r_vec3()&lt;br /&gt;
			end&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_alife_level_changer&lt;br /&gt;
	local dest_game_vertex_id = packet:r_u16()&lt;br /&gt;
	local dest_level_vertex_id = packet:r_s32()&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;
	if packet:r_elapsed() ~= 0 then get_console():execute(&amp;quot;left=&amp;quot;..packet:r_elapsed()) end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_object&lt;br /&gt;
	packet:w_u16(game_vertex_id)&lt;br /&gt;
	packet:w_float(cse_alife_object__unk1_f32)&lt;br /&gt;
	packet:w_s32(cse_alife_object__unk2_u32)&lt;br /&gt;
	packet:w_s32(level_vertex_id)&lt;br /&gt;
	packet:w_s32(object_flags)&lt;br /&gt;
	packet:w_stringZ(custom_data)&lt;br /&gt;
	packet:w_s32(sid)&lt;br /&gt;
	packet:w_s32(cse_alife_object__unk3_u32)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_shape&lt;br /&gt;
	packet:w_u8(shape_count)&lt;br /&gt;
&lt;br /&gt;
	for i=1,shape_count do&lt;br /&gt;
		packet:w_u8(shape_type)&lt;br /&gt;
		if shape_type == 0 then&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,0))&lt;br /&gt;
			packet:w_float(3)&lt;br /&gt;
		else&lt;br /&gt;
			packet:w_vec3(vector():set(3,0,0))&lt;br /&gt;
			packet:w_vec3(vector():set(0,3,0))&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,3))&lt;br /&gt;
			packet:w_vec3(vector():set(0,0,0))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_space_restrictor&lt;br /&gt;
	packet:w_u8(restrictor_type)&lt;br /&gt;
&lt;br /&gt;
	-- свойства cse_alife_level_changer&lt;br /&gt;
	packet:w_u16(vertexes[dest_level][&amp;quot;gvid&amp;quot;])&lt;br /&gt;
	packet:w_s32(vertexes[dest_level][&amp;quot;lvid&amp;quot;])&lt;br /&gt;
	packet:w_vec3(dest_pos)&lt;br /&gt;
	if dest_dir then &lt;br /&gt;
		packet:w_vec3(dest_dir)&lt;br /&gt;
	else&lt;br /&gt;
		packet:w_vec3(dest_direction)&lt;br /&gt;
	end&lt;br /&gt;
	packet:w_stringZ(dest_level)&lt;br /&gt;
	packet:w_stringZ(dest_graph_point)&lt;br /&gt;
	packet:w_u8(mode)&lt;br /&gt;
&lt;br /&gt;
	obj:STATE_Read(packet, packet:w_tell()-packet:r_tell())&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Удаление лишних переходов&lt;br /&gt;
function disable_sar_entrance()&lt;br /&gt;
for i=1,65535 do&lt;br /&gt;
	local obj = alife():object(i)&lt;br /&gt;
	if obj and obj:name()==&amp;quot;exit_to_sarcofag_01&amp;quot; then&lt;br /&gt;
		alife():release(obj, true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Спавн всех нужных переходов&lt;br /&gt;
function set_lchanger()&lt;br /&gt;
&lt;br /&gt;
if not db.actor or not has_alife_info(&amp;quot;game_end&amp;quot;) then&lt;br /&gt;
	xr_effects.after_credits()&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
level.add_pp_effector(&amp;quot;teleport.ppe&amp;quot;, 2008, false)&lt;br /&gt;
&lt;br /&gt;
-- Кордон - Темная долина&lt;br /&gt;
spawn_level_changer(6001, vector():set(368.9,15.17,-42.65), &amp;quot;l01_escape&amp;quot;, vector():set(-44.77, 0.43, -541.35), &amp;quot;l04_darkvalley&amp;quot;, &amp;quot;to_darkvalley&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС - Припять&lt;br /&gt;
spawn_level_changer(6002, vector():set(918.1,-0.1,-401.96), &amp;quot;l12_stancia&amp;quot;, vector():set(31.28,1.135,420.61), &amp;quot;l11_pripyat&amp;quot;, &amp;quot;to_pripyat&amp;quot;, 0, vector():set(0,-3.1,0))&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС2 - ЧАЭС&lt;br /&gt;
-- spawn_level_changer(6003, vector():set(554.52,150,201), &amp;quot;l12_stancia_2&amp;quot;, vector():set(117.6,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, &amp;quot;to_aes&amp;quot;, 1, vector():set(0,-1.5,0))&lt;br /&gt;
spawn_level_changer(6003, vector():set(-42.15,-0.02,56.03), &amp;quot;l12_stancia_2&amp;quot;, vector():set(126,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, &amp;quot;to_aes&amp;quot;, 0, vector():set(0,-1.5,0))&lt;br /&gt;
&lt;br /&gt;
-- ЧАЭС - ЧАЭС2&lt;br /&gt;
spawn_level_changer(6004, vector():set(117.6,-0.1,-76.3), &amp;quot;l12_stancia&amp;quot;, vector():set(-42.15,-0.02,64), &amp;quot;l12_stancia_2&amp;quot;, &amp;quot;to_aes&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
-- Удаление лишних переходов&lt;br /&gt;
disable_sar_entrance()&lt;br /&gt;
&lt;br /&gt;
-- Перемещаем актора, засчитываем все задания&lt;br /&gt;
db.actor:set_actor_position(vector():set(1035.12,-0.0999,229.564))&lt;br /&gt;
set_complete_tasks()&lt;br /&gt;
&lt;br /&gt;
-- Ставим стандартную погоду&lt;br /&gt;
level.set_weather(&amp;quot;default&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Отмечаем на карте новые точки перехода&lt;br /&gt;
function mark_lc()&lt;br /&gt;
local obj = alife():story_object(6001)&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_darkvalley&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
local obj = alife():story_object(6002)&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;
local obj = alife():story_object(6003)&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_aes&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
local obj = alife():story_object(6004)&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_aes&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
if has_alife_info(&amp;quot;freeplay&amp;quot;) and (level.name()==&amp;quot;l12_stancia&amp;quot; or level.name()==&amp;quot;l12_stancia_2&amp;quot; or level.name()==&amp;quot;l11_pripyat&amp;quot; or level.name()==&amp;quot;l10_radar&amp;quot;) then&lt;br /&gt;
	level.set_weather(&amp;quot;default&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Засчитываем задание &amp;quot;Убить Стрелка&amp;quot;&lt;br /&gt;
function set_complete_tasks()&lt;br /&gt;
if has_alife_info(&amp;quot;aes2_monolit_teleport_ready_final&amp;quot;) and not has_alife_info(&amp;quot;freeplay&amp;quot;) and (level.name()==&amp;quot;l12_stancia&amp;quot; or level.name()==&amp;quot;l12_stancia_2&amp;quot;) then&lt;br /&gt;
	db.actor:iterate_inventory(del_q_items,db.actor)&lt;br /&gt;
	db.actor:give_info_portion(&amp;quot;cit_fail_first_task&amp;quot;)&lt;br /&gt;
	db.actor:give_info_portion(&amp;quot;freeplay&amp;quot;)&lt;br /&gt;
	db.actor:disable_info_portion(&amp;quot;game_end&amp;quot;)&lt;br /&gt;
	db.gameover_credits_started = false&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Удаляем ненужные квестовые предметы&lt;br /&gt;
function del_q_items(npc, item)&lt;br /&gt;
	if item==nil or alife():object(item:id())==nil then return end&lt;br /&gt;
	local section = item:section()&lt;br /&gt;
	if section==&amp;quot;gunslinger_flash&amp;quot; or &lt;br /&gt;
		section==&amp;quot;good_psy_helmet&amp;quot; or &lt;br /&gt;
		section==&amp;quot;bad_psy_helmet&amp;quot; or &lt;br /&gt;
		section==&amp;quot;decoder&amp;quot; or&lt;br /&gt;
		section==&amp;quot;pri_decoder_documents&amp;quot; then&lt;br /&gt;
			alife():release(alife():object(item:id()), true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------------------------- Copyright 2007-2008 DEXXX ---------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
If you're going to use the whole of this script or its parts in your own creative &lt;br /&gt;
developments for the S.T.A.L.K.E.R. game, please don't become such a goddamn &lt;br /&gt;
motherfucker like the notorious author of the ABC Mod - Carbrobro. Leave the &lt;br /&gt;
copyrights, note the real author(s) and don't claim others' ideas and their &lt;br /&gt;
realization to be your own ones. It's just simple Modmakers' Ethics. Thank you!&lt;br /&gt;
&lt;br /&gt;
Если вы собираетесь использовать данный скрипт целиком или частично в своих &lt;br /&gt;
разработках по игре S.T.A.L.K.E.R., пожалуйста не опускайтесь до уровня печально &lt;br /&gt;
известного автора ABC мода - Carbrobro. Не удаляйте копирайты, указывайте настоящего &lt;br /&gt;
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Ведь это элементарная &lt;br /&gt;
этика модостроителей! Спасибо за понимание.&lt;br /&gt;
&lt;br /&gt;
]]--&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Авторы ==&lt;br /&gt;
&amp;lt;big&amp;gt;Скрипты&amp;lt;/big&amp;gt;&lt;br /&gt;
Взято из OGSM.&lt;br /&gt;
&amp;lt;big&amp;gt;Статья&amp;lt;/big&amp;gt;&lt;br /&gt;
vllzl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Благодарность ==&lt;br /&gt;
Автору мода OGSM&lt;/div&gt;</summary>
		<author><name>188.134.33.164</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%A7%D0%90%D0%AD%D0%A1</id>
		<title>Выброс на ЧАЭС</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%92%D1%8B%D0%B1%D1%80%D0%BE%D1%81_%D0%BD%D0%B0_%D0%A7%D0%90%D0%AD%D0%A1"/>
				<updated>2012-05-23T16:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: Новая страница: «Открываем sr_aes_deadzone.script  == Отключение повреждение == В функции action_postprocess:update_hit (delta) удаляем ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Открываем sr_aes_deadzone.script&lt;br /&gt;
&lt;br /&gt;
== Отключение повреждение ==&lt;br /&gt;
В функции action_postprocess:update_hit (delta) удаляем строки: db.actor:hit (h) и db.actor:hit (h);.&lt;br /&gt;
&lt;br /&gt;
== Отключаем эффекты серую окр.среду и эффекты ==&lt;br /&gt;
В функции '''action_postprocess:reset_scheme ()''' значение self.gray_amplitude = 1.0 меняем на self.gray_amplitude = 0.0&lt;br /&gt;
&lt;br /&gt;
Так, повреждения актору отключили, серую окр.среду отключили. Но у нас остались точки на экране и двоится в глазах ГГ. Уберем PPEffector. Убираем строки из action_postprocess:reset_scheme ():&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
	self.pp 							= PPEffector (self.object:id () + 2000, self);&lt;br /&gt;
	self.pp.params.noise				= noise ();&lt;br /&gt;
	self.pp:start						();&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;
[[Участник:vllzl]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</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>2012-05-20T17:47:14Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: /* Часть 2. Создание точек перехода */&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.&lt;br /&gt;
&lt;br /&gt;
Ниже я привожу код функции, которая создает и инициализирует level_changer (пишется в созданный нами файл '''_freeplay_sa.script'''): НИЧЕГО НЕ ПОДСТАВЛЯЙТЕ! &lt;br /&gt;
&amp;lt;lua&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;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Часть 2. '''Создание точек перехода''' ==&lt;br /&gt;
&lt;br /&gt;
Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты (тоже в файл '''_freeplay_sa.script''')&lt;br /&gt;
&amp;lt;lua&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;/lua&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;lua&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;/lua&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&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;br /&gt;
== Дополняет авторы: vllzl ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
«По-честному» (скриптом, без модификации ''all.spawn'') таймер выброса отключить не получится.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно удалить таймер скриптом (удаляет рестриктор из игры)&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function delete_aes_timer()&lt;br /&gt;
        local obj = alife():object(&amp;quot;aes_space_restrictor_timer&amp;quot;)&lt;br /&gt;
        if obj then&lt;br /&gt;
        alife():release(obj, true)&lt;br /&gt;
        end&lt;br /&gt;
        local se_obj = alife():object(&amp;quot;aes_space_restrictor_timer_go&amp;quot;)&lt;br /&gt;
        if se_obj then&lt;br /&gt;
        alife():release(se_obj, true)&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Удалит таймер и выброс из игры. Vllzl&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</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>2012-05-20T17:40:22Z</updated>
		
		<summary type="html">&lt;p&gt;188.134.33.164: &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.&lt;br /&gt;
&lt;br /&gt;
Ниже я привожу код функции, которая создает и инициализирует level_changer (пишется в созданный нами файл '''_freeplay_sa.script'''): НИЧЕГО НЕ ПОДСТАВЛЯЙТЕ! &lt;br /&gt;
&amp;lt;lua&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;/lua&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Часть 2. '''Создание точек перехода''' ==&lt;br /&gt;
&lt;br /&gt;
Теперь следует написать функции создания нужных точек перехода и подключить их к игре. Сами функции просты (тоже в файл '''_freeplay_sa.script''')&lt;br /&gt;
&amp;lt;lua&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;/lua&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;lua&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;/lua&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&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;br /&gt;
== Дополняет авторы: vllzl ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
«По-честному» (скриптом, без модификации ''all.spawn'') таймер выброса отключить не получится.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно удалить таймер скриптом (удаляет рестриктор из игры)&lt;br /&gt;
&amp;lt;lua&amp;gt;&lt;br /&gt;
function delete_aes_timer()&lt;br /&gt;
        local obj = alife():object(&amp;quot;aes_space_restrictor_timer&amp;quot;)&lt;br /&gt;
        if obj then&lt;br /&gt;
        alife():release(obj, true)&lt;br /&gt;
        end&lt;br /&gt;
        local se_obj = alife():object(&amp;quot;aes_space_restrictor_timer_go&amp;quot;)&lt;br /&gt;
        if se_obj then&lt;br /&gt;
        alife():release(se_obj, true)&lt;br /&gt;
        end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/lua&amp;gt;&lt;br /&gt;
Удалит таймер и выброс из игры. Vllzl&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>188.134.33.164</name></author>	</entry>

	</feed>