local ClimbTower_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local climb_tower_pb = require('Proto/climb_tower_pb') local _firstLevelId --每次爬塔进入的第一关 local _totalRewards={} --总的通关奖励 local _closeSpeedUp = true function ClimbTower_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageRefreshClimbTower, private.RefreshClimbTowerResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGetHangUpRewards, private.GetHangUpRewardsResponse) --通过最远的关卡 private.passFarthestId = 0 --免费使用的次数 private.freeNums = 0 --已经付费的次数 private.payNums = 0 --挂机时长 private.duration = 0 --奖励 private.awardExp = 0 private.awardStone = 0 --强化石 private.awardSilverCoin = 0 private.awardGoods = nil private.noticeAward = false end --全量发送 function ClimbTower_Model.SyncClimbTowerInfo(info) --通过最远的关卡 private.passFarthestId = info.passFarthestId --免费使用的次数 private.freeNums = info.freeNums --已经付费的次数 private.payNums = info.payNums --挂机时长 private.duration = info.duration --先移除旧的计时器 if private.TimerID then TimerUtil.Remove(private.TimerID) end if info.unlockedLevelId > 0 then if private.passFarthestId > 0 then --先判断是否达到最大时 local totalTime = ClimbTower_Model.GetTotalDuration() if private.duration >= totalTime then private.freshTimeStamp = nil else --已经通关过,开启计时 local timeCircle = DataSheetManager.ConstData:GetDataByID("ClimbTowerRewardTime").IntValue local timeValue = timeCircle - (private.duration % timeCircle) private.TimerID = TimerUtil.Interval(ClimbTower_Model.RefreshClimbTowerReq,timeValue,1) --记录当前的时间戳 private.freshTimeStamp = UTL.Time.GetServerTimestamp() end end --总奖励(分离出银币和经验、不可堆叠的道具需要单件显示) if info.rewardInfos then if private.awardGoods then table.clearArray(private.awardGoods) end private.awardExp = 0 private.awardSilverCoin = 0 private.awardStone = 0 for _,rewardInfo in pairs(info.rewardInfos) do if rewardInfo.id == MDL.Reward.ExpItemId then private.awardExp = rewardInfo.count elseif rewardInfo.id == MDL.Currency.CurrencyType.SilverCoin then private.awardSilverCoin = rewardInfo.count else if rewardInfo.id == MDL.Reward.EquipIntensifyStoneId then private.awardStone = rewardInfo.count end local itemData = rewardInfo.id and DataSheetManager.ItemData:GetDataByID(rewardInfo.id) or nil if itemData then if private.awardGoods == nil then private.awardGoods = {} end --不可堆叠 if itemData.MaxStackSize == 1 then for i = 1, rewardInfo.count do table.insert(private.awardGoods,rewardInfo.id) end else local goodInfo = {} goodInfo.Id = rewardInfo.id goodInfo.Count = rewardInfo.count table.insert(private.awardGoods,goodInfo) end end end end end end EventSystem.Dispatch(EventID.UI_UpdateClimbTowerInfo) end --挂机时长 function ClimbTower_Model.GetDurationVal() return private.duration end --免费使用的次数 function ClimbTower_Model.GetFreeNums() return private.freeNums end --已经付费的次数 function ClimbTower_Model.GetPayNums() return private.payNums end ---- 奖励 function ClimbTower_Model.GetAwardStone() return private.awardStone end function ClimbTower_Model.GetAwardSilverCoin() return private.awardSilverCoin end function ClimbTower_Model.GetHasNoticeAward() return private.noticeAward end function ClimbTower_Model.SetHasNoticeAward(val) private.noticeAward = val end function ClimbTower_Model.GetAwardGoods() return private.awardGoods end ---- --是否屏蔽爬塔加速 function ClimbTower_Model.GetIsCloseSpeedUp() return _closeSpeedUp end --获取挂机时长 function ClimbTower_Model.GetHangUpDuration() if private.freshTimeStamp then return (UTL.Time.GetServerTimestamp() - private.freshTimeStamp) + private.duration end return ClimbTower_Model.GetTotalDuration() end --通过最远的关卡 function ClimbTower_Model.GetPassFarthestId() return private.passFarthestId end --最大挂机时长(加上官职收益时间) function ClimbTower_Model.GetTotalDuration() local baseTime = DataSheetManager.ConstData:GetDataByID("ClimbTowerRewardTimeMax").IntValue --官职收益 local profitTime = MDL.OfficialPosition.GetProfitParam("ClimbTowerTime") return baseTime + profitTime end function ClimbTower_Model.RefreshClimbTowerReq() local msg = climb_tower_pb.RefreshClimbTowerReq() NetManager.SendMessage(MessageEnums.MessageRefreshClimbTower, msg) end function private.RefreshClimbTowerResponse(msgResp) logging.log(LTAG.LOG, "RefreshClimbTowerResp") end function ClimbTower_Model.GetHangUpRewardsReq() local msg = climb_tower_pb.GetHangUpRewardsReq() NetManager.SendMessage(MessageEnums.MessageGetHangUpRewards, msg) end function private.GetHangUpRewardsResponse(msgResp) logging.log(LTAG.LOG, "GetHangUpRewardsResp") if msgResp.Resp.Code ~= 0 then BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_AwardButtonClick,BIManager.BDCEventParam.taskid,"MessageGetHangUpRewards",BIManager.BDCEventParam.get_award_state,BIManager.BDCEventParamValue.Get_Award_State_Fail) else --消息返回成功 BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_AwardButtonClick,BIManager.BDCEventParam.taskid,"MessageGetHangUpRewards",BIManager.BDCEventParam.get_award_state,BIManager.BDCEventParamValue.Get_Award_State_Success) end CTL.Notification.TryOpenNotificationTipPanel() end --按照章节拆分章节表 function ClimbTower_Model.SplitConfigByChapter() local chapterLevelList = {} for _,v in DataSheetManager.ClimbTowerLevel:GetEnumerator() do if chapterLevelList[v.BelongToChapter] == nil then chapterLevelList[v.BelongToChapter] = {} end table.insert(chapterLevelList[v.BelongToChapter], v) end return chapterLevelList end local function SortLevelConfigByPassCondition(a, b) local isFinishA = private.passFarthestId >= a.ID local isFinishB = private.passFarthestId >= b.ID if isFinishA ~= isFinishB then -- 都完成或都未完成 return isFinishA and not isFinishA or isFinishB else return a.ID < b.ID end end -- 返回章节奖励预览数据 function ClimbTower_Model.GetLevelDataPreview() local result = {} local belongChapter if private.passFarthestId == 0 then belongChapter = DataSheetManager.ClimbTowerLevel:GetDataByID(10001).BelongToChapter else belongChapter = DataSheetManager.ClimbTowerLevel:GetDataByID(private.passFarthestId).BelongToChapter end local chapterLevelList = MDL.ClimbTower.SplitConfigByChapter() for i,v in ipairs(chapterLevelList[belongChapter]) do table.insert(result, v) end table.sort(result, SortLevelConfigByPassCondition) return result end --每次进爬塔前的已挑战的关卡 function ClimbTower_Model.GetFirstEnterLevelId() return _firstLevelId end function ClimbTower_Model.SetFirstEnterLevelId(levelId) _firstLevelId =levelId end --是否有通关奖励 function ClimbTower_Model.IsHasRewards() return _totalRewards and #_totalRewards > 0 end --获取通关总奖励 function ClimbTower_Model.GetTotalRewards() return _totalRewards end --清空奖励 function ClimbTower_Model.ClearTotalRewards() table.clear(_totalRewards) end --保存通关奖励,合并同类奖励 function ClimbTower_Model.SaveTotalRewards(reward) for k, v in pairs(reward) do if v.ItemId ~=nil then local isContain=false for k2, v2 in pairs(_totalRewards) do if v2.ItemId == v.ItemId then isContain=true v2.ItemCount=v2.ItemCount+v.ItemCount end end if not isContain then table.insert(_totalRewards,v) end end end end return ClimbTower_Model