CoP. Спавн точек перехода между локациями — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(<<< aka_sektor) |
|||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 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 | + | p_dest_level, -- название уровня, например "L11_Pripyat" |
− | + | p_silent -- следует задать 1, чтобы подавить вопрос о смене уровня (автоматический переход) | |
− | + | ||
) | ) | ||
− | 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. | + | |
− | + | 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> | ||
Строка 117: | Строка 121: | ||
</code> | </code> | ||
− | |||
− | |||
− | |||
− | |||
[[Категория:Неоформленные статьи]] | [[Категория:Неоформленные статьи]] |
Текущая версия на 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