Skill.lua 35 KB

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