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