PetAttrData.lua 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. local PetAttrData = class("PetAttrData")
  2. local CreatePetActorSystem = require("CreatePetActorSystem")
  3. function PetAttrData:ctor()
  4. self.data = {}
  5. --self:InitData(pets)
  6. if not self.data.petDatas then
  7. self.data.petDatas = {}
  8. end
  9. if not self.data.petDatasMap then
  10. self.data.petDatasMap = {}
  11. end
  12. end
  13. function PetAttrData:InitData(petList)
  14. if not petList then return end
  15. for _,v in pairs(petList) do
  16. if not self.data.petDatasMap[v.id] then
  17. --LogError("==========PetAttrData:InitData========"..Inspect(v))
  18. local data = ProtocalDataNormal.ParsePetData(v)
  19. self.data.petDatas[#self.data.petDatas + 1] = data
  20. self.data.petDatasMap[data.id] = data
  21. if data.isBattle then
  22. self:GetPetActorData(data.id)
  23. self:RefreshHeroPetState(0, data.heroId, data.id)
  24. end
  25. self:UpdatePetExtGoShowData(data)
  26. -- self:RefreshPetStampSuit(data)
  27. -- self:CalcPetStampAttrs(data)
  28. -- data.oldSlots = clone(data.slots)
  29. -- data.oldStampSuit = clone(data.stampSuit)
  30. else
  31. --local data = ProtocalDataNormal.ParsePetData(v)
  32. --data.totalFightPower = ManagerContainer.DataMgr.PetDataMgr:GetTotalFightPower(v.id)
  33. --self.data.petDatasMap[v.id] = data
  34. --self:RefreshPetStampSuit(data)
  35. --self:RefreshPetDataList(data)
  36. --if data.isBattle then
  37. -- self:GetPetActorData(data.id)
  38. -- self:RefreshHeroPetState(0, data.heroId, data.id)
  39. --end
  40. end
  41. self:CalcBaseFightPower(self.data.petDatasMap[v.id])
  42. end
  43. CommonUtil.ArraySortSelections(self.data.petDatas, Enum.TableSortRule.Down, "isBattle", "quality", "advanceLevel", "level", "cfgId")
  44. end
  45. function PetAttrData:InitPetDetailDatas(petInfoList)
  46. for _,v in pairs(petInfoList) do
  47. local data = self.data.petDatasMap[v.id]
  48. if data then
  49. data = ProtocalDataNormal.ParsePetData(v, data)
  50. data.is_queried = true
  51. if data.isBattle then
  52. self:GetPetActorData(data.id)
  53. self:RefreshHeroPetState(0, data.heroId, data.id)
  54. end
  55. self:RefreshPetStampSuit(data)
  56. self:CalcPetStampAttrs(data)
  57. data.oldSlots = clone(data.slots)
  58. data.oldStampSuit = clone(data.stampSuit)
  59. self:CalcBaseFightPower(self.data.petDatasMap[v.id])
  60. self:UpdatePetExtGoShowData(data)
  61. end
  62. end
  63. end
  64. function PetAttrData:RefreshData(changeList, delList)
  65. if not self.data.petDatas then
  66. self.data.petDatas = {}
  67. end
  68. if not self.data.petDatasMap then
  69. self.data.petDatasMap = {}
  70. end
  71. local addOrDelTrigger = false
  72. local slotChanged = false
  73. if changeList then
  74. for _,v in pairs(changeList) do
  75. local data = self.data.petDatasMap[v.id]
  76. if data then
  77. local levelChanged = data.level ~= v.level
  78. data.level = v.level
  79. local advenceChanged = data.advanceLevel ~= v.advance_level
  80. data.advanceLevel = v.advance_level
  81. if data.heroId ~= v.hero_id then
  82. ManagerContainer.DataMgr.PetDataMgr:RecalcBattlePetRelationAttr(false, v.id)
  83. if data.heroId > 0 then
  84. self:RefreshHeroAttr(data.heroId)
  85. end
  86. if v.hero_id > 0 then
  87. ManagerContainer.DataMgr.PetDataMgr:RecalcBattlePetRelationAttr(true, v.id)
  88. --self:RefreshHeroAttr(v.hero_id)
  89. end
  90. self:RefreshHeroPetState(data.heroId, v.hero_id, v.id)
  91. end
  92. if data.heroId ~= v.hero_id then
  93. slotChanged = true
  94. end
  95. data.heroId = v.hero_id
  96. data.isBattle = data.heroId > 0
  97. local skillUp = false
  98. data.totalSkillUpCount = 0
  99. for k1,v1 in pairs(data.skillList) do
  100. if v1.level ~= v.skill_list[k1].level then
  101. skillUp = true
  102. end
  103. v1.level = v.skill_list[k1].level
  104. v1.rate = v.skill_list[k1].rate
  105. data.totalSkillUpCount = data.totalSkillUpCount + (v1.level - 1)
  106. end
  107. if levelChanged then
  108. local actorData = self:GetPetActorData(v.id)
  109. actorData.Level = data.level
  110. end
  111. if advenceChanged then
  112. local actorData = self:GetPetActorData(v.id)
  113. actorData:SetStep(data.advanceLevel)
  114. self:CalcPetAdvenceAttr(true, data.id, data.cfgId, data.advanceLevel)
  115. end
  116. if skillUp then
  117. local actorData = self:GetPetActorData(v.id)
  118. local skillParam = CreatePetActorSystem:CreateSkillParamDatas(data.skillList)
  119. actorData:RefreshSkills(skillParam)
  120. end
  121. local slotsChanged1 = false
  122. data.oldSlots = clone(data.slots)
  123. data.oldStampSuit = clone(data.stampSuit)
  124. for _,v1 in pairs(v.slot_equip_list) do
  125. if not data.slots[v1.idx] then
  126. data.slots[v1.idx] = {}
  127. data.slots[v1.idx].idx = v1.idx
  128. end
  129. if not slotsChanged1 then
  130. local slotData = data.slots[v1.idx]
  131. local stampId = slotData.stampId
  132. local stampData = ManagerContainer.DataMgr.PetDataMgr.petStampData:GetPetStampDataMapById(stampId)
  133. slotsChanged1 = stampData and (slotData.stampId ~= v1.equip_id or stampData.oldLv ~= stampData.lv) or v1.equip_id > 0
  134. if not slotChanged and slotsChanged1 then
  135. slotChanged = slotsChanged1
  136. end
  137. end
  138. data.slots[v1.idx].stampId = v1.equip_id
  139. data.slots[v1.idx].stoneIdList = v1.stone_id_list
  140. end
  141. if slotsChanged1 then
  142. self:RefreshPetStampSuit(data)
  143. end
  144. if levelChanged or advenceChanged or slotsChanged1 then
  145. self:RefreshMasterAttr(v.id)
  146. end
  147. data.qiyueHeroId = v.qiyue_hero_id
  148. else
  149. data = ProtocalDataNormal.ParsePetData(v)
  150. self.data.petDatas[#self.data.petDatas + 1] = data
  151. self.data.petDatasMap[data.id] = data
  152. self:RefreshPetStampSuit(data)
  153. addOrDelTrigger = true
  154. end
  155. self:UpdatePetExtGoShowData(data)
  156. self:CalcBaseFightPower(data)
  157. end
  158. end
  159. if delList then
  160. addOrDelTrigger = true
  161. for i = #self.data.petDatas, 1, -1 do
  162. local data = self.data.petDatas[i]
  163. if CommonUtil.EleInTable(data.id, delList) then
  164. table.remove(self.data.petDatas, i)
  165. self.data.petDatasMap[data.id] = nil
  166. ManagerContainer.LuaActorDataMgr:DeletePetActorData(data.id)
  167. end
  168. end
  169. ManagerContainer.DataMgr.PetDataMgr:DeleteMySupportPets(delList)
  170. end
  171. CommonUtil.ArraySortSelections(self.data.petDatas, Enum.TableSortRule.Down, "isBattle", "advanceLevel", "level", "quality", "cfgId")
  172. if addOrDelTrigger then
  173. ManagerContainer.DataMgr.PetDataMgr:RefreshRelationRPStates()
  174. end
  175. return slotChanged
  176. end
  177. function PetAttrData:RefreshPetDataList(data)
  178. for i = 1,#self.data.petDatas do
  179. if data.id == self.data.petDatas[i].id then
  180. self.data.petDatas[i] = data
  181. return
  182. end
  183. end
  184. end
  185. function PetAttrData:CalcBaseFightPower(petData)
  186. local curLv = petData.level
  187. local curData = ManagerContainer.CfgMgr:GetPetExpCfgDataById(curLv)
  188. local lvFightPower = curData["Capacity"..petData.quality]
  189. local curAdvanceLv = petData.advanceLevel
  190. local petProgressCfgData = ManagerContainer.CfgMgr:GetPetProgressCfgDataById(petData.cfgId)
  191. local advanceFightPower = 0
  192. for i = 1,curAdvanceLv do
  193. advanceFightPower = advanceFightPower + petProgressCfgData.AddFight[i]
  194. end
  195. petData.baseFightPower = math.floor((lvFightPower + advanceFightPower)/10)
  196. end
  197. function PetAttrData:ShowAdvanceFightPower()
  198. local petData = self.controller:GetCurPetData()
  199. local lastAdvanceLv = petData.advanceLevel - 1
  200. local curAdvanceLv = petData.advanceLevel
  201. local petProgressCfgData = ManagerContainer.CfgMgr:GetPetProgressCfgDataById(petData.cfgId)
  202. local lastFightPower = lastAdvanceLv > 0 and petProgressCfgData.AddFight[lastAdvanceLv] or 0
  203. local curFightPower = petProgressCfgData.AddFight[curAdvanceLv]
  204. local data = {startNum = lastFightPower, endNum = curFightPower}
  205. ManagerContainer.LuaUIMgr:FightPowerAddNotice(data)
  206. end
  207. function PetAttrData:GetPetDataById(id)
  208. return self.data.petDatasMap and self.data.petDatasMap[id] or nil
  209. end
  210. function PetAttrData:SetPetDataById_isRelevant(id,isRelevant)
  211. if self.data.petDatasMap then
  212. self.data.petDatasMap[id].isRelevant = isRelevant
  213. end
  214. end
  215. function PetAttrData:SetPetDataById_isSupport(id,isSupport)
  216. if self.data.petDatasMap then
  217. self.data.petDatasMap[id].isSupport = isSupport
  218. end
  219. end
  220. function PetAttrData:GetPetCountById(id)
  221. local count = 0
  222. for k, v in pairs(self.data.petDatasMap) do
  223. if v.cfgId == id then
  224. count = count + 1
  225. end
  226. end
  227. return count
  228. end
  229. function PetAttrData:GetPetDataByIdAndLv(id,lv,skillLv)
  230. local list = {}
  231. for k, v in pairs(self.data.petDatasMap) do
  232. if v.cfgId == id and v.level >= lv and self:GetSkillLv(v.skillList) >= skillLv and not v.isBattle then
  233. list[#list + 1] = v
  234. end
  235. end
  236. CommonUtil.ArraySortSelections(list, Enum.TableSortRule.Up, "isSupport","isRelevant","quality", "advanceLevel", "level", "cfgId")
  237. return list
  238. end
  239. function PetAttrData:GetPetDataByQulityAndLv(quality,lv,skillLv)
  240. local list = {}
  241. for k, v in pairs(self.data.petDatasMap) do
  242. if v.quality == quality and v.level >= lv and self:GetSkillLv(v.skillList) >= skillLv and not v.isBattle then
  243. list[#list + 1] = v
  244. end
  245. end
  246. CommonUtil.ArraySortSelections(list, Enum.TableSortRule.Up, "isSupport","isRelevant","quality", "advanceLevel", "level", "cfgId")
  247. return list
  248. end
  249. function PetAttrData:GetPetCountByIdAndLv(id,lv,skillLv)
  250. local count = 0
  251. for k, v in pairs(self.data.petDatasMap) do
  252. if v.cfgId == id and v.level >= lv and self:GetSkillLv(v.skillList) >= skillLv and not v.isBattle then
  253. count = count + 1
  254. end
  255. end
  256. return count
  257. end
  258. function PetAttrData:GetPetCountByQulityAndLv(quality,lv,skillLv)
  259. local count = 0
  260. for k, v in pairs(self.data.petDatasMap) do
  261. if v.quality == quality and v.level >= lv and self:GetSkillLv(v.skillList) >= skillLv and not v.isBattle then
  262. count = count + 1
  263. end
  264. end
  265. return count
  266. end
  267. function PetAttrData:GetSkillLv(skillList)
  268. local count = 0
  269. if skillList and #skillList > 0 then
  270. for i = 1, #skillList do
  271. count = count + skillList[i].level
  272. end
  273. end
  274. return count
  275. end
  276. function PetAttrData:GetNextSortId(id, isAdd)
  277. for i = 1,#self.data.petDatas do
  278. local data = self.data.petDatas[i]
  279. if data.id == id then
  280. if isAdd then
  281. if self.data.petDatas[i + 1] then
  282. return self.data.petDatas[i + 1].id
  283. else
  284. return self.data.petDatas[1].id
  285. end
  286. else
  287. if self.data.petDatas[i - 1] then
  288. return self.data.petDatas[i - 1].id
  289. else
  290. return self.data.petDatas[#self.data.petDatas].id
  291. end
  292. end
  293. break
  294. end
  295. end
  296. return id
  297. end
  298. function PetAttrData:GetPetActorData(id)
  299. local data = self.data.petDatasMap[id]
  300. if not data then return end
  301. local uniqueId = id + Enum.ActorUidField.Pet
  302. local actorData = ManagerContainer.LuaActorDataMgr:GetPetDataById(uniqueId)
  303. if not actorData then
  304. actorData = CreatePetActorSystem:CreatePetActorData(uniqueId, data.cfgId, data.level, data.skillList)
  305. actorData:SetStep(data.advanceLevel)
  306. self:CalcPetAdvenceAttr(false, data.id, data.cfgId, data.advanceLevel)
  307. end
  308. return actorData
  309. end
  310. function PetAttrData:GetPetDatas()
  311. return self.data.petDatas
  312. end
  313. function PetAttrData:SendPetLvUp(id)
  314. local data = self.data.petDatasMap[id]
  315. if not data then return end
  316. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_PET_LEVEL_UP_REQ, {pet_id = data.id})
  317. end
  318. function PetAttrData:SendPetAdvence(id, costList)
  319. local data = self.data.petDatasMap[id]
  320. if not data then return end
  321. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_PET_ADVANCE_REQ, {pet_id = data.id, pet_list = costList})
  322. end
  323. function PetAttrData:GetSomePetMaxAdvLvByCfgId(cfgId)
  324. local advLv = 0
  325. local petId = 0
  326. for _,v in pairs(self.data.petDatas) do
  327. if v.cfgId == cfgId and v.advanceLevel >= advLv then
  328. advLv = v.advanceLevel
  329. petId = v.id
  330. end
  331. end
  332. return advLv, petId
  333. end
  334. function PetAttrData:SendPetSkillUp(id, matId)
  335. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_PET_SKILL_LEVEL_UP_REQ, {pet_id = id, cost_pet_id = matId})
  336. end
  337. function PetAttrData:SendPetBattle(map)
  338. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_PET_BATTLE_REQ, {battle_list = map})
  339. end
  340. function PetAttrData:CalcPetAdvenceAttr(isAdd, id, cfgId, advLv)
  341. if isAdd then
  342. self:AddAdvenceAttrs(id, cfgId, advLv)
  343. else
  344. for i = 1, advLv do
  345. self:AddAdvenceAttrs(id, cfgId, i)
  346. end
  347. end
  348. end
  349. function PetAttrData:AddAdvenceAttrs(id, cfgId, advLv)
  350. local cfgData = ManagerContainer.CfgMgr:GetPetProgressCfgDataById(cfgId)
  351. local attrs = cfgData["Attribute"..advLv]
  352. if not attrs then
  353. return
  354. end
  355. local actorData = self:GetPetActorData(id)
  356. if not actorData then
  357. return
  358. end
  359. for _,v in pairs(attrs) do
  360. local key = v[1]
  361. local val = v[2]
  362. if key <= Enum.HeroAttrType.RealHurt then
  363. local eAttr = actorData:GetAdditionalAttr(key)
  364. actorData:SetAdditionalAttr(key, SDataUtil.Add(eAttr,val))
  365. elseif key >= Enum.HeroAttrType.STR_Percent then
  366. local eAttr = actorData:GetAdditionalAttrPercent(key)
  367. actorData:SetAdditionalAttrPercent(key, SDataUtil.Add(eAttr,val * 0.0001))
  368. end
  369. end
  370. end
  371. function PetAttrData:RefreshMasterAttr(id)
  372. local petData = self:GetPetDataById(id)
  373. if petData.heroId == 1 then
  374. ManagerContainer.DataMgr.UserData:CalcPetAttrs()
  375. elseif petData.heroId > 1 then
  376. ManagerContainer.DataMgr.PartnerData:CalcPetAttrsById(petData.heroId)
  377. end
  378. end
  379. function PetAttrData:RefreshHeroPetState(downHeroId, onHeroId, petId)
  380. if downHeroId > 0 then
  381. local downHeroData = CommonUtil.GetHeroActorDataByUid(downHeroId)
  382. if downHeroData then
  383. downHeroData:SetPet(nil)
  384. end
  385. end
  386. if onHeroId > 0 then
  387. local onHeroData = CommonUtil.GetHeroActorDataByUid(onHeroId)
  388. local petData = self:GetPetActorData(petId)
  389. if onHeroData and petData then
  390. onHeroData:SetPet(petData)
  391. end
  392. end
  393. end
  394. function PetAttrData:RefreshHeroAttr(heroId)
  395. if heroId == 1 then
  396. ManagerContainer.DataMgr.UserData:CalcPetAttrs()
  397. elseif heroId > 1 then
  398. ManagerContainer.DataMgr.PartnerData:CalcPetAttrsById(heroId)
  399. end
  400. end
  401. function PetAttrData:RefreshPetStampSuit(petData)
  402. if not petData then return end
  403. local slots = petData.slots
  404. local qualityCount = {0,0,0,0,0}
  405. local slotQualityList = {}
  406. local curQuality = 0
  407. for _,v in pairs(slots) do
  408. local stampId = v.stampId
  409. local stampData = ManagerContainer.DataMgr.PetDataMgr.petStampData:GetPetStampDataMapById(stampId)
  410. if stampData then
  411. local quality = stampData.cfgData.Quality
  412. slotQualityList[v.idx] = quality
  413. for i = 1, #qualityCount do
  414. if i <= quality then
  415. qualityCount[i] = qualityCount[i] + 1
  416. end
  417. end
  418. end
  419. end
  420. for i = 1, #qualityCount do
  421. local suitCfgData = ManagerContainer.CfgMgr:GetPetEquipSuitCfgDataByQuality(i)
  422. if suitCfgData then
  423. if qualityCount[i] >= suitCfgData.Amount[1][2] then
  424. curQuality = i
  425. end
  426. end
  427. end
  428. local curSuitCount = curQuality > 0 and qualityCount[curQuality] or qualityCount[1]
  429. local nextSuitCount = curQuality > 0 and (curQuality >= 6 and 0 or qualityCount[curQuality + 1]) or qualityCount[2]
  430. petData.stampSuit = {curQuality, curSuitCount, nextSuitCount, slotQualityList}
  431. end
  432. --宠物印记修改 属性
  433. local lastAttrs, newAttrs
  434. function PetAttrData:CalcPetStampAttrs(petData)
  435. if not petData then return end
  436. lastAttrs, newAttrs = {}, {}
  437. local actorData = self:GetPetActorData(petData.id)
  438. for k,v in pairs(Enum.HeroAttrType) do
  439. lastAttrs[v] = SDataUtil.InvConvertDouble(actorData:GetFinalAttr(v))
  440. end
  441. --减去原来的
  442. self:CalcPetStampAttrs1(petData, true)
  443. --加上现在的
  444. self:CalcPetStampAttrs1(petData, false)
  445. for k,v in pairs(Enum.HeroAttrType) do
  446. newAttrs[v] = SDataUtil.InvConvertDouble(actorData:GetFinalAttr(v))
  447. end
  448. ManagerContainer.LuaUIMgr:AttrNoticeDisplay1({lastAttrs, newAttrs})
  449. end
  450. function PetAttrData:CalcPetStampAttrs1(petData, isMinus)
  451. if isMinus then
  452. if not petData.oldSlots or not petData.oldStampSuit then return end
  453. local attrs = self:CalcPetStampAttrs2(petData.oldSlots, petData.oldStampSuit, true)
  454. local petActorData = ManagerContainer.DataMgr.PetDataMgr:GetPetActorData(petData.id)
  455. if not petActorData then return end
  456. for k,v in pairs(attrs) do
  457. if k <= Enum.HeroAttrType.RealHurt then
  458. local eAttr = petActorData:GetAdditionalAttr(k)
  459. local value = SDataUtil.InvConvertDouble(SDataUtil.Sub(eAttr,v))
  460. if value < 0 then
  461. value = 0
  462. end
  463. petActorData:SetAdditionalAttr(k, value)
  464. elseif k >= Enum.HeroAttrType.STR_Percent then
  465. local eAttr = petActorData:GetAdditionalAttrPercent(k)
  466. local value = SDataUtil.InvConvertDouble(SDataUtil.Sub(eAttr,v))
  467. if value < 0 then
  468. value = 0
  469. end
  470. petActorData:SetAdditionalAttrPercent(k, value)
  471. end
  472. end
  473. else
  474. if not petData.slots or not petData.stampSuit then return end
  475. local attrs = self:CalcPetStampAttrs2(petData.slots, petData.stampSuit)
  476. local petActorData = ManagerContainer.DataMgr.PetDataMgr:GetPetActorData(petData.id)
  477. if not petActorData then return end
  478. for k,v in pairs(attrs) do
  479. if k <= Enum.HeroAttrType.RealHurt then
  480. local eAttr = petActorData:GetAdditionalAttr(k)
  481. local value = SDataUtil.InvConvertDouble(SDataUtil.Add(eAttr,v))
  482. petActorData:SetAdditionalAttr(k, value)
  483. elseif k >= Enum.HeroAttrType.STR_Percent then
  484. local eAttr = petActorData:GetAdditionalAttrPercent(k)
  485. local value = SDataUtil.InvConvertDouble(SDataUtil.Add(eAttr,v))
  486. petActorData:SetAdditionalAttrPercent(k, value)
  487. end
  488. end
  489. end
  490. end
  491. function PetAttrData:CalcPetStampAttrs2(slots, stampSuit, isOld)
  492. local stampAttrs = {}
  493. for _,v in pairs(slots) do
  494. local stampId = v.stampId
  495. local stampData = ManagerContainer.DataMgr.PetDataMgr.petStampData:GetPetStampDataMapById(stampId)
  496. if stampData then
  497. local lv = isOld and stampData.oldLv or stampData.lv
  498. local lvCfgData = ManagerContainer.CfgMgr:GetPetEquipExpCfgDataByLvAndCfgId(lv, stampData.cfgId)
  499. for _,v1 in pairs(lvCfgData.Nature) do
  500. local key = v1[1]
  501. local val = v1[2]
  502. if not stampAttrs[key] then
  503. stampAttrs[key] = 0
  504. end
  505. stampAttrs[key] = stampAttrs[key] + val
  506. end
  507. end
  508. end
  509. local suitLv = stampSuit[1]
  510. if suitLv > 0 then
  511. local suitCfgData = ManagerContainer.CfgMgr:GetPetEquipSuitCfgDataByQuality(suitLv)
  512. for _,v1 in pairs(suitCfgData.Suit) do
  513. local key = v1[1]
  514. local val = v1[2]
  515. if not stampAttrs[key] then
  516. stampAttrs[key] = 0
  517. end
  518. if key < Enum.HeroAttrType.STR_Percent then
  519. stampAttrs[key] = stampAttrs[key] + val
  520. else
  521. stampAttrs[key] = stampAttrs[key] + val*0.0001
  522. end
  523. end
  524. end
  525. return stampAttrs
  526. end
  527. function PetAttrData:RefreshPetStampAttrs(id)
  528. local petData = self:GetPetDataById(id)
  529. if petData then
  530. self:RefreshPetStampSuit(petData)
  531. self:RefreshMasterAttr(id)
  532. end
  533. end
  534. function PetAttrData:GetAllBattlePetDatas()
  535. local list = {}
  536. for _,v in pairs(self.data.petDatas) do
  537. if v.isBattle then
  538. list[#list + 1] = v
  539. end
  540. end
  541. return list
  542. end
  543. function PetAttrData:UpdatePetExtGoShowData(petData)
  544. if not petData or petData.heroId == 0 then return end
  545. local heroData = CommonUtil.GetHeroLogicDataByUid(petData.heroId)
  546. CommonUtil.UpdatePetExtGoShowData(petData, heroData)
  547. end
  548. function PetAttrData:UpdatePetExtGoShowData1(heroData)
  549. if not heroData or heroData.battlePetId == 0 then return end
  550. local petData = self:GetPetDataById(heroData.battlePetId)
  551. CommonUtil.UpdatePetExtGoShowData(petData, heroData)
  552. end
  553. function PetAttrData:RegisterNetEvents()
  554. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_PET_LEVEL_UP_ACK, function(data)
  555. if data.error == Enum.NetErrorCode.ERROR_OK then
  556. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PET_LVUP_REFRESH_NTF)
  557. end
  558. end)
  559. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_PET_ADVANCE_ACK, function(data)
  560. if data.error == Enum.NetErrorCode.ERROR_OK then
  561. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PET_ADVENCE_REFRESH_NTF)
  562. end
  563. end)
  564. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_PET_SKILL_LEVEL_UP_ACK, function(data)
  565. if data.error == Enum.NetErrorCode.ERROR_OK then
  566. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PET_SKILLUP_SUCCESS_NTF, data.skill_id)
  567. end
  568. end)
  569. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_PET_BATTLE_ACK, function(data)
  570. if data.error == Enum.NetErrorCode.ERROR_OK then
  571. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PET_BATTLE_SUCCESS_NTF, true)
  572. elseif data.error == Enum.NetErrorCode.ERROR_PET_BATTLE_REPEATED then
  573. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PET_BATTLE_SUCCESS_NTF, false)
  574. end
  575. ManagerContainer.LuaBattleMgr:SetTeamData(true,true)
  576. ManagerContainer.RedPointMgr.PetRPCtr:RefreshTotalQiyueRPState()
  577. end)
  578. end
  579. function PetAttrData:Clear()
  580. self.data = {}
  581. if not self.data.petDatas then
  582. self.data.petDatas = {}
  583. end
  584. if not self.data.petDatasMap then
  585. self.data.petDatasMap = {}
  586. end
  587. end
  588. function PetAttrData:Destroy()
  589. if self.Clear then
  590. self:Clear()
  591. end
  592. self:UnRegisterNetEvents()
  593. end
  594. function PetAttrData:UnRegisterNetEvents()
  595. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_PET_LEVEL_UP_ACK)
  596. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_PET_ADVANCE_ACK)
  597. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_PET_SKILL_LEVEL_UP_ACK)
  598. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_PET_BATTLE_ACK)
  599. end
  600. return PetAttrData