SoC. Создание проводника между локациями — S.T.A.L.K.E.R. Inside Wiki

SoC. Создание проводника между локациями

Материал из S.T.A.L.K.E.R. Inside Wiki

Версия от 10:29, 3 июня 2012; 109.205.254.88 (обсуждение)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Левел-чейнджер

Мы создадим левел-чейнджер на месте ГГ. Наш диалог создаст переход и ГГ попадет куда угодно.

Реализация

Вы уже создали диалоги, если нет - статья Создание диалогов. Ниже есть функции создающие левел-чейнджер. Их ОЧЕНЬ много (на любой вкус):

 
function create_level_changer(
	p_story_id,	-- STORY_ID нового level_changer (понадобится нам позже)
	p_position,	-- вектор, координаты точки, в которой будет располагаться центр нового level_changer
	p_lvertex_id,	-- level_vertext_id  - идентифицируют уровень, на котором будет создан level_changer
	p_gvertex_id,	-- game_vertext_id   	
 
	p_dest_lv,	-- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока 
	p_dest_gv,	-- game_vertex_id
	p_dest_pos,	-- координаты точки, в которой на новом уровне окажется игрок
	p_dest_dir,	-- направрение взгляда игрока
	p_dest_level,	-- название уровня, например "L11_Pripyat"
	p_silent	-- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)
)
	local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)
 
	level.map_add_object_spot(obj.id, "level_changer", "")
 
	local packet = net_packet()
	obj:STATE_Write(packet)
 
	-- свойства cse_alife_object
	local game_vertex_id 			= packet:r_u16()
	local cse_alife_object__unk1_f32 	= packet:r_float()
	local cse_alife_object__unk2_u32 	= packet:r_u32()
	local level_vertex_id 			= packet:r_u32()
	local object_flags 			= packet:r_u32()
	local custom_data 			= packet:r_stringZ()
	local story_id 				= packet:r_u32()
	local spawn_story_id			= packet:r_u32()
 
	-- свойства cse_shape
	local shape_count 			= packet:r_u8()
	for i=1,shape_count do
		local shape_type 		= packet:r_u8()
		if shape_type == 0 then
			-- sphere
			local center 		= packet:r_vec3()
			local radius 		= packet:r_float()
		else
			-- box
			local axis_x_x = packet:r_float()
			local axis_x_y = packet:r_float()
			local axis_x_z = packet:r_float()
			local axis_y_x = packet:r_float()
			local axis_y_y = packet:r_float()
			local axis_y_z = packet:r_float()
			local axis_z_x = packet:r_float()
			local axis_z_y = packet:r_float()
			local axis_z_z = packet:r_float()
			local offset_x = packet:r_float()
			local offset_y = packet:r_float()
			local offset_z = packet:r_float()
		end
	end
 
	-- свойства cse_alife_space_restrictor
	local restrictor_type 			= packet:r_u8()
 
	-- свойства cse_level_changer
	local dest_game_vertex_id		= packet:r_u16()  
	local dest_level_vertex_id 		= packet:r_u32()  
	local dest_position 			= packet:r_vec3()
	local dest_direction 			= packet:r_vec3()
	local dest_level_name 			= packet:r_stringZ()
	local dest_graph_point 			= packet:r_stringZ()
	local silent_mode 			= packet:r_u8()
 
 
	packet:w_begin(game_vertex_id)			-- game_vertex_id
	packet:w_float(cse_alife_object__unk1_f32)
	packet:w_u32(cse_alife_object__unk2_u32) 
	packet:w_u32(level_vertex_id)			-- level_vertex_id
	packet:w_u32( bit_not(193) )			-- object_flags = -193 = 0xFFFFFF3E
	packet:w_stringZ(custom_data)
	packet:w_u32(p_story_id)			-- story_id
	packet:w_u32(spawn_story_id)
 
	packet:w_u8(1)			-- количество фигур
--		packet:w_u8(0)			-- тип фигуры: сфера
--		packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center
--		packet:w_float(3.0)
	packet:w_u8(1)			-- тип фигуры: box
	packet:w_float(2)	   -- axis_x_x
	packet:w_float(0)	   -- axis_x_y
	packet:w_float(0)	   -- axis_x_z
	packet:w_float(0)	   -- axis_y_x
	packet:w_float(4)	   -- axis_y_y
	packet:w_float(0)	   -- axis_y_z
	packet:w_float(0)	   -- axis_z_x
	packet:w_float(0)	   -- axis_z_y
	packet:w_float(4)	   -- axis_z_z
	packet:w_float(0)	   -- offset_x
	packet:w_float(0)	   -- offset_y
	packet:w_float(0)          -- offset_z
 
	packet:w_u8(3)	 	   -- restrictor_type
 
	packet:w_u16(p_dest_gv)			-- destination game_vertex_id
	packet:w_s32(p_dest_lv)			-- destination level_vertex_id
	packet:w_vec3(p_dest_pos)		-- destination position
	packet:w_vec3(p_dest_dir)		-- destination direction (направление взгляда)
	packet:w_stringZ(p_dest_level)		-- destination level name
	packet:w_stringZ("start_actor_02")	-- some string, always const
	packet:w_u8(p_silent)			-- 1 for silent level changing
 
	packet:r_seek(0)
	obj:STATE_Read(packet, packet:w_tell())
 level.add_pp_effector ("teleport.ppe", 2006, false)
 
end
 
 
function exit_as()	
    	create_level_changer(11077, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	28719,
			            1758,
			            vector():set(-317.23675537109,-26.327833175659,55.278633117676),	
                        vector():set(0.0, 0.0, 0.0),	
						"l07_military",
                        1)
end	
 
function exit_as2()	
    	create_level_changer(11078, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	66343,
			            1786,
			            vector():set(-274.62121582031,-27.297189712524,239.00979614258),	
                        vector():set(0.0, 0.0, 0.0),	
						"l07_military",
                        1)
end	
 
function exit_as3()	
    	create_level_changer(11079, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	273147,
			            1821,
			            vector():set(-33.368682861328,-20.897382736206,379.58074951172),	
                        vector():set(0.0, 0.0, 0.0),	
						"l07_military",
                        1)
end	
 
function exit_as4()	
    	create_level_changer(11080, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	83694,
			            1852,
			            vector():set(-243.89454650879,-0.28634393215179,435.28894042969),	
                        vector():set(0.0, 0.0, 0.0),	
						"l07_military",
                        1)
end	
 
function exit_bunker()	
    	create_level_changer(11085, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	7807,
			            2773,
			            vector():set(8.3457946777344,-23.525426864624,19.003190994263),	
                        vector():set(0.0, 0.0, 0.0),	
						"l10u_bunker",
                        1)
end	
 
function exit_svalka()	
		create_level_changer(11041, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	127101,
			            351,
			            vector():set(-77.325019836426,-3.660080909729,195.34251403809),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end	
 
function exit_svalka2()	
		create_level_changer(11042, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	1201,
			            260,
			            vector():set(-289.04534912109,-6.6783475875854,-178.82406616211),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end	
 
function exit_svalka3()	
		create_level_changer(11043, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	344517,
			            401,
			            vector():set(200.77691650391,-0.638019323349,-145.20561218262),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end	
 
function exit_svalka4()	
		create_level_changer(11044, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	284570,
			            374,
			            vector():set(122.61166381836,-4.2376079559326,153.47959899902),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end
 
function exit_svalka5()	
		create_level_changer(11045, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	324917,
			            384,
			            vector():set(173.82795715332,-0.30577194690704,51.149074554443),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end	
 
function exit_svalka6()	
		create_level_changer(11046, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	311456,
			            385,
			            vector():set(97.819366455078,15.575645446777,31.107891082764),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end	
 
function exit_svalka7()	
		create_level_changer(11047, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	166216,
			            332,
			            vector():set(-49.738338470459,20.034204483032,115.88290405273),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end
 
function exit_svalka8()	
		create_level_changer(11048, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(),	 
                    	2848,
			            314,
			            vector():set(-277.18438720703,0.42264106869698,26.608871459961),	
                        vector():set(0.0, 0.0, 0.0),	
						"l02_garbage",
                        1)
end
 

Комментарии к функциям есть в первой функции. Активировать через диалог:

<action>название_скрипта.название_функции_без_скобок

Источник

В моде Hand Teleport на любой вкус.

Статьи автор

vllzl

Другие места
LANGUAGE