Skill.lua 40 KB

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