local RebelStrike_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local rebel_strike_pb = require('Proto/rebel_strike_pb') private.leftAwardTimes = 0 private.goToTargetCD = 0 private.rebelStrikeSwitchCD = 0 private.refreshCD = 0 private.rebelStrikeRefreshCD = 0 private.sceneInfoDic = {} --场景信息,key是元素ID,value是展示的npcInfo private.selectInfo = nil private.lineInfoList = nil private.timeToOpenHandle = nil private.teamPassCount = 0 private.teamRewardCount = 0 function RebelStrike_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageOpenGoToPanel, private.RefreshLineInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessageRebelStrikeTeamReward, private.ClaimTeamRewardResp) NetManager.RegisterMsgCB(MessageEnums.MessageS2CAllRebelInfo, private.OnS2CAllRebelInfo) NetManager.RegisterMsgCB(MessageEnums.MessageRobRebel, private.RobRebelResp) EventSystem.Regist(EventID.UI_UpdateRebelStrike_Select, private.SetSelectInfo) EventSystem.Regist(EventID.UI_Activity_Refresh_Notice, private.OnNoticeRefresh) EventSystem.Regist(EventID.Level_InitLevel, private.OnInitLevel) private.rebelStrikeSwitchCD = DataSheetManager.ConstData:GetDataByID("RebelStrikeSwitchCD").IntValue private.rebelStrikeRefreshCD = DataSheetManager.ConstData:GetDataByID("RebelStrikeRefreshCD").IntValue private.rebelStrikeRewardTimes = DataSheetManager.ConstData:GetDataByID("RebelForceRewardTimes").IntValue end function private.OnInitLevel() if BattleDataGetter.CheckCurLevelType(LuaConst.LevelType.SyncRebelStrike) then local isRed = MDL.Activities.GetRedPointStateByActivityID(LuaConst.ActivityType.RebelStrike) if isRed == true and not RebelStrike_Model.IsCanGetTeamReward() then --进入叛军突袭,需要消除红点,并记录进入时间 MDL.RedPoint.OneTimeRedPointRequest(MDL.RedPoint.RedPointType.RebelStrike, 1, true, LuaConst.ActivityType.RebelStrike) end end end function RebelStrike_Model.SyncAwardTimes(info) if IsServerDataNotNil(info) then private.leftAwardTimes = info.rewardCount --当天可领取次数 private.teamPassCount = info.TeamPassCount --玩家当天成功组队的次数 private.teamRewardCount = info.TeamRewardCount --玩家当天已领取的组队奖励次数 else private.leftAwardTimes = 0 end private.CheckRebelStrikeRed() EventSystem.Dispatch(EventID.UI_UpdateRebelStrike_TeamReward) end function private.CheckRebelStrikeRed() if private.timeToOpenHandle then TimerUtil.Remove(private.timeToOpenHandle) end local nextCheckTime if RebelStrike_Model.IsCanGetTeamReward() then EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.RebelStrike, true) elseif private.leftAwardTimes == 0 then --无奖励次数了,这个时候不用加定时器了,等待第二天刷新推送即可 EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.RebelStrike, false) else local openTime = CTL.RebelStrike.GetTimeToOpen() if openTime > 0 then nextCheckTime = openTime EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.RebelStrike, false) else --在活动时间内 nextCheckTime = CTL.RebelStrike.GetTimeToClose() local time = MDL.RedPoint.GetRedPointTimeByType(MDL.RedPoint.RedPointType.RebelStrike) if time and time > 0 and UTL.Time.CheckLeftTimeLessOneHour(time) then EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.RebelStrike, false) else EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.RebelStrike, true) end end end if nextCheckTime then private.timeToOpenHandle = TimerUtil.Interval(private.CheckRebelStrikeRed, nextCheckTime + 1, 1) end end function RebelStrike_Model.GetLeftAwardTimes() return private.leftAwardTimes end function RebelStrike_Model.GetTeamRewardRemainTime() return private.rebelStrikeRewardTimes - (private.teamRewardCount or 0), private.rebelStrikeRewardTimes end function RebelStrike_Model.IsCanGetTeamReward() return private.teamPassCount > private.teamRewardCount and private.rebelStrikeRewardTimes > private.teamRewardCount end --是否在前往的CD中 function RebelStrike_Model.IsInGoToTargetCD() local offset = UTL.Time.GetServerTimestamp() - private.goToTargetCD if offset > private.rebelStrikeSwitchCD then return false end CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_RebelStrike_SwitchMapCD, private.rebelStrikeSwitchCD - offset)) return true end --更新前往CD function RebelStrike_Model.UpdateGoToTargetCD() private.goToTargetCD = UTL.Time.GetServerTimestamp() end --获取刷新CD function RebelStrike_Model.GetRefreshCD() local offset = UTL.Time.GetServerTimestamp() - private.refreshCD if offset > private.rebelStrikeRefreshCD then return 0 end return private.rebelStrikeRefreshCD - offset end --排序规则:分线人数未满>精英数大于0>地图ID>分线的数字 local function SortRule(a, b) local isFull_1 = a.playerNum >= a.maxNum local isFull_2 = b.playerNum >= b.maxNum if isFull_1 == isFull_2 then local isEliteLeft_1 = a.eliteNum > 0 local isEliteLeft_2 = b.eliteNum > 0 if isEliteLeft_1 == isEliteLeft_2 then if a.mapId == b.mapId then return a.lineId < b.lineId else return a.mapId < b.mapId end else return isEliteLeft_1 end else return isFull_2 end end --刷新前往面板数据 function RebelStrike_Model.RefreshLineInfoReq() local msg = rebel_strike_pb.OpenGoToPanelReq() NetManager.SendMessage(MessageEnums.MessageOpenGoToPanel, msg) end function private.RefreshLineInfoResp(msgResp) logging.log(LTAG.LOG, "OpenGoToPanelResp") if msgResp.Resp.Code == 0 then --消息返回成功 private.refreshCD = UTL.Time.GetServerTimestamp() table.sort(msgResp.lines, SortRule) private.lineInfoList = msgResp.lines EventSystem.Dispatch(EventID.UI_UpdateRebelStrike_LineInfo) end end -- 领取组队奖励 function RebelStrike_Model.ClaimTeamRewardReq() local msg = rebel_strike_pb.RebelStrikeTeamRewardReq() NetManager.SendMessage(MessageEnums.MessageRebelStrikeTeamReward, msg) end function private.ClaimTeamRewardResp(msgResp) end function RebelStrike_Model.GetLineInfoList() return private.lineInfoList end --刷新当前场景状态 function private.OnS2CAllRebelInfo(msgResp) if msgResp.isDestroy then RebelStrike_Model.SyncRebelStrikeSceneInfo(nil) else RebelStrike_Model.SyncRebelStrikeSceneInfo(msgResp.rebels) end end function RebelStrike_Model.SyncRebelStrikeSceneInfo(rebels) logging.log(LTAG.LOG, "SyncRebelStrikeSceneInfo") table.clear(private.sceneInfoDic) if rebels then for _, rebelInfo in ipairs(rebels) do local tab = private.sceneInfoDic[rebelInfo.groupId] if tab then table.insert(tab, rebelInfo) else private.sceneInfoDic[rebelInfo.groupId] = { rebelInfo } end end end if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.RebelStrike) then EventSystem.Dispatch(EventID.UpdateRebelStrikeSceneInfo) EventSystem.Dispatch(EventID.UI_UpdateRebelStrike_MapInfo) else EventSystem.Regist(EventID.FunctionUnlockUpdate, private.OnFunctionUnlockUpdate) end end function private.OnFunctionUnlockUpdate() if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.RebelStrike) then EventSystem.UnRegist(EventID.FunctionUnlockUpdate, private.OnFunctionUnlockUpdate) EventSystem.Dispatch(EventID.UpdateRebelStrikeSceneInfo) EventSystem.Dispatch(EventID.UI_UpdateRebelStrike_MapInfo) end end function private.SetSelectInfo(info) private.selectInfo = info end function RebelStrike_Model.GetSelectInfo() return private.selectInfo end function RebelStrike_Model.RobRebelReq() if CTL.TeamMatch.IsInMatching() then CTL.Tips.AddTipsMsg(Const_IDS.IDS_TeamDungeon1_Matching) return end if private.selectInfo then --判断状态 if private.selectInfo.state == 1 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_ERRORCODE_1211_RebelStrikeHaveInHand) return end local msg = rebel_strike_pb.RobRebelReq() msg.rebel.groupId = private.selectInfo.groupId msg.rebel.index = private.selectInfo.index msg.rebel.type = private.selectInfo.type NetManager.SendMessage(MessageEnums.MessageRobRebel, msg) end end function private.RobRebelResp(msgResp) logging.log(LTAG.LOG, "RobRebelResp") end --获取该元素下各个Npc的状态信息 function RebelStrike_Model.GetLevelItemInfo(levelItemID) return private.sceneInfoDic[levelItemID] end --获取随机寻路点 function RebelStrike_Model.GetRandLevelItem() local randomIndex = math.floor(UnityEngine.Random.Range(1,private.GetLevelItemLength() + 1)) local index = 0 for k,v in pairs(private.sceneInfoDic) do index = index + 1 if index == randomIndex then return LevelItemManager.GetItemDataByID(k) end end end --获取随机寻路点(返回ID) function RebelStrike_Model.GetRandLevelItemID() local randomIndex = math.random(private.GetLevelItemLength()) local index = 0 for k,v in pairs(private.sceneInfoDic) do index = index + 1 if index == randomIndex then return k end end end function private.GetLevelItemLength() local index = 0 for _,v in pairs(private.sceneInfoDic) do index = index + 1 end return index end return RebelStrike_Model