QuestProxy = class('QuestProxy', pm.Proxy) QuestProxy.Instance = nil; QuestProxy.NAME = "QuestProxy" autoImport('QuestData') autoImport('EOtherData') autoImport("WholeQuestData") autoImport("TraceData") --場景管理,場景的載入佇列管理等 QuestProxy.BossStep = { Visit = BossCmd_pb.EBOSSSTEP_VISIT, Summon = BossCmd_pb.EBOSSSTEP_SUMMON, Dialog = BossCmd_pb.EBOSSSTEP_DIALOG, Boss = BossCmd_pb.EBOSSSTEP_BOSS, Clear = BossCmd_pb.EBOSSSTEP_CLEAR, End = BossCmd_pb.EBOSSSTEP_END, } local tempArray = {} function QuestProxy:ctor(proxyName, data) self.proxyName = proxyName or QuestProxy.NAME if(QuestProxy.Instance == nil) then QuestProxy.Instance = self end if data ~= nil then self:setData(data) end self.questList = {} self.dialogMessage = {} self.detailList = {} --日常任務數據 self.DailyQuestData = {} -- 非任務追蹤 self.traceDatas = {} -- 副本任務 self.fubenQuestMap = {}; --menu 解鎖 self.menuDatas = {} self:initMenuQuestReward() --test -- self:test() -- 世界boss玩法 self.worldbossQuest = {} end function QuestProxy:initMenuQuestReward( ) for k,v in pairs(Table_Menu) do if(v.Condition.quest and #v.Condition.quest >0 and v.Show == 1)then for i=1,#v.Condition.quest do local questId = v.Condition.quest[i] local id = self:getQuestID(questId) local datas = self.menuDatas[id] or {} datas[#datas+1] = v self.menuDatas[id] = datas end end end end function QuestProxy:CleanAllQuest( ) -- body for k,v in pairs(self.questList) do for i = #v,1,-1 do FunctionQuest.Me():stopTrigger(v[i]) ReusableObject.Destroy(v[i]) v[i] = nil end end GameFacade.Instance:sendNotification(ServiceEvent.QuestQuestList) end function QuestProxy:tryRemoveQuestId( id,type ) -- body if(type == nil)then type = SceneQuest_pb.EQUESTLIST_ACCEPT end local list = self.questList[type] if(list)then for j=1,#list do local oldSingle = list[j] if(oldSingle.id == id)then FunctionQuest.Me():stopTrigger(oldSingle) ReusableObject.Destroy(oldSingle) table.remove(list,j) break; end end end end function QuestProxy:QuestQuestList(data) -- body local type = data.type -- helplog("QuestQuestList") local list = self.questList[type] or {} if(type == SceneQuest_pb.EQUESTLIST_CANACCEPT)then list = {} end -- begin -- add:根據data.clear欄位清空相應型別的本地任務快取 2018.5.9 zhouxin if(data.clear and #list>0)then for k,v in pairs(list) do self:tryRemoveQuestId(v.id,type) end TableUtility.ArrayClear(list); end -- end for i=1,#data.list do local single = data.list[i] if(single.id ~= 0)then self:tryRemoveQuestId(single.id,type) local questData = QuestData.CreateAsArray(QuestDataScopeType.QuestDataScopeType_CITY) questData:setQuestData(single) questData:setQuestListType(type) table.insert(list,questData) FunctionQuest.Me():handleQuestInit(questData) else -- helplog("quest id is 0:") end end self.questList[type] = list end function QuestProxy:getDetailDataById( id ) -- body for i=1,#self.detailList do local single = self.detailList[i] if(single.questId == id)then return single,i end end end function QuestProxy:getQuestListInOrder( type ,ifNeedSort) -- body local questList = {} if(self.questList[type])then questList = {unpack(self.questList[type])} if(ifNeedSort)then if(questList ~=nil and #questList ~=0 )then table.sort(questList,function (t1,t2) if(t1.type == t2.type)then if(t1.type == QuestDataType.QuestDataType_WANTED)then return t1.time > t2.time else return t1.orderId < t2.orderId end elseif(t1.type == QuestDataType.QuestDataType_WANTED)then return true elseif(t2.type == QuestDataType.QuestDataType_WANTED)then return false else if(t1.type == QuestDataType.QuestDataType_MAIN)then return true elseif(t2.type == QuestDataType.QuestDataType_MAIN)then return false else return t1.type == QuestDataType.QuestDataType_DAILY end end end) end end end return questList end function QuestProxy:QuestDialogMessage(data) self.dialogMessage.questid = data.questid self.dialogMessage.step = data.step local message = nil local single = nil for i=1,#data.messages do single = data.messages[i] message = DMessage.new(single.speaker,single.message) self.dialogMessage.messages = self.dialogMessage.messages or {} table.insert(self.dialogMessage.messages,message) end end function QuestProxy:QuestQuestUpdate(data) -- helplog("QuestQuestUpdate") local items = data.items if(items)then for i=1,#items do local item = items[i] local del = item.del local update = item.update local type = item.type local list = self.questList[type] or {} if(del)then local delList = {} for i=1,#del do local single = del[i] local questData ,index = self:getQuestDataByIdAndType(single,type) if(questData ~=nil)then FunctionQuest.Me():stopTrigger(questData) table.remove(list,index) table.insert(delList,questData) -- printRed("QuestQuestUpdate del") -- print(questData.staticData.id) -- print(questData.staticData.Name) end end if(#delList ~= 0)then GameFacade.Instance:sendNotification(QuestEvent.QuestDelete,delList) for i=1,#delList do local data = delList[i] ReusableObject.Destroy(data) delList[i] = nil end end end if(update)then local addList = {} for i=1,#update do local single = update[i] if(single.id)then local oldData ,index = self:getQuestDataByIdAndType(single.id,type) if(oldData ~= nil)then FunctionQuest.Me():stopTrigger(oldData) table.remove(list,index) ReusableObject.Destroy(oldData) else table.insert(addList,single.id) end local questData = QuestData.CreateAsArray(QuestDataScopeType.QuestDataScopeType_CITY) questData:setQuestData(single) questData:setQuestListType(type) -- helplog("xxxxadd quest:",questData.id,questData.content,questData.map) -- if(questData.staticData)then -- helplog("xxxxadd quest:",questData.id,questData.staticData.QuestName) -- end table.insert(list,questData) if(questData.staticData ~=nil)then questData:setIfShowAppearAnm(true) end if(type == SceneQuest_pb.EQUESTLIST_ACCEPT)then FunctionQuest.Me():handleAutoQuest(questData) if(questData.questDataStepType == QuestDataStepType.QuestDataStepType_CAMERA)then FunctionQuest.Me():handleCameraQuestStart(questData.pos) end end else errorLog("quset id is nil") end end if(#addList ~= 0)then EventManager.Me():DispatchEvent(QuestEvent.QuestAdd,addList) end end self.questList[type] = list end end end function QuestProxy:getGuildQuestByContentAndType( content,type ) if(not content)then return end local result local listType = type or SceneQuest_pb.EQUESTLIST_ACCEPT local list = self.questList[listType] if(list == nil)then return end TableUtility.ArrayClear(tempArray) for i=1,#list do local single = list[i] if(single.questDataStepType == content and single.type == QuestDataType.QuestDataType_GUILDQUEST)then tempArray[#tempArray +1] = tempArray end end return tempArray end function QuestProxy:getQuestDataByIdAndType( id,type ) -- body if(not id)then return end local result local listType = type or SceneQuest_pb.EQUESTLIST_ACCEPT local list = self.questList[listType] if(list == nil)then return end for i=1,#list do local single = list[i] if(single.id == id)then return single ,i end end for _, questData in pairs(self.fubenQuestMap)do if(questData.id == id)then return questData end end end function QuestProxy:checkQuestHasAccept( id ) -- body if(not id)then return false end local result = self:getQuestDataByIdAndType(id,SceneQuest_pb.EQUESTLIST_ACCEPT) if(result)then return true end result = self:getQuestDataByIdAndType(id,SceneQuest_pb.EQUESTLIST_SUBMIT) if(result)then return true end result = self:getQuestDataByIdAndType(id,SceneQuest_pb.EQUESTLIST_COMPLETE) if(result)then return true end return false end function QuestProxy:GetTraceCellCount( ) return self.TraceCellCount end function QuestProxy:SetTraceCellCount( count ) self.TraceCellCount = count end --獲取對話任務(副本、城鎮) function QuestProxy:getDialogQuestListByNpcId( npcId ,uniqueid) local list = {} local sourceTable local currentMap = SceneProxy.Instance.currentScene --獲取目前訪問npc所需要的vist型別任務 -- printRed("getDialogQuestListByNpcId") -- printRed(currentMap) local allData = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(allData == nil)then return list end sourceTable = allData for i=1,#sourceTable do local single = sourceTable[i] if(single.params)then local npc = single.params.npc if(type(npc) == "table")then npc = npc[1] end if(single.questDataStepType == QuestDataStepType.QuestDataStepType_VISIT and npc == npcId)then if(single.params.uniqueid==nil or (single.params.uniqueid == uniqueid and currentMap:IsSameMapOrRaid(single.map))) then if(self:checkGuildQuest(single) and self:checkCountDownQuest(single))then table.insert(list,single) end end end else printRed("error !!!Quest Params is nil in id:"..single.id) end end for key,single in pairs(self.fubenQuestMap)do if(single.params)then local npc = single.params.npc if(type(npc) == "table")then npc = npc[1] end if(single.questDataStepType == QuestDataStepType.QuestDataStepType_VISIT and npc == npcId)then if(single.params.uniqueid==nil or (single.params.uniqueid == uniqueid)) then table.insert(list,single) end end end end for key,value in pairs(self.traceDatas)do for i=1,#value do local single = value[i] if(single.params)then local npc = single.params.npc if(type(npc) == "table")then npc = npc[1] end if(single.questDataStepType == QuestDataStepType.QuestDataStepType_VISIT and npc == npcId)then if(single.params.uniqueid==nil or (single.params.uniqueid == uniqueid and currentMap:IsSameMapOrRaid(single.map))) then if(self:checkGuildQuest(single) and self:checkCountDownQuest(single))then table.insert(list,single) end end end else printRed("error !!!Quest Params is nil in id:"..single.id) end end end return list end function QuestProxy:checkCountDownQuest(questData) if(questData and questData.type == QuestDataType.QuestDataType_COUNT_DOWN)then local serverT = ServerTime.CurServerTime()/1000 if(questData.time <= serverT )then return false end end return true end function QuestProxy:checkGuildQuest(questData) if(questData and questData.type == QuestDataType.QuestDataType_GUILDQUEST)then local serverT = ServerTime.CurServerTime()/1000 if(not GuildProxy.Instance:IHaveGuild())then return false else if(questData.time <= serverT )then return false end end end return true end function QuestProxy:getSymbolDQListByNpcId( npcId ,uniqueid,list) list = list or self:getDialogQuestListByNpcId(npcId, uniqueid); for i=#list,1,-1 do if(list[i] and list[i].staticData)then if(list[i].staticData.TraceInfo=="")then local right = list[i].staticData.Params and list[i].staticData.Params.symbol==1; if(not right)then table.remove(list, i); end else local isRaidQuest = list[i].scope == QuestDataScopeType.QuestDataScopeType_FUBEN; if(isRaidQuest)then table.remove(list, i); end end else table.remove(list, i); end end return list; end function QuestProxy:getCollectQuestListByNpcId( npcId ) return self:getQuestListByIdAndType(npcId, QuestDataStepType.QuestDataStepType_COLLECT); end function QuestProxy:getQuestListByIdAndType(npcId, qtype) local list = {} local allData = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(allData == nil)then return end for i=1,#allData do local single = allData[i] if(single.questDataStepType == qtype)then if qtype == QuestDataStepType.QuestDataStepType_COLLECT and npcId == single.staticData.Params.monster then table.insert(list,single) end end end for _, single in pairs(self.fubenQuestMap)do if(single.questDataStepType == QuestDataStepType.QuestDataStepType_COLLECT and npcId == single.params.monster)then table.insert(list,single) end end return list end --id 任務id --subgroup 任務跳轉 -- 成功:FinishJump -- 失敗:FailureJump function QuestProxy:notifyQuestState( id,subgroup) -- body local questData = self:getQuestDataByIdAndType(id) if(questData and questData.staticData)then if(questData.scope == QuestDataScopeType.QuestDataScopeType_FUBEN)then helplog("notify-->QuestState", id); ServiceFuBenCmdProxy.Instance:CallFubenStepSyncCmd( id ); elseif(questData.scope == QuestDataScopeType.QuestDataScopeType_CITY)then local questid = questData.id local starid = nil local step = questData.step -- LogUtility.InfoFormat("QuestProxy:notifyQuestState,questId:{0},subgroup:{1},step:{2}",questid,subgroup,step) ServiceQuestProxy:CallRunQuestStep(questid,starid,subgroup,step) end end end -- function QuestProxy:dialogQuestComplete(questId) function QuestProxy:QuestQuestStepUpdate( data ) -- body local questId = data.id local questData = self:getQuestDataByIdAndType(questId) if(questData == nil )then return end -- helplog("QuestQuestStepUpdate",questId,data.step) -- print(questData.staticData.id) -- print(questData.staticData.Name) local stepChange = false FunctionQuest.Me():stopTrigger(questData) if(questData.step ~= data.step)then questData:setIfShowAppearAnm(true) stepChange = true end questData:updateByIdAndStep(questId,data.step,data.data) FunctionQuest.Me():handleAutoQuest(questData) if(questData.questDataStepType == QuestDataStepType.QuestDataStepType_CAMERA)then FunctionQuest.Me():handleCameraQuestStart(questData.pos) end if(stepChange)then GameFacade.Instance:sendNotification(ServiceEvent.QuestQuestStepUpdate,data) else GameFacade.Instance:sendNotification(QuestEvent.ProcessChange,data) end end function QuestProxy:checkIfNeedStopMissionTrigger( ) -- body local index = 0 local allData = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(allData)then for i=1,#allData do local single = allData[i] if(self:checkIfNeedAutoTrigger(single))then index = index+1 end end end end function QuestProxy:checkIfNeedRemoveGuideView( ) -- body local index = 0 local closeGuide = true local allData = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(allData)then for i=1,#allData do local single = allData[i] if(single.questDataStepType == QuestDataStepType.QuestDataStepType_GUIDE)then index = index+1 local guideId = single.params.guideID local guideType = single.params.type local guideData = Table_GuideID[guideId] if(guideData)then local instance = GuideMaskView.getInstance() if(guideData.id == instance.currentGuideId )then closeGuide = false elseif( guideData.id == (instance.delayQuestData and instance.delayQuestData .params.guideID))then closeGuide = false end else LogUtility.Info("can't find guide data by id:") end elseif(single.questDataStepType == QuestDataStepType.QuestDataStepType_GUIDECHECK)then closeGuide = false end end end -- printRed(string.format("checkIfNeedRemoveGuideView index:%s",tostring(index))) -- printRed(string.format("checkIfNeedRemoveGuideView closeGuide:%s",tostring(closeGuide))) if(closeGuide)then -- LogUtility.Info("FunctionGuide.Me():stopGuide()") FunctionGuide.Me():stopGuide() end end function QuestProxy:checkIfNeedAutoExcuteAtInit( questData ) -- body for i=1,#QuestData.AutoExecuteQuestAtInit do local single = QuestData.AutoExecuteQuestAtInit[i] if(single == questData.questDataStepType)then return true end end end function QuestProxy:checkIfNeedAutoTrigger( questData ) -- body for i=1,#QuestData.AutoTriggerQuest do local single = QuestData.AutoTriggerQuest[i] if(single == questData.questDataStepType)then return true end end end function QuestProxy:checkIfNeedEffectTrigger( questData ) -- body for i=1,#QuestData.EffectTriggerStepType do local single = QuestData.EffectTriggerStepType[i] if(single == questData.questDataStepType)then return true end end end --questId function QuestProxy:isQuestTraceById( questId ) -- body local questData = self:getDetailDataById(questId) -- printRed("QuestProxy:isQuestTraceById is trace:") -- printRed(questId) -- if(questData)then -- printRed(questData.trace) -- end if(questData and questData.trace)then return true elseif(not questData)then return true end end function QuestProxy:isQuestComplete( id ) local type = SceneQuest_pb.EQUESTLIST_SUBMIT local questData ,_ = self:getQuestDataByIdAndType(id,type) -- printRed("isQuestComplete") -- printRed(id) -- TableUtil.Print(questData.id) -- print() return questData ~= nil end --TODO remove function QuestProxy:getStaticDataById( id,step ) -- body return nil end --獲取相同QuestID,GroupID的任務 function QuestProxy:getAreaTriggerIdByQuestId( id ) -- body local questId = math.floor(id/GameConfig.Quest.ratio) local groupId = id - questId*GameConfig.Quest.ratio local id = questId*(GameConfig.Quest.ratio+1)+groupId return id end function QuestProxy:isMainQuestCompleteByStepId( orderid ) -- body local type = SceneQuest_pb.EQUESTLIST_ACCEPT local list = self.questList[type] for i=1,#list do local single = list[i] if(single.type == QuestDataType.QuestDataType_MAIN)then if single.orderId > orderid then return true else return false end end end return true end function QuestProxy:getWholeQuestDataInList( list,storyId ) -- body for k,v in pairs(list) do for i=1,#v do local single = v[i] if(single.questId == storyId)then return single end end end end function QuestProxy:checkLevelInRange( cur,min,max ) -- body if(cur < min or cur > max)then return false else return true end end function QuestProxy:getWantedQuest( ) -- body -- body local list = {} local typeList = { SceneQuest_pb.EQUESTLIST_COMPLETE, SceneQuest_pb.EQUESTLIST_ACCEPT, SceneQuest_pb.EQUESTLIST_SUBMIT, SceneQuest_pb.EQUESTLIST_CANACCEPT, } local userData = Game.Myself.data.userdata local nowRoleLevel = userData:Get(UDEnum.ROLELEVEL) for i=1,#typeList do local questType = typeList[i] local questList = self.questList[questType] if(questList)then for j=1,#questList do local single = questList[j] if(single.type == QuestDataType.QuestDataType_WANTED)then -- printRed(string.format("WantedQuest:%s,name:%s,type:%s",tostring(single.id),tostring(single.staticData.Name),tostring(questType))) local minLevel = 0 local maxLevel = 9999 if(single.wantedData)then minLevel = single.wantedData.LevelRange[1] maxLevel = single.wantedData.LevelRange[2] end if(questType == SceneQuest_pb.EQUESTLIST_CANACCEPT and self:checkLevelInRange(nowRoleLevel,minLevel,maxLevel))then local tmpData = self:getWantedQuestDataByIdAndType(single.id,SceneQuest_pb.EQUESTLIST_SUBMIT) if(not tmpData)then tmpData = QuestProxy.getWantedQuestDataById(single.id,list) if(not tmpData)then table.insert(list,single) -- printRed(#list) -- elseif (tmpData.time < single.time)then -- table.insert(list,single) end end -- if(not tmpData)then -- table.insert(list,single) -- elseif (tmpData.time < single.time)then -- table.insert(list,single) -- end else -- printRed("other",#list) if(questType == SceneQuest_pb.EQUESTLIST_SUBMIT and self:checkLevelInRange(nowRoleLevel,minLevel,maxLevel))then table.insert(list,single) elseif(questType ~= SceneQuest_pb.EQUESTLIST_SUBMIT)then table.insert(list,single) end end end end end end -- local questTable = {} -- local questList = self.questList[SceneQuest_pb.EQUESTLIST_CANACCEPT] -- if(questList)then -- -- printRed(#questList) -- for i=1,#questList do -- local single = questList[i] -- if(single.type == QuestDataType.QuestDataType_WANTED)then -- -- printRed("questId"..single.id) -- local tmpData,index = QuestProxy.getWantedQuestDataById(single.id,list) -- if(tmpData)then -- table.insert(questTable,tmpData) -- table.remove(list,index) -- end -- end -- end -- end -- for i=1,#list do -- table.insert(questTable,list[i]) -- end table.sort(list,function ( l,r ) -- body local lAct = l.wantedData.IsActivity or 0 local rAct = r.wantedData.IsActivity or 0 if(lAct == rAct)then return l.id > r.id else return lAct > rAct end end) return list end function QuestProxy:getWantedQuestDataByIdAndType( id,type ) -- body local questList = self.questList[type] if(questList)then for j=1,#questList do local single = questList[j] if(single.type == QuestDataType.QuestDataType_WANTED and id == single.id)then return single end end end end function QuestProxy.getWantedQuestDataById( id,list ) -- body if(list)then for j=1,#list do local single = list[j] if(id == single.id)then return single,j end end end end function QuestProxy:getIllustrationQuest(mapId) local type = SceneQuest_pb.EQUESTLIST_ACCEPT local list = QuestProxy.Instance.questList[type] -- printRed("hasIllustrationQuest") -- printRed(mapId) if(list) then for i=1,#list do local single = list[i] -- printRed(single.questDataStepType) -- printRed(single.map) if(single.questDataStepType == QuestDataStepType.QuestDataStepType_ILLUSTRATION and single.map == mapId)then return single end end end end function QuestProxy:getQuestListByMapAndSymbol( mapId ) -- body local type = SceneQuest_pb.EQUESTLIST_ACCEPT local list = QuestProxy.Instance.questList[type] -- printRed("hasIllustrationQuest") -- printRed(mapId) local resultList = {} if(list) then for i=1,#list do local single = list[i] -- printRed(single.questDataStepType) -- printRed(single.map) if(single.map and single.map == mapId and single.staticData)then if(single.params and (single.params.symbol or single.staticData.TraceInfo~=""))then if(self:checkGuildQuest(single) and self:checkCountDownQuest(single))then resultList[#resultList+1] = single end end end end end return resultList end function QuestProxy:getDailyQuestData( type ) -- body return self.DailyQuestData[type] end function QuestProxy:setDailyQuestData( data ) -- body local type = data.type local eOtherData = EOtherData.new(data.data) self.DailyQuestData[type] = eOtherData end function QuestProxy:AddTraceCells(cells) if(cells)then for i=1,#cells do local single = cells[i] self:AddTraceCell(single) end end end --非對外介面 function QuestProxy:AddTraceCell(traceData) -- body local traceCell = self:GetTraceCell(traceData.type,traceData.id) if(not traceCell)then traceCell = TraceData.new() traceCell:UpdateByTraceData(traceData) local list = self.traceDatas[traceData.type] or {} table.insert(list,traceCell) self.traceDatas[traceData.type] = list FunctionQuest.Me():addTraceView(traceCell) else traceCell:UpdateByTraceData(traceData) FunctionQuest.Me():updateTraceView(traceCell) end end function QuestProxy:RemoveTraceCell( type,id ) -- body local traceCell,index = self:GetTraceCell(type,id) local list = self.traceDatas[type] if(list and traceCell)then table.remove(list,index) FunctionQuest.Me():removeTraceView(traceCell) end end function QuestProxy:RemoveTraceCells( datas ) -- body if(datas and #datas>0)then for i=1,#datas do local data = datas[i] local type = data.type local id = data.id self:RemoveTraceCell(type,id) end end end function QuestProxy:GetTraceCell( type,id ) -- body local list = self.traceDatas[type] if(list and #list>0)then for i=1,#list do local single = list[i] if(single.id == id )then return single,i end end end end function QuestProxy:UpdateTraceProcess( type,id,process ) -- body local traceCell,index = self:GetTraceCell(type,id) if(traceCell)then traceCell.process = process FunctionQuest.Me():updateTraceView(traceCell) end end function QuestProxy:UpdateTraceInfo( type,id,traceInfo ) -- body local traceCell,index = self:GetTraceCell(type,id) if(traceCell)then traceCell.traceInfo = traceInfo FunctionQuest.Me():updateTraceView(traceCell) end end function QuestProxy:hasQuestAccepted( questId ) -- body local type = SceneQuest_pb.EQUESTLIST_ACCEPT local list = QuestProxy.Instance.questList[type] if(list) then for i=1,#list do local single = list[i] if(single.id == questId)then return true end end end end function QuestProxy:getTraceDatas( ) -- body local list = {} for k,v in pairs(self.traceDatas) do if(v and #v>0)then for i=1,#v do local single = v[i] table.insert(list,single) end end end return list end function QuestProxy:isInWantedQuestInActivity( ) -- body if(self.maxWantedCount and self.maxWantedCount~=0)then return true end -- return true end function QuestProxy:setMaxWanted( data ) -- body local maxcount = data.maxcount self.maxWantedCount = maxcount end function QuestProxy:getMaxWanted( ) -- body if(self.maxWantedCount and self.maxWantedCount~=0)then return self.maxWantedCount; end local maxWantedConfig = GameConfig.Quest.maxwanted; if(type(maxWantedConfig) == "table")then for i=1,#maxWantedConfig do if(maxWantedConfig[i][1] == 0)then return maxWantedConfig[i][2]; end end else return maxWantedConfig; end end function QuestProxy:getTraceDatasByType( type ) -- body return self.traceDatas[type] end function QuestProxy:hasGoingWantedQuest( ) -- body return self.hasGoingQuest end function QuestProxy:setGoingWantedQuest( result ) -- body self.hasGoingQuest = result end function QuestProxy:isQuestCanBeShowTrace( type ) -- body for i=1,#QuestData.NoTraceQuestDataType do local single = QuestData.NoTraceQuestDataType[i] if(single == type)then return false end end return true end function QuestProxy:getWantedQuestRatio( submitCount ) -- body local ratio submitCount = submitCount or MyselfProxy.Instance:getVarValueByType(Var_pb.EVARTYPE_QUEST_WANTED) if(not submitCount)then submitCount = 0 end local ratio = GameConfig.Quest.proportion[submitCount+1] -- printRed("任務完成次數"..submitCount) if(not ratio)then ratio = GameConfig.Quest.proportion[#GameConfig.Quest.proportion] printRed("can't find ratio by complete count:Var_pb.EVARTYPE_QUEST_WANTED:",submitCount) end return ratio end function QuestProxy:updateFubenQuestData( dataId, delete, raidConfig ) -- helplog("updateFubenQuestData", dataId, delete, raidConfig); local questData = self.fubenQuestMap[dataId]; if(delete)then self:removeFubenQuestData(dataId); else if(not questData)then questData = QuestData.CreateAsArray(QuestDataScopeType.QuestDataScopeType_FUBEN); self.fubenQuestMap[dataId] = questData; questData:updateRaidData(dataId,raidConfig) questData.map = Game.MapManager:GetMapID() if(not questData.staticData)then errorLog(string.format("QuestProxy:updateFubenQuestData,can't find in Table_Raid by id:%s",tostring(dataId))) else FunctionQuest.Me():handleAutoTrigger(questData) FunctionQuest.Me():handleAutoExcute(questData) if(questData.staticData and questData.staticData.WhetherTrace ~= 1 and self:checkIsShowDirAndDisByQuestType(questData.questDataStepType))then local pos = questData.pos pos = pos and pos or FunctionQuestDisChecker.Me():getDestPostByUniqueId( questData.params.uniqueid ) if(pos)then helplog("updateFubenQuestData",questData.id) FunctionQuestDisChecker.Me():AddQuestCheck({questData=questData}) FunctionQuest.Me():addQuestMiniShow( questData ) end end end end end end function QuestProxy:getTraceFubenQuestData() for _,questData in pairs(self.fubenQuestMap)do if(questData.staticData)then local traceInfo = questData.staticData.TraceInfo; if(traceInfo ~= nil and traceInfo ~= "")then return questData; end else -- helplog("QuestData id:",questData.id) end end end function QuestProxy:removeFubenQuestData( step ) local questData = self.fubenQuestMap[step]; if(questData)then FunctionQuest.Me():stopTrigger(questData); FunctionQuest.Me():stopQuestMiniShow( questData ) ReusableObject.Destroy(questData) self.fubenQuestMap[step] = nil; end end function QuestProxy:clearFubenQuestData() for key, data in pairs(self.fubenQuestMap)do FunctionQuest.Me():stopTrigger(data); FunctionQuest.Me():stopQuestMiniShow(data) ReusableObject.Destroy(data) self.fubenQuestMap[key] = nil; end end function QuestProxy:checkIsShowDirAndDisByQuestType( type ) -- body for i=1,#QuestData.NoDirAndDisStepType do local single = QuestData.NoDirAndDisStepType[i] if(single == type)then return false end end return true end function QuestProxy:checkIsShowDirAndDisByQuestId( id ) -- body local questData = self:getQuestDataByIdAndType(id) if(questData)then return self:checkIsShowDirAndDis(questData) end end function QuestProxy:checkIsShowDirAndDis( questData ) -- body if(questData)then local bRet = false local traceStr = questData:parseTranceInfo() -- LogUtility.InfoFormat("checkIsShowDirAndDis str:{0},map:{1},whether:{2}",traceStr,questData.map,questData.whetherTrace) if(traceStr ~= "" and self:checkIsShowDirAndDisByQuestType(questData.questDataStepType) and questData.whetherTrace == 1)then bRet = true end return bRet end end function QuestProxy:checkCanExcuteWhenDead( questData ) -- body if(questData)then local type = questData.questDataStepType for i=1,#QuestData.CanExecuteWhenDeadStepType do local single = QuestData.CanExecuteWhenDeadStepType[i] if(single == type)then return true end end return false end end function QuestProxy:checkUpdateWithItemUpdate( questData ) -- body if(questData)then local type = questData.questDataStepType for i=1,#QuestData.ItemUpdateStepType do local single = QuestData.ItemUpdateStepType[i] if(single == type)then return true end end return false end end function QuestProxy:addOrRemoveLockMonsterGuide( data ) -- body if(not self.guideList)then self.guideList = {} end if data then self.guideList[data.questId] = data.monsterId end end function QuestProxy:checkIfShowMonsterNamePre( questData ) -- body if(questData and self:checkIsShowDirAndDis(questData))then local type = questData.questDataStepType for i=1,#QuestData.ShowTargetNamePrefixStepType do local single = QuestData.ShowTargetNamePrefixStepType[i] if(single == type)then return true end end end return false end function QuestProxy:getQuestID(questId) return math.floor(questId/GameConfig.Quest.ratio) end function QuestProxy:getValidReward(questData) local questId = questData.id local id = self:getQuestID(questId) -- local groupId = questId - id*GameConfig.Quest.ratio -- local id = questId*(GameConfig.Quest.ratio+1)+groupId return self.menuDatas[id] -- local menuData = self.menuQuestData[questData]. end function QuestProxy:getValidAcceptQuestList(isTrace) local questDataList = QuestProxy.Instance:getQuestListInOrder(SceneQuest_pb.EQUESTLIST_ACCEPT) local list = {} for i=1,#questDataList do local single = questDataList[i] if(single.staticData)then -- local isTrace = QuestProxy.Instance:isQuestTraceById(single.staticData.QuestID) -- if(single.id == 311110001 or single.id == 311110002)then -- self:Log("print questData start") -- self:Log(isTrace) -- self:Log(single.id,single.staticData.TraceInfo,single.step,single.questDataStepType) -- self:Log(single.questListType) -- local params = single.params -- for k,v in pairs(params) do -- helplog(k,v) -- if(k == "dialog")then -- helplog("size:",#v) -- end -- if(k == "dialog")then -- for j=1,#v do -- helplog("dialog id:",v[j]) -- end -- end -- end -- self:Log(single.step) -- self:Log(single.questDataStepType) -- self:Log(single.type) -- self:Log(single.staticData.QuestName) -- if(single.questDataStepType == "item")then -- for k,v in pairs(params) do -- helplog(k,v) -- end -- end -- self:Log(single.staticData.FirstClass) -- self:Log("print questData end") -- end local questType = single.type local validQuest = QuestProxy.Instance:checkGuildQuest(single) if(questType == QuestDataType.QuestDataType_GUILDQUEST and validQuest)then Game.QuestGuildManager:AddQuestEffect(single) end validQuest = QuestProxy.Instance:checkCountDownQuest(single) if(questType == QuestDataType.QuestDataType_COUNT_DOWN and validQuest)then Game.QuestCountDownManager:AddQuestEffect(single) end local bFilterCt = single.staticData.TraceInfo ~= "" and validQuest if(isTrace ~= nil)then bFilterCt = bFilterCt and single.trace == isTrace end if(bFilterCt)then if(single.staticData.FirstClass == destProfession )then table.insert(list,single) elseif(QuestProxy.Instance:isQuestCanBeShowTrace(questType))then table.insert(list,single) end end end end if(isTrace == nil)then table.sort(list,function (t1,t2) local lv1 = t1.staticData.Level or 0 local lv2 = t2.staticData.Level or 0 if(lv1 == lv2)then return t1.time > t2.time else return lv1 > lv2 end end) end return list end function QuestProxy:getLockMonsterGuideByMonsterId( monsterId ) -- body if self.guideList then TableUtility.ArrayClear(tempArray) for k,v in pairs(self.guideList) do if(monsterId == v)then tempArray[#tempArray+1] = k end end -- helplog("getLockMonsterGuideByMonsterId ",#tempArray) return tempArray end end function QuestProxy:getAllPrequest( questData) -- body if not questData then return end TableUtility.ArrayClear(tempArray) local preQuest = questData.preQuest local mustPreQuest = questData.mustPreQuest if #preQuest == 0 and #mustPreQuest == 0 then return tempArray end local questDataList = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] for i=1,#questDataList do local single = questDataList[i] if single.id ~= questData.id then local beSame = self:checkSameList(preQuest,single.preQuest) if(beSame and self:checkSameList(mustPreQuest,single.mustPreQuest))then tempArray[#tempArray+1] = {type = single.questListType, questData = single} end end end return tempArray end function QuestProxy:checkSameList( fList,sList) local sameSize = #fList == #sList if(not sameSize)then return false end local find = true for i=1,#fList do local single = fList[i] find = TableUtility.ArrayFindIndex(sList,single) ~= 0 if(not find)then return false end end return find end function QuestProxy:HasSameQuestID( questId) local list = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(not list)then return false end local questID = self:getQuestID(questId) for j=1,#list do local questData = list[j] local id = self:getQuestID(questData.id) if(questID == id)then return true end end return false end function QuestProxy:getSameQuestID( questId) local list = self.questList[SceneQuest_pb.EQUESTLIST_ACCEPT] if(not list)then return end local questID = self:getQuestID(questId) for j=1,#list do local questData = list[j] local id = self:getQuestID(questData.id) if(questID == id)then return questData end end end function QuestProxy:checkWantedQuestIsMarkedTeam( questId,step ) -- body if self.guideList then TableUtility.ArrayClear(tempArray) for k,v in pairs(self.guideList) do if(monsterId == v)then tempArray[#tempArray+1] = k end end -- helplog("getLockMonsterGuideByMonsterId ",#tempArray) return tempArray end end function QuestProxy:RecvStepSyncBossCmd(serverdata) if serverdata.params then self.worldbossQuest = QuestDataUtil.parseBossStepParams(serverdata.params.params,serverdata.step) end if serverdata.step and serverdata.step == QuestProxy.BossStep.Dialog then self:PlayBossStepDialog(self.worldbossQuest["yes_dialogs"]) end end function QuestProxy:PlayBossStepDialog(dlist) if dlist then local viewdata = { viewname = "DialogView", dialoglist = dlist, -- npcinfo = nil, callback = self.callNextBossStep, }; GameFacade.Instance:sendNotification(UIEvent.ShowUI, viewdata); return end end function QuestProxy:callNextBossStep() ServiceBossCmdProxy.Instance:CallStepSyncBossCmd(nil) end