class "ui_ms_teleport" (CUIScriptWnd)

function ui_ms_teleport:__init(owner) super()
	self.owner = owner
	self:InitControls()
	self:InitCallBacks()
	self.x=0
	self.y=0
	self.z=0
	self.lname=""
	self.gv=0
	self.lv=0
	self.dir=vector():set(0,0,0)
	self.question=1
	self.id=0
	self.param_xinit=false
	self.param_yinit=false
	self.param_zinit=false
	self.param_linit=false
	self.param_ginit=false
	self.param_lvinit=false
	self.param_qinit=false
	self.param_idinit=false
end

function ui_ms_teleport:__finalize() 

end

function ui_ms_teleport:InitControls()
self:Init(50,50,550,450)
local xml = CScriptXmlInit()
xml:ParseFile("ui_ms.xml")
xml:InitStatic("back_video", self)
xml:InitStatic("background", self)
self:Register(xml:Init3tButton("caption", self),"caption")
self:Register(xml:Init3tButton("btn_1", self),"btn_1")
self:Register(xml:Init3tButton("btn2", self),"btn2")
self:Register(xml:Init3tButton("btn3", self),"btn3")
self:Register(xml:Init3tButton("btn_quit", self),"btn_quit")
self:Register(xml:InitEditBox("edit_box", self), "edit_box")
self:Register(xml:InitEditBox("edi1t_box", self), "edi1t_box")
local caption = self:GetButton("caption")
local btn_1 = self:GetButton("btn_1")
caption:SetText("Омега 4 Введи секцию из фаила _ms_teleport.ltx")
btn_1:SetText("Переместиться")
end

function ui_ms_teleport:InitCallBacks()
self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.set, self)
self:AddCallback("btn2", ui_events.BUTTON_CLICKED, self.setdel, self)
self:AddCallback("btn3", ui_events.BUTTON_CLICKED, self.help, self)
self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_close, self)
end

function ui_ms_teleport:OnKeyboard(dik, keyboard_action)
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
		if dik == DIK_keys.DIK_ESCAPE then
			self:on_close()
		end		
	end
	return true
end

function ui_ms_teleport:set()
local text = self:GetEditBox("edit_box"):GetText()
if text~="" then
	self:teleportate(text)
end
end

function ui_ms_teleport:help()
local ini =ini_file("misc\\_ms_teleport.ltx") 
if ini:section_exist("help") then	
news_manager.send_tip(db.actor,tostring(ini:r_string("help","string"))..tostring(ini:r_string("help","string2"))..tostring(ini:r_string("help","string3")))
end
end

function ui_ms_teleport:setdel()
local text = self:GetEditBox("edi1t_box"):GetText()
if text~="" then
	self:del_sec(text)
end
end

function ui_ms_teleport:del_sec(str)
local id=0
local ini =ini_file("misc\\_ms_teleport.ltx") 
if ini:section_exist(str) then	
if ini:line_exist(str,"id") then
id=ini:r_s32(str,"id")
self:del(id)
end
end
end

function ui_ms_teleport:teleportate(str)
	local ini =ini_file("misc\\_ms_teleport.ltx") 
	if ini:section_exist(str) then	
	if ini:line_exist(str,"x") then
	self.x=ini:r_float(str,"x")
	self.param_xinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра X не существует,проверьте конфигурационный фаил")
	self.param_xinit=false
	end
	if ini:line_exist(str,"y") then
	self.y=ini:r_float(str,"y")
	self.param_yinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра Y не существует,проверьте конфигурационный фаил")
	self.param_yinit=false
	end
	if ini:line_exist(str,"z") then
	self.z=ini:r_float(str,"z")
	self.param_zinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра Z не существует,проверьте конфигурационный фаил")
	self.param_zinit=false
	end
	if ini:line_exist(str,"lname_for_LC") then
	self.lname=tostring(ini:r_string(str,"lname_for_LC"))
	self.param_linit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра lname_for_LC не существует,проверьте конфигурационный фаил")
	self.param_linit=false
	end
	if ini:line_exist(str,"gv") then
	self.gv=ini:r_float(str,"gv")
	self.param_ginit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра GV не существует,проверьте конфигурационный фаил")
	self.param_ginit=false
	end
	if ini:line_exist(str,"lv") then
	self.lv=ini:r_float(str,"lv")
	self.param_lvinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра LV не существует,проверьте конфигурационный фаил")
	self.param_lvinit=false
	end
	if ini:line_exist(str,"question") then
	self.question=ini:r_s32(str,"question")
	self.param_qinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра Question не существует,проверьте конфигурационный фаил")
	self.param_qinit=false
	end
	if ini:line_exist(str,"id") then
	self.id=ini:r_s32(str,"id")
	self.param_idinit=true
	else
	news_manager.send_tip(db.actor,"Внимание:параметра Id не существует,проверьте конфигурационный фаил")
	self.param_idinit=false
	end
	if (self.param_idinit and self.param_qinit and self.param_lvinit and self.param_ginit and self.param_linit and self.param_zinit and self.param_yinit and self.param_xinit) then
	self:create_level_changer(self.id,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),self.lv,self.gv,vector():set(self.x,self.y,self.z),self.dir,self.lname,self.question)
	else
	naews_manager.send_tip(db.actor,"Не все параметры существуют в секции:"..str..".Проверьте на целостность фаил _ms_teleport.ltx")
	end
	else
		news_manager.send_tip(db.actor,"Секция:"..str..",Не существует!")
	end
		self:on_close()	
end

function ui_ms_teleport: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())
 self:del(p_story_id)
end

function ui_ms_teleport:del(obj_id)
	local sim = alife()
	local se_obj = sim:story_object(obj_id)
	if se_obj then
	sim:release(se_obj, true)
	news_manager.send_tip(db.actor,"Object :"..tostring(obj_id).."_realised")
	end
end

function ui_ms_teleport:on_close()
	self:GetHolder():start_stop_menu (self,true)
end
