CombatBuff.lua 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828
  1. local Util = require("common.Util")
  2. local RoleAttr = require("role.RoleAttr")
  3. local CombatDefine = require("combat.CombatDefine")
  4. local CombatObj = require("combat.CombatObj")
  5. local CombatImpl = require("combat.CombatImpl")
  6. local TargetMode = require("combat.TargetMode")
  7. local CombatCalc = require("combat.CombatCalc")
  8. local RoleDefine = require("role.RoleDefine")
  9. local BeSkill = require("combat.BeSkill")
  10. local BufferExcel = require("excel.buffer")
  11. local Skill = require("combat.Skill")
  12. local SkillExcel = require("excel.skill").skill
  13. local HeroExcel = require("excel.hero").hero
  14. local FuwenExcel = require("excel.fuwen")
  15. local ProjectLogic = require("platform.ProjectLogic")
  16. --和血量相关的作用
  17. local function isHpCmd(cmd)
  18. if cmd == "hp" or cmd == "hurt" or cmd == "hurt1" or cmd == "liuxue" or cmd == "zhongdu" or cmd == "ranshao" or cmd == "ranshao1" or cmd == "huiheYinji" then
  19. return true
  20. end
  21. return false
  22. end
  23. --控制类buff
  24. function isControlCmd(cmd)
  25. if cmd == "xuanyun" or cmd == "shihua" or cmd == "bingdong" or cmd == "chanrao" then
  26. return true
  27. end
  28. end
  29. --跳过行动回合
  30. function isStop(obj)
  31. if obj == nil then
  32. return
  33. end
  34. local bufferCmd = obj.bufferCmd
  35. local ret
  36. if bufferCmd["xuanyun"] or bufferCmd["shihua"] or bufferCmd["bingdong"] or bufferCmd["chanrao"] then
  37. ret = 1
  38. elseif bufferCmd["xuanyun"] then
  39. ret = 2
  40. end
  41. return ret
  42. end
  43. --使用主动技能
  44. function isJingji(obj)
  45. if obj.bufferCmd["jinmo"] then
  46. return true
  47. end
  48. end
  49. -- 是否不使用主动技能
  50. function IsCanNoUseSkill(obj)
  51. --print("[IsCanNoUseSkill] 进入判断")
  52. if obj.bufferCmd["jinmo"] then
  53. --print("[IsCanNoUseSkill] jinmo 进入")
  54. return true
  55. end
  56. if obj.bufferCmd["jinmopro"] then
  57. local rand = math.random(1, 100)
  58. --print("[IsCanNoUseSkill] rand = "..rand)
  59. if rand >= 50 then
  60. --print("[IsCanNoUseSkill] 判断成功不释放技能 = "..rand)
  61. return true
  62. end
  63. end
  64. return false
  65. end
  66. --是否缠绕
  67. function isChanRao(obj)
  68. for j = obj.buffer[0], 1, -1 do
  69. local buffer = obj.buffer[j]
  70. local conf = BufferExcel.buffer[buffer.id]
  71. local cmd = conf.cmd
  72. if cmd == "chanrao" then
  73. return true
  74. end
  75. end
  76. end
  77. --是否被嘲讽
  78. function isChaofen(obj)
  79. if obj and obj.buffer then
  80. for j = obj.buffer[0], 1, -1 do
  81. local buffer = obj.buffer[j]
  82. local conf = BufferExcel.buffer[buffer.id]
  83. local cmd = conf.cmd
  84. if cmd == "chaofeng" then
  85. local attackPos = buffer.attackPos
  86. local attacker = CombatImpl.objList[attackPos]
  87. if attacker and attacker.pos ~= obj.pos then
  88. return true,attackPos
  89. end
  90. end
  91. end
  92. end
  93. return false,0
  94. end
  95. --是否被控制
  96. function isAtControl(obj)
  97. if obj and obj.buffer then
  98. for j = obj.buffer[0], 1, -1 do
  99. local buffer = obj.buffer[j]
  100. local conf = BufferExcel.buffer[buffer.id]
  101. local cmd = conf.cmd
  102. if isControlCmd(cmd) then
  103. return true
  104. end
  105. end
  106. end
  107. end
  108. -- 检查能否复活
  109. function canRevive(obj)
  110. if obj then
  111. if obj.hp > 0 then
  112. return
  113. end
  114. if obj.beBackup then
  115. return
  116. end
  117. if obj.dieSkill then
  118. local skillConf = SkillExcel[obj.dieSkill]
  119. if skillConf.otherArgs.noRevive == 1 then
  120. return false
  121. end
  122. end
  123. if obj.bufferCmd and obj.bufferCmd["noRevive"] then
  124. return false
  125. end
  126. for k,v in ipairs(CombatImpl.frameReviceList) do
  127. if v[1] == obj.pos then
  128. return false
  129. end
  130. end
  131. return true
  132. end
  133. end
  134. --是否对某种状态免疫
  135. CMD2KEY = {
  136. ["xuanyun"] = RoleDefine.STATUS_MIANYI_RATE1,
  137. ["shihua"] = RoleDefine.STATUS_MIANYI_RATE2,
  138. ["bingdong"] = RoleDefine.STATUS_MIANYI_RATE3,
  139. ["jinmo"] = RoleDefine.STATUS_MIANYI_RATE4,
  140. ["ranshao"] = RoleDefine.STATUS_MIANYI_RATE5,
  141. ["ranshao1"] = RoleDefine.STATUS_MIANYI_RATE5,
  142. ["liuxue"] = RoleDefine.STATUS_MIANYI_RATE6,
  143. ["zhongdu"] = RoleDefine.STATUS_MIANYI_RATE7,
  144. ["hunluan"] = RoleDefine.STATUS_MIANYI_RATE9,
  145. }
  146. function isMianyi(obj,cmd)
  147. local key = CMD2KEY[cmd]
  148. local r = math.random(0,10000)
  149. if key and obj.attr[key] >= r then
  150. return true
  151. end
  152. initCombatBufferType()
  153. -- 免疫所有负面状态
  154. if BUFFER_COMBAT_TYPE[cmd] and BUFFER_COMBAT_TYPE[cmd] == 1 then
  155. local r = math.random(0,10000)
  156. if obj.attr[RoleDefine.STATUS_MIANYI_RATE8] >= r then
  157. return true
  158. end
  159. end
  160. end
  161. local function isMiankong(obj, cmd, attacker, skillKongRate)
  162. if not isControlCmd(cmd) then return end
  163. if not attacker then return end
  164. if not skillKongRate then return end
  165. -- 新手剧情 100%控制
  166. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE2 then
  167. return false
  168. end
  169. local kongRate = attacker.attr[RoleDefine.KONG_RATE]
  170. -- 附带技能控制率
  171. kongRate = kongRate + skillKongRate
  172. local mianKongRate = obj.attr[RoleDefine.MIANKONG_RATE]
  173. kongRate = kongRate * (1 - mianKongRate/10000)
  174. kongRate = kongRate < 0 and 0 or kongRate
  175. -- 连击模式 控制概率
  176. if CombatImpl.comboType > 0 then
  177. kongRate = kongRate * CombatImpl.comboHurtRate / 10000
  178. end
  179. local r = math.random(1,10000)
  180. if r >= kongRate then
  181. return true
  182. end
  183. end
  184. function getStatus(obj)
  185. return obj.bufferCmd or {}
  186. end
  187. function isStatus(obj,status)
  188. local bufferCmd = obj.bufferCmd
  189. if not bufferCmd then return end
  190. for j = 1,#status do
  191. if bufferCmd[status[j]] then
  192. return true,status[j],bufferCmd[status[j]][1]
  193. end
  194. end
  195. end
  196. function isJob(obj,jobs)
  197. local job = obj.job
  198. for i = 1,#jobs do
  199. if job == jobs[i] then
  200. return true
  201. end
  202. end
  203. end
  204. function isCamp(obj,camps)
  205. local camp = obj.camp
  206. for i = 1,#camps do
  207. if camp == camps[i] then
  208. return true
  209. end
  210. end
  211. end
  212. function isSide(obj,sides, attacker)
  213. if not attacker then return end
  214. local side = obj.side
  215. -- 只能对敌方
  216. if sides == 1 then
  217. if side == attacker.side then
  218. return true
  219. end
  220. -- 只能对友方
  221. elseif sides == 2 then
  222. if side ~= attacker.side then
  223. return true
  224. end
  225. end
  226. end
  227. local function isPos(obj,posList)
  228. local pos = obj.pos
  229. for i = 1,#posList do
  230. if pos == posList[i] then
  231. return true
  232. end
  233. end
  234. end
  235. function getBuffer(obj)
  236. return obj.buffer
  237. end
  238. function onBufferChange(obj)
  239. local bufferAttr = obj.bufferAttr
  240. RoleAttr.initCombatAttr(bufferAttr)
  241. local bufferCmd = obj.bufferCmd
  242. for k,v in pairs(bufferCmd) do
  243. bufferCmd[k] = nil
  244. end
  245. local changeList = {}
  246. for i = 1, obj.buffer[0] do
  247. local buffer = obj.buffer[i]
  248. local conf = BufferExcel.buffer[buffer.id]
  249. if conf.cmd == "stealattr" or
  250. conf.cmd == "handleattr" or
  251. conf.cmd == "attr" or
  252. conf.cmd == "attrdne" or
  253. conf.cmd == "attr1" or
  254. conf.cmd == "pojia" or
  255. conf.cmd == "jiansu" or
  256. conf.cmd == "defRate" or
  257. conf.cmd == "defRate2" or
  258. conf.cmd == "attrQusan" then
  259. if type(buffer.arg) == "table" then
  260. for j = 1,#buffer.arg do
  261. local attrData = buffer.arg[j]
  262. local key = attrData[1]
  263. local value = 0
  264. if not conf.attrRate then
  265. value = attrData[2]
  266. else
  267. value = conf.attrRate
  268. end
  269. RoleAttr.updateValue(key,value,bufferAttr,true)
  270. end
  271. else
  272. for j = 1,#conf.args do
  273. local attrData = conf.args[j]
  274. local key = attrData[1]
  275. local value = 0
  276. if not conf.attrRate then
  277. value = attrData[2]
  278. else
  279. value = conf.attrRate
  280. end
  281. RoleAttr.updateValue(key,buffer.arg or (value * buffer.cnt),bufferAttr,true)
  282. end
  283. end
  284. end
  285. if conf.cmd == "xuruo" then
  286. RoleAttr.updateValue(RoleDefine.XURUO,buffer.arg or conf.args[1],bufferAttr,true)
  287. end
  288. if conf.cmd == "fansheZhuangjia" then
  289. RoleAttr.updateValue(RoleDefine.FANSHE_ZHUANGJIA,conf.args[1],bufferAttr,true)
  290. end
  291. if conf.cmd == "hudun" then
  292. RoleAttr.updateValue(RoleDefine.HUDUN_COMBAT, buffer.arg, bufferAttr,true)
  293. end
  294. --标识,给其他英雄加属性的buff
  295. if conf.cmd == "biaoshi" then
  296. local attacker = buffer.attackPos and CombatImpl.objList[buffer.attackPos]
  297. if attacker then
  298. if not changeList[attacker.pos] then
  299. changeList[attacker.pos] = 1
  300. attacker.bufferAttr2[obj.pos] = {}
  301. RoleAttr.initCombatAttr(attacker.bufferAttr2[obj.pos])
  302. end
  303. for j = 1,#conf.args do
  304. local attrData = conf.args[j]
  305. local key = attrData[1]
  306. local value = attrData[2]
  307. RoleAttr.updateValue(key,buffer.arg or (value * buffer.cnt),attacker.bufferAttr2[obj.pos],true)
  308. end
  309. end
  310. end
  311. bufferCmd[conf.cmd] = bufferCmd[conf.cmd] or {}
  312. bufferCmd[conf.cmd][#bufferCmd[conf.cmd] + 1] = i
  313. end
  314. CombatObj.calcAttr(obj)
  315. for pos in pairs(changeList) do
  316. CombatObj.calcAttr(CombatImpl.objList[pos])
  317. end
  318. end
  319. local function canAdd(obj, id, random, attacker, skillConfig)
  320. local conf = BufferExcel.buffer[id]
  321. if not conf then
  322. return
  323. end
  324. -- 非控制buff 走随机
  325. if not isControlCmd(conf.cmd) then
  326. -- 新手剧情 100%控制
  327. if CombatImpl.fightMode[1] == CombatDefine.FIGHT_MODE2 then
  328. random = 10000
  329. end
  330. if random and not Util.checkRandom(random) then
  331. return
  332. end
  333. end
  334. if obj.pos > CombatDefine.COMBAT_HERO_ALL_CNT then
  335. return
  336. end
  337. if obj.hp <= 0 then
  338. if conf.cmd == "revive" then
  339. return true
  340. else
  341. if conf.cmd == "noRevive" then
  342. return true
  343. end
  344. end
  345. return
  346. end
  347. if conf.cmd == "fixPos" then
  348. return true
  349. end
  350. if #conf.jobs > 0 and not isJob(obj,conf.jobs) then
  351. return
  352. end
  353. if conf.camp and #conf.camp > 0 and not isCamp(obj,conf.camp) then
  354. return
  355. end
  356. -- 只能给友方或者敌对方加
  357. if conf.side and conf.side > 0 and isSide(obj, conf.side, attacker) then
  358. return
  359. end
  360. if #conf.status > 0 and not isStatus(obj,conf.status) then
  361. return
  362. end
  363. if #conf.pos > 0 and not isPos(obj,conf.pos) then
  364. return
  365. end
  366. if isMianyi(obj,conf.cmd) then
  367. return
  368. end
  369. if isMiankong(obj,conf.cmd, attacker, random) then
  370. return
  371. end
  372. --连击 BUFF率为 本来的一半
  373. if CombatImpl.comboType > 0 then
  374. local random = math.random(1, 10000)
  375. if random < 5000 then
  376. return
  377. end
  378. end
  379. return true
  380. end
  381. --根据cmd删除buff
  382. local function delBufferByCmd(obj,cmd,cnt)
  383. local delCnt = 0
  384. for j = obj.buffer[0], 1, -1 do
  385. local buffer = obj.buffer[j]
  386. local conf = BufferExcel.buffer[buffer.id]
  387. local bufferCmd = conf.cmd
  388. if bufferCmd == cmd then
  389. local bufferCnt = delBuffer(obj, j)
  390. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
  391. delCnt = delCnt + 1
  392. if delCnt == cnt then
  393. return
  394. end
  395. end
  396. end
  397. end
  398. --删除所有buff
  399. local function delAllBuff(obj)
  400. for i = 1, obj.buffer[0] do
  401. obj.buffer[i] = nil
  402. end
  403. obj.buffer[0] = 0
  404. end
  405. --判断是否抵消buff
  406. local function cancelBuffer(obj,conf)
  407. local cancelCmd = conf.cancelCmd[1]
  408. local cnt = conf.cancelCmd[2]
  409. if not (cancelCmd and cnt) then
  410. return
  411. end
  412. local nowCnt = getBuffCnt(obj,cancelCmd)
  413. if cnt < 0 then --全删抵消buff
  414. if nowCnt > 0 then
  415. delBufferByCmd(obj,cancelCmd,cnt)
  416. return true
  417. end
  418. elseif cnt == 0 then--不删抵消buff
  419. if nowCnt > 0 then
  420. return true
  421. end
  422. elseif cnt > 0 then--删指定数量抵消buff
  423. if nowCnt >= cnt then
  424. delBufferByCmd(obj,cancelCmd,cnt)
  425. return true
  426. end
  427. end
  428. end
  429. DELAY_BUFF_OP = false
  430. DELAY_LIST = nil
  431. --不可以延迟加的buffcmd(加的时候可能会触发删除其他buff的cmd)
  432. NO_DELAY_BUFFCMD = {
  433. ["convert"] = 1
  434. }
  435. local function delayBegin()
  436. if DELAY_BUFF_OP then
  437. return
  438. end
  439. DELAY_BUFF_OP = true
  440. DELAY_LIST = {del = {},add = {}}
  441. end
  442. local function delayEnd()
  443. if not DELAY_BUFF_OP then
  444. return
  445. end
  446. table.sort(DELAY_LIST.del,function(a,b)
  447. return a[2] > b[2]
  448. end)
  449. DELAY_BUFF_OP = false
  450. local delRecord = {}
  451. for k,v in ipairs(DELAY_LIST.del) do
  452. delRecord[v[1]] =delRecord[v[1]] or {}
  453. if not delRecord[v[1]][v[2]] then
  454. delBuffer(v[1], v[2])
  455. delRecord[v[1]][v[2]] = 1
  456. end
  457. end
  458. for k,v in ipairs(DELAY_LIST.add) do
  459. addBuffer(v[1],v[2], v[3], v[4],v[5],v[6])
  460. end
  461. DELAY_LIST = {del = {},add = {}}
  462. end
  463. local function beforeAddBuffer(attackPos,obj, id, skillID,arg,parentConf)
  464. local conf = BufferExcel.buffer[id]
  465. local bufferCmd = conf.cmd
  466. if bufferCmd == "fixPos" then
  467. elseif cancelBuffer(obj,conf) then
  468. return true
  469. elseif bufferCmd == "shengling" then
  470. elseif conf.holdOnDie ~= 1 and obj.hp <= 0 then
  471. return true
  472. elseif conf.roundOne == 1 then
  473. for j = obj.buffer[0], 1, -1 do
  474. local buffer = obj.buffer[j]
  475. if buffer.id == id and buffer.attackPos == attackPos and buffer.round == conf.round then
  476. return true
  477. end
  478. end
  479. end
  480. if conf.type == CombatDefine.BUFFER_TYPE4 then
  481. if handler[bufferCmd] then
  482. local attacker = CombatImpl.objList[attackPos]
  483. handler[bufferCmd](attacker,obj,conf)
  484. end
  485. return true
  486. end
  487. if bufferCmd == "convert" then
  488. local bufferList = {}
  489. for j = obj.buffer[0], 1, -1 do
  490. local buffer = obj.buffer[j]
  491. if buffer.id == id then
  492. bufferList[#bufferList + 1] = j
  493. end
  494. end
  495. local needCnt = conf.args[1]
  496. if #bufferList + 1 < needCnt then
  497. return
  498. end
  499. for _,v in ipairs(bufferList) do
  500. local buffer = obj.buffer[v]
  501. local bufferCnt = delBuffer(obj, v)
  502. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
  503. end
  504. addBuffer(attackPos,obj, conf.args[2], skillID,arg,parentConf)
  505. return true
  506. end
  507. end
  508. -- 添加到复活列表
  509. local function checkRevive(attackPos,obj,bufferID,skillID)
  510. local conf = BufferExcel.buffer[bufferID]
  511. if conf.cmd ~= "revive" then
  512. return
  513. end
  514. if not canRevive(obj) then
  515. return true
  516. end
  517. CombatImpl.addRevice(attackPos, obj, bufferID, skillID)
  518. return true
  519. end
  520. -- 复活对象
  521. function reviceObj(attackPos, obj, bufferID, skillID)
  522. local conf = BufferExcel.buffer[bufferID]
  523. if not conf then return end
  524. local skillConf = skillID and SkillExcel[skillID]
  525. if not skillConf then return end
  526. local attacker = CombatImpl.objList[attackPos]
  527. local hpRevive = CombatCalc.calcHp(attacker, obj, conf.args[1], conf.args[2], true)
  528. local hpAddRate = CombatObj.getValue(attacker,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  529. hpRevive = hpRevive * (1 + hpAddRate)
  530. hpRevive = hpRevive < 0 and 1 or hpRevive
  531. local d = CombatObj.updateHp(obj, hpRevive, true, nil, nil, CombatObj.EXTRA_HP_TYPE)
  532. local attrs = {}
  533. attrs[RoleDefine.REVIVE_COMBAT] = attackPos
  534. CombatImpl.setSkillID(attacker, skillID)
  535. CombatImpl.setSkillHit(obj,0, nil, nil, attacker, skillID)
  536. CombatImpl.setSaySkill(attacker.pos,skillConf.id,skillConf.contentType)
  537. CombatImpl.setExtraHit(obj,d,Skill.getCMD2ID("revive"),attrs)
  538. if skillConf and skillConf.type == 0 then
  539. onExtraCombatRecord(attackPos, 1, "reviveBeUse")
  540. else
  541. onExtraCombatRecord(attackPos, 1, "revive")
  542. end
  543. if skillConf.cmd == "revive" then
  544. local buffers = skillConf.args
  545. local addBufferID = buffers[1]
  546. if addBufferID then
  547. local targetMode = buffers[2]
  548. local random = buffers[3]
  549. local targets = TargetMode.getTargets(obj, targetMode)
  550. if #targets > 0 then
  551. for _,target in ipairs(targets) do
  552. if canAdd(target, addBufferID, random, obj, skillConf) then
  553. addBuffer(obj.pos, target, addBufferID, skillConf.id, arg)
  554. end
  555. end
  556. end
  557. end
  558. end
  559. BeSkill.onAddBuffer(obj,{id = bufferID})
  560. end
  561. function addBuffer(attackPos,obj, id, skillID,arg,parentConf)
  562. local conf = BufferExcel.buffer[id]
  563. local bufferCmd = conf.cmd
  564. if DELAY_BUFF_OP then
  565. if not NO_DELAY_BUFFCMD[bufferCmd] then
  566. DELAY_LIST.add[#DELAY_LIST.add + 1] = {attackPos,obj, id, skillID,arg,parentConf}
  567. end
  568. return
  569. end
  570. if checkRevive(attackPos,obj, id, skillID) then
  571. return
  572. end
  573. if beforeAddBuffer(attackPos,obj, id, skillID,arg,parentConf) then
  574. return
  575. end
  576. local bufferCnt = 1
  577. local index
  578. local buffer
  579. local bufferCmdInd
  580. local bufferInd
  581. local tround = 0
  582. local index = 0
  583. local groupCnt = 0
  584. local group = conf.group[1]
  585. for i = 1, obj.buffer[0] do
  586. buffer = obj.buffer[i]
  587. if buffer.id == id then
  588. bufferCnt = bufferCnt + 1
  589. bufferInd = i
  590. if tround > buffer.round or tround == 0 then
  591. tround = buffer.round
  592. index = i
  593. end
  594. end
  595. local nowBuffConf = BufferExcel.buffer[buffer.id]
  596. if nowBuffConf.cmd == bufferCmd then
  597. bufferCmdInd = i
  598. end
  599. if group and group == nowBuffConf.group[1] then
  600. groupCnt = groupCnt + 1
  601. end
  602. end
  603. local groupCmd = conf.group[2]
  604. if groupCmd and groupCnt > 0 and groupCnt >= groupCmd then
  605. return
  606. end
  607. if bufferCnt > 100 then
  608. return
  609. end
  610. local canAppend = parentConf and parentConf.canAppend or conf.canAppend
  611. local round = parentConf and parentConf.round or conf.round
  612. round = round == 0 and 1 or round
  613. if canAppend == 1 then
  614. local appendCnt = conf.appendCnt or 0
  615. if appendCnt > 0 and bufferCnt > conf.appendCnt then
  616. if conf.type == CombatDefine.BUFFER_TYPE2 then
  617. buffer = obj.buffer[index]
  618. buffer.round = round
  619. --bingdong清除buffer参数
  620. if conf.cmd == "bingdong" then
  621. buffer.arg = nil
  622. end
  623. CombatImpl.onAddBuffer(id)
  624. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_ADD,0)
  625. return
  626. end
  627. return
  628. end
  629. else
  630. if bufferCnt > 1 then
  631. if conf.type == CombatDefine.BUFFER_TYPE2 then
  632. buffer = obj.buffer[bufferInd]
  633. buffer.round = round
  634. --bingdong清除buffer参数
  635. if conf.cmd == "bingdong" then
  636. buffer.arg = nil
  637. end
  638. CombatImpl.onAddBuffer(id)
  639. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_ADD,0)
  640. return
  641. end
  642. return
  643. end
  644. end
  645. if isControlCmd(bufferCmd) and bufferCmdInd then
  646. buffer = obj.buffer[bufferCmdInd]
  647. if buffer.round < round then
  648. buffer.round = round
  649. end
  650. if conf.cmd == "bingdong" then
  651. buffer.arg = nil
  652. end
  653. return
  654. end
  655. obj.buffer[0] = obj.buffer[0] + 1
  656. index = obj.buffer[0]
  657. buffer = obj.buffer[index]
  658. if not buffer then
  659. obj.buffer[index] = {}
  660. buffer = obj.buffer[index]
  661. end
  662. buffer.id = id
  663. buffer.round = nil -- 剩余回合
  664. buffer.attrs = nil
  665. buffer.attackPos = nil
  666. buffer.skillID = nil
  667. buffer.cnt = 1
  668. buffer.arg = nil
  669. if round then
  670. buffer.round = round
  671. elseif conf.type == CombatDefine.BUFFER_TYPE1 then
  672. buffer.round = 1
  673. elseif conf.type == CombatDefine.BUFFER_TYPE2 then
  674. buffer.round = round
  675. elseif conf.type == CombatDefine.BUFFER_TYPE3 then
  676. buffer.round = nil
  677. else
  678. assert()
  679. end
  680. local attacker
  681. if attackPos > CombatDefine.COMBAT_HERO_ALL_CNT then
  682. attacker = CombatImpl.helpList[attackPos]
  683. else
  684. attacker = CombatImpl.objList[attackPos]
  685. end
  686. if arg then
  687. buffer.arg = arg
  688. elseif isHpCmd(conf.cmd) then
  689. local isAddHp = conf.cmd == "hp"
  690. buffer.arg = CombatCalc.calcBufferHp(attacker,obj,id,isAddHp)
  691. end
  692. buffer.attackPos = attackPos
  693. buffer.skillID = skillID
  694. buffer.attrs = {}
  695. if bufferCmd == "shengling" then
  696. buffer.arg = conf.args[3]
  697. elseif bufferCmd == "hudun" then
  698. local attackerHp = CombatCalc.calcHp(attacker, obj, conf.args[1], conf.args[2], true)
  699. local hudunValue = math.floor(conf.args[2] * attackerHp / 10000)
  700. buffer.arg = hudunValue
  701. end
  702. onBufferChange(obj)
  703. if conf.isAddCmd == 1 and handler[conf.cmd] then
  704. handler[conf.cmd](obj,buffer,conf)
  705. HANDLER_ONCE[conf.cmd] = nil
  706. end
  707. if conf.type ~= CombatDefine.BUFFER_TYPE1 then
  708. CombatImpl.onAddBuffer(id)
  709. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_ADD)
  710. end
  711. BeSkill.onAddBuffer(obj,buffer)
  712. onExtraCombatRecord(attackPos,1,bufferCmd)
  713. return buffer
  714. end
  715. local function delBufferByTotem(obj,totemId)
  716. for j = obj.buffer[0], 1, -1 do
  717. local buffer = obj.buffer[j]
  718. local conf = BufferExcel.buffer[buffer.id]
  719. if bufferCmd ~= "totem" and buffer.totem == totemId then
  720. delBuffer(obj,j)
  721. end
  722. end
  723. end
  724. local function beforeDelBuffer(obj, buffer)
  725. local conf = BufferExcel.buffer[buffer.id]
  726. if conf.cmd == "fentan" and buffer.round < 1 then
  727. local hurt = CombatCalc.calcHp(obj, obj, conf.args[1], conf.args[2])
  728. if hurt > 0 then
  729. local d = CombatObj.updateHp(obj, hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  730. CombatImpl.setExtraHit(obj, hurt)
  731. CombatObj.onHpCB(obj, d, obj.pos)
  732. end
  733. end
  734. end
  735. function delBuffer(obj, ind)
  736. if not obj.buffer[ind] then
  737. return
  738. end
  739. if DELAY_BUFF_OP then
  740. for k,v in ipairs(DELAY_LIST.del) do
  741. if v[2] == ind then
  742. return
  743. end
  744. end
  745. DELAY_LIST.del[#DELAY_LIST.del + 1] = {obj, ind}
  746. return
  747. end
  748. local id = obj.buffer[ind].id
  749. beforeDelBuffer(obj,obj.buffer[ind])
  750. obj.buffer[ind] = obj.buffer[obj.buffer[0]]
  751. obj.buffer[obj.buffer[0]] = nil
  752. obj.buffer[0] = obj.buffer[0] - 1
  753. onBufferChange(obj)
  754. local bufferCnt = 0
  755. for i = 1, obj.buffer[0] do
  756. local buffer = obj.buffer[i]
  757. if buffer.id == id then
  758. bufferCnt = bufferCnt + 1
  759. end
  760. end
  761. return bufferCnt
  762. end
  763. -- 战斗回合开始时添加buffer
  764. function beforeCombat()
  765. end
  766. function getSkillBuffers(skillConfig)
  767. local randBuffCnt = skillConfig.otherArgs.randBuffCnt
  768. if not randBuffCnt then
  769. return skillConfig.buffers
  770. end
  771. local ret = {}
  772. local c = #skillConfig.buffers
  773. if randBuffCnt >= c then
  774. return skillConfig.buffers
  775. end
  776. for i = 1,c do
  777. ret[i] = skillConfig.buffers[i]
  778. end
  779. for i = 1,c do
  780. if i <= randBuffCnt then
  781. local r = math.random(i,c)
  782. ret[i],ret[r] = ret[r],ret[i]
  783. else
  784. ret[i] = nil
  785. end
  786. end
  787. return ret
  788. end
  789. -- 战斗回合中触发buffer
  790. function onHit(attacker, skillTargets, skillConfig, cmdTargets, otherArgs)
  791. -- 处理施法者身上的buff
  792. if skillConfig.type == CombatDefine.SKILL_TYPE2 and
  793. attacker.buffer ~= nil then
  794. delayBegin()
  795. for j = attacker.buffer[0], 1, -1 do
  796. local buffer = attacker.buffer[j]
  797. local conf = BufferExcel.buffer[buffer.id]
  798. buffer.attrs = { }
  799. if attacker.hp > 0 and handlerEx[conf.cmd] then
  800. if handlerEx[conf.cmd](attacker, buffer, conf) then
  801. CombatImpl.addFrameBuffer(attacker, buffer, CombatDefine.BUFFER_OP_HOLD)
  802. end
  803. end
  804. end
  805. delayEnd()
  806. end
  807. for k, v in ipairs(skillTargets) do
  808. if attacker.helpType == 0 and attacker.side ~= v.side then
  809. local fantanBufferInd = v.bufferCmd["fantan"] and v.bufferCmd["fantan"][1]
  810. local fantanBuffer = v.buffer[fantanBufferInd]
  811. if fantanBuffer then
  812. local conf = BufferExcel.buffer[fantanBuffer.id]
  813. -- 是否限制技能类型
  814. local bHit = false
  815. if conf.args[3] then
  816. if conf.args[3] == skillConfig.type then
  817. bHit = true
  818. end
  819. else
  820. bHit = true
  821. end
  822. if bHit then
  823. local hurt = CombatCalc.calcHp(attacker, v, conf.args[1], conf.args[2])
  824. local d = CombatObj.updateHp(attacker, - hurt, nil, nil, v.pos, CombatObj.BUFFER_HP_TYPE)
  825. CombatImpl.setExtraHit(attacker, d)
  826. CombatObj.onHpCB(attacker, d, v.pos)
  827. end
  828. end
  829. end
  830. -- 只能敌方攻击触发降低冰冻
  831. if not(otherArgs and otherArgs.noFirst) and skillConfig.hurtRate[1] then
  832. local bufferCmd = v.bufferCmd["bingdong"]
  833. if bufferCmd then
  834. local delList = { }
  835. for i = #bufferCmd, 1, -1 do
  836. local bingdongBuffer = v.buffer[bufferCmd[i]]
  837. local conf = BufferExcel.buffer[bingdongBuffer.id]
  838. bingdongBuffer.arg = bingdongBuffer.arg or 0
  839. bingdongBuffer.arg = bingdongBuffer.arg + 1
  840. if bingdongBuffer.arg >=(conf.args[1] or 0) then
  841. delList[#delList + 1] = bufferCmd[i]
  842. end
  843. end
  844. --冰冻buffer被打碎
  845. if #delList > 0 then
  846. local delBuffer = v.buffer[delList[1]]
  847. BeSkill.onDelBingDongBuffer(v, delBuffer)
  848. end
  849. for k1, v1 in ipairs(delList) do
  850. local buffer = v.buffer[v1]
  851. local bufferCnt = delBuffer(v, v1)
  852. CombatImpl.addFrameBuffer(v, buffer, CombatDefine.BUFFER_OP_DEL)
  853. end
  854. end
  855. end
  856. end
  857. local buffers = getSkillBuffers(skillConfig)
  858. local statusBuffRate = skillConfig.otherArgs.statusBuffRate
  859. for i = 1, #buffers do
  860. local bufferID = buffers[i][1]
  861. if type(bufferID) == "table" then
  862. local r = math.random(1, #bufferID)
  863. bufferID = bufferID[r]
  864. end
  865. local targetMode = buffers[i][2]
  866. local random = buffers[i][3]
  867. local bufferEx = buffers[i][4]
  868. local delayRound = buffers[i][5]
  869. if attacker.isPet and #skillConfig.bufferGrow > 0 then
  870. local growRate = 0
  871. local bufLv = attacker.lv
  872. if attacker.quality > 1 then
  873. bufLv = attacker.lv -(attacker.quality - 1) * 30
  874. end
  875. if skillConfig.bufferGrow and skillConfig.bufferGrow[i] then
  876. local gorwRat = skillConfig.bufferGrow[i][1]
  877. local growLv = skillConfig.bufferGrow[i][2]
  878. growRate = math.floor(bufLv / growLv) * gorwRat
  879. end
  880. random = random + growRate
  881. end
  882. local targets = TargetMode.getTargets(attacker, targetMode, skillTargets, cmdTargets, nil, nil, skillConfig.id)
  883. if #targets > 0 then
  884. local bufferConf = BufferExcel.buffer[bufferID]
  885. for _, target in ipairs(targets) do
  886. local r = random
  887. if statusBuffRate and bufferConf.cmd == statusBuffRate[1] and isStatus(target, statusBuffRate[2]) then
  888. r = r + statusBuffRate[3]
  889. end
  890. if canAdd(target, bufferID, r, attacker, skillConfig) then
  891. local arg
  892. if bufferConf.cmd == "zuzhou" then
  893. local rate = bufferConf.args[2] + BeSkill.getBufferExtraHurt(attacker, bufferID, bufferConf.cmd)
  894. arg = { CombatCalc.calcHp(attacker, target, bufferConf.args[1], rate) }
  895. end
  896. if bufferConf.cmd == "stealattr" then
  897. local value = CombatCalc.calcValue(attacker, target, bufferConf.args[1], bufferConf.args[2])
  898. arg = { { bufferConf.args[3], value } }
  899. end
  900. if bufferConf.cmd == "handleattr" then
  901. arg = { }
  902. if attacker.handleAttr then
  903. local value = attacker.handleAttr[2] *(bufferConf.args[1] / 10000)
  904. if target.side == attacker.side then
  905. arg = { { attacker.handleAttr[1], value * bufferConf.args[2] } }
  906. else
  907. arg = { { attacker.handleAttr[1], - value } }
  908. end
  909. end
  910. end
  911. if delayRound and delayRound > 0 then
  912. target.delayAddBuffer = target.delayAddBuffer or { }
  913. target.delayAddBuffer[#target.delayAddBuffer + 1] = { delayRound, attacker.pos, bufferID, skillConfig.id, arg }
  914. else
  915. addBuffer(attacker.pos, target, bufferID, skillConfig.id, arg)
  916. end
  917. if bufferEx then
  918. local bufferID = bufferEx[1]
  919. local random = bufferEx[2]
  920. local delayRound = bufferEx[3]
  921. local bufferConf = BufferExcel.buffer[bufferID]
  922. for _, target in ipairs(targets) do
  923. local r = random
  924. if canAdd(target, bufferID, r, attacker, skillConfig) then
  925. local arg
  926. if bufferConf.cmd == "zuzhou" then
  927. local rate = bufferConf.args[2] + BeSkill.getBufferExtraHurt(attacker, bufferID, bufferConf.cmd)
  928. arg = { CombatCalc.calcHp(attacker, target, bufferConf.args[1], rate) }
  929. end
  930. if bufferConf.cmd == "stealattr" then
  931. local value = CombatCalc.calcValue(attacker, target, bufferConf.args[1], bufferConf.args[2])
  932. arg = { { bufferConf.args[3], value } }
  933. end
  934. if bufferConf.cmd == "handleattr" then
  935. arg = { }
  936. if attacker.handleAttr then
  937. local value = attacker.handleAttr[2] *(bufferConf.args[1] / 10000)
  938. if target.side == attacker.side then
  939. arg = { { attacker.handleAttr[1], value * bufferConf.args[2] } }
  940. else
  941. arg = { { attacker.handleAttr[1], - value } }
  942. end
  943. end
  944. end
  945. if delayRound and delayRound > 0 then
  946. target.delayAddBuffer = target.delayAddBuffer or { }
  947. target.delayAddBuffer[#target.delayAddBuffer + 1] = { delayRound, attacker.pos, bufferID, skillConfig.id, arg }
  948. else
  949. addBuffer(attacker.pos, target, bufferID, skillConfig.id, arg)
  950. end
  951. end
  952. end
  953. end
  954. end
  955. end
  956. end
  957. end
  958. end
  959. local function getBeskillBuffers(attacker,skillConfig)
  960. if skillConfig.otherArgs.buffer then
  961. local checkArg = skillConfig.otherArgs.buffer
  962. local checkValue
  963. if checkArg.cmd == "hurtRate" then
  964. checkValue = -attacker.combatResult[1]
  965. elseif checkArg.cmd == "hpRate" then
  966. checkValue = attacker.combatResult[2]
  967. end
  968. if checkValue and checkValue > 0 then
  969. local hpMax = attacker.attr[RoleDefine.HP]
  970. local rate = (10000 * checkValue)/(hpMax * checkArg.param[1])
  971. if rate > 1 then
  972. local retArg = {}
  973. for k,v in ipairs(checkArg.param[2]) do
  974. retArg[#retArg + 1] = {v[1],math.floor(v[2] * rate)}
  975. end
  976. return skillConfig.buffers,retArg
  977. end
  978. end
  979. else
  980. return skillConfig.buffers
  981. end
  982. end
  983. function onUseBeSkill(attacker,skillConfig,objs,cmdTargets, arg)--attacker是被动技能释放者,objs是attacker的对立方(attacker是攻击者的话,objs是被攻击者,attacker是被攻击者的话,objs是攻击者),cmdTargets是额外作用对象
  984. local buffers,bufferArg = getBeskillBuffers(attacker,skillConfig)
  985. if not buffers then
  986. return
  987. end
  988. bufferArg = bufferArg or arg
  989. local isAddSkillFrame
  990. local bufferArg1
  991. for i = 1, #buffers do
  992. local bufferID = buffers[i][1]
  993. local bufferConf = BufferExcel.buffer[bufferID]
  994. local targetMode = buffers[i][2]
  995. local targets
  996. bufferArg1 = nil
  997. if targetMode[1] == 13 then
  998. targets = objs
  999. else
  1000. targets = TargetMode.getTargets(attacker, targetMode,objs,cmdTargets)
  1001. end
  1002. if #targets > 0 then
  1003. if bufferConf.cmd == "zuzhou" then
  1004. local rate = bufferConf.args[2] + BeSkill.getBufferExtraHurt(attacker,bufferID)
  1005. bufferArg1 = {CombatCalc.calcHp(attacker,targets[1],bufferConf.args[1],rate)}
  1006. end
  1007. local attackPos = attacker.pos
  1008. if bufferConf.roundOne == 1 and objs and objs[1] then
  1009. attackPos = objs[1].pos
  1010. end
  1011. for _,target in ipairs(targets) do
  1012. if canAdd(target,bufferID,buffers[i][3], attacker, skillConfig) then
  1013. isAddSkillFrame = true
  1014. addBuffer(attackPos,target, bufferID,skillConfig.id,bufferArg1 or bufferArg)
  1015. end
  1016. end
  1017. end
  1018. end
  1019. return isAddSkillFrame
  1020. end
  1021. --战斗回合结束时处理buffer效果。删除失效buffer
  1022. --只执行一次的cmd,比如持续加血。
  1023. HANDLER_ONCE = HANDLER_ONCE or {}
  1024. function onRoundEnd(attacker,isRoundEnd)
  1025. --处理施法者身上的buff
  1026. for i = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1027. local obj = CombatImpl.objList[i]
  1028. if obj then
  1029. for k,v in pairs(HANDLER_ONCE) do
  1030. HANDLER_ONCE[k] = nil
  1031. end
  1032. delayBegin()
  1033. for j = obj.buffer[0], 1, -1 do
  1034. local buffer = obj.buffer[j]
  1035. local conf = BufferExcel.buffer[buffer.id]
  1036. if conf.type == CombatDefine.BUFFER_TYPE1 or isRoundEnd then
  1037. buffer.attrs = {}
  1038. local setFrame = false
  1039. if conf.type ~= CombatDefine.BUFFER_TYPE4 and handler[conf.cmd] then
  1040. if obj.hp > 0 or conf.cmd == "totem" then
  1041. if conf.cmd == "zuzhou" then
  1042. -- 最后一回合生效
  1043. if buffer.round == 1 then
  1044. handler[conf.cmd](obj, buffer,conf)
  1045. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_HOLD)
  1046. end
  1047. else
  1048. handler[conf.cmd](obj, buffer,conf)
  1049. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_HOLD)
  1050. end
  1051. end
  1052. end
  1053. if buffer.round then
  1054. local cmd = conf.cmd
  1055. buffer.round = buffer.round - 1
  1056. if buffer.round < 1 then
  1057. local bufferCnt = delBuffer(obj, j)
  1058. if (conf.type ~= CombatDefine.BUFFER_TYPE1 and obj.hp > 0) or conf.cmd == "fixPos" or conf.holdOnDie == 1 then
  1059. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
  1060. end
  1061. end
  1062. end
  1063. end
  1064. end
  1065. if isRoundEnd and obj.delayAddBuffer then
  1066. --{delayRound,attacker.pos,bufferID,skillConfig.id,arg}
  1067. for k,v in ipairs(obj.delayAddBuffer) do
  1068. v[1] = v[1] - 1
  1069. end
  1070. local temp = {}
  1071. for i = 1,#obj.delayAddBuffer do
  1072. local data = obj.delayAddBuffer[i]
  1073. if data[1] > 0 then
  1074. temp[#temp + 1] = data
  1075. else
  1076. addBuffer(data[2],obj,data[3],data[4],data[5])
  1077. end
  1078. end
  1079. if #temp > 0 then
  1080. obj.delayAddBuffer = temp
  1081. else
  1082. obj.delayAddBuffer = nil
  1083. end
  1084. end
  1085. delayEnd()
  1086. end
  1087. end
  1088. for k,v in pairs(HANDLER_ONCE) do
  1089. HANDLER_ONCE[k] = nil
  1090. end
  1091. end
  1092. --攻击结束后,反击前,整合buffer前处理buffer效果
  1093. function beforeFanji()
  1094. local isFanshe = false
  1095. for i = 1,CombatDefine.COMBAT_HERO_ALL_CNT do
  1096. local obj = CombatImpl.objList[i]
  1097. if obj then
  1098. for k,v in pairs(obj.combatResult[3]) do
  1099. if k ~= i and v[1] and v[1] < 0 then
  1100. local target = CombatImpl.objList[k]
  1101. if target and target.hp > 0 then
  1102. local d = CombatObj.updateHp(target, v[1], nil, nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
  1103. CombatImpl.setExtraHit(target,d)
  1104. CombatObj.onHpCB(target,d, obj.pos)
  1105. isFanshe = true
  1106. end
  1107. end
  1108. end
  1109. if isFanshe then
  1110. delBufferByCmd(obj,"fansheZhuangjia",1)
  1111. end
  1112. end
  1113. end
  1114. end
  1115. function getExtraHurtRate(attacker,target,skillConfig)
  1116. local skillID = skillConfig.id
  1117. local isBaoji = target.isBaoji
  1118. local baojiHurtRate = 0
  1119. local guanxinzheHurtRate = 0
  1120. local huiheHurtRate = 0
  1121. local shandianHurtRate = 0
  1122. local attackerHurtRat = 0
  1123. local biaoshiHurtRate = 0
  1124. local biaoshiCnt = 0
  1125. local biaoshiCntLimit
  1126. if skillConfig.otherArgs.biaoshiHurtRate then
  1127. biaoshiCntLimit = skillConfig.otherArgs.biaoshiHurtRate[1]
  1128. end
  1129. for j = target.buffer[0], 1, -1 do
  1130. local obj = target
  1131. local buffer = obj.buffer[j]
  1132. local conf = BufferExcel.buffer[buffer.id]
  1133. if conf.cmd == "guanxinzheYinji" then --观星者印记
  1134. guanxinzheHurtRate = guanxinzheHurtRate + conf.args[2]
  1135. elseif conf.cmd == "shandianYinji" then --闪电印记
  1136. for _,v in ipairs(conf.args[2]) do
  1137. if skillID == v then
  1138. shandianHurtRate = shandianHurtRate + conf.args[3]
  1139. break
  1140. end
  1141. end
  1142. elseif conf.cmd == "biaoshi" then
  1143. biaoshiCnt = biaoshiCnt + 1
  1144. end
  1145. end
  1146. guanxinzheHurtRate = guanxinzheHurtRate > 30000 and 30000 or guanxinzheHurtRate --300%限制
  1147. if biaoshiCntLimit and biaoshiCnt >= biaoshiCntLimit then
  1148. biaoshiHurtRate = skillConfig.otherArgs.biaoshiHurtRate[2]
  1149. end
  1150. local extraHurtRate = baojiHurtRate + guanxinzheHurtRate + huiheHurtRate + shandianHurtRate + attackerHurtRat + biaoshiHurtRate
  1151. return extraHurtRate
  1152. end
  1153. function getExtraHurt(attacker, target, skillConfig)
  1154. local extraHurt = 0
  1155. for j = target.buffer[0], 1, -1 do
  1156. local obj = target
  1157. local buffer = obj.buffer[j]
  1158. local conf = BufferExcel.buffer[buffer.id]
  1159. if conf.cmd == "shenhuo" then
  1160. local hurt = CombatCalc.calcHp(attacker, target, conf.args[1], conf.args[2], true)
  1161. extraHurt = extraHurt + hurt
  1162. end
  1163. end
  1164. return extraHurt
  1165. end
  1166. --处理器
  1167. local function chixuHurtDel(target,buffer)
  1168. local hurt = buffer.arg
  1169. local hurtDelRate = target.attr[RoleDefine.CHIXU_HURT_DEL_RATE] / 10000
  1170. --持续类buff 伤害加成
  1171. local attacker = CombatImpl.objList[buffer.attackPos]
  1172. local conf = BufferExcel.buffer[buffer.id]
  1173. local beSkillHurtRate = BeSkill.getBuffChixuHurt(attacker, conf.cmd)
  1174. hurtDelRate = hurtDelRate > 1 and 1 or hurtDelRate
  1175. if hurtDelRate > 0 or beSkillHurtRate > 0 then
  1176. hurt = hurt * (1 - hurtDelRate + beSkillHurtRate)
  1177. end
  1178. return hurt
  1179. end
  1180. handler = {}
  1181. --持续伤害
  1182. function handler.hurt(target, buffer,conf)
  1183. local hurt = chixuHurtDel(target,buffer)
  1184. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1185. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1186. end
  1187. --燃烧
  1188. function handler.hurt1(target, buffer,conf)
  1189. local hurt = chixuHurtDel(target,buffer)
  1190. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1191. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1192. onExtraCombatRecord(buffer.attackPos,hurt,"ranshao")
  1193. -- 删除attr1 buffer
  1194. local attacker = CombatImpl.objList[buffer.attackPos]
  1195. if attacker and attacker.bufferCmd["attr1"] then
  1196. for i = #attacker.bufferCmd["attr1"],1,-1 do
  1197. local ind = attacker.bufferCmd["attr1"][i]
  1198. local buff = attacker.buffer[ind]
  1199. local conf = BufferExcel.buffer[buff.id]
  1200. local bufferCnt = delBuffer(attacker, ind)
  1201. CombatImpl.addFrameBuffer(attacker, buff, CombatDefine.BUFFER_OP_DEL)
  1202. end
  1203. end
  1204. end
  1205. --持续治疗
  1206. function handler.hp(target, buffer,conf)
  1207. if target.bufferCmd["noHp"] then
  1208. return
  1209. end
  1210. if HANDLER_ONCE["hp"] == target.pos then
  1211. return
  1212. end
  1213. local hp = buffer.arg
  1214. local attacker = CombatImpl.objList[buffer.attackPos]
  1215. if attacker and attacker.attr[RoleDefine.ZAOCHENG_HP_ADD_RATE] then
  1216. local hpAddRate = attacker.attr[RoleDefine.ZAOCHENG_HP_ADD_RATE] / 10000
  1217. hp = hp * (1 + hpAddRate)
  1218. end
  1219. local calcType = conf and conf.args[1] or 0
  1220. if CombatCalc.NO_EXCALC_LIST[calcType] and target.attr[RoleDefine.HP_ADD_RATE] then
  1221. local hpAddRate = target.attr[RoleDefine.HP_ADD_RATE] / 10000
  1222. hp = hp * (1 + hpAddRate)
  1223. end
  1224. hp = hp < 0 and 1 or hp
  1225. if target.side == CombatDefine.DEFEND_SIDE then
  1226. hp = CombatImpl.commonArgs.hpLimit or hp
  1227. end
  1228. local d = CombatObj.updateHp(target, hp, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1229. buffer.attrs[RoleDefine.HP_COMBAT] = hp
  1230. HANDLER_ONCE["hp"] = target.pos
  1231. end
  1232. --流血
  1233. function handler.liuxue(target, buffer,conf)
  1234. local hurt = chixuHurtDel(target,buffer)
  1235. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1236. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1237. onExtraCombatRecord(buffer.attackPos,hurt,"liuxue")
  1238. end
  1239. --中毒
  1240. function handler.zhongdu(target, buffer,conf)
  1241. local hurt = chixuHurtDel(target,buffer)
  1242. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1243. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1244. onExtraCombatRecord(buffer.attackPos,hurt,"zhongdu")
  1245. end
  1246. --燃烧
  1247. function handler.ranshao(target, buffer,conf)
  1248. local hurt = chixuHurtDel(target,buffer)
  1249. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1250. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1251. onExtraCombatRecord(buffer.attackPos,hurt,"ranshao")
  1252. end
  1253. --燃烧
  1254. function handler.ranshao1(target, buffer,conf)
  1255. local hurt = chixuHurtDel(target,buffer)
  1256. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1257. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1258. onExtraCombatRecord(buffer.attackPos,hurt,"ranshao")
  1259. end
  1260. --回合印记
  1261. function handler.huiheYinji(target, buffer,conf)
  1262. if buffer.round > 1 then return end --最后一回合才生效
  1263. local hurt = chixuHurtDel(target,buffer)
  1264. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1265. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1266. end
  1267. --种子
  1268. function handler.zhongzi(target, buffer, conf)
  1269. if buffer.round > 1 then return end --最后一回合才生效
  1270. local cnt = #conf.args
  1271. for i= 1, cnt do
  1272. local bufferID = conf.args[i]
  1273. if canAdd(target,bufferID) then
  1274. addBuffer(buffer.attackPos, target, bufferID)
  1275. end
  1276. end
  1277. end
  1278. --buffer包处理器
  1279. --偷取护甲
  1280. function handler.touquhujia(attacker,target,conf)
  1281. local arg = conf.args[1]/10000
  1282. local targetBufferID = conf.args[2]
  1283. local attackerBufferID = conf.args[3]
  1284. local def = CombatObj.getValue(target,RoleDefine.DEF)
  1285. --local rate = CombatObj.getValue(target,RoleDefine.DEF_RATE)/10000
  1286. --def = def * (1 + rate)
  1287. def = def > 0 and def or 0
  1288. local arg = def * arg
  1289. if arg > 0 then
  1290. if canAdd(attacker,attackerBufferID) then
  1291. addBuffer(target.pos,attacker, attackerBufferID,nil,arg,conf)
  1292. end
  1293. if canAdd(target,targetBufferID) then
  1294. addBuffer(attacker.pos,target, targetBufferID,nil,-arg,conf)
  1295. end
  1296. end
  1297. end
  1298. --偷取攻击
  1299. function handler.touqugongji(attacker,target,conf)
  1300. local arg = conf.args[1]/10000
  1301. local targetBufferID = conf.args[2]
  1302. local attackerBufferID = conf.args[3]
  1303. local atk = CombatObj.getValue(target,RoleDefine.ATK)
  1304. --local rate = CombatObj.getValue(target,RoleDefine.ATK_RATE)/10000
  1305. --def = def * (1 + rate)
  1306. atk = atk > 0 and atk or 0
  1307. local arg = atk * arg
  1308. if arg > 0 then
  1309. if canAdd(attacker,attackerBufferID) then
  1310. addBuffer(target.pos,attacker, attackerBufferID,nil,arg,conf)
  1311. end
  1312. if canAdd(target,targetBufferID) then
  1313. addBuffer(attacker.pos,target, targetBufferID,nil,-arg,conf)
  1314. end
  1315. end
  1316. end
  1317. function handler.totem(obj,buffer,conf)
  1318. --图腾逻辑
  1319. local buffers = conf.args
  1320. for i = 1, #buffers do
  1321. local bufferID = buffers[i][1]
  1322. if type(bufferID) == "table" then
  1323. local r = math.random(1,#bufferID)
  1324. bufferID = bufferID[r]
  1325. end
  1326. local targetMode = buffers[i][2]
  1327. local random = buffers[i][3]
  1328. local targets = TargetMode.getTargets(obj, targetMode,{})
  1329. if #targets > 0 then
  1330. for _,target in ipairs(targets) do
  1331. if canAdd(target,bufferID,random) then
  1332. addBuffer(obj.pos,target, bufferID)
  1333. end
  1334. end
  1335. end
  1336. end
  1337. end
  1338. function handler.groupbuffer(attacker,target,conf)
  1339. for _,bufferID in ipairs(conf.args) do
  1340. if canAdd(target,bufferID) then
  1341. addBuffer(attacker.pos,target, bufferID,nil,nil,conf)
  1342. end
  1343. end
  1344. end
  1345. function handler.zuzhou(target,buffer,conf)
  1346. local hurt = buffer.arg[1]
  1347. local attacker = CombatImpl.objList[buffer.attackPos]
  1348. -- 二次元结算方式调整成
  1349. if BeSkill.getRandomBuffCmd(attacker, target, conf.cmd) and target.bufferCmd[conf.cmd] then
  1350. hurt = hurt * #target.bufferCmd[conf.cmd]
  1351. end
  1352. local beSkillHurtRate = BeSkill.getBuffChixuHurt(attacker, conf.cmd)
  1353. hurt = hurt * (1 + beSkillHurtRate)
  1354. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1355. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1356. BeSkill.handlerBuff(attacker, target, hurt, conf.cmd)
  1357. end
  1358. function yinbaoZuzhou(obj, skillTargets, skillConfig)
  1359. local newFrame = nil
  1360. for k,v in ipairs(skillTargets) do
  1361. if v.bufferCmd["zuzhou"] then
  1362. for i = #v.bufferCmd["zuzhou"],1,-1 do
  1363. local ind = v.bufferCmd["zuzhou"][i]
  1364. local buffer = v.buffer[ind]
  1365. local conf = BufferExcel.buffer[buffer.id]
  1366. if conf and handler[conf.cmd] then
  1367. handler[conf.cmd](v, buffer, conf)
  1368. CombatImpl.addFrameBuffer(v,buffer,CombatDefine.BUFFER_OP_HOLD)
  1369. end
  1370. local bufferCnt = delBuffer(v, ind)
  1371. CombatImpl.addFrameBuffer(v,buffer,CombatDefine.BUFFER_OP_DEL)
  1372. newFrame = true
  1373. end
  1374. end
  1375. end
  1376. -- 有引爆成功的
  1377. if newFrame and ProjectLogic.isSsecy() then
  1378. CombatImpl.addFrame()
  1379. end
  1380. end
  1381. --主动技能释放后buff作用
  1382. handlerEx = {}
  1383. --印记
  1384. function handlerEx.yinJi(target, buffer, conf)
  1385. local attacker = CombatImpl.objList[buffer.attackPos]
  1386. if attacker == nil then
  1387. return
  1388. end
  1389. local hurtRate = conf.args[1]
  1390. local hurtRateMax = conf.args[2]
  1391. local hpMax = CombatObj.getHpMax(target)
  1392. local hurt = hurtRate * hpMax / 10000
  1393. local atk = CombatObj.getValue(attacker,RoleDefine.ATK) * hurtRateMax / 10000
  1394. if hurt > atk then
  1395. hurt = atk
  1396. end
  1397. local d = CombatObj.updateHp(target, -hurt, nil, nil, buffer.attackPos,CombatObj.BUFFER_HP_TYPE)
  1398. buffer.attrs[RoleDefine.HP_COMBAT] = -hurt
  1399. return true
  1400. end
  1401. function qingsuan(target)
  1402. if target.hp <= 0 then
  1403. return 0
  1404. end
  1405. local baseValue = 0
  1406. local round
  1407. for j = target.buffer[0], 1, -1 do
  1408. local buffer = target.buffer[j]
  1409. local conf = BufferExcel.buffer[buffer.id]
  1410. local cmd = conf.cmd
  1411. if cmd == "ranshao" or cmd == "ranshao1" or cmd == "liuxue" or cmd == "zhongdu" or cmd == "hurt" or cmd == "hurt1" then
  1412. round = 1
  1413. if buffer.round and buffer.round > 0 then
  1414. round = buffer.round
  1415. end
  1416. baseValue = baseValue + buffer.arg * round
  1417. local bufferCnt = delBuffer(target, j)
  1418. CombatImpl.addFrameBuffer(target,buffer,CombatDefine.BUFFER_OP_DEL)
  1419. end
  1420. end
  1421. return baseValue
  1422. end
  1423. --解控
  1424. function jiekong(target)
  1425. if target.hp <= 0 then
  1426. return 0
  1427. end
  1428. local baseValue = 0
  1429. local state = false
  1430. for j = target.buffer[0], 1, -1 do
  1431. local buffer = target.buffer[j]
  1432. local conf = BufferExcel.buffer[buffer.id]
  1433. local cmd = conf.cmd
  1434. if isControlCmd(cmd) then
  1435. local bufferCnt = delBuffer(target, j)
  1436. CombatImpl.addFrameBuffer(target,buffer,CombatDefine.BUFFER_OP_DEL)
  1437. state = true
  1438. end
  1439. end
  1440. if state == true then
  1441. CombatImpl.setExtraHit(target,nil, Skill.getCMD2ID("jiekong"))
  1442. end
  1443. end
  1444. --杀意
  1445. function delShayi(target)
  1446. if target.hp <= 0 then
  1447. return 0
  1448. end
  1449. for j = target.buffer[0], 1, -1 do
  1450. local buffer = target.buffer[j]
  1451. local conf = BufferExcel.buffer[buffer.id]
  1452. local cmd = conf.cmd
  1453. if cmd == "shayi" then
  1454. local bufferCnt = delBuffer(target, j)
  1455. CombatImpl.addFrameBuffer(target,buffer,CombatDefine.BUFFER_OP_DEL)
  1456. end
  1457. end
  1458. end
  1459. function getBuffCnt(target,checkCmd)
  1460. if target.hp <= 0 then
  1461. return 0
  1462. end
  1463. local cnt = 0
  1464. for j = target.buffer[0], 1, -1 do
  1465. local buffer = target.buffer[j]
  1466. local conf = BufferExcel.buffer[buffer.id]
  1467. local cmd = conf.cmd
  1468. if cmd == checkCmd then
  1469. cnt = cnt + 1
  1470. end
  1471. end
  1472. return cnt
  1473. end
  1474. -- 获取护盾值
  1475. function getBuffHuDun(obj)
  1476. if obj and obj.bufferAttr and obj.bufferAttr[RoleDefine.HUDUN_COMBAT] then
  1477. return obj.bufferAttr[RoleDefine.HUDUN_COMBAT]
  1478. end
  1479. return 0
  1480. end
  1481. -- 护盾值的修改
  1482. function updateHuDun(obj, value)
  1483. if obj and obj.bufferAttr then
  1484. local oldValue = obj.bufferAttr[RoleDefine.HUDUN_COMBAT] or 0
  1485. local newValue = oldValue + value
  1486. if newValue <= 0 then
  1487. obj.bufferAttr[RoleDefine.HUDUN_COMBAT] = 0
  1488. delBufferByCmd(obj,"hudun", 0)
  1489. else
  1490. obj.bufferAttr[RoleDefine.HUDUN_COMBAT] = newValue
  1491. end
  1492. -- 护盾值没有全部去除 则 在对应英雄上吧 BUF 上的arg 数值 减除 防止 BufChange 重置 属性
  1493. if value < 0 and newValue > 0 then
  1494. if obj and obj.buffer then
  1495. for j = 1 , obj.buffer[0] do -- 从最早的护盾BUF中删除arg
  1496. local buffer = obj.buffer[j]
  1497. local conf = BufferExcel.buffer[buffer.id]
  1498. local bufferCmd = conf.cmd
  1499. if bufferCmd == "hudun" then
  1500. local have = buffer.arg
  1501. if have > -value then
  1502. buffer.arg = have + value
  1503. else
  1504. buffer.arg = 0
  1505. local bufferCnt = delBuffer(obj, j)
  1506. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
  1507. break
  1508. end
  1509. end
  1510. end
  1511. end
  1512. end
  1513. end
  1514. end
  1515. BUFFER_COMBAT_TYPE = nil
  1516. function initCombatBufferType()
  1517. if BUFFER_COMBAT_TYPE then return end
  1518. BUFFER_COMBAT_TYPE = {}
  1519. for k,conf in pairs(BufferExcel.qusan) do
  1520. if conf then
  1521. BUFFER_COMBAT_TYPE[conf.buffcmd] = conf.type
  1522. end
  1523. end
  1524. end
  1525. --
  1526. function getCombatBufferCnt(target, qusanType)
  1527. initCombatBufferType()
  1528. local buffCnt = 0
  1529. for i = target.buffer[0], 1, -1 do
  1530. local buffer = target.buffer[i]
  1531. local conf = BufferExcel.buffer[buffer.id]
  1532. local cmd = conf.cmd
  1533. if BUFFER_COMBAT_TYPE[cmd] and BUFFER_COMBAT_TYPE[cmd] == qusanType then
  1534. buffCnt = buffCnt + 1
  1535. end
  1536. end
  1537. return buffCnt
  1538. end
  1539. --抵抗
  1540. QUSAN_CMD2KEY = {
  1541. ["zuzhou"] = RoleDefine.STATUS_DIKANG_RATE9,
  1542. }
  1543. function qusan(target, qusanType,cnt)
  1544. if target.isPet or not qusanType then
  1545. return 0
  1546. end
  1547. initCombatBufferType()
  1548. local state = false
  1549. local delIndex = {}
  1550. for i = target.buffer[0], 1, -1 do
  1551. local buffer = target.buffer[i]
  1552. local conf = BufferExcel.buffer[buffer.id]
  1553. local cmd = conf.cmd
  1554. if conf.noQusan ~= 1 then
  1555. if BUFFER_COMBAT_TYPE[cmd] and BUFFER_COMBAT_TYPE[cmd] == qusanType then
  1556. local isDiKang = nil
  1557. local key = QUSAN_CMD2KEY[cmd]
  1558. local r = math.random(1,10000)
  1559. if key and target.attr[key] >= r then
  1560. isDiKang = true
  1561. end
  1562. if not isDiKang then
  1563. delIndex[#delIndex + 1] = i
  1564. end
  1565. elseif cmd == "attr" or cmd == "attrdne" then
  1566. if conf.args and conf.args[1][2] < 0 and qusanType == 1 then
  1567. delIndex[#delIndex + 1] = i
  1568. elseif conf.args and conf.args[1][2] > 0 and qusanType == 2 then
  1569. delIndex[#delIndex + 1] = i
  1570. end
  1571. end
  1572. end
  1573. end
  1574. cnt = cnt or 0
  1575. if cnt > 0 and cnt < #delIndex then
  1576. for i = cnt + 1,#delIndex do
  1577. delIndex[i] = nil
  1578. end
  1579. end
  1580. for k,v in ipairs(delIndex) do
  1581. local buffer = target.buffer[v]
  1582. if not buffer then break end
  1583. local bufferCnt = delBuffer(target, v)
  1584. CombatImpl.addFrameBuffer(target,buffer,CombatDefine.BUFFER_OP_DEL)
  1585. end
  1586. return #delIndex
  1587. end
  1588. function qusanAddBuff(attacker, targets, bufferID)
  1589. for _,target in ipairs(targets) do
  1590. if canAdd(target,bufferID) then
  1591. addBuffer(attacker.pos, target, bufferID)
  1592. end
  1593. end
  1594. end
  1595. function beforeUpdateHp(obj,sum)
  1596. local isStatus,cmd,ind = isStatus(obj,{"miansi","waitMiansi"})
  1597. if not isStatus then
  1598. return
  1599. end
  1600. --免死逻辑
  1601. if cmd == "miansi" then
  1602. return true
  1603. end
  1604. if sum == 0 and cmd == "waitMiansi" then
  1605. local buffer = obj.buffer[ind]
  1606. local bufferCnt = delBuffer(obj, ind)
  1607. CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
  1608. local conf = BufferExcel.buffer[buffer.id]
  1609. local bufferID = conf.args[1]
  1610. if canAdd(obj,bufferID) then
  1611. addBuffer(obj.pos,obj, bufferID)
  1612. end
  1613. return true
  1614. end
  1615. end
  1616. function checkBaohu(obj,value)
  1617. local isStatus,cmd,ind = isStatus(obj,{"baohu"})
  1618. if not isStatus then
  1619. return value
  1620. end
  1621. local buffer = obj.buffer[ind]
  1622. local attackPos = buffer.attackPos
  1623. local attacker = CombatImpl.objList[attackPos]
  1624. if attacker.hp <= 0 then
  1625. return value
  1626. end
  1627. value = BeSkill.onCheckBuffer(attacker,obj,value)
  1628. return value
  1629. end
  1630. function onExtraCombatRecord(pos,value,param)
  1631. local obj = CombatObj.getObjByPos(pos)
  1632. if not obj then return end
  1633. obj.extraCombatRecord = obj.extraCombatRecord or {}
  1634. if param == "zhongdu" then
  1635. obj.extraCombatRecord.zhongdu = (obj.extraCombatRecord.zhongdu or 0) + value
  1636. elseif param == "liuxue" then
  1637. obj.extraCombatRecord.liuxue = (obj.extraCombatRecord.liuxue or 0) + value
  1638. elseif param == "ranshao" then
  1639. obj.extraCombatRecord.ranshao = (obj.extraCombatRecord.ranshao or 0) + value
  1640. elseif param == "xuanyun" then
  1641. obj.extraCombatRecord.xuanyun = (obj.extraCombatRecord.xuanyun or 0) + value
  1642. elseif param == "revive" then
  1643. obj.extraCombatRecord.revive = (obj.extraCombatRecord.revive or 0) + value
  1644. elseif param == "reviveBeUse" then
  1645. obj.extraCombatRecord.reviveBeUse = (obj.extraCombatRecord.reviveBeUse or 0) + value
  1646. elseif param == "kill" then
  1647. obj.extraCombatRecord.kill = (obj.extraCombatRecord.kill or 0) + value
  1648. end
  1649. end