EquipData.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. local EquipData = class("EquipData", require("DataBase"))
  2. local function SortRule(a, b)
  3. if a.fightPower == b.fightPower then
  4. return a.cfgId > b.cfgId
  5. else
  6. return a.fightPower > b.fightPower
  7. end
  8. end
  9. function EquipData:ctor()
  10. self.data = {}
  11. end
  12. function EquipData:InitEquipData(data)
  13. local equipMap = {}
  14. local typeEquips = {}
  15. if data and data.equip_list then
  16. local cfgMgr = ManagerContainer.CfgMgr
  17. local list = data.equip_list
  18. local equip, equipCfgData, type
  19. for i = 1, #list do
  20. local equipData = list[i]
  21. if equipData and equipData.num > 0 then
  22. equip = self:ProtocalDataToEquipData(equipData)
  23. equipCfgData = cfgMgr:GetEquipById(equip.cfgId)
  24. if not equipCfgData then
  25. LogError("[Wboy] .. ".. tostring(equip.cfgId) .. " 装备ID不存在")
  26. else
  27. type = equipCfgData.Type
  28. equipMap[equip.cfgId] = equip
  29. if typeEquips[type] == nil then
  30. typeEquips[type] = {}
  31. end
  32. typeEquips[type][#typeEquips[type] + 1] = equip
  33. end
  34. end
  35. end
  36. end
  37. self.data.equipMap = equipMap
  38. self.data.typeEquips = typeEquips
  39. for _,v in pairs(self.data.typeEquips) do
  40. table.sort(v, SortRule)
  41. end
  42. end
  43. function EquipData:GetAllEquipDataMap()
  44. return self.data.equipMap
  45. end
  46. function EquipData:GetEquipDataMapById(id)
  47. return self.data.equipMap[id]
  48. end
  49. function EquipData:GetEquipCountById(id)
  50. local data = self.data.equipMap[id]
  51. if data then
  52. return data.num
  53. end
  54. return 0
  55. end
  56. function EquipData:GetAllEquipCount()
  57. local count = 0
  58. for i = 1, 6 do
  59. local equipList = self.data.typeEquips[i]
  60. if equipList ~= nil then
  61. count = count + #equipList
  62. end
  63. end
  64. return count
  65. end
  66. function EquipData:GetAllEquipDatasByType(type, cfgId)
  67. if self.data.typeEquips[type] == nil then return {} end
  68. local list = {}
  69. for k, v in pairs(self.data.typeEquips[type]) do
  70. if cfgId == nil then
  71. list[#list + 1] = v
  72. else
  73. if cfgId ~= v.cfgId then
  74. list[#list + 1] = v
  75. end
  76. end
  77. end
  78. return list
  79. end
  80. function EquipData:GetAllEquipDatasByTypeAndJob(type, jobType)
  81. if self.data.typeEquips[type] == nil then return nil end
  82. local list = {}
  83. for _, v in pairs(self.data.typeEquips[type]) do
  84. if type == Enum.SlotEquipType.Weapon then
  85. local equipData = ManagerContainer.CfgMgr:GetEquipById(v.cfgId)
  86. if equipData.JobType[1] == jobType then
  87. list[#list + 1] = v
  88. end
  89. else
  90. list[#list + 1] = v
  91. end
  92. end
  93. return list
  94. end
  95. function EquipData:GetAllWeaponEquipDatasFlterJobType(jobType)
  96. if self.data.typeEquips[Enum.SlotEquipType.Weapon] == nil then return end
  97. local list
  98. for _,v in pairs(self.data.typeEquips[Enum.SlotEquipType.Weapon]) do
  99. local equipData = ManagerContainer.CfgMgr:GetEquipById(v.cfgId)
  100. if CommonUtil.EleInTable(jobType, equipData.JobType) then
  101. if list == nil then list = {} end
  102. list[#list + 1] = v
  103. end
  104. end
  105. return list
  106. end
  107. function EquipData:GetEquipDatasByTypeAndId(type, id)
  108. if self.data.typeEquips[type] == nil then return nil end
  109. for i = 1, #self.data.typeEquips[type] do
  110. if self.data.typeEquips[type][i].cfgId == id then
  111. return self.data.typeEquips[type][i]
  112. end
  113. end
  114. return nil
  115. end
  116. function EquipData:RefreshEquipDatas(equip_list, ignore)
  117. if equip_list == nil then return nil end
  118. -- 是否为新增道具, 默认为新增
  119. --ignore = ignore and ignore or false
  120. local addEquips = {}
  121. local equipMap = self.data.equipMap
  122. local typeEquips = self.data.typeEquips
  123. local isNeedSort = {false,false,false,false,false,false}
  124. local cfgMgr = ManagerContainer.CfgMgr
  125. local equip, equipCfgData, type, isValid
  126. for _,item in ipairs(equip_list) do
  127. local cfgId = item.config_id
  128. local num = item.num
  129. equip = equipMap[cfgId]
  130. if num <= 0 then
  131. -- 删除装备
  132. if equip then
  133. equipMap[cfgId] = nil
  134. for i = 1, 6 do
  135. local equipList = typeEquips[i]
  136. if equipList ~= nil then
  137. for j,v in ipairs(equipList) do
  138. if v.cfgId == equip.cfgId then
  139. table.remove(equipList, j)
  140. end
  141. end
  142. end
  143. end
  144. end
  145. else
  146. -- 更新装备
  147. isValid = true
  148. local lastnum = equip and equip.num or 0
  149. if equip then
  150. equip.num = num
  151. else
  152. equipCfgData = cfgMgr:GetEquipById(cfgId)
  153. if not equipCfgData then
  154. LogError("[Wboy] .. ".. tostring(cfgId) .. " 装备ID不存在")
  155. isValid = false
  156. else
  157. equip = self:ProtocalDataToEquipData(item)
  158. type = equipCfgData.Type
  159. equipMap[cfgId] = equip
  160. if typeEquips[type] == nil then
  161. typeEquips[type] = {}
  162. end
  163. typeEquips[type][#typeEquips[type] + 1] = equip
  164. isNeedSort[type] = true
  165. end
  166. end
  167. if isValid then
  168. local addNum = num - lastnum
  169. if addNum > 0 then
  170. if addEquips[cfgId] then
  171. addEquips[cfgId] = addEquips[cfgId] + addNum
  172. else
  173. addEquips[cfgId] = addNum
  174. end
  175. end
  176. end
  177. end
  178. end
  179. for i = 1, 6 do
  180. local needSort = isNeedSort[i]
  181. if needSort then
  182. table.sort(typeEquips[i], SortRule)
  183. end
  184. end
  185. return addEquips
  186. end
  187. function EquipData:RegisterNetEvents()
  188. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_STARTUP_INFO_EQUIP_NTF, function(data)
  189. self:InitEquipData(data.role_equip_info)
  190. end)
  191. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_EQUIP_CHANGE_NTF, function(data)
  192. local addEquips = self:RefreshEquipDatas(data.equip_list, data.ignore)
  193. if next(addEquips) ~= nil then
  194. if not data.ignore then
  195. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD, addEquips)
  196. end
  197. end
  198. ManagerContainer.RedPointMgr.HeroRPCtr:HeroEquipNotify()
  199. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerEquipNotify()
  200. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EQUIP_CHANGE)
  201. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ONE_KEY_EQUIP_REDPOINT_NOTICE)
  202. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.MAIN_UI_ROLE_REDPOINT_NOTICE)
  203. end)
  204. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_EQUIP_FORGE_ACK, function(data)
  205. if data.error == Enum.NetErrorCode.ERROR_OK then
  206. ----单件装备锻造
  207. --local addEquips = self:RefreshEquipDatas({data.old_data, data.new_data})
  208. --
  209. --ManagerContainer.RedPointMgr.HeroRPCtr:HeroEquipNotify()
  210. --ManagerContainer.RedPointMgr.HeroRPCtr:PartnerEquipNotify()
  211. --
  212. --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_EQUIP_AND_ITEM_ADD, addEquips)
  213. --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EQUIP_CHANGE)
  214. --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ONE_KEY_EQUIP_REDPOINT_NOTICE)
  215. --ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.MAIN_UI_ROLE_REDPOINT_NOTICE)
  216. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EQUIP_FORGE_SUCCESS, data.type)
  217. end
  218. end)
  219. end
  220. function EquipData:Clear()
  221. self.data = {}
  222. end
  223. function EquipData:Destroy()
  224. if self.Clear then
  225. self:Clear()
  226. end
  227. self:UnRegisterNetEvents()
  228. end
  229. function EquipData:UnRegisterNetEvents()
  230. end
  231. function EquipData:GetForgeStatus(slotIndex, onlyOne)
  232. local slots = ManagerContainer.DataMgr.UserData:GetCurSlotInfos(slotIndex)
  233. local canForge = false
  234. local slotsForgeStatus = {false,false,false,false,false,false}
  235. local lackEquip, lackCoin = false, false
  236. if slotIndex == nil then return end
  237. local function CanForgeCurEquip(id, needCount, remainCoin)
  238. local data = ManagerContainer.CfgMgr:GetEquipById(id)
  239. local consumeId = data.ForgeOld
  240. if consumeId == 0 then
  241. return false
  242. end
  243. local consumeEquip = self.data.equipMap[data.ForgeOld]
  244. local consumeEquipData = ManagerContainer.CfgMgr:GetEquipById(data.ForgeOld)
  245. local count = consumeEquip == nil and 0 or consumeEquip.num
  246. local cost = consumeEquipData.CostMoney * (needCount / 3)
  247. --LogError(consumeId.." "..count.." forge id "..id.." consume "..needCount)
  248. if cost <= remainCoin then
  249. remainCoin = remainCoin - cost
  250. if count < needCount then
  251. local lackCount = needCount - count
  252. local result = CanForgeCurEquip(consumeId, lackCount * 3, remainCoin)
  253. return result
  254. else
  255. return true
  256. end
  257. else
  258. lackCoin = true
  259. return false
  260. end
  261. end
  262. for k,v in pairs(slots) do
  263. local cfgId = v.equip_id
  264. if cfgId > 0 then
  265. local curEquip = ManagerContainer.CfgMgr:GetEquipById(cfgId)
  266. if self.data.typeEquips[curEquip.Type] ~= nil and curEquip.Forge > 0 then
  267. local ownCoin = ManagerContainer.DataMgr.UserData:GetOwnCoin()
  268. local remainOwn = ownCoin
  269. local logicData = self.data.equipMap[cfgId]
  270. local count = logicData == nil and 0 or logicData.num
  271. if curEquip.CostMoney <= remainOwn then
  272. if count < 2 then
  273. remainOwn = remainOwn - curEquip.CostMoney
  274. local lackCount = 2 - count
  275. local result = CanForgeCurEquip(cfgId, lackCount * 3, remainOwn)
  276. slotsForgeStatus[k] = result
  277. else
  278. slotsForgeStatus[k] = true
  279. lackCoin = false
  280. end
  281. else
  282. slotsForgeStatus[k] = false
  283. lackCoin = true
  284. end
  285. if slotsForgeStatus[k] then
  286. canForge = true
  287. if onlyOne then
  288. return canForge, slotsForgeStatus, lackCoin, lackEquip
  289. end
  290. end
  291. end
  292. end
  293. end
  294. return canForge, slotsForgeStatus, lackCoin, lackEquip
  295. end
  296. function EquipData:GetAllCanForgeEquipIds(type, jobType, equipedId)
  297. local list = {}
  298. if self.data.typeEquips[type] == nil then return list end
  299. local ownCoin = ManagerContainer.DataMgr.UserData:GetOwnCoin()
  300. local totalCost = 0
  301. local remainCoin = ownCoin - totalCost
  302. local noMate = true
  303. local equipCfgDatas = ManagerContainer.CfgMgr:GetAllEquipDatasByTypeAndJob1(type, jobType, Enum.TableSortRule.Up)
  304. local minEquipData = equipCfgDatas[1]
  305. local tempCur = {}
  306. for i = 1,#equipCfgDatas do
  307. tempCur[equipCfgDatas[i].Id] = self.data.equipMap[equipCfgDatas[i].Id] and {cfgId = self.data.equipMap[equipCfgDatas[i].Id].cfgId, num = self.data.equipMap[equipCfgDatas[i].Id].num} or {cfgId = equipCfgDatas[i].Id, num = 0}
  308. end
  309. while(remainCoin >= minEquipData.CostMoney) do
  310. local needOver = true
  311. for i = #equipCfgDatas, 1, -1 do
  312. local cfgId = equipCfgDatas[i].Id
  313. local count = 3
  314. local continue = true
  315. if equipedId then
  316. if cfgId == equipedId then
  317. count = 2
  318. elseif cfgId > equipedId then
  319. continue = false
  320. end
  321. end
  322. if continue and tempCur[cfgId].num >= count and remainCoin >= equipCfgDatas[i].CostMoney and equipCfgDatas[i].Forge > 0 then
  323. local addCount = 1 --math.floor(tempCur[cfgId].num / 3)
  324. local forgeCost = addCount * equipCfgDatas[i].CostMoney
  325. if forgeCost > remainCoin then
  326. addCount = math.floor(remainCoin/equipCfgDatas[i].CostMoney)
  327. forgeCost = addCount * equipCfgDatas[i].CostMoney
  328. end
  329. noMate = false
  330. needOver = false
  331. tempCur[equipCfgDatas[i + 1].Id].num = tempCur[equipCfgDatas[i + 1].Id].num + addCount
  332. tempCur[cfgId].num = tempCur[cfgId].num - addCount * 3
  333. tempCur[cfgId].num = math.max(tempCur[cfgId].num, 0)
  334. remainCoin = remainCoin - forgeCost
  335. totalCost = totalCost + forgeCost
  336. if cfgId == equipedId then
  337. needOver = true
  338. end
  339. break
  340. end
  341. end
  342. if needOver then
  343. break
  344. end
  345. end
  346. for k, v in pairs(tempCur) do
  347. if v.num > 0 then
  348. if self.data.equipMap[k] == nil then
  349. list[#list + 1] = {cfgId = k, num = v.num }
  350. elseif self.data.equipMap[k] ~= nil and self.data.equipMap[k].num < v.num then
  351. list[#list + 1] = {cfgId = k, num = v.num - self.data.equipMap[k].num }
  352. end
  353. end
  354. end
  355. if list then
  356. --CommonUtil.ArraySortSelections(list, Enum.TableSortRule.Down, "cfgId")
  357. table.sort(list, function (a,b)
  358. return a.cfgId > b.cfgId
  359. end)
  360. end
  361. return list, totalCost, noMate, ownCoin < totalCost
  362. end
  363. function EquipData:CanForgeById(consumeId)
  364. local consumeData = self:GetEquipDataMapById(consumeId)
  365. local coinEnough = false
  366. if consumeData ~= nil then
  367. local cfgData = ManagerContainer.CfgMgr:GetEquipById(consumeData.cfgId)
  368. local ownCoin = ManagerContainer.DataMgr.UserData:GetOwnCoin()
  369. coinEnough = cfgData.CostMoney <= ownCoin
  370. end
  371. return consumeData ~= nil and consumeData.num >= 3 and coinEnough
  372. end
  373. function EquipData:ProtocalDataToEquipData(protocalData)
  374. local equipData = {}
  375. equipData.cfgId = protocalData.config_id
  376. equipData.num = protocalData.num
  377. return equipData
  378. end
  379. function EquipData:SortRule(a, b)
  380. local equipCfgDataA = ManagerContainer.CfgMgr:GetEquipById(a.cfgId)
  381. local equipCfgDataB = ManagerContainer.CfgMgr:GetEquipById(b.cfgId)
  382. if equipCfgDataA.EquipLevel == equipCfgDataB.EquipLevel then
  383. return a.cfgId > b.cfgId
  384. else
  385. return equipCfgDataA.EquipLevel > equipCfgDataB.EquipLevel
  386. end
  387. end
  388. return EquipData