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

CoP. Спавн точек перехода между локациями — различия между версиями

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

Перейти к: навигация, поиск
 
Строка 1: Строка 1:
 
Создание точек перехода между локациями.
 
Создание точек перехода между локациями.
<lua>
+
<lua>  
 
function create_level_changer(
 
function create_level_changer(
p_story_id, -- STORY_ID нового level_changer
+
p_story_id, -- STORY_ID нового level_changer (понадобится нам позже)
p_position, -- вектор, центр нового level_changer
+
p_position, -- вектор, координаты точки, в которой будет располагаться центр нового level_changer
p_lvertex_id, -- level_vertext_id
+
p_lvertex_id, -- level_vertext_id - идентифицируют уровень, на котором будет создан level_changer
p_gvertex_id, -- game_vertext_id  
+
p_gvertex_id, -- game_vertext_id  
p_dest_lv, -- level_vertex_id  
+
p_dest_gv, -- game_vertex_id
+
p_dest_lv, -- level_vertex_id   - идентифицируют уровень, на который level_changer будет перебрасывать игрока
p_dest_pos, -- координаты на новом уровне
+
p_dest_gv, -- game_vertex_id
p_dest_dir, -- направление взгляда игрока
+
p_dest_pos, -- координаты точки, в которой на новом уровне окажется игрок
p_dest_level, -- название уровня
+
p_dest_dir, -- направление взгляда игрока
p_silent, -- 1 автоматический переход
+
p_dest_level, -- название уровня, например "L11_Pripyat"
P_spotdir, -- метка на карте
+
p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход)
p_desr -- описание
+
 
)
 
)
local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)
+
local obj = alife():create("level_changer", p_position, p_lvertex_id, p_gvertex_id)
level.map_add_object_spot_ser(obj.id,P_spotdir,p_desr)
+
 
+
level.map_add_object_spot(obj.id, "level_changer", "")
local packet = net_packet()
+
obj:STATE_Write(packet)
+
local packet = net_packet()
 
+
obj:STATE_Write(packet)
-- свойства cse_alife_object
+
local game_vertex_id = packet:r_u16()
+
-- свойства cse_alife_object
local cse_alife_object__unk1_f32 = packet:r_float()
+
local game_vertex_id = packet:r_u16()
local cse_alife_object__unk2_u32 = packet:r_u32()
+
local cse_alife_object__unk1_f32 = packet:r_float()
local level_vertex_id = packet:r_u32()
+
local cse_alife_object__unk2_u32 = packet:r_u32()
local object_flags = packet:r_u32()
+
local level_vertex_id = packet:r_u32()
local custom_data = packet:r_stringZ()
+
local object_flags = packet:r_u32()
local story_id = packet:r_u32()
+
local custom_data = packet:r_stringZ()
local spawn_story_id = packet:r_u32()
+
local story_id = packet:r_u32()
 
+
local spawn_story_id = packet:r_u32()
-- свойства cse_shape
+
local shape_count = packet:r_u8()
+
-- свойства cse_shape
for i=1,shape_count do
+
local shape_count = packet:r_u8()
local shape_type = packet:r_u8()
+
for i=1,shape_count do
if shape_type == 0 then
+
local shape_type = packet:r_u8()
-- sphere
+
if shape_type == 0 then
local center = packet:r_vec3()
+
-- sphere
local radius = packet:r_float()
+
local center = packet:r_vec3()
else
+
local radius = packet:r_float()
-- box
+
else
local axis_x_x = packet:r_float()
+
-- box
local axis_x_y = packet:r_float()
+
local axis_x_x = packet:r_float()
local axis_x_z = packet:r_float()
+
local axis_x_y = packet:r_float()
local axis_y_x = packet:r_float()
+
local axis_x_z = packet:r_float()
local axis_y_y = packet:r_float()
+
local axis_y_x = packet:r_float()
local axis_y_z = packet:r_float()
+
local axis_y_y = packet:r_float()
local axis_z_x = packet:r_float()
+
local axis_y_z = packet:r_float()
local axis_z_y = packet:r_float()
+
local axis_z_x = packet:r_float()
local axis_z_z = packet:r_float()
+
local axis_z_y = packet:r_float()
local offset_x = packet:r_float()
+
local axis_z_z = packet:r_float()
local offset_y = packet:r_float()
+
local offset_x = packet:r_float()
local offset_z = packet:r_float()
+
local offset_y = packet:r_float()
end
+
local offset_z = packet:r_float()
end
+
end
 
+
end
-- свойства cse_alife_space_restrictor
+
local restrictor_type = packet:r_u8()
+
-- свойства cse_alife_space_restrictor
 
+
local restrictor_type = packet:r_u8()
-- свойства cse_level_changer
+
local dest_game_vertex_id = packet:r_u16()  
+
-- свойства cse_level_changer
local dest_level_vertex_id = packet:r_u32()  
+
local dest_game_vertex_id = packet:r_u16()
local dest_position = packet:r_vec3()
+
local dest_level_vertex_id = packet:r_u32()
local dest_direction = packet:r_vec3()
+
local dest_position = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
+
local dest_direction = packet:r_vec3()
local dest_graph_point = packet:r_stringZ()
+
local dest_level_name = packet:r_stringZ()
local silent_mode = packet:r_u8()
+
local dest_graph_point = packet:r_stringZ()
 
+
local silent_mode = packet:r_u8()
 
+
packet:w_begin(game_vertex_id)  
+
packet:w_float(cse_alife_object__unk1_f32)
+
packet:w_begin(game_vertex_id) -- game_vertex_id
packet:w_u32(cse_alife_object__unk2_u32)  
+
packet:w_float(cse_alife_object__unk1_f32)
packet:w_u32(level_vertex_id)  
+
packet:w_u32(cse_alife_object__unk2_u32)  
packet:w_u32( bit_not(193) )  
+
packet:w_u32(level_vertex_id) -- level_vertex_id
packet:w_stringZ(custom_data)
+
packet:w_u32( bit_not(193) ) -- object_flags = -193 = 0xFFFFFF3E
packet:w_u32(p_story_id)  
+
packet:w_stringZ(custom_data)
packet:w_u32(spawn_story_id)
+
packet:w_u32(p_story_id) -- story_id
 
+
packet:w_u32(spawn_story_id)
packet:w_u8(1) -- количество фигур
+
packet:w_u8(1) -- тип фигуры: box
+
packet:w_u8(1) -- количество фигур
packet:w_float(2) -- axis_x_x
+
-- packet:w_u8(0) -- тип фигуры: сфера
packet:w_float(0) -- axis_x_y
+
-- packet:w_vec3(vector():set(0, 0, 0))  -- sphere_center
packet:w_float(0) -- axis_x_z
+
-- packet:w_float(3.0)
packet:w_float(0) -- axis_y_x
+
packet:w_u8(1) -- тип фигуры: box
packet:w_float(4) -- axis_y_y
+
packet:w_float(2)   -- axis_x_x
packet:w_float(0) -- axis_y_z
+
packet:w_float(0)   -- axis_x_y
packet:w_float(0) -- axis_z_x
+
packet:w_float(0)   -- axis_x_z
packet:w_float(0) -- axis_z_y
+
packet:w_float(0)   -- axis_y_x
packet:w_float(4) -- axis_z_z
+
packet:w_float(4)   -- axis_y_y
packet:w_float(0) -- offset_x
+
packet:w_float(0)   -- axis_y_z
packet:w_float(0) -- offset_y
+
packet:w_float(0)   -- axis_z_x
packet:w_float(0) -- offset_z
+
packet:w_float(0)   -- axis_z_y
 
+
packet:w_float(4)   -- axis_z_z
packet:w_u8(3)
+
packet:w_float(0)   -- offset_x
 
+
packet:w_float(0)   -- offset_y
packet:w_u16(p_dest_gv) -- destination game_vertex_id
+
packet:w_float(0)         -- offset_z
packet:w_u32(p_dest_lv) -- destination level_vertex_id
+
packet:w_vec3(p_dest_pos) -- destination position
+
packet:w_u8(3)   -- restrictor_type
packet:w_vec3(p_dest_dir) -- destination direction
+
packet:w_stringZ(p_dest_level) -- destination level name
+
packet:w_u16(p_dest_gv) -- destination game_vertex_id
packet:w_stringZ("start_actor_99") -- some string, always const
+
packet:w_u32(p_dest_lv) -- destination level_vertex_id
packet:w_u8(p_silent) -- 1 for silent level changing
+
packet:w_vec3(p_dest_pos) -- destination position
 
+
packet:w_vec3(p_dest_dir) -- destination direction (направление взгляда)
packet:r_seek(0)
+
packet:w_stringZ(p_dest_level) -- destination level name
obj:STATE_Read(packet, packet:w_tell())
+
packet:w_stringZ("start_actor_99") -- 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())
 +
 +
-- news_manager.send_tip(db.actor, "LC creation finished", nil, nil, 30000)
 
end
 
end
 
</lua>
 
</lua>

Текущая версия на 17:32, 6 апреля 2015

Создание точек перехода между локациями.

 
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_u32(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_99")	-- 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())
 
--	news_manager.send_tip(db.actor, "LC creation finished", nil, nil, 30000)
end
 

Пример перехода с Затона в Окрестности "Юпитера".

function nlc()
-- создается переход с Затона на Юпитер
create_level_changer(52000, vector():set(32.82,0.39,612.30), 1011443, 192, 81204, 422, vector():set(-376.06,6.46,412.87), vector():set(0.0, 0.0, 0.0), "jupiter", 1, "exit_to_jupiter", "на Янов")
end
Другие места
LANGUAGE