Skill.lua 54 KB

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