--[[
Developed by AMK-Team
File: amkII_rdpk. script
Copyright: © AMK-Team 2009
Author: Refresh

Since: 15.01.2009 23:29
	-- Добавлена поддержка update параметров.
	-- Написаны функции для чтения форматов l32u8v, l32u16v, u8v8.
	-- Добавлены функции чтения net пакетов для cse_alife_human_stalker. 
	-- Добавлены функции чтения net пакетов для cse_alife_monster_base.
Since: 17.01.2009 19:37
	-- Добавлены функции чтения net пакетов для cse_alife_space_restrictor.	
Since: 27.01.2009 23:51
	-- Устранен глюк с u32, лучше его не использовать, в качестве замены брать s32.
Since: 29.01.2009 23:26
	-- Исправлен баг с вылетом на ipairs.
]]--

local dbug=true
function _log(msg)
	if dbug then
		amkII._log(msg)
	end
end

--[[
--	getl32u8v(stt)
--	Читаем данные типа l32u8v
--	@param	object	stt		net пакет.
--]]
function getl32u8v(stt)
	local aTmpTbl = {}
	local iLen = stt:r_s32()
	for i = 1, iLen, 1 do
		table.insert(aTmpTbl, stt:r_u8())
	end
	return aTmpTbl
end

--[[
--	getl32u16v(stt)
--	Читаем данные типа l32u16v
--	@param	object	stt		net пакет.
--]]
function getl32u16v(stt)
	local aTmpTbl = {}
	local iLen = stt:r_s32()
	for i = 1, iLen, 1 do
		table.insert(aTmpTbl, stt:r_u16())
	end
	return aTmpTbl
end

--[[
--	getu8v8(stt)
--	Читаем данные типа u8v8
--	@param	object	stt		net пакет.
--]]
function getu8v8(stt)
	local aTmpTbl = {}
	for i = 1, 8, 1 do
		table.insert(aTmpTbl, stt:r_u8())
	end
	return aTmpTbl
end

--[[
--	amkReadStalker(sobj)
--	Читаем net пакет серверного обьекта сталкера.
--	@param	object	sobj		Серверный обьект сталкера.
--]]
function amkReadStalker(sobj)
	local stt = net_packet()
	local upd = net_packet()
	
	sobj:STATE_Write(stt)
	sobj:UPDATE_Write(upd)

	local iSize1 = stt:w_tell()
	local iSize2 = upd:w_tell()
	
	local aTbl = {}	
	cse_alife_human_stalker(aTbl, stt, upd, iSize1)	
	se_stalker(aTbl, stt, upd, iSize1)

	return aTbl
end

--[[
--	amkReadMonster(sobj)
--	Читаем net пакет серверного обьекта монстра.
--	@param	object	sobj		Серверный обьект монстра.
--]]
function amkReadMonster(sobj)
	local stt = net_packet()
	local upd = net_packet()
	
	sobj:STATE_Write(stt)
	sobj:UPDATE_Write(upd)

	local iSize1 = stt:w_tell()
	local iSize2 = upd:w_tell()
	
	local aTbl = {}	
	cse_alife_monster_base(aTbl, stt, upd)	
	se_monster(aTbl, stt, upd, iSize1)

	return aTbl
end

--[[
--	amkReadRestrictor(sobj)
--	Читаем net пакет серверного обьекта рестриктора.
--	@param	object	sobj		Серверный обьект рестриктора.
--]]
function amkReadRestrictor(sobj)
	local stt = net_packet()
	local upd = net_packet()
	
	sobj:STATE_Write(stt)
	sobj:UPDATE_Write(upd)

	local iSize1 = stt:w_tell()
	local iSize2 = upd:w_tell()
	
	local aTbl = {}	
	cse_alife_space_restrictor(aTbl, stt, upd)	
	return aTbl
end


--[[
--	se_stalker(aTbl, stt, upd, iSize)
--	Читаем данные которые сохраняет se_stalker.script
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--	@param	integer	iSize		Размер net пакета.
--]]
function se_stalker(aTbl, stt, upd, iSize)
	aTbl.iStateOnline = stt:r_u8()
	if aTbl.iStateOnline > 2 then
		aTbl.sCondlist = stt:r_stringZ()
	end
	
	aTbl.bWasSmartTerrain = stt:r_bool()
	aTbl.bDeathDroped 	  = stt:r_bool()
	
	aTbl.aTrash = {}
	for iIndex = stt:r_tell(), iSize - 1, 1 do
		table.insert(aTbl.aTrash, stt:r_u8())
	end		
	return aTbl
end

--[[
--	se_monster(aTbl, stt, upd, iSize)
--	Читаем данные которые сохраняет se_monster.script
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--	@param	integer	iSize		Размер net пакета.
--]]
function se_monster(aTbl, stt, upd, iSize)
	aTbl.iStateOnline = stt:r_u8()
	if aTbl.iStateOnline > 2 then
		aTbl.sCondlist = stt:r_stringZ()
	end	
	aTbl.bWasSmartTerrain = stt:r_bool()
	aTbl.aTrash = {}
	for iIndex = stt:r_tell(), iSize - 1, 1 do
		table.insert(aTbl.aTrash, stt:r_u8())
	end		
	return aTbl
end

--[[
--	cse_alife_space_restrictor(aTbl, stt, upd)
--	Читаем данные класса cse_alife_space_restrictor
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_space_restrictor(aTbl, stt, upd)
	cse_alife_object(aTbl, stt, upd)
	cse_shape(aTbl, stt, upd)
	
	aTbl.iRestType = stt:r_u8()
	return aTbl
end

--[[
--	cse_alife_human_stalker(aTbl, stt, upd)
--	Читаем данные класса cse_alife_human_stalker
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_human_stalker(aTbl, stt, upd, size)
	cse_alife_human_abstract(aTbl, stt, upd)
	cse_ph_skeleton(aTbl, stt, upd)
	
	aTbl.sUpdStartDialog = upd:r_stringZ()		
	return aTbl
end


--[[
--	cse_alife_monster_base(aTbl, stt, upd)
--	Читаем данные класса cse_alife_monster_base
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_monster_base(aTbl, stt, upd)
	cse_alife_monster_abstract(aTbl, stt, upd)
	cse_ph_skeleton(aTbl, stt, upd)
	
	aTbl.iSpecObjectId = stt:r_u16()	 				
	return aTbl
end


--[[
--	cse_alife_human_abstract(aTbl, stt, upd)
--	Читаем данные класса cse_alife_human_abstract
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_human_abstract(aTbl, stt, upd)
	cse_alife_trader_abstract(aTbl, stt, upd)
	cse_alife_monster_abstract(aTbl, stt, upd)
	
	aTbl.aPredicate5 = getl32u8v(stt)
	aTbl.aPredicate4 = getl32u8v(stt)
	return aTbl
end

--[[
--	cse_ph_skeleton(aTbl, stt, upd)
--	Читаем данные класса cse_ph_skeleton
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_ph_skeleton(aTbl, stt, upd)
	aTbl.sSkeletonName 		= stt:r_stringZ()
	aTbl.iSkeletonFlags 	= stt:r_u8()
	aTbl.iSourceId 			= stt:r_u16()
	
	aTbl.iUpdSkeletonFlags 	= upd:r_u8()
	return aTbl
end

--[[
--	cse_alife_trader_abstract(aTbl, stt, upd)
--	Читаем данные класса cse_alife_trader_abstract
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_trader_abstract(aTbl, stt, upd)
	aTbl.iMoney				= stt:r_s32()
	aTbl.sCharacter			= stt:r_stringZ()
	aTbl.iTraderFlags		= stt:r_s32()
	aTbl.sCharacterProfile 	= stt:r_stringZ()
	aTbl.iCommunityIndex   	= stt:r_s32()
	aTbl.iRank				= stt:r_s32()
	aTbl.iReputation		= stt:r_s32()
	aTbl.sCheckCharacters  	= stt:r_stringZ()
	return aTbl
end

--[[
--	cse_alife_monster_abstract(aTbl, stt, upd)
--	Читаем данные класса cse_alife_monster_abstract
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_monster_abstract(aTbl, stt, upd)
	cse_alife_creature_abstract(aTbl, stt, upd)
	
	aTbl.sBaseOutRes 		= stt:r_stringZ()
	aTbl.sBaseInRes 		= stt:r_stringZ()
	aTbl.iSmartId 			= stt:r_u16()
	aTbl.iSmartTaskActive 	= stt:r_u8()

	aTbl.iUpdu16u1 			= upd:r_u16()
    aTbl.iUpdu16u2 			= upd:r_u16()
    aTbl.iUpds32u3 			= upd:r_s32()
    aTbl.iUpds32u4 			= upd:r_s32()
  
	return aTbl
end

--[[
--	cse_alife_creature_abstract(aTbl, stt, upd)
--	Читаем данные класса cse_alife_creature_abstract
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_creature_abstract(aTbl, stt, upd)
	cse_alife_dynamic_object_visual(aTbl, stt, upd)

	aTbl.iTeam			= stt:r_u8()
	aTbl.iSquad			= stt:r_u8()
	aTbl.iGroup			= stt:r_u8()
	aTbl.iHealth		= stt:r_float()
	aTbl.aDynOutRest	= getl32u16v(stt)
	aTbl.aDynInRest		= getl32u16v(stt)  
	aTbl.iKillerId		= stt:r_u16()
	aTbl.aGameDeathTime	= getu8v8(stt)

	aTbl.iUpdHealth		= upd:r_float()
	aTbl.iUpdTimeStamp	= upd:r_s32()
	aTbl.iUpdCrtFlags	= upd:r_u8()
	aTbl.vUpdPosition	= upd:r_vec3()	
	aTbl.iUpdModel		= upd:r_float()
	aTbl.iUpdDir		= upd:r_vec3()	
	aTbl.iUpdTeam		= upd:r_u8()
	aTbl.iUpdSquad		= upd:r_u8()
	aTbl.iUpdGroup		= upd:r_u8()
	return aTbl
end

--[[
--	cse_alife_dynamic_object_visual(aTbl, stt, upd)
--	Читаем данные класса cse_alife_dynamic_object_visual
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_dynamic_object_visual(aTbl, stt, upd)
	cse_alife_object(aTbl, stt, upd)
	cse_visual(aTbl, stt, upd)	
	return aTbl
end

--[[
--	cse_alife_object(aTbl, stt, upd)
--	Читаем данные класса cse_alife_object
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_alife_object(aTbl, stt, upd)
	aTbl.iGameVertex	= stt:r_u16()
	aTbl.iDist 			= stt:r_float()
	aTbl.IDirControl 	= stt:r_s32()
	aTbl.iLevelVertex 	= stt:r_s32()	
	aTbl.iObjFlags		= stt:r_s32()
	aTbl.sCustomData 	= stt:r_stringZ()
	aTbl.iStoryId 		= stt:r_s32()	
	aTbl.iSpawnSid 		= stt:r_s32()
	return aTbl
end

--[[
--	cse_visual(aTbl, stt, upd)
--	Читаем данные класса cse_visual
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_visual(aTbl, stt, upd)
	aTbl.sVisualName 	= stt:r_stringZ()
	aTbl.iVisualFlags 	= stt:r_u8()
	return aTbl
end

--[[
--	cse_shape(aTbl, stt, upd)
--	Читаем данные класса cse_shape
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function cse_shape(aTbl, stt, upd)
	local iCount = stt:r_u8()
	aTbl.aShape = {}
	for i = 1, iCount do
		local iShapeType = stt:r_u8()
		aTbl.aShape[i] = {}
		aTbl.aShape[i].iShapeType = iShapeType
		if iShapeType == 0 then
			aTbl.aShape[i].vCenter = stt:r_vec3()
			aTbl.aShape[i].iRadius = stt:r_float()
		else
			aTbl.aShape[i].v1 = stt:r_vec3()
			aTbl.aShape[i].v2 = stt:r_vec3()
			aTbl.aShape[i].v3 = stt:r_vec3()
			aTbl.aShape[i].vOffset = stt:r_vec3()
		end
	end 
	return aTbl
end



