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

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

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

Перейти к: навигация, поиск

Шаг 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

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