Skill.lua 56 KB

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