一个漂亮的任务部件(内存分配的自解方式)

--[[
文件名	: 	任务部件.lua
作者  	:  	陈泽丹
创建时间:  	2013-1-22
描述	:
--]]



-- ------------------------------------
-- 创建任务部件
-- ------------------------------------
function API_GetTaskUID( _task_obj )
	return "Sign " .. tostring(_task_obj)
end

G_ROLE_TASK_PART = {}
function Lua_GetTaskPart(_role)
	local function do_Lua_GetTaskPart()
		local obj_list = {}
		local task_context = nil
		local is_init = false
		local public = {}

		--初始化任务
		function public.InitTaskPart()
			--用pairs以把删除的任务排除掉
			local t = {}
			task_context = Lua_GetTaskContext(_role)
			local t_obj_data = Lua_getValueSet( task_context.OBJ_DATA )
			local len = table.getn(t_obj_data)
			for i=1, len do
				t[table.getn(t) + 1] = Lua_Task_Deserialize(_role, t_obj_data[i])
			end
			obj_list = {}
			for i,v in pairs(t) do
				public.addTask(t[i])
			end
			is_init = true
		end

		--是否初始化过
		function public.IsInit()
			return is_init
		end

		--反初始化任务
		function public.UninitTaskPart()
			--API_Trace( "UninitTaskPart" )
			--public.showContext()
			--用pairs以把删除的任务排除掉
			task_context.OBJ_DATA = {}
			for i, v in pairs(obj_list) do
				task_context.OBJ_DATA[ table.getn(task_context.OBJ_DATA) + 1 ] = Lua_Task_Serialize(v)
			end
			--循环操作是外包的, 有可能更改当前循环流水线,故需先备份
			local t_del = Lua_getValueSet( obj_list )
			local len = table.getn(t_del)
			for i=1, len do
				t_del[i].setState( G_TASK_STATE.DELETE )
			end
			obj_list = {}
			Lua_SetTaskContext(_role, task_context)
		end

		--显示当前任务BUG数据
		function public.showContext()
			local count = 0
			for i, v in pairs(obj_list) do
				count = count + 1
			end
			API_Trace( "obj size: " .. count .. ": " .. Lua_T2S(obj_list) )
			API_Trace( "task_context: " .. Lua_T2S(task_context) )
		end

		--接受任务
		function public.addTask( _obj )
			if nil == _obj then
				return
			end
			Lua_SendRefreshTaskItem( _role, _obj )
			for i, v in pairs(obj_list) do
				if API_GetTaskUID(v) == API_GetTaskUID(_obj) then
					obj_list[i] = _obj
					return
				end
			end
			obj_list[ table.getn(obj_list) + 1 ] = _obj
		end

		--删除任务
		function public.delTask( _obj )
			if nil == _obj then
				return
			end
			Lua_SendDeleleTaskItem( _role, _obj )
			local len = table.getn(obj_list)
			for i=1, len do
				if obj_list[i] == _obj then
					obj_list[i] = obj_list[len]
					obj_list[len] = nil
					break
				end
			end
		end

		--获得任务集
		function public.getTaskList()
			return obj_list
		end

		--获得任务共享缓存区
		function public.getTaskData()
			return task_context.SHARE_DATA
		end

		--清空玩家所有任务数据
		function public.Clear()
			--循环操作是外包的, 有可能更改当前循环流水线,故需先备份
			local t_del = Lua_getValueSet( obj_list )
			local len = table.getn(t_del)
			for i=1, len do
				t_del[i].setState( G_TASK_STATE.DELETE )
			end
			obj_list = {}
			task_context.OBJ_DATA = {}
			task_context.SHARE_DATA = {}
			Lua_SetTaskContext(_role, task_context)
			Lua_SendRefreshTaskList( _role )
		end

		--删除自身
		function public.Delete()
			if nil ~= G_ROLE_TASK_PART[_role] then
				G_ROLE_TASK_PART[_role].UninitTaskPart()
				G_ROLE_TASK_PART[_role] = nil
			end
		end

		--是否有主线任务进行中
		function public.HasStoryTask()
			for i, v in pairs(obj_list) do
				if nil ~= v.DBData and nil ~= v.DBData.STORY_TASK_INDEX then
					return true
				end
			end
			return false
		end

		return public
	end


	--单例模式获得玩家任务部件
	if nil == G_ROLE_TASK_PART[_role] then
		G_ROLE_TASK_PART[_role] = do_Lua_GetTaskPart()
	end
	--返回相关对象
	return G_ROLE_TASK_PART[_role]
end


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值