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

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

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

Перейти к: навигация, поиск
(Новая страница: «== Шаг 1 == Первым делом скажу, что мы будем создавать переходы «подпольным» способом — чере...»)
 
(<<< aka_sektor)
 
(не показана 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(«level_changer», pos, 1, gv)
+
local obj = alife():create("level_changer", pos, 1, gv)
  
if obj nil then
+
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
+
-- свойства 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
+
-- свойства 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
+
-- свойства cse_alife_space_restrictor
 
local restrictor_type = packet:r_u8()
 
local restrictor_type = packet:r_u8()
 
+
свойства cse_alife_level_changer
+
-- свойства 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
+
-- свойства 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
+
-- if packet:r_elapsed() ~= 0 then get_console():execute("left="..packet:r_elapsed()) end
 
+
свойства cse_alife_object
+
-- свойства 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 nil then
+
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
+
-- свойства 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
+
-- свойства cse_alife_space_restrictor
 
packet:w_u8(restrictor_type)
 
packet:w_u8(restrictor_type)
 
+
свойства cse_alife_level_changer
+
-- свойства 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
+
-- свойства 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())
Строка 153: Строка 153:
  
 
Написал статью [[Участник:vllzl]]
 
Написал статью [[Участник:vllzl]]
 +
[[Категория:Неоформленные статьи]]

Текущая версия на 23:47, 19 марта 2014

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