gitxsm před 4 měsíci
rodič
revize
3df9489817

+ 100 - 1
script/module/combat/CombatBuff.lua

@@ -478,7 +478,7 @@ function onBufferChange(obj)
 			RoleAttr.updateValue(RoleDefine.FANSHE_ZHUANGJIA,conf.args[1],bufferAttr,true)
 		end
 
-		if conf.cmd == "hudun" then
+		if conf.cmd == "hudun" or conf.cmd == "hudun1" then
 			RoleAttr.updateValue(RoleDefine.HUDUN_COMBAT, buffer.arg, bufferAttr,true)
 		end
 		--标识,给其他英雄加属性的buff
@@ -1131,6 +1131,38 @@ function getSkillBuffers(skillConfig)
 	return ret
 end
 
+local function calcObjBuffCnt(objList, buffCMDArr, skillConfig, bufferConf, bufferID, attacker, randomVal)
+	local buffCnt = 0
+	if not objList or not buffCMDArr then
+		return buffCnt
+	end
+
+	local statusBuffRate = skillConfig.otherArgs.statusBuffRate
+	local jobRateAdd = skillConfig.otherArgs.jobRateAdd
+
+	for _, target in ipairs(objList) do
+		local r = randomVal
+		if statusBuffRate and bufferConf.cmd == statusBuffRate[1] and isStatus(target, statusBuffRate[2]) then
+			r = r + statusBuffRate[3]
+		end
+
+		if jobRateAdd and bufferConf.cmd == jobRateAdd[1] and isJob(target, jobRateAdd[2]) then
+			r = r + jobRateAdd[3]
+		end
+
+		if canAdd(target, bufferID, r, attacker, skillConfig) then
+			for _, cmd in ipairs(buffCMDArr) do
+				buffCnt = buffCnt + getBuffCnt(target, cmd)
+			end
+			
+		end
+	end
+
+	return buffCnt
+end
+
+
+
 
 -- 战斗回合中触发buffer
 function onHit(attacker, skillTargets, skillConfig, cmdTargets, otherArgs, cmdChangeArgs)
@@ -1253,6 +1285,9 @@ function onHit(attacker, skillTargets, skillConfig, cmdTargets, otherArgs, cmdCh
         if #targets > 0 then
             --local bufferConf = BufferExcel.buffer[bufferID]
 			local bufferConf = GetBuffConfig(bufferID)
+
+			local targetBuffCnt
+
             for _, target in ipairs(targets) do
                 local r = random
                 if statusBuffRate and bufferConf.cmd == statusBuffRate[1] and isStatus(target, statusBuffRate[2]) then
@@ -1308,6 +1343,17 @@ function onHit(attacker, skillTargets, skillConfig, cmdTargets, otherArgs, cmdCh
 						end
 					end
 
+					if bufferConf.cmd == "hudun1" then
+						if not targetBuffCnt then
+							targetBuffCnt = calcObjBuffCnt(objList, {"hudun1"}, skillConfig, bufferConf, bufferID, attacker, random)
+						end
+
+						targetBuffCnt = math.max(targetBuffCnt, 1)
+						local val = CombatObj.getHpMax(attacker) - attacker.hp
+						arg = math.floor(val / targetBuffCnt)
+						print("==================", arg and arg or -1)
+					end
+
 
                     if delayRound and delayRound > 0 then
                         target.delayAddBuffer = target.delayAddBuffer or { }
@@ -1458,9 +1504,24 @@ function onUseBeSkill(attacker,skillConfig,objs,cmdTargets, arg, arg2)--attacker
 			if bufferConf.roundOne == 1 and objs and objs[1] then
 				attackPos = objs[1].pos
 			end
+
+			local targetBuffCnt
 			for _,target in ipairs(targets) do
 				if canAdd(target,bufferID,buffers[i][3], attacker, skillConfig) then
 					isAddSkillFrame = true
+
+					if bufferConf.cmd == "hudun1" then
+						if not targetBuffCnt then
+							targetBuffCnt = calcObjBuffCnt(objList, {"hudun1"}, skillConfig, bufferConf, bufferID, attacker, buffers[i][3])
+						end
+
+						targetBuffCnt = math.max(targetBuffCnt, 1)
+						local val = CombatObj.getHpMax(attacker) - attacker.hp
+						bufferArg1 = math.floor(val / targetBuffCnt)
+						print("==================", bufferArg1 and bufferArg1 or -1)
+					end
+
+
 					if bufferConf.cmd == "shaqi" then
 						for k=1, addBuffTimes do
 							addBuffer(attackPos,target, bufferID,skillConfig.id,bufferArg1 or bufferArg)
@@ -2132,7 +2193,19 @@ function BuffHandleAfterSkill(obj)
 		handle2.liuxue3(obj, buffer)
 		CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_HOLD)
 	end
+end
 
+-- 通过 xishou buff吸收伤害回血
+function AddHPByXishouBuff(obj, targetBuffCMD, hpVal)
+	print(string.format("==============英雄: %d, 当前血量: %s 通过buff: %s 回血 : %s=========", obj.id, obj.hp, targetBuffCMD, hpVal))
+	local res, _, idx = isStatus(obj, {targetBuffCMD})
+	if res then
+		local buffer = obj.buffer[idx]
+		local d = CombatObj.updateHp(obj, hpVal, nil, nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
+		buffer.attrs[RoleDefine.HP_COMBAT] = hpVal
+		CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_HOLD)
+		print(string.format("==============英雄: %d 通过buff: %s 回血后血量: %s =========\n", obj.id, targetBuffCMD, obj.hp))
+	end
 end
 
 
@@ -2237,6 +2310,7 @@ function updateHuDun(obj, value)
 		if newValue <= 0 then
 			obj.bufferAttr[RoleDefine.HUDUN_COMBAT] = 0
 			delBufferByCmd(obj,"hudun", 0)
+			delBufferByCmd(obj,"hudun1", 0)
 		else
 			obj.bufferAttr[RoleDefine.HUDUN_COMBAT] = newValue
 		end
@@ -2244,6 +2318,7 @@ function updateHuDun(obj, value)
 		-- 护盾值没有全部去除  则 在对应英雄上吧 BUF 上的arg 数值 减除  防止 BufChange 重置 属性
 		if value < 0 and newValue > 0 then
 			if obj and obj.buffer then
+				local subVal = value
 				for j =  1 , obj.buffer[0] do       -- 从最早的护盾BUF中删除arg 
 					local buffer = obj.buffer[j]
 					--local conf = BufferExcel.buffer[buffer.id]
@@ -2254,6 +2329,7 @@ function updateHuDun(obj, value)
 						if have > -value then
 							buffer.arg = have + value
 						else
+							subVal = subVal + have
 							buffer.arg = 0
 							local bufferCnt = delBuffer(obj, j)
 							CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
@@ -2261,6 +2337,29 @@ function updateHuDun(obj, value)
 						end
 					end 
 				end
+
+				if subVal < 0 then
+					for j =  1 , obj.buffer[0] do
+						local buffer = obj.buffer[j]
+						--local conf = BufferExcel.buffer[buffer.id]
+						local conf = GetBuffConfig(buffer.id)
+						local bufferCmd = conf.cmd
+
+						if bufferCmd == "hudun1" then
+							buffer.arg = buffer.arg + subVal
+							subVal = buffer.arg
+							if subVal >= 0 then
+								break
+							end
+
+							if subVal < 0 then
+								buffer.arg = 0
+								local bufferCnt = delBuffer(obj, j)
+								CombatImpl.addFrameBuffer(obj,buffer,CombatDefine.BUFFER_OP_DEL)
+							end
+						end
+					end
+				end
 			end
 		end
 	end	

+ 44 - 8
script/module/combat/CombatObj.lua

@@ -420,10 +420,37 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 	end
 	local sum = obj.hp + value
 
+
+	-- 判断伤害能否被吸收
+	local extraHandle
+	local targetBuffCMD
+	local isAbsorb = false
+	if value < 0 and (type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE) then -- 是扣血, 并且来自技能本身或技能特殊效果
+		local attacker = CombatImpl.objList[attackPos]
+		if attacker and attacker.side ~= obj.side then -- 攻击方是英雄, 并且是敌方英雄
+			local isHaveTargetBuff = false
+			if attacker.hurtType and attacker.hurtType == CombatDefine.PHY_HURT_TYPE then
+				isHaveTargetBuff = CombatBuff.isStatus(obj, {"xishouPhysical"})
+				targetBuffCMD = "xishouPhysical"
+			elseif attacker.hurtType and attacker.hurtType == CombatDefine.MAGIC_HURT_TYPE then
+				isHaveTargetBuff = CombatBuff.isStatus(obj, {"xishouMagic"})
+				targetBuffCMD = "xishouMagic"
+			end
+
+			if isHaveTargetBuff then -- 拥有指定buff
+				isAbsorb = true
+				extraHandle = extraHandle or {}
+				extraHandle[1] = 1
+				extraHandle[2] = targetBuffCMD
+			end
+		end
+	end
+
 	-- 护盾值检测
-	if value < 0 then
+	if value < 0 and not isAbsorb then
 		local huDunValue = CombatBuff.getBuffHuDun(obj)
 		if huDunValue > 0 then
+			print(string.format("========英雄 %d, 英雄当前血量:%s 受到伤害 %s,有护盾, 护盾值为: %s\n", obj.id, obj.hp, value, huDunValue))
 			if huDunValue >= (-value) then
 				sum = sum + (-value)
 				CombatBuff.updateHuDun(obj, value)				
@@ -431,9 +458,12 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 				sum = sum + huDunValue
 				CombatBuff.updateHuDun(obj, -huDunValue)
 			end
+			print(string.format("========抵消伤害后护盾值为: %s\n", CombatBuff.getBuffHuDun(obj)))
 		end
+
 	end
 
+	-- 加血上限判断
 	local hpMax = getHpMax(obj) 
 	if sum > hpMax then
 		sum = hpMax
@@ -449,11 +479,22 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 	end
 
 
+	if isAbsorb then
+		print("========有吸收buff=======", obj.id, obj.hp, -d)
+
+		extraHandle[3] = d
+		d = 0
+
+		-- CombatBuff.AddHPByXishouBuff(obj, -d, targetBuffCMD)
+		-- return 0, value
+	end
+
+
 	if sum < 0 then
 		sum = 0
 	end
 	local ret = beforeUpdateHp(obj, sum, value, d)
-	if ret then
+	if ret and not isAbsorb then
 		obj.hp = sum
 	end
 
@@ -500,12 +541,7 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 		end
 	end
 
-	-- if d == 0 then
-	-- 	value = 0
-	-- end
-
-
-	return d,value
+	return d,value, extraHandle
 end
 
 function updateMp(obj, value)

+ 172 - 43
script/module/combat/Skill.lua

@@ -28,7 +28,6 @@ local function calcHp(attacker,target,calcType,rate,limit,isAddHp,param, flag)
 end
 
 
-
 function GetSkillConfig(skillId)
 	return weaponSkillConfig[skillId] or SkillExcel[skillId]
 end
@@ -43,8 +42,6 @@ function GetFinalSkillConfig(obj, skillId)
 	return GetSkillConfig(targetId)
 end
 
-
-
 -- 技能释放条件检测表
 COND_CMD = {}
 
@@ -52,8 +49,6 @@ COND_CMD = {}
 COST_CMD = {}
 
 
-
-
 -- 技能释放条件检查
 function COND_CMD.attrCheck(obj, skillId)
 	local skillConfig = GetSkillConfig(skillId)
@@ -86,11 +81,6 @@ function COST_CMD.attrCheck(obj, skillConfig)
 	end
 end
 
-
-
-
-
-
 -- 技能释放条件检测
 function SkillCondCheck(obj, skillId)
 	local skillConfig = GetSkillConfig(skillId)
@@ -108,6 +98,18 @@ function SkillCondCheck(obj, skillId)
 end
 
 
+-- 等释放技能完后的处理
+function ExtraHandle(obj, args)
+	if not args then
+		return
+	end
+
+	local hanleType = args[1]
+	if hanleType == 1 then
+		CombatBuff.AddHPByXishouBuff(obj, args[2], -args[3])
+	end
+end
+
 
 function setSkill(obj,config,skinConfig)
 	config = skinConfig or config	
@@ -349,8 +351,10 @@ function attack(obj, targets, skillConfig)
             obj.isAllCalcHp = index == #targets
 			target.attackSkillID = skillConfig.id
 			local hpValue,srcValue = 0,0
+
+			local extraHandleTb
 			if hurt > 0 then
-				hpValue,srcValue = CombatObj.updateHp(target, -hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
+				hpValue,srcValue, extraHandle = CombatObj.updateHp(target, -hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
 
 				if hpValue < 0 and CombatBuff.isStatus(target, {"chenshui"}) then
 					CombatBuff.DelBuffByCmd(target, "chenshui", 999)
@@ -361,6 +365,11 @@ function attack(obj, targets, skillConfig)
 
 			CombatImpl.setSkillHit(target,srcValue,nil,flag,obj,skillConfig.id)
 
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
+
+
             if target.isShanBi ~= 1 then
                len = len + 1
                hitList[len] = target
@@ -418,13 +427,17 @@ function CMD.hp(obj,skillConfig,skillTargets)
                 if target.side == CombatDefine.DEFEND_SIDE then
 					hp = CombatImpl.commonArgs.hpLimit or hp
 				end
-				local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
                 local showHp = hp
                 if hp > 0 and d < 0 then
                    showHp = hp * (-1)
                 end
 				CombatImpl.setExtraHit(target, showHp, CMD2ID["hp"])
 				CombatObj.onHpCB(target,d, obj.pos)
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
             end 
 
 			if hp < 0 then
@@ -501,12 +514,16 @@ function CMD.shixueHP(obj,skillConfig,skillTargets, hitObj)
 				if target.side == CombatDefine.DEFEND_SIDE then
 					hp = CombatImpl.commonArgs.hpLimit or hp
 				end
-				local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
                 if hp > 0 and d < 0 then
                    hp = hp * (-1)
                 end
 				CombatImpl.setExtraHit(target, hp, CMD2ID["hp"])
 				CombatObj.onHpCB(target,d, obj.pos)
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 			ret[#ret+1] = target
 		end
@@ -552,12 +569,16 @@ function CMD.speedHp(obj,skillConfig,skillTargets)
 				if target.side == CombatDefine.DEFEND_SIDE then
 					hp = CombatImpl.commonArgs.hpLimit or hp
 				end
-				local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
                 if hp > 0 and d < 0 then
                    hp = hp * (-1)
                 end
 				CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
 				CombatObj.onHpCB(target,d, obj.pos)
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 			ret[#ret+1] = target
 		end
@@ -597,12 +618,16 @@ function CMD.statusHp(obj,skillConfig,skillTargets)
 			if target.side == CombatDefine.DEFEND_SIDE then
 				hp = CombatImpl.commonArgs.hpLimit or hp
 			end
-			local d = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
             if hp > 0 and d < 0 then
                hp = hp * (-1)
             end
 			CombatImpl.setExtraHit(target,hp,CMD2ID["hp"])
 			CombatObj.onHpCB(target,d, obj.pos)
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 		ret[#ret+1] = target
 	end
@@ -627,12 +652,16 @@ function CMD.hurt(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -661,12 +690,16 @@ function CMD.behurt(obj,skillConfig,skillTargets)
 		end
 		
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["behurt"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -690,12 +723,16 @@ function CMD.hurtwalun(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -734,12 +771,16 @@ function CMD.posHurt(obj,skillConfig,skillTargets)
 	    if bfind  then
 			hp = calcHp(obj,target,calcType,rate,limit, false)
 			if hp ~= 0 then
-				local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
 					CombatObj.onHpCB(target,d, obj.pos)
 					ret[#ret+1] = target
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end
@@ -764,12 +805,16 @@ function CMD.hurtxia(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -793,12 +838,16 @@ function CMD.hurtmingli(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -822,12 +871,16 @@ function CMD.hurtmingli2(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtmingli2"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -851,12 +904,16 @@ function CMD.hurtguangci(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtguangci"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -882,12 +939,16 @@ function CMD.jobHurt(obj,skillConfig,skillTargets)
 		if target.job == job then
 			hp = calcHp(obj,target,calcType,rate,limit)
 			if hp and hp ~= 0 then
-				local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
 					CombatObj.onHpCB(target,d, obj.pos)
 					ret[#ret+1] = target
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end	
@@ -915,12 +976,16 @@ function CMD.statusHurt(obj,skillConfig,skillTargets)
 		if CombatBuff.isStatus(target, status)  then
 			hp = calcHp(obj,target,calcType,rate,limit)
 			if hp and hp ~= 0 then
-				local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-hp,CMD2ID["jobHurt"])
 					CombatObj.onHpCB(target,d, obj.pos)
 					ret[#ret+1] = target
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end	
@@ -938,12 +1003,16 @@ function CMD.hpHurt(obj,skillConfig,skillTargets)
 		if target.hp >= hpLimit then
 			hp = calcHp(obj,target,calcType,rate)
 			if hp and hp ~= 0 then
-				local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-hp,CMD2ID["hpHurt"])
 					CombatObj.onHpCB(target,d, obj.pos)
 					ret[#ret+1] = target
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end	
@@ -995,10 +1064,14 @@ function CMD.qingsuan(obj,skillConfig,skillTargets)
 			if limit and hurt > limit then
 				hurt = limit
 			end
-			local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			CombatImpl.setExtraHit(target,-hurt,CMD2ID["qingsuan"])
 			CombatObj.onHpCB(target,d, obj.pos)
 			ret[#ret+1] = target
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -1092,11 +1165,15 @@ function CMD.qusan(obj,skillConfig,skillTargets)
 		if calcType and rate and cnt > 0 then
 			local hp = calcHp(obj,target,calcType,rate * cnt, limit, nil, nil, args[6])
 			if hp ~= 0 then
-				local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d,_, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-hp,CMD2ID["qusan"])
 					CombatObj.onHpCB(target,d, obj.pos)
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end
@@ -1157,12 +1234,16 @@ function CMD.hurtwalun2(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtwalun2"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -1187,12 +1268,16 @@ function CMD.hurtxia2(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia2"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -1217,12 +1302,16 @@ function CMD.hurtxia3(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurtxia3"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -1258,12 +1347,16 @@ function CMD.attributehurt(obj, skillConfig, skillTargets)
 		-- print("[attributehurt] 计算出来的最终伤害 nEndHurt = "..nEndHurt.." 获取到的敌方 属性ID = "
 		-- 	..nEnemyAttrID.." 敌方属性值 "..nEnemyValue.." 开始 nBeginHurt "..nBeginHurt)
 
-		local d = CombatObj.updateHp(tEnemyObj, -nEndHurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
+		local d, _, extraHandleTb = CombatObj.updateHp(tEnemyObj, -nEndHurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
 		if d ~= 0 then
 			CombatImpl.setExtraHit(tEnemyObj, -nEndHurt, CMD2ID["attributehurt"])
 			CombatObj.onHpCB(tEnemyObj, d, obj.pos, skillConfig.id)
 			ret[#ret+1] = tEnemyObj
 		end
+
+		if extraHandleTb then
+			ExtraHandle(tEnemyObj, extraHandleTb)
+		end
 	end
 	
 	return ret
@@ -1542,13 +1635,17 @@ function CMD.zhuiji(obj,skillConfig,skillTargets)
 end
 
 function CMD.baohu(obj,skillConfig,skillTargets)
-	local d = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
+	local d, _, extraHandleTb = CombatObj.updateHp(obj,obj.baohuHurt,nil,nil, obj.pos,CombatObj.BUFFER_HP_TYPE)
 	if d ~= 0 then
 		local attrs = {}
 		attrs[RoleDefine.BAOHU_COMBAT] = skillTargets[1].pos
 		CombatImpl.setExtraHit(obj,d,CMD2ID["baohu"],attrs)
 		CombatObj.onHpCB(obj,d, skillTargets[1].pos)
-	end	
+	end
+
+	if extraHandleTb then
+		ExtraHandle(obj, extraHandleTb)
+	end
 end
 
 function CMD.yinbaoZuzhou(obj,skillConfig,skillTargets)
@@ -1573,11 +1670,15 @@ function CMD.zuzhouHurt(obj, skillConfig, skillTargets)
 	local zuzhouHurt = obj.args * confArgs[2] / 10000
 	for _,target in ipairs(targets) do
 		if zuzhouHurt ~= 0 then
-			local d = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-zuzhouHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-zuzhouHurt,CMD2ID["zuzhouHurt"])
 				CombatObj.onHpCB(target,d, obj.pos)
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
     obj.args = nil
@@ -1594,11 +1695,15 @@ function CMD.zuzhouTrueHurt(obj, skillConfig, skillTargets)
 			local nZuZhouNum = #target.bufferCmd["zuzhou"]
 			local nHurt = baseHurt * nZuZhouNum
 			if nHurt > 0  then
-				local d = CombatObj.updateHp(target, -nHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+				local d, _, extraHandleTb = CombatObj.updateHp(target, -nHurt,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 				if d ~= 0 then
 					CombatImpl.setExtraHit(target,-nHurt,CMD2ID["zuzhouTrueHurt"])
 					CombatObj.onHpCB(target,d, obj.pos)
 				end
+
+				if extraHandleTb then
+					ExtraHandle(target, extraHandleTb)
+				end
 			end
 		end
 	end
@@ -1626,12 +1731,16 @@ function CMD.dnexhurt(obj,skillConfig,skillTargets)
 	for _,target in ipairs(targets) do
 		hp = calcHp(obj,target,calcType,rate,limit)
 		if hp ~= 0 then
-			local d = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
 				CombatObj.onHpCB(target,d, obj.pos)
 				ret[#ret+1] = target
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 	return ret
@@ -1682,11 +1791,15 @@ function CMD.targetBuffExtraEffect(obj,skillConfig,skillTargets)
 		end
 		hurt = calcHp(obj, target, calcType, rate, limitVale)
 		if hurt ~= 0 then
-			local d = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hurt,nil,true, obj.pos,CombatObj.SKILL_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(target,-hurt,CMD2ID["hurt"])
 				CombatObj.onHpCB(target,d, obj.pos)
 			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
 		end
 	end
 
@@ -1720,11 +1833,15 @@ function CMD.buffDiffHurt(obj,skillConfig,skillTargets)
 				hurt = maxHurt
 			end
 
-			local d = CombatObj.updateHp(targetObj, -hurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(targetObj, -hurt, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(targetObj, -hurt, CMD2ID["hurt"])
 				CombatObj.onHpCB(targetObj, d, obj.pos)
 			end
+
+			if extraHandleTb then
+				ExtraHandle(targetObj, extraHandleTb)
+			end
 		end
 
 	end
@@ -1762,33 +1879,45 @@ function CMD.exchangeHP(obj,skillConfig,skillTargets)
 		-- 施放者血量不能最低
 		if subHP > 0 then
 			-- 给目标加血量差值
-			local d = CombatObj.updateHp(targetObj, subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
+			local d, _, extraHandleTb = CombatObj.updateHp(targetObj, subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
 
 			if d ~= 0 then
 				CombatImpl.setExtraHit(targetObj, subHP,  CMD2ID["hp"])
 				CombatObj.onHpCB(targetObj, d, obj.pos)
 			end
 
+			if extraHandleTb then
+				ExtraHandle(targetObj, extraHandleTb)
+			end
+
 			-- 给施放者扣血量差值
-			d = CombatObj.updateHp(obj, -subHP, nil, true, targetObj.pos, CombatObj.EXTRA_HP_TYPE)
+			d, _, extraHandleTb = CombatObj.updateHp(obj, -subHP, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
 			if d ~= 0 then
 				CombatImpl.setExtraHit(obj, -subHP,  CMD2ID["hp"])
-				CombatObj.onHpCB(obj, d, targetObj.pos)
+				CombatObj.onHpCB(obj, d, obj.pos)
 			end
 
+			if extraHandleTb then
+				ExtraHandle(targetObj, extraHandleTb)
+			end
 
 			-- 给施放者恢复一定血量
 			local calcType = args[1]
 			local rate = args[2]
 			local hp = calcHp(obj,targetObj, calcType, rate, nil, true)
 
-			d = CombatObj.updateHp(obj,hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
+			d, _, extraHandleTb = CombatObj.updateHp(obj,hp, nil, true, obj.pos, CombatObj.EXTRA_HP_TYPE)
 			local showHp = hp
 			if hp > 0 and d < 0 then
 			   showHp = hp * (-1)
 			end
 			CombatImpl.setExtraHit(obj, showHp, CMD2ID["hp"])
 			CombatObj.onHpCB(obj,d, obj.pos)
+
+			if extraHandleTb then
+				ExtraHandle(targetObj, extraHandleTb)
+			end
+
 		end
 	end
 end