local Base = require "Battle/Logic/Buff/BuffManager/BuffOperator_Sustained" local BuffOperator_Dot = {} for k,func in pairs(Base) do BuffOperator_Dot[k] = func end local FormulaCalculator = require "Battle/Logic/Missile/FormulaCalculator" local BuffManager = require "Battle/Logic/Buff/BuffManager/BuffManager" local SpecialBuffs = LuaConst.SpecialBuffs local RuntimeDataManager = RuntimeDataManager ----结算Dot伤害Buff--- function BuffOperator_Dot.AccountDotHurt(entity, buffData, updateData) if (buffData.BuffDuration > FP.Const.Zero) then local comp_Buff = entity.components.buff local callFrequency = comp_Buff:GetDotBuffCallFrequency(buffData) --计算可以叠加的剩余次数 local leftTimes = FP.Math.Ceil((buffData.BuffDuration - updateData.BuffTimer) / callFrequency); if (leftTimes > 0) then --结算操作 local callBuff = DataSheetManager.BuffData:GetDataByBuffID(buffData.CallBuffID) local sourceEntity = updateData.SourceEntity FormulaCalculator.CalculateResult(callBuff,updateData,entity,sourceEntity,leftTimes ,LuaConst.EHpChangeType.DOT) end updateData.BuffLayer = 0 end end function BuffOperator_Dot.OnUpdate( buffData, updateData, entity, deltaTime, addList) local comp_Buff = entity.components.buff local callFrequency = comp_Buff:GetDotBuffCallFrequency(buffData)/1000 local buffCallTimer = updateData.BuffCallTimer if buffCallTimer < callFrequency then buffCallTimer:Add(deltaTime) end if buffCallTimer >= callFrequency then buffCallTimer:Reset() local sourceEntity = updateData.SourceEntity BuffOperator_Dot.Execute(buffData, entity, sourceEntity, updateData) if not entity.components.attr:IsAlive() then local hasBuff = comp_Buff:CheckHasBuffState(SpecialBuffs.InDying) --这里不用附加判断InDyingWithSuperArmor,这俩随便判断一个就可以 if not hasBuff and not comp_Buff:GetBuffUpdateData(SpecialBuffs.InHitFlyMonster) and not comp_Buff:GetBuffUpdateData(SpecialBuffs.InHitUp) and not comp_Buff:GetBuffUpdateData(SpecialBuffs.InHitDown) and not comp_Buff:GetBuffUpdateData(SpecialBuffs.InHitFlyPlayer) then BuffManager.TryAddBuff(SpecialBuffs.InDying,entity, nil, addList and RuntimeDataManager.New_BuffCtrl(), addList) end end end local newupdate = Base.OnUpdate(buffData, updateData, entity, deltaTime, addList) return newupdate end function BuffOperator_Dot.Execute(buffData, targetEntity, sourceEntity, updateData) local ctrlParam = RuntimeDataManager.New_BuffCtrl() ctrlParam.MissileHurtID = updateData.MissileHurtID ctrlParam.IsTracker = updateData.IsTracker ctrlParam.BuffOverRideFomula = updateData.BuffOverRideFomula or buffData.BuffFormula ctrlParam.ForceLayer = updateData.BuffLayer ctrlParam.HpChangeType = LuaConst.EHpChangeType.DOT SystemManager.AddBuff(targetEntity, buffData.CallBuffID, sourceEntity, nil, ctrlParam) end return BuffOperator_Dot