CoP. Создание точек перехода между уровнями через скрипт — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(Новая страница: «== Шаг 1 == Первым делом скажу, что мы будем создавать переходы «подпольным» способом — чере...») |
(→Шаг 1) |
||
Строка 4: | Строка 4: | ||
function spawn_lc(gv, pos, dest_level, dest_pos, mode, dist_gv, dest_dir, custom) | function spawn_lc(gv, pos, dest_level, dest_pos, mode, dist_gv, dest_dir, custom) | ||
− | local obj = alife():create( | + | local obj = alife():create("level_changer", pos, 1, gv) |
− | if obj | + | if obj ~= nil then |
local packet = net_packet() | local packet = net_packet() | ||
packet:w_begin(0) | packet:w_begin(0) | ||
Строка 12: | Строка 12: | ||
packet:r_seek(2) | packet:r_seek(2) | ||
− | + | -- свойства cse_alife_object | |
local game_vertex_id = packet:r_u16() | local game_vertex_id = packet:r_u16() | ||
local cse_alife_object__unk1_f32 = packet:r_float() | local cse_alife_object__unk1_f32 = packet:r_float() | ||
Строка 21: | Строка 21: | ||
local story_id = packet:r_s32() | local story_id = packet:r_s32() | ||
local cse_alife_object__unk3_u32 = packet:r_s32() | local cse_alife_object__unk3_u32 = packet:r_s32() | ||
− | + | ||
− | + | -- свойства cse_shape | |
local shape_count = packet:r_u8() | local shape_count = packet:r_u8() | ||
local shape_type | local shape_type | ||
local center | local center | ||
local radius | local radius | ||
− | + | ||
if shape_count == 0 then | if shape_count == 0 then | ||
shape_type = 0 | shape_type = 0 | ||
Строка 47: | Строка 47: | ||
end | end | ||
end | end | ||
− | + | ||
− | + | -- свойства cse_alife_space_restrictor | |
local restrictor_type = packet:r_u8() | local restrictor_type = packet:r_u8() | ||
− | + | ||
− | + | -- свойства cse_alife_level_changer | |
local dest_game_vertex_id = packet:r_u16() | local dest_game_vertex_id = packet:r_u16() | ||
local dest_level_vertex_id = packet:r_s32() | local dest_level_vertex_id = packet:r_s32() | ||
Строка 59: | Строка 59: | ||
local dest_graph_point = packet:r_stringZ() | local dest_graph_point = packet:r_stringZ() | ||
local silent_mode = packet:r_u8() | local silent_mode = packet:r_u8() | ||
− | + | ||
− | + | -- свойства se_level_changer | |
local enabled = packet:r_u8() | local enabled = packet:r_u8() | ||
local hint = packet:r_stringZ() | local hint = packet:r_stringZ() | ||
local se_level_changer__marker = packet:r_u16() | local se_level_changer__marker = packet:r_u16() | ||
− | + | ||
− | + | -- if packet:r_elapsed() ~= 0 then get_console():execute("left="..packet:r_elapsed()) end | |
− | + | ||
− | + | -- свойства cse_alife_object | |
packet:w_u16(game_vertex_id) | packet:w_u16(game_vertex_id) | ||
packet:w_float(cse_alife_object__unk1_f32) | packet:w_float(cse_alife_object__unk1_f32) | ||
Строка 73: | Строка 73: | ||
packet:w_s32(level_vertex_id) | packet:w_s32(level_vertex_id) | ||
packet:w_s32(object_flags) | packet:w_s32(object_flags) | ||
− | if custom | + | if custom ~= nil then |
packet:w_stringZ(custom) | packet:w_stringZ(custom) | ||
else | else | ||
Строка 80: | Строка 80: | ||
packet:w_s32(story_id) | packet:w_s32(story_id) | ||
packet:w_s32(cse_alife_object__unk3_u32) | packet:w_s32(cse_alife_object__unk3_u32) | ||
− | + | ||
− | + | -- свойства cse_shape | |
packet:w_u8(shape_count) | packet:w_u8(shape_count) | ||
− | + | ||
for i=1,shape_count do | for i=1,shape_count do | ||
packet:w_u8(shape_type) | packet:w_u8(shape_type) | ||
Строка 98: | Строка 98: | ||
end | end | ||
end | end | ||
− | + | ||
− | + | -- свойства cse_alife_space_restrictor | |
packet:w_u8(restrictor_type) | packet:w_u8(restrictor_type) | ||
− | + | ||
− | + | -- свойства cse_alife_level_changer | |
packet:w_u16(dist_gv) | packet:w_u16(dist_gv) | ||
packet:w_s32(1) | packet:w_s32(1) | ||
Строка 116: | Строка 116: | ||
packet:w_stringZ(dest_graph_point) | packet:w_stringZ(dest_graph_point) | ||
packet:w_u8(mode) | packet:w_u8(mode) | ||
− | + | ||
− | + | -- свойства se_level_changer | |
packet:w_u8(enabled) | packet:w_u8(enabled) | ||
packet:w_stringZ(hint) | packet:w_stringZ(hint) | ||
packet:w_u16(se_level_changer__marker) | packet:w_u16(se_level_changer__marker) | ||
− | + | ||
obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) | obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) |
Версия 07:56, 1 июня 2012
Шаг 1
Первым делом скажу, что мы будем создавать переходы «подпольным» способом — через скрипт. Разработчиками он не задумывался — это особенность движка x-ray. Создадим файл \scripts\nlc.script с таким содержанием:
function spawn_lc(gv, pos, dest_level, dest_pos, mode, dist_gv, dest_dir, custom) local obj = alife():create("level_changer", pos, 1, gv) if obj ~= nil then local packet = net_packet() packet:w_begin(0) obj:STATE_Write(packet) packet:r_seek(2) -- свойства 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_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local cse_alife_object__unk3_u32 = packet:r_s32() -- свойства cse_shape local shape_count = packet:r_u8() local shape_type local center local radius if shape_count == 0 then shape_type = 0 center = vector():set(0,0,0) radius = 10.0 shape_count = 1 else for i=1,shape_count do local shape_type = packet:r_u8() if shape_type == 0 then local center = packet:r_vec3() local radius = packet:r_float() else local v1 = packet:r_vec3() local v2 = packet:r_vec3() local v3 = packet:r_vec3() local v4 = packet:r_vec3() end end end -- свойства cse_alife_space_restrictor local restrictor_type = packet:r_u8() -- свойства cse_alife_level_changer local dest_game_vertex_id = packet:r_u16() local dest_level_vertex_id = packet:r_s32() 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() -- свойства se_level_changer local enabled = packet:r_u8() local hint = packet:r_stringZ() local se_level_changer__marker = packet:r_u16() -- if packet:r_elapsed() ~= 0 then get_console():execute("left="..packet:r_elapsed()) end -- свойства cse_alife_object packet:w_u16(game_vertex_id) packet:w_float(cse_alife_object__unk1_f32) packet:w_s32(cse_alife_object__unk2_u32) packet:w_s32(level_vertex_id) packet:w_s32(object_flags) if custom ~= nil then packet:w_stringZ(custom) else packet:w_stringZ(custom_data) end packet:w_s32(story_id) packet:w_s32(cse_alife_object__unk3_u32) -- свойства cse_shape packet:w_u8(shape_count) for i=1,shape_count do packet:w_u8(shape_type) if shape_type == 0 then packet:w_vec3(vector():set(0,0,0)) packet:w_float(2) else packet:w_vec3(vector():set(2,0,0)) packet:w_vec3(vector():set(0,2,0)) packet:w_vec3(vector():set(0,0,2)) packet:w_vec3(vector():set(0,0,0)) end end -- свойства cse_alife_space_restrictor packet:w_u8(restrictor_type) -- свойства cse_alife_level_changer packet:w_u16(dist_gv) packet:w_s32(1) packet:w_vec3(dest_pos) if dist_dir~=nil then packet:w_vec3(dest_dir) else packet:w_vec3(dest_direction) end packet:w_stringZ(dest_level) packet:w_stringZ(dest_graph_point) packet:w_u8(mode) -- свойства se_level_changer packet:w_u8(enabled) packet:w_stringZ(hint) packet:w_u16(se_level_changer__marker) obj:STATE_Read(packet, packet:w_tell()-packet:r_tell()) end return obj end
Функция-генератор создает левел-чейнджер через create и переписывает его через net_packet
Функции создания level changer
Теперь наведем наш генератор левел-чейнджеров на создание «тихого» перехода в окрестности «Юпитера» (сохранитесь перед использованием):
function create_zaton2jupiter_exit()
-- создается переход с ЗАТОНА на ЮПИТЕР
nlc.spawn_lc(db.actor:game_vertex_id(), db.actor:position(), "jupiter", vector():set(-16.040319442749,3.410528421402,206.30738830566), 1, 409, vector():set(0,0,-1.0))
end
Где db.actor:game_vertex_id() — game_vertex, где создается переход; где db.actor:position() — позиция перехода на локации из которой выходите; где «jupiter» — локация, на которую ведет переход; где vector():set(-16.040319442749,3.410528421402,206.30738830566) — позиция, на которой будете на новой локации; где 1 — режим «тихого» перехода; где 409 - game_vertex на новой локации; где vector():set(0,0,-1.0) - направление взгляда на новой локации.
Примечание
Режим «тихого» перехода в ЗП обязателен т.к. в игре нет текста «Перейти на другую локацию?».
Авторы
Выковырял скрипт из мода «Повелитель Зоны».
Написал статью Участник:vllzl