local CountryWantedTask_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local WantedEnum_Neutral = 72 -- 去中立国采集 local WantedEnum_Enemy = 73 -- 去敌国采集 CountryWantedTask_Controller.LastCollectItemId = 0 --上一次的随机采集物ID function CountryWantedTask_Controller.OnStartup() EventSystem.Regist(EventID.Country_OnGetFoundCountry, private.RefreshRedPoint) --有了国家信息后也要刷新一下红点 EventSystem.Regist(EventID.Country_OnCountryResetChange,private.OnCountryResetChange) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.RefreshRedPoint) EventSystem.Regist(EventID.FunctionUnlockUpdate, private.RefreshInfoByFunction) EventSystem.Regist(EventID.New_Day_Refresh, private.RefreshRedPoint) EventSystem.Regist(EventID.Country_WantedTask_Receive, private.RefreshRedPoint) end function private.RefreshInfoByFunction(funcId, isUnlock) if funcId == MDL.Unlock.FunctionType.CountryWantedTask then private.RefreshRedPoint() end end --检测国家切阶段 function private.OnCountryResetChange() if CTL.CountryPVP.IsInCountryReset() then CountryWantedTask_Controller.CloseAllWantedTaskView() end private.RefreshRedPoint() end function CountryWantedTask_Controller.CloseAllWantedTaskView() UIManager.CloseView(Const_UI_Lua.UIEnum.UICountryWantedTask) UIManager.CloseView(Const_UI_Lua.UIEnum.UICommonThirdPopup) end -- 去找玩家所在国家对应的悬赏任务NPC function CountryWantedTask_Controller.GoToNpc() if not CountryWantedTask_Controller.IsShowCountryWantedTask(true) then return end local countryData = MDL.CountryWantedTask.GetCountryData(MDL.Country.GetMyCountryId()) if countryData then NotSyncBattleSetter.FindPathByNPCIDAndRide(countryData.WantedNPCID) end EventSystem.Dispatch(EventID.UI_CloseAndRecoverView, Const_UI_Lua.UIEnum.UICountryBase) end function CountryWantedTask_Controller.IsShowCountryWantedTask(isShowTips) --判断解锁 if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.CountryWantedTask) then return false end --判断是否有国家 local myoCountryId = MDL.Country.GetMyCountryId() if myoCountryId == nil or myoCountryId == 0 then logging.log(LTAG.LOG,"GetMyCountryId is nil or 0") return false end --判断国家阶段,休赛期不能打开悬赏任务 if CTL.CountryPVP.IsInCountryReset() then if isShowTips then CTL.Tips.AddTipsMsg(Const_IDS.IDS_WantedTask_StopTime) end return false end return true end --是否为悬赏任务NPC function CountryWantedTask_Controller.IsCountryWantedTaskNPC(npcId) local myCountryId = MDL.Country.GetMyCountryId() if myCountryId == nil then return false end local countryData = MDL.CountryWantedTask.GetCountryData(myCountryId) if countryData == nil then return false end return npcId == countryData.WantedNPCID end --打开悬赏任务界面 function CountryWantedTask_Controller.OpenWantedTaskPanel() if not CountryWantedTask_Controller.IsShowCountryWantedTask(true) then return end MDL.CountryWantedTask.WantedTaskPanelReq() if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UICountryWantedTask) then UIManager.OpenView(Const_UI_Lua.UIEnum.UICountryWantedTask) end end function CountryWantedTask_Controller.CheckCanRefresh() --检测 是否可刷新 local isTimeEnough = false local taskInfos = MDL.CountryWantedTask.GetTaskInfos() for i,v in ipairs(taskInfos) do if v.state == MDL.CountryWantedTask.WantedTaskState.NotDoing then isTimeEnough = true end end if not isTimeEnough then CTL.Tips.AddTipsMsg(Const_IDS.IDS_WantedTask_NoTaskRefresh) return false end return true end --去接取任务 function CountryWantedTask_Controller.GoToAcceptTheTask(taskId) local taskWantedData = MDL.CountryWantedTask.GetTaskWantedByID(taskId) MDL.Task.ClientAcceptTaskRequest(taskWantedData.TaskFatherID) end --获取悬赏任务完成条件 function CountryWantedTask_Controller.GetTaskCompleteConditionPrams(taskLineID,taskChildID,collectServerDataID) local taskChildData = DataSheetManager.TaskChildData:GetDataByTaskLineID_TaskChildID(taskLineID,taskChildID) if taskChildData == nil then logging.error(LTAG.ERROR,"not find data GetDataByTaskLineID_TaskChildID",taskLineID,taskChildID) return nil end local params = string.split(taskChildData.CompleteConditionParam, ";") --不传参数的情况,直接返回数量 if collectServerDataID == nil then return params[#params] end local count = #params - 1 for i=1,count do if params[i] == collectServerDataID then return params[#params] end end return nil end --当前是否在采集物任务地图 function CountryWantedTask_Controller.IsCurrentInEnemyCollectTaskScene(mapItemIdArray) if CTL.CountryPVP.IsInMyCountry() then return false,nil end local currentMapId = BattleDataGetter.GetCurLevelID() for i = 1, 4 do if currentMapId == mapItemIdArray[2*i-1] then return true,mapItemIdArray[2*i] end end return false,nil end function CountryWantedTask_Controller.GetEnemyCountryMapDataOfTask(taskLineID,taskChildID) local mapIdArray, mapItemIdArray = MDL.CountryWantedTask.GetMapItemIDParams(taskLineID,taskChildID) if mapIdArray == nil or mapItemIdArray == nil then return nil end local enemyMapData = {} for i = 1, #mapIdArray do if mapIdArray[i] ~= CountryWantedTask_Controller.GetMyCountryMap() then local countryData = MDL.CountryWantedTask.GetCountryDataBySceneId(mapIdArray[i]) local data = {Kingdom = countryData.ID, SceneId = countryData.SceneId,CountryName = countryData.CountryName, MapItemId = mapItemIdArray[i]} table.insert(enemyMapData,data) end end return enemyMapData end function CountryWantedTask_Controller.GetNpcByMapIdOfTask(taskLineID,taskChildID,mapId) local mapIdArray, mapItemIdArray = MDL.CountryWantedTask.GetMapItemIDParams(taskLineID,taskChildID) if mapIdArray == nil or mapItemIdArray == nil then return nil end for i = 1, #mapIdArray do if mapId == mapIdArray[i] then return mapItemIdArray[i] end end return nil end function CountryWantedTask_Controller.GetMyCountryMap() local myKingdom = MDL.Country.GetMyCountryId() local myCountryData = MDL.CountryWantedTask.GetCountryData(myKingdom) return myCountryData.SceneId end -- 判断是否有悬赏任务 function CountryWantedTask_Controller.HasWantedTask(collectServerDataID) local myKingdom = MDL.Country.GetMyCountryId() local taskList = MDL.Task.GetTaskList(MDL.Task.Enum_TaskType.Wanted) if taskList ~= nil then for taskID, task in pairs(taskList) do if task.State == MDL.Task.Enum_TaskState.Doing then for k,childData in pairs(task.taskChildData) do local params = string.split(childData.CompleteConditionParam, ";") local count = #params - 1 for i=1,count do if tonumber(params[i]) == collectServerDataID then local collectServerData = DataSheetManager.CollectServerData:GetDataByID(collectServerDataID) if childData.CompleteCondition == WantedEnum_Neutral then if collectServerData.Kingdom == 99 then -- 99中立 return true end elseif childData.CompleteCondition == WantedEnum_Enemy then if collectServerData.Kingdom ~= 99 and collectServerData.Kingdom ~= myKingdom then return true end end end end end end end end return false end function CountryWantedTask_Controller.GetSortedTask(inputTaskDic) if inputTaskDic then local sortList = {} for i, v in pairs(inputTaskDic) do table.insert(sortList, v) end if #sortList > 0 then table.sort(sortList, private.SortTaskBySortId) return sortList end end end function private.SortTaskBySortId(a, b) local wantedA = MDL.CountryWantedTask.GetTaskStarForShow(a.TaskData.ID) local wantedB = MDL.CountryWantedTask.GetTaskStarForShow(b.TaskData.ID) return wantedA.SortId < wantedB.SortId end --获取敌国采集物数据 function CountryWantedTask_Controller.GetEnemyCountryCollectData(mapItemIdArray) local result = {} local myKingdom = MDL.Country.GetMyCountryId() for k,v in DataSheetManager.CountryBase:GetEnumerator() do if v.ID <= LuaConst.Kingdom.Qun and v.ID ~= myKingdom then local data = {Kingdom = v.ID,MapItemId = mapItemIdArray[2*k],MapId = mapItemIdArray[2*k -1] } table.insert(result,data) end end return result end --按国家去找悬赏任务里的采集物 function CountryWantedTask_Controller.GoToCollectItemByCountry(task,enemyCountryCollectData,country) local mapId,mapItemId for i = 1, #enemyCountryCollectData do if country == enemyCountryCollectData[i].Kingdom then mapItemId = enemyCountryCollectData[i].MapItemID mapId = enemyCountryCollectData[i].MapId break end end if CountryWantedTask_Controller.CheckTask(mapId) then return end local callback = function () CTL.Task.OnArriveTargetNode(task,mapItemId) end --执行任务寻路 MDL.Task.DoingTask = task private.ConveyNeutralityMapThenGoToItem(mapId, mapItemId, callback) EventSystem.Dispatch(EventID.UI_Task_SetAuto) end --先传送到中立区域,然后再走过去 function private.ConveyNeutralityMapThenGoToItem(mapId, mapItemId, callback) private.destSceneData = {mapId = mapId,mapItemId = mapItemId,callback = callback} local countryData = MDL.CountryWantedTask.GetCountryDataBySceneId(mapId) CTL.Country.GoCountryMap(countryData.ID,true) end local function OnEnterHanSceneFunc() local HanMapCityID = 8 if BattleDataGetter.GetCurLevelID() == HanMapCityID then NotSyncBattleSetter.FindPathByLevelItemIDAndRide(private.destSceneData.mapId, private.destSceneData.mapItemId, private.destSceneData.callback,LuaConst.ETownFindPathType.TASK) end private.destSceneData = nil end --在中立国且有目的地 function CountryWantedTask_Controller.HasDestSceneData() return private.IsInNeutralityCountryMap() and private.destSceneData ~= nil end function CountryWantedTask_Controller.OnEnterHanScene() TimerUtil.TimeOut(OnEnterHanSceneFunc) end function CountryWantedTask_Controller.GoToEnemyCountryPVENPC(task,data,country) local mapId,mapItemId for i = 1, #data do if country == data[i].Kingdom then mapId = data[i].SceneId mapItemId = data[i].MapItemId end end if CountryWantedTask_Controller.CheckTask(mapId) then return end local callback = function () CTL.Task.OnArriveTargetNode(task,mapItemId) end --执行任务寻路 MDL.Task.DoingTask = task private.ConveyNeutralityMapThenGoToItem(mapId, mapItemId, callback) EventSystem.Dispatch(EventID.UI_Task_SetAuto) end function CountryWantedTask_Controller.CheckTask(currentMapId) if CTL.HotFix.HasLevelPackageDownload(nil, currentMapId) == false then return true end --跨服与本服互相传送前先检测是否符合条件 if not CTL.CrossServer.CheckConveyCondition(currentMapId) then return true end return false end --同一场景中查找离玩家近的item function CountryWantedTask_Controller.FindNearMapItemIdInSameScene(mapItemIdArray) local myPos = BattleDataGetter.GetMainEntityLogicPos() local myPosX, myPosZ = FP.tonumberV2(myPos) local nearMapItemId,minDistance for i,v in ipairs(mapItemIdArray) do local levelItem = BattleDataGetter.GetLevelItemByID(v) local itemPosX, itemPosZ = FP.tonumberV2(levelItem.ItemData.ItemPos) local distance = (itemPosX - myPosX)^2 + (itemPosZ - myPosZ)^2 if minDistance == nil then minDistance = distance nearMapItemId = v else if minDistance > distance then minDistance = distance nearMapItemId = v end end end return nearMapItemId end --获取中立采集物数据 function CountryWantedTask_Controller.GetNeutralityRandomMapItemId(mapItemId) return CountryWantedTask_Controller.GetRandomData(mapItemId) end --生成随机数据 function CountryWantedTask_Controller.GetRandomData(randomScenePoint) math.randomseed(tostring(os.time()):reverse():sub(1, 7)) local randomIndex = math.random(#randomScenePoint) local mapItemId = randomScenePoint[randomIndex] return mapItemId,randomIndex end --是否处在敌国地图 function CountryWantedTask_Controller.IsInEnemyCountryMap() local myCountryId = MDL.Country.GetMyCountryId() local currentMapId = BattleDataGetter.GetCurLevelID() for k,v in DataSheetManager.CountryBase:GetEnumerator() do if v.ID ~= myCountryId and v.SceneId == currentMapId and v.ID <= LuaConst.Kingdom.Qun then return true end end return false end --获取中立国地图 function CountryWantedTask_Controller.GetNeutralityCountryMap() for k,v in DataSheetManager.CountryBase:GetEnumerator() do if v.ID > LuaConst.Kingdom.Qun then return v.SceneId end end return nil end function private.IsInNeutralityCountryMap() local currentMapId = BattleDataGetter.GetCurLevelID() return currentMapId == CountryWantedTask_Controller.GetNeutralityCountryMap() end --获取敌国PVE地图 function CountryWantedTask_Controller.GetEnemyCountryPVEMap(taskChildData) local currentMapId = BattleDataGetter.GetCurLevelID() local index for k,v in DataSheetManager.CountryBase:GetEnumerator() do if v.SceneId == currentMapId then index = k end end local params = string.split(taskChildData.Factor, ";") return tonumber(params[index]) end --检查NPC是否为悬赏任务的 function CountryWantedTask_Controller.CheckNpcIsWantedTask(taskChildData,type,npcID) if taskChildData.MapID == 0 and type == MDL.Task.Enum_TaskType.Wanted then if taskChildData.ActionType == MDL.Task.Enum_ActionType.Story then --如果是对话,去找本国NPC local levelID = CTL.CountryWantedTask.GetMyCountryMap() local levelItemID = CTL.CountryWantedTask.GetNpcByMapIdOfTask(taskChildData.TaskLineID,taskChildData.TaskChildID,levelID) local wantedTaskNpcId = BattleDataGetter.GetNpcIdByLevelItemInfo(levelID, levelItemID) if wantedTaskNpcId == npcID and CTL.CountryPVP.IsInMyCountry() then return true end elseif taskChildData.ActionType == MDL.Task.Enum_ActionType.EnterFuben then --如果是副本,要求是敌国PVE local taskWanted = MDL.CountryWantedTask.GetTaskWantedByTaskFatherIDAndChildId(taskChildData.TaskLineID,taskChildData.TaskChildID) if taskWanted.TaskType == MDL.CountryWantedTask.TaskType.EnemyCountryPVE then local levelID = BattleDataGetter.GetCurLevelID() local levelItemID = CTL.CountryWantedTask.GetNpcByMapIdOfTask(taskChildData.TaskLineID,taskChildData.TaskChildID,levelID) local wantedTaskNpcId = BattleDataGetter.GetNpcIdByLevelItemInfo(levelID, levelItemID) if wantedTaskNpcId == npcID and CountryWantedTask_Controller.IsInEnemyCountryMap() then return true end end end end return false end --检查NPC是否为悬赏任务布告板的 function CountryWantedTask_Controller.CheckNpcIsWantedTaskPanel(type,npcID) if type == MDL.Task.Enum_TaskType.Wanted and CTL.CountryPVP.IsInMyCountry() then local levelID = CTL.CountryWantedTask.GetMyCountryMap() for k,v in DataSheetManager.CountryBase:GetEnumerator() do if v.SceneId == levelID then return npcID == v.WantedNPCID end end end return false end function CountryWantedTask_Controller.CacheTaskCellPos(pos) private.taskCellPos = pos end function CountryWantedTask_Controller.GetCacheTaskCellPos() return private.taskCellPos end function CountryWantedTask_Controller.OnEnterLevel() private.lastTipsScene = nil end --战场报文按场景显示 function CountryWantedTask_Controller.IsShowBattleTips() if private.lastTipsScene ~= BattleDataGetter.GetCurLevelID() then private.lastTipsScene = BattleDataGetter.GetCurLevelID() return true else return false end end function CountryWantedTask_Controller.CanShare() return CTL.Team.IsInTeam() and MDL.Team.GetTeamMemberNumbers() > 1 end --红点 function private.RefreshRedPoint() if not CountryWantedTask_Controller.IsShowCountryWantedTask(false) then CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.CountryWantedTask) EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.WantedTask, false) return end local doingTasks = MDL.Task.GetTaskList(MDL.Task.Enum_TaskType.Wanted) local curCount = MDL.CountryWantedTask.GetTaskWantedDailyNum() - MDL.CountryWantedTask.GetHasCompleteTaskNum() if (not doingTasks or table.getDictCount(doingTasks) == 0) and curCount > 0 then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.CountryWantedTask) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.CountryWantedTask) end EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.WantedTask, CTL.RedPoint.GetRedPointActive(CTL.RedPoint.RedPointKey.CountryWantedTask)) end return CountryWantedTask_Controller