------------------------------------------------ -- 作者: 王圣 -- 日期: 2021-03-19 -- 文件: TaskBehaviorManager.lua -- 模块: TaskBehaviorManager -- 描述: 任务行为管理 ------------------------------------------------ -- 引用 local L_Talk = require "Logic.TaskSystem.Behavior.TalkCharactor" local L_PlaneCopy = require "Logic.TaskSystem.Behavior.ArrivePosEx" local L_OpenUI = require "Logic.TaskSystem.Behavior.TaskOpenUI" local L_PlaneCopyAnim = require "Logic.TaskSystem.Behavior.ArriveToAnim" local L_PassCopy = require "Logic.TaskSystem.Behavior.PassCopy" local L_Container = require "Logic.TaskSystem.Container.TaskBehaviorContainer" local L_Collect = require "Logic.TaskSystem.Behavior.BCollection" local TaskBehaviorManager = { IsPause = false, Container = nil } function TaskBehaviorManager:New() local _m = Utils.DeepCopy(self) _m.Container = L_Container:New() return _m end function TaskBehaviorManager:IniItialization() end function TaskBehaviorManager:UnIniItialization() self.Container:Clear() end -- 创建行为 function TaskBehaviorManager:Create(type, id) local _behavior = nil; if type == TaskBeHaviorType.Talk then _behavior = self:CreateTalk(type, id) elseif type == TaskBeHaviorType.Kill then _behavior = self:CreateKill(type, id) elseif type == TaskBeHaviorType.Collection then _behavior = self:CreateCollection(type, id) elseif type == TaskBeHaviorType.CopyKillForUI or type == TaskBeHaviorType.OpenUI then _behavior = self:CreateOpenUI(type, id) elseif type == TaskBeHaviorType.PassCopy then _behavior = self:CreatePassCopy(type, id) elseif type == TaskBeHaviorType.Level then _behavior = self:CreateLimitLv(type, id) elseif type == TaskBeHaviorType.CopyKill then _behavior = self:CreateCopyKill(type, id) elseif type == TaskBeHaviorType.FindCharactor then _behavior = self:CreateFindCharactor(type, id) elseif type == TaskBeHaviorType.SubMit then _behavior = self:CreateSubMitItem(type, id) elseif type == TaskBeHaviorType.ArrivePos then _behavior = self:CreateArrivePos(type, id) elseif type == TaskBeHaviorType.OpenUIToSubMit or type == TaskBeHaviorType.AddFriends then _behavior = self:CreateOpenUISbmit(type, id) elseif type == TaskBeHaviorType.MountFlyUp then _behavior = self:CreateTaskMountFlyUp(type, id) elseif type == TaskBeHaviorType.CollectItem or type == TaskBeHaviorType.CollectRealItem then _behavior = self:CreateCollectItem(type, id) elseif type == TaskBeHaviorType.ArrivePosEx then _behavior = self:CreateArrivePosEx(type, id) elseif type == TaskBeHaviorType.ArriveToAnim then _behavior = self:CreateArriveToAnim(type, id) end return _behavior end -- 对话行为 function TaskBehaviorManager:CreateTalk(type, id) local _behavior = L_Talk:New(type, id) return _behavior end -- 杀怪(杀玩家)行为 function TaskBehaviorManager:CreateKill(type, id) -- local _behavior = L_PlaneCopy:New(type, id) -- return _behavior end -- 采集行为 function TaskBehaviorManager:CreateCollection(type, id) local _behavior = L_Collect:New(type, id) return _behavior end -- 打开UI行为 function TaskBehaviorManager:CreateOpenUI(type, id) local _behavior = L_OpenUI:New(type, id) return _behavior end -- 传送进入副本行为 function TaskBehaviorManager:CreatePassCopy(type, id) local _behavior = L_PassCopy:New(type, id) return _behavior end -- 达到等级行为 function TaskBehaviorManager:CreateLimitLv() -- LimitLevel behavior = new LimitLevel(); -- return behavior; end function TaskBehaviorManager:CreateCopyKill() -- CopyKill behavior = new CopyKill(); -- return behavior; end -- 寻人 function TaskBehaviorManager:CreateFindCharactor() -- FindCharactor behavior = new FindCharactor(); -- return behavior; end -- 提交道具 function TaskBehaviorManager:CreateSubMitItem() -- SubMitItem behavior = new SubMitItem(); -- return behavior; end -- 到达某个位置 function TaskBehaviorManager:CreateArrivePos() -- ArrivePos behavior = new ArrivePos(); -- return behavior; end -- 打开UI完成任务 function TaskBehaviorManager:CreateOpenUISbmit() -- TaskOpenUISubmit behavior = new TaskOpenUISubmit(); -- return behavior; end -- 起飞飞行坐骑 function TaskBehaviorManager:CreateTaskMountFlyUp() -- TaskMountFltUp behaivor = new TaskMountFltUp(); -- return behaivor; end -- 收集道具 function TaskBehaviorManager:CreateCollectItem() -- CollectItem behaivor = new CollectItem(); -- return behaivor; end -- 到达指定位置(不转圈) function TaskBehaviorManager:CreateArrivePosEx(type, id) local _behavior = L_PlaneCopy:New(type, id) return _behavior end -- 到达指定地点进入位面然后播放特定动作 function TaskBehaviorManager:CreateArriveToAnim(type, id) local _behavior = L_PlaneCopyAnim:New(type, id) return _behavior end -- 添加行为 function TaskBehaviorManager:Add(taskId, behavior) -- Debug.LogError("yy TaskBehaviorManager:Add "..tostring(taskId)) -- Debug.LogTable(behaivor) self.Container:Add(taskId, behavior) end -- 获取某个任务的行为 function TaskBehaviorManager:GetBehavior(taskId) local _ret = self.Container:Find(taskId) return _ret; end -- 删除某个任务行为 function TaskBehaviorManager:RmoveBehavior(taskId) self.Container:Remove(taskId) end function TaskBehaviorManager:GetBehaviorCount() return self.Container:Count() end -- 是否完成行为 function TaskBehaviorManager:IsEndBehavior(taskId) local _ret = false; local _behavior = self:GetBehavior(taskId); if _behavior ~= nil then _ret = _behavior.TaskTarget:IsReach(_behavior.Type); end return _ret; end -- 去完成某个行为 function TaskBehaviorManager:DoBehavior(taskId, isClick, isClickByForm) -- 如果暂停直接返回 if self.IsPause then return; end local _behavior = self:GetBehavior(taskId); Debug.LogTable(_behavior) local _task = GameCenter.LuaTaskManager:GetTask(taskId); if _task == nil then return; end -- 判断是否有战力限制 local _limitPower = _task:GetLimitPower(); if _limitPower > 0 and not _task:GetIgnoLimit() then -- 有战力限制 if GameCenter.GameSceneSystem:GetLocalPlayerFightPower() >= _limitPower then self:OnDoBehavior(_behavior, _task, isClick, isClickByForm); else -- 弹出提示 GameCenter.MsgPromptSystem:ShowMsgBox(DataConfig.DataMessageString.Get("Task_Score_Limit"), DataConfig.DataMessageString.Get("Task_TiShi_1"), DataConfig.DataMessageString.Get("Task_TiShi_2"), function(x) if x == MsgBoxResultCode.Button1 then self:OnDoBehavior(_behavior, _task, isClick, isClickByForm); _task:SetIgnoLimit(true) elseif x == MsgBoxResultCode.Button2 then -- 打开变强界面 GameCenter.MainFunctionSystem:DoFunctionCallBack(FunctionStartIdCode.BianQiang); end end); end else self:OnDoBehavior(_behavior, _task, isClick, isClickByForm); end end function TaskBehaviorManager:OnDoBehavior(behavior, task, isClick, isClickByForm) if behavior ~= nil then if behavior.Type ~= TaskBeHaviorType.CopyKill and behavior.Type ~= TaskBeHaviorType.CopyKillForUI and task.Data.Type ~= TaskType.ZhanChang and isClick then if GameCenter.MapLogicSystem.MapCfg.Type == UnityUtils.GetObjct2Int(MapTypeDef.Copy) then GameCenter.MsgPromptSystem:ShowPrompt(DataConfig.DataMessageString.Get("EXIT_COPY_FOR_GOON_TASK")) return; end end if task ~= nil then if isClick and task.IsShowGuide then task.IsShowGuide = false; end if isClickByForm then if GameCenter.MapLogicSystem.MapCfg ~= nil and GameCenter.MapLogicSystem.MapCfg.Type == UnityUtils.GetObjct2Int(MapTypeDef.Copy) then -- 如果在副本里面 弹出消息确认框是否退出副本继续任务 GameCenter.MsgPromptSystem:ShowMsgBox(DataConfig.DataMessageString.Get("TASK_TISHI_1"), function(x) if x == MsgBoxResultCode.Button2 then -- 调用离开副本接口 GameCenter.LuaTaskManager.CurSelectTaskID = task.Data.Id; GameCenter.LuaTaskManager.IsAutoTaskForTransPort = true; GameCenter.MapLogicSystem:DoLeaveMap() return; end end); end end GameCenter.LuaTaskManager.CurSelectTaskID = task.Data.Id; behavior:DoBehavior(isClick); end end end -- 更新行为 function TaskBehaviorManager:UpdateBehavior(behavior, target) if behavior ~= nil then behavior:UpdateBehavior(target) end end function TaskBehaviorManager:SetBehaviorTag(id, count, talkId, x, y, itemID, type, behavior) if behavior ~= nil then behavior:SetTarget(id, count, talkId, x, y, itemID, type); end end -- 获取某个任务id对应任务的行为 function TaskBehaviorManager:GetTaskBehaviorType(taskId) local _ret = TaskBeHaviorType.Default local _behavior = self:GetBehavior(taskId); if _behavior ~= nil then _ret = _behavior.Type; end return _ret; end -- 心跳 function TaskBehaviorManager:OnUpdate(dt) self.Container:OnUpdate(dt); end return TaskBehaviorManager