Skill.lua 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. local CombatImpl = require("combat.CombatImpl")
  2. local TargetMode = require("combat.TargetMode")
  3. local CombatCalc = require("combat.CombatCalc")
  4. local CombatObj = require("combat.CombatObj")
  5. local RoleDefine = require("role.RoleDefine")
  6. local CombatBuff = require("combat.CombatBuff")
  7. local CombatDefine = require("combat.CombatDefine")
  8. local BeSkill = require("combat.BeSkill")
  9. local Util = require("common.Util")
  10. local SkillExcel = require("excel.skill").skill
  11. local CmdExcel = require("excel.skill").cmd
  12. local ProjectLogic = require("platform.ProjectLogic")
  13. local BufferExcel = require("excel.buffer")
  14. function setSkill(obj,config,skinConfig)
  15. config = skinConfig or config
  16. local skillList = {}
  17. local skillConfig
  18. local normalAtkID = config.normalAtkID
  19. local temp = {}
  20. --普通技能
  21. if normalAtkID then
  22. skillConfig = SkillExcel[normalAtkID]
  23. skillList[#skillList + 1] = {normalAtkID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  24. temp[normalAtkID] = true
  25. end
  26. --主动技能
  27. for _,skillID in ipairs(config.skillList) do
  28. skillConfig = SkillExcel[skillID]
  29. if not temp[skillID] and skillConfig and skillConfig.need <= obj.quality then
  30. skillList[#skillList + 1] = {skillID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  31. temp[skillID] = true
  32. end
  33. end
  34. if #skillList > 1 then
  35. table.sort(skillList,function(a,b)
  36. return a[3] > b[3]
  37. end)
  38. end
  39. obj.skillList = skillList
  40. end
  41. CMD2ID = {}
  42. function initAfterHot()
  43. for k,v in pairs(CMD2ID) do
  44. CMD2ID[k] = nil
  45. end
  46. for k,v in pairs(CmdExcel) do
  47. CMD2ID[v.cmd] = k
  48. end
  49. end
  50. function getCMD2ID(cmd)
  51. return CMD2ID[cmd]
  52. end
  53. GroupSkillCnt = 0--技能包触发技能次数
  54. local function realUse(obj, skillID, fanjiTargets,otherArgs)
  55. local skillConfig = SkillExcel[skillID]
  56. CombatImpl.nowAttacker = obj
  57. if skillConfig then
  58. --直接伤害
  59. CombatCalc.initAttacker(obj)
  60. --print("skill realuse:",obj.pos,skillID,skillConfig.targetMode[1],skillConfig.targetMode[2])
  61. local targets = TargetMode.getTargets(obj, skillConfig.targetMode, fanjiTargets, nil , true,skillConfig.type == CombatDefine.SKILL_TYPE1,skillID)
  62. local len = #targets
  63. if len < 1 then return end
  64. for i=1, len do
  65. local defobj = targets[i]
  66. CombatCalc.initAttacker(defobj)
  67. end
  68. GroupSkillCnt = GroupSkillCnt + 1
  69. -- 复活技能不走这里
  70. if skillConfig.cmd ~= "revive" then
  71. CombatImpl.addFrame()
  72. CombatImpl.setSkillID(obj, skillID)
  73. CombatImpl.setSaySkill(obj.pos,skillConfig.id,skillConfig.contentType)
  74. end
  75. attack(obj, targets, skillConfig)
  76. if not fanjiTargets and skillConfig.otherArgs.addBuffBeforeCmd then
  77. CombatBuff.onHit(obj,targets,skillConfig)
  78. end
  79. --额外作用
  80. local cmdTargets
  81. if CMD[skillConfig.cmd] then
  82. cmdTargets = CMD[skillConfig.cmd](obj, skillConfig, targets)
  83. end
  84. if not fanjiTargets then
  85. if not skillConfig.otherArgs.addBuffBeforeCmd then
  86. CombatBuff.onHit(obj,targets,skillConfig,cmdTargets,otherArgs)
  87. end
  88. end
  89. BeSkill.onHit(obj,targets,skillID)
  90. CombatImpl.totalAtkCnt = CombatImpl.totalAtkCnt + 1
  91. end
  92. CombatImpl.nowAttacker = nil
  93. end
  94. function use(obj, skillID, fanjiTargets)
  95. local skillConfig = SkillExcel[skillID]
  96. GroupSkillCnt = 0
  97. if skillConfig.type == CombatDefine.SKILL_TYPE5 then
  98. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  99. local config = SkillExcel[v]
  100. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  101. if #targets > 0 then
  102. realUse(obj, v,fanjiTargets)
  103. return
  104. end
  105. end
  106. elseif skillConfig.type == CombatDefine.SKILL_TYPE6 then
  107. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  108. local config = SkillExcel[v]
  109. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  110. if #targets > 0 then
  111. realUse(obj, v,fanjiTargets,{noFirst = (k ~= 1)})
  112. end
  113. end
  114. elseif skillConfig.type == CombatDefine.SKILL_TYPE7 then
  115. local r = math.random(1,10000)
  116. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  117. if r <= v[1] then
  118. local config = SkillExcel[v[2]]
  119. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  120. if #targets > 0 then
  121. realUse(obj, v[2], fanjiTargets)
  122. end
  123. return
  124. else
  125. r = r - v[1]
  126. end
  127. end
  128. else
  129. realUse(obj, skillID,fanjiTargets)
  130. end
  131. end
  132. local hitList = {}
  133. local flagList = {}
  134. function attack(obj, targets, skillConfig)
  135. if not skillConfig.hurtRate[1] then obj.isAllCalcHp = true return end
  136. local totalHurt = 0
  137. local limitHurt = 0
  138. local fenTanHurt = 0
  139. -- 分摊技能操作
  140. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan and skillConfig.otherArgs.hurtFenTan[1] == 1 then
  141. for index = 1, #targets do
  142. local target = targets[index]
  143. if target.hp > 0 then
  144. local hurt, flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  145. fenTanHurt = hurt
  146. limitHurt = CombatObj.getValue(obj,RoleDefine.ATK) * skillConfig.otherArgs.hurtFenTan[2]
  147. if fenTanHurt >= limitHurt then
  148. fenTanHurt = limitHurt
  149. end
  150. flagList[index] = flagList[index] or 0
  151. flagList[index] = flag
  152. end
  153. end
  154. end
  155. local len = 0
  156. obj.isAllCalcHp = nil
  157. if #targets == 0 then
  158. obj.isAllCalcHp = true
  159. end
  160. for index = 1, #targets do
  161. local target = targets[index]
  162. if target.hp > 0 then
  163. BeSkill.beforeHit(obj,target)
  164. local hurt,flag = nil
  165. if fenTanHurt == 0 then
  166. hurt,flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  167. target.isShanBi = Util.getBit(flag, CombatDefine.FLAG_SHANBI)
  168. else
  169. hurt = fenTanHurt
  170. flag = flagList[index]
  171. end
  172. -- 闪避不处理目标被动技能
  173. obj.isAllCalcHp = index == #targets
  174. target.attackSkillID = skillConfig.id
  175. local hpValue,srcValue = 0,0
  176. if hurt > 0 then
  177. hpValue,srcValue = CombatObj.updateHp(target, -hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  178. CombatObj.onHpCB(target,hpValue,obj.pos,skillConfig.id)
  179. end
  180. CombatImpl.setSkillHit(target,srcValue,nil,flag,obj,skillConfig.id)
  181. if target.isShanBi ~= 1 then
  182. len = len + 1
  183. hitList[len] = target
  184. BeSkill.afterHit(obj,target)
  185. end
  186. target.attackSkillID = nil
  187. end
  188. end
  189. -- 处理命中列表
  190. for index = 1, #targets do
  191. targets[index] = nil
  192. end
  193. for index = 1, len do
  194. targets[index] = hitList[index]
  195. end
  196. end
  197. local function calcHp(attacker,target,calcType,rate,limit,isAddHp,param, flag)
  198. local hp = CombatCalc.calcHp(attacker,target,calcType,rate, isAddHp, flag)
  199. if param and param.targetCnt then
  200. hp = hp / param.targetCnt
  201. end
  202. if limit then
  203. if hp > limit then
  204. hp = limit
  205. end
  206. end
  207. return hp
  208. end
  209. CMD = {}
  210. function CMD.hp(obj,skillConfig,skillTargets)
  211. local ret = {}
  212. local args = obj.isPet and obj.args or skillConfig.args
  213. local r = math.random(0,10000)
  214. if args[4] and r > args[4] then
  215. return
  216. end
  217. local calcType = args[1]
  218. local rate = args[2]
  219. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  220. local targetCnt = #targets
  221. local hp
  222. local limit
  223. if args[5] and args[5] > 0 then
  224. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  225. end
  226. if not obj.isPet and args[6] and args[6] > 0 then
  227. limit = args[6] * CombatObj.getHpMax(obj) / 10000
  228. end
  229. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  230. for _,target in ipairs(targets) do
  231. if not target.bufferCmd["noHp"] then
  232. hp = calcHp(obj,target,calcType,rate,limit,true)
  233. hp = hp * (1 + hpAddRate)
  234. hp = hp < 0 and 1 or hp
  235. if hp > 0 and obj.isAllCalcHp == true then
  236. if target.side == CombatDefine.DEFEND_SIDE then
  237. hp = CombatImpl.commonArgs.hpLimit or hp
  238. end
  239. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  240. local showHp = hp
  241. if hp > 0 and d < 0 then
  242. showHp = hp * (-1)
  243. end
  244. CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
  245. CombatObj.onHpCB(target,d, obj.pos)
  246. end
  247. if hp < 0 then
  248. if target.side == CombatDefine.DEFEND_SIDE then
  249. hp = CombatImpl.commonArgs.hpLimit or hp
  250. end
  251. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  252. if hp > 0 and d < 0 then
  253. hp = hp * (-1)
  254. end
  255. CombatImpl.setExtraHit(target, hp, CMD2ID["hp"])
  256. CombatObj.onHpCB(target,d, obj.pos)
  257. end
  258. ret[#ret+1] = target
  259. end
  260. end
  261. return ret
  262. end
  263. function CMD.speedHp(obj,skillConfig,skillTargets)
  264. if not (skillTargets and skillTargets[1]) then
  265. return
  266. end
  267. local args = obj.isPet and obj.args or skillConfig.args
  268. local r = math.random(0,10000)
  269. if args[4] and r > args[4] then
  270. return
  271. end
  272. local calcType = args[1]
  273. local rate = args[2]
  274. local target = skillTargets[1]
  275. local ret = {}
  276. local hp
  277. local limit
  278. if args[5] then
  279. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  280. end
  281. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  282. local aSpeed = CombatImpl.getValue(obj,RoleDefine.SPEED)
  283. local bSpeed = CombatImpl.getValue(target,RoleDefine.SPEED)
  284. local checkSpeed = aSpeed - bSpeed
  285. if args[3] == 1 then
  286. checkSpeed = -checkSpeed
  287. end
  288. if checkSpeed > 0 then
  289. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  290. for _,target in ipairs(targets) do
  291. hp = calcHp(obj,target,calcType,rate,limit,true)
  292. hp = hp * (1 + hpAddRate)
  293. hp = hp < 0 and 1 or hp
  294. if hp ~= 0 and not target.bufferCmd["noHp"] then
  295. if target.side == CombatDefine.DEFEND_SIDE then
  296. hp = CombatImpl.commonArgs.hpLimit or hp
  297. end
  298. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  299. if hp > 0 and d < 0 then
  300. hp = hp * (-1)
  301. end
  302. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  303. CombatObj.onHpCB(target,d, obj.pos)
  304. end
  305. ret[#ret+1] = target
  306. end
  307. end
  308. return ret
  309. end
  310. function CMD.statusHp(obj,skillConfig,skillTargets)
  311. if not skillTargets then
  312. return
  313. end
  314. local isAdd = false
  315. local args = obj.isPet and obj.args or skillConfig.args
  316. for _,v in ipairs(skillTargets) do
  317. if CombatBuff.isStatus(v,args[4]) then
  318. isAdd = true
  319. break
  320. end
  321. end
  322. if not isAdd then return end
  323. local calcType = args[1]
  324. local rate = args[2]
  325. local ret = {}
  326. local hp
  327. local limit
  328. if args[5] then
  329. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  330. end
  331. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  332. for _,target in ipairs(targets) do
  333. hp = calcHp(obj,target,calcType,rate,limit,true)
  334. hp = hp < 0 and 1 or hp
  335. if hp ~= 0 and not target.bufferCmd["noHp"] then
  336. if target.side == CombatDefine.DEFEND_SIDE then
  337. hp = CombatImpl.commonArgs.hpLimit or hp
  338. end
  339. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  340. if hp > 0 and d < 0 then
  341. hp = hp * (-1)
  342. end
  343. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  344. CombatObj.onHpCB(target,d, obj.pos)
  345. end
  346. ret[#ret+1] = target
  347. end
  348. return ret
  349. end
  350. function CMD.hurt(obj,skillConfig,skillTargets)
  351. local args = obj.isPet and obj.args or skillConfig.args
  352. local r = math.random(0,10000)
  353. if r > args[4] then
  354. return
  355. end
  356. local calcType = args[1]
  357. local rate = args[2]
  358. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  359. local hp
  360. local limit
  361. local ret = {}
  362. if args[5] then
  363. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  364. end
  365. for _,target in ipairs(targets) do
  366. hp = calcHp(obj,target,calcType,rate,limit)
  367. if hp ~= 0 then
  368. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  369. if d ~= 0 then
  370. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  371. CombatObj.onHpCB(target,d, obj.pos)
  372. ret[#ret+1] = target
  373. end
  374. end
  375. end
  376. return ret
  377. end
  378. function CMD.behurt(obj,skillConfig,skillTargets)
  379. local args = obj.isPet and obj.args or skillConfig.args
  380. local r = math.random(0,10000)
  381. if r > args[4] then
  382. return
  383. end
  384. local calcType = args[1]
  385. local rate = args[2]
  386. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  387. local hp
  388. local limit
  389. local ret = {}
  390. if args[5] then
  391. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  392. end
  393. for _,target in ipairs(targets) do
  394. if calcType ~= 17 then
  395. hp = calcHp(target,obj,calcType,rate,limit)
  396. else
  397. hp = calcHp(obj, target,calcType,rate,limit)
  398. end
  399. if hp ~= 0 then
  400. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  401. if d ~= 0 then
  402. CombatImpl.setExtraHit(target,-hp,CMD2ID["behurt"])
  403. CombatObj.onHpCB(target,d, obj.pos)
  404. ret[#ret+1] = target
  405. end
  406. end
  407. end
  408. return ret
  409. end
  410. function CMD.hurtwalun(obj,skillConfig,skillTargets)
  411. local args = obj.isPet and obj.args or skillConfig.args
  412. local r = math.random(0,10000)
  413. if r > args[4] then
  414. return
  415. end
  416. local calcType = args[1]
  417. local rate = args[2]
  418. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  419. local hp
  420. local limit
  421. local ret = {}
  422. if args[5] then
  423. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  424. end
  425. for _,target in ipairs(targets) do
  426. hp = calcHp(obj,target,calcType,rate,limit)
  427. if hp ~= 0 then
  428. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  429. if d ~= 0 then
  430. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun"])
  431. CombatObj.onHpCB(target,d, obj.pos)
  432. ret[#ret+1] = target
  433. end
  434. end
  435. end
  436. return ret
  437. end
  438. function CMD.posHurt(obj,skillConfig,skillTargets)
  439. local args = obj.isPet and obj.args or skillConfig.args
  440. local r = math.random(0,10000)
  441. if r > args[4] then
  442. return
  443. end
  444. local calcType = args[1]
  445. local rate = args[2]
  446. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  447. local hp
  448. local limit
  449. local ret = {}
  450. if args[5] then
  451. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  452. end
  453. local posList = args[6]
  454. if posList == nil then
  455. return
  456. end
  457. for _,target in ipairs(targets) do
  458. local bfind = false
  459. for k, v in pairs(posList) do
  460. if v == target.pos then
  461. bfind = true
  462. break
  463. end
  464. end
  465. if bfind then
  466. hp = calcHp(obj,target,calcType,rate,limit, false)
  467. if hp ~= 0 then
  468. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  469. if d ~= 0 then
  470. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  471. CombatObj.onHpCB(target,d, obj.pos)
  472. ret[#ret+1] = target
  473. end
  474. end
  475. end
  476. end
  477. return ret
  478. end
  479. function CMD.hurtxia(obj,skillConfig,skillTargets)
  480. local args = obj.isPet and obj.args or skillConfig.args
  481. local r = math.random(0,10000)
  482. if r > args[4] then
  483. return
  484. end
  485. local calcType = args[1]
  486. local rate = args[2]
  487. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  488. local hp
  489. local limit
  490. local ret = {}
  491. if args[5] then
  492. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  493. end
  494. for _,target in ipairs(targets) do
  495. hp = calcHp(obj,target,calcType,rate,limit)
  496. if hp ~= 0 then
  497. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  498. if d ~= 0 then
  499. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia"])
  500. CombatObj.onHpCB(target,d, obj.pos)
  501. ret[#ret+1] = target
  502. end
  503. end
  504. end
  505. return ret
  506. end
  507. function CMD.hurtmingli(obj,skillConfig,skillTargets)
  508. local args = obj.isPet and obj.args or skillConfig.args
  509. local r = math.random(0,10000)
  510. if r > args[4] then
  511. return
  512. end
  513. local calcType = args[1]
  514. local rate = args[2]
  515. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  516. local hp
  517. local limit
  518. local ret = {}
  519. if args[5] then
  520. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  521. end
  522. for _,target in ipairs(targets) do
  523. hp = calcHp(obj,target,calcType,rate,limit)
  524. if hp ~= 0 then
  525. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  526. if d ~= 0 then
  527. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli"])
  528. CombatObj.onHpCB(target,d, obj.pos)
  529. ret[#ret+1] = target
  530. end
  531. end
  532. end
  533. return ret
  534. end
  535. function CMD.hurtmingli2(obj,skillConfig,skillTargets)
  536. local args = obj.isPet and obj.args or skillConfig.args
  537. local r = math.random(0,10000)
  538. if r > args[4] then
  539. return
  540. end
  541. local calcType = args[1]
  542. local rate = args[2]
  543. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  544. local hp
  545. local limit
  546. local ret = {}
  547. if args[5] then
  548. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  549. end
  550. for _,target in ipairs(targets) do
  551. hp = calcHp(obj,target,calcType,rate,limit)
  552. if hp ~= 0 then
  553. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  554. if d ~= 0 then
  555. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli2"])
  556. CombatObj.onHpCB(target,d, obj.pos)
  557. ret[#ret+1] = target
  558. end
  559. end
  560. end
  561. return ret
  562. end
  563. function CMD.hurtguangci(obj,skillConfig,skillTargets)
  564. local args = obj.isPet and obj.args or skillConfig.args
  565. local r = math.random(0,10000)
  566. if r > args[4] then
  567. return
  568. end
  569. local calcType = args[1]
  570. local rate = args[2]
  571. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  572. local hp
  573. local limit
  574. local ret = {}
  575. if args[5] then
  576. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  577. end
  578. for _,target in ipairs(targets) do
  579. hp = calcHp(obj,target,calcType,rate,limit)
  580. if hp ~= 0 then
  581. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  582. if d ~= 0 then
  583. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtguangci"])
  584. CombatObj.onHpCB(target,d, obj.pos)
  585. ret[#ret+1] = target
  586. end
  587. end
  588. end
  589. return ret
  590. end
  591. function CMD.jobHurt(obj,skillConfig,skillTargets)
  592. local args = obj.isPet and obj.args or skillConfig.args
  593. local calcType = args[1]
  594. local rate = args[2]
  595. local r = math.random(0,10000)
  596. if r > args[3] then
  597. return
  598. end
  599. local job = args[4]
  600. local hp
  601. local limit
  602. if args[5] then
  603. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  604. end
  605. local ret = {}
  606. for _,target in ipairs(skillTargets) do
  607. if target.job == job then
  608. hp = calcHp(obj,target,calcType,rate,limit)
  609. if hp and hp ~= 0 then
  610. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  611. if d ~= 0 then
  612. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  613. CombatObj.onHpCB(target,d, obj.pos)
  614. ret[#ret+1] = target
  615. end
  616. end
  617. end
  618. end
  619. return ret
  620. end
  621. function CMD.statusHurt(obj,skillConfig,skillTargets)
  622. local args = obj.isPet and obj.args or skillConfig.args
  623. local calcType = args[1]
  624. local rate = args[2]
  625. local r = math.random(0,10000)
  626. if r > args[3] then
  627. return
  628. end
  629. local status = args[4]
  630. local hp
  631. local limit
  632. if args[5] then
  633. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  634. end
  635. local ret = {}
  636. for _,target in ipairs(skillTargets) do
  637. if CombatBuff.isStatus(target, status) then
  638. hp = calcHp(obj,target,calcType,rate,limit)
  639. if hp and hp ~= 0 then
  640. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  641. if d ~= 0 then
  642. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  643. CombatObj.onHpCB(target,d, obj.pos)
  644. ret[#ret+1] = target
  645. end
  646. end
  647. end
  648. end
  649. return ret
  650. end
  651. function CMD.hpHurt(obj,skillConfig,skillTargets)
  652. local args = obj.isPet and obj.args or skillConfig.args
  653. local calcType = args[1]
  654. local rate = args[2]
  655. local hpRate = args[3]/10000
  656. local ret = {}
  657. for _,target in ipairs(skillTargets) do
  658. local hpLimit = CombatObj.getHpMax(target) * hpRate
  659. if target.hp >= hpLimit then
  660. hp = calcHp(obj,target,calcType,rate)
  661. if hp and hp ~= 0 then
  662. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  663. if d ~= 0 then
  664. CombatImpl.setExtraHit(target,-hp,CMD2ID["hpHurt"])
  665. CombatObj.onHpCB(target,d, obj.pos)
  666. ret[#ret+1] = target
  667. end
  668. end
  669. end
  670. end
  671. return ret
  672. end
  673. function CMD.fanji(obj,skillConfig,skillTargets)
  674. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  675. if CombatBuff.isStatus(obj,{"xuanyun","shihua","bingdong"}) then return end
  676. if obj.side == skillTargets[1].side then
  677. return
  678. end
  679. if obj.hp > 0 then
  680. local r = math.random(0,10000)
  681. if r < skillConfig.args[2] then
  682. CombatImpl.fanjiList[#CombatImpl.fanjiList + 1] = {obj,skillConfig.args[1],skillTargets}
  683. end
  684. end
  685. end
  686. function CMD.qingsuan(obj,skillConfig,skillTargets)
  687. if obj.isPet then return {} end
  688. local args = skillConfig.args
  689. local r = math.random(0,10000)
  690. if r > args[3] then
  691. return
  692. end
  693. local rate = args[1]
  694. local limit
  695. if args[4] then
  696. limit = args[4] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  697. end
  698. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  699. local ret = {}
  700. for _,target in ipairs(targets) do
  701. local baseValue = CombatBuff.qingsuan(target)
  702. if baseValue > 0 then
  703. local hurt = baseValue * rate / 10000
  704. if limit and hurt > limit then
  705. hurt = limit
  706. end
  707. local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  708. CombatImpl.setExtraHit(target,-hurt,CMD2ID["qingsuan"])
  709. CombatObj.onHpCB(target,d, obj.pos)
  710. ret[#ret+1] = target
  711. end
  712. end
  713. return ret
  714. end
  715. function CMD.jiekong(obj,skillConfig,skillTargets)
  716. if obj.isPet then return {} end
  717. local args = skillConfig.args
  718. local r = math.random(0,10000)
  719. if r > args[2] then
  720. return
  721. end
  722. local targets = TargetMode.getTargets(obj, args[1],skillTargets)
  723. local ret = {}
  724. for _,target in ipairs(targets) do
  725. CombatBuff.jiekong(target)
  726. ret[#ret+1] = target
  727. end
  728. return ret
  729. end
  730. function CMD.groupcmd(obj,skillConfig,skillTargets)
  731. if obj.isPet then return {} end
  732. for k,v in ipairs(skillConfig.args) do
  733. local cmd = v[1]
  734. local conf = {args = v[2]}
  735. if CMD[cmd] then
  736. CMD[cmd](obj,conf,skillTargets)
  737. end
  738. end
  739. return {}
  740. end
  741. function CMD.randcmd(obj,skillConfig,skillTargets)
  742. if obj.isPet then return {} end
  743. local total = 0
  744. for k,v in ipairs(skillConfig.args) do
  745. total = total + v[3]
  746. end
  747. local r = math.random(0,total)
  748. for k,v in ipairs(skillConfig.args) do
  749. if r <= v[3] then
  750. local cmd = v[1]
  751. local conf = {args = v[2]}
  752. if CMD[cmd] then
  753. CMD[cmd](obj,conf,skillTargets)
  754. end
  755. break
  756. else
  757. r = r - v[1]
  758. end
  759. end
  760. return {}
  761. end
  762. function CMD.qusan(obj,skillConfig,skillTargets)
  763. if obj.isPet then return {} end
  764. local args = skillConfig.args
  765. local r = math.random(0,10000)
  766. if r > args[3] then
  767. return
  768. end
  769. local qusanType = args[1]
  770. local calcType = args[5] and args[5][1]
  771. local rate = args[5] and args[5][2]
  772. local buffers = args[8] and args[8][1]
  773. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  774. local ret = {}
  775. if args[7] then
  776. limit = args[7] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  777. end
  778. for _,target in ipairs(targets) do
  779. local cnt = CombatBuff.qusan(target, qusanType,args[4])
  780. if limit then
  781. limit = limit * cnt
  782. end
  783. if buffers and cnt > 0 then
  784. local targets = TargetMode.getTargets(obj, args[8][2],skillTargets)
  785. CombatBuff.qusanAddBuff(obj, targets, buffers)
  786. end
  787. ret[#ret+1] = target
  788. if calcType and rate and cnt > 0 then
  789. local hp = calcHp(obj,target,calcType,rate * cnt, limit, nil, nil, args[6])
  790. if hp ~= 0 then
  791. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  792. if d ~= 0 then
  793. CombatImpl.setExtraHit(target,-hp,CMD2ID["qusan"])
  794. CombatObj.onHpCB(target,d, obj.pos)
  795. end
  796. end
  797. end
  798. end
  799. return ret
  800. end
  801. function CMD.hurtwalun2(obj,skillConfig,skillTargets)
  802. local args = obj.isPet and obj.args or skillConfig.args
  803. local r = math.random(0,10000)
  804. if r > args[4] then
  805. return
  806. end
  807. local calcType = args[1]
  808. local rate = args[2]
  809. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  810. local hp
  811. local limit
  812. local ret = {}
  813. if args[5] then
  814. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  815. end
  816. for _,target in ipairs(targets) do
  817. hp = calcHp(obj,target,calcType,rate,limit)
  818. if hp ~= 0 then
  819. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  820. if d ~= 0 then
  821. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun2"])
  822. CombatObj.onHpCB(target,d, obj.pos)
  823. ret[#ret+1] = target
  824. end
  825. end
  826. end
  827. return ret
  828. end
  829. function CMD.hurtxia2(obj,skillConfig,skillTargets)
  830. local args = obj.isPet and obj.args or skillConfig.args
  831. local r = math.random(0,10000)
  832. if r > args[4] then
  833. return
  834. end
  835. local calcType = args[1]
  836. local rate = args[2]
  837. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  838. local hp
  839. local limit
  840. local ret = {}
  841. if args[5] then
  842. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  843. end
  844. for _,target in ipairs(targets) do
  845. hp = calcHp(obj,target,calcType,rate,limit)
  846. if hp ~= 0 then
  847. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  848. if d ~= 0 then
  849. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia2"])
  850. CombatObj.onHpCB(target,d, obj.pos)
  851. ret[#ret+1] = target
  852. end
  853. end
  854. end
  855. return ret
  856. end
  857. function CMD.hurtxia3(obj,skillConfig,skillTargets)
  858. local args = obj.isPet and obj.args or skillConfig.args
  859. local r = math.random(0,10000)
  860. if r > args[4] then
  861. return
  862. end
  863. local calcType = args[1]
  864. local rate = args[2]
  865. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  866. local hp
  867. local limit
  868. local ret = {}
  869. if args[5] then
  870. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  871. end
  872. for _,target in ipairs(targets) do
  873. hp = calcHp(obj,target,calcType,rate,limit)
  874. if hp ~= 0 then
  875. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  876. if d ~= 0 then
  877. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia3"])
  878. CombatObj.onHpCB(target,d, obj.pos)
  879. ret[#ret+1] = target
  880. end
  881. end
  882. end
  883. return ret
  884. end
  885. NO_SKILL_CHECK_COMBO_LIST = {
  886. ["hp"] = 1,
  887. ["revive"] = 1,
  888. ["baohu"] = 1,
  889. }
  890. function skillIsHpOrRevive(argSkillID)
  891. local argSkillConf = SkillExcel[argSkillID]
  892. if not argSkillConf then return end
  893. -- 带有伤害
  894. if argSkillConf.hurtRate[1] then return end
  895. if argSkillConf.continuous and argSkillConf.continuous == 1 then return true end
  896. if NO_SKILL_CHECK_COMBO_LIST[argSkillConf.cmd] then
  897. return true
  898. end
  899. local bRet = false
  900. if argSkillConf.cmd == "groupcmd" then
  901. for k,v in ipairs(argSkillConf.args) do
  902. local cmd = v[1]
  903. if cmd == "hurt" then return end
  904. if NO_SKILL_CHECK_COMBO_LIST[cmd] then
  905. bRet = true
  906. end
  907. end
  908. end
  909. -- 技能包
  910. if argSkillConf.type == CombatDefine.SKILL_TYPE5 or
  911. argSkillConf.type == CombatDefine.SKILL_TYPE6 or
  912. argSkillConf.type == CombatDefine.SKILL_TYPE7 then
  913. for k,v in ipairs(argSkillConf.otherArgs.skillList) do
  914. local config = SkillExcel[v]
  915. -- 带有伤害
  916. if config and config.hurtRate[1] then return end
  917. if config then
  918. if NO_SKILL_CHECK_COMBO_LIST[config.cmd] or config.continuous == 1 then
  919. bRet = true
  920. end
  921. for k,v in ipairs(config.buffers) do
  922. local bufConfig = BufferExcel.buffer[v[1]]
  923. -- 带有伤害
  924. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  925. bRet = true
  926. end
  927. end
  928. end
  929. end
  930. for k,v in ipairs(argSkillConf.buffers) do
  931. local bufConfig = BufferExcel[v[1]]
  932. -- 带有伤害
  933. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  934. bRet = true
  935. end
  936. end
  937. end
  938. return bRet
  939. end
  940. function CMD.combo(obj,skillConfig,skillTargets)
  941. -- 二次元 屏蔽 治疗 复活的连击
  942. if ProjectLogic.isSsecy() then
  943. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  944. if skillIsHpOrRevive(argSkillID) then
  945. return
  946. end
  947. if skillIsHpOrRevive(skillConfig.id) then
  948. return
  949. end
  950. end
  951. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  952. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  953. local r = math.random(0,10000)
  954. if r < skillConfig.args[1] then
  955. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  956. return true
  957. end
  958. end
  959. --
  960. function CMD.comboFight(obj,skillConfig,skillTargets)
  961. -- 二次元 屏蔽 治疗 复活的连击
  962. if ProjectLogic.isSsecy() then
  963. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  964. if skillIsHpOrRevive(argSkillID) then
  965. return
  966. end
  967. if skillIsHpOrRevive(skillConfig.id) then
  968. return
  969. end
  970. end
  971. if CombatImpl.isFanji then return end
  972. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  973. local r = math.random(0,10000)
  974. if r < skillConfig.args[1] then
  975. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  976. return true
  977. end
  978. end
  979. function CMD.combo1(obj,skillConfig,skillTargets)
  980. -- 二次元 屏蔽 治疗 复活的连击
  981. if ProjectLogic.isSsecy() then
  982. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  983. if skillIsHpOrRevive(skillConfig) then
  984. return
  985. end
  986. if skillIsHpOrRevive(skillConfig.id) then
  987. return
  988. end
  989. end
  990. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  991. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  992. local r = math.random(0,10000)
  993. if r < skillConfig.args[1] then
  994. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],2}
  995. return true
  996. end
  997. end
  998. function CMD.combo2(obj,skillConfig,skillTargets)
  999. -- 二次元 屏蔽 治疗 复活的连击
  1000. if ProjectLogic.isSsecy() then
  1001. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1002. if skillIsHpOrRevive(argSkillID) then
  1003. return
  1004. end
  1005. if skillIsHpOrRevive(skillConfig.id) then
  1006. return
  1007. end
  1008. end
  1009. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1010. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1011. local r = math.random(0,10000)
  1012. if r < skillConfig.args[1] then
  1013. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],3}
  1014. return true
  1015. end
  1016. end
  1017. function CMD.comboNormal(obj, skillConfig, skillTargets)
  1018. -- 二次元 屏蔽 治疗 复活的连击
  1019. if ProjectLogic.isSsecy() then
  1020. local argSkillID = skillConfig.args[3] or CombatImpl.getNormalSkill(obj)
  1021. if skillIsHpOrRevive(argSkillID) then
  1022. return
  1023. end
  1024. if skillIsHpOrRevive(skillConfig.id) then
  1025. return
  1026. end
  1027. end
  1028. if CombatImpl.comboType > 0 then return end
  1029. if CombatImpl.isFanji then
  1030. if GroupSkillCnt > 2 then return end
  1031. else
  1032. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1033. end
  1034. local r = math.random(0,10000)
  1035. if r < skillConfig.args[1] then
  1036. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 2, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1}
  1037. end
  1038. end
  1039. function CMD.baohu(obj,skillConfig,skillTargets)
  1040. local d = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
  1041. if d ~= 0 then
  1042. local attrs = {}
  1043. attrs[RoleDefine.BAOHU_COMBAT] = skillTargets[1].pos
  1044. CombatImpl.setExtraHit(obj,d,CMD2ID["baohu"],attrs)
  1045. CombatObj.onHpCB(obj,d, skillTargets[1].pos)
  1046. end
  1047. end
  1048. function CMD.yinbaoZuzhou(obj,skillConfig,skillTargets)
  1049. CombatBuff.yinbaoZuzhou(obj, skillTargets, skillConfig)
  1050. end
  1051. --指定普攻目标模式
  1052. function CMD.normalTarget(obj,skillConfig)
  1053. obj.normalTarget = {status = {}}
  1054. if skillConfig.args.status then
  1055. for k,v in ipairs(skillConfig.args.status) do
  1056. obj.normalTarget.status[k] = v
  1057. end
  1058. end
  1059. end
  1060. --诅咒附加伤害
  1061. function CMD.zuzhouHurt(obj, skillConfig, skillTargets)
  1062. if not obj.args then return end
  1063. local confArgs = skillConfig.args
  1064. local targets = TargetMode.getTargets(obj, confArgs[1], skillTargets)
  1065. local zuzhouHurt = obj.args * confArgs[2] / 10000
  1066. for _,target in ipairs(targets) do
  1067. if zuzhouHurt ~= 0 then
  1068. local d = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1069. if d ~= 0 then
  1070. CombatImpl.setExtraHit(target,-zuzhouHurt,CMD2ID["zuzhouHurt"])
  1071. CombatObj.onHpCB(target,d, obj.pos)
  1072. end
  1073. end
  1074. end
  1075. obj.args = nil
  1076. end
  1077. function CMD.dnexhurt(obj,skillConfig,skillTargets)
  1078. local args = obj.isPet and obj.args or skillConfig.args
  1079. local r = math.random(0,10000)
  1080. if r > args[4] then
  1081. return
  1082. end
  1083. local calcType = args[1]
  1084. local rate = args[2]
  1085. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1086. local hp
  1087. local limit
  1088. local ret = {}
  1089. if args[5] then
  1090. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK)
  1091. end
  1092. for _,target in ipairs(targets) do
  1093. hp = calcHp(obj,target,calcType,rate,limit)
  1094. if hp ~= 0 then
  1095. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1096. if d ~= 0 then
  1097. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  1098. CombatObj.onHpCB(target,d, obj.pos)
  1099. ret[#ret+1] = target
  1100. end
  1101. end
  1102. end
  1103. return ret
  1104. end