LuaActorAttributeMgr.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. local LuaActorAttributeMgr = class('LuaActorAttributeMgr')
  2. local AttributeData = require('ActorAttributeData')
  3. function LuaActorAttributeMgr:ctor()
  4. self.tbListData = {}
  5. self.tbSyncActorRef = {}
  6. self.listCb = {}
  7. self:RegisterNetEvents()
  8. --LogError("LuaActorAttributeMgr:ctor")
  9. end
  10. function LuaActorAttributeMgr:Clear()
  11. self.tbListData = {}
  12. self.tbSyncActorRef = {}
  13. self.listCb = {}
  14. --LogError("LuaActorAttributeMgr:Clear")
  15. end
  16. function LuaActorAttributeMgr:Destroy()
  17. self:UnRegisterNetEvents()
  18. --LogError("LuaActorAttributeMgr:Destroy")
  19. self.tbListData = {}
  20. self.tbSyncActorRef = {}
  21. self.listCb = {}
  22. end
  23. function LuaActorAttributeMgr:RegisterNetEvents()
  24. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_ACTOR_ATTR_GET_ACK, self.OnGetAttrAck, self)
  25. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_ACTOR_ATTR_GET_NTF, self.OnGetAttrNTF, self)
  26. end
  27. function LuaActorAttributeMgr:UnRegisterNetEvents()
  28. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_ACTOR_ATTR_GET_ACK)
  29. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_ACTOR_ATTR_GET_NTF)
  30. end
  31. function LuaActorAttributeMgr:GenerateId()
  32. local i = 1
  33. for k,v in pairs(self.listCb) do
  34. if v.Cb then
  35. i = i + 1
  36. else
  37. return v.Id
  38. end
  39. end
  40. return i
  41. end
  42. function LuaActorAttributeMgr:InsertCb(OkCb)
  43. local Id = self:GenerateId()
  44. self.listCb[Id] = {Id = Id, Cb = OkCb}
  45. return Id
  46. end
  47. function LuaActorAttributeMgr:ClearCb(Key)
  48. if Key then
  49. for k,v in pairs(self.listCb) do
  50. if v and v.Id == Key then
  51. v.Cb = nil
  52. end
  53. end
  54. end
  55. end
  56. function LuaActorAttributeMgr:ExecuteSycnCb()
  57. for k,v in pairs(self.listCb) do
  58. if v.Cb then
  59. v.Cb()
  60. end
  61. end
  62. self.listCb = {}
  63. end
  64. -----server msg
  65. function LuaActorAttributeMgr:SendAttrReq()
  66. local Senddata =
  67. {
  68. is_all_battle = true,
  69. actor_list =
  70. {
  71. }
  72. }
  73. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_ACTOR_ATTR_GET_REQ, Senddata)
  74. end
  75. function LuaActorAttributeMgr:InitData(actor_id,is_hero,attr_list)
  76. local Data = self:GetOrCreateData(actor_id,is_hero_pet)
  77. for k,v in pairs(attr_list) do
  78. Data:SetAttribute( v.key,v.value)
  79. end
  80. end
  81. function LuaActorAttributeMgr:OnGetAttrAck(data)
  82. --LogError("OnGetAttrAck"..Inspect(data))
  83. self:SetAllData(data.actor_attr_list)
  84. self:SyncActorAttrProcess(false)
  85. self:ExecuteSycnCb()
  86. end
  87. function LuaActorAttributeMgr:OnGetAttrNTF(Svrdatas)
  88. --LogError("OnGetAttrNTF"..Inspect(Svrdatas.actor_attr_list))
  89. self:ClearData()
  90. self:SetAllData(Svrdatas.actor_attr_list)
  91. self:SyncActorAttrProcess(true)
  92. end
  93. --------------
  94. function LuaActorAttributeMgr:SetAllData(Svrdatas)
  95. if nil ~= Svrdatas then
  96. for k,v in pairs(Svrdatas) do
  97. self:SetOrRefreshData(v)
  98. end
  99. end
  100. end
  101. function LuaActorAttributeMgr:SetOrRefreshData(Svrdata)
  102. if nil== Svrdata.attr_list then
  103. return
  104. end
  105. local Data = self:GetOrCreateData(Svrdata.actor_id,Svrdata.is_hero_pet)
  106. local test = {}
  107. for k,v in pairs(Svrdata.attr_list) do
  108. test[#test+1] = {key = v.key,value = v.value}
  109. end
  110. table.sort(
  111. test,
  112. function(Attr1, Attr2)
  113. return Attr1.key < Attr2.key
  114. end
  115. )
  116. --LogError(Inspect(test))
  117. --LogError("Pre"..Inspect(Data))
  118. for k,v in pairs(Svrdata.attr_list) do
  119. Data:SetAttribute( v.key,v.value)
  120. end
  121. --LogError("Finish"..Inspect(Data))
  122. end
  123. function LuaActorAttributeMgr:GetOrCreateData(Actorid,IsHero)
  124. local Data = self:TryGetData(Actorid,IsHero)
  125. if nil == Data then
  126. Data = AttributeData:new()
  127. Data.is_hero_pet = IsHero
  128. Data.actor_id = Actorid
  129. --LogError("Insert "..tostring(Actorid))
  130. table.insert(self.tbListData,Data)
  131. end
  132. return Data
  133. end
  134. function LuaActorAttributeMgr:ClearData()
  135. self.tbListData = {}
  136. end
  137. function LuaActorAttributeMgr:TryGetData(Actorid,IsHero)
  138. if #self.tbListData <= 0 then
  139. return nil
  140. else
  141. for i=1,#self.tbListData do
  142. local Data = self.tbListData[i]
  143. if tostring(Data.actor_id) == tostring(Actorid) and Data.is_hero_pet == IsHero then
  144. --LogError("Reurn ok")
  145. return Data
  146. end
  147. end
  148. end
  149. return nil
  150. end
  151. --请求角色属性
  152. function LuaActorAttributeMgr:OnCheckActorCb(NeedGetActor)
  153. local Senddata =
  154. {
  155. is_all_battle = false,
  156. actor_list = {}
  157. }
  158. for i=1,#NeedGetActor do
  159. local IsHero = NeedGetActor[i].IsHero
  160. local Id = NeedGetActor[i].Id
  161. table.insert( Senddata.actor_list,{is_hero_pet = IsHero,actor_id = tostring(Id),attr_list = {}})
  162. end
  163. --LogError("Send...OnCheckActorCb.."..Inspect(Senddata))
  164. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_ACTOR_ATTR_GET_REQ, Senddata)
  165. end
  166. function LuaActorAttributeMgr:SyncServerActorDataByArray(ActorDatas,Okcb)
  167. local NeedReqData = {}
  168. if nil == ActorDatas then
  169. return
  170. end
  171. for i = 0, ActorDatas.Length-1 do
  172. local pActor = ActorDatas[i]
  173. table.insert(self.tbSyncActorRef,pActor)
  174. local Id = pActor:GetuId()
  175. local PetId = pActor.PetId
  176. local AtrrSvr = self:TryGetData(Id,not pActor.IsPet)
  177. if nil == AtrrSvr then
  178. table.insert(NeedReqData,{Id = Id,IsHero = not pActor.IsPet})
  179. end
  180. if nil ~= PetId and PetId ~= 0 then
  181. local pActorPet = ManagerContainer.LuaActorDataMgr:GetPetDataById(PetId)
  182. if nil ~= pActorPet then
  183. table.insert(self.tbSyncActorRef,pActorPet)
  184. local AtrrPetSvr = self:TryGetData(PetId - Enum.ActorUidField.Pet,false)
  185. if nil == AtrrPetSvr then
  186. table.insert(NeedReqData,{Id = PetId - Enum.ActorUidField.Pet,IsHero = false})
  187. end
  188. end
  189. end
  190. end
  191. if #NeedReqData > 0 then
  192. --LogError("不存在")
  193. local Cbid = 0
  194. if nil ~= Okcb then
  195. Cbid = self:InsertCb(Okcb)
  196. end
  197. self:OnCheckActorCb(NeedReqData)--需要请求数据
  198. return Cbid
  199. else
  200. -- LogError("已存在")
  201. self:SyncActorAttrProcess(false)
  202. if nil ~= Okcb then
  203. Okcb()--无需请求数据
  204. end
  205. end
  206. end
  207. function LuaActorAttributeMgr:SyncServerActorDataByTb(ActorDatas,Okcb)
  208. local NeedReqData = {}
  209. if nil == ActorDatas then
  210. return
  211. end
  212. for i = 1, #ActorDatas do
  213. local pActor = ActorDatas[i]
  214. table.insert(self.tbSyncActorRef,pActor)
  215. local Id = pActor:GetuId()
  216. local PetId = pActor.PetId
  217. local AtrrOnline = self:TryGetData(Id,not pActor.IsPet)
  218. if nil == AtrrOnline then
  219. table.insert(NeedReqData,{Id = Id,IsHero = not pActor.IsPet})
  220. end
  221. if nil ~= PetId and PetId ~= 0 then
  222. local pActorPet = ManagerContainer.LuaActorDataMgr:GetPetDataById(PetId)
  223. if nil ~= pActorPet then
  224. table.insert(self.tbSyncActorRef,pActorPet)
  225. local AtrrOnline = self:TryGetData(PetId - Enum.ActorUidField.Pet,false)
  226. if nil == AtrrOnline then
  227. table.insert(NeedReqData,{Id = PetId - Enum.ActorUidField.Pet,IsHero = false})
  228. end
  229. end
  230. end
  231. end
  232. if #NeedReqData > 0 then
  233. --LogError("不存在 服务器获取")
  234. local Cbid = 0
  235. if nil ~= Okcb then
  236. Cbid = self:InsertCb(Okcb)
  237. end
  238. self:OnCheckActorCb(NeedReqData)--需要请求数据
  239. return Cbid
  240. else
  241. --LogError("存在 刷新")
  242. self:SyncActorAttrProcess(false)
  243. if nil ~= Okcb then
  244. Okcb()--无需请求数据
  245. end
  246. end
  247. end
  248. function LuaActorAttributeMgr:SyncServerActorData(ActorData,Okcb)
  249. local NeedReqData = {}
  250. if nil == ActorData then
  251. return
  252. end
  253. local pActor = ActorData
  254. local Id = pActor:GetuId()
  255. if pActor.IsPet then
  256. local AtrrPetSvr = self:TryGetData(Id - Enum.ActorUidField.Pet,false)
  257. if nil == AtrrPetSvr then
  258. table.insert(NeedReqData,{Id = Id - Enum.ActorUidField.Pet,IsHero = false})
  259. table.insert(self.tbSyncActorRef,pActor)
  260. end
  261. else
  262. local AtrrSvr = self:TryGetData(Id,true)
  263. if nil == AtrrSvr then
  264. table.insert(NeedReqData,{Id = Id,IsHero = true})
  265. table.insert(self.tbSyncActorRef,pActor)
  266. end
  267. end
  268. if #NeedReqData > 0 then
  269. --LogError("不存在")
  270. local Cbid = 0
  271. if nil ~= Okcb then
  272. Cbid = self:InsertCb(Okcb)
  273. end
  274. self:OnCheckActorCb(NeedReqData)--需要请求数据
  275. return Cbid
  276. else
  277. --LogError("已存在")
  278. self:SyncActorAttrProcess(false)
  279. if nil ~= Okcb then
  280. Okcb()--无需请求数据
  281. end
  282. end
  283. end
  284. function LuaActorAttributeMgr:SetServerActorToLocalActor(ActorData)
  285. if nil ~= self.tbListData then
  286. for i=1,#self.tbListData do
  287. local Data = self.tbListData[i]
  288. local ActorId = Data.actor_id
  289. local IsHero = Data.is_hero_pet
  290. if not IsHero then
  291. ActorId = ActorId + Enum.ActorUidField.Pet
  292. end
  293. if nil ~= ActorData then
  294. if tostring(ActorData:GetuId()) == tostring(ActorId) then
  295. local tbKeys = Data:GetAllAttributeKey()
  296. ActorData:ResetServerSecondAttr()
  297. --LogError("set Actor "..tostring(ActorId).." "..Inspect(tbKeys))
  298. for j=1,#tbKeys do
  299. local Key =tbKeys[j]
  300. --LogError("set"..tostring(Key))
  301. local value = Data:GetAttribute(Key)
  302. --LogError("set Key".. tostring(Key).. "set value " .. tostring(value))
  303. ActorData:SetServerSecondAttr(Key,value)
  304. end
  305. return true
  306. end
  307. end
  308. end
  309. end
  310. return false
  311. end
  312. --同步服务器战斗属性
  313. function LuaActorAttributeMgr:SyncActorAttrProcess(IsNotyfy)
  314. if #self.tbSyncActorRef > 0 then--主动请求同步的
  315. local tbNewSyncActor = {}
  316. for i=1, #self.tbSyncActorRef do
  317. local IsFinished = self:SetServerActorToLocalActor(self.tbSyncActorRef[i])
  318. if not IsFinished and nil ~= self.tbSyncActorRef[i] then
  319. table.insert(tbNewSyncActor,self.tbSyncActorRef[i])
  320. end
  321. end
  322. self.tbSyncActorRef = tbNewSyncActor
  323. end
  324. local TbLastAttriDiffrent = {}--修改前的属性
  325. local TbAddAttriDiffrent = {}--记录同步前后的增加属性
  326. if IsNotyfy then--服务器通知的
  327. --同步 LuaActorDataMgr 里属性
  328. if nil ~= self.tbListData then
  329. for i=1,#self.tbListData do
  330. local Data = self.tbListData[i]
  331. local ActorId = Data.actor_id
  332. local IsHero = Data.is_hero_pet
  333. local ActorData = nil
  334. if IsHero then
  335. ActorData = ManagerContainer.LuaActorDataMgr:GetActorsById(ActorId)
  336. else
  337. ActorId = ActorId + Enum.ActorUidField.Pet
  338. ActorData = ManagerContainer.LuaActorDataMgr:GetPetDataById(ActorId)
  339. end
  340. if nil ~= ActorData then
  341. local tbKeys = Data:GetAllAttributeKey()
  342. local OldData = AttributeData:new()
  343. local DiffrenceData = AttributeData:new()
  344. OldData.is_hero_pet = Data.is_hero_pet
  345. OldData.actor_id = Data.actor_id
  346. DiffrenceData.is_hero_pet = Data.is_hero_pet
  347. DiffrenceData.actor_id = Data.actor_id
  348. --save old
  349. for j=1,#tbKeys do
  350. local Key = tbKeys[j]
  351. local value = SDataUtil.InvConvert(ActorData:GetFinalAttr(Key)or 0);
  352. OldData:SetAttribute(Key,value)
  353. table.insert( TbLastAttriDiffrent,OldData )
  354. end
  355. --cal Diffrence
  356. for j=1,#tbKeys do
  357. local Key = tbKeys[j]
  358. local value = Data:GetAttribute(Key)
  359. local oldvalue = OldData:GetAttribute(Key)
  360. if Key >= 7 and Key <= 21 then--记录2级属性变化
  361. if value > oldvalue then
  362. DiffrenceData:SetAttribute(Key,value - oldvalue)
  363. end
  364. end
  365. end
  366. table.insert( TbAddAttriDiffrent,DiffrenceData )
  367. --set new
  368. ActorData:ResetServerSecondAttr()
  369. for j=1,#tbKeys do
  370. local Key = tbKeys[j]
  371. local value = Data:GetAttribute(Key)
  372. ActorData:SetServerSecondAttr(Key,value)
  373. end
  374. end
  375. end
  376. end
  377. end
  378. -- LogError("New"..Inspect(self.tbListData))
  379. -- LogError("Old"..Inspect(TbLastAttriDiffrent))
  380. -- LogError("Dif"..Inspect(TbAddAttriDiffrent))
  381. --暂时不用 使用原有OLDATTR 赋值
  382. -- if #TbAddAttriDiffrent > 0 then-- 通知显示变更差
  383. -- for i=1,#TbAddAttriDiffrent do
  384. -- local Data = TbAddAttriDiffrent[i]
  385. -- local IsHero = Data.is_hero_pet
  386. -- local ActorId = Data.actor_id
  387. -- local tbKeys = Data:GetAllAttributeKey()
  388. -- for j=1,#tbKeys do
  389. -- local Key = tbKeys[j]
  390. -- local value = Data:GetAttribute(Key)
  391. -- --LogError("Dif Key=".. tostring(Key).." Value = "..tostring(value))
  392. -- end
  393. -- end
  394. -- end
  395. --保存修改前属性
  396. ManagerContainer.DataMgr.UserData:SaveLastTotalAttr()
  397. ManagerContainer.DataMgr.PartnerData:SaveLastTotalAttr()
  398. --之后 改变(下面推送刷新 改为监听)
  399. --刷新UserData .Attr
  400. ManagerContainer.DataMgr.UserData:RefreshAddPointAttr()
  401. ManagerContainer.DataMgr.PartnerData:InitPartnerPointAttr()
  402. --刷新UI界面属性
  403. if IsNotyfy then
  404. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.ACTOR_SERVER_CHANGE_ATTRS,TbAddAttriDiffrent)
  405. end
  406. end
  407. function LuaActorAttributeMgr:SyncServerActorDataToLocal()
  408. local teams = ManagerContainer.DataMgr.UserData:GetTeamData(true)
  409. local ourActors = System.Array.CreateInstance(Enum.TypeInfo.ActorData, #teams)
  410. for i = 1 , #teams do
  411. local actor = ManagerContainer.LuaActorDataMgr:GetActorsById(teams[i].uid,teams[i].id)
  412. ourActors[i-1] = actor
  413. end
  414. self:SyncServerActorDataByArray(ourActors)
  415. end
  416. function LuaActorAttributeMgr:GetSvrSencondAttrValueById(id,Key)
  417. if nil ~= self.tbListData then
  418. for i=1,#self.tbListData do
  419. local Data = self.tbListData[i]
  420. local ActorId = Data.actor_id
  421. if tostring(id) == tostring(ActorId) then
  422. local tbKeys = Data:GetAllAttributeKey()
  423. for j=1,#tbKeys do
  424. local AtrrKey =tbKeys[j]
  425. if tostring(AtrrKey) == tostring(Key) then
  426. local value = Data:GetAttribute(AtrrKey)
  427. return value
  428. end
  429. end
  430. end
  431. end
  432. end
  433. end
  434. return LuaActorAttributeMgr