Skill.lua 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086
  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. --[[
  1106. teamQusanHp: 队友按施法者攻击力比例回血 -> 驱散队友负面 -> 自身按驱散总数*最大生命比例回血
  1107. args[1] 驱散类型(1负面 2增益)
  1108. args[2] 队友目标选择
  1109. args[3] 触发概率(万分比)
  1110. args[4] 每个队友驱散debuff数量(nil/0为不限)
  1111. args[5] 队友回血 {calcType, rate} 如{1,5000}为施法者攻击力50%
  1112. args[6] 自身回血 {calcType, rate} 如{2,700}为每个驱散量*最大生命7%(可选,未配置则不回血)
  1113. ]]
  1114. function CMD.teamQusanHp(obj,skillConfig,skillTargets)
  1115. if obj.isPet then return {} end
  1116. local args = skillConfig.args
  1117. local r = math.random(0,10000)
  1118. if r > args[3] then
  1119. return
  1120. end
  1121. local qusanType = args[1]
  1122. local teamCalcType = args[5] and args[5][1]
  1123. local teamRate = args[5] and args[5][2]
  1124. local selfCalcType = args[6] and args[6][1]
  1125. local selfRate = args[6] and args[6][2]
  1126. local targets = TargetMode.getTargets(obj, args[2], skillTargets)
  1127. local ret = {}
  1128. local qusanTotalNum = 0
  1129. if teamCalcType and teamRate then
  1130. local hpAddRate = CombatObj.getValue(obj, RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  1131. for _,target in ipairs(targets) do
  1132. if not target.bufferCmd["noHp"] then
  1133. local hp = calcHp(obj, target, teamCalcType, teamRate, nil, true)
  1134. hp = hp * (1 + hpAddRate)
  1135. hp = hp < 0 and 1 or hp
  1136. if hp > 0 then
  1137. local restoreMul = BeSkill.GetBeSkillRestoretHPMul(target) or 1
  1138. hp = hp * restoreMul
  1139. local d, _, extraHandleTb = CombatObj.updateHp(target, hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1140. local showHp = hp
  1141. if hp > 0 and d < 0 then
  1142. showHp = hp * (-1)
  1143. end
  1144. CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
  1145. CombatObj.onHpCB(target, d, obj.pos)
  1146. if extraHandleTb then
  1147. ExtraHandle(target, extraHandleTb)
  1148. end
  1149. end
  1150. end
  1151. end
  1152. end
  1153. for _,target in ipairs(targets) do
  1154. local cnt = CombatBuff.qusan(target, qusanType, args[4])
  1155. qusanTotalNum = qusanTotalNum + cnt
  1156. ret[#ret+1] = target
  1157. end
  1158. if selfCalcType and selfRate and selfRate > 0 and qusanTotalNum > 0 and not obj.bufferCmd["noHp"] then
  1159. local hp = calcHp(obj, obj, selfCalcType, selfRate * qusanTotalNum, nil, true)
  1160. local hpAddRate = CombatObj.getValue(obj, RoleDefine.ZAOCHENG_HP_ADD_RATE) / 10000
  1161. hp = hp * (1 + hpAddRate)
  1162. hp = hp < 0 and 1 or hp
  1163. if hp > 0 then
  1164. local restoreMul = BeSkill.GetBeSkillRestoretHPMul(obj) or 1
  1165. hp = hp * restoreMul
  1166. local d, _, extraHandleTb = CombatObj.updateHp(obj, hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1167. local showHp = hp
  1168. if hp > 0 and d < 0 then
  1169. showHp = hp * (-1)
  1170. end
  1171. CombatImpl.setExtraHit(obj, showHp, CMD2ID["hp"])
  1172. CombatObj.onHpCB(obj, d, obj.pos)
  1173. if extraHandleTb then
  1174. ExtraHandle(obj, extraHandleTb)
  1175. end
  1176. end
  1177. end
  1178. local tb = { skillConfig.cmd, qusanTotalNum }
  1179. return ret, tb
  1180. end
  1181. function CMD.hurtwalun2(obj,skillConfig,skillTargets)
  1182. local args = obj.isPet and obj.args or skillConfig.args
  1183. local r = math.random(0,10000)
  1184. if r > args[4] then
  1185. return
  1186. end
  1187. local calcType = args[1]
  1188. local rate = args[2]
  1189. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1190. local hp
  1191. local limit
  1192. local ret = {}
  1193. if args[5] then
  1194. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1195. end
  1196. for _,target in ipairs(targets) do
  1197. hp = calcHp(obj,target,calcType,rate,limit)
  1198. if hp ~= 0 then
  1199. local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1200. if d ~= 0 then
  1201. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun2"])
  1202. CombatObj.onHpCB(target,d, obj.pos)
  1203. ret[#ret+1] = target
  1204. end
  1205. if extraHandleTb then
  1206. ExtraHandle(target, extraHandleTb)
  1207. end
  1208. end
  1209. end
  1210. return ret
  1211. end
  1212. function CMD.hurtxia2(obj,skillConfig,skillTargets)
  1213. local args = obj.isPet and obj.args or skillConfig.args
  1214. local r = math.random(0,10000)
  1215. if r > args[4] then
  1216. return
  1217. end
  1218. local calcType = args[1]
  1219. local rate = args[2]
  1220. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1221. local hp
  1222. local limit
  1223. local ret = {}
  1224. if args[5] then
  1225. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1226. end
  1227. for _,target in ipairs(targets) do
  1228. hp = calcHp(obj,target,calcType,rate,limit)
  1229. if hp ~= 0 then
  1230. local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1231. if d ~= 0 then
  1232. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia2"])
  1233. CombatObj.onHpCB(target,d, obj.pos)
  1234. ret[#ret+1] = target
  1235. end
  1236. if extraHandleTb then
  1237. ExtraHandle(target, extraHandleTb)
  1238. end
  1239. end
  1240. end
  1241. return ret
  1242. end
  1243. function CMD.hurtxia3(obj,skillConfig,skillTargets)
  1244. local args = obj.isPet and obj.args or skillConfig.args
  1245. local r = math.random(0,10000)
  1246. if r > args[4] then
  1247. return
  1248. end
  1249. local calcType = args[1]
  1250. local rate = args[2]
  1251. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1252. local hp
  1253. local limit
  1254. local ret = {}
  1255. if args[5] then
  1256. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1257. end
  1258. for _,target in ipairs(targets) do
  1259. hp = calcHp(obj,target,calcType,rate,limit)
  1260. if hp ~= 0 then
  1261. local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1262. if d ~= 0 then
  1263. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia3"])
  1264. CombatObj.onHpCB(target,d, obj.pos)
  1265. ret[#ret+1] = target
  1266. end
  1267. if extraHandleTb then
  1268. ExtraHandle(target, extraHandleTb)
  1269. end
  1270. end
  1271. end
  1272. return ret
  1273. end
  1274. function CMD.attributehurt(obj, skillConfig, skillTargets)
  1275. if not skillTargets or nil == _G.next(skillTargets) then
  1276. return
  1277. end
  1278. local args = skillConfig.args
  1279. if not args then
  1280. print("[attributehurt] 不存在对应配置直接返回")
  1281. return
  1282. end
  1283. local nAttrID = args[1] -- 属性ID
  1284. local nRate = args[2] -- 属性倍数
  1285. local nEnemyAttrID = args[3] -- 敌方属性
  1286. local nNowHurt = CombatObj.getValue(obj, RoleDefine.ATK)
  1287. local nAttrValue = CombatObj.getValue(obj, nAttrID)
  1288. local nValue = nAttrValue * nRate
  1289. local nMaxHurt = CombatObj.getValue(obj, RoleDefine.ATK) * 10
  1290. -- print("[attributehurt] 计算出来的进攻方属性加成 nValue = "..nValue.." 获取到的 属性ID = "
  1291. -- ..nAttrID.." 属性值 "..nAttrValue.." 倍率 "..nRate.." 攻击力的10倍 = "..nMaxHurt)
  1292. local ret = {}
  1293. for _, tEnemyObj in ipairs(skillTargets) do
  1294. local nEnemyValue = CombatObj.getValue(tEnemyObj, nEnemyAttrID)
  1295. local nBeginHurt = nValue / nEnemyValue
  1296. local nEndHurt = nBeginHurt * nNowHurt
  1297. nEndHurt = math.min(nMaxHurt, nEndHurt)
  1298. -- print("[attributehurt] 计算出来的最终伤害 nEndHurt = "..nEndHurt.." 获取到的敌方 属性ID = "
  1299. -- ..nEnemyAttrID.." 敌方属性值 "..nEnemyValue.." 开始 nBeginHurt "..nBeginHurt)
  1300. local d, _, extraHandleTb = CombatObj.updateHp(tEnemyObj, -nEndHurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1301. if d ~= 0 then
  1302. CombatImpl.setExtraHit(tEnemyObj, -nEndHurt, CMD2ID["attributehurt"])
  1303. CombatObj.onHpCB(tEnemyObj, d, obj.pos, skillConfig.id)
  1304. ret[#ret+1] = tEnemyObj
  1305. end
  1306. if extraHandleTb then
  1307. ExtraHandle(tEnemyObj, extraHandleTb)
  1308. end
  1309. end
  1310. return ret
  1311. end
  1312. NO_SKILL_CHECK_COMBO_LIST = {
  1313. ["hp"] = 1,
  1314. ["revive"] = 1,
  1315. ["baohu"] = 1,
  1316. }
  1317. function skillIsHpOrRevive(obj, argSkillID)
  1318. --local argSkillConf = SkillExcel[argSkillID]
  1319. local argSkillConf = GetSkillConfig(argSkillID)
  1320. if not argSkillConf then return end
  1321. -- 带有伤害
  1322. if argSkillConf.hurtRate[1] then return end
  1323. if argSkillConf.continuous and argSkillConf.continuous == 1 then return true end
  1324. if NO_SKILL_CHECK_COMBO_LIST[argSkillConf.cmd] then
  1325. return true
  1326. end
  1327. local bRet = false
  1328. if argSkillConf.cmd == "groupcmd" then
  1329. for k,v in ipairs(argSkillConf.args) do
  1330. local cmd = v[1]
  1331. if cmd == "hurt" then return end
  1332. if NO_SKILL_CHECK_COMBO_LIST[cmd] then
  1333. bRet = true
  1334. end
  1335. end
  1336. end
  1337. -- 技能包
  1338. if argSkillConf.type == CombatDefine.SKILL_TYPE5 or
  1339. argSkillConf.type == CombatDefine.SKILL_TYPE6 or
  1340. argSkillConf.type == CombatDefine.SKILL_TYPE7 then
  1341. for k,v in ipairs(argSkillConf.otherArgs.skillList) do
  1342. local config = SkillExcel[v]
  1343. -- 带有伤害
  1344. if config and config.hurtRate[1] then return end
  1345. if config then
  1346. if NO_SKILL_CHECK_COMBO_LIST[config.cmd] or config.continuous == 1 then
  1347. bRet = true
  1348. end
  1349. for k,v in ipairs(config.buffers) do
  1350. --local bufConfig = BufferExcel.buffer[v[1]]
  1351. local bufConfig = CombatBuff.GetBuffConfig(v[1])
  1352. -- 带有伤害
  1353. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  1354. bRet = true
  1355. end
  1356. end
  1357. end
  1358. end
  1359. for k,v in ipairs(argSkillConf.buffers) do
  1360. --local bufConfig = BufferExcel[v[1]]
  1361. local bufConfig = CombatBuff.GetBuffConfig(v[1])
  1362. -- 带有伤害
  1363. if bufConfig and NO_SKILL_CHECK_COMBO_LIST[bufConfig.cmd] then
  1364. bRet = true
  1365. end
  1366. end
  1367. end
  1368. return bRet
  1369. end
  1370. function CMD.combo(obj,skillConfig,skillTargets)
  1371. -- 二次元 屏蔽 治疗 复活的连击
  1372. if ProjectLogic.isSsecy() then
  1373. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1374. if skillIsHpOrRevive(obj, argSkillID) then
  1375. return
  1376. end
  1377. if skillIsHpOrRevive(obj, skillConfig.id) then
  1378. return
  1379. end
  1380. end
  1381. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1382. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1383. -- return
  1384. -- end
  1385. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1386. local r = math.random(0,10000)
  1387. if r < skillConfig.args[1] then
  1388. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1389. return true
  1390. end
  1391. end
  1392. --
  1393. function CMD.comboFight(obj,skillConfig,skillTargets)
  1394. -- 二次元 屏蔽 治疗 复活的连击
  1395. if ProjectLogic.isSsecy() then
  1396. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1397. if skillIsHpOrRevive(obj, argSkillID) then
  1398. return
  1399. end
  1400. if skillIsHpOrRevive(obj, skillConfig.id) then
  1401. return
  1402. end
  1403. end
  1404. if CombatImpl.isFanji then return end
  1405. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1406. local r = math.random(0,10000)
  1407. if r < skillConfig.args[1] then
  1408. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1409. return true
  1410. end
  1411. end
  1412. function CMD.combo1(obj,skillConfig,skillTargets)
  1413. -- 二次元 屏蔽 治疗 复活的连击
  1414. if ProjectLogic.isSsecy() then
  1415. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1416. if skillIsHpOrRevive(obj, skillConfig) then
  1417. return
  1418. end
  1419. if skillIsHpOrRevive(obj, skillConfig.id) then
  1420. return
  1421. end
  1422. end
  1423. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1424. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1425. -- return
  1426. -- end
  1427. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1428. local r = math.random(0,10000)
  1429. if r < skillConfig.args[1] then
  1430. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],2}
  1431. return true
  1432. end
  1433. end
  1434. function CMD.combo2(obj,skillConfig,skillTargets)
  1435. -- 二次元 屏蔽 治疗 复活的连击
  1436. if ProjectLogic.isSsecy() then
  1437. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1438. if skillIsHpOrRevive(obj, argSkillID) then
  1439. return
  1440. end
  1441. if skillIsHpOrRevive(obj, skillConfig.id) then
  1442. return
  1443. end
  1444. end
  1445. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1446. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1447. -- return
  1448. -- end
  1449. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1450. local r = math.random(0,10000)
  1451. if r < skillConfig.args[1] then
  1452. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, skillConfig.args[2], skillConfig.args[3],3}
  1453. return true
  1454. end
  1455. end
  1456. function CMD.comboNormal(obj, skillConfig, skillTargets)
  1457. -- 二次元 屏蔽 治疗 复活的连击
  1458. if ProjectLogic.isSsecy() then
  1459. local argSkillID = skillConfig.args[3] or CombatImpl.getNormalSkill(obj)
  1460. if skillIsHpOrRevive(obj, argSkillID) then
  1461. return
  1462. end
  1463. if skillIsHpOrRevive(obj, skillConfig.id) then
  1464. return
  1465. end
  1466. end
  1467. if CombatImpl.comboType > 0 then return end
  1468. if CombatImpl.isFanji then
  1469. if GroupSkillCnt > 2 then return end
  1470. else
  1471. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1472. end
  1473. local r = math.random(0,10000)
  1474. if r < skillConfig.args[1] then
  1475. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 2, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1}
  1476. end
  1477. end
  1478. function CMD.attrcomboAgain(obj, skillConfig, skillTargets)
  1479. local tComboCof = nil
  1480. for _, v in ipairs(skillConfig.args) do
  1481. if v[1] == 2 then
  1482. tComboCof = v
  1483. break
  1484. end
  1485. end
  1486. if not tComboCof then
  1487. print("[CMD.attrcomboAgain] 不存在连击配置")
  1488. return
  1489. end
  1490. --table.print_lua_table(tComboCof)
  1491. -- 二次元 屏蔽 治疗 复活的连击
  1492. if ProjectLogic.isSsecy() then
  1493. local argSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1494. if skillIsHpOrRevive(obj, argSkillID) then
  1495. return
  1496. end
  1497. if skillIsHpOrRevive(obj, skillConfig.id) then
  1498. return
  1499. end
  1500. end
  1501. local nSkillID = tComboCof[3] or CombatImpl.getSkillID(obj)
  1502. if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1503. -- if CombatImpl.isFanji or (CombatImpl.comboType > 0 and CombatImpl.comboType ~= 999) then
  1504. -- return
  1505. -- end
  1506. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1507. local r = math.random(0,10000)
  1508. --print("[CMD.attrcomboAgain] nSkillID = "..nSkillID)
  1509. if r < tComboCof[2] then
  1510. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 1, tComboCof[3], nSkillID, tComboCof[5] or 1, tComboCof[6]}
  1511. return true
  1512. end
  1513. end
  1514. function CMD.zhuiji(obj,skillConfig,skillTargets)
  1515. -- 二次元 屏蔽 治疗 复活的连击
  1516. if ProjectLogic.isSsecy() then
  1517. local argSkillID = skillConfig.args[3] or CombatImpl.getSkillID(obj)
  1518. if skillIsHpOrRevive(obj, argSkillID) then
  1519. return
  1520. end
  1521. if skillIsHpOrRevive(obj, skillConfig.id) then
  1522. return
  1523. end
  1524. end
  1525. local objTag = obj.uuid or obj.id
  1526. if CombatImpl.useZhuijiObjList[obj.pos] and (CombatImpl.useZhuijiObjList[obj.pos][objTag] or 0) >= 1 then
  1527. return
  1528. end
  1529. -- if CombatImpl.isFanji or CombatImpl.comboType > 0 then return end
  1530. if GroupSkillCnt ~= 1 then return end--技能包首次技能攻击才能触发
  1531. local r = math.random(0,10000)
  1532. if r < skillConfig.args[1] then
  1533. CombatImpl.comboList[#CombatImpl.comboList + 1] = {obj, 999, skillConfig.args[2], skillConfig.args[3],skillConfig.args[4] or 1, skillConfig.args[5]}
  1534. return true
  1535. end
  1536. end
  1537. function CMD.baohu(obj,skillConfig,skillTargets)
  1538. local d, _, extraHandleTb = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
  1539. if d ~= 0 then
  1540. local attrs = {}
  1541. attrs[RoleDefine.BAOHU_COMBAT] = skillTargets[1].pos
  1542. CombatImpl.setExtraHit(obj,d,CMD2ID["baohu"],attrs)
  1543. CombatObj.onHpCB(obj,d, skillTargets[1].pos)
  1544. end
  1545. if extraHandleTb then
  1546. ExtraHandle(obj, extraHandleTb)
  1547. end
  1548. end
  1549. function CMD.yinbaoZuzhou(obj,skillConfig,skillTargets)
  1550. CombatBuff.yinbaoZuzhou(obj, skillTargets, skillConfig)
  1551. end
  1552. --指定普攻目标模式
  1553. function CMD.normalTarget(obj,skillConfig)
  1554. obj.normalTarget = {status = {}}
  1555. if skillConfig.args.status then
  1556. for k,v in ipairs(skillConfig.args.status) do
  1557. obj.normalTarget.status[k] = v
  1558. end
  1559. end
  1560. end
  1561. --诅咒附加伤害
  1562. function CMD.zuzhouHurt(obj, skillConfig, skillTargets)
  1563. if not obj.args then return end
  1564. local confArgs = skillConfig.args
  1565. local targets = TargetMode.getTargets(obj, confArgs[1], skillTargets)
  1566. local zuzhouHurt = obj.args * confArgs[2] / 10000
  1567. for _,target in ipairs(targets) do
  1568. if zuzhouHurt ~= 0 then
  1569. local d, _, extraHandleTb = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1570. if d ~= 0 then
  1571. CombatImpl.setExtraHit(target,-zuzhouHurt,CMD2ID["zuzhouHurt"])
  1572. CombatObj.onHpCB(target,d, obj.pos)
  1573. end
  1574. if extraHandleTb then
  1575. ExtraHandle(target, extraHandleTb)
  1576. end
  1577. end
  1578. end
  1579. obj.args = nil
  1580. end
  1581. -- 根据诅咒数增加伤害
  1582. function CMD.zuzhouTrueHurt(obj, skillConfig, skillTargets)
  1583. local confArgs = skillConfig.args
  1584. local nAtt = CombatObj.getValue(obj,RoleDefine.ATK)
  1585. local baseHurt = nAtt * confArgs[1] / 10000
  1586. for _,target in ipairs(skillTargets) do
  1587. local isStatus, cmd, ind = CombatBuff.isStatus(target, {"zuzhou"})
  1588. if isStatus then
  1589. local nZuZhouNum = #target.bufferCmd["zuzhou"]
  1590. local nHurt = baseHurt * nZuZhouNum
  1591. if nHurt > 0 then
  1592. local d, _, extraHandleTb = CombatObj.updateHp(target, -nHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1593. if d ~= 0 then
  1594. CombatImpl.setExtraHit(target,-nHurt,CMD2ID["zuzhouTrueHurt"])
  1595. CombatObj.onHpCB(target,d, obj.pos)
  1596. end
  1597. if extraHandleTb then
  1598. ExtraHandle(target, extraHandleTb)
  1599. end
  1600. end
  1601. end
  1602. end
  1603. end
  1604. function CMD.dnexhurt(obj,skillConfig,skillTargets)
  1605. local args = obj.isPet and obj.args or skillConfig.args
  1606. local r = math.random(0,10000)
  1607. if r > args[4] then
  1608. return
  1609. end
  1610. local calcType = args[1]
  1611. local rate = args[2]
  1612. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1613. local hp
  1614. local limit
  1615. local ret = {}
  1616. if args[5] then
  1617. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK)
  1618. end
  1619. for _,target in ipairs(targets) do
  1620. hp = calcHp(obj,target,calcType,rate,limit)
  1621. if hp ~= 0 then
  1622. local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1623. if d ~= 0 then
  1624. CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
  1625. CombatObj.onHpCB(target,d, obj.pos)
  1626. ret[#ret+1] = target
  1627. end
  1628. if extraHandleTb then
  1629. ExtraHandle(target, extraHandleTb)
  1630. end
  1631. end
  1632. end
  1633. return ret
  1634. end
  1635. --拥有指定buff后的额外效果
  1636. function CMD.targetBuffExtraEffect(obj,skillConfig,skillTargets)
  1637. local args = skillConfig.args
  1638. if not args then
  1639. return
  1640. end
  1641. local targetBuffCmd = args[1]
  1642. local targetBuffCnt = args[2]
  1643. if not targetBuffCmd or not targetBuffCnt then
  1644. return
  1645. end
  1646. local nowTargetBuffCnt = CombatBuff.getBuffCnt(obj, targetBuffCmd)
  1647. if nowTargetBuffCnt < targetBuffCnt then
  1648. return
  1649. end
  1650. local targetMode = args[3]
  1651. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1652. local hurt, limitVale
  1653. local calcType, rate = args[4], args[5]
  1654. local maxNum = args[6] or 1
  1655. local nowNum = math.floor(nowTargetBuffCnt / targetBuffCnt)
  1656. if nowNum < maxNum then
  1657. maxNum = nowNum
  1658. end
  1659. local limitAttrType = args[7]
  1660. local limitAttrRate = args[8]
  1661. if limitAttrType and limitAttrRate then
  1662. limitVale = limitAttrRate * CombatObj.getValue(obj, limitAttrType)
  1663. end
  1664. table.shuffle(targets)
  1665. for idx, target in ipairs(targets) do
  1666. if idx > maxNum then
  1667. break
  1668. end
  1669. hurt = calcHp(obj, target, calcType, rate, limitVale)
  1670. if hurt ~= 0 then
  1671. local d, _, extraHandleTb = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
  1672. if d ~= 0 then
  1673. CombatImpl.setExtraHit(target,-hurt,CMD2ID["targetBuffExtraEffect"])
  1674. CombatObj.onHpCB(target,d, obj.pos)
  1675. end
  1676. if extraHandleTb then
  1677. ExtraHandle(target, extraHandleTb)
  1678. end
  1679. end
  1680. end
  1681. CombatBuff.DelBuffByCmd(obj, targetBuffCmd, nowTargetBuffCnt)
  1682. end
  1683. --debuff 和 buff 数量差的额外伤害
  1684. function CMD.buffDiffHurt(obj,skillConfig,skillTargets)
  1685. local args = skillConfig.args
  1686. if not args then
  1687. return
  1688. end
  1689. local buffType1 = args[1] --buff类型1, 对应配置表buff中qusan分页中的type
  1690. local buffType2 = args[2] --buff类型2, 对应配置表buff中qusan分页中的type
  1691. local targetMode = args[3]
  1692. local calcType, rate = args[4], args[5]
  1693. local limitAttrType, limitAttrMul = args[6], args[7]
  1694. local maxHurt = CombatObj.getValue(obj, limitAttrType) * limitAttrMul
  1695. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1696. for _, targetObj in ipairs(targets) do
  1697. local buffCnt1 = CombatBuff.getCombatBufferCnt(targetObj, buffType1)
  1698. local buffCnt2 = CombatBuff.getCombatBufferCnt(targetObj, buffType2)
  1699. if buffCnt1 > buffCnt2 then
  1700. local hurt = calcHp(obj, targetObj, calcType, rate)
  1701. hurt = hurt * (buffCnt1 - buffCnt2)
  1702. if hurt > maxHurt then
  1703. hurt = maxHurt
  1704. end
  1705. local d, _, extraHandleTb = CombatObj.updateHp(targetObj, -hurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1706. if d ~= 0 then
  1707. CombatImpl.setExtraHit(targetObj, -hurt, CMD2ID["buffDiffHurt"])
  1708. CombatObj.onHpCB(targetObj, d, obj.pos)
  1709. end
  1710. if extraHandleTb then
  1711. ExtraHandle(targetObj, extraHandleTb)
  1712. end
  1713. end
  1714. end
  1715. end
  1716. -- 与其中一个符合条件的队友交换血量, 交换成功后,恢复自身一定血量
  1717. function CMD.exchangeHP(obj,skillConfig,skillTargets)
  1718. local args = skillConfig.args
  1719. if not args then
  1720. return
  1721. end
  1722. local targetMode = args[3]
  1723. local targets = TargetMode.getTargets(obj, targetMode, skillTargets)
  1724. local targetObj = targets[1]
  1725. if targetObj then
  1726. -- 不能是自己
  1727. if targetObj.pos == obj.pos then
  1728. return
  1729. end
  1730. -- 不能满血
  1731. local attrID = targetMode[4] or RoleDefine.HP -- 默认是HP
  1732. local targetObjSubRate = CombatObj.getValue(targetObj, attrID)
  1733. if targetObjSubRate >= 10000 then
  1734. return
  1735. end
  1736. local targetHP = targetObj.hp
  1737. local attackerHp = obj.hp
  1738. local subHP = attackerHp - targetHP
  1739. -- 施放者血量不能最低
  1740. if subHP > 0 then
  1741. -- 给目标加血量差值
  1742. local d, _, extraHandleTb = CombatObj.updateHp(targetObj, subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1743. if d ~= 0 then
  1744. CombatImpl.setExtraHit(targetObj, subHP, CMD2ID["hp"])
  1745. CombatObj.onHpCB(targetObj, d, obj.pos)
  1746. end
  1747. if extraHandleTb then
  1748. ExtraHandle(targetObj, extraHandleTb)
  1749. end
  1750. -- 给施放者扣血量差值
  1751. d, _, extraHandleTb = CombatObj.updateHp(obj, -subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1752. if d ~= 0 then
  1753. CombatImpl.setExtraHit(obj, -subHP, CMD2ID["hurtSelf"])
  1754. CombatObj.onHpCB(obj, d, obj.pos)
  1755. end
  1756. if extraHandleTb then
  1757. ExtraHandle(targetObj, extraHandleTb)
  1758. end
  1759. -- 给施放者恢复一定血量
  1760. local calcType = args[1]
  1761. local rate = args[2]
  1762. local hp = calcHp(obj,targetObj, calcType, rate, nil, true)
  1763. d, _, extraHandleTb = CombatObj.updateHp(obj,hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
  1764. local showHp = hp
  1765. if hp > 0 and d < 0 then
  1766. showHp = hp * (-1)
  1767. end
  1768. CombatImpl.setExtraHit(obj, showHp, CMD2ID["hp"])
  1769. CombatObj.onHpCB(obj,d, obj.pos)
  1770. if extraHandleTb then
  1771. ExtraHandle(targetObj, extraHandleTb)
  1772. end
  1773. end
  1774. end
  1775. end
  1776. -- 神威灵装被动-真伤附加
  1777. function CMD.trueDamegeAddtional(obj,skillConfig,skillTargets)
  1778. local args = obj.isPet and obj.args or skillConfig.args
  1779. local r = math.random(0,10000)
  1780. if r > args[4] then
  1781. return
  1782. end
  1783. local calcType = args[1]
  1784. local rate = args[2]
  1785. local targets = TargetMode.getTargets(obj, args[3],skillTargets)
  1786. local hp
  1787. local limit
  1788. local ret = {}
  1789. if args[5] then
  1790. limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
  1791. end
  1792. for _,target in ipairs(targets) do
  1793. hp = calcHp(obj,target,calcType,rate,limit)
  1794. local offsetInfo = BeSkill.GetTrueDamegeOffset(target)
  1795. if offsetInfo then
  1796. local offsetHurt = calcHp(obj,target,offsetInfo[1],offsetInfo[2],limit)
  1797. hp = math.max(hp - offsetHurt, 0)
  1798. end
  1799. if hp ~= 0 then
  1800. local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
  1801. if d ~= 0 then
  1802. CombatImpl.setExtraHit(target,-hp,CMD2ID["trueDamegeAddtional"])
  1803. CombatObj.onHpCB(target,d, obj.pos)
  1804. ret[#ret+1] = target
  1805. end
  1806. if extraHandleTb then
  1807. ExtraHandle(target, extraHandleTb)
  1808. end
  1809. end
  1810. end
  1811. return ret
  1812. end