--[[
Developed by AMK-Team
File: amkII_wrpk. 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.	
]]--

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

--[[
--	setl32u8v(aTbl, stt)
--	Записываем данные типа l32u8v
--	@param	object	stt		net пакет.
--]]
function setl32u8v(aTbl, stt)
	local iLen = table.getn(aTbl)
	stt:w_s32(iLen)
	for i = 1, iLen, 1 do
		stt:w_u8(aTbl[i])
	end
end

--[[
--	setl32u16v(aTbl, stt)
--	Записываем данные типа l32u16v
--	@param	object	stt		net пакет.
--]]
function setl32u16v(aTbl, stt)
	local iLen = table.getn(aTbl)
	stt:w_s32(iLen)
	for i = 1, iLen, 1 do
		stt:w_u16(aTbl[i])
	end
end

--[[
--	setu8v8(aTbl, stt)
--	Записываем данные типа u8v8
--	@param	object	stt		net пакет.
--]]
function setu8v8(aTbl, stt)
	for i = 1, 8, 1 do
		stt:w_u8(aTbl[i])
	end
end

--[[
--	amkWriteStalker(aTbl, sobj)
--	Записываем в net пакеты серверного обьекта сталкера.
--	@param	object	sobj		Серверный обьект сталкера.
--]]
function amkWriteStalker(aTbl, sobj)
	local stt = net_packet()
	local upd = net_packet()
  	
	cse_alife_human_stalker(aTbl, stt, upd)	
	se_stalker(aTbl, stt, upd)
	
	local size1	= stt:w_tell()
	local size2	= upd:w_tell()

	stt:r_seek(0)
	upd:r_seek(0)
	
	sobj:STATE_Read(stt, size1)
	sobj:UPDATE_Read(upd)
end

--[[
--	amkWriteMonster(aTbl, sobj)
--	Записываем в net пакеты серверного обьекта монстра.
--	@param	object	sobj		Серверный обьект монстра.
--]]
function amkWriteMonster(aTbl, sobj)
	local stt = net_packet()
	local upd = net_packet()
	
	cse_alife_monster_base(aTbl, stt, upd)	
	se_monster(aTbl, stt, upd)
	
	local iSize1 = stt:w_tell()
	local iSize2 = upd:w_tell()
	
	stt:r_seek(0)
	upd:r_seek(0)
	
	sobj:STATE_Read(stt, size1)
	sobj:UPDATE_Read(upd)
	
	amkII.amkSwitch(sobj.id, true)
end

--[[
--	amkWriteRestrictor(aTbl, sobj)
--	Записываем в net пакеты серверного обьекта  рестриктора.
--	@param	object	sobj		Серверный обьект рестриктора.
--]]
function amkWriteRestrictor(aTbl, sobj)
	local stt = net_packet()
	local upd = net_packet()
	
	cse_alife_space_restrictor(aTbl, stt, upd)	
	
	local iSize1 = stt:w_tell()
	local iSize2 = upd:w_tell()
	
	stt:r_seek(0)
	upd:r_seek(0)
	
	sobj:STATE_Read(stt, size1)
	sobj:UPDATE_Read(upd)
	
	amkII.amkSwitch(sobj.id, true)
end

--[[
--	se_stalker(aTbl, stt, upd)
--	Записываем данные которые сохраняет se_stalker.script
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--]]
function se_stalker(aTbl, stt, upd)
	stt:w_u8(aTbl.iStateOnline)
	if aTbl.iStateOnline > 2 then
		stt:w_stringZ(aTbl.sCondlist)
	end	
	stt:w_bool(aTbl.bWasSmartTerrain)
	stt:w_bool(aTbl.bDeathDroped)

	for k,v in ipairs(aTbl.aTrash) do
		stt:w_u8(v)
	end	
end

--[[
--	se_monster(aTbl, stt, upd,)
--	Записываем данные которые сохраняет se_monster.script
--	@param	table		aTbl		Таблица данных.
--	@param	object	stt		net пакет.
--	@param	object	upd		net пакет.
--	@param	integer	iSize		Размер net пакета.
--]]
function se_monster(aTbl, stt, upd)
	stt:w_u8(aTbl.iStateOnline)
	if aTbl.iStateOnline > 2 then
		stt:w_stringZ(aTbl.sCondlist)
	end	
	stt:w_bool(aTbl.bWasSmartTerrain)
	
	for k,v in ipairs(aTbl.aTrash) do
		stt:w_u8(v)
	end	
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)
	
	stt:r_u8(aTbl.iRestType)
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)
	cse_alife_human_abstract(aTbl, stt, upd)
	cse_ph_skeleton(aTbl, stt, upd)
	
	upd:w_stringZ(aTbl.sUpdStartDialog)
	--for i,v in ipairs(aTbl.aTrash) do
	--	stt:w_u8(v)
	--end
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)
	
	stt:w_u16(aTbl.iSpecObjectId)	 				
	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)
	
	setl32u8v(aTbl.aPredicate5, stt)
	setl32u8v(aTbl.aPredicate4, stt)	
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)
	stt:w_stringZ(aTbl.sSkeletonName)
	stt:w_u8(aTbl.iSkeletonFlags)
	stt:w_u16(aTbl.iSourceId)
	
	upd:w_u8(aTbl.iUpdSkeletonFlags)
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)
	stt:w_s32(aTbl.iMoney)
	stt:w_stringZ(aTbl.sCharacter)
	stt:w_s32(aTbl.iTraderFlags)
	stt:w_stringZ(aTbl.sCharacterProfile)
	stt:w_s32(aTbl.iCommunityIndex)
	stt:w_s32(aTbl.iRank)
	stt:w_s32(aTbl.iReputation)
	stt:w_stringZ(aTbl.sCheckCharacters)
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)
	
	stt:w_stringZ(aTbl.sBaseOutRes)
	stt:w_stringZ(aTbl.sBaseInRes)
	stt:w_u16(aTbl.iSmartId)
	stt:w_u8(aTbl.iSmartTaskActive)	

	upd:w_u16(aTbl.iUpdu16u1)
	upd:w_u16(aTbl.iUpdu16u2)
	upd:w_s32(aTbl.iUpds32u3)
	upd:w_s32(aTbl.iUpds32u4)	
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)

	stt:w_u8(aTbl.iTeam)
	stt:w_u8(aTbl.iSquad)
	stt:w_u8(aTbl.iGroup)
	stt:w_float(aTbl.iHealth)
	setl32u16v(aTbl.aDynOutRest, stt)
	setl32u16v(aTbl.aDynInRest, stt)  
	stt:w_u16(aTbl.iKillerId)
	setu8v8(aTbl.aGameDeathTime, stt)

	upd:w_float(aTbl.iUpdHealth)
	upd:w_s32(aTbl.iUpdTimeStamp)
	upd:w_u8(aTbl.iUpdCrtFlags)
	upd:w_vec3(aTbl.vUpdPosition)	
	upd:w_float(aTbl.iUpdModel)	
	upd:w_vec3(aTbl.iUpdDir)	
	upd:w_u8(aTbl.iUpdTeam)
	upd:w_u8(aTbl.iUpdSquad)
	upd:w_u8(aTbl.iUpdGroup)
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)
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)
	stt:w_u16(aTbl.iGameVertex)
	stt:w_float(aTbl.iDist)
	stt:w_s32(aTbl.IDirControl)
	stt:w_s32(aTbl.iLevelVertex)	
	stt:w_s32(aTbl.iObjFlags)
	stt:w_stringZ(aTbl.sCustomData)
	stt:w_s32(aTbl.iStoryId)	
	stt:w_s32(aTbl.iSpawnSid)
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)
	stt:w_stringZ(aTbl.sVisualName)
	stt:w_u8(aTbl.iVisualFlags)
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 = table.getn(aTbl.aShape)
	stt:w_u8(iCount)
	for i = 1, iCount do
		stt:w_u8(aTbl.aShape[i].iShapeType)
		if aTbl.aShape[i].iShapeType == 0 then
			stt:w_vec3(aTbl.aShape[i].vCenter)
			stt:w_float(aTbl.aShape[i].iRadius)
		else
			stt:w_vec3(aTbl.aShape[i].v1)
			stt:w_vec3(aTbl.aShape[i].v2)
			stt:w_vec3(aTbl.aShape[i].v3)
			stt:w_vec3(aTbl.aShape[i].vOffset)
		end
	end
end
