UIFashionCtr.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. local UIFashionCtr = class("UIFashionCtr", require("UICtrBase"))
  2. local SortRule = function(a, b)
  3. local fashionUpData = ManagerContainer.DataMgr.UserData:GetViewData().fashionData
  4. local fashionIdA = a.FashionId
  5. local fashionIdB = b.FashionId
  6. local isUpA = (fashionUpData[a.FashionLocation] == fashionIdA)
  7. local isUpB = (fashionUpData[b.FashionLocation] == fashionIdB)
  8. local qualityA = a.FashionQuality
  9. local qualityB = b.FashionQuality
  10. if isUpA == isUpB then
  11. local jobCfgId = ManagerContainer.DataMgr.UserData:GetJobCfgId()
  12. local fashionUseJobA = a.FashionUseJob
  13. local fashionUseJobB = b.FashionUseJob
  14. local canUseA = (not fashionUseJobA or IsTableHasValue(fashionUseJobA, jobCfgId))
  15. local canUseB = (not fashionUseJobB or IsTableHasValue(fashionUseJobB, jobCfgId))
  16. if canUseA == canUseB then
  17. local isNewA = ManagerContainer.DataMgr.FashionData:IsNew(fashionIdA)
  18. local isNewB = ManagerContainer.DataMgr.FashionData:IsNew(fashionIdB)
  19. if isNewA == isNewB then
  20. if qualityA == qualityB then
  21. return fashionIdA < fashionIdB
  22. else
  23. return qualityA > qualityB
  24. end
  25. else
  26. return isNewA
  27. end
  28. else
  29. return canUseA
  30. end
  31. else
  32. return isUpA
  33. end
  34. end
  35. local AllSortRule = function(a, b)
  36. local fashionData = ManagerContainer.DataMgr.FashionData
  37. local fashionIdA = a.FashionId
  38. local fashionIdB = b.FashionId
  39. local qualityA = a.FashionQuality
  40. local qualityB = b.FashionQuality
  41. local isUpA = fashionData:Contains(fashionIdA)
  42. local isUpB = fashionData:Contains(fashionIdB)
  43. if isUpA == isUpB then
  44. if qualityA == qualityB then
  45. return fashionIdA < fashionIdB
  46. else
  47. return qualityA > qualityB
  48. end
  49. else
  50. return isUpA
  51. end
  52. end
  53. local ViewPageType = {
  54. Change = 1,
  55. Book = 2,
  56. }
  57. function UIFashionCtr:Init(view)
  58. self.view = view
  59. end
  60. function UIFashionCtr:SetData(data)
  61. self.asyncIdx = 0
  62. self:ClearData()
  63. self:CacheViewData()
  64. if data == nil then return end
  65. self.data = data
  66. end
  67. function UIFashionCtr:GetAsyncIdx()
  68. self.asyncIdx = self.asyncIdx + 1
  69. return self.asyncIdx
  70. end
  71. function UIFashionCtr:GetData()
  72. return self.data
  73. end
  74. function UIFashionCtr:OnDispose()
  75. self.data = nil
  76. self.view = nil
  77. self:ClearData()
  78. end
  79. function UIFashionCtr:ClearData()
  80. self.viewDataCache = nil
  81. self.viewDataCacheSend = nil
  82. self.ownerDatas = nil
  83. self.ownerDataMap = nil
  84. self.ownerDataRP = nil
  85. self.ownerDataRPMap = nil
  86. self.allDatas = nil
  87. self.allDataMap = nil
  88. self.curViewPageType = nil
  89. self.showDatas = nil
  90. self.showDataLength = nil
  91. self.curSelectItemIndex = nil
  92. self.curSelectFashionSlotType = nil
  93. end
  94. function UIFashionCtr:GetHeroId()
  95. return ManagerContainer.DataMgr.UserData:GetId()
  96. end
  97. function UIFashionCtr:IsBeginner()
  98. return ManagerContainer.DataMgr.UserData:GetJobType() == 0
  99. end
  100. function UIFashionCtr:GetRoleCfgId()
  101. return ManagerContainer.DataMgr.UserData:GetUserRoleId()
  102. end
  103. function UIFashionCtr:GetRoleViewData()
  104. local heroData = ManagerContainer.DataMgr.UserData:GetMainRoleData()
  105. return heroData.extGoesShowData
  106. end
  107. --- 需要在启动换装界面时缓存当前时装的数据
  108. function UIFashionCtr:CacheViewData()
  109. self.viewDataCache = clone(ManagerContainer.DataMgr.UserData:GetViewData())
  110. end
  111. function UIFashionCtr:GetViewData()
  112. return self.viewDataCache
  113. end
  114. function UIFashionCtr:CanWear(fashionCfgData)
  115. if not fashionCfgData then
  116. return false
  117. end
  118. if not fashionCfgData.FashionUseJob then
  119. return true
  120. end
  121. local jobCfgId = ManagerContainer.DataMgr.UserData:GetJobCfgId()
  122. if IsTableHasValue(fashionCfgData.FashionUseJob, jobCfgId) then
  123. return true
  124. end
  125. return false
  126. end
  127. --- 是否穿戴时装
  128. function UIFashionCtr:IsWear(cfgId)
  129. if self.curViewPageType ~= ViewPageType.Change then
  130. return false
  131. end
  132. if not self.viewDataCache.fashionData then
  133. return false
  134. end
  135. local fashionCfgData = ManagerContainer.CfgMgr:GetFashionById(cfgId)
  136. return (self.viewDataCache.fashionData[fashionCfgData.FashionLocation] == cfgId)
  137. end
  138. function UIFashionCtr:ChangeWear(fashionCfgData)
  139. if not fashionCfgData then
  140. return 1, nil
  141. end
  142. if self.curViewPageType ~= ViewPageType.Change then
  143. return 1, nil
  144. end
  145. if not self.viewDataCache.fashionData then
  146. return 1, nil
  147. end
  148. if not self:CanWear(fashionCfgData) then
  149. return 2, nil
  150. end
  151. local cfgId = fashionCfgData.FashionId
  152. local lastCfgId = self.viewDataCache.fashionData[fashionCfgData.FashionLocation]
  153. if (lastCfgId == cfgId) then
  154. -- 脱下
  155. self.viewDataCache.fashionData[fashionCfgData.FashionLocation] = nil
  156. else
  157. -- 更换
  158. self.viewDataCache.fashionData[fashionCfgData.FashionLocation] = cfgId
  159. end
  160. return 0, lastCfgId
  161. end
  162. function UIFashionCtr:IsChangeFashion()
  163. local viewData = ManagerContainer.DataMgr.UserData:GetViewData()
  164. for _, value in pairs(Enum.FashionSlotType) do
  165. if self.viewDataCache.fashionData[value] ~= viewData.fashionData[value] then
  166. if viewData.fashionData[value] then
  167. return true
  168. end
  169. if self.viewDataCache.fashionData[value] then
  170. return true
  171. end
  172. end
  173. end
  174. return false
  175. end
  176. --- 在关闭界面时比较变化,并通知服务器
  177. function UIFashionCtr:SendFashionChange()
  178. if not self.viewDataCache then return false end
  179. local downs = {}
  180. local ups = {}
  181. local viewData = ManagerContainer.DataMgr.UserData:GetViewData()
  182. for _, value in pairs(Enum.FashionSlotType) do
  183. if self.viewDataCache.fashionData[value] ~= viewData.fashionData[value] then
  184. if viewData.fashionData[value] then
  185. table.insert(downs, viewData.fashionData[value])
  186. end
  187. if self.viewDataCache.fashionData[value] then
  188. table.insert(ups, self.viewDataCache.fashionData[value])
  189. end
  190. end
  191. end
  192. local isChanged = false
  193. if #downs > 0 then
  194. isChanged = true
  195. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_FASHION_DOWN_REQ, { fashion_cfg_id = downs })
  196. end
  197. if #ups > 0 then
  198. isChanged = true
  199. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_FASHION_UP_REQ, { fashion_cfg_id = ups })
  200. end
  201. if isChanged then
  202. self.viewDataCacheSend = clone(self.viewDataCache)
  203. end
  204. return isChanged
  205. end
  206. function UIFashionCtr:IsSaveFashionSuccess()
  207. if not self.viewDataCacheSend then return true end
  208. local viewData = ManagerContainer.DataMgr.UserData:GetViewData()
  209. for _, value in pairs(Enum.FashionSlotType) do
  210. if self.viewDataCacheSend.fashionData[value] ~= viewData.fashionData[value] then
  211. if viewData.fashionData[value] then
  212. return false
  213. end
  214. if self.viewDataCacheSend.fashionData[value] then
  215. return false
  216. end
  217. end
  218. end
  219. self.viewDataCacheSend = nil
  220. return true
  221. end
  222. function UIFashionCtr:GetViewPageType()
  223. return ViewPageType
  224. end
  225. function UIFashionCtr:GetCurViewPageType()
  226. return self.curViewPageType
  227. end
  228. function UIFashionCtr:ChangeViewPage(viewPageType)
  229. if self.curViewPageType == viewPageType then
  230. return false
  231. end
  232. self.curViewPageType = viewPageType
  233. self:RefreshShowDataType()
  234. return true
  235. end
  236. function UIFashionCtr:GetCurSelectItemIndex()
  237. return self.curSelectItemIndex
  238. end
  239. function UIFashionCtr:SetCurSelectItemIndex(itemIndex)
  240. if self.curSelectItemIndex == itemIndex then
  241. return false
  242. end
  243. self.curSelectItemIndex = itemIndex
  244. return true
  245. end
  246. function UIFashionCtr:RefreshOwnerDatas()
  247. local fashionMap = ManagerContainer.DataMgr.FashionData:GetFashionMap()
  248. local heroSex = ManagerContainer.DataMgr.UserData:GetSex()
  249. local ownerDatas = {}
  250. local ownerDataMap = {}
  251. local ownerDataRPMap = {}
  252. if fashionMap then
  253. local typeFashions
  254. for cfgId,fashionData in pairs(fashionMap) do
  255. local fashionCfgData = ManagerContainer.CfgMgr:GetFashionById(cfgId)
  256. if fashionCfgData.FashionOpen then
  257. typeFashions = ownerDataMap[fashionCfgData.FashionLocation]
  258. if not typeFashions then
  259. typeFashions = {}
  260. ownerDataMap[fashionCfgData.FashionLocation] = typeFashions
  261. end
  262. typeFashions[#typeFashions + 1] = fashionCfgData
  263. ownerDatas[#ownerDatas + 1] = fashionCfgData
  264. end
  265. end
  266. end
  267. table.sort(ownerDatas, SortRule)
  268. -- 更新排序
  269. for _, value in pairs(ownerDataMap) do
  270. table.sort(value, SortRule)
  271. end
  272. self.ownerDatas = ownerDatas
  273. self.ownerDataMap = ownerDataMap
  274. self.ownerDataRPMap = ownerDataRPMap
  275. self:RefreshRPInfo()
  276. end
  277. function UIFashionCtr:RefreshAllDatas()
  278. local userData = ManagerContainer.DataMgr.UserData
  279. local heroSex = userData:GetSex()
  280. local cfgMgr = ManagerContainer.CfgMgr
  281. local FashionCfgDatas = cfgMgr:GetFashionCfg()
  282. local allDatas = {}
  283. local allDataMap = {}
  284. for _, value in pairs(FashionCfgDatas) do
  285. if value.FashionOpen and (not value.FashionSex or value.FashionSex == 0 or heroSex == value.FashionSex) then
  286. local typeFashions = allDataMap[value.FashionLocation]
  287. if not typeFashions then
  288. typeFashions = {}
  289. allDataMap[value.FashionLocation] = typeFashions
  290. end
  291. -- 有效数据
  292. typeFashions[#typeFashions + 1] = value
  293. allDatas[#allDatas + 1] = value
  294. end
  295. end
  296. self.allDatas = allDatas
  297. self.allDataMap = allDataMap
  298. self:RefreshAllDatasSort()
  299. end
  300. function UIFashionCtr:RefreshAllDatasSort()
  301. if self.allDatas then
  302. table.sort(self.allDatas, AllSortRule)
  303. end
  304. -- 更新排序
  305. if self.allDataMap then
  306. for _, value in pairs(self.allDataMap) do
  307. table.sort(value, AllSortRule)
  308. end
  309. end
  310. end
  311. -- function UIFashionCtr:GetMinRow()
  312. -- if self.curViewPageType == ViewPageType.Change then
  313. -- return 2
  314. -- elseif self.curViewPageType == ViewPageType.Book then
  315. -- return 4
  316. -- end
  317. -- return 1
  318. -- end
  319. -- function UIFashionCtr:GetColumn()
  320. -- if self.curViewPageType == ViewPageType.Change then
  321. -- return 5
  322. -- elseif self.curViewPageType == ViewPageType.Book then
  323. -- return 5
  324. -- end
  325. -- return 1
  326. -- end
  327. function UIFashionCtr:RefreshShowData()
  328. self.ownerDatas = nil
  329. self.ownerDataMap = nil
  330. self.allDatas = nil
  331. self.allDataMap = nil
  332. self.showDatas = nil
  333. self.showDataLength = nil
  334. self:RefreshShowDataType(self.curSelectFashionSlotType)
  335. end
  336. function UIFashionCtr:GetCurSelectFashionSlotType()
  337. return self.curSelectFashionSlotType
  338. end
  339. function UIFashionCtr:RefreshShowDataType(fashionSlotType)
  340. if fashionSlotType then
  341. if self.curViewPageType == ViewPageType.Change then
  342. if not self.ownerDataMap then self:RefreshOwnerDatas() end
  343. self.showDatas = self.ownerDataMap[fashionSlotType]
  344. elseif self.curViewPageType == ViewPageType.Book then
  345. if not self.allDataMap then self:RefreshAllDatas() end
  346. self.showDatas = self.allDataMap[fashionSlotType]
  347. end
  348. else
  349. if self.curViewPageType == ViewPageType.Change then
  350. if not self.ownerDatas then self:RefreshOwnerDatas() end
  351. self.showDatas = self.ownerDatas
  352. elseif self.curViewPageType == ViewPageType.Book then
  353. if not self.allDatas then self:RefreshAllDatas() end
  354. self.showDatas = self.allDatas
  355. end
  356. end
  357. self.curSelectFashionSlotType = fashionSlotType
  358. local showDataLength = (self.showDatas and #self.showDatas or 0)
  359. -- if showDataLength > 0 then
  360. -- local column = self:GetColumn()
  361. -- local row = Mathf.Ceil(showDataLength / column)
  362. -- row = Mathf.Max(row, self:GetMinRow())
  363. -- showDataLength = row * column
  364. -- else
  365. -- showDataLength = self:GetColumn() * self:GetMinRow()
  366. -- end
  367. self.showDataLength = showDataLength
  368. end
  369. function UIFashionCtr:GetShowDataLength()
  370. return self.showDataLength
  371. end
  372. function UIFashionCtr:GetShowData(itemIndex)
  373. return self.showDatas and self.showDatas[itemIndex + 1] or nil
  374. end
  375. function UIFashionCtr:GetItemIndexByCfgId(cfgId)
  376. if cfgId and self.showDatas then
  377. for index, fashionCfgData in pairs(self.showDatas) do
  378. if fashionCfgData.FashionId == cfgId then
  379. return index - 1
  380. end
  381. end
  382. end
  383. return nil
  384. end
  385. function UIFashionCtr:IsOwner(cfgId)
  386. return ManagerContainer.DataMgr.FashionData:Contains(cfgId)
  387. end
  388. function UIFashionCtr:RefreshFashionSlotTypeRPInfo(fashionSlotType)
  389. local changed = false
  390. local datas = self.ownerDataMap[fashionSlotType]
  391. local lastRPStatus = self.ownerDataRPMap[fashionSlotType]
  392. if datas then
  393. local hasNew = false
  394. for _,cfgId in pairs(datas) do
  395. local isNew = ManagerContainer.DataMgr.FashionData:IsNew(cfgId)
  396. if isNew then
  397. hasNew = true
  398. break
  399. end
  400. end
  401. if (lastRPStatus ~= hasNew) then
  402. if lastRPStatus ~= nil or hasNew then
  403. self.ownerDataRPMap[fashionSlotType] = hasNew
  404. changed = true
  405. end
  406. end
  407. else
  408. if lastRPStatus then
  409. self.ownerDataRPMap[fashionSlotType] = false
  410. changed = true
  411. end
  412. end
  413. return changed
  414. end
  415. function UIFashionCtr:RefreshRPInfo(fashionSlotType)
  416. local changed = false
  417. if fashionSlotType then
  418. changed = self:RefreshFashionSlotTypeRPInfo(fashionSlotType)
  419. else
  420. for _, value in pairs(Enum.FashionSlotType) do
  421. changed = self:RefreshFashionSlotTypeRPInfo(value) or changed
  422. end
  423. end
  424. -- 分析总红点
  425. if changed then
  426. local lastRPStatus = self.ownerDataRP
  427. local hasNew = false
  428. for _, isNew in pairs(self.ownerDataRPMap) do
  429. if isNew then
  430. hasNew = true
  431. break
  432. end
  433. end
  434. if (lastRPStatus ~= hasNew) then
  435. if lastRPStatus ~= nil or hasNew then
  436. self.ownerDataRP = hasNew
  437. changed = true
  438. end
  439. end
  440. end
  441. return changed
  442. end
  443. function UIFashionCtr:GetRPStatus(fashionSlotType)
  444. local status
  445. if fashionSlotType then
  446. status = self.ownerDataRPMap[fashionSlotType]
  447. else
  448. status = self.ownerDataRP
  449. end
  450. return (status ~= nil and status or false)
  451. end
  452. function UIFashionCtr:GetAllFashionAttr()
  453. local suitAttrs = ManagerContainer.DataMgr.FashionData:GetFashionSuitAttrs()
  454. local attrs = {}
  455. for k,v in pairs(suitAttrs) do
  456. attrs[#attrs + 1] = {k,v}
  457. end
  458. local fashionAttrs = ManagerContainer.DataMgr.FashionData:GetFashionAllAttrs()
  459. local attrs1 = {}
  460. for k,v in pairs(fashionAttrs) do
  461. for k1,v1 in pairs(v) do
  462. if v1 > 0 then
  463. attrs1[#attrs1 + 1] = {k1,v1,k - 1}
  464. end
  465. end
  466. end
  467. table.sort(attrs, function(a, b)
  468. return a[1] < b[1]
  469. end)
  470. table.sort(attrs1, function(a, b)
  471. if a[3] == 0 and b[3] == 0 then
  472. return a[1] < b[1]
  473. elseif a[3] == 0 and b[3] > 0 then
  474. return true
  475. elseif a[3] > 0 and b[3] > 0 then
  476. local posA = ManagerContainer.CfgMgr:GetPartnerPostIdByJobType(a[3])
  477. local posB = ManagerContainer.CfgMgr:GetPartnerPostIdByJobType(b[3])
  478. return posA < posB
  479. end
  480. end)
  481. return attrs,attrs1
  482. end
  483. function UIFashionCtr:GetFashionLogicData(cfgId)
  484. return ManagerContainer.DataMgr.FashionData:GetFashionById(cfgId)
  485. end
  486. function UIFashionCtr:GetJobTypeName(jobType)
  487. if not jobType then return "" end
  488. local colorStr = "<color=%s>%s</color>"
  489. local leaderColor = GlobalConfig.Instance:GetConfigStrValue(306)
  490. local name = string.format(colorStr, leaderColor, I18N.T("protagonist"))
  491. if jobType > 0 then
  492. --伙伴
  493. local name1, color = ManagerContainer.CfgMgr:GetPartnerCfgDataByJobType(jobType)
  494. name = string.format(colorStr, color, I18N.T(name1))
  495. end
  496. return name
  497. end
  498. function UIFashionCtr:GetFashionSuitLv(suitId)
  499. return ManagerContainer.DataMgr.FashionData:GetFashionSuitLvById(suitId)
  500. end
  501. return UIFashionCtr