Skill.lua 40 KB

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