Skill.lua 53 KB

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