Skill.lua 55 KB

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