local Decoration_Model = {} local private = {} local EventSystem = require('Event/EventSystem') Decoration_Model.DecorationType = { Competition = 1, -- 竞技装饰 ClickEffect = 2, -- 点击特效 ChatBubble = 3, -- 聊天气泡 NameDye = 4, -- 名染 } function Decoration_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageChooseDecorate, private.ChooseDecorateResp) NetManager.RegisterMsgCB(MessageEnums.MessageRemoveDecorateRedPoint, nil) NetManager.RegisterMsgCB(MessageEnums.MessageDecorateUseItem, private.UseDecorateItemResp) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.OnEnterWorldPostprocess) private.decorationMap = {} -- 所有装饰map, 类型type - [ID - [cfgData isNew expireTime isActive]] private.decorationList = {} -- 所有装饰list, 类型type - {ID, type} private.curWearingMap = {} -- 正在穿戴的装饰, 类型type - ID private.activeSuitsMap = {} -- 已激活的装饰图鉴 private.InitDecorationData() end function private.InitDecorationData() for _, v in pairs(Decoration_Model.DecorationType) do private.decorationMap[v] = {} private.decorationList[v] = {} end for i, data in DataSheetManager.Decorate:GetEnumerator() do table.insert(private.decorationList[data.Type], {ID = data.ID, type = data.Type}) private.decorationMap[data.Type][data.ID] = {cfgData = data, isNew = false, expireTime = 0, isActive = false} end end function private.OnEnterWorldPostprocess() private.RefreshRedPoint() CTL.Decoration.CaculateDecorationThemeCanActive() --图鉴红点计算 EventSystem.Dispatch(EventID.UI_Decoration_ClickScreen_Effect_Changed) end function Decoration_Model.GetCurDecoratingResource(decorationType) local id = private.curWearingMap[decorationType] return Decoration_Model.GetDecorationInfo(decorationType, id).cfgData.Resource end function Decoration_Model.GetWearingDecorationId(decorationType) return private.curWearingMap[decorationType] end function Decoration_Model.GetDecorationList(decorationType) return private.decorationList[decorationType] end function Decoration_Model.GetDecorationInfo(decorationType, id) return private.decorationMap[decorationType][id] end function Decoration_Model.IsDecorationActive(id) local typ = DataSheetManager.Decorate:GetDataByID(id).Type if private.decorationMap[typ] and private.decorationMap[typ][id] then return private.decorationMap[typ][id].isActive end return false end --enterWorld function Decoration_Model.SyncInfo(decorateInfo) for _, info in ipairs(decorateInfo.decorateList) do local decorationMap = private.decorationMap[info.type] for _, detailInfo in ipairs(info.infoList) do decorationMap[detailInfo.id].isNew = detailInfo.isNew decorationMap[detailInfo.id].isActive = true decorationMap[detailInfo.id].expireTime = detailInfo.expireTime end private.curWearingMap[info.type] = info.chooseId end if IsProtoDataNotNil(decorateInfo.activeSuit) then for _, id in ipairs(decorateInfo.activeSuit) do private.activeSuitsMap[id] = true end end private.SortDecorationList() end --playerChange增量更新 function Decoration_Model.UpdateInfo(decorateInfo) local changedType = {} for _, info in ipairs(decorateInfo.decorateList) do table.insert(changedType, info.type) if info.chooseId then private.curWearingMap[info.type] = info.chooseId if info.type == Decoration_Model.DecorationType.ClickEffect then EventSystem.Dispatch(EventID.UI_Decoration_ClickScreen_Effect_Changed) end end local decorationMap = private.decorationMap[info.type] for _, detailInfo in ipairs(info.infoList) do decorationMap[detailInfo.id].isNew = detailInfo.isNew decorationMap[detailInfo.id].isActive = true decorationMap[detailInfo.id].expireTime = detailInfo.expireTime end if IsProtoDataNotNil(info.delDecorate) then local decorationMap = private.decorationMap[info.type] for index, delId in ipairs(info.delDecorate) do decorationMap[delId].isActive = false end end end if IsProtoDataNotNil(decorateInfo.activeSuit) then for _, id in ipairs(decorateInfo.activeSuit) do private.activeSuitsMap[id] = true end end private.SortDecorationList(changedType) private.RefreshRedPoint() CTL.Decoration.CaculateDecorationThemeCanActive() --图鉴红点计算 EventSystem.Dispatch(EventID.UI_Decoration_Data_Refresh, true) end function private.RefreshRedPoint() for decorationType, infoMap in pairs(private.decorationMap) do local isNew = false for _, info in pairs(infoMap) do if info.isNew == true then isNew = true break end end if isNew then CTL.RedPoint.AddRedPoint(private.GetRedPointKeyByType(decorationType)) else CTL.RedPoint.RemoveRedPoint(private.GetRedPointKeyByType(decorationType)) end end end function private.SortDecorationList(changedType) if changedType then for _, v in ipairs(changedType) do table.sort(private.decorationList[v], private.SortDecoration) end else for _, decorationlist in pairs(private.decorationList) do table.sort(decorationlist, private.SortDecoration) end end end function private.SortDecoration(a, b) local aIsWearing = private.IsDecorationWearing(a.ID) local bIsWearing = private.IsDecorationWearing(b.ID) if aIsWearing == bIsWearing then local aInfo = Decoration_Model.GetDecorationInfo(a.type, a.ID) local bInfo = Decoration_Model.GetDecorationInfo(b.type, b.ID) if aInfo.isActive == bInfo.isActive then return a.ID > b.ID else return aInfo.isActive end else return aIsWearing end end function private.IsDecorationWearing(decorationId) local decorationType = DataSheetManager.Decorate:GetDataByID(decorationId).Type return decorationId == private.curWearingMap[decorationType] end function private.GetRedPointKeyByType(decorationType) if decorationType == Decoration_Model.DecorationType.Competition then return CTL.RedPoint.RedPointKey.TownHead_Team_Head_Competition elseif decorationType == Decoration_Model.DecorationType.ClickEffect then return CTL.RedPoint.RedPointKey.TownHead_Team_Head_ClickEffect elseif decorationType == Decoration_Model.DecorationType.ChatBubble then return CTL.RedPoint.RedPointKey.TownHead_Team_Head_ChatBubble elseif decorationType == Decoration_Model.DecorationType.NameDye then return CTL.RedPoint.RedPointKey.TownHead_Team_Head_NameDye end end --装饰套装图鉴是否激活 function Decoration_Model.IsSuitBookActive(id) return private.activeSuitsMap[id] or false end --激活的装饰套装 function Decoration_Model.GetActiveDecorationSuitInfoMap() return private.activeSuitsMap end function Decoration_Model.GetActiveDecorationSuitCount() return table.getDictCount(private.activeSuitsMap) end --穿戴 function Decoration_Model.ChooseDecorateReq(typ, id) local msg = NetManager.GetPB("decorate_op_pb").ChooseDecorateReq() msg.typ = typ msg.id = id NetManager.SendMessage(MessageEnums.MessageChooseDecorate, msg) end function private.ChooseDecorateResp(msgResp) if msgResp.Resp.Code == 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HeadPortraitAndBox_Success) CTL.Sound.PlayGameSound("UI_xingxiang") end end --消除红点 function Decoration_Model.RemoveDecorateRedPointReq(typ, id) local msg = NetManager.GetPB("decorate_op_pb").RemoveDecorateRedPointReq() msg.typ = typ msg.id = id NetManager.SendMessage(MessageEnums.MessageRemoveDecorateRedPoint, msg) end --使用装饰道具 function Decoration_Model.UseDecorateItemReq(id) local msg = NetManager.GetPB("decorate_op_pb").DecorateUseItemReq() msg.ItemID = id NetManager.SendMessage(MessageEnums.MessageDecorateUseItem, msg) end function private.UseDecorateItemResp(resp) if resp.Resp.Code == 0 then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Title_Success"]) end end return Decoration_Model