Skill.lua 35 KB

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