local XNameplate = require("XEntity/XNameplate/XNameplate") XMedalManagerCreator = function() local tableInsert = table.insert local XMedalManager = {} local METHOD_NAME = { ScoreTitleShowSetRequest = "ScoreTitleShowSetRequest", CollectionShowSetRequest = "CollectionShowSetRequest", WearNameplateRequest = "WearNameplateRequest", } XMedalManager.InType = { Normal = 1, GetMedal = 2, OtherPlayer = 3, Preview = 4 } XMedalManager.MedalStroyId = CS.XGame.ClientConfig:GetInt("MedalStoryId") local NewMedalId = nil local ScoreTitleUnLockList = {} -- 收藏品ID为索引,存放服务器下发的解锁收藏品 local MedalList = {} local ScoreTitleList = {} -- Type索引数组,数组存放收藏品配置 local ScoreTitleDataList = {} -- 收藏品ID为索引,存放收藏品配置 local ScoreTitleShowStateList = {} local NewCollectionList = {} local QualityUpCollectionList = {} local IsCanCheckQualityUp local MedalUpdateTimeId --勋章持续刷新Id local MedalUpdateList --需刷新勋章使用期列表 local BaseIconWidth -- 基准图标宽度 local DEFAULT_BASE_ICON_WIDHT = 160 -- 默认基准图标宽度(玩家信息的收藏品页签中的格子) function XMedalManager.Init() XMedalManager.StopUpdateTimeMedal() --停止刷新勋章持续时间 XMedalManager.InitScoreTitleList() XMedalManager.InitMedalList() IsCanCheckQualityUp = true end function XMedalManager.GetMedals() table.sort(MedalList, function(headA, headB) local weightA = headA.IsLock and 0 or 1 local weightB = headB.IsLock and 0 or 1 if weightA == weightB then return headA.Priority > headB.Priority end return weightA > weightB end) return MedalList end function XMedalManager.GetMedalById(id) for _, medal in pairs(MedalList) do if medal.Id == id then return medal end end return nil end function XMedalManager.InitMedalList() MedalUpdateList = {} local meadalsCfg = XMedalConfigs.GetMeadalConfigs() for _, meadal in pairs(meadalsCfg or {}) do local tmp = {} for k, v in pairs(meadal) do tmp[k] = v end tmp["Type"] = XMedalConfigs.MedalType.Normal tmp["IsLock"] = true tmp["Time"] = 0 tmp["Num"] = 0 table.insert(MedalList, tmp) end end function XMedalManager.CreateOtherPlayerMedalList(medalInfos) if not medalInfos then return {} end local meadalsCfg = XMedalConfigs.GetMeadalConfigs() local othermedalList = {} for _, Info in pairs(medalInfos) do local cfg = meadalsCfg[Info.Id] if cfg then local tmp = {} for k, v in pairs(cfg) do tmp[k] = v end tmp["Type"] = XMedalConfigs.MedalType.Normal tmp["IsLock"] = false tmp["Time"] = Info.Time tmp["Num"] = Info.Num othermedalList[tmp.Id] = tmp end end return othermedalList end function XMedalManager.UpdateMedalList() for _, medal in pairs(MedalList) do local medalInfo = XPlayer.UnlockedMedalInfos[medal.Id] if medalInfo then medal.IsLock = false medal.Time = medalInfo.Time medal.KeepTime = medalInfo.KeepTime --勋章的有效持续时间,失效期 = KeepTime + Time。等于0或空值表示永久有效。 medal.Num = medal.Num medal.IsExpired = false --是否已过期,永久的统一标记为false --检测是否有限时勋章 if medal.KeepTime > 0 then local now = XTime.GetServerNowTimestamp() if (medal.KeepTime + medal.Time) <= now then medal.IsExpired = true else XMedalManager.AddUpdateTimeMedal(medal) end end end end end function XMedalManager.StartUpdateTimeMedal() if MedalUpdateTimeId then return end MedalUpdateTimeId = XScheduleManager.ScheduleForever(function() XMedalManager.UpdateMedalTimeLimit() end, 1000) --每1秒刷新一次 end function XMedalManager.UpdateMedalTimeLimit() --获取需要删除的组员Id local removeList = {} for i = #MedalUpdateList, 1, -1 do local medal = MedalUpdateList[i] if medal then local now = XTime.GetServerNowTimestamp() if (medal.KeepTime + medal.Time) <= now then medal.IsExpired = true if XPlayer.GetCurrentMedal() == medal.Id then XPlayer.ChangeMedal(0) end table.insert(removeList, i) end else table.insert(removeList, i) end end --删除过期的组员Id for _, removeId in pairs(removeList) do table.remove(MedalUpdateList, removeId) end --判断刷新列表是否还有需要刷新的,没有则停止循环检查 if #MedalUpdateList <= 0 then XMedalManager.StopUpdateTimeMedal() end end function XMedalManager.AddUpdateTimeMedal(medal) if #MedalUpdateList <= 0 then table.insert(MedalUpdateList, medal) XMedalManager.StartUpdateTimeMedal() else table.insert(MedalUpdateList, medal) end end function XMedalManager.StopUpdateTimeMedal() if not MedalUpdateTimeId then return end XScheduleManager.UnSchedule(MedalUpdateTimeId) MedalUpdateTimeId = nil end function XMedalManager.GetMeadalInfoById(Id) return XPlayer.UnlockedMedalInfos[Id] end function XMedalManager.GetMeadalMaxCount() local maxCount = 0 local medalsList = XMedalConfigs.GetMeadalConfigs() for _, _ in pairs(medalsList or {}) do maxCount = maxCount + 1 end return maxCount end function XMedalManager.CheckMedalStoryIsPlayed() if XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "MedalStoryIsPlayed")) then return true end return false end function XMedalManager.MarkMedalStory() if not XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "MedalStoryIsPlayed")) then XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "MedalStoryIsPlayed"), "MedalStoryIsPlayed") end end function XMedalManager.CheckHaveNewMedal() local meadals = XMedalConfigs.GetMeadalConfigs() if not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Medal) then if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Medal) then for _, v in pairs(meadals) do if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", v.Id, XMedalConfigs.MedalType.Normal)) then return true end end end end if not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Collection) then if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Collection) then for _, v in pairs(ScoreTitleDataList) do if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", v.Id, v.Type)) then return true end end end end if XMedalManager.CkeckHaveNewNameplate() then return true end return false end function XMedalManager.CheckHaveNewMedalByType(type) local meadals = XMedalConfigs.GetMeadalConfigs() if type == XMedalConfigs.ViewType.Medal then if not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Medal) then if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Medal) then for _, v in pairs(meadals) do if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", v.Id, XMedalConfigs.MedalType.Normal)) then return true end end end end else if not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Collection) then if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Collection) then for _, v in pairs(ScoreTitleDataList) do if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", v.Id, v.Type)) then return true end end end end end return false end function XMedalManager.CheckIsNewMedalById(Id, type) if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", Id, type)) then return true end return false end function XMedalManager.SetMedalForOld(Id, type) if XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", Id, type)) then XSaveTool.RemoveData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", Id, type)) XEventManager.DispatchEvent(XEventId.EVENT_MEDAL_REDPOINT_CHANGE) end end function XMedalManager.AddNewMedal(Id, type) if not XSaveTool.GetData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", Id, type)) then XSaveTool.SaveData(string.format("%d%s%d%d", XPlayer.Id, "NewMeadal", Id, type), Id) end end function XMedalManager.ShowUnlockTips() if NewMedalId then XLuaUiManager.Open("UiMedalUnlockTips", NewMedalId) NewMedalId = nil return true end return false end function XMedalManager.SetNewMedalId(id) NewMedalId = id end ------------------------------------------计分徽章--------------------------------->>> function XMedalManager.InitScoreTitleList() local scoreTitlesCfg = XMedalConfigs.GetScoreTitlesConfigs() for _, scoreTitle in pairs(scoreTitlesCfg or {}) do if not ScoreTitleList[scoreTitle.Type] then ScoreTitleList[scoreTitle.Type] = {} end local tmp = {} for k, v in pairs(scoreTitle) do tmp[k] = v end tmp["IsLock"] = true tmp["Quality"] = scoreTitle.InitQuality tmp["Score"] = 0 tmp["Time"] = 0 table.insert(ScoreTitleList[scoreTitle.Type], tmp) end for _, type in pairs(ScoreTitleList) do XMedalConfigs.SortByPriority(type) for _, scoreTitle in pairs(type) do ScoreTitleDataList[scoreTitle.Id] = scoreTitle if not ScoreTitleShowStateList[scoreTitle.Type] then ScoreTitleShowStateList[scoreTitle.Type] = {} ScoreTitleShowStateList[scoreTitle.Type].Type = scoreTitle.Type ScoreTitleShowStateList[scoreTitle.Type].Hide = XMedalConfigs.Hide.OFF end end end end function XMedalManager.CreateOtherPlayerScoreTitleList(titleInfos) if not titleInfos then return {} end local scoreTitlesCfg = XMedalConfigs.GetScoreTitlesConfigs() local otherScoreTitleList = {} for _, Info in pairs(titleInfos) do local cfg = scoreTitlesCfg[Info.Id] if cfg then local tmp = {} for k, v in pairs(cfg) do tmp[k] = v end tmp["IsLock"] = false tmp["Quality"] = Info.Quality tmp["Score"] = Info.Score tmp["Time"] = Info.Time if Info.ExpandInfo then tmp["ExpandInfo"] = Info.ExpandInfo end table.insert(otherScoreTitleList, tmp) end end return XMedalConfigs.SortByPriority(otherScoreTitleList) end function XMedalManager.CreateOtherPlayerScoreTitle(titleInfo) if not titleInfo then return end local scoreTitlesCfg = XMedalConfigs.GetScoreTitlesConfigs() local cfg = scoreTitlesCfg[titleInfo.Id] if cfg then local tmp = {} for k, v in pairs(cfg) do tmp[k] = v end tmp["IsLock"] = false tmp["Quality"] = titleInfo.Quality tmp["Score"] = titleInfo.Score tmp["Time"] = titleInfo.Time if titleInfo.ExpandInfo then tmp["ExpandInfo"] = titleInfo.ExpandInfo end return tmp end end function XMedalManager.GetScoreTitle(type) local list = {} if type then local titleList = ScoreTitleList[type] if titleList then for _, scoreTitle in pairs(titleList) do if not scoreTitle.IsLock or scoreTitle.ShowType ~= 0 then table.insert(list, scoreTitle) end end end return list end for _, tmpType in pairs(ScoreTitleList) do for _, scoreTitle in pairs(tmpType) do if not scoreTitle.IsLock or scoreTitle.ShowType ~= 0 then tableInsert(list, scoreTitle) end end end return XMedalConfigs.SortByPriority(list) end function XMedalManager.GetScoreTitleByScreenType(screenType) local list = {} for _, tmpType in pairs(ScoreTitleList) do for _, scoreTitle in pairs(tmpType) do if (not scoreTitle.IsLock or scoreTitle.ShowType ~= 0) then local isHasScreenType = screenType and screenType > 0 local isSameScreenType = scoreTitle.ScreenType == screenType if not isHasScreenType or (isHasScreenType and isSameScreenType) then tableInsert(list, scoreTitle) end end end end local resultList = XMedalManager.UpgradeCollection(list) return XMedalConfigs.SortByPriority(resultList) end function XMedalManager.GetScoreTitleById(id) return ScoreTitleDataList[id] --[[ for _, tmpType in pairs(ScoreTitleList) do for _, scoreTitle in pairs(tmpType) do if scoreTitle.Id == id then return scoreTitle end end end ]] end ---========================================== --- 检查传入的 ‘oriList’数组 是否有需要升级的收藏品 --- 更高级收藏品是一个独立的收藏品,有自己的收藏品Id --- 更高级收藏品会覆盖低级收藏品,需要把低级收藏品隐藏(去除) ---@return table ---========================================== function XMedalManager.UpgradeCollection(oriList) if oriList == nil or next(oriList) == nil then return oriList end local resultList = {} local groupIdIndex = {} -- GroupId做索引,存放相应的收藏品组 -- 区分需要升级与不需要升级的收藏品 for _, scoreTitle in pairs(oriList) do if scoreTitle.GroupId == 0 or scoreTitle.GroupId == nil then -- 收藏品不可以升级,不需要判断显隐 tableInsert(resultList, scoreTitle) else -- 相同组的收藏品放在同一个GroupId表 if groupIdIndex[scoreTitle.GroupId] == nil then groupIdIndex[scoreTitle.GroupId] = {} end tableInsert(groupIdIndex[scoreTitle.GroupId], scoreTitle) end end -- 选出每个Group中最高级的收藏品 for _, group in pairs(groupIdIndex) do table.sort(group, function(scoreTitle1, scoreTitle2) if scoreTitle1.GroupLv == nil then XLog.Error("XMedalManager.UpgradeCollection函数错误,收藏品" .. scoreTitle1.Id .. "的GroupLv为空") return elseif scoreTitle2.GroupLv == nil then XLog.Error("XMedalManager.UpgradeCollection函数错误,收藏品" .. scoreTitle2.Id .. "的GroupLv为空") return end -- 按GroupLv降序排序 return scoreTitle1.GroupLv > scoreTitle2.GroupLv end) -- 将最高级的收藏品放入返回结果中 tableInsert(resultList, group[1]) end return resultList end function XMedalManager.GetMedalData(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData end function XMedalManager.GetMedalImg(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData and scoreTitleData.MedalImg end function XMedalManager.GetScore(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData and scoreTitleData.Score or 0 end function XMedalManager.GetMedalType(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData and scoreTitleData.Type or 0 end function XMedalManager.GetQuality(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData and (scoreTitleData.Quality or scoreTitleData.InitQuality) or 0 end function XMedalManager.GetIsLock(scoreTitleId) local scoreTitleData = ScoreTitleDataList[scoreTitleId] return scoreTitleData and scoreTitleData.IsLock or false end --- --- 获取'minQuality'与'maxQuality'(包括min与max)区间品质的收藏品id数组 --- 如果只有一个参数,则获取这个品质的收藏品id数组 ---@param minQuality number ---@param maxQuality number ---@return table function XMedalManager.GetScoreTitleByQuality(minQuality, maxQuality) local list = {} if not minQuality and not maxQuality then XLog.Error("XMedalManager.GetScoreTitleByQuality函数错误,参数不能全部都为 nil") return end -- 解锁的收藏品配置 local unLockList = {} for _, scoreTitle in pairs(ScoreTitleDataList) do if (not scoreTitle.IsLock) then tableInsert(unLockList, scoreTitle) end end -- 合并同一个组的收藏品 local upgradeList = XMedalManager.UpgradeCollection(unLockList) for _, scoreTitle in pairs(upgradeList) do if maxQuality then if (scoreTitle.Quality or scoreTitle.InitQuality) <= maxQuality and (scoreTitle.Quality or scoreTitle.InitQuality) >= minQuality then table.insert(list, scoreTitle) end else if (scoreTitle.Quality or scoreTitle.InitQuality) == minQuality then table.insert(list, scoreTitle) end end end return list end function XMedalManager.GetLevelIcon(scoreTitleId, curQuality) local collectionLevel = XMedalConfigs.GetCollectionDefaultLevelConfigs() local ScoreTitles = XMedalConfigs.GetScoreTitlesConfigs() local levelIcon = nil local curIndex = 0 local qualities = ScoreTitles[scoreTitleId].Qualities if qualities and #qualities > 0 then for index, quality in pairs(qualities) do if quality == curQuality then curIndex = index end for _, level in pairs(collectionLevel) do if level.CurLevel == curIndex and level.MaxLevel == #qualities then levelIcon = level.Icon break end end end end return levelIcon end function XMedalManager.GetScoreTitleShowState() return XTool.Clone(ScoreTitleShowStateList) end function XMedalManager.GetScoreTitleUnLockList() return XTool.Clone(ScoreTitleUnLockList) end function XMedalManager.CheckCanGetNewCollection() if #NewCollectionList == 0 then return false else local list = {} for _, collectionId in pairs(NewCollectionList) do tableInsert(list, XRewardManager.CreateRewardGoods(collectionId)) end XLuaUiManager.Open("UiObtainCollection", list) XMedalManager.ClearCollectionList() return true end end function XMedalManager.CheckQualityUpCollection() if not QualityUpCollectionList or not next(QualityUpCollectionList) or not IsCanCheckQualityUp then return else IsCanCheckQualityUp = false local key, value = next(QualityUpCollectionList) if key then XLuaUiManager.Open("UiUpgradeCollection", key, value, function() IsCanCheckQualityUp = true XMedalManager.ClearQualityUpCollectionById(key) XMedalManager.CheckQualityUpCollection() end) end end end function XMedalManager.ClearCollectionList() NewCollectionList = {} end function XMedalManager.GetScoreTitleIconById(id) if not id then return nil end return ScoreTitleDataList[id] and ScoreTitleDataList[id].MedalIcon or nil end function XMedalManager.CheckScoreTitleIsShow(type) local state = ScoreTitleShowStateList[type] if not state then return false end return state.Hide == XMedalConfigs.Hide.OFF end function XMedalManager.CheckScoreTitleIsHaveById(id) return ScoreTitleUnLockList[id] and true or false end function XMedalManager.CheckHaveScoreTitleType(type) return ScoreTitleList[type] and true or false end function XMedalManager.CheckScoreTitleInTimeByType(type) local scoreTitle = ScoreTitleList[type] if not scoreTitle then return false end for _, title in pairs(scoreTitle) do local nowTime = XTime.GetServerNowTimestamp() local beginTime, endTime = XFunctionManager.GetTimeByTimeId(title.TimeId) if nowTime > beginTime and nowTime < endTime then return true end end return false end function XMedalManager.UpdateScoreTitle() for _, scoreTitle in pairs(ScoreTitleUnLockList) do local scoreTitleData = ScoreTitleDataList[scoreTitle.Id] if scoreTitleData then scoreTitleData.IsLock = false scoreTitleData.Quality = scoreTitle.Quality scoreTitleData.Score = scoreTitle.Score scoreTitleData.Time = scoreTitle.Time if scoreTitle.ExpandInfo then scoreTitleData.ExpandInfo = scoreTitle.ExpandInfo end end end end function XMedalManager.UpdateScoreTitleShowState(hideTypes) for _, hideType in pairs(hideTypes or {}) do local scoreTitleShowState = ScoreTitleShowStateList[hideType] if scoreTitleShowState then scoreTitleShowState.Hide = XMedalConfigs.Hide.ON end end end function XMedalManager.SetScoreTitleUnLockList(scoreTitleInfoList) for _, scoreTitle in pairs(scoreTitleInfoList or {}) do ScoreTitleUnLockList[scoreTitle.Id] = scoreTitle end end function XMedalManager.AddScoreTitleUnLockList(titles, IsLogined) for _, scoreTitleInfo in pairs(titles) do local scoreTitleData = ScoreTitleDataList[scoreTitleInfo.Id] if scoreTitleData then local scoreTitleUnLock = ScoreTitleUnLockList[scoreTitleInfo.Id] if not scoreTitleUnLock then scoreTitleUnLock = scoreTitleInfo XDataCenter.MedalManager.AddNewMedal(scoreTitleInfo.Id, scoreTitleData.Type) if scoreTitleData.IsNotShowGetTip ~= 1 then table.insert(NewCollectionList, scoreTitleInfo.Id) end ScoreTitleUnLockList[scoreTitleInfo.Id] = scoreTitleUnLock else scoreTitleUnLock.Score = scoreTitleInfo.Score if scoreTitleUnLock.Quality ~= scoreTitleInfo.Quality then if scoreTitleData.ShowQualityUpTip == XMedalConfigs.ShowScore.ON then local qualityUpCollection = QualityUpCollectionList[scoreTitleInfo.Id] if not qualityUpCollection then qualityUpCollection = {} qualityUpCollection.BeforeQuality = scoreTitleUnLock.Quality qualityUpCollection.AfterQuality = scoreTitleInfo.Quality QualityUpCollectionList[scoreTitleInfo.Id] = qualityUpCollection else qualityUpCollection.AfterQuality = scoreTitleInfo.Quality end end scoreTitleUnLock.Quality = scoreTitleInfo.Quality XDataCenter.MedalManager.AddNewMedal(scoreTitleInfo.Id, scoreTitleData.Type) end end else XLog.Error("Share/ScoreTitle/ScoreTitle.tab 表中不存在 ScoreTitleId: " .. scoreTitleInfo.Id) end end if #NewCollectionList > 0 and IsLogined then XEventManager.DispatchEvent(XEventId.EVENT_SCORETITLE_NEW) end end function XMedalManager.CheckHasScoreTitleNew() local groupTitleList = {} --打组升级的收藏品特别判断 for _, data in pairs(ScoreTitleDataList or {}) do if data.GroupId > 0 then if not groupTitleList[data.GroupId] then groupTitleList[data.GroupId] = {} end if not data.IsLock then --若已经解锁且是打组升级的收藏品,先加入判断组,后面另外判断 local isNew = XMedalManager.CheckIsNewMedalById(data.Id, data.Type) groupTitleList[data.GroupId][data.GroupLv] = isNew end else local isNew = XMedalManager.CheckIsNewMedalById(data.Id, data.Type) if isNew then return true end end end --判断每个打组最高级已被解锁的收藏品新旧状态 for _, group in pairs(groupTitleList) do if group[#group] then return true end end return false end function XMedalManager.ClearQualityUpCollectionById(id) if QualityUpCollectionList[id] then QualityUpCollectionList[id] = nil end end function XMedalManager.SetScoreTitleShowData(list) for _, showSetInfo in pairs(list or {}) do local scoreTitleShowState = ScoreTitleShowStateList[showSetInfo.Type] if scoreTitleShowState then scoreTitleShowState.Hide = showSetInfo.Hide end end end function XMedalManager.SetScoreTitleShow(list, cb) XNetwork.Call(METHOD_NAME.ScoreTitleShowSetRequest, { ScoreTitleShowSetInfos = list }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XMedalManager.SetScoreTitleShowData(list) if cb then cb() end end) end -- 设置基准图标宽度 function XMedalManager.SetBaseIconWidth(baseIconWidth) BaseIconWidth = baseIconWidth end -- 获取基准图标宽度 function XMedalManager.GetBaseIconWidth() return BaseIconWidth or DEFAULT_BASE_ICON_WIDHT end ---========================================== --- 根据'score'的位数和图标宽度‘iconWidth’来得到相应字号 ---@param score number ---@param iconWidth number ---@return number ---========================================== function XMedalManager.GetScoreSize(score, iconWidth) if score == nil or score == 0 then return nil end local digit = math.floor(math.log(score, 10) + 1) if digit > #XMedalConfigs.EnumCollectionScoreTextSize then XLog.Warning("XMedalManager.GetScoreSize函数警告,分数" .. tostring(score) .. "位数大于ClientConfig配置的位数字号") end -- 得到基准图标宽度和基准位数字号,基准位数字号通过配表读取 local baseIconWidth = XMedalManager.GetBaseIconWidth() local baseScoreSize = XMedalConfigs.EnumCollectionScoreTextSize[digit] or XMedalConfigs.EnumCollectionScoreTextSize[#XMedalConfigs.EnumCollectionScoreTextSize] if baseIconWidth == 0 then XLog.Error("XMedalManager.GetScoreSize函数错误,baseIconWidth为0") return nil end -- 根据比例来算出当前图标宽度对应的字号大小 return math.floor((baseScoreSize * iconWidth) / baseIconWidth) end --- --- 设置特定收藏品的最大分数 function XMedalManager.SetSpecificMaxScore(titleInfos) if XTool.IsTableEmpty(titleInfos) then return end for _, titleInfo in pairs(titleInfos) do local showMaxLevel = XMedalConfigs.GetCollectionShowMaxLevel(titleInfo.Id) if XTool.IsNumberValid(showMaxLevel) and titleInfo.Score >= showMaxLevel then titleInfo.Score = showMaxLevel end end end ------------------------------------------计分徽章---------------------------------<<< ------------------------------------------铭牌-------------------------------------- local NameplateIdDic = {} local NameplateGroupDic = {} local NameplateSaveDic = {} local NameplateRedPointDic = {} local NameplateLastEqu = {} local CurWearNameplate = 0 --当前穿戴的铭牌 local UiNameplateIsOpen = false --登陆下推 function XMedalManager.AsyncNameplateLogin(data) CurWearNameplate = data.CurrentWearNameplate XMedalManager.InitNameplateSaveRedDic() NameplateSaveDic = {} for _, info in ipairs(data.UnlockNameplates) do XMedalManager.UpdateNameplate(info, true) NameplateSaveDic[info.Id] = true end --登陆时对红点的处理 local redChange = false local tmpNameplatePoint = {} for nameplateId, _ in pairs(NameplateRedPointDic) do if not NameplateIdDic[nameplateId] or NameplateIdDic[nameplateId]:IsNamepalteExpire() then tmpNameplatePoint[nameplateId] = nil if tmpNameplatePoint[nameplateId] then redChange = true end else if not tmpNameplatePoint[nameplateId] then redChange = true end tmpNameplatePoint[nameplateId] = true end end if redChange then NameplateRedPointDic = tmpNameplatePoint XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "NameplateRedPointDic"), NameplateRedPointDic) end XEventManager.DispatchEvent(XEventId.EVENT_NAMEPLATE_CHANGE) end --服务端下推处理 铭牌更新 function XMedalManager.AsyncUpateNameplate(data) --XLog.Debug("AsyncUpateNameplate", data) XMedalManager.UpdateNameplate(data) end --服务端下推处理(真实处理数据) function XMedalManager.UpdateNameplate(data, isLogin) local nameplateData, lastNameplateData local redChange = false local haveNameplateUp = false local isGetNameplateNew = false local NameplateGroupId = XMedalConfigs.GetNameplateGroup(data.Id) if not NameplateGroupDic[NameplateGroupId] then nameplateData = XNameplate.New(data) haveNameplateUp = true else lastNameplateData = NameplateGroupDic[NameplateGroupId] if isLogin then XLog.Error("铭牌数据异常,请服务端检查:", "LastId: ", lastNameplateData:GetNameplateId(), "Id: ", data.Id, "GroupId: ", NameplateGroupId) end if lastNameplateData:GetNameplateId() == data.Id then if lastNameplateData:IsNamepalteExpire() then --如果过期的刷新时间 可以重新激活红点 isGetNameplateNew = true if CurWearNameplate and CurWearNameplate == lastNameplateData:GetNameplateId() then--如果当前存储的已佩戴铭牌过期 重新设置缓存 CurWearNameplate = 0 end end nameplateData = NameplateGroupDic[NameplateGroupId] nameplateData:UpdateData(data) else if lastNameplateData:IsNamepalteExpire() then --如果当前存储的已佩戴铭牌过期 重新设置缓存 if CurWearNameplate and CurWearNameplate == lastNameplateData:GetNameplateId() then CurWearNameplate = 0 end end nameplateData = XNameplate.New(data) --if lastNameplateData:GetNameplateQuality() < nameplateData:GetNameplateQuality() then if nameplateData:GetNameplateUpgradeType() == XMedalConfigs.NameplateGetType.TypeFour then --如果铭牌类型是转换道具 暂时不删除信息 帮助转换道具的下推保存数据 else NameplateIdDic[lastNameplateData:GetNameplateId()] = nil --如果铭牌发生变化,清理上一次的更新 end if lastNameplateData:GetNameplateId() == CurWearNameplate then CurWearNameplate = nameplateData:GetNameplateId() end if NameplateRedPointDic[lastNameplateData:GetNameplateId()] then NameplateSaveDic[lastNameplateData:GetNameplateId()] = true NameplateRedPointDic[lastNameplateData:GetNameplateId()] = nil redChange = true end haveNameplateUp = true -- else -- NameplateSaveDic[data.Id] = true -- end end end --铭牌发生替换时 处理保存的逻辑 if haveNameplateUp then NameplateIdDic[data.Id] = nameplateData NameplateGroupDic[NameplateGroupId] = nameplateData end if not isLogin then if not NameplateSaveDic[data.Id] or isGetNameplateNew then --如果本地没有存储过这个铭牌的信息或者是新获得的记录红点 if not NameplateRedPointDic[data.Id] then redChange = true end NameplateRedPointDic[data.Id] = true end if (not nameplateData:IsNamepalteExpire() and nameplateData:GetNameplateUpgradeType() ~= XMedalConfigs.NameplateGetType.TypeFour) --如果获得的铭牌没有过期,并且不是转换道具的铭牌 进入弹窗逻辑 or ((haveNameplateUp or isGetNameplateNew) and nameplateData:GetNameplateUpgradeType() == XMedalConfigs.NameplateGetType.TypeFour) --如果是转换道具的铭牌并且铭牌是新获得或者升级 进入弹窗逻辑 then if isGetNameplateNew then lastNameplateData = nil end XLuaUiManager.Open("UiObtainNameplate", nameplateData, lastNameplateData) UiNameplateIsOpen = true end if redChange then XEventManager.DispatchEvent(XEventId.EVENT_NAMEPLATE_CHANGE) XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "NameplateRedPointDic"), NameplateRedPointDic) end end end --服务端下推处理 铭牌转换道具 function XMedalManager.NameplateConvertItem(data) local nameplateData = NameplateIdDic[data.NameplateId] NameplateIdDic[data.NameplateId] = nil if not nameplateData then local groupId = XMedalConfigs.GetNameplateGroup(data.NameplateId) local dataByGroup = NameplateGroupDic[groupId] local tmpData = {} tmpData.Id = data.NameplateId tmpData.Exp = 0 tmpData.EndTime = dataByGroup and dataByGroup:GetNamepalteEndTime() or 0 tmpData.GetTime = dataByGroup and dataByGroup:GetNamepalteGetTime() or 0 nameplateData = XNameplate.New(tmpData) end XLuaUiManager.Open("UiObtainNameplate", nameplateData, false, data.ConvertItem, data.ConvertCount) -- if UiNameplateIsOpen then -- local tmpData = {} -- tmpData.NameplateData = nameplateData -- tmpData.ConvertItem = data.ConvertItem -- tmpData.ConvertCount = data.ConvertCount -- table.insert(NameplateLastEqu, tmpData) -- else -- if not nameplateData then -- local tmpData = {} -- tmpData.Id = data.NameplateId -- tmpData.Exp = 0 -- tmpData.EndTime = 0 -- tmpData.GetTime = 0 -- nameplateData = XNameplate.New(tmpData) -- end -- XLuaUiManager.Open("UiObtainNameplate", nameplateData, false, data.ConvertItem, data.ConvertCount) -- UiNameplateIsOpen = true -- end end --获取铭牌数据列表(真实数据信息 function XMedalManager.GetNameplateGroupList() local nameplateGroup = {} for _, data in pairs(NameplateGroupDic) do table.insert(nameplateGroup, data) end table.sort(nameplateGroup, function(a, b) if a:IsNameplateNew() and not b:IsNameplateNew() then return true elseif a:IsNameplateNew() == b:IsNameplateNew() then if a:IsNameplateDress() and not b:IsNameplateDress() then return true elseif a:IsNameplateDress() == b:IsNameplateDress() then -- if not a:IsNamepalteExpire() and b:IsNamepalteExpire() then -- return true -- elseif a:IsNamepalteExpire() == b:IsNamepalteExpire() then -- return a:GetNameplateId() < b:GetNameplateId() -- end if a:IsNamepalteForever() and not b:IsNamepalteForever() then return true elseif a:IsNamepalteForever() == b:IsNamepalteForever() then if a:GetNamepalteLeftTime() > b:GetNamepalteLeftTime() then return true elseif a:GetNamepalteLeftTime() == b:GetNamepalteLeftTime() then return a:GetNameplateId() < b:GetNameplateId() end end end end return false end) return nameplateGroup end --打开获取铭牌界面(栈方式 暂时废弃 function XMedalManager.OpenNextUiObtainNameplate() UiNameplateIsOpen = false if #NameplateLastEqu > 0 then local tmpData = table.remove(NameplateLastEqu, 1) XLuaUiManager.Open("UiObtainNameplate", tmpData.NameplateData, false, tmpData.ConvertItem, tmpData.ConvertCount) end end --根据GroupId获取服务端推送的铭牌实体数据 function XMedalManager.CheckNameplateGroupUnluck(group) return NameplateGroupDic[group] end --获取当前装备的铭牌 function XMedalManager.GetNameplateCurId() return CurWearNameplate end --检查是不是新获得的铭牌(红点) function XMedalManager.CheckNameplateNew(id) if not NameplateRedPointDic[id] then return false end return true end --检查是不是新图片资源铭牌 function XMedalManager.CheckNameplateNewTexture(id) local isNew = XMedalConfigs.GetNameplateIsNewTextureIcon(id) if isNew then return isNew == 1 end return false end --初始化本地持久化数据的红点信息 function XMedalManager.InitNameplateSaveRedDic() --NameplateSaveDic = XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "NameplateSaveDic")) or {} NameplateRedPointDic = XSaveTool.GetData(string.format("%d%s", XPlayer.Id, "NameplateRedPointDic")) or {} end --根据规则处理红点的隐藏 function XMedalManager.SetNameplateRedPointDic(id) local needChangeRed = false if not id then for _, nameplateData in pairs(NameplateGroupDic) do if NameplateRedPointDic[nameplateData:GetNameplateId()] then needChangeRed = true end NameplateSaveDic[nameplateData:GetNameplateId()] = true NameplateRedPointDic[nameplateData:GetNameplateId()] = nil end else if NameplateRedPointDic[id] then NameplateSaveDic[id] = true NameplateRedPointDic[id] = nil needChangeRed = true end end if needChangeRed then --XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "NameplateSaveDic"), NameplateSaveDic) XSaveTool.SaveData(string.format("%d%s", XPlayer.Id, "NameplateRedPointDic"), NameplateRedPointDic) XEventManager.DispatchEvent(XEventId.EVENT_NAMEPLATE_CHANGE) end end function XMedalManager.CheckHaveNewNameplateById(id) return NameplateRedPointDic[id] end --检查是否有新的铭牌 function XMedalManager.CkeckHaveNewNameplate() if not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Nameplate) then if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.Nameplate) then for _, data in pairs(NameplateGroupDic) do if data:IsNameplateNew() then return true end end end end return false end --佩戴铭牌请求 function XMedalManager.WearNameplate(nameplateId, cb) XNetwork.Call(METHOD_NAME.WearNameplateRequest, { NameplateId = nameplateId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end CurWearNameplate = nameplateId if cb then cb() end XEventManager.DispatchEvent(XEventId.EVENT_NAMEPLATE_CHANGE) end) end ------------------------------------------铭牌-------------------------------------- XMedalManager.Init() return XMedalManager end XRpc.NotifyMedalData = function(data) if not data then return end XPlayer.AsyncMedalIds(data.MedalInfos, false) XDataCenter.MedalManager.UpdateMedalList() end XRpc.NotifyUpdateMedalData = function(data) if not data then return end XPlayer.AsyncMedalIds(data.UpdateInfo, true) XDataCenter.MedalManager.SetNewMedalId(data.UpdateInfo.Id) XDataCenter.MedalManager.UpdateMedalList() --CheckPoint: APPEVENT_BADGE XAppEventManager.MedalAppLogEvent(data.UpdateInfo.Id) XEventManager.DispatchEvent(XEventId.EVENT_MEDAL_NOTIFY) end XRpc.NotifyScoreTitleData = function(data) XDataCenter.MedalManager.SetSpecificMaxScore(data.TitleInfos) XDataCenter.MedalManager.SetScoreTitleUnLockList(data.TitleInfos) XDataCenter.MedalManager.UpdateScoreTitleShowState(data.HideTypes) XDataCenter.MedalManager.UpdateScoreTitle() -- 全部已解锁的收藏品墙与装饰品数据 XDataCenter.CollectionWallManager.SyncWallEntityData(data.WallInfos) XDataCenter.CollectionWallManager.SyncDecorationData(data.UnlockedDecorationIds) end XRpc.NotifyScoreTitleInfo = function(data) XDataCenter.MedalManager.SetSpecificMaxScore(data.Titles) XDataCenter.MedalManager.AddScoreTitleUnLockList(data.Titles, data.IsLogined) XDataCenter.MedalManager.UpdateScoreTitle() XEventManager.DispatchEvent(XEventId.EVENT_SCORETITLE_CHANGE) end --铭牌登陆下推 XRpc.NotifyNameplateLoginData = function(data) XDataCenter.MedalManager.AsyncNameplateLogin(data) end --铭牌信息改变下推 XRpc.NotifyNameplateInfo = function(data) if data.Nameplate then XDataCenter.MedalManager.AsyncUpateNameplate(data.Nameplate) end end --铭牌信息改变下推 XRpc.NotifyNameplateConvertItem = function(data) XDataCenter.MedalManager.NameplateConvertItem(data) end --更新当前装备的勋章Id XRpc.NotifyPlayerCurrMedalId = function(data) XPlayer.SetCurrMedalId(data.CurrMedalId) XEventManager.DispatchEvent(XEventId.EVENT_MEDAL_USE) end