Skill.lua 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794
  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. local weaponSkillConfig = require("excel.weapon").skill
  15. local function calcHp(attacker,target,calcType,rate,limit,isAddHp,param, flag)
  16. local hp = CombatCalc.calcHp(attacker,target,calcType,rate, isAddHp, flag)
  17. if param and param.targetCnt then
  18. hp = hp / param.targetCnt
  19. end
  20. if limit then
  21. if hp > limit then
  22. hp = limit
  23. end
  24. end
  25. return hp
  26. end
  27. function GetSkillConfig(skillId)
  28. return weaponSkillConfig[skillId] or SkillExcel[skillId]
  29. end
  30. --如果该技能属于专属武器加强的技能, 则用专属武器配置表中的配置
  31. function GetFinalSkillConfig(obj, skillId)
  32. local targetId = skillId
  33. if obj and obj.weaponEffectIdList and obj.weaponEffectIdList[skillId] then
  34. targetId = obj.weaponEffectIdList[skillId]
  35. end
  36. return GetSkillConfig(targetId)
  37. end
  38. -- 技能释放条件检测表
  39. COND_CMD = {}
  40. -- 技能释放代价表
  41. COST_CMD = {}
  42. -- 技能释放条件检查
  43. function COND_CMD.attrCheck(obj, skillId)
  44. local skillConfig = GetSkillConfig(skillId)
  45. local skillCond = skillConfig.cond
  46. local attrType = skillCond[2]
  47. local attrCondVal = skillCond[3] * 100
  48. local nowAttrVal = CombatObj.getValue(obj, attrType)
  49. if nowAttrVal <= attrCondVal then
  50. return false
  51. end
  52. return true
  53. end
  54. -- 扣除技能释放的消耗, 暂时写死,胡须再看看怎么优化
  55. function COST_CMD.attrCheck(obj, skillConfig)
  56. local skillCond = skillConfig.cond
  57. local rate = skillCond[3] * 100
  58. local hurt = calcHp(obj, {}, 2, rate)
  59. if hurt ~= 0 then
  60. local d = CombatObj.updateHp(obj,-hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  61. if d ~= 0 then
  62. CombatImpl.setExtraHit(obj,-hurt,CMD2ID["hurt"])
  63. CombatObj.onHpCB(obj, d, obj.pos)
  64. end
  65. end
  66. end
  67. -- 技能释放条件检测
  68. function SkillCondCheck(obj, skillId)
  69. local skillConfig = GetSkillConfig(skillId)
  70. local skillCond = skillConfig.cond
  71. if not skillCond or not next(skillCond) then
  72. return true
  73. end
  74. if COND_CMD[skillCond[1]] then
  75. return COND_CMD[skillCond[1]](obj, skillId)
  76. end
  77. return false
  78. end
  79. function setSkill(obj,config,skinConfig)
  80. config = skinConfig or config
  81. local skillList = {}
  82. local skillConfig
  83. local normalAtkID = config.normalAtkID
  84. local temp = {}
  85. --普通技能
  86. if normalAtkID then
  87. --skillConfig = SkillExcel[normalAtkID]
  88. skillConfig = GetFinalSkillConfig(obj, normalAtkID)
  89. normalAtkID = skillConfig.id
  90. skillList[#skillList + 1] = {normalAtkID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  91. temp[normalAtkID] = true
  92. end
  93. --主动技能
  94. for _,skillID in ipairs(config.skillList) do
  95. --skillConfig = SkillExcel[skillID]
  96. --使用新的ID
  97. skillConfig = GetFinalSkillConfig(obj, skillID)
  98. skillID = skillConfig.id
  99. if not temp[skillID] and skillConfig and skillConfig.need <= obj.quality then
  100. skillList[#skillList + 1] = {skillID,skillConfig.cd[1] or 0,skillConfig.cd[2] or 0}--skillID,开始使用回合,冷切回合
  101. temp[skillID] = true
  102. end
  103. end
  104. if #skillList > 1 then
  105. table.sort(skillList,function(a,b)
  106. return a[3] > b[3]
  107. end)
  108. end
  109. obj.skillList = skillList
  110. end
  111. CMD2ID = {}
  112. function initAfterHot()
  113. for k,v in pairs(CMD2ID) do
  114. CMD2ID[k] = nil
  115. end
  116. for k,v in pairs(CmdExcel) do
  117. CMD2ID[v.cmd] = k
  118. end
  119. end
  120. function getCMD2ID(cmd)
  121. return CMD2ID[cmd]
  122. end
  123. GroupSkillCnt = 0--技能包触发技能次数
  124. local function realUse(obj, skillID, fanjiTargets,otherArgs)
  125. --local skillConfig = SkillExcel[skillID]
  126. local skillConfig = GetSkillConfig(skillID)
  127. CombatImpl.nowAttacker = obj
  128. if skillConfig then
  129. --重置部分属性
  130. CombatCalc.initAttacker(obj)
  131. local targets = TargetMode.getTargets(obj, skillConfig.targetMode, fanjiTargets, nil, true,skillConfig.type == CombatDefine.SKILL_TYPE1,skillID, true)
  132. -- local fentanBuffObjs = {}
  133. local len = #targets
  134. if len < 1 then return end
  135. for i=1, len do
  136. local defobj = targets[i]
  137. -- if defobj.addByfentan then
  138. -- fentanBuffObjs[defobj.pos] = defobj.id
  139. -- end
  140. CombatCalc.initAttacker(defobj)
  141. end
  142. GroupSkillCnt = GroupSkillCnt + 1
  143. -- 复活技能不走这里
  144. if skillConfig.cmd ~= "revive" then
  145. CombatImpl.addFrame()
  146. CombatImpl.setSkillID(obj, skillID)
  147. CombatImpl.setSaySkill(obj.pos,skillConfig.id,skillConfig.contentType)
  148. end
  149. attack(obj, targets, skillConfig)
  150. local newTargets = {}
  151. -- for _, lObj in ipairs(targets) do
  152. -- if not lObj.addByfentan and not fentanBuffObjs[lObj.pos] then
  153. -- newTargets[#newTargets+1] = lObj
  154. -- end
  155. -- end
  156. for _, lObj in ipairs(targets) do
  157. if not lObj.addByfentan then
  158. newTargets[#newTargets+1] = lObj
  159. end
  160. end
  161. if not fanjiTargets and skillConfig.otherArgs.addBuffBeforeCmd then
  162. CombatBuff.onHit(obj,newTargets,skillConfig)
  163. end
  164. --额外作用
  165. local cmdTargets, cmdChangeArgs
  166. if CMD[skillConfig.cmd] then
  167. cmdTargets, cmdChangeArgs = CMD[skillConfig.cmd](obj, skillConfig, newTargets)
  168. end
  169. if not fanjiTargets then
  170. if not skillConfig.otherArgs.addBuffBeforeCmd then
  171. CombatBuff.onHit(obj,newTargets,skillConfig,cmdTargets,otherArgs, cmdChangeArgs)
  172. end
  173. end
  174. BeSkill.onHit(obj,newTargets,skillID)
  175. if fanjiTargets then
  176. for _, v in ipairs(fanjiTargets) do
  177. if true == CombatBuff.isLianjie1(v) then
  178. CombatBuff.CombatBuff_handleLianjie(v, obj)
  179. end
  180. end
  181. end
  182. CombatImpl.totalAtkCnt = CombatImpl.totalAtkCnt + 1
  183. end
  184. CombatImpl.nowAttacker = nil
  185. end
  186. function use(obj, skillID, fanjiTargets)
  187. --local skillConfig = SkillExcel[skillID]
  188. local skillConfig = GetSkillConfig(skillID)
  189. GroupSkillCnt = 0
  190. if skillConfig.type == CombatDefine.SKILL_TYPE5 then
  191. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  192. --local config = SkillExcel[v]
  193. local config = GetSkillConfig(v)
  194. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  195. if #targets > 0 then
  196. realUse(obj, v,fanjiTargets)
  197. return
  198. end
  199. end
  200. elseif skillConfig.type == CombatDefine.SKILL_TYPE6 then
  201. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  202. --local config = SkillExcel[v]
  203. local config = GetSkillConfig(v)
  204. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  205. if #targets > 0 then
  206. realUse(obj, v,fanjiTargets,{noFirst = (k ~= 1)})
  207. end
  208. end
  209. -- 扣除技能消耗
  210. local skillCond = skillConfig.cond
  211. if COST_CMD[skillCond[1]] then
  212. COST_CMD[skillCond[1]](obj, skillConfig)
  213. end
  214. elseif skillConfig.type == CombatDefine.SKILL_TYPE7 then
  215. local r = math.random(1,10000)
  216. for k,v in ipairs(skillConfig.otherArgs.skillList) do
  217. if r <= v[1] then
  218. --local config = SkillExcel[v[2]]
  219. local config = GetSkillConfig(v[2])
  220. local targets = TargetMode.getTargets(obj, config.targetMode,fanjiTargets, nil , true)
  221. if #targets > 0 then
  222. realUse(obj, v[2], fanjiTargets)
  223. end
  224. return
  225. else
  226. r = r - v[1]
  227. end
  228. end
  229. else
  230. realUse(obj, skillID,fanjiTargets)
  231. end
  232. end
  233. local hitList = {}
  234. local flagList = {}
  235. function attack(obj, targets, skillConfig)
  236. if not skillConfig.hurtRate[1] then obj.isAllCalcHp = true return end
  237. local totalHurt = 0
  238. local limitHurt = 0
  239. local fenTanHurt = 0
  240. -- 分摊技能操作
  241. if skillConfig.otherArgs and skillConfig.otherArgs.hurtFenTan and skillConfig.otherArgs.hurtFenTan[1] == 1 then
  242. for index = 1, #targets do
  243. local target = targets[index]
  244. if target.hp > 0 then
  245. local hurt, flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  246. fenTanHurt = hurt
  247. limitHurt = CombatObj.getValue(obj,RoleDefine.ATK) * skillConfig.otherArgs.hurtFenTan[2]
  248. if fenTanHurt >= limitHurt then
  249. fenTanHurt = limitHurt
  250. end
  251. flagList[index] = flagList[index] or 0
  252. flagList[index] = flag
  253. end
  254. end
  255. end
  256. local len = 0
  257. obj.isAllCalcHp = nil
  258. if #targets == 0 then
  259. obj.isAllCalcHp = true
  260. end
  261. -- local fentanObjList = {}
  262. -- for _, obj in ipairs(targets) do
  263. -- if obj.fentq then
  264. -- fentanObjList[obj.pos] = obj.fentq
  265. -- end
  266. -- end
  267. for index = 1, #targets do
  268. local target = targets[index]
  269. if target.hp > 0 then
  270. BeSkill.beforeHit(obj,target)
  271. -- if fentanObjList[target.pos] then
  272. -- target.fentq = fentanObjList[target.pos]
  273. -- end
  274. local hurt,flag = nil
  275. if fenTanHurt == 0 then
  276. hurt,flag = CombatCalc.calcHurt(obj, index, targets, skillConfig)
  277. target.isShanBi = Util.getBit(flag, CombatDefine.FLAG_SHANBI)
  278. else
  279. hurt = fenTanHurt
  280. flag = flagList[index]
  281. end
  282. -- 闪避不处理目标被动技能
  283. obj.isAllCalcHp = index == #targets
  284. target.attackSkillID = skillConfig.id
  285. local hpValue,srcValue = 0,0
  286. if hurt > 0 then
  287. hpValue,srcValue = CombatObj.updateHp(target, -hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  288. if hpValue < 0 and CombatBuff.isStatus(target, {"chenshui"}) then
  289. CombatBuff.DelBuffByCmd(target, "chenshui", 999)
  290. end
  291. CombatObj.onHpCB(target,hpValue,obj.pos,skillConfig.id)
  292. end
  293. CombatImpl.setSkillHit(target,srcValue,nil,flag,obj,skillConfig.id)
  294. if target.isShanBi ~= 1 then
  295. len = len + 1
  296. hitList[len] = target
  297. BeSkill.afterHit(obj,target)
  298. -- if fentanObjList[target.pos] then
  299. -- target.fentq = fentanObjList[target.pos]
  300. -- end
  301. end
  302. target.attackSkillID = nil
  303. end
  304. end
  305. -- 处理命中列表
  306. for index = 1, #targets do
  307. targets[index] = nil
  308. end
  309. for index = 1, len do
  310. targets[index] = hitList[index]
  311. end
  312. end
  313. CMD = {}
  314. function CMD.hp(obj,skillConfig,skillTargets)
  315. local ret = {}
  316. local args = obj.isPet and obj.args or skillConfig.args
  317. local r = math.random(0,10000)
  318. if args[4] and r > args[4] then
  319. return
  320. end
  321. local calcType = args[1]
  322. local rate = args[2]
  323. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  324. local targetCnt = #targets
  325. local hp
  326. local limit
  327. if args[5] and args[5] > 0 then
  328. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  329. end
  330. if not obj.isPet and args[6] and args[6] > 0 then
  331. limit = args[6] * CombatObj.getHpMax(obj) / 10000
  332. end
  333. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  334. for _,target in ipairs(targets) do
  335. if not target.bufferCmd["noHp"] then
  336. hp = calcHp(obj,target,calcType,rate,limit,true)
  337. hp = hp * (1 + hpAddRate)
  338. hp = hp < 0 and 1 or hp
  339. if hp > 0 and obj.isAllCalcHp == true then
  340. if target.side == CombatDefine.DEFEND_SIDE then
  341. hp = CombatImpl.commonArgs.hpLimit or hp
  342. end
  343. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  344. local showHp = hp
  345. if hp > 0 and d < 0 then
  346. showHp = hp * (-1)
  347. end
  348. CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
  349. CombatObj.onHpCB(target,d, obj.pos)
  350. end
  351. if hp < 0 then
  352. if target.side == CombatDefine.DEFEND_SIDE then
  353. hp = CombatImpl.commonArgs.hpLimit or hp
  354. end
  355. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  356. if hp > 0 and d < 0 then
  357. hp = hp * (-1)
  358. end
  359. CombatImpl.setExtraHit(target, hp, CMD2ID["hp"])
  360. CombatObj.onHpCB(target,d, obj.pos)
  361. end
  362. ret[#ret+1] = target
  363. end
  364. end
  365. return ret
  366. end
  367. function CMD.shixueHP(obj,skillConfig,skillTargets, hitObj)
  368. local ret = {}
  369. local args = obj.isPet and obj.args or skillConfig.args
  370. local r = math.random(0,10000)
  371. if args[4] and r > args[4] then
  372. return
  373. end
  374. local calcType = args[1]
  375. local rate = args[2]
  376. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  377. local hp
  378. local limit
  379. if args[5] and args[5] > 0 then
  380. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  381. end
  382. if not obj.isPet and args[6] and args[6] > 0 then
  383. limit = args[6] * CombatObj.getHpMax(obj) / 10000
  384. end
  385. local targetBuffInfo
  386. local res, _, buffIdx = CombatBuff.isStatus(obj, {"noShixue"})
  387. local bl = true
  388. if res and buffIdx then
  389. local objBuffList = CombatBuff.getBuffer(obj)
  390. targetBuffInfo = objBuffList[buffIdx]
  391. if hitObj and targetBuffInfo and targetBuffInfo.attackPos == hitObj.pos then
  392. bl = false
  393. end
  394. end
  395. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  396. for _,target in ipairs(targets) do
  397. if not target.bufferCmd["noHp"] and bl then
  398. hp = calcHp(obj,target,calcType,rate,limit,true)
  399. hp = hp * (1 + hpAddRate)
  400. hp = hp < 0 and 1 or hp
  401. if hp > 0 and obj.isAllCalcHp == true then
  402. if target.side == CombatDefine.DEFEND_SIDE then
  403. hp = CombatImpl.commonArgs.hpLimit or hp
  404. end
  405. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  406. local showHp = hp
  407. if hp > 0 and d < 0 then
  408. showHp = hp * (-1)
  409. end
  410. CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
  411. CombatObj.onHpCB(target,d, obj.pos)
  412. end
  413. if hp < 0 then
  414. if target.side == CombatDefine.DEFEND_SIDE then
  415. hp = CombatImpl.commonArgs.hpLimit or hp
  416. end
  417. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  418. if hp > 0 and d < 0 then
  419. hp = hp * (-1)
  420. end
  421. CombatImpl.setExtraHit(target, hp, CMD2ID["hp"])
  422. CombatObj.onHpCB(target,d, obj.pos)
  423. end
  424. ret[#ret+1] = target
  425. end
  426. end
  427. return ret
  428. end
  429. function CMD.speedHp(obj,skillConfig,skillTargets)
  430. if not (skillTargets and skillTargets[1]) then
  431. return
  432. end
  433. local args = obj.isPet and obj.args or skillConfig.args
  434. local r = math.random(0,10000)
  435. if args[4] and r > args[4] then
  436. return
  437. end
  438. local calcType = args[1]
  439. local rate = args[2]
  440. local target = skillTargets[1]
  441. local ret = {}
  442. local hp
  443. local limit
  444. if args[5] then
  445. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  446. end
  447. local hpAddRate = CombatObj.getValue(obj,RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  448. local aSpeed = CombatImpl.getValue(obj,RoleDefine.SPEED)
  449. local bSpeed = CombatImpl.getValue(target,RoleDefine.SPEED)
  450. local checkSpeed = aSpeed - bSpeed
  451. if args[3] == 1 then
  452. checkSpeed = -checkSpeed
  453. end
  454. if checkSpeed > 0 then
  455. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  456. for _,target in ipairs(targets) do
  457. hp = calcHp(obj,target,calcType,rate,limit,true)
  458. hp = hp * (1 + hpAddRate)
  459. hp = hp < 0 and 1 or hp
  460. if hp ~= 0 and not target.bufferCmd["noHp"] then
  461. if target.side == CombatDefine.DEFEND_SIDE then
  462. hp = CombatImpl.commonArgs.hpLimit or hp
  463. end
  464. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  465. if hp > 0 and d < 0 then
  466. hp = hp * (-1)
  467. end
  468. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  469. CombatObj.onHpCB(target,d, obj.pos)
  470. end
  471. ret[#ret+1] = target
  472. end
  473. end
  474. return ret
  475. end
  476. function CMD.statusHp(obj,skillConfig,skillTargets)
  477. if not skillTargets then
  478. return
  479. end
  480. local isAdd = false
  481. local args = obj.isPet and obj.args or skillConfig.args
  482. for _,v in ipairs(skillTargets) do
  483. if CombatBuff.isStatus(v,args[4]) then
  484. isAdd = true
  485. break
  486. end
  487. end
  488. if not isAdd then return end
  489. local calcType = args[1]
  490. local rate = args[2]
  491. local ret = {}
  492. local hp
  493. local limit
  494. if args[5] then
  495. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  496. end
  497. local targets = TargetMode.getTargets(obj, args[3], skillTargets)
  498. for _,target in ipairs(targets) do
  499. hp = calcHp(obj,target,calcType,rate,limit,true)
  500. hp = hp < 0 and 1 or hp
  501. if hp ~= 0 and not target.bufferCmd["noHp"] then
  502. if target.side == CombatDefine.DEFEND_SIDE then
  503. hp = CombatImpl.commonArgs.hpLimit or hp
  504. end
  505. local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
  506. if hp > 0 and d < 0 then
  507. hp = hp * (-1)
  508. end
  509. CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
  510. CombatObj.onHpCB(target,d, obj.pos)
  511. end
  512. ret[#ret+1] = target
  513. end
  514. return ret
  515. end
  516. function CMD.hurt(obj,skillConfig,skillTargets)
  517. local args = obj.isPet and obj.args or skillConfig.args
  518. local r = math.random(0,10000)
  519. if r > args[4] then
  520. return
  521. end
  522. local calcType = args[1]
  523. local rate = args[2]
  524. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  525. local hp
  526. local limit
  527. local ret = {}
  528. if args[5] then
  529. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  530. end
  531. for _,target in ipairs(targets) do
  532. hp = calcHp(obj,target,calcType,rate,limit)
  533. if hp ~= 0 then
  534. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  535. if d ~= 0 then
  536. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  537. CombatObj.onHpCB(target,d, obj.pos)
  538. ret[#ret+1] = target
  539. end
  540. end
  541. end
  542. return ret
  543. end
  544. function CMD.behurt(obj,skillConfig,skillTargets)
  545. local args = obj.isPet and obj.args or skillConfig.args
  546. local r = math.random(0,10000)
  547. if r > args[4] then
  548. return
  549. end
  550. local calcType = args[1]
  551. local rate = args[2]
  552. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  553. local hp
  554. local limit
  555. local ret = {}
  556. if args[5] then
  557. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  558. end
  559. for _,target in ipairs(targets) do
  560. if calcType ~= 17 then
  561. hp = calcHp(target,obj,calcType,rate,limit)
  562. else
  563. hp = calcHp(obj, target,calcType,rate,limit)
  564. end
  565. if hp ~= 0 then
  566. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  567. if d ~= 0 then
  568. CombatImpl.setExtraHit(target,-hp,CMD2ID["behurt"])
  569. CombatObj.onHpCB(target,d, obj.pos)
  570. ret[#ret+1] = target
  571. end
  572. end
  573. end
  574. return ret
  575. end
  576. function CMD.hurtwalun(obj,skillConfig,skillTargets)
  577. local args = obj.isPet and obj.args or skillConfig.args
  578. local r = math.random(0,10000)
  579. if r > args[4] then
  580. return
  581. end
  582. local calcType = args[1]
  583. local rate = args[2]
  584. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  585. local hp
  586. local limit
  587. local ret = {}
  588. if args[5] then
  589. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  590. end
  591. for _,target in ipairs(targets) do
  592. hp = calcHp(obj,target,calcType,rate,limit)
  593. if hp ~= 0 then
  594. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  595. if d ~= 0 then
  596. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun"])
  597. CombatObj.onHpCB(target,d, obj.pos)
  598. ret[#ret+1] = target
  599. end
  600. end
  601. end
  602. return ret
  603. end
  604. function CMD.posHurt(obj,skillConfig,skillTargets)
  605. local args = obj.isPet and obj.args or skillConfig.args
  606. local r = math.random(0,10000)
  607. if r > args[4] then
  608. return
  609. end
  610. local calcType = args[1]
  611. local rate = args[2]
  612. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  613. local hp
  614. local limit
  615. local ret = {}
  616. if args[5] then
  617. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  618. end
  619. local posList = args[6]
  620. if posList == nil then
  621. return
  622. end
  623. for _,target in ipairs(targets) do
  624. local bfind = false
  625. for k, v in pairs(posList) do
  626. if v == target.pos then
  627. bfind = true
  628. break
  629. end
  630. end
  631. if bfind then
  632. hp = calcHp(obj,target,calcType,rate,limit, false)
  633. if hp ~= 0 then
  634. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  635. if d ~= 0 then
  636. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  637. CombatObj.onHpCB(target,d, obj.pos)
  638. ret[#ret+1] = target
  639. end
  640. end
  641. end
  642. end
  643. return ret
  644. end
  645. function CMD.hurtxia(obj,skillConfig,skillTargets)
  646. local args = obj.isPet and obj.args or skillConfig.args
  647. local r = math.random(0,10000)
  648. if r > args[4] then
  649. return
  650. end
  651. local calcType = args[1]
  652. local rate = args[2]
  653. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  654. local hp
  655. local limit
  656. local ret = {}
  657. if args[5] then
  658. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  659. end
  660. for _,target in ipairs(targets) do
  661. hp = calcHp(obj,target,calcType,rate,limit)
  662. if hp ~= 0 then
  663. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  664. if d ~= 0 then
  665. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia"])
  666. CombatObj.onHpCB(target,d, obj.pos)
  667. ret[#ret+1] = target
  668. end
  669. end
  670. end
  671. return ret
  672. end
  673. function CMD.hurtmingli(obj,skillConfig,skillTargets)
  674. local args = obj.isPet and obj.args or skillConfig.args
  675. local r = math.random(0,10000)
  676. if r > args[4] then
  677. return
  678. end
  679. local calcType = args[1]
  680. local rate = args[2]
  681. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  682. local hp
  683. local limit
  684. local ret = {}
  685. if args[5] then
  686. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  687. end
  688. for _,target in ipairs(targets) do
  689. hp = calcHp(obj,target,calcType,rate,limit)
  690. if hp ~= 0 then
  691. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  692. if d ~= 0 then
  693. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli"])
  694. CombatObj.onHpCB(target,d, obj.pos)
  695. ret[#ret+1] = target
  696. end
  697. end
  698. end
  699. return ret
  700. end
  701. function CMD.hurtmingli2(obj,skillConfig,skillTargets)
  702. local args = obj.isPet and obj.args or skillConfig.args
  703. local r = math.random(0,10000)
  704. if r > args[4] then
  705. return
  706. end
  707. local calcType = args[1]
  708. local rate = args[2]
  709. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  710. local hp
  711. local limit
  712. local ret = {}
  713. if args[5] then
  714. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  715. end
  716. for _,target in ipairs(targets) do
  717. hp = calcHp(obj,target,calcType,rate,limit)
  718. if hp ~= 0 then
  719. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  720. if d ~= 0 then
  721. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli2"])
  722. CombatObj.onHpCB(target,d, obj.pos)
  723. ret[#ret+1] = target
  724. end
  725. end
  726. end
  727. return ret
  728. end
  729. function CMD.hurtguangci(obj,skillConfig,skillTargets)
  730. local args = obj.isPet and obj.args or skillConfig.args
  731. local r = math.random(0,10000)
  732. if r > args[4] then
  733. return
  734. end
  735. local calcType = args[1]
  736. local rate = args[2]
  737. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  738. local hp
  739. local limit
  740. local ret = {}
  741. if args[5] then
  742. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  743. end
  744. for _,target in ipairs(targets) do
  745. hp = calcHp(obj,target,calcType,rate,limit)
  746. if hp ~= 0 then
  747. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  748. if d ~= 0 then
  749. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtguangci"])
  750. CombatObj.onHpCB(target,d, obj.pos)
  751. ret[#ret+1] = target
  752. end
  753. end
  754. end
  755. return ret
  756. end
  757. function CMD.jobHurt(obj,skillConfig,skillTargets)
  758. local args = obj.isPet and obj.args or skillConfig.args
  759. local calcType = args[1]
  760. local rate = args[2]
  761. local r = math.random(0,10000)
  762. if r > args[3] then
  763. return
  764. end
  765. local job = args[4]
  766. local hp
  767. local limit
  768. if args[5] then
  769. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  770. end
  771. local ret = {}
  772. for _,target in ipairs(skillTargets) do
  773. if target.job == job then
  774. hp = calcHp(obj,target,calcType,rate,limit)
  775. if hp and hp ~= 0 then
  776. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  777. if d ~= 0 then
  778. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  779. CombatObj.onHpCB(target,d, obj.pos)
  780. ret[#ret+1] = target
  781. end
  782. end
  783. end
  784. end
  785. return ret
  786. end
  787. function CMD.statusHurt(obj,skillConfig,skillTargets)
  788. local args = obj.isPet and obj.args or skillConfig.args
  789. local calcType = args[1]
  790. local rate = args[2]
  791. local r = math.random(0,10000)
  792. if r > args[3] then
  793. return
  794. end
  795. local status = args[4]
  796. local hp
  797. local limit
  798. if args[5] then
  799. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  800. end
  801. local ret = {}
  802. for _,target in ipairs(skillTargets) do
  803. if CombatBuff.isStatus(target, status) then
  804. hp = calcHp(obj,target,calcType,rate,limit)
  805. if hp and hp ~= 0 then
  806. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  807. if d ~= 0 then
  808. CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
  809. CombatObj.onHpCB(target,d, obj.pos)
  810. ret[#ret+1] = target
  811. end
  812. end
  813. end
  814. end
  815. return ret
  816. end
  817. function CMD.hpHurt(obj,skillConfig,skillTargets)
  818. local args = obj.isPet and obj.args or skillConfig.args
  819. local calcType = args[1]
  820. local rate = args[2]
  821. local hpRate = args[3]/10000
  822. local ret = {}
  823. for _,target in ipairs(skillTargets) do
  824. local hpLimit = CombatObj.getHpMax(target) * hpRate
  825. if target.hp >= hpLimit then
  826. hp = calcHp(obj,target,calcType,rate)
  827. if hp and hp ~= 0 then
  828. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  829. if d ~= 0 then
  830. CombatImpl.setExtraHit(target,-hp,CMD2ID["hpHurt"])
  831. CombatObj.onHpCB(target,d, obj.pos)
  832. ret[#ret+1] = target
  833. end
  834. end
  835. end
  836. end
  837. return ret
  838. end
  839. function CMD.fanji(obj,skillConfig,skillTargets)
  840. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  841. if CombatBuff.isStatus(obj,{"xuanyun","shihua","bingdong", "xuanyun2", "chenshui", "donghe", "gandian"}) then return end
  842. if obj.side == skillTargets[1].side then
  843. return
  844. end
  845. if obj.hp > 0 then
  846. local r = math.random(0,10000)
  847. if r < skillConfig.args[2] then
  848. for i=#skillTargets, 1, -1 do
  849. if BeSkill.isNoFanji(skillTargets[i]) then
  850. table.remove(skillTargets, i)
  851. end
  852. end
  853. if #skillTargets == 0 then
  854. return
  855. end
  856. CombatImpl.fanjiList[#CombatImpl.fanjiList + 1] = {obj,skillConfig.args[1],skillTargets}
  857. end
  858. end
  859. end
  860. function CMD.qingsuan(obj,skillConfig,skillTargets)
  861. if obj.isPet then return {} end
  862. local args = skillConfig.args
  863. local r = math.random(0,10000)
  864. if r > args[3] then
  865. return
  866. end
  867. local rate = args[1]
  868. local limit
  869. if args[4] then
  870. limit = args[4] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  871. end
  872. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  873. local ret = {}
  874. for _,target in ipairs(targets) do
  875. local baseValue = CombatBuff.qingsuan(target)
  876. if baseValue > 0 then
  877. local hurt = baseValue * rate / 10000
  878. if limit and hurt > limit then
  879. hurt = limit
  880. end
  881. local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  882. CombatImpl.setExtraHit(target,-hurt,CMD2ID["qingsuan"])
  883. CombatObj.onHpCB(target,d, obj.pos)
  884. ret[#ret+1] = target
  885. end
  886. end
  887. return ret
  888. end
  889. function CMD.jiekong(obj,skillConfig,skillTargets)
  890. if obj.isPet then return {} end
  891. local args = skillConfig.args
  892. local r = math.random(0,10000)
  893. if r > args[2] then
  894. return
  895. end
  896. local targets = TargetMode.getTargets(obj, args[1],skillTargets)
  897. local ret = {}
  898. for _,target in ipairs(targets) do
  899. CombatBuff.jiekong(target)
  900. ret[#ret+1] = target
  901. end
  902. return ret
  903. end
  904. function CMD.groupcmd(obj,skillConfig,skillTargets)
  905. if obj.isPet then return {} end
  906. for k,v in ipairs(skillConfig.args) do
  907. local cmd = v[1]
  908. local conf = {args = v[2]}
  909. if CMD[cmd] then
  910. CMD[cmd](obj,conf,skillTargets)
  911. end
  912. end
  913. return {}
  914. end
  915. function CMD.randcmd(obj,skillConfig,skillTargets)
  916. if obj.isPet then return {} end
  917. local total = 0
  918. for k,v in ipairs(skillConfig.args) do
  919. total = total + v[3]
  920. end
  921. local r = math.random(0,total)
  922. for k,v in ipairs(skillConfig.args) do
  923. if r <= v[3] then
  924. local cmd = v[1]
  925. local conf = {args = v[2]}
  926. if CMD[cmd] then
  927. CMD[cmd](obj,conf,skillTargets)
  928. end
  929. break
  930. else
  931. r = r - v[1]
  932. end
  933. end
  934. return {}
  935. end
  936. function CMD.qusan(obj,skillConfig,skillTargets)
  937. if obj.isPet then return {} end
  938. local args = skillConfig.args
  939. local r = math.random(0,10000)
  940. if r > args[3] then
  941. return
  942. end
  943. local qusanType = args[1]
  944. local calcType = args[5] and args[5][1]
  945. local rate = args[5] and args[5][2]
  946. local buffers = args[8] and args[8][1]
  947. local targets = TargetMode.getTargets(obj, args[2],skillTargets)
  948. local ret = {}
  949. local qusanTotalNum = 0
  950. if args[7] then
  951. limit = args[7] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  952. end
  953. for _,target in ipairs(targets) do
  954. local cnt = CombatBuff.qusan(target, qusanType,args[4])
  955. qusanTotalNum = qusanTotalNum + cnt
  956. if limit then
  957. limit = limit * cnt
  958. end
  959. if buffers and cnt > 0 then
  960. local targets = TargetMode.getTargets(obj, args[8][2],skillTargets)
  961. CombatBuff.qusanAddBuff(obj, targets, buffers)
  962. end
  963. ret[#ret+1] = target
  964. if calcType and rate and cnt > 0 then
  965. local hp = calcHp(obj,target,calcType,rate * cnt, limit, nil, nil, args[6])
  966. if hp ~= 0 then
  967. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  968. if d ~= 0 then
  969. CombatImpl.setExtraHit(target,-hp,CMD2ID["qusan"])
  970. CombatObj.onHpCB(target,d, obj.pos)
  971. end
  972. end
  973. end
  974. end
  975. local tb = { skillConfig.cmd, qusanTotalNum }
  976. return ret, tb
  977. end
  978. function CMD.qusan2(obj,skillConfig,skillTargets)
  979. if obj.isPet then return {} end
  980. local args = skillConfig.args
  981. local r = math.random(0,10000)
  982. if r > args[3] then
  983. return
  984. end
  985. local qusanType = args[1]
  986. local qusanSubNum = args[4] or 0 -- 剩余可驱散数量
  987. if qusanSubNum <= 0 then
  988. return
  989. end
  990. local targets = TargetMode.getTargets(obj, args[2], skillTargets)
  991. local ret = {}
  992. local qusanTotalNum = 0 -- 当前已经驱散数量
  993. for _,target in ipairs(targets) do
  994. qusanSubNum = qusanSubNum - qusanTotalNum
  995. if qusanSubNum <= 0 then
  996. break
  997. end
  998. local cnt = CombatBuff.qusan(target, qusanType, qusanSubNum)
  999. qusanTotalNum = qusanTotalNum + cnt
  1000. ret[#ret+1] = target
  1001. end
  1002. local tb = { skillConfig.cmd, qusanTotalNum }
  1003. return ret, tb
  1004. end
  1005. function CMD.hurtwalun2(obj,skillConfig,skillTargets)
  1006. local args = obj.isPet and obj.args or skillConfig.args
  1007. local r = math.random(0,10000)
  1008. if r > args[4] then
  1009. return
  1010. end
  1011. local calcType = args[1]
  1012. local rate = args[2]
  1013. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1014. local hp
  1015. local limit
  1016. local ret = {}
  1017. if args[5] then
  1018. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1019. end
  1020. for _,target in ipairs(targets) do
  1021. hp = calcHp(obj,target,calcType,rate,limit)
  1022. if hp ~= 0 then
  1023. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1024. if d ~= 0 then
  1025. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun2"])
  1026. CombatObj.onHpCB(target,d, obj.pos)
  1027. ret[#ret+1] = target
  1028. end
  1029. end
  1030. end
  1031. return ret
  1032. end
  1033. function CMD.hurtxia2(obj,skillConfig,skillTargets)
  1034. local args = obj.isPet and obj.args or skillConfig.args
  1035. local r = math.random(0,10000)
  1036. if r > args[4] then
  1037. return
  1038. end
  1039. local calcType = args[1]
  1040. local rate = args[2]
  1041. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1042. local hp
  1043. local limit
  1044. local ret = {}
  1045. if args[5] then
  1046. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1047. end
  1048. for _,target in ipairs(targets) do
  1049. hp = calcHp(obj,target,calcType,rate,limit)
  1050. if hp ~= 0 then
  1051. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1052. if d ~= 0 then
  1053. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia2"])
  1054. CombatObj.onHpCB(target,d, obj.pos)
  1055. ret[#ret+1] = target
  1056. end
  1057. end
  1058. end
  1059. return ret
  1060. end
  1061. function CMD.hurtxia3(obj,skillConfig,skillTargets)
  1062. local args = obj.isPet and obj.args or skillConfig.args
  1063. local r = math.random(0,10000)
  1064. if r > args[4] then
  1065. return
  1066. end
  1067. local calcType = args[1]
  1068. local rate = args[2]
  1069. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1070. local hp
  1071. local limit
  1072. local ret = {}
  1073. if args[5] then
  1074. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1075. end
  1076. for _,target in ipairs(targets) do
  1077. hp = calcHp(obj,target,calcType,rate,limit)
  1078. if hp ~= 0 then
  1079. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1080. if d ~= 0 then
  1081. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia3"])
  1082. CombatObj.onHpCB(target,d, obj.pos)
  1083. ret[#ret+1] = target
  1084. end
  1085. end
  1086. end
  1087. return ret
  1088. end
  1089. function CMD.attributehurt(obj, skillConfig, skillTargets)
  1090. if not skillTargets or nil == _G.next(skillTargets) then
  1091. return
  1092. end
  1093. local args = skillConfig.args
  1094. if not args then
  1095. print("[attributehurt] 不存在对应配置直接返回")
  1096. return
  1097. end
  1098. local nAttrID = args[1] -- 属性ID
  1099. local nRate = args[2] -- 属性倍数
  1100. local nEnemyAttrID = args[3] -- 敌方属性
  1101. local nNowHurt = CombatObj.getValue(obj, RoleDefine.ATK)
  1102. local nAttrValue = CombatObj.getValue(obj, nAttrID)
  1103. local nValue = nAttrValue * nRate
  1104. local nMaxHurt = CombatObj.getValue(obj, RoleDefine.ATK) * 10
  1105. -- print("[attributehurt] 计算出来的进攻方属性加成 nValue = "..nValue.." 获取到的 属性ID = "
  1106. -- ..nAttrID.." 属性值 "..nAttrValue.." 倍率 "..nRate.." 攻击力的10倍 = "..nMaxHurt)
  1107. local ret = {}
  1108. for _, tEnemyObj in ipairs(skillTargets) do
  1109. local nEnemyValue = CombatObj.getValue(tEnemyObj, nEnemyAttrID)
  1110. local nBeginHurt = nValue / nEnemyValue
  1111. local nEndHurt = nBeginHurt * nNowHurt
  1112. nEndHurt = math.min(nMaxHurt, nEndHurt)
  1113. -- print("[attributehurt] 计算出来的最终伤害 nEndHurt = "..nEndHurt.." 获取到的敌方 属性ID = "
  1114. -- ..nEnemyAttrID.." 敌方属性值 "..nEnemyValue.." 开始 nBeginHurt "..nBeginHurt)
  1115. local d = CombatObj.updateHp(tEnemyObj, -nEndHurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1116. if d ~= 0 then
  1117. CombatImpl.setExtraHit(tEnemyObj, -nEndHurt, CMD2ID["attributehurt"])
  1118. CombatObj.onHpCB(tEnemyObj, d, obj.pos, skillConfig.id)
  1119. ret[#ret+1] = tEnemyObj
  1120. end
  1121. end
  1122. return ret
  1123. end
  1124. NO_SKILL_CHECK_COMBO_LIST = {
  1125. ["hp"] = 1,
  1126. ["revive"] = 1,
  1127. ["baohu"] = 1,
  1128. }
  1129. function skillIsHpOrRevive(obj, argSkillID)
  1130. --local argSkillConf = SkillExcel[argSkillID]
  1131. local argSkillConf = GetSkillConfig(argSkillID)
  1132. if not argSkillConf then return end
  1133. -- 带有伤害
  1134. if argSkillConf.hurtRate[1] then return end
  1135. if argSkillConf.continuous and argSkillConf.continuous == 1 then return true end
  1136. if NO_SKILL_CHECK_COMBO_LIST[argSkillConf.cmd] then
  1137. return true
  1138. end
  1139. local bRet = false
  1140. if argSkillConf.cmd == "groupcmd" then
  1141. for k,v in ipairs(argSkillConf.args) do
  1142. local cmd = v[1]
  1143. if cmd == "hurt" then return end
  1144. if NO_SKILL_CHECK_COMBO_LIST[cmd] then
  1145. bRet = true
  1146. end
  1147. end
  1148. end
  1149. -- 技能包
  1150. if argSkillConf.type == CombatDefine.SKILL_TYPE5 or
  1151. argSkillConf.type == CombatDefine.SKILL_TYPE6 or
  1152. argSkillConf.type == CombatDefine.SKILL_TYPE7 then
  1153. for k,v in ipairs(argSkillConf.otherArgs.skillList) do
  1154. local config = SkillExcel[v]
  1155. -- 带有伤害
  1156. if config and config.hurtRate[1] then return end
  1157. if config then
  1158. if NO_SKILL_CHECK_COMBO_LIST[config.cmd] or config.continuous == 1 then
  1159. bRet = true
  1160. end
  1161. for k,v in ipairs(config.buffers) do
  1162. --local bufConfig = BufferExcel.buffer[v[1]]
  1163. local bufConfig = CombatBuff.GetBuffConfig(v[1])
  1164. -- 带有伤害
  1165. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  1166. bRet = true
  1167. end
  1168. end
  1169. end
  1170. end
  1171. for k,v in ipairs(argSkillConf.buffers) do
  1172. --local bufConfig = BufferExcel[v[1]]
  1173. local bufConfig = CombatBuff.GetBuffConfig(v[1])
  1174. -- 带有伤害
  1175. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  1176. bRet = true
  1177. end
  1178. end
  1179. end
  1180. return bRet
  1181. end
  1182. function CMD.combo(obj,skillConfig,skillTargets)
  1183. -- 二次元 屏蔽 治疗 复活的连击
  1184. if ProjectLogic.isSsecy() then
  1185. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1186. if skillIsHpOrRevive(obj, argSkillID) then
  1187. return
  1188. end
  1189. if skillIsHpOrRevive(obj, skillConfig.id) then
  1190. return
  1191. end
  1192. end
  1193. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1194. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1195. -- return
  1196. -- end
  1197. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1198. local r = math.random(0,10000)
  1199. if r < skillConfig.args[1] then
  1200. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1201. return true
  1202. end
  1203. end
  1204. --
  1205. function CMD.comboFight(obj,skillConfig,skillTargets)
  1206. -- 二次元 屏蔽 治疗 复活的连击
  1207. if ProjectLogic.isSsecy() then
  1208. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1209. if skillIsHpOrRevive(obj, argSkillID) then
  1210. return
  1211. end
  1212. if skillIsHpOrRevive(obj, skillConfig.id) then
  1213. return
  1214. end
  1215. end
  1216. if CombatImpl.isFanji then return end
  1217. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1218. local r = math.random(0,10000)
  1219. if r < skillConfig.args[1] then
  1220. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1221. return true
  1222. end
  1223. end
  1224. function CMD.combo1(obj,skillConfig,skillTargets)
  1225. -- 二次元 屏蔽 治疗 复活的连击
  1226. if ProjectLogic.isSsecy() then
  1227. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1228. if skillIsHpOrRevive(obj, skillConfig) then
  1229. return
  1230. end
  1231. if skillIsHpOrRevive(obj, skillConfig.id) then
  1232. return
  1233. end
  1234. end
  1235. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1236. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1237. -- return
  1238. -- end
  1239. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1240. local r = math.random(0,10000)
  1241. if r < skillConfig.args[1] then
  1242. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],2}
  1243. return true
  1244. end
  1245. end
  1246. function CMD.combo2(obj,skillConfig,skillTargets)
  1247. -- 二次元 屏蔽 治疗 复活的连击
  1248. if ProjectLogic.isSsecy() then
  1249. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1250. if skillIsHpOrRevive(obj, argSkillID) then
  1251. return
  1252. end
  1253. if skillIsHpOrRevive(obj, skillConfig.id) then
  1254. return
  1255. end
  1256. end
  1257. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1258. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1259. -- return
  1260. -- end
  1261. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1262. local r = math.random(0,10000)
  1263. if r < skillConfig.args[1] then
  1264. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],3}
  1265. return true
  1266. end
  1267. end
  1268. function CMD.comboNormal(obj, skillConfig, skillTargets)
  1269. -- 二次元 屏蔽 治疗 复活的连击
  1270. if ProjectLogic.isSsecy() then
  1271. local argSkillID = skillConfig.args[3] or CombatImpl.getNormalSkill(obj)
  1272. if skillIsHpOrRevive(obj, argSkillID) then
  1273. return
  1274. end
  1275. if skillIsHpOrRevive(obj, skillConfig.id) then
  1276. return
  1277. end
  1278. end
  1279. if CombatImpl.comboType > 0 then return end
  1280. if CombatImpl.isFanji then
  1281. if GroupSkillCnt > 2 then return end
  1282. else
  1283. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1284. end
  1285. local r = math.random(0,10000)
  1286. if r < skillConfig.args[1] then
  1287. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 2, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1}
  1288. end
  1289. end
  1290. function CMD.attrcomboAgain(obj, skillConfig, skillTargets)
  1291. local tComboCof = nil
  1292. for _, v in ipairs(skillConfig.args) do
  1293. if v[1] == 2 then
  1294. tComboCof = v
  1295. break
  1296. end
  1297. end
  1298. if not tComboCof then
  1299. print("[CMD.attrcomboAgain] 不存在连击配置")
  1300. return
  1301. end
  1302. --table.print_lua_table(tComboCof)
  1303. -- 二次元 屏蔽 治疗 复活的连击
  1304. if ProjectLogic.isSsecy() then
  1305. local argSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1306. if skillIsHpOrRevive(obj, argSkillID) then
  1307. return
  1308. end
  1309. if skillIsHpOrRevive(obj, skillConfig.id) then
  1310. return
  1311. end
  1312. end
  1313. local nSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1314. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1315. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1316. -- return
  1317. -- end
  1318. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1319. local r = math.random(0,10000)
  1320. --print("[CMD.attrcomboAgain] nSkillID = "..nSkillID)
  1321. if r < tComboCof[2] then
  1322. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, tComboCof[3], nSkillID, tComboCof[5] or 1, tComboCof[6]}
  1323. return true
  1324. end
  1325. end
  1326. function CMD.zhuiji(obj,skillConfig,skillTargets)
  1327. -- 二次元 屏蔽 治疗 复活的连击
  1328. if ProjectLogic.isSsecy() then
  1329. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1330. if skillIsHpOrRevive(obj, argSkillID) then
  1331. return
  1332. end
  1333. if skillIsHpOrRevive(obj, skillConfig.id) then
  1334. return
  1335. end
  1336. end
  1337. local objTag = obj.uuid or obj.id
  1338. if CombatImpl.useZhuijiObjList[obj.pos] and (CombatImpl.useZhuijiObjList[obj.pos][objTag] or 0) >= 1 then
  1339. return
  1340. end
  1341. -- if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1342. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1343. local r = math.random(0,10000)
  1344. if r < skillConfig.args[1] then
  1345. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 999, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1346. return true
  1347. end
  1348. end
  1349. function CMD.baohu(obj,skillConfig,skillTargets)
  1350. local d = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
  1351. if d ~= 0 then
  1352. local attrs = {}
  1353. attrs[RoleDefine.BAOHU_COMBAT] = skillTargets[1].pos
  1354. CombatImpl.setExtraHit(obj,d,CMD2ID["baohu"],attrs)
  1355. CombatObj.onHpCB(obj,d, skillTargets[1].pos)
  1356. end
  1357. end
  1358. function CMD.yinbaoZuzhou(obj,skillConfig,skillTargets)
  1359. CombatBuff.yinbaoZuzhou(obj, skillTargets, skillConfig)
  1360. end
  1361. --指定普攻目标模式
  1362. function CMD.normalTarget(obj,skillConfig)
  1363. obj.normalTarget = {status = {}}
  1364. if skillConfig.args.status then
  1365. for k,v in ipairs(skillConfig.args.status) do
  1366. obj.normalTarget.status[k] = v
  1367. end
  1368. end
  1369. end
  1370. --诅咒附加伤害
  1371. function CMD.zuzhouHurt(obj, skillConfig, skillTargets)
  1372. if not obj.args then return end
  1373. local confArgs = skillConfig.args
  1374. local targets = TargetMode.getTargets(obj, confArgs[1], skillTargets)
  1375. local zuzhouHurt = obj.args * confArgs[2] / 10000
  1376. for _,target in ipairs(targets) do
  1377. if zuzhouHurt ~= 0 then
  1378. local d = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1379. if d ~= 0 then
  1380. CombatImpl.setExtraHit(target,-zuzhouHurt,CMD2ID["zuzhouHurt"])
  1381. CombatObj.onHpCB(target,d, obj.pos)
  1382. end
  1383. end
  1384. end
  1385. obj.args = nil
  1386. end
  1387. -- 根据诅咒数增加伤害
  1388. function CMD.zuzhouTrueHurt(obj, skillConfig, skillTargets)
  1389. local confArgs = skillConfig.args
  1390. local nAtt = CombatObj.getValue(obj,RoleDefine.ATK)
  1391. local baseHurt = nAtt * confArgs[1] / 10000
  1392. for _,target in ipairs(skillTargets) do
  1393. local isStatus, cmd, ind = CombatBuff.isStatus(target, {"zuzhou"})
  1394. if isStatus then
  1395. local nZuZhouNum = #target.bufferCmd["zuzhou"]
  1396. local nHurt = baseHurt * nZuZhouNum
  1397. if nHurt > 0 then
  1398. local d = CombatObj.updateHp(target, -nHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1399. if d ~= 0 then
  1400. CombatImpl.setExtraHit(target,-nHurt,CMD2ID["zuzhouTrueHurt"])
  1401. CombatObj.onHpCB(target,d, obj.pos)
  1402. end
  1403. end
  1404. end
  1405. end
  1406. end
  1407. function CMD.dnexhurt(obj,skillConfig,skillTargets)
  1408. local args = obj.isPet and obj.args or skillConfig.args
  1409. local r = math.random(0,10000)
  1410. if r > args[4] then
  1411. return
  1412. end
  1413. local calcType = args[1]
  1414. local rate = args[2]
  1415. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1416. local hp
  1417. local limit
  1418. local ret = {}
  1419. if args[5] then
  1420. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK)
  1421. end
  1422. for _,target in ipairs(targets) do
  1423. hp = calcHp(obj,target,calcType,rate,limit)
  1424. if hp ~= 0 then
  1425. local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1426. if d ~= 0 then
  1427. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  1428. CombatObj.onHpCB(target,d, obj.pos)
  1429. ret[#ret+1] = target
  1430. end
  1431. end
  1432. end
  1433. return ret
  1434. end
  1435. --拥有指定buff后的额外效果
  1436. function CMD.targetBuffExtraEffect(obj,skillConfig,skillTargets)
  1437. local args = skillConfig.args
  1438. if not args then
  1439. return
  1440. end
  1441. local targetBuffCmd = args[1]
  1442. local targetBuffCnt = args[2]
  1443. if not targetBuffCmd or not targetBuffCnt then
  1444. return
  1445. end
  1446. local nowTargetBuffCnt = CombatBuff.getBuffCnt(obj, targetBuffCmd)
  1447. if nowTargetBuffCnt < targetBuffCnt then
  1448. return
  1449. end
  1450. local targetMode = args[3]
  1451. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1452. local hurt, limitVale
  1453. local calcType, rate = args[4], args[5]
  1454. local maxNum = args[6] or 1
  1455. local nowNum = math.floor(nowTargetBuffCnt / targetBuffCnt)
  1456. if nowNum < maxNum then
  1457. maxNum = nowNum
  1458. end
  1459. local limitAttrType = args[7]
  1460. local limitAttrRate = args[8]
  1461. if limitAttrType and limitAttrRate then
  1462. limitVale = limitAttrRate * CombatObj.getValue(obj, limitAttrType)
  1463. end
  1464. table.shuffle(targets)
  1465. for idx, target in ipairs(targets) do
  1466. if idx > maxNum then
  1467. break
  1468. end
  1469. hurt = calcHp(obj, target, calcType, rate, limitVale)
  1470. if hurt ~= 0 then
  1471. local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  1472. if d ~= 0 then
  1473. CombatImpl.setExtraHit(target,-hurt,CMD2ID["hurt"])
  1474. CombatObj.onHpCB(target,d, obj.pos)
  1475. end
  1476. end
  1477. end
  1478. CombatBuff.DelBuffByCmd(obj, targetBuffCmd, nowTargetBuffCnt)
  1479. end
  1480. --debuff 和 buff 数量差的额外伤害
  1481. function CMD.buffDiffHurt(obj,skillConfig,skillTargets)
  1482. local args = skillConfig.args
  1483. if not args then
  1484. return
  1485. end
  1486. local buffType1 = args[1] --buff类型1, 对应配置表buff中qusan分页中的type
  1487. local buffType2 = args[2] --buff类型2, 对应配置表buff中qusan分页中的type
  1488. local targetMode = args[3]
  1489. local calcType, rate = args[4], args[5]
  1490. local limitAttrType, limitAttrMul = args[6], args[7]
  1491. local maxHurt = CombatObj.getValue(obj, limitAttrType) * limitAttrMul
  1492. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1493. for _, targetObj in ipairs(targets) do
  1494. local buffCnt1 = CombatBuff.getCombatBufferCnt(targetObj, buffType1)
  1495. local buffCnt2 = CombatBuff.getCombatBufferCnt(targetObj, buffType2)
  1496. if buffCnt1 > buffCnt2 then
  1497. local hurt = calcHp(obj, targetObj, calcType, rate)
  1498. hurt = hurt * (buffCnt1 - buffCnt2)
  1499. if hurt > maxHurt then
  1500. hurt = maxHurt
  1501. end
  1502. local d = CombatObj.updateHp(targetObj, -hurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1503. if d ~= 0 then
  1504. CombatImpl.setExtraHit(targetObj, -hurt, CMD2ID["hurt"])
  1505. CombatObj.onHpCB(targetObj, d, obj.pos)
  1506. end
  1507. end
  1508. end
  1509. end
  1510. -- 与其中一个符合条件的队友交换血量, 交换成功后,恢复自身一定血量
  1511. function CMD.exchangeHP(obj,skillConfig,skillTargets)
  1512. local args = skillConfig.args
  1513. if not args then
  1514. return
  1515. end
  1516. local targetMode = args[3]
  1517. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1518. local targetObj = targets[1]
  1519. if targetObj then
  1520. -- 不能是自己
  1521. if targetObj.pos == obj.pos then
  1522. return
  1523. end
  1524. -- 不能满血
  1525. local attrID = targetMode[4] or RoleDefine.HP -- 默认是HP
  1526. local targetObjSubRate = CombatObj.getValue(targetObj, attrID)
  1527. if targetObjSubRate >= 10000 then
  1528. return
  1529. end
  1530. local targetHP = targetObj.hp
  1531. local attackerHp = obj.hp
  1532. local subHP = attackerHp - targetHP
  1533. -- 施放者血量不能最低
  1534. if subHP > 0 then
  1535. -- 给目标加血量差值
  1536. local d = CombatObj.updateHp(targetObj, subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1537. if d ~= 0 then
  1538. CombatImpl.setExtraHit(targetObj, subHP, CMD2ID["hp"])
  1539. CombatObj.onHpCB(targetObj, d, obj.pos)
  1540. end
  1541. -- 给施放者扣血量差值
  1542. d = CombatObj.updateHp(obj, -subHP, nil, true, targetObj.pos, CombatObj.EXTRA_HP_TYPE)
  1543. if d ~= 0 then
  1544. CombatImpl.setExtraHit(obj, -subHP, CMD2ID["hp"])
  1545. CombatObj.onHpCB(obj, d, targetObj.pos)
  1546. end
  1547. -- 给施放者恢复一定血量
  1548. local calcType = args[1]
  1549. local rate = args[2]
  1550. local hp = calcHp(obj,targetObj, calcType, rate, nil, true)
  1551. d = CombatObj.updateHp(obj,hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1552. local showHp = hp
  1553. if hp > 0 and d < 0 then
  1554. showHp = hp * (-1)
  1555. end
  1556. CombatImpl.setExtraHit(obj, showHp, CMD2ID["hp"])
  1557. CombatObj.onHpCB(obj,d, obj.pos)
  1558. end
  1559. end
  1560. end