| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- local FashionData = class("FashionData", require("DataBase"))
- local JSON = require('json')
- local CACHE_FASHION_KEY_NAME = "Cache_Fashion_Key"
- function FashionData:ctor()
- self.data = {}
- self.data.fashionMap = {}
- self.data.fashionSuitMap = {}
- end
- function FashionData:RegisterNetEvents()
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_FASHION_NTF, function(data)
- if ManagerContainer.NetManager:IsErrorData(data) then
- return
- end
- if data.lvs then
- for _,v in pairs(data.lvs) do
- local lv = self:GetSuitLvByFashionLv(v.key, v.value)
- local lvUp = false
- local oldLv = self.data.fashionSuitMap[v.key]
- local isNew = oldLv == nil
- if oldLv then
- lvUp = lv > oldLv
- end
- self.data.fashionSuitMap[v.key] = lv
- self:FashionSuitClacAttrs(v.key, lv, lvUp, isNew)
- end
- end
- local changed, addFashionMap, upFashionList, downFashionList = self:RefreshFashionData(data.fashion_data)
- if changed then
- ManagerContainer.DataMgr.UserData:CalcFashionAttrs()
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.FASHION_LIST_CHANGE)
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_FASHION_ADD, addFashionMap)
- else
- -- upFashionList 表示新穿的时装
- -- 需要跟原来身上的时装进行比较
- local viewChanged = false
- local viewData = ManagerContainer.DataMgr.UserData:GetViewData()
- local totalUpFashionList = {}
- if viewData and viewData.fashionData then
- for _,v in pairs(viewData.fashionData) do
- totalUpFashionList[#totalUpFashionList + 1] = v
- end
- end
- if upFashionList then
- for _,v in pairs(upFashionList) do
- local result, idx = CommonUtil.EleInTable(v, totalUpFashionList)
- if not result then
- totalUpFashionList[#totalUpFashionList + 1] = v
- viewChanged = true
- end
- end
- end
- if downFashionList then
- for _,v in pairs(downFashionList) do
- local result, idx = CommonUtil.EleInTable(v, totalUpFashionList)
- if result then
- table.remove(totalUpFashionList, idx)
- viewChanged = true
- end
- end
- end
- if viewChanged then
- ManagerContainer.DataMgr.UserData:UpdateFashionUpData(totalUpFashionList)
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.FASHION_WEAR_CHANGE)
- end
- end
- end)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_FASHION_UP_LVL_ACK,self.OnFashionLvUpAck, self)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_FASHION_RESET_ATTR_ACK,self.OnFashionWashAck, self)
- ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_FASHION_PAPER_DECOMPOSE_ACK,self.OnFashionPagerDecomposeAck, self)
- end
- function FashionData:Clear()
- self.data = {}
- self.data.fashionMap = {}
- self.data.fashionSuitMap = {}
- end
- function FashionData:Destroy()
- if self.Clear then
- self:Clear()
- end
- self:UnRegisterNetEvents()
- end
- function FashionData:UnRegisterNetEvents()
- end
- function FashionData:InitFashionData(roleFashion)
- if not roleFashion or not roleFashion.fashion_data then return end
- self.washState = false
- local userSex = ManagerContainer.DataMgr.UserData:GetSex()
- local cacheFashionData = self:ReadCacheFashionData()
- local fashionData = roleFashion.fashion_data
- local cfgMgr = ManagerContainer.CfgMgr
- for _,v in pairs(fashionData) do
- local cfgId = v.fashion_id
- local fashionCfgData = cfgMgr:GetFashionById(cfgId)
- if not fashionCfgData then
- LogError("[Wboy] .. ".. cfgId .. " 时装ID不存在")
- elseif not fashionCfgData.FashionOpen then
- LogError("[Wboy] 无力吐槽 不能获得的时装,策划竟然让玩家获得了 ".. cfgId)
- elseif fashionCfgData.FashionSex > 0 and fashionCfgData.FashionSex ~= userSex then
- LogError("[Wboy] 无力吐槽 不能获得异性的时装,策划竟然让玩家获得了 ".. cfgId)
- else
- local isNew
- if cacheFashionData then
- isNew = cacheFashionData[cfgId]
- if isNew == nil then
- isNew = false
- end
- else
- isNew = false
- end
- local data = self.data.fashionMap[cfgId]
- if not data then
- data = {cfgId = cfgId}
- self.data.fashionMap[cfgId] = data
- end
- data.isNew = isNew
- data.lv = v.fashion_lvl
- data.wear = v.fashion_wear
- data.oldAttrs = {}
- data.attrs = {}
- for _,v1 in pairs(v.attrs) do
- data.attrs[#data.attrs + 1] = v1
- end
- data.resetAttrs = {}
- for _,v1 in pairs(v.resetAttrs) do
- data.resetAttrs[#data.resetAttrs + 1] = v1
- end
- self:FashionLvUpCanState(data)
- end
- end
- if roleFashion.lvs then
- for _,v in pairs(roleFashion.lvs) do
- local lv = self:GetSuitLvByFashionLv(v.key, v.value)
- self.data.fashionSuitMap[v.key] = lv
- end
- end
- self:ClacFashionAttrs()
- self:FashionDataNotify()
- end
- function FashionData:FashionDataNotify()
- local result = false
- for _,v in pairs(self.data.fashionMap) do
- if v.canLvUp then
- result = true
- end
- end
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.FashionLvUp, result)
- end
- function FashionData:RefreshAllFashionLvUpNotify()
- local result = false
- for _,v in pairs(self.data.fashionMap) do
- self:FashionLvUpCanState(v)
- if v.canLvUp then
- result = true
- end
- end
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.FashionLvUp, result)
- end
- function FashionData:ClacFashionAttrs()
- self.data.fashionAttrs = {}
- for k,v in pairs(self.data.fashionMap) do
- for _,v1 in pairs(v.attrs) do
- local jobType = v1.jobType + 1
- local attrId = v1.attrId
- local value = v1.value
- if not self.data.fashionAttrs[jobType] then
- self.data.fashionAttrs[jobType] = {}
- end
- if not self.data.fashionAttrs[jobType][attrId] then
- self.data.fashionAttrs[jobType][attrId] = 0
- end
- value = attrId > 21 and CommonUtil.GetPreciseDecimal(value, 4) or math.floor(value)
- self.data.fashionAttrs[jobType][attrId] = self.data.fashionAttrs[jobType][attrId] + value
- end
- end
- self.data.suitAttrs = {}
- for k,v in pairs(self.data.fashionSuitMap) do
- local suitCfgData = ManagerContainer.CfgMgr:GetFashionSuitDataById(k)
- if suitCfgData and v > 0 then
- local curAttrs = suitCfgData.Attribute[v]
- if curAttrs then
- for _,v in pairs(curAttrs) do
- local str = string.split(v, '-')
- local key = tonumber(str[1])
- local val = tonumber(str[2])
- if not self.data.suitAttrs[key] then
- self.data.suitAttrs[key] = 0
- end
- val = key > 21 and CommonUtil.GetPreciseDecimal(val, 4) or math.floor(val)
- self.data.suitAttrs[key] = self.data.suitAttrs[key] + val
- end
- end
- end
- end
- end
- function FashionData:FashionLvUpCanState(data)
- data.canLvUp = false
- local lvUpState = ManagerContainer.UIFuncUnlockMgr:GetFuncLockStatusById(68)
- if not lvUpState then
- return
- end
- local fashionCfgData = ManagerContainer.CfgMgr:GetFashionById(data.cfgId)
- local lvCfgData = ManagerContainer.CfgMgr:GetFashionLvDataByLv(data.lv + 1)
- if not lvCfgData then
- data.canLvUp = false
- return
- end
- local quality = fashionCfgData.FashionQuality
- local costs = lvCfgData['UpMaterial'..quality]
- for i = 1, 3 do
- local cost = costs and costs[i] or nil
- if cost then
- local ownedCount = CommonUtil.GetOwnResCountByItemId(cost[1])
- if ownedCount < cost[2] then
- data.canLvUp = false
- return
- end
- end
- end
- data.canLvUp = true
- end
- function FashionData:FashionLvUpOrNewClacAttrs(data, isNew)
- if not self.data.fashionAttrs then return end
- if not isNew and not next(data.oldAttrs) then return end
- for _,v1 in pairs(data.oldAttrs) do
- local jobType = v1.jobType + 1
- local attrId = v1.attrId
- local value = v1.value
- if self.data.fashionAttrs[jobType] and self.data.fashionAttrs[jobType][attrId] then
- value = attrId > 21 and CommonUtil.GetPreciseDecimal(value, 4) or math.floor(value)
- self.data.fashionAttrs[jobType][attrId] = self.data.fashionAttrs[jobType][attrId] - value
- end
- end
- for _,v1 in pairs(data.attrs) do
- local jobType = v1.jobType + 1
- local attrId = v1.attrId
- local value = v1.value
- if not self.data.fashionAttrs[jobType] then
- self.data.fashionAttrs[jobType] = {}
- end
- if not self.data.fashionAttrs[jobType][attrId] then
- self.data.fashionAttrs[jobType][attrId] = 0
- end
- value = attrId > 21 and CommonUtil.GetPreciseDecimal(value, 4) or math.floor(value)
- self.data.fashionAttrs[jobType][attrId] = self.data.fashionAttrs[jobType][attrId] + value
- end
- if isNew or (next(data.oldAttrs) and not next(data.resetAttrs)) then
- ManagerContainer.DataMgr.UserData:CalcFashionAttrs()
- ManagerContainer.DataMgr.PartnerData:CalcAllPartnerFashionAttrs()
- data.oldAttrs = {}
- end
- end
- function FashionData:FashionSuitClacAttrs(suitId, lv, isLvUp, isNew)
- if not isNew and not isLvUp then return end
- if not self.data.suitAttrs then return end
- local suitCfgData = ManagerContainer.CfgMgr:GetFashionSuitDataById(suitId)
- if not suitCfgData then return end
- if lv > 1 then
- local lastLv = lv - 1
- local lastAttrs = suitCfgData.Attribute[lastLv]
- if lastAttrs then
- for _,v in pairs(lastAttrs) do
- local str = string.split(v, '-')
- local key = tonumber(str[1])
- local val = tonumber(str[2])
- if self.data.suitAttrs[key] then
- val = key > 21 and CommonUtil.GetPreciseDecimal(val, 4) or math.floor(val)
- self.data.suitAttrs[key] = self.data.suitAttrs[key] - val
- end
- end
- end
- end
- local curAttrs = suitCfgData.Attribute[lv]
- if curAttrs then
- for _,v in pairs(curAttrs) do
- local str = string.split(v, '-')
- local key = tonumber(str[1])
- local val = tonumber(str[2])
- if not self.data.suitAttrs[key] then
- self.data.suitAttrs[key] = 0
- end
- val = key > 21 and CommonUtil.GetPreciseDecimal(val, 4) or math.floor(val)
- self.data.suitAttrs[key] = self.data.suitAttrs[key] + val
- end
- end
- ManagerContainer.DataMgr.UserData:CalcFashionAttrs()
- --套装升级提示
- ManagerContainer.LuaUIMgr:ErrorNoticeDisplayWithParam("SuitLevelUp", I18N.T(suitCfgData.SuitName), lv)
- end
- function FashionData:GetSuitLvByFashionLv(suitId, fashionLv)
- local suitCfgData = ManagerContainer.CfgMgr:GetFashionSuitDataById(suitId)
- if not suitCfgData then
- return 0
- end
- local result, idx = CommonUtil.EleInTable(fashionLv, suitCfgData.LevelCondition)
- return idx or 0
- end
- function FashionData:GetFashionAllAttrs()
- return self.data.fashionAttrs
- end
- function FashionData:GetFashionAllAttrsByJobType(jobType)
- return self.data.fashionAttrs and self.data.fashionAttrs[jobType + 1] or nil
- end
- function FashionData:GetFashionSuitLvById(suitId)
- return self.data.fashionSuitMap[suitId] or 0
- end
- function FashionData:GetFashionSuitAttrs()
- return self.data.suitAttrs
- end
- --- 获得已合成的时装列表
- ---@return table
- function FashionData:GetFashionMap()
- return self.data.fashionMap
- end
- --- 查询是否已获得该时装
- function FashionData:Contains(cfgId)
- return self.data.fashionMap[cfgId] ~= nil
- end
- function FashionData:GetFashionById(cfgId)
- return self.data.fashionMap[cfgId]
- end
- function FashionData:IsNew(cfgId)
- local fashionData = self.data.fashionMap[cfgId]
- if fashionData then
- if fashionData.isNew then
- return true
- end
- end
- return false
- end
- function FashionData:CanLvUp(cfgId)
- local fashionData = self.data.fashionMap[cfgId]
- if fashionData then
- if fashionData.canLvUp then
- return true
- end
- end
- return false
- end
- function FashionData:CancelNewState(cfgId)
- local fashionData = self.data.fashionMap[cfgId]
- if fashionData then
- if not fashionData.isNew then
- return false
- end
- fashionData.isNew = false
- self:WriteCacheFashionData()
- ManagerContainer.RedPointMgr.HeroRPCtr:FashionDataNotify()
- return true
- end
- return false
- end
- function FashionData:ReadCacheFashionData()
- local cacheFashionDataStr = ManagerContainer.PlayerPrefsMgr:GetString(CACHE_FASHION_KEY_NAME, '')
- local cacheFashionDatas = JSON:decode(cacheFashionDataStr)
- local cacheFashionDataMap = {}
- if cacheFashionDatas then
- for key, value in pairs(cacheFashionDatas) do
- cacheFashionDataMap[value] = true
- end
- end
- return cacheFashionDataMap
- end
- function FashionData:WriteCacheFashionData()
- local cacheFashionDatas = {}
- if self.data.fashionMap then
- for cfgId, fashionData in pairs(self.data.fashionMap) do
- if fashionData.isNew then
- table.insert(cacheFashionDatas, cfgId)
- end
- end
- end
- local valueStr = JSON:encode(cacheFashionDatas)
- ManagerContainer.PlayerPrefsMgr:SetString(CACHE_FASHION_KEY_NAME, valueStr)
- end
- function FashionData:RefreshFashionData(fashionData)
- if not fashionData then return end
- local addFashionMap = {}
- local downFashionList = {}
- local upFashionList = {}
- local addNum = 0
- local cfgMgr = ManagerContainer.CfgMgr
- for _,v in pairs(fashionData) do
- local cfgId = v.fashion_id
- local fashionCfgData = cfgMgr:GetFashionById(cfgId)
- if not fashionCfgData then
- LogError("[Wboy] .. ".. cfgId .. " 时装ID不存在")
- elseif not fashionCfgData.FashionOpen then
- LogError("[Wboy] 无力吐槽 不能获得的时装,策划竟然让玩家获得了 ".. cfgId)
- else
- local oldWearState
- local data = self.data.fashionMap[cfgId]
- local isNew = false
- if not data then
- isNew = true
- data = {cfgId = cfgId, isNew = true, wear = false,lv=1}
- addNum = addNum + 1
- addFashionMap[cfgId] = 1
- self.data.fashionMap[cfgId] = data
- end
- oldWearState = data.wear
- local lvUpState = v.fashion_lvl > data.lv
- data.lv = v.fashion_lvl
- data.wear = v.fashion_wear
- data.oldAttrs = {}
- if (lvUpState or #v.resetAttrs == 0) and not isNew then
- data.oldAttrs = clone(data.attrs)
- end
- data.attrs = {}
- for _,v1 in pairs(v.attrs) do
- data.attrs[#data.attrs + 1] = v1
- end
- data.resetAttrs = {}
- for _,v1 in pairs(v.resetAttrs) do
- data.resetAttrs[#data.resetAttrs + 1] = v1
- end
- if data.wear then
- upFashionList[#upFashionList + 1] = cfgId
- else
- downFashionList[#downFashionList + 1] = cfgId
- end
- self:FashionLvUpOrNewClacAttrs(data, isNew)
- --self:FashionLvUpCanState(data)
- end
- end
- -- 新获得
- if addNum > 0 then
- self:WriteCacheFashionData()
- ManagerContainer.RedPointMgr.HeroRPCtr:FashionDataNotify()
- end
- self:FashionDataNotify()
- self:RefreshAllFashionLvUpNotify()
- return addNum > 0, addFashionMap, upFashionList, downFashionList
- end
- function FashionData:SendFashionLvUp(fashionId)
- ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_FASHION_UP_LVL_REQ, {fashion_cfg_id = fashionId})
- end
- function FashionData:SendFashionWash(fashionId, state)
- if self.washState then
- return
- end
- self.washState = true
- ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_FASHION_RESET_ATTR_REQ, {enter = state, fashion_cfg_id = fashionId})
- end
- function FashionData:OnFashionLvUpAck(data)
- if data.error ~= Enum.NetErrorCode.ERROR_OK then return end
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.FASHION_LV_UP_CHANGE, true)
- end
- function FashionData:OnFashionWashAck(data)
- if data.error ~= Enum.NetErrorCode.ERROR_OK then return end
- self.washState = false
- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.FASHION_WASH_CHANGE)
- end
- function FashionData:OnFashionPagerDecomposeAck(data)
- if data.error ~= Enum.NetErrorCode.ERROR_OK then return end
- CommonUtil.ACKShowRewardList(data.item_list)
- end
- return FashionData
|