CreateActorSystem.lua 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  1. local CreateActorSystem = class("CreateActorSystem")
  2. local LuaToCSData = require("LuaToCSData")
  3. local ProtocalDataNormal = require("ProtocalDataNormal")
  4. local AttrFilterList
  5. function CreateActorSystem:ctor()
  6. tbChangePetId = {}
  7. end
  8. function CreateActorSystem:CreateAllPetActorDatas(battle_pet_list)
  9. if self.heroData then
  10. self:CreatePetActorDatas(self.heroData.battlePetId, battle_pet_list)
  11. end
  12. if self.fellewDatas then
  13. for k,v in pairs(self.fellewDatas) do
  14. self:CreatePetActorDatas(v.battlePetId, battle_pet_list)
  15. end
  16. end
  17. if self.petActorDatas then
  18. for k,v in pairs(self.petActorDatas) do
  19. local petData = self.petDatas[k]
  20. if petData then
  21. local heroId = petData.heroId
  22. if heroId > 0 then
  23. if heroId == 1 then
  24. if self.heroActorData then
  25. self.heroActorData:SetPet(v)
  26. end
  27. else
  28. if self.fellewActorDatas and self.fellewActorDatas[heroId] then
  29. self.fellewActorDatas[heroId]:SetPet(v)
  30. end
  31. end
  32. self:SetSvrCalAttrs(v,petData)
  33. end
  34. end
  35. end
  36. end
  37. end
  38. function CreateActorSystem:UpdatePetExtGoShowData(petData)
  39. if not petData or petData.heroId == 0 then return end
  40. local heroData = self:GetHeroDataById(petData.heroId)
  41. CommonUtil.UpdatePetExtGoShowData(petData, heroData)
  42. end
  43. function CreateActorSystem:CreatePetActorDatas(id, battlePetList)
  44. if self.petDatas == nil then
  45. self.petDatas = {}
  46. end
  47. if self.petActorDatas == nil then
  48. self.petActorDatas = {}
  49. end
  50. if id == 0 or not battlePetList then return end
  51. for _,v in pairs(battlePetList) do
  52. if id == v.id then
  53. local petData = ProtocalDataNormal.ParsePetData(v)
  54. if petData then
  55. self.petDatas[v.id] = petData
  56. end
  57. self:UpdatePetExtGoShowData(petData)
  58. local actorParam = LuaToCSData.CreatePetActorParamData(petData)
  59. local actorData = ActorData.CreatePetActor(actorParam)
  60. if actorData then
  61. self.petActorDatas[v.id] = actorData
  62. actorData:SetStep(petData.advanceLevel)
  63. self:AddPetAdvenceAttrs(petData.cfgId, petData.advanceLevel, actorData)
  64. end
  65. return
  66. end
  67. end
  68. end
  69. function CreateActorSystem:AddPetAdvenceAttrs(cfgId, advLv, actorData)
  70. local cfgData = ManagerContainer.CfgMgr:GetPetProgressCfgDataById(cfgId)
  71. if not cfgData then
  72. return
  73. end
  74. if not actorData then
  75. return
  76. end
  77. for i = 1, advLv do
  78. local attrs = cfgData["Attribute"..i]
  79. if not attrs then
  80. return
  81. end
  82. for _,v in pairs(attrs) do
  83. local key = v[1]
  84. local val = v[2]
  85. if key <= Enum.HeroAttrType.RealHurt then
  86. local eAttr = actorData:GetAdditionalAttr(key)
  87. actorData:SetAdditionalAttr(key, SDataUtil.Add(eAttr,val))
  88. elseif key >= Enum.HeroAttrType.STR_Percent then
  89. local eAttr = actorData:GetAdditionalAttrPercent(key)
  90. actorData:SetAdditionalAttrPercent(key, SDataUtil.Add(eAttr,val * 0.0001))
  91. end
  92. end
  93. end
  94. end
  95. function CreateActorSystem:GetUserId()
  96. return self.userData.uid
  97. end
  98. function CreateActorSystem:GetUserHeadIcon()
  99. return self.userData.headPortraitName
  100. end
  101. function CreateActorSystem:GetUserNickname()
  102. return self.userData.nickName
  103. end
  104. function CreateActorSystem:GetPlayerActorParam()
  105. if nil ~= self.PetBossActor then --有变身ID 返回变身ID
  106. return self.PetBossActor
  107. end
  108. return self.heroActorData
  109. end
  110. function CreateActorSystem:GetFellowActorParam()
  111. return self.fellewActorDatas
  112. end
  113. function CreateActorSystem:GetPetActorDataByUid(uid)
  114. return self.petActorDatas and self.petActorDatas[uid] or nil
  115. end
  116. --- 创建主角ActorParam
  117. function CreateActorSystem:CreatePlayerActorData()
  118. if not self.heroData then return nil end
  119. local actorParam = LuaToCSData.CreateActorParamData(self.heroData, self.heroData.skillData, self.heroData.buffs, self.userData, self.userData.viewData)
  120. local actorData = ActorData.CreatePlayerActor(actorParam)
  121. return actorData
  122. end
  123. ---创建伙伴ActorParam
  124. function CreateActorSystem:CreateFellowActorData()
  125. local fellowActorDatas = {}
  126. for k,v in pairs(self.fellewDatas) do
  127. local actorParam = LuaToCSData.CreateActorParamData(v, v.skillData, v.buffs)
  128. fellowActorDatas[k] = ActorData.CreateFellowActor(actorParam)
  129. end
  130. return fellowActorDatas
  131. end
  132. --根据data数据找寻Actordata
  133. function CreateActorSystem:FindFellowActorDataByData(fellewDatas)
  134. for k,v in pairs(self.fellewActorDatas) do
  135. if fellewDatas.id == v.ID then
  136. return self.fellewActorDatas[k]
  137. end
  138. end
  139. return nil
  140. end
  141. function CreateActorSystem:CreateRobotFightInfo(userData)
  142. local heroDatas = {}
  143. local robotCfg = ManagerContainer.CfgMgr:GetRobotDataByCfgId(userData.uid)
  144. if not robotCfg then
  145. userData.inited = false
  146. return heroDatas
  147. end
  148. userData.nickName = robotCfg.RobotName
  149. userData.headPortraitId = robotCfg.RobotHeadPortrait
  150. userData.configId = robotCfg.RobotAvatar
  151. userData.arenaLevelId = robotCfg.ArenaLevelId
  152. userData.level = robotCfg.RobotLevel
  153. userData.avatar = robotCfg.RobotAvatar
  154. userData.roleCfgId = CommonUtil.JobIdToRoleId(userData.configId, userData.gender)
  155. local power = math.random(robotCfg.FightPower[1], robotCfg.FightPower[2])
  156. userData.fightPower = power
  157. userData.inited = true
  158. --heroDatas[1] = ProtocalDataNormal.ParseRobotHeroData(1, userData.configId, robotCfg, true, true)
  159. for i = 1, 4 do
  160. heroDatas[i] = ProtocalDataNormal.ParseRobotHeroData(i, robotCfg.PartnerId[i - 1], robotCfg)
  161. end
  162. return heroDatas
  163. end
  164. function CreateActorSystem:CalcHeroAttrs()
  165. if self.heroData == nil then return end
  166. --需先清空 原有属性
  167. self.heroActorData:ResetBaseFirstAttr()
  168. self.heroActorData:ResetAdditionalAttr()
  169. self.heroActorData:ResetAdditionalAttrPercent()
  170. self:CalcHeroAddPointAttr()
  171. self:CalcEquipAttrs(self.heroActorData, self.heroData)
  172. if not self.userData.isRobot and self.fashionMap then --不是机器人并且有时装信息
  173. self:CalcFashionAttrs(self.heroActorData, self.heroData)
  174. end
  175. self:CalcCardAttrs(self.heroActorData, self.heroData)
  176. self:CalcSkillAttrs(self.heroActorData, self.heroData)
  177. self:CalcPetAttrs(self.heroActorData, self.heroData)
  178. self:SetSvrCalAttrs(self.heroActorData,self.heroData)
  179. end
  180. function CreateActorSystem:CalcFellewAttrs()
  181. --LogError("=======CalcFellewAttrs======="..Inspect(self.fellewDatas))
  182. for k,v in pairs(self.fellewActorDatas) do
  183. --需先清空 原有属性
  184. v:ResetBaseFirstAttr()
  185. v:ResetAdditionalAttr()
  186. v:ResetAdditionalAttrPercent()
  187. --LogError("=======CalcFellewAttrs======= k = "..k.." ============= v = "..Inspect(v))
  188. self:SetSvrCalAttrs(v,self.fellewDatas[k])
  189. self:CalcFellewAddPointAttr(v, self.fellewDatas[k])
  190. self:CalcAdvenceAttrs(v, self.fellewDatas[k])
  191. self:CalcStrengthAttrs(v, self.fellewDatas[k])
  192. self:CalcEquipAttrs(v, self.fellewDatas[k])
  193. self:CalcCardAttrs(v, self.fellewDatas[k])
  194. self:CalcSkillAttrs(v, self.fellewDatas[k])
  195. self:CalcPetAttrs(v, self.fellewDatas[k])
  196. end
  197. end
  198. function CreateActorSystem:CalcHeroAddPointAttr()
  199. local actorData = self.heroActorData
  200. for _,v in pairs(Enum.HeroAttrType) do
  201. if v <= Enum.HeroAttrType.LUK then
  202. local delta = self:GetPointAttr(v)
  203. actorData:SetBaseFirstAttr(v, SDataUtil.Add(actorData:GetBaseFirstAttr(v),delta))
  204. end
  205. end
  206. for _,v in pairs(Enum.HeroAttrType) do
  207. self.heroData.attrs[v] = actorData:GetAttr(v)
  208. end
  209. end
  210. function CreateActorSystem:CalcFellewAddPointAttr(actorData, heroData)
  211. for _,v in pairs(Enum.HeroAttrType) do
  212. if v <= Enum.HeroAttrType.LUK then
  213. local delta = self:GetFellowPointAttr(heroData, v)
  214. actorData:SetBaseFirstAttr(v, SDataUtil.Add(actorData:GetBaseFirstAttr(v),delta))
  215. end
  216. end
  217. for _,v in pairs(Enum.HeroAttrType) do
  218. heroData.attrs[v] = actorData:GetAttr(v)
  219. end
  220. end
  221. function CreateActorSystem:GetPointAttr(type)
  222. for _,v in pairs(self.heroData.attrList) do
  223. if v.key == type then
  224. return v.value
  225. end
  226. end
  227. return 0
  228. end
  229. function CreateActorSystem:GetFellowPointAttr(herodata, type)
  230. if herodata.attrList then
  231. for _,v in pairs(herodata.attrList) do
  232. if v.key == type then
  233. return v.value
  234. end
  235. end
  236. end
  237. return 0
  238. end
  239. function CreateActorSystem:CalcEquipAttrs(actorData, heroData)
  240. local slots = heroData.slot.slot_list
  241. local equipTotalAttrs = self:GetSlotsEquipAttr(slots)
  242. for _,v in pairs(Enum.HeroAttrType) do
  243. if v <= Enum.HeroAttrType.RealHurt then
  244. -- actorData:SetAdditionalAttr(v, actorData:GetAdditionalAttr(v) + equipTotalAttrs[v])
  245. actorData:SetAdditionalAttr(v, SDataUtil.Add(actorData:GetAdditionalAttr(v), equipTotalAttrs[v]))
  246. elseif v >= Enum.HeroAttrType.STR_Percent then
  247. -- actorData:SetAdditionalAttrPercent(v, actorData:GetAdditionalAttrPercent(v) + equipTotalAttrs[v])
  248. actorData:SetAdditionalAttrPercent(v, SDataUtil.Add(actorData:GetAdditionalAttrPercent(v), equipTotalAttrs[v]))
  249. end
  250. end
  251. end
  252. function CreateActorSystem:GetSlotsEquipAttr(slots)
  253. if slots == nil then return nil end
  254. local baseAttrs = {}
  255. for _,v in pairs(Enum.HeroAttrType) do
  256. baseAttrs[v] = 0
  257. end
  258. local suitIds = {}
  259. local suitCounts = {}
  260. local refineSuitLv = CommonUtil.GetMinRefineLevel(slots)
  261. for i = 1,#slots do
  262. if slots[i].equip_id > 0 then
  263. local suitNum = CommonUtil.GetSuitNum(slots, i)
  264. local equipCfgData = ManagerContainer.CfgMgr:GetEquipById(slots[i].equip_id)
  265. local refineData = ManagerContainer.CfgMgr:GetEquipRefineDataByLv(slots[i].level)
  266. for k,v in pairs(Enum.HeroAttrType) do
  267. if equipCfgData[k] and equipCfgData[k] ~= 0 then
  268. if v < Enum.HeroAttrType.STR_Percent then
  269. local refineAdd = equipCfgData[k]*(refineData ~= nil and ((refineData.Result + 100)*0.01) or 1)
  270. baseAttrs[Enum.HeroAttrType[k]] = baseAttrs[Enum.HeroAttrType[k]] + refineAdd
  271. end
  272. end
  273. if refineSuitLv > 0 then
  274. for j = refineSuitLv, 1, -1 do
  275. local data = ManagerContainer.CfgMgr:GetEquipRefineDataByLv(j)
  276. local refineEff = data["Suit"]
  277. if refineEff ~= nil and #refineEff > 0 and refineEff[1] == Enum.HeroAttrType[k] then
  278. if v >= Enum.HeroAttrType.STR_Percent then
  279. baseAttrs[Enum.HeroAttrType[k]] = baseAttrs[Enum.HeroAttrType[k]] + refineEff[1]
  280. end
  281. end
  282. end
  283. end
  284. end
  285. if equipCfgData.Suit > 0 and not CommonUtil.EleInTable(equipCfgData.Suit, suitIds) then
  286. suitIds[#suitIds + 1] = equipCfgData.Suit
  287. suitCounts[equipCfgData.Suit] = math.floor(suitNum/2)
  288. end
  289. end
  290. end
  291. for i = 1,#suitIds do
  292. local suitCfgData = ManagerContainer.CfgMgr:GetEquipSuitById(suitIds[i])
  293. for j = 1, suitCounts[suitIds[i]] do
  294. if suitCfgData["Suit"..j] ~= nil then
  295. for k, v in pairs(suitCfgData["Suit"..j]) do
  296. if type(v) == "table" then
  297. if baseAttrs[v[1]] == nil then
  298. baseAttrs[v[1]] = v[2]
  299. else
  300. baseAttrs[v[1]] = baseAttrs[v[1]] + v[2]
  301. end
  302. else
  303. if baseAttrs[suitCfgData["Suit"..j][1]] == nil then
  304. baseAttrs[suitCfgData["Suit"..j][1]] = suitCfgData["Suit"..j][2]
  305. else
  306. baseAttrs[suitCfgData["Suit"..j][1]] = baseAttrs[suitCfgData["Suit"..j][1]] + suitCfgData["Suit"..j][2]
  307. end
  308. break
  309. end
  310. end
  311. end
  312. end
  313. end
  314. for k, v in pairs(Enum.HeroAttrType) do
  315. if v >= Enum.HeroAttrType.STR_Percent then
  316. baseAttrs[v] = baseAttrs[v]*0.0001
  317. end
  318. end
  319. for k, v in pairs(Enum.HeroAttrType) do
  320. if v < Enum.HeroAttrType.STR_Percent then
  321. baseAttrs[v] = baseAttrs[v]*(1 + baseAttrs[v + 30])
  322. end
  323. end
  324. for k, v in pairs(Enum.HeroAttrType) do
  325. if v >= Enum.HeroAttrType.STR_Percent then
  326. baseAttrs[v] = 0
  327. end
  328. end
  329. return baseAttrs
  330. end
  331. function CreateActorSystem:CalcCardAttrs(actorData, heroData)
  332. local slots = heroData.slot.slot_list
  333. local cardTotalAttrs = self:GetSlotsCardAttr(slots)
  334. local cardData = self:RefreshEquipedCardSuitData(heroData.id)
  335. if cardData and cardData[4] then
  336. if cardData[1] > 0 then
  337. local suitCfgData = ManagerContainer.CfgMgr:GetCardSuitNewCfgById(cardData[1])
  338. if suitCfgData then
  339. for i = 1, #suitCfgData.Suit1 do
  340. local attr = suitCfgData.Suit1[i]
  341. if attr then
  342. local attrId = attr[1]
  343. local attrNum = attr[2]*0.0001
  344. local mapAttrData = ManagerContainer.CfgMgr:GetFightCfgByAttrId(attrId)
  345. local newAttrId = mapAttrData.Mapping > 0 and mapAttrData.Mapping or attrId
  346. if not cardTotalAttrs[newAttrId] then
  347. cardTotalAttrs[newAttrId] = 0
  348. end
  349. if mapAttrData.Mapping > 0 then
  350. cardTotalAttrs[newAttrId] = cardTotalAttrs[newAttrId] *(1 + attrNum)
  351. else
  352. cardTotalAttrs[newAttrId] = cardTotalAttrs[newAttrId] + attrNum
  353. end
  354. end
  355. end
  356. end
  357. end
  358. end
  359. for _,v in pairs(Enum.HeroAttrType) do
  360. if cardTotalAttrs[v] ~= nil then
  361. if v < Enum.HeroAttrType.STR_Percent then
  362. -- local val = actorData:GetAdditionalAttr(v) + cardTotalAttrs[v];
  363. local val = SDataUtil.Add(actorData:GetAdditionalAttr(v), cardTotalAttrs[v])
  364. actorData:SetAdditionalAttr(v, val)
  365. else
  366. -- local val = actorData:GetAdditionalAttrPercent(v) + cardTotalAttrs[v];
  367. local val = SDataUtil.Add(actorData:GetAdditionalAttrPercent(v), cardTotalAttrs[v])
  368. actorData:SetAdditionalAttrPercent(v, val)
  369. end
  370. end
  371. end
  372. for _,v in pairs(Enum.HeroAttrType) do
  373. heroData.attrs[v] = actorData:GetFinalAttr(v)
  374. end
  375. end
  376. function CreateActorSystem:GetSlotsCardAttr(slots)
  377. if slots == nil then return nil end
  378. local baseAttrs = {}
  379. for _,v in pairs(Enum.HeroAttrType) do
  380. baseAttrs[v] = 0
  381. end
  382. for i = 1,#slots do
  383. local cardList = slots[i].card_id_list
  384. for _,v in pairs(cardList) do
  385. if v > 0 then
  386. local cardData = ManagerContainer.CfgMgr:GetCardDataById(v)
  387. for _,v1 in pairs(CommonUtil.DeserializeCfgItemList(cardData.Attribute1)) do
  388. if v1[1] < Enum.HeroAttrType.STR_Percent then
  389. baseAttrs[v1[1]] = baseAttrs[v1[1]] + v1[2]
  390. else
  391. baseAttrs[v1[1]] = baseAttrs[v1[1]] + v1[2]*0.0001
  392. end
  393. end
  394. end
  395. end
  396. end
  397. return baseAttrs
  398. end
  399. function CreateActorSystem:GetAllAttrs()
  400. return self.heroData.attrs
  401. end
  402. function CreateActorSystem:GetAllFinalAttr()
  403. local attrs = {}
  404. for _,v in pairs(Enum.HeroAttrType) do
  405. attrs[v] = self.heroActorData:GetFinalAttr(v)
  406. end
  407. return attrs
  408. end
  409. function CreateActorSystem:CalcSkillAttrs(actorData, heroData)
  410. local skillTotalAttrs = heroData.skillData:GetUnlockSkillAttrs()
  411. for _,v in pairs(Enum.HeroAttrType) do
  412. if skillTotalAttrs[v] ~= nil then
  413. if v < Enum.HeroAttrType.STR_Percent then
  414. -- local val = actorData:GetAdditionalAttr(v) + skillTotalAttrs[v];
  415. local val = SDataUtil.Add(actorData:GetAdditionalAttr(v), skillTotalAttrs[v])
  416. actorData:SetAdditionalAttr(v, val)
  417. else
  418. -- local val = actorData:GetAdditionalAttrPercent(v) + skillTotalAttrs[v];
  419. local val = SDataUtil.Add(actorData:GetAdditionalAttrPercent(v), skillTotalAttrs[v])
  420. actorData:SetAdditionalAttrPercent(v, val)
  421. end
  422. end
  423. end
  424. for _,v in pairs(Enum.HeroAttrType) do
  425. heroData.attrs[v] = actorData:GetFinalAttr(v)
  426. end
  427. end
  428. function CreateActorSystem:SetSvrCalAttrs(actorData, heroData)
  429. actorData:ResetServerSecondAttr()
  430. if nil ~= heroData.battle_attr_list then
  431. --LogError("===============acId".. tostring(actorData.ID) .. "set svr "..Inspect(heroData.battle_attr_list))
  432. for k,v in pairs(heroData.battle_attr_list) do
  433. --LogError(k.."=============== v.value = "..Inspect(v.value).." ==== v.key = "..v.key)
  434. actorData:SetServerSecondAttr(v.key,v.value)
  435. end
  436. end
  437. end
  438. function CreateActorSystem:CalcPetAttrs(actorData, heroData)
  439. if not AttrFilterList then
  440. local val = GlobalConfig.Instance:GetConfigStrValue(230)
  441. if val ~= "" and val ~= nil then
  442. AttrFilterList = CommonUtil.DeserializeGlobalStrToTable(val)
  443. end
  444. end
  445. local petId = heroData.battlePetId
  446. --保存的ID 没有加 宠物区域 + Enum.ActorUidField.Pet(需后续查看战斗ID)
  447. local petActorData = self:GetPetActorDataByUid(petId)
  448. if petActorData == nil then
  449. return
  450. end
  451. local petCfgData = ManagerContainer.CfgMgr:GetPetDataById(petActorData.BaseId)
  452. local multiply = petCfgData.ConversionRate*0.0001
  453. for _,v in pairs(Enum.HeroAttrType) do
  454. if not CommonUtil.EleInTable(tostring(v), AttrFilterList) then
  455. local petAttr = petActorData and SDataUtil.Multiply(petActorData:GetFinalAttr(v), multiply) or 0
  456. if v <= Enum.HeroAttrType.RealHurt then
  457. local eAttr = actorData:GetAdditionalAttr(v)
  458. actorData:SetAdditionalAttr(v, SDataUtil.Add(eAttr,petAttr))
  459. elseif v >= Enum.HeroAttrType.STR_Percent then
  460. local eAttrPercent = actorData:GetAdditionalAttrPercent(v)
  461. actorData:SetAdditionalAttrPercent(v, SDataUtil.Add(eAttrPercent,petAttr))
  462. end
  463. end
  464. end
  465. for _,v in pairs(Enum.HeroAttrType) do
  466. heroData.attrs[v] = actorData:GetFinalAttr(v)
  467. end
  468. end
  469. function CreateActorSystem:InitFashionData(data)
  470. if not data then return; end
  471. local fashion_list = data.fashion_list
  472. local fashionMap = {}
  473. local cfgMgr = ManagerContainer.CfgMgr
  474. local cfgId, fashionData
  475. if fashion_list then
  476. for i = 1, #fashion_list do
  477. cfgId = fashion_list[i]
  478. local fashionCfgData = cfgMgr:GetFashionById(cfgId)
  479. if not fashionCfgData then
  480. LogError("[Wboy] .. ".. cfgId .. " 时装ID不存在")
  481. else
  482. fashionData = { cfgId = cfgId, isNew = false }
  483. fashionMap[cfgId] = fashionData
  484. end
  485. end
  486. end
  487. self.fashionMap = fashionMap
  488. end
  489. function CreateActorSystem:CalcFashionAttrs(_heroActorData)
  490. --local heroData = _heroActorData
  491. --local heroLogicData = self:GetHeroData()
  492. --local fashionMap = self.fashionMap
  493. --local fashionTotalAttrs = CommonUtil.GetFashionAttrMap(fashionMap)
  494. --local changeNum = 0
  495. --for _,v in pairs(Enum.HeroAttrType) do
  496. -- if fashionTotalAttrs[v] ~= nil then
  497. -- if v < Enum.HeroAttrType.STR_Percent then
  498. -- changeNum = fashionTotalAttrs[v]
  499. -- if changeNum ~= 0 then
  500. -- -- local val = heroData:GetAdditionalAttr(v) + changeNum;
  501. -- local val = SDataUtil.Add(heroData:GetAdditionalAttr(v),changeNum)
  502. -- heroData:SetAdditionalAttr(v, val)
  503. -- end
  504. -- else
  505. -- changeNum = fashionTotalAttrs[v]
  506. -- if changeNum ~= 0 then
  507. -- -- local val = heroData:GetAdditionalAttrPercent(v) + changeNum * 0.0001
  508. -- local val = SDataUtil.Add(heroData:GetAdditionalAttrPercent(v),changeNum * 0.0001)
  509. -- heroData:SetAdditionalAttrPercent(v, val)
  510. -- end
  511. -- end
  512. -- end
  513. --end
  514. --
  515. --for _,v in pairs(Enum.HeroAttrType) do
  516. -- heroLogicData.attrs[v] = heroData:GetFinalAttr(v)
  517. --end
  518. end
  519. function CreateActorSystem:CalcAdvenceAttrs(actorData, heroData)
  520. for _,v in pairs(Enum.HeroAttrType) do
  521. local advencAttr = self:GetAdvenceAttrs(heroData, v)
  522. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.RealHurt then
  523. -- actorData:SetAdditionalAttr(v, actorData:GetAdditionalAttr(v) + advencAttr)
  524. actorData:SetAdditionalAttr(v, SDataUtil.Add(actorData:GetAdditionalAttr(v), advencAttr))
  525. elseif v >= Enum.HeroAttrType.STR_Percent then
  526. -- actorData:SetAdditionalAttrPercent(v, actorData:GetAdditionalAttrPercent(v) + advencAttr)
  527. actorData:SetAdditionalAttrPercent(v, SDataUtil.Add(actorData:GetAdditionalAttrPercent(v), advencAttr))
  528. end
  529. end
  530. end
  531. function CreateActorSystem:GetAdvenceAttrs(data, attrId)
  532. local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  533. local stepData = ManagerContainer.CfgMgr:GetParterProgressById(cfgData.ParterJob)
  534. if data.advanceLevel == 0 then
  535. return 0
  536. end
  537. local num = 0
  538. for i = 1,data.advanceLevel do
  539. local adds = CommonUtil.DeserializeCfgItemList(stepData["Attribute"..i])
  540. if adds ~= nil then
  541. for k,v in pairs(adds) do
  542. if v[1] == attrId then
  543. if v[1] < Enum.HeroAttrType.STR_Percent then
  544. num = num + v[2]
  545. else
  546. num = num + v[2]*0.0001
  547. end
  548. end
  549. end
  550. end
  551. end
  552. return num
  553. end
  554. function CreateActorSystem:CalcStrengthAttrs(actorData, heroData)
  555. for _,v in pairs(Enum.HeroAttrType) do
  556. local strengthAttr = self:GetStrengthAttrs(heroData, v)
  557. if v >= Enum.HeroAttrType.Life and v <= Enum.HeroAttrType.RealHurt then
  558. -- actorData:SetAdditionalAttr(v, actorData:GetAdditionalAttr(v) + strengthAttr)
  559. actorData:SetAdditionalAttr(v, SDataUtil.Add(actorData:GetAdditionalAttr(v), strengthAttr))
  560. elseif v >= Enum.HeroAttrType.STR_Percent then
  561. -- actorData:SetAdditionalAttrPercent(v, actorData:GetAdditionalAttrPercent(v) + strengthAttr)
  562. actorData:SetAdditionalAttrPercent(v, SDataUtil.Add(actorData:GetAdditionalAttrPercent(v), strengthAttr))
  563. end
  564. end
  565. end
  566. function CreateActorSystem:GetStrengthAttrs(data, attrId)
  567. local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(data.configId)
  568. local stepData = ManagerContainer.CfgMgr:GetParterProgressById(cfgData.ParterJob)
  569. if data.strengthLevel == 0 then
  570. return 0
  571. end
  572. local num = 0
  573. for i = 1,data.strengthLevel do
  574. local adds = CommonUtil.DeserializeCfgItemList(stepData["BreachAttribute"..i])
  575. if adds ~= nil then
  576. for k,v in pairs(adds) do
  577. if v[1] == attrId then
  578. if v[1] < Enum.HeroAttrType.STR_Percent then
  579. num = num + v[2]
  580. else
  581. num = num + v[2]*0.0001
  582. end
  583. end
  584. end
  585. end
  586. end
  587. return num
  588. end
  589. function CreateActorSystem:GetRoleLv()
  590. return self.heroData.baseLevel
  591. end
  592. function CreateActorSystem:GetJobCfgId()
  593. return self.heroData.configId;
  594. end
  595. function CreateActorSystem:GetHeroData()
  596. return self.heroData
  597. end
  598. function CreateActorSystem:GetId()
  599. return self.heroData.id
  600. end
  601. function CreateActorSystem:GetSkillData(heroId)
  602. local skillData = nil
  603. if heroId == 1 then
  604. skillData = self.heroData.skillData
  605. else
  606. skillData = self.fellewDatas[heroId].skillData
  607. end
  608. return skillData
  609. end
  610. function CreateActorSystem:GetCurSlotInfos(id)
  611. self:GetAllSlotInfos()
  612. local slot = self.allSlots[id]
  613. if slot == nil then
  614. return nil
  615. end
  616. return slot.slot_list
  617. end
  618. function CreateActorSystem:GetAllSlotInfos()
  619. local heroSlot = self.heroData.slot
  620. if not self.allSlots then self.allSlots = {}; end
  621. self.allSlots[heroSlot.hero_id] = heroSlot
  622. local slots = self:GetAllPartnerSlots()
  623. for k,v in pairs(slots) do
  624. self.allSlots[k] = v
  625. end
  626. return self.allSlots
  627. end
  628. function CreateActorSystem:GetAllPartnerSlots()
  629. local slots = {}
  630. for k,v in pairs(self.fellewDatas) do
  631. local slot = v.slot
  632. if slot ~= nil then
  633. slots[slot.hero_id] = slot
  634. end
  635. end
  636. return slots
  637. end
  638. function CreateActorSystem:GetUserRoleId()
  639. return self.userData.roleCfgId
  640. end
  641. function CreateActorSystem:GetViewData()
  642. return self.userData.viewData
  643. end
  644. function CreateActorSystem:GetMainRoleData()
  645. return self.heroData
  646. end
  647. function CreateActorSystem:GetHeadFrameId()
  648. return self.userData.headFrame or -1;
  649. end
  650. function CreateActorSystem:GetPartnerDatas()
  651. return self.fellewDatas
  652. end
  653. function CreateActorSystem:GetHeroDataAttr(id)
  654. return SDataUtil.InvConvert(self.heroData.attrs[id] or 0)
  655. end
  656. function CreateActorSystem:GetUserHeadPortraitId()
  657. return self.userData.headPortraitId
  658. end
  659. function CreateActorSystem:GetGuildName()
  660. return self.guildName
  661. end
  662. function CreateActorSystem:GetTotalFightPower()
  663. return self.userData.fightPower
  664. end
  665. --技能压制等级
  666. function CreateActorSystem:GetSkillPvPVal()
  667. return self.userData.repress_skill_pvp_val
  668. end
  669. --- 解析 FightRoleInfo网络数据
  670. ---@field fightRoleInfo table
  671. function CreateActorSystem:ParseFightRoleInfo(fightRoleInfo)
  672. self.userData = {}
  673. self.userData.isRobot = fightRoleInfo.is_robot
  674. self.userData.jobLevel = fightRoleInfo.job_level
  675. self.userData.gender = fightRoleInfo.gender
  676. self.userData.repress_skill_pvp_val = fightRoleInfo.repress_skill_pvp_val
  677. self.userData = ProtocalDataNormal.ParsePlayerBriefInfo(fightRoleInfo.brief_info, self.userData)
  678. self.userData.viewData = ProtocalDataNormal.FashionDataToViewData(fightRoleInfo.fashion_data)
  679. self.userData.inited = true
  680. if fightRoleInfo.is_robot then
  681. local heroDatas = self:CreateRobotFightInfo(self.userData)
  682. self.userData.attrList = {}
  683. self.fellewDatas = {}
  684. for i = 1, #heroDatas do
  685. local id = heroDatas[i].id
  686. --if id == 1 then
  687. -- self.heroData = heroDatas[i]
  688. --else
  689. self.fellewDatas[id] = heroDatas[i]
  690. --end
  691. end
  692. if self.heroData ~= nil then
  693. local actorParam = LuaToCSData.CreateActorParamData(self.heroData, self.heroData.skillData, self.heroData.buffs, self.userData, self.userData.viewData)
  694. self.heroActorData = ActorData.CreatePlayerActor(actorParam)
  695. end
  696. else
  697. if fightRoleInfo.hero_data_list then
  698. self.fellewDatas = {}
  699. for i = 1, #fightRoleInfo.hero_data_list do
  700. local id = fightRoleInfo.hero_data_list[i].id
  701. if id == 1 then
  702. self.heroData = ProtocalDataNormal.ParseHeroData(fightRoleInfo.hero_data_list[i], self.userData, false, true)
  703. CommonUtil.UpdateHeroExtGoShowData(self.heroData)
  704. else
  705. self.fellewDatas[id] = ProtocalDataNormal.ParseHeroData(fightRoleInfo.hero_data_list[i])
  706. CommonUtil.UpdateHeroExtGoShowData(self.fellewDatas[id])
  707. end
  708. end
  709. end
  710. if self.heroData ~= nil then
  711. self.heroActorData = self:CreatePlayerActorData()
  712. self.heroActorData.Name = self.userData.nickName
  713. self.heroActorData.HeadFrameId = self.userData.headFrame
  714. end
  715. end
  716. self.fellewActorDatas = self:CreateFellowActorData()
  717. self:CreateAllPetActorDatas(fightRoleInfo.battle_pet_list)
  718. --要变身的ID
  719. self.userData.change_play_id = fightRoleInfo.change_play_id
  720. self:CreateChangePetActor()
  721. self:CalcHeroAttrs()
  722. self:CalcFellewAttrs()
  723. end
  724. --创建变身后的宠物ACTORdata
  725. function CreateActorSystem:CreateChangePetActor()
  726. if nil ~= self.userData.change_play_id then
  727. end
  728. if self.heroData then
  729. self:CreatePetActorDatas(self.heroData.battlePetId, battle_pet_list)
  730. end
  731. if self.fellewDatas then
  732. for k,v in pairs(self.fellewDatas) do
  733. self:CreatePetActorDatas(v.battlePetId, battle_pet_list)
  734. end
  735. end
  736. if self.petActorDatas then
  737. for k,v in pairs(self.petActorDatas) do
  738. local petData = self.petDatas[k]
  739. if petData then
  740. local heroId = petData.heroId
  741. if heroId > 0 then
  742. if heroId == 1 then
  743. if self.heroActorData then
  744. self.heroActorData:SetPet(v)
  745. end
  746. else
  747. if self.fellewActorDatas and self.fellewActorDatas[heroId] then
  748. self.fellewActorDatas[heroId]:SetPet(v)
  749. end
  750. end
  751. self:SetSvrCalAttrs(v,petData)
  752. end
  753. end
  754. end
  755. end
  756. end
  757. --用于查询其他玩家信息
  758. function CreateActorSystem:ParseOtherRoleInfo(viewRoleInfo)
  759. self.userData = {}
  760. -- self.userData.attrList = viewRoleInfo.attr_list
  761. self.userData.attrList = {}
  762. for _,v in pairs(viewRoleInfo.attr_list) do
  763. local attr = {key=v.key,value=SInt.Convert(v.value)}
  764. self.userData.attrList[#self.userData.attrList] = attr
  765. end
  766. self.userData = ProtocalDataNormal.ParsePlayerBriefInfo(viewRoleInfo.brief, self.userData)
  767. self.userData.viewData = ProtocalDataNormal.FashionDataToViewData(viewRoleInfo.fashion_data)
  768. self.userData.fashion = viewRoleInfo.fashion
  769. self.userData.danScore = viewRoleInfo.danScore
  770. self.userData.paramList = viewRoleInfo.param_list
  771. self.fellewDatas = {}
  772. if viewRoleInfo.hero then
  773. for i = 1, #viewRoleInfo.hero.hero_data do
  774. local _heroData = viewRoleInfo.hero.hero_data[i]
  775. local id = _heroData.id
  776. self.fellewDatas[id] = ProtocalDataNormal.ParseHeroData(_heroData)
  777. CommonUtil.UpdateHeroExtGoShowData(self.fellewDatas[id])
  778. end
  779. end
  780. self.heroData = ProtocalDataNormal.ParseHeroData(viewRoleInfo.role_hero, self.userData, false, true)
  781. CommonUtil.UpdateHeroExtGoShowData(self.heroData)
  782. if self.heroData ~= nil then
  783. self.heroActorData = self:CreatePlayerActorData()
  784. end
  785. self.fellewActorDatas = self:CreateFellowActorData()
  786. self:CreateAllPetActorDatas(viewRoleInfo.pet_list)
  787. self:InitFashionData(self.userData.fashion)
  788. self:CalcHeroAttrs()
  789. self:CalcFellewAttrs()
  790. self.guildName = viewRoleInfo.guild_name
  791. end
  792. function CreateActorSystem:GetHeroPetDataByHeroId(id)
  793. if id == 1 then
  794. return self.petDatas[self.heroData.battlePetId]
  795. else
  796. return self.petDatas[self.fellewDatas[id].battlePetId]
  797. end
  798. end
  799. function CreateActorSystem:GetHeroPetActorDataById(id)
  800. return self.petActorDatas[id]
  801. end
  802. function CreateActorSystem:GetHeroDataById(id)
  803. if id == 1 then
  804. return self.heroData
  805. else
  806. return self.fellewDatas[id]
  807. end
  808. end
  809. function CreateActorSystem:GetCardSuitLvById(id)
  810. if id == 1 then
  811. return self.heroData.petFightPower
  812. else
  813. return self.fellewDatas[id].petFightPower
  814. end
  815. end
  816. function CreateActorSystem:RefreshEquipedCardSuitData(id)
  817. local slot
  818. if id == 1 then
  819. slot = self.heroData.slot
  820. else
  821. slot = self.fellewDatas[id].slot
  822. end
  823. local equipedCards = {}
  824. for _,v in pairs(slot.slot_list) do
  825. local cardList = v.card_id_list
  826. for _,v1 in pairs(cardList) do
  827. if v1 and v1 > 0 then
  828. equipedCards[#equipedCards + 1] = v1
  829. end
  830. end
  831. end
  832. local cloneEquips
  833. local suitData = {}
  834. local allCfgDatas = ManagerContainer.CfgMgr:GetAllCardSuitNewCfg()
  835. for i = #allCfgDatas, 1, -1 do
  836. local cfgData = allCfgDatas[i]
  837. local enoughCount = {}
  838. local count = {}
  839. cloneEquips = clone(equipedCards)
  840. for j = #cfgData.TriggerConditions, 1, -1 do
  841. local condition = cfgData.TriggerConditions[j]
  842. local type = condition[1]
  843. local lv = condition[2]
  844. local num = condition[3]
  845. enoughCount[j] = num
  846. if not count[j] then
  847. count[j] = 0
  848. end
  849. for m = #cloneEquips, 1, -1 do
  850. local cfgId = cloneEquips[m]
  851. local cardCfgData = ManagerContainer.CfgMgr:GetCardDataById(cfgId)
  852. if cardCfgData and cardCfgData.CardType >= type and cardCfgData.CardLevel >= lv then
  853. count[j] = count[j] + 1
  854. table.remove(cloneEquips, m)
  855. if count[j] >= enoughCount[j] then
  856. break
  857. end
  858. end
  859. end
  860. count[j] = math.min(count[j], enoughCount[j])
  861. suitData = {cfgData.Id, count, enoughCount, false}
  862. end
  863. local result = true
  864. for j = 1,#count do
  865. if count[j] < enoughCount[j] then
  866. result = false
  867. break
  868. end
  869. end
  870. if result then
  871. suitData[4] = true
  872. break
  873. end
  874. end
  875. return suitData, slot
  876. end
  877. function CreateActorSystem:GetHeroPetFightPowerByHeroId(id)
  878. if id == 1 then
  879. return self.heroData.petFightPower
  880. else
  881. return self.fellewDatas[id].petFightPower
  882. end
  883. end
  884. function CreateActorSystem:GetHeroSkillEquipDataByHeroId(id)
  885. if id == 1 then
  886. local skillEquipSlot = self.heroData.skillEquipSlot
  887. local skillEquipData = skillEquipSlot.slotList[1]
  888. return skillEquipData
  889. else
  890. local skillEquipSlot = self.fellewDatas[id].skillEquipSlot
  891. local skillEquipData = skillEquipSlot.slotList[1]
  892. return skillEquipData
  893. end
  894. end
  895. ----变身宠物
  896. function CreateActorSystem:CalChangePetActorId()
  897. local PetBossIdRane = 100000
  898. return ManagerContainer.DataMgr.UserData:GetUserId()-- + PetBossIdRane
  899. end
  900. function CreateActorSystem:CreatePetBossActor(ChangePetId)
  901. if nil == self.tbChangePetId then
  902. self.tbChangePetId = {}
  903. end
  904. local ChangePetUId = self:CalChangePetActorId()
  905. self.PetBossActor = ManagerContainer.LuaActorDataMgr:CreatePetBossActor(ChangePetUId, ChangePetId,self.heroActorData.Level)
  906. self.PetBossActor.Level = self.heroActorData.Level
  907. self.PetBossActor.HeadIcon = self.heroActorData.HeadIcon
  908. table.insert(self.tbChangePetId,self.PetBossActor.ID)
  909. return self.PetBossActor
  910. end
  911. function CreateActorSystem:RemoveAllPetBossActor()
  912. for k,v in pairs(tbChangePetId) do
  913. ManagerContainer.LuaActorDataMgr:DeletePetActorData(v)
  914. end
  915. end
  916. function CreateActorSystem:Dispose()
  917. self.RemoveAllPetBossActor()
  918. self.userData = nil
  919. self.heroData = nil
  920. self.fellewDatas = nil
  921. self.petDatas = nil
  922. self.heroActorData = nil
  923. self.fellewActorDatas = nil
  924. self.fashionMap = nil
  925. self.petActorDatas = nil
  926. self.guildName = nil
  927. end
  928. return CreateActorSystem