Skill.lua 40 KB

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