local Title_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local title_pb = require "Proto/title_pb" Title_Model.TITLE_TYPE_MAX = 4 --称号类型上限 --key:GeneralTitleID value:titleConfig,hasGet,isNew,isWear,invalidTimeStamp private.titleInfoContainer = {} --曾经拥有过的称号 private.ownedTitleDic = {} --当前穿戴的称号ID private.curWearTitle = 0 --排好序的称号列表 private.sortedTypeTitleList = {} private.timerHandle = nil private.nextInvalidTitle = nil --当前场景展示的称号 所属ID private.showTitleID = 0 --排序规则:使用状态>获得状态>配置的Sort大到小 local function SortRule(a, b) if a.isWear ~= b.isWear then return a.isWear else if a.hasGet ~= b.hasGet then return a.hasGet else if a.isNew ~= b.isNew then return a.isNew else return a.titleConfig.Sort > b.titleConfig.Sort end end end end function Title_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageTitleInvalid, private.OnTitleInvalidResp) NetManager.RegisterMsgCB(MessageEnums.MessageTitleBrowsed, private.OnTitleBrowsedResp) NetManager.RegisterMsgCB(MessageEnums.MessageTitleChange, private.OnTitleChangeResp) NetManager.RegisterMsgCB(MessageEnums.MessageTitleUseItem, private.OnTitleUseItemResp) for i, v in DataSheetManager.Title:GetEnumerator() do local generalTitleID = v.GeneralTitleID if private.titleInfoContainer[generalTitleID] == nil then private.titleInfoContainer[generalTitleID] = { titleConfig = v, isWear = false, isNew = false, invalidTimeStamp = 0, hasGet = false, } end end end function Title_Model.HasTitleByGeneralTitleID(generalTitleID) local info = private.titleInfoContainer[generalTitleID] if info then return info.hasGet end return false end function Title_Model.GetConfigByGeneralTitleID(generalTitleID) local info = private.titleInfoContainer[generalTitleID] if info then return info.titleConfig end end --称号是否曾经获得过 function Title_Model.HasTitleOwned(titleID) if private.ownedTitleDic[titleID] then return true end return false end --服务器每次更新都是全量推送 --这里重新构造一个k-v表,不缓存服务器发过来的数据,是因为数据中的id不是主键,每次都得遍历去查找对应的配置数据 function Title_Model.SyncTitleInfo(titleInfo, isInit) if titleInfo == nil then return end private.curWearTitle = titleInfo.CurWearTitle for i, v in ipairs(titleInfo.OwnedTitles) do private.ownedTitleDic[v] = true end for _, v in ipairs(titleInfo.Titles) do local generalTitleID = v.GeneralTitleID local info = private.titleInfoContainer[generalTitleID] --做激活表现 if isInit == false then if info.hasGet == false then CTL.Title.ShowTitleMsg(Const_IDS.IDS_Title_Activation, info.titleConfig) end end --刷新数据 info.isWear = private.curWearTitle == generalTitleID info.isNew = v.NotViewedYet info.invalidTimeStamp = v.InvalidTimeStamp info.hasGet = true end for generalTitleID, v in pairs(private.titleInfoContainer) do local hasGet = false for _, info in ipairs(titleInfo.Titles) do if generalTitleID == info.GeneralTitleID then hasGet = true break end end if hasGet == false then --失效表现 if isInit == false and v.hasGet then CTL.Title.ShowTitleMsg(Const_IDS.IDS_Title_Invalid, v.titleConfig) end v.isWear = false v.hasGet = false v.isNew = false v.invalidTimeStamp = 0 end end --设置计时器,通知服务器称号失效 private.SetTimerToInvalidTitle() --刷新红点 for i = 1, Title_Model.TITLE_TYPE_MAX do local isNew = false for _, v in pairs(private.titleInfoContainer) do if v.titleConfig.Type == i then if v.isNew then isNew = true break end end end if isNew then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey["TownHead_Title_Type" .. i]) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey["TownHead_Title_Type" .. i]) end end EventSystem.Dispatch(EventID.UI_UpdateTitleInfo) end --返回排序好的称号列表 function Title_Model.GetSortedTypeTitleList(type) if #private.sortedTypeTitleList > 0 then table.clearArray(private.sortedTypeTitleList) end for _, v in pairs(private.titleInfoContainer) do if v.titleConfig.Type == type then if v.titleConfig.Preview or Title_Model.HasTitleOwned(v.titleConfig.ID) then table.insert(private.sortedTypeTitleList, v) end end end table.sort(private.sortedTypeTitleList, SortRule) return private.sortedTypeTitleList end --返回穿戴的称号 function Title_Model.GetWearTitleInfo() if private.curWearTitle > 0 then return private.titleInfoContainer[private.curWearTitle] end end function Title_Model.GetWearTitle() return private.curWearTitle end --设置失效计时器 function private.SetTimerToInvalidTitle() if private.timerHandle then TimerUtil.Remove(private.timerHandle) private.timerHandle = nil end local minTime = 0 local minID = 0 local curTime = UTL.Time.GetServerTimestamp() for _, v in pairs(private.titleInfoContainer) do if v.hasGet and v.invalidTimeStamp > 0 then local offset = v.invalidTimeStamp - curTime if minTime == 0 then minTime = offset minID = v.titleConfig.GeneralTitleID elseif minTime > offset then minTime = offset minID = v.titleConfig.GeneralTitleID end end end if minTime > 0 then private.nextInvalidTitle = minID private.timerHandle = TimerUtil.Interval(private.TimeToEnd, minTime, 1) end end --称号计时结束,通知服务器 function private.TimeToEnd() if private.nextInvalidTitle then private.TitleInvalidReq(private.nextInvalidTitle) private.nextInvalidTitle = nil end end --称号失效通知服务器 function private.TitleInvalidReq(generalTitleID) local msg = title_pb.TitleInvalidReq() msg.GeneralTitleID = generalTitleID NetManager.SendMessage(MessageEnums.MessageTitleInvalid, msg) end function private.OnTitleInvalidResp(resp) logging.log(LTAG.LOG, "OnTitleInvalidResp") private.SetTimerToInvalidTitle() end --切换页签后,将所有的称号告知服务器,消去"新"标识 function Title_Model.TitleBrowsedReq(infoList) local msg = title_pb.TitleBrowsedReq() for _, v in ipairs(infoList) do table.insert(msg.GeneralTitleIDs, v.titleConfig.GeneralTitleID) end NetManager.SendMessage(MessageEnums.MessageTitleBrowsed, msg) end function private.OnTitleBrowsedResp(resp) logging.log(LTAG.LOG, "OnTitleBrowsedResp") end --更换称号穿戴 function Title_Model.TitleChangeReq(generalTitleID, tips) private.titleChangeTips = tips local msg = title_pb.TitleChangeReq() msg.GeneralTitleID = generalTitleID NetManager.SendMessage(MessageEnums.MessageTitleChange, msg) end function private.OnTitleChangeResp(resp) logging.log(LTAG.LOG, "OnTitleChangeResp") if resp.Resp.Code == 0 then if private.titleChangeTips then CTL.Tips.AddTipsMsg(private.titleChangeTips) end end end function Title_Model.TitleUseItemReq(itemID) local msg = title_pb.TitleUseItemReq() msg.ItemID = itemID NetManager.SendMessage(MessageEnums.MessageTitleUseItem, msg) end function private.OnTitleUseItemResp(resp) logging.log(LTAG.LOG, "OnTitleUseItemResp") if resp.Resp.Code == 0 then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Title_Success"]) end end return Title_Model