local HorseRear_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local horse_activity_op_pb = require 'Proto.horse_activity_op_pb' local HORSE_REAR_CHOOSE_POPUP_OPENED = "HORSE_REAR_CHOOSE_POPUP_OPENED" --[[ private.GodBeastInfoList = { activityId, rearLevel, curExpNum, rearLevelRewards }]] function HorseRear_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageHorseAty, private.HorseRearActivityResp) NetManager.RegisterMsgCB(MessageEnums.MessageHorseLvRwd, private.HorseLevelRewardResp) NetManager.RegisterMsgCB(MessageEnums.MessageHorseRear, private.HorseRearResp) NetManager.RegisterMsgCB(MessageEnums.MessageChooseRewardHorse, private.ChooseRewardHorseResp) EventSystem.Regist(EventID.FunctionUnlockUpdate, private.RefreshInfoByFunction) EventSystem.Regist(EventID.UI_RefreshCurrency, private.RefreshFameRedPoint) EventSystem.Regist(EventID.New_Day_Refresh, HorseRear_Model.HorseRearInfoRequest) EventSystem.Regist(EventID.UI_OACommon_RedPointChanged, private.RefreshFameRedPoint) EventSystem.Regist(EventID.UI_DirectGift_GiftInfoUpdate, private.RefreshFameRedPoint) private.ActivityType = MDL.OperationActivity.ActivityType.HorseRear private.HorseRearInfoList = {} private.isInActivityFuncTime = {} --是否在功能活动时间内(如果在展示时间则为false) private.activityEndTimerHandle = {} private.initRedPointList = {} -- 初始化红点树的活动ID数组 end function HorseRear_Model.GetRearLevel(activityId) if private.HorseRearInfoList[activityId] then return private.HorseRearInfoList[activityId].rearLevel end return 0 end function HorseRear_Model.GetCurExpNum(activityId) if private.HorseRearInfoList[activityId] then return private.HorseRearInfoList[activityId].curExpNum end return 0 end function HorseRear_Model.GetRearLevelReward(activityId, level) if private.HorseRearInfoList[activityId] and private.HorseRearInfoList[activityId].rearLevelRewards then if level then return private.HorseRearInfoList[activityId].rearLevelRewards[level] else return private.HorseRearInfoList[activityId].rearLevelRewards end end return nil end function HorseRear_Model.GetRearHorseIsCanChoose(activityId) if private.HorseRearInfoList[activityId] then if private.HorseRearInfoList[activityId].canChoose then local chooseId = HorseRear_Model.GetRearHorseChooseId(activityId) local cardPoolList = CTL.HorseRear.GetActivitySameQualityHorse(activityId, chooseId) return #cardPoolList > 0 end return false end return false end function HorseRear_Model.GetRearHorseChooseId(activityId) if private.HorseRearInfoList[activityId] then if private.HorseRearInfoList[activityId].chooseId == 0 then local basicData = MDL.OperationActivity.ActivityBaseData[private.ActivityType]:GetDataByActivityID(activityId) return basicData.HorseID end return private.HorseRearInfoList[activityId].chooseId end return 0 end function HorseRear_Model.IsHorseChoosePopUpAutoOpened(activityId) local str = HORSE_REAR_CHOOSE_POPUP_OPENED..activityId return PersistentData.PlayerData:Get(str, false) end function HorseRear_Model.SetHorseChoosePopUpAutoOpened(activityId) local str = HORSE_REAR_CHOOSE_POPUP_OPENED..activityId PersistentData.PlayerData:Set(str, true, true) end function HorseRear_Model.IsActivityInFuncTime(activityId) if private.isInActivityFuncTime[activityId] == nil then private.SetEndTimerByActivityId(activityId) end return private.isInActivityFuncTime[activityId] end function private.SetEndTimerByActivityId(activityId) if private.activityEndTimerHandle[activityId] then TimerUtil.Remove(private.activityEndTimerHandle[activityId]) private.activityEndTimerHandle[activityId] = nil end local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType, activityId) local nowTime = UTL.Time.GetServerTimestamp() local endTime = activityInfo.endTime if endTime > nowTime then private.isInActivityFuncTime[activityId] = true local deltaTime = endTime - nowTime if deltaTime <= UTL.Time.TotalSecondsOneDay then private.activityEndTimerHandle[activityId] = TimerUtil.Interval(private.EndAndCloseActivity(activityId), deltaTime - 1, 1) --时间减1s是为了防止有误差导致玩家点击出现报错 end else private.EndAndCloseActivity(activityId) end end function private.EndAndCloseActivity(activityId) logging.log(LTAG.LOG, "HorseRear ActivityEnd, activityId: ", activityId) if private.activityEndTimerHandle[activityId] then TimerUtil.Remove(private.activityEndTimerHandle[activityId]) private.activityEndTimerHandle[activityId] = nil end private.isInActivityFuncTime[activityId] = false EventSystem.Dispatch(EventID.UI_HorseRear_ActivityEnd, activityId) end function HorseRear_Model.IsHasLevelReward(activityId) for i = 1, HorseRear_Model.GetRearLevel(activityId) do if not HorseRear_Model.GetRearLevelReward(activityId, i) then return true end end return false end function HorseRear_Model.IsFeedItemEnough(activityId) local basicData = MDL.OperationActivity.ActivityBaseData[private.ActivityType]:GetDataByActivityID(activityId) local feedItemId = basicData.ItemID local feedItemCount = UTL.Item.GetItemStockCount(feedItemId) return feedItemCount > 0 end function private.RefreshFameRedPoint() for k, v in pairs(private.HorseRearInfoList) do local activityId = v.activityId if private.initRedPointList[activityId] then MDL.RedPoint.UpdateNodeStateByLogicParams(CTL.OACommon.IsHasTaskRedPoint(activityId), CTL.HorseRear.RpEventId[activityId].TownHome, CTL.HorseRear.RpEventId[activityId].Task) MDL.RedPoint.UpdateNodeStateByLogicParams(CTL.OACommon.IsHasGiftRedPoint(activityId), CTL.HorseRear.RpEventId[activityId].TownHome, CTL.HorseRear.RpEventId[activityId].Gift) MDL.RedPoint.UpdateNodeStateByLogicParams(HorseRear_Model.IsHasLevelReward(activityId), CTL.HorseRear.RpEventId[activityId].TownHome, CTL.HorseRear.RpEventId[activityId].LevelReward) MDL.RedPoint.UpdateNodeStateByLogicParams(HorseRear_Model.IsFeedItemEnough(activityId), CTL.HorseRear.RpEventId[activityId].TownHome, CTL.HorseRear.RpEventId[activityId].FeedItemEnough) else CTL.HorseRear.InitHorseRearRedPointTreeByActivityId(activityId) private.initRedPointList[activityId] = true end end end function private.SetHorseRearInfo(info) if not private.HorseRearInfoList[info.activityId] then private.HorseRearInfoList[info.activityId] = {} end private.HorseRearInfoList[info.activityId] = { activityId = info.activityId, rearLevel = info.lv or 0, curExpNum = info.exp or 0, canChoose = info.canChoose or false, chooseId = info.chooseId or 0, rearLevelRewards = {}, } for i, v in ipairs(info.lvRwds) do private.HorseRearInfoList[info.activityId].rearLevelRewards[v] = true end private.RefreshFameRedPoint() private.SetEndTimerByActivityId(info.activityId) EventSystem.Dispatch(EventID.UI_HorseRear_InfoUpdate) end function private.RefreshInfoByFunction(funcId, isUnlock) if funcId == MDL.Unlock.FunctionType.HorseRear then if isUnlock then HorseRear_Model.HorseRearInfoRequest() end end end --region ***************** 协议 ******************** function HorseRear_Model.HorseRearInfoRequest() if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.HorseRear) then local info = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType) if info then for activityId, v in pairs(info) do if CTL.OperationActivity.IsOperationActivityOpen(v) then private.HorseRearActivityReq(activityId) end end end end end --region ***************** 协议 ******************** ---打开养马界面请求信息 function private.HorseRearActivityReq(activityId) local msg = horse_activity_op_pb.HorseAtyReq() msg.activityId = activityId NetManager.SendMessage(MessageEnums.MessageHorseAty, msg) end function private.HorseRearActivityResp(msgResp) if msgResp.Resp.Code == 0 then if msgResp.activityId > 0 then private.SetHorseRearInfo(msgResp) end end end ---养马喂养请求 function HorseRear_Model.HorseRearReq(activityId, times) local msg = horse_activity_op_pb.HorseRearReq() msg.activityId = activityId msg.times = times MDL.Reward.SetCloseRewardTipShow(true) NetManager.SendMessage(MessageEnums.MessageHorseRear, msg) end function private.HorseRearResp(msgResp) if msgResp.Resp.Code == 0 then local newLevel = msgResp.lv local oldLevel = private.HorseRearInfoList[msgResp.activityId].rearLevel private.HorseRearInfoList[msgResp.activityId].curExpNum = msgResp.exp private.HorseRearInfoList[msgResp.activityId].rearLevel = newLevel private.HorseRearInfoList[msgResp.activityId].canChoose = msgResp.canChoose private.HorseRearInfoList[msgResp.activityId].chooseId = msgResp.chooseId private.RefreshFameRedPoint() EventSystem.Dispatch(EventID.UI_HorseRear_PlayEventPerform, msgResp, oldLevel, newLevel) EventSystem.Dispatch(EventID.UI_HorseRear_InfoUpdate) end MDL.Reward.SetCloseRewardTipShow(false) end ---养马领取登记奖励请求 function HorseRear_Model.HorseLevelRewardReq(activityId) local msg = horse_activity_op_pb.HorseLvRwdReq() msg.activityId = activityId NetManager.SendMessage(MessageEnums.MessageHorseLvRwd, msg) end function private.HorseLevelRewardResp(msgResp) if msgResp.Resp.Code == 0 then for i, v in ipairs(msgResp.lvRwds) do private.HorseRearInfoList[msgResp.activityId].rearLevelRewards[v] = true end private.RefreshFameRedPoint() EventSystem.Dispatch(EventID.UI_HorseRear_InfoUpdate) end end ---选择马 function HorseRear_Model.ChooseRewardHorseReq(activityId, horseId) local msg = horse_activity_op_pb.ChooseRewardHorseReq() msg.activityId = activityId msg.horseId = horseId NetManager.SendMessage(MessageEnums.MessageChooseRewardHorse, msg) end function private.ChooseRewardHorseResp(msgResp) if msgResp.Resp.Code == 0 then private.HorseRearInfoList[msgResp.activityId].canChoose = msgResp.canChoose private.HorseRearInfoList[msgResp.activityId].chooseId = msgResp.chooseId EventSystem.Dispatch(EventID.UI_HorseRear_ChooseHorse) CTL.Tips.AddTipsMsg(Const_IDS["IDS_OptionalHorseAndTreasure_Hint14"]) end end --endregion ***************** 协议 ******************** return HorseRear_Model