PartnerData.lua 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397
  1. local PartnerData = class("PartnerData", require("DataBase"))
  2. local SkillData = require("SkillData")
  3. local baseAttrs
  4. local needNtfTeamBattle = true
  5. local attrDirty = false
  6. local lastTeamPetAttrs = {}
  7. local lastTeamEquipAttrs = {}
  8. local lastTeamCardAttrs = {}
  9. local lastTeamAdvenceLvs = {}
  10. local lastTeamStrengthLvs = {}
  11. local lastTeamPointAttrs = {}
  12. local lastTeamBaseAttrs = {}
  13. local lastTeamFashionAttrs = {}
  14. local lastTeamKeepSakeAttrs = {}
  15. local lastTeamSkillAttrs = {}
  16. local lastTotalAttrs = {}
  17. local battlePartnerChanged = false
  18. local partnerChangeTimer
  19. local AttrFilterList
  20. function PartnerData:ctor()
  21. self.data = {}
  22. end
  23. local function SortPartnerId(a, b)
  24. if a.id > 0 and b.id > 0 then
  25. return a.post < b.post
  26. else
  27. if a.id == b.id then
  28. return a.post < b.post
  29. else
  30. return a.id > b.id
  31. end
  32. end
  33. end
  34. function PartnerData:InitPartnerData(partnerData)
  35. local baseAttr = SInt.Convert(GlobalConfig.Instance:GetConfigIntValue(GlobalConfig.c_base_attr_id))
  36. baseAttrs = {[Enum.HeroAttrType.STR] = baseAttr, [Enum.HeroAttrType.AGI] = baseAttr, [Enum.HeroAttrType.INT] = baseAttr,
  37. [Enum.HeroAttrType.DEX] = baseAttr, [Enum.HeroAttrType.VIT] = baseAttr, [Enum.HeroAttrType.LUK] = baseAttr}
  38. if self.data.partnerData == nil then
  39. self.data.partnerData = {}
  40. end
  41. if self.data.partnerData.heroDatas == nil then
  42. self.data.partnerData.heroDatas = {}
  43. end
  44. self:RefreshPartnerDatas(partnerData.hero_data, true)
  45. end
  46. function PartnerData:RefreshPartnerDatas(heroData, isInit)
  47. local addPartnerIds = {}
  48. local addPartnerMap = {}
  49. local newBattleStatus = false
  50. local needRpRefreshIds = {}
  51. local changePetIds = {}
  52. local allPartnerDatas = ManagerContainer.CfgMgr:GetOriPartnerDatas()
  53. local list = {}
  54. for _,v in pairs(self.data.partnerData.heroDatas) do
  55. if not v.owned then
  56. v.id = 0
  57. end
  58. end
  59. if allPartnerDatas ~= nil then
  60. for _,v in pairs(allPartnerDatas) do
  61. local data = self:GetPartnerDataByOriId(v.ParterId)
  62. local isNew = false
  63. if data == nil then
  64. data = {}
  65. data.owned = false
  66. data.isBattle = false
  67. end
  68. data.changeBattle = false
  69. for _,v1 in pairs(heroData) do
  70. local oriPartnerCfgId = ManagerContainer.CfgMgr:GetOriPartnerDataByAdvenceId(v1.config_id)
  71. if v.ParterId == oriPartnerCfgId.ParterId then
  72. if data.isBattle ~= v1.is_battle then
  73. newBattleStatus = true
  74. data.changeBattle = true
  75. attrDirty = true
  76. end
  77. if not data.owned then
  78. isNew = true
  79. data.owned = true
  80. attrDirty = true
  81. end
  82. if data.battlePetId ~= v1.battle_pet_id then
  83. changePetIds[#changePetIds + 1] = v1.id
  84. attrDirty = true
  85. end
  86. local addAdvenceLv = v1.advance_level > (data.advanceLevel or 0)
  87. local addStrengthLv = v1.strength_level > (data.strengthLevel or 0)
  88. if isInit then
  89. addAdvenceLv = false
  90. addStrengthLv = false
  91. end
  92. local isTransfer = data.configId ~= v1.config_id
  93. self:InitOwnedHeroData(data, v1)
  94. --转职刷新数据
  95. if not isNew and data.owned then
  96. if isTransfer then
  97. if not LuaBattleBridge.ActorInFighting(data.id) then
  98. ManagerContainer.LuaActorDataMgr:RefreshFellowActorData(data.id, data.configId)
  99. end
  100. data.isTransferred = true
  101. lastTeamPointAttrs[data.id] = nil
  102. lastTeamBaseAttrs[data.id] = nil
  103. self:RefreshAddPointAttr(data.id)
  104. attrDirty = true
  105. lastTeamSkillAttrs[data.id] = nil
  106. lastTeamEquipAttrs[data.id] = nil
  107. lastTeamCardAttrs[data.id] = nil
  108. lastTeamPetAttrs[data.id] = nil
  109. lastTeamAdvenceLvs[data.id] = 0
  110. lastTeamStrengthLvs[data.id] = 0
  111. lastTeamFashionAttrs[data.id] = nil
  112. end
  113. --进阶刷新数据
  114. ManagerContainer.LuaActorDataMgr:SetPartnerStep(data.id,data.configId, data.advanceLevel)
  115. --重新计算属性
  116. self:InitPartnerAttr(data, addAdvenceLv, addStrengthLv)
  117. if addAdvenceLv or addStrengthLv then
  118. attrDirty = true
  119. end
  120. end
  121. if isInit then
  122. self:InitPartnerAttr(data, addAdvenceLv, addStrengthLv)
  123. end
  124. if isNew then
  125. self:RefreshAddPointAttr(v1.id)
  126. addPartnerMap[v.ParterId] = v1.id
  127. addPartnerIds[#addPartnerIds + 1] = v1.id
  128. attrDirty = true
  129. end
  130. if not CommonUtil.EleInTable(v1.id, needRpRefreshIds) then
  131. needRpRefreshIds[#needRpRefreshIds + 1] = v1.id
  132. end
  133. end
  134. end
  135. if not data.owned then
  136. self:InitUnownedHeroData(data, v)
  137. data.owned = false
  138. end
  139. data.post = v.PostId
  140. data.jobType = v.JobType
  141. list[#list + 1] = data
  142. end
  143. end
  144. for _,v in pairs(self.data.partnerData.heroDatas) do
  145. if v.owned then
  146. local oriPartnerCfg = ManagerContainer.CfgMgr:GetOriPartnerDataByAdvenceId(v.configId)
  147. for k,v1 in pairs(list) do
  148. local oriPartnerCfg1 = ManagerContainer.CfgMgr:GetOriPartnerDataByAdvenceId(v1.configId)
  149. if oriPartnerCfg1.ParterId == oriPartnerCfg.ParterId then
  150. list[k] = v
  151. if v1.id > 0 then
  152. list[k].isBattle = v1.isBattle
  153. if v1.changeBattle then
  154. ManagerContainer.RedPointMgr.HeroRPCtr:RefreshRoleSkillEquipRPById(v1.id)
  155. end
  156. end
  157. end
  158. end
  159. end
  160. end
  161. table.sort(list, SortPartnerId)
  162. self:RefreshPartnerID(list)
  163. return addPartnerMap, newBattleStatus, needRpRefreshIds,changePetIds
  164. end
  165. function PartnerData:RefreshPartnerID(list)
  166. for i = 1, #list do
  167. if list[i].id == 0 then
  168. list[i].id = i + 1
  169. list[i].slot.hero_id = list[i].id
  170. end
  171. self.data.partnerData.heroDatas[list[i].id] = list[i]
  172. end
  173. end
  174. function PartnerData:InitUnownedHeroData(data, heroData)
  175. data.id = 0
  176. data.configId = heroData.ParterId
  177. data.fightPower = SInt.Convert(heroData.InitFightPower or 0)
  178. data.avatar = 0
  179. data.isBattle = false
  180. data.baseLevel = 1
  181. data.advanceLevel = 0
  182. data.strengthLevel = 0
  183. data.attrs = CommonUtil.TableClone(baseAttrs)
  184. data.slot = {hero_id = data.id, slot_list = {}}
  185. data.treasureFree = 1
  186. data.battlePetId = 0
  187. data.skillEquipSlot = {heroId = data.id, slot_list = {}}
  188. --宠物契约
  189. data.petQiyueData = ProtocalDataNormal.ParsePetQiyueData(data.petQiyueData, heroData.pet_qiyue_data)
  190. self:UpdateHeroExtGoShowData(data)
  191. end
  192. function PartnerData:InitOwnedHeroData(data, heroData)
  193. --LogHRWarning(Inspect(heroData))
  194. data.id = heroData.id
  195. data.configId = heroData.config_id
  196. data.fightPower = SInt.Convert(heroData.fight_power or 0)
  197. data.avatar = heroData.avatar
  198. data.isBattle = heroData.is_battle
  199. data.baseLevel = heroData.base_level
  200. data.advanceLevel = heroData.advance_level or 0
  201. data.strengthLevel = heroData.strength_level or 0
  202. data.attrs = CommonUtil.TableClone(baseAttrs)
  203. data.slot = heroData.slot
  204. if #data.slot.slot_list == 0 then
  205. for i = 1, 6 do
  206. data.slot.slot_list[i] = {}
  207. data.slot.slot_list[i].level = 0
  208. data.slot.slot_list[i].equip_id = 0
  209. data.slot.slot_list[i].card_id_list = {}
  210. end
  211. end
  212. data.attrList = heroData.attr_list
  213. for _,v in pairs(data.attrList) do
  214. v.value = SInt.Convert(v.value)
  215. end
  216. data.attrPoint = SInt.Convert(heroData.attr_point)
  217. data.qualityList = {}
  218. if heroData.quality_list and #heroData.quality_list > 0 then
  219. for k, v in pairs(heroData.quality_list) do
  220. data.qualityList[v.key] = v.value
  221. end
  222. end
  223. data.battlePetId = heroData.battle_pet_id
  224. self:InitPartnerSkill(data, heroData.skill)
  225. data.treasureFree = 1
  226. data.skillEquipSlot = ProtocalDataNormal.ParseSkillEquipSlotData(data.skillEquipSlot, heroData.skill_equip_slot)
  227. --宠物契约
  228. data.petQiyueData = ProtocalDataNormal.ParsePetQiyueData(data.petQiyueData, heroData.pet_qiyue_data)
  229. LogHRWarning("refresh partner heroData "..Inspect(heroData.pet_qiyue_data).." "..Inspect(data.petQiyueData))
  230. self:UpdateHeroExtGoShowData(data)
  231. return data
  232. end
  233. function PartnerData:ChangePartnerData(data)
  234. local newData = self:GetPartnerDataById(data.config_id)
  235. if newData == nil then
  236. newData = {}
  237. newData.isBattle = false
  238. newData.owned = false
  239. end
  240. local lastBattleStatue = newData.isBattle
  241. local lastOwnStatue = newData.owned
  242. newData.id = data.id
  243. newData.configId = data.config_id
  244. --newData.fightPower = data.fight_power or 0
  245. newData.avatar = data.avatar
  246. newData.isBattle = data.is_battle
  247. newData.baseLevel = data.base_level
  248. newData.advanceLevel = data.advance_level
  249. newData.strengthLevel = data.strength_level or 0
  250. newData.slot = data.slot
  251. -- newData.skillData = data.skill
  252. self:InitPartnerSkill(newData, data.skill)
  253. if newData.attrs == nil then
  254. newData.attrs = CommonUtil.TableClone(baseAttrs)
  255. end
  256. newData.owned = true
  257. newData.treasureFree = 1
  258. ManagerContainer.LuaActorDataMgr:SetPartnerStep(newData.id,newData.configId, newData.advanceLevel)
  259. self:InitPartnerAttr(newData)
  260. self.data.partnerData.heroDatas[newData.id] = newData
  261. -- self:SetHeroSkills(newData)
  262. return lastBattleStatue ~= newData.isBattle, not lastOwnStatue and newData.owned, newData
  263. end
  264. --function PartnerData:RefreshPartnerTransfer(id)
  265. -- for k,v in pairs(self.data.partnerData.heroDatas) do
  266. -- if v.id == id then
  267. -- if not LuaBattleBridge.ActorInFighting(id) then
  268. -- ManagerContainer.LuaActorDataMgr:RefreshFellowActorData(id,v.configId)
  269. -- end
  270. --
  271. -- v.isTransferred = true
  272. --
  273. -- lastTeamPointAttrs[id] = nil
  274. -- lastTeamBaseAttrs[id] = nil
  275. -- self:RefreshAddPointAttr(id)
  276. -- attrDirty = true
  277. --
  278. -- lastTeamSkillAttrs[id] = nil
  279. -- lastTeamEquipAttrs[id] = nil
  280. -- lastTeamCardAttrs[id] = nil
  281. -- lastTeamPetAttrs[id] = nil
  282. -- lastTeamAdvenceLvs[id] = 0
  283. -- lastTeamStrengthLvs[id] = 0
  284. -- self:InitPartnerAttrById(v.id, v.advanceLevel, v.strengthLevel)
  285. -- end
  286. -- end
  287. --end
  288. function PartnerData:RefreshPartnerTreasureState(heroId, isFree)
  289. local heroData = self:GetPartnerDataByUniqueId(heroId)
  290. heroData.treasureFree = isFree and 1 or 0
  291. end
  292. function PartnerData:GetAdvenceAttrs(data, attrId, addAdvenceLv)
  293. local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  294. local stepData = ManagerContainer.CfgMgr:GetParterProgressById(cfgData.ParterJob)
  295. if data.advanceLevel == 0 then
  296. return 0
  297. end
  298. local num = 0
  299. if addAdvenceLv then
  300. local adds = CommonUtil.DeserializeCfgItemList(stepData["Attribute"..data.advanceLevel])
  301. if adds ~= nil then
  302. for k,v in pairs(adds) do
  303. if v[1] == attrId then
  304. if v[1] < Enum.HeroAttrType.STR_Percent then
  305. num = num + v[2]
  306. else
  307. num = num + v[2]*0.0001
  308. end
  309. end
  310. end
  311. end
  312. else
  313. for i = 1,data.advanceLevel do
  314. local adds = CommonUtil.DeserializeCfgItemList(stepData["Attribute"..i])
  315. if adds ~= nil then
  316. for k,v in pairs(adds) do
  317. if v[1] == attrId then
  318. if v[1] < Enum.HeroAttrType.STR_Percent then
  319. num = num + v[2]
  320. else
  321. num = num + v[2]*0.0001
  322. end
  323. end
  324. end
  325. end
  326. end
  327. end
  328. return num
  329. end
  330. function PartnerData:InitPartnerPointAttr()
  331. for _,v in pairs(self.data.partnerData.heroDatas) do
  332. if v.owned then
  333. self:RefreshAddPointAttr(v.id)
  334. end
  335. end
  336. end
  337. function PartnerData:RefreshAddPointAttr(id)
  338. if lastTeamPointAttrs[id] == nil then lastTeamPointAttrs[id] = {} end
  339. if lastTeamBaseAttrs[id] == nil then lastTeamBaseAttrs[id] = {} end
  340. local partnerData = self:GetPartnerDataByUniqueId(id)
  341. if partnerData == nil then return end
  342. local heroData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(id,partnerData.configId)
  343. for _,v in pairs(Enum.HeroAttrType) do
  344. if v <= Enum.HeroAttrType.LUK then
  345. local delta = self:GetPointAttr(id, v)
  346. if lastTeamPointAttrs[id] ~= nil and lastTeamPointAttrs[id][v] ~= nil then
  347. -- delta = self:GetPointAttr(v) - lastPointAttrs[v]
  348. delta = SDataUtil.Sub(self:GetPointAttr(id, v), lastTeamPointAttrs[id][v])
  349. end
  350. heroData:SetBaseFirstAttr(v, SDataUtil.Add(heroData:GetBaseFirstAttr(v),delta))
  351. lastTeamPointAttrs[id][v] = self:GetPointAttr(id, v)
  352. lastTeamBaseAttrs[id][v] = heroData:GetBaseFirstAttr(v)
  353. end
  354. end
  355. for _,v in pairs(Enum.HeroAttrType) do
  356. partnerData.attrs[v] = heroData:GetFinalAttr(v)
  357. end
  358. end
  359. function PartnerData:GetAllPartnerSlots()
  360. local slots = {}
  361. for k,v in pairs(self.data.partnerData.heroDatas) do
  362. local slot = v.slot
  363. if slot ~= nil then
  364. slots[slot.hero_id] = slot
  365. end
  366. end
  367. return slots
  368. end
  369. function PartnerData:GetStrengthAttrs(data, attrId, addStrengthLv)
  370. local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  371. local stepData = ManagerContainer.CfgMgr:GetParterProgressById(cfgData.ParterJob)
  372. if data.strengthLevel == 0 then
  373. return 0
  374. end
  375. local num = 0
  376. if addStrengthLv then
  377. local adds = CommonUtil.DeserializeCfgItemList(stepData["BreachAttribute"..data.strengthLevel])
  378. if adds ~= nil then
  379. for k,v in pairs(adds) do
  380. if v[1] == attrId then
  381. if v[1] < Enum.HeroAttrType.STR_Percent then
  382. num = num + v[2]
  383. else
  384. num = num + v[2]*0.0001
  385. end
  386. end
  387. end
  388. end
  389. else
  390. for i = 1,data.strengthLevel do
  391. local adds = CommonUtil.DeserializeCfgItemList(stepData["BreachAttribute"..i])
  392. if adds ~= nil then
  393. for k,v in pairs(adds) do
  394. if v[1] == attrId then
  395. if v[1] < Enum.HeroAttrType.STR_Percent then
  396. num = num + v[2]
  397. else
  398. num = num + v[2]*0.0001
  399. end
  400. end
  401. end
  402. end
  403. end
  404. end
  405. return num
  406. end
  407. function PartnerData:CalcAdvenceAttrs(fellowData, data, needRefresh, addAdvenceLv)
  408. for _,v in pairs(Enum.HeroAttrType) do
  409. local advencAttr = self:GetAdvenceAttrs(data, v, addAdvenceLv)
  410. if data.advanceLevel == lastTeamAdvenceLvs[data.id] then
  411. advencAttr = 0
  412. end
  413. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.RealHurt then
  414. -- fellowData:SetAdditionalAttr(v, fellowData:GetAdditionalAttr(v) + advencAttr)
  415. fellowData:SetAdditionalAttr(v, SDataUtil.Add(fellowData:GetAdditionalAttr(v), advencAttr))
  416. elseif v >= Enum.HeroAttrType.STR_Percent then
  417. -- fellowData:SetAdditionalAttrPercent(v, fellowData:GetAdditionalAttrPercent(v) + advencAttr)
  418. fellowData:SetAdditionalAttrPercent(v, SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v), advencAttr))
  419. end
  420. end
  421. lastTeamAdvenceLvs[data.id] = data.advanceLevel
  422. if needRefresh then
  423. for _,v in pairs(Enum.HeroAttrType) do
  424. data.attrs[v] = fellowData:GetFinalAttr(v)
  425. end
  426. end
  427. end
  428. function PartnerData:CalcStrengthAttrs(fellowData, data, needRefresh, addStrengthLv)
  429. for _,v in pairs(Enum.HeroAttrType) do
  430. local strengthAttr = self:GetStrengthAttrs(data, v, addStrengthLv)
  431. if data.strengthLevel == lastTeamStrengthLvs[data.id] then
  432. strengthAttr = 0
  433. end
  434. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.RealHurt then
  435. -- fellowData:SetAdditionalAttr(v, fellowData:GetAdditionalAttr(v) + strengthAttr)
  436. fellowData:SetAdditionalAttr(v, SDataUtil.Add(fellowData:GetAdditionalAttr(v), strengthAttr))
  437. elseif v >= Enum.HeroAttrType.STR_Percent then
  438. -- fellowData:SetAdditionalAttrPercent(v, fellowData:GetAdditionalAttrPercent(v) + strengthAttr)
  439. fellowData:SetAdditionalAttrPercent(v, SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v), strengthAttr))
  440. end
  441. end
  442. lastTeamStrengthLvs[data.id] = data.strengthLevel
  443. if needRefresh then
  444. for _,v in pairs(Enum.HeroAttrType) do
  445. data.attrs[v] = fellowData:GetFinalAttr(v)
  446. end
  447. end
  448. end
  449. function PartnerData:CalcEquipAttrs(fellowData, data, needRefresh)
  450. if data.slot ~= nil then
  451. local equipTotalAttrs = ManagerContainer.DataMgr.UserData:GetSlotsEquipAttr(data.slot.slot_list)
  452. for _,v in pairs(Enum.HeroAttrType) do
  453. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.MaxSp then
  454. fellowData:SetAdditionalAttr(v, SDataUtil.Add(fellowData:GetAdditionalAttr(v),equipTotalAttrs[v] - (lastTeamEquipAttrs[data.id] == nil and 0 or lastTeamEquipAttrs[data.id][v])))
  455. elseif v >= Enum.HeroAttrType.STR_Percent then
  456. fellowData:SetAdditionalAttrPercent(v, SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v), equipTotalAttrs[v] - (lastTeamEquipAttrs[data.id] == nil and 0 or lastTeamEquipAttrs[data.id][v])))
  457. end
  458. end
  459. lastTeamEquipAttrs[data.id] = equipTotalAttrs
  460. else
  461. for _,v in pairs(Enum.HeroAttrType) do
  462. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.MaxSp then
  463. fellowData:SetAdditionalAttr(v, fellowData:GetAdditionalAttr(v))
  464. elseif v >= Enum.HeroAttrType.STR_Percent then
  465. fellowData:SetAdditionalAttrPercent(v, fellowData:GetAdditionalAttrPercent(v))
  466. end
  467. end
  468. end
  469. if needRefresh then
  470. for _,v in pairs(Enum.HeroAttrType) do
  471. data.attrs[v] = fellowData:GetFinalAttr(v)
  472. end
  473. end
  474. end
  475. function PartnerData:CalcCardAttrs(fellowData, data, needRefresh)
  476. if data.slot ~= nil then
  477. --ManagerContainer.DataMgr.CardData:RefreshEquipedCardSuitData(data.id)
  478. local cardTotalAttrs = ManagerContainer.DataMgr.UserData:GetSlotsCardAttr(data.slot.slot_list)
  479. local state = ManagerContainer.DataMgr.CardData:GetCardSuitStateById(data.id)
  480. if state then
  481. local lv = ManagerContainer.DataMgr.CardData:GetCardSuitLvById(data.id)
  482. if lv > 0 then
  483. local suitCfgData = ManagerContainer.CfgMgr:GetCardSuitNewCfgById(lv)
  484. if suitCfgData then
  485. for i = 1, #suitCfgData.Suit1 do
  486. local attr = suitCfgData.Suit1[i]
  487. if attr then
  488. local attrId = attr[1]
  489. local attrNum = attr[2]*0.0001
  490. local mapAttrData = ManagerContainer.CfgMgr:GetFightCfgByAttrId(attrId)
  491. local newAttrId = mapAttrData.Mapping > 0 and mapAttrData.Mapping or attrId
  492. if not cardTotalAttrs[newAttrId] then
  493. cardTotalAttrs[newAttrId] = 0
  494. end
  495. if mapAttrData.Mapping > 0 then
  496. cardTotalAttrs[newAttrId] = cardTotalAttrs[newAttrId] *(1 + attrNum)
  497. else
  498. cardTotalAttrs[newAttrId] = cardTotalAttrs[newAttrId] + attrNum
  499. end
  500. end
  501. end
  502. end
  503. end
  504. end
  505. for _,v in pairs(Enum.HeroAttrType) do
  506. if cardTotalAttrs[v] ~= nil then
  507. if v < Enum.HeroAttrType.STR_Percent then
  508. local val = SDataUtil.Add(fellowData:GetAdditionalAttr(v), cardTotalAttrs[v] - (lastTeamCardAttrs[data.id] == nil and 0 or lastTeamCardAttrs[data.id][v]))
  509. fellowData:SetAdditionalAttr(v, val)
  510. else
  511. local val = SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v), cardTotalAttrs[v] - (lastTeamCardAttrs[data.id] == nil and 0 or lastTeamCardAttrs[data.id][v]))
  512. fellowData:SetAdditionalAttrPercent(v, val)
  513. end
  514. end
  515. end
  516. lastTeamCardAttrs[data.id] = cardTotalAttrs
  517. end
  518. if needRefresh then
  519. for _,v in pairs(Enum.HeroAttrType) do
  520. data.attrs[v] = fellowData:GetFinalAttr(v)
  521. end
  522. end
  523. end
  524. function PartnerData:CalcAllPartnerFashionAttrs()
  525. for _,v in pairs(self.data.partnerData.heroDatas) do
  526. if v.owned then
  527. self:CalcPartnerFashionAttrsById(v.id)
  528. end
  529. end
  530. end
  531. function PartnerData:CalcPartnerFashionAttrsById(id)
  532. local data = self:GetPartnerDataByUniqueId(id)
  533. local fellowData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(data.id,data.configId)
  534. if data and fellowData then
  535. self:CalcFashionAttrs(fellowData, data, true)
  536. end
  537. end
  538. function PartnerData:CalcFashionAttrs(fellowData, data, needRefresh)
  539. local partnerCfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  540. if not partnerCfgData then return end
  541. if not lastTeamFashionAttrs[data.id] then
  542. lastTeamFashionAttrs[data.id] = {}
  543. end
  544. local jobType = partnerCfgData.JobType
  545. local fashionTotalAttrs = ManagerContainer.DataMgr.FashionData:GetFashionAllAttrsByJobType(jobType)
  546. if not fashionTotalAttrs then return end
  547. local changeNum = 0
  548. for _,v in pairs(Enum.HeroAttrType) do
  549. if fashionTotalAttrs[v] ~= nil then
  550. if v < Enum.HeroAttrType.STR_Percent then
  551. changeNum = (fashionTotalAttrs[v] - ((lastTeamFashionAttrs[data.id] == nil or not lastTeamFashionAttrs[data.id][v]) and 0 or lastTeamFashionAttrs[data.id][v]))
  552. if changeNum ~= 0 then
  553. -- local val = heroData:GetAdditionalAttr(v) + changeNum;
  554. local val = SDataUtil.Add(fellowData:GetAdditionalAttr(v), changeNum)
  555. fellowData:SetAdditionalAttr(v, val)
  556. end
  557. else
  558. changeNum = (fashionTotalAttrs[v] - ((lastTeamFashionAttrs[data.id] == nil or not lastTeamFashionAttrs[data.id][v]) and 0 or lastTeamFashionAttrs[data.id][v]))
  559. if changeNum ~= 0 then
  560. -- local val = heroData:GetAdditionalAttrPercent(v) + changeNum * 0.0001
  561. local val = SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v), changeNum * 0.0001)
  562. fellowData:SetAdditionalAttrPercent(v, val)
  563. end
  564. end
  565. end
  566. end
  567. if needRefresh then
  568. for _,v in pairs(Enum.HeroAttrType) do
  569. data.attrs[v] = fellowData:GetFinalAttr(v)
  570. end
  571. end
  572. lastTeamFashionAttrs[data.id] = clone(fashionTotalAttrs)
  573. end
  574. function PartnerData:CalcPetAttrsById(id)
  575. local data = self:GetPartnerDataByUniqueId(id)
  576. local fellowData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(data.id,data.configId)
  577. if data and fellowData then
  578. self:CalcPetAttrs(fellowData, data, true)
  579. end
  580. end
  581. function PartnerData:CalcPetAttrs(fellowData, data, needRefresh)
  582. if not AttrFilterList then
  583. local val = GlobalConfig.Instance:GetConfigStrValue(230)
  584. if val ~= "" and val ~= nil then
  585. AttrFilterList = CommonUtil.DeserializeGlobalStrToTable(val)
  586. end
  587. end
  588. if not lastTeamPetAttrs[data.id] then
  589. lastTeamPetAttrs[data.id] = {}
  590. end
  591. local petId = data.battlePetId
  592. local petData = ManagerContainer.DataMgr.PetDataMgr:GetPetDataById(petId)
  593. local multiply = 0
  594. if petData then
  595. local petCfgData = ManagerContainer.CfgMgr:GetPetDataById(petData.cfgId)
  596. multiply = petCfgData.ConversionRate*0.0001
  597. end
  598. local petActorData = ManagerContainer.DataMgr.PetDataMgr:GetPetActorData(petId)
  599. for _,v in pairs(Enum.HeroAttrType) do
  600. if not CommonUtil.EleInTable(tostring(v), AttrFilterList) then
  601. local petAttr = petActorData and SDataUtil.Multiply(petActorData:GetFinalAttr(v), multiply) or 0
  602. if v <= Enum.HeroAttrType.RealHurt then
  603. local eAttr = fellowData:GetAdditionalAttr(v)
  604. local lastAttr = lastTeamPetAttrs[data.id][v] or 0
  605. fellowData:SetAdditionalAttr(v, SDataUtil.Sub(SDataUtil.Add(eAttr,petAttr),lastAttr))
  606. elseif v >= Enum.HeroAttrType.STR_Percent then
  607. local eAttrPercent = fellowData:GetAdditionalAttrPercent(v)
  608. local lastAttr = lastTeamPetAttrs[data.id][v] or 0
  609. fellowData:SetAdditionalAttrPercent(v, SDataUtil.Sub(SDataUtil.Add(eAttrPercent,petAttr),lastAttr))
  610. end
  611. lastTeamPetAttrs[data.id][v] = petAttr
  612. end
  613. end
  614. if needRefresh then
  615. for _,v in pairs(Enum.HeroAttrType) do
  616. data.attrs[v] = fellowData:GetFinalAttr(v)
  617. end
  618. end
  619. end
  620. function PartnerData:CalcSkillAttrs(fellowData, data, needRefresh)
  621. local skillTotalAttrs = data.skillData and data.skillData:GetUnlockSkillAttrs() or {}
  622. local lastSkillAttrs = lastTeamSkillAttrs[data.id]
  623. local attrValue = nil
  624. local changeNum = nil
  625. local isChanged = false
  626. for _,v in pairs(Enum.HeroAttrType) do
  627. attrValue = skillTotalAttrs[v]
  628. if not attrValue then attrValue = 0 end
  629. changeNum = attrValue - ((lastSkillAttrs == nil or not lastSkillAttrs[v]) and 0 or lastSkillAttrs[v])
  630. if changeNum ~= 0 then
  631. if v < Enum.HeroAttrType.STR_Percent then
  632. -- local val = fellowData:GetAdditionalAttr(v) + changeNum
  633. local val = SDataUtil.Add(fellowData:GetAdditionalAttr(v),changeNum)
  634. fellowData:SetAdditionalAttr(v, val)
  635. else
  636. -- local val = fellowData:GetAdditionalAttrPercent(v) + changeNum
  637. local val = SDataUtil.Add(fellowData:GetAdditionalAttrPercent(v),changeNum)
  638. fellowData:SetAdditionalAttrPercent(v, val)
  639. end
  640. isChanged = true
  641. end
  642. end
  643. if needRefresh then
  644. for _,v in pairs(Enum.HeroAttrType) do
  645. data.attrs[v] = fellowData:GetFinalAttr(v)
  646. end
  647. end
  648. lastTeamSkillAttrs[data.id] = skillTotalAttrs
  649. if isChanged then
  650. attrDirty = true
  651. end
  652. return isChanged
  653. end
  654. function PartnerData:CalcKeepSakeAttrs(fellowData, data, needRefresh)
  655. local keepsakeMaps = ManagerContainer.DataMgr.KeepSakeBookData:GetKeepSakeMaps()
  656. local partnerCfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  657. local addAttrs = {}
  658. for k,v in pairs(keepsakeMaps) do
  659. local cfgData = ManagerContainer.CfgMgr:GetKeepSakeCfgDataById(k)
  660. if cfgData and CommonUtil.EleInTable(partnerCfgData.JobType, cfgData.Job) then
  661. local attrs = cfgData["AddAttrLevel"..v]
  662. if attrs then
  663. for i = 1,#attrs do
  664. local attrId = attrs[i][1]
  665. local val1 = attrs[i][2]
  666. if not addAttrs[attrId] then
  667. addAttrs[attrId] = 0
  668. end
  669. addAttrs[attrId] = addAttrs[attrId] + (attrId > 21 and val1*0.0001 or val1)
  670. end
  671. end
  672. end
  673. end
  674. if not lastTeamKeepSakeAttrs[data.id] then
  675. lastTeamKeepSakeAttrs[data.id] = {}
  676. end
  677. for k,v in pairs(addAttrs) do
  678. if k <= Enum.HeroAttrType.RealHurt then
  679. local eAttr = fellowData:GetAdditionalAttr(k)
  680. local lastAttr = (lastTeamKeepSakeAttrs == nil and 0 or (lastTeamKeepSakeAttrs[data.id][k] or 0))
  681. fellowData:SetAdditionalAttr(k, SDataUtil.Sub(SDataUtil.Add(eAttr,v),lastAttr))
  682. elseif k >= Enum.HeroAttrType.STR_Percent then
  683. local eAttrPercent = fellowData:GetAdditionalAttrPercent(k)
  684. local lastAttr = (lastTeamKeepSakeAttrs == nil and 0 or (lastTeamKeepSakeAttrs[data.id][k] or 0))
  685. fellowData:SetAdditionalAttrPercent(k, SDataUtil.Sub(SDataUtil.Add(eAttrPercent,v),lastAttr))
  686. end
  687. end
  688. lastTeamKeepSakeAttrs[data.id] = addAttrs
  689. if needRefresh then
  690. for k,v in pairs(Enum.HeroAttrType) do
  691. data.attrs[v] = fellowData:GetFinalAttr(v)
  692. end
  693. end
  694. end
  695. function PartnerData:AddKeepSakeLvUpAttrs(keepsakeId, lv)
  696. if not lv then return end
  697. local cfgData = ManagerContainer.CfgMgr:GetKeepSakeCfgDataById(keepsakeId)
  698. local addAttrs = {}
  699. if cfgData then
  700. local attrs = cfgData["AddAttrLevel"..lv]
  701. if attrs then
  702. for i = 1,#attrs do
  703. local attrId = attrs[i][1]
  704. local val1 = attrs[i][2]
  705. if not addAttrs[attrId] then
  706. addAttrs[attrId] = 0
  707. end
  708. addAttrs[attrId] = addAttrs[attrId] + (attrId > 21 and val1*0.0001 or val1)
  709. end
  710. end
  711. if lv > 1 then
  712. attrs = cfgData["AddAttrLevel"..(lv - 1)]
  713. if attrs then
  714. for i = 1,#attrs do
  715. local attrId = attrs[i][1]
  716. local val1 = attrs[i][2]
  717. if not addAttrs[attrId] then
  718. addAttrs[attrId] = 0
  719. end
  720. addAttrs[attrId] = addAttrs[attrId] - (attrId > 21 and val1*0.0001 or val1)
  721. end
  722. end
  723. end
  724. else
  725. return
  726. end
  727. for i = 2, 6 do
  728. local fellowData = self:GetPartnerDataByUniqueId(i)
  729. if fellowData and fellowData.owned then
  730. local fellowActorData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(fellowData.id,fellowData.configId)
  731. local partnerCfgData = ManagerContainer.CfgMgr:GetPartnerDataById(fellowData.configId)
  732. if CommonUtil.EleInTable(partnerCfgData.JobType, cfgData.Job) then
  733. for k,v in pairs(addAttrs) do
  734. if k <= Enum.HeroAttrType.RealHurt then
  735. local eAttr = fellowActorData:GetAdditionalAttr(k)
  736. lastTeamKeepSakeAttrs[i][k] = (lastTeamKeepSakeAttrs[i][k] or 0) + v
  737. fellowActorData:SetAdditionalAttr(k, SDataUtil.Add(eAttr,v))
  738. elseif k >= Enum.HeroAttrType.STR_Percent then
  739. local eAttrPercent = fellowActorData:GetAdditionalAttrPercent(k)
  740. lastTeamKeepSakeAttrs[i][k] = (lastTeamKeepSakeAttrs[i][k] or 0) + v
  741. fellowActorData:SetAdditionalAttrPercent(k, SDataUtil.Add(eAttrPercent,v))
  742. end
  743. end
  744. for k,v in pairs(addAttrs) do
  745. fellowData.attrs[k] = fellowActorData:GetFinalAttr(k)
  746. end
  747. end
  748. end
  749. end
  750. end
  751. function PartnerData:InitPartnerAttrById(id, addAdvenceLv, addStrengthLv)
  752. local data = self:GetPartnerDataByUniqueId(id)
  753. self:InitPartnerAttr(data, addAdvenceLv, addStrengthLv)
  754. end
  755. function PartnerData:InitPartnerAttr(data, addAdvenceLv, addStrengthLv)
  756. local fellowData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(data.id,data.configId)
  757. fellowData.Level = data.baseLevel
  758. fellowData.StrengthLevel = data.strengthLevel
  759. lastTotalAttrs[data.id] = CommonUtil.TableClone(data.attrs)
  760. self:CalcSkillAttrs(fellowData, data, false)
  761. self:CalcAdvenceAttrs(fellowData, data, false, addAdvenceLv)
  762. self:CalcStrengthAttrs(fellowData, data, false, addStrengthLv)
  763. self:CalcEquipAttrs(fellowData, data, false)
  764. self:CalcCardAttrs(fellowData, data, false)
  765. self:CalcFashionAttrs(fellowData, data, false)
  766. self:CalcPetAttrs(fellowData, data, false)
  767. self:CalcKeepSakeAttrs(fellowData, data, true)
  768. ManagerContainer.LuaActorAttributeMgr:SyncServerActorData(fellowData)
  769. end
  770. function PartnerData:InitPartnerSkill(data, skill)
  771. local skillData = data.skillData
  772. if not skillData then
  773. skillData = SkillData:new()
  774. data.skillData = skillData
  775. end
  776. skillData:InitData(skill)
  777. end
  778. function PartnerData:SaveLastTotalAttr()
  779. for _,v in pairs(self.data.partnerData.heroDatas) do
  780. lastTotalAttrs[v.id] = CommonUtil.TableClone(v.attrs)
  781. end
  782. end
  783. function PartnerData:GetLastTotalAttrs(id)
  784. return lastTotalAttrs[id]
  785. end
  786. function PartnerData:GetPartnerDataBySlotIndex(id)
  787. for _, v in pairs(self.data.partnerData.heroDatas) do
  788. if v.id == id then
  789. return v
  790. end
  791. end
  792. return nil
  793. end
  794. function PartnerData:InitPartnerAttrFromBattle()
  795. for _, v in pairs(self.data.partnerData.heroDatas) do
  796. if v.owned then
  797. self:InitPartnerAttr(v)
  798. end
  799. --LogError(Inspect(v))
  800. end
  801. end
  802. function PartnerData:InitPartnerAttrById(id)
  803. for _, v in pairs(self.data.partnerData.heroDatas) do
  804. if v.id == id then
  805. self:InitPartnerAttr(v)
  806. return
  807. end
  808. end
  809. end
  810. function PartnerData:GetPartnerDatas()
  811. if self.data then
  812. if self.data.partnerData then
  813. return self.data.partnerData.heroDatas
  814. end
  815. end
  816. return nil
  817. end
  818. function PartnerData:SortPartnerData()
  819. local partnerDatas = self:GetPartnerDatas()
  820. local sortedPartnerDatas = {}
  821. for _,v in pairs(partnerDatas) do
  822. sortedPartnerDatas[#sortedPartnerDatas + 1] = v
  823. end
  824. table.sort(sortedPartnerDatas, function (a, b)
  825. if a.owned and b.owned then
  826. return a.post < b.post
  827. else
  828. if a.owned and not b.owned then
  829. return true
  830. elseif not a.owned and b.owned then
  831. return false
  832. else
  833. return a.post < b.post
  834. end
  835. end
  836. end)
  837. return sortedPartnerDatas
  838. end
  839. function PartnerData:GetOwnedPartnerCount()
  840. local count = 0
  841. for _, v in pairs(self.data.partnerData.heroDatas) do
  842. if v.owned then
  843. count = count + 1
  844. end
  845. end
  846. return count
  847. end
  848. function PartnerData:GetBattlePartnerDatas(userAttrsChanged, ignore)
  849. if not userAttrsChanged and not ignore then
  850. if not attrDirty then return nil end
  851. end
  852. local list = {}
  853. for _, v in pairs(self.data.partnerData.heroDatas) do
  854. if v.isBattle and v.owned then
  855. local index = ManagerContainer.DataMgr.UserData:GetSlotIndexByHeroId(v.id)
  856. local petId = v.battlePetId
  857. local petData = ManagerContainer.DataMgr.PetDataMgr:GetPetDataById(petId)
  858. local count = ManagerContainer.LuaActorDataMgr:GetFellowActorDataCountByUid(v.id)
  859. v.isTransferred = count > 1
  860. local data = {
  861. uid = v.id,
  862. id = v.configId,
  863. lv = v.baseLevel,
  864. advanceLevel = v.advanceLevel,
  865. -- skills = self:GetHeroUsedSkill(v),
  866. skills = v.skillData:GetUsedSkills(),
  867. buffs = ManagerContainer.DataMgr.UserData:GetCardBuffs(index),
  868. role = false,
  869. mainRole = false,
  870. isTransferred = v.isTransferred or false,
  871. petId = petId > 0 and petId + Enum.ActorUidField.Pet or 0,
  872. petBaseId = petData and petData.cfgId or 0,
  873. }
  874. list[#list + 1] = data
  875. --神器技能替换
  876. CommonUtil.ReplaceBattleSkillBySkillEquip(v, data.skills)
  877. lastTeamAdvenceLvs[v.id] = v.advanceLevel
  878. lastTeamStrengthLvs[v.id] = v.strengthLevel
  879. --lastTeamEquipAttrs[v.id] = lastTeamEquipAttrs[v.id]
  880. --lastTeamCardAttrs[v.id] = lastTeamCardAttrs[v.id]
  881. v.isTransferred = false
  882. end
  883. end
  884. attrDirty = false
  885. return list
  886. end
  887. function PartnerData:GetAllPartnerTeamDatas()
  888. local list = {}
  889. for _, v in pairs(self.data.partnerData.heroDatas) do
  890. if v.owned then
  891. local index = ManagerContainer.DataMgr.UserData:GetSlotIndexByHeroId(v.id)
  892. list[#list + 1] =
  893. {
  894. uid = v.id,
  895. id = v.configId,
  896. lv = v.baseLevel,
  897. advanceLevel = v.advanceLevel,
  898. skills = v.skillData:GetUsedSkills(),
  899. -- skills = self:GetHeroUsedSkill(v),
  900. buffs = ManagerContainer.DataMgr.UserData:GetCardBuffs(index)
  901. }
  902. end
  903. end
  904. return list
  905. end
  906. function PartnerData:GetPartnerDataById(id)
  907. for _,v in pairs(self.data.partnerData.heroDatas) do
  908. if v.configId == id then
  909. return v
  910. end
  911. end
  912. return nil
  913. end
  914. function PartnerData:GetPartnerDataByOriId(id)
  915. for _,v in pairs(self.data.partnerData.heroDatas) do
  916. local oriPartnerCfgId = ManagerContainer.CfgMgr:GetOriPartnerDataByAdvenceId(v.configId)
  917. if oriPartnerCfgId.ParterId == id then
  918. return v
  919. end
  920. end
  921. return nil
  922. end
  923. function PartnerData:GetPartnerDataByUniqueId(id)
  924. for _,v in pairs(self.data.partnerData.heroDatas) do
  925. if v.id == id then
  926. return v
  927. end
  928. end
  929. return nil
  930. end
  931. --出战角色获取
  932. function PartnerData:GetPartnersDataByInBattle()
  933. local tbBattlePartner = {}
  934. for _,v in pairs(self.data.partnerData.heroDatas) do
  935. if v.isBattle and v.owned then
  936. table.insert(tbBattlePartner,v)
  937. end
  938. end
  939. return tbBattlePartner
  940. end
  941. function PartnerData:PartnerDataChangeLv(id, lv)
  942. for _,v in pairs(self.data.partnerData.heroDatas) do
  943. if v.id == id then
  944. v.baseLevel = lv
  945. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerLvUpNotify(v.id)
  946. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_LV_CHANGED, id)
  947. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_TRAIN_ATTRS)
  948. return
  949. end
  950. end
  951. end
  952. function PartnerData:PartnerDataChangeAdvencLv(id, lv)
  953. for _,v in pairs(self.data.partnerData.heroDatas) do
  954. if v.id == id then
  955. v.advanceLevel = lv
  956. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerLvUpNotify(v.id)
  957. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ADVENCE_SUCCESS)
  958. return
  959. end
  960. end
  961. end
  962. function PartnerData:RegisterNetEvents()
  963. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_ROLE_HERO_INFO_NTF, function(data)
  964. local addParterMap, battleStatus, needRpRefreshIds, changePetIds = self:RefreshPartnerDatas(data.hero_data)
  965. if #needRpRefreshIds > 0 then
  966. for _,v in pairs(needRpRefreshIds) do
  967. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerRedPointNotifyById(v)
  968. end
  969. ManagerContainer.RedPointMgr.HeroRPCtr:RefreshRoleCardRP()
  970. end
  971. if battleStatus then
  972. battlePartnerChanged = true
  973. end
  974. if next(addParterMap) ~= nil then
  975. for k,v in pairs(addParterMap) do
  976. local id = v
  977. local heroData = self:GetPartnerDataByUniqueId(id)
  978. self:InitPartnerAttr(heroData)
  979. end
  980. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_EQUIP_REFRESH)
  981. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.MAIN_UI_ROLE_REDPOINT_NOTICE)
  982. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_PARTER_ADD, addParterMap)
  983. end
  984. if battlePartnerChanged and partnerChangeTimer == nil then
  985. partnerChangeTimer = ManagerContainer.LuaTimerMgr:AddTimer(100, 1, self, self.SetTeamData, nil)
  986. end
  987. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.HERO_LIST_CHANGE_NOTICE)
  988. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ROLE_UI_REDPOINT_CHANGE)
  989. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.SKILL_EQUIP_RP_REFRESH)
  990. end)
  991. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_LEVEL_UP_ACK, function(data)
  992. if data.error == Enum.NetErrorCode.ERROR_OK then
  993. self:PartnerDataChangeLv(data.hero_id, data.hero_level)
  994. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerAttrRPNotify(data.hero_id)
  995. end
  996. end)
  997. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_ADVANCE_ACK, function(data)
  998. if data.error == Enum.NetErrorCode.ERROR_OK then
  999. self:PartnerDataChangeAdvencLv(data.hero_id, data.advance_level)
  1000. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerAttrRPNotify(data.hero_id)
  1001. end
  1002. end)
  1003. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_BATTLE_ACK, function(data)
  1004. if data.error == Enum.NetErrorCode.ERROR_OK then
  1005. ManagerContainer.LuaBattleMgr:SetTeamData(true,true)
  1006. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PARTNER_BATTLE_REQ_SUCCESS)
  1007. end
  1008. end)
  1009. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_STRENGTH_ACK, function(data)
  1010. if data.error == Enum.NetErrorCode.ERROR_OK then
  1011. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerStrengthNotify(data.hero_id)
  1012. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerAttrRPNotify(data.hero_id)
  1013. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PARTNER_STRENGTH_SUCCESS)
  1014. end
  1015. end)
  1016. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_HERO_ACTIVE_ACK, function(data)
  1017. if data.error == Enum.NetErrorCode.ERROR_OK then
  1018. ManagerContainer.LuaBattleMgr:SetTeamData(true,true)
  1019. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.PARTNER_ACTIVE_SUCCESS, data.hero_id)
  1020. ManagerContainer.RedPointMgr.HeroRPCtr:PartnerRecruitNotify()
  1021. end
  1022. end)
  1023. end
  1024. function PartnerData:SetTeamData()
  1025. if not ManagerContainer.LuaUIMgr:IsInRoleUI() then
  1026. ManagerContainer.LuaBattleMgr:SetTeamData()
  1027. end
  1028. partnerChangeTimer = nil
  1029. battlePartnerChanged = false
  1030. end
  1031. function PartnerData:Clear()
  1032. if partnerChangeTimer ~= nil then
  1033. ManagerContainer.LuaTimerMgr:RemoveTimer(partnerChangeTimer)
  1034. partnerChangeTimer = nil
  1035. end
  1036. if self.data.partnerData and self.data.partnerData.heroDatas then
  1037. for _,v in pairs(self.data.partnerData.heroDatas) do
  1038. ManagerContainer.LuaActorDataMgr:DeleteActorDataById(v.id)
  1039. end
  1040. end
  1041. needNtfTeamBattle = true
  1042. attrDirty = false
  1043. lastTeamPetAttrs = {}
  1044. lastTeamEquipAttrs = {}
  1045. lastTeamCardAttrs = {}
  1046. lastTeamAdvenceLvs = {}
  1047. lastTeamStrengthLvs = {}
  1048. lastTeamPointAttrs = {}
  1049. lastTeamBaseAttrs = {}
  1050. lastTeamSkillAttrs = {}
  1051. lastTotalAttrs = {}
  1052. self.data = {}
  1053. end
  1054. function PartnerData:Destroy()
  1055. if self.Clear then
  1056. self:Clear()
  1057. end
  1058. self:UnRegisterNetEvents()
  1059. end
  1060. function PartnerData:UnRegisterNetEvents()
  1061. --ManagerContainer.NetManager:UnRegisterPbNameCallback("SC_ROLE_HERO_INFO_NTF")
  1062. --ManagerContainer.NetManager:UnRegisterPbNameCallback("SC_HERO_LEVEL_UP_ACK")
  1063. --ManagerContainer.NetManager:UnRegisterPbNameCallback("SC_HERO_ADVANCE_ACK")
  1064. --ManagerContainer.NetManager:UnRegisterPbNameCallback("CS_HERO_BATTLE_ACK")
  1065. end
  1066. -- function PartnerData:SetHeroSkills(hero)
  1067. -- local dirty = false
  1068. -- if hero.skills == nil then
  1069. -- hero.skills = {}
  1070. -- end
  1071. -- local parternCfg = ManagerContainer.CfgMgr:GetPartnerDataById(hero.configId)
  1072. -- if parternCfg == nil then
  1073. -- return
  1074. -- end
  1075. -- local paternStepCfg = ManagerContainer.CfgMgr:GetParterProgressById(hero.configId)
  1076. -- if paternStepCfg == nil then
  1077. -- return
  1078. -- end
  1079. -- local openSkill = paternStepCfg.OpenSkill
  1080. -- local initialSkillId = parternCfg.InitialSkill
  1081. -- if initialSkillId > 0 then
  1082. -- local lv,maxLv,nextPTLv = self:GetSkillLvInfo(paternStepCfg,hero.baseLevel,1)
  1083. -- local skill = self:GetHeroSkillById(hero.skills,initialSkillId)
  1084. -- if skill == nil then
  1085. -- skill = SkillItem:new(initialSkillId,lv,true,0);
  1086. -- skill.maxLevel = maxLv
  1087. -- hero.skills[#hero.skills+1] = skill
  1088. -- else
  1089. -- if skill.level ~= lv then
  1090. -- dirty = true
  1091. -- end
  1092. -- skill:SetLevel(lv)
  1093. -- skill.maxLevel = maxLv
  1094. -- end
  1095. -- skill.nextLevelPartenrLv = nextPTLv
  1096. -- end
  1097. -- for i = 1, #openSkill do
  1098. -- local skillId = openSkill[i]
  1099. -- if skillId~= nil and skillId > 0 then
  1100. -- local lv,maxLv,nextPTLv = self:GetSkillLvInfo(paternStepCfg,hero.baseLevel,i+1)
  1101. -- local skill = self:GetHeroSkillById(hero.skills,skillId)
  1102. -- local unlock = hero.advanceLevel >= i;
  1103. -- if skill == nil then
  1104. -- skill = SkillItem:new(skillId,lv,unlock,0);
  1105. -- skill.maxLevel = maxLv
  1106. -- hero.skills[#hero.skills+1] = skill
  1107. -- else
  1108. -- skill:SetLevel(lv)
  1109. -- skill.maxLevel = maxLv
  1110. -- end
  1111. -- skill.nextLevelPartenrLv = nextPTLv
  1112. -- if unlock then
  1113. -- skill:Unlock()
  1114. -- else
  1115. -- skill.unlockCondition = i
  1116. -- end
  1117. -- end
  1118. -- end
  1119. -- if dirty then
  1120. -- ManagerContainer.LuaBattleMgr:UpdateTeamSkills()
  1121. -- end
  1122. -- ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_PARTENR_SKILL_REFRESH,hero.configId)
  1123. -- end
  1124. -- function PartnerData:GetHeroSkillById(skillList,skillId)
  1125. -- if skillList == nil then
  1126. -- return nil
  1127. -- end
  1128. -- for idx =1,#skillList do
  1129. -- local skill = skillList[idx]
  1130. -- if skill.skillId == skillId then
  1131. -- return skill
  1132. -- end
  1133. -- end
  1134. -- return nil
  1135. -- end
  1136. function PartnerData:GetHeroUsedSkill(hero)
  1137. if hero == nil or hero.skills == nil then
  1138. return nil
  1139. end
  1140. local usedSkills = {}
  1141. for i =1, #hero.skills do
  1142. local skill = hero.skills[i]
  1143. if skill.isUnlocked then
  1144. usedSkills[#usedSkills+1] = {skillId = skill.skillId, lv = skill.level}
  1145. end
  1146. end
  1147. return usedSkills
  1148. end
  1149. function PartnerData:GetSkillLvInfo(paternStepCfg,heroLv,skillIdx)
  1150. if paternStepCfg == nil then
  1151. return 1,1
  1152. end
  1153. if skillIdx > #paternStepCfg.SkillUp then
  1154. return 1,1
  1155. end
  1156. local temp = paternStepCfg.SkillUp[skillIdx]
  1157. if temp == nil then
  1158. return 1,1
  1159. end
  1160. local lv = 1
  1161. local maxLv = 1 + #temp
  1162. local nextPTLv = heroLv
  1163. for i = 1, #temp do
  1164. if heroLv >= temp[i] then
  1165. lv = lv + 1
  1166. else
  1167. nextPTLv = temp[i]
  1168. break
  1169. end
  1170. end
  1171. return lv, maxLv,nextPTLv
  1172. end
  1173. function PartnerData:GetHeroLv(id)
  1174. local partnerData = self:GetPartnerDataByUniqueId(id)
  1175. return partnerData and partnerData.baseLevel or 0
  1176. end
  1177. function PartnerData:GetHeroQuality(id)
  1178. local partnerData = self:GetPartnerDataByUniqueId(id)
  1179. return partnerData and partnerData.strengthLevel or 0
  1180. end
  1181. function PartnerData:GetHeroIsBattle(id)
  1182. local partnerData = self:GetPartnerDataByUniqueId(id)
  1183. return partnerData and partnerData.isBattle or false
  1184. end
  1185. function PartnerData:GetHeroCfgId(id)
  1186. local partnerData = self:GetPartnerDataByUniqueId(id)
  1187. return partnerData and partnerData.configId or 0
  1188. end
  1189. function PartnerData:GeSkillData(id)
  1190. local partnerData = self:GetPartnerDataByUniqueId(id)
  1191. return partnerData and partnerData.skillData or nil
  1192. end
  1193. function PartnerData:OnJobSkillDataChanged(id)
  1194. local data = self:GetPartnerDataByUniqueId(id)
  1195. if not data then return false end
  1196. if not data.owned then return false end
  1197. local fellowData = ManagerContainer.LuaActorDataMgr:GetFellowActorData(data.id,data.configId)
  1198. fellowData.Level = data.baseLevel
  1199. return self:CalcSkillAttrs(fellowData, data, true)
  1200. end
  1201. function PartnerData:GetLastBaseAttrs(id)
  1202. return lastTeamBaseAttrs[id]
  1203. end
  1204. function PartnerData:GetRoleDataAttrPoints(id)
  1205. for k,v in pairs(self.data.partnerData.heroDatas) do
  1206. if v.id == id then
  1207. return v.attrPoint
  1208. end
  1209. end
  1210. return 0
  1211. end
  1212. function PartnerData:GetPointAttr(id, type)
  1213. for k,v in pairs(self.data.partnerData.heroDatas) do
  1214. if v.id == id and v.owned then
  1215. for _,v1 in pairs(v.attrList) do
  1216. if v1.key == type then
  1217. return v1.value
  1218. end
  1219. end
  1220. end
  1221. end
  1222. return 0
  1223. end
  1224. function PartnerData:UpdateHeroExtGoShowData(heroData)
  1225. CommonUtil.UpdateHeroExtGoShowData(heroData)
  1226. end
  1227. return PartnerData